From d02f0d2cdf67f1445a9ccae86b99a2578adab585 Mon Sep 17 00:00:00 2001
From: historia <[not public]>
Date: Fri, 10 Jul 2026 17:02:13 -0400
Subject: feat(admin): update search to use standard condition/action framework
rather than bespoke implementation
---
internal/admin/static/itemeditor.js | 74 ++++++++++++++++++++++++++++++-------
1 file changed, 61 insertions(+), 13 deletions(-)
(limited to 'internal/admin/static/itemeditor.js')
diff --git a/internal/admin/static/itemeditor.js b/internal/admin/static/itemeditor.js
index a86d240..53242ab 100644
--- a/internal/admin/static/itemeditor.js
+++ b/internal/admin/static/itemeditor.js
@@ -84,13 +84,9 @@ var SECTIONS = [
]
},
{
- id: 'search', label: 'Search',
- detect: function(d) { return d.search_table || d.search_ticks; },
- fields: [
- ['search_table', 'Search Table', 'search', 'e.g. gem_table', '', null, 'drops'],
- ['search_ticks', 'Search Ticks', 'number', '8', 'narrow'],
- ['search_message', 'Search Message', 'text', 'You search...', 'wide'],
- ]
+ id: 'search', label: 'Search', path: 'search', isArray: true, fullWidth: true, interactionStyle: true, itemIDAllowed: false,
+ detect: function(d) { return d.search && Array.isArray(d.search); },
+ fields: []
},
{
id: 'food', label: 'Food',
@@ -126,6 +122,9 @@ var SECTIONS = [
];
function initItemEditor() {
+ window._ieRenderCurrent = renderCurrent;
+ window._ieRenderOnly = function() { if (itemID && itemData) renderItemEditor(itemID, itemData); };
+ window._ieSyncAll = function(ed) { if (ed) ie_syncAllInteractions(ed, SECTIONS); };
editorType = 'items';
editorFields = [];
loadList();
@@ -167,6 +166,7 @@ function loadItemEditor(id) {
API.get('/api/items/' + encodeURIComponent(id)).then(function(data) {
itemData = data;
window._editorData = itemData;
+ window._interVis = {};
renderItemEditor(id, data);
}).catch(function(e) {
$('#editorMain').innerHTML = '
Failed to load: ' + esc(e.message) + '
';
@@ -225,6 +225,7 @@ function renderItemEditor(id, data) {
function renderCurrent() {
ced_syncDOMToData(itemData);
+ if (window._ieSyncAll) window._ieSyncAll(itemData);
if (!itemData || !itemID) return;
renderItemEditor(itemID, itemData);
}
@@ -250,7 +251,22 @@ function renderCard(sec, data) {
h += '';
if (sec.isArray) {
- h += renderArraySection(sec, data);
+ if (sec.interactionStyle) {
+ window._interVis = window._interVis || {};
+ if (!window._interVis[sec.id]) window._interVis[sec.id] = {};
+ h += ie_renderArraySection({
+ sec: sec,
+ data: data,
+ visMap: window._interVis[sec.id],
+ showRemove: function(idx) { return 'removeArrayItem(\'' + sec.id + '\',' + idx + ')'; },
+ showField: function(secId, idx, key) { return 'showInterField(\'' + secId + '\',' + idx + ',\'' + key + '\')'; },
+ hideField: function(secId, idx, key) { return 'hideInterField(\'' + secId + '\',' + idx + ',\'' + key + '\')'; },
+ renderField: function(sec, f, data, idx, optStyle) { return renderField(sec, f, data, idx, null, optStyle); },
+ onAdd: function() { return 'addArrayItem(\'' + sec.id + '\')'; },
+ });
+ } else {
+ h += renderArraySection(sec, data);
+ }
} else if (sec.id === 'core') {
h += renderCoreCard(data);
} else if (sec.id === 'equipment') {
@@ -964,6 +980,8 @@ function addSection() {
if (sec.path) {
if (sec.id === 'equipment') {
itemData.equipment = {type:'', slot:'', attack_type:'', speed:0, junk:''};
+ } else if (sec.isArray && sec.interactionStyle) {
+ itemData[sec.path] = [];
} else {
itemData[sec.path] = {};
}
@@ -981,11 +999,15 @@ function addArrayItem(cardID) {
var sec = SECTIONS.find(function(s) { return s.id === cardID; });
if (!sec || !sec.isArray) return;
var arr = itemData[sec.path] || [];
- var empty = {};
- sec.fields.forEach(function(f) {
- empty[f[0]] = f[2] === 'checkbox' ? false : (f[2] === 'number' ? 0 : '');
- });
- arr.push(empty);
+ if (sec.interactionStyle) {
+ arr.push({steps: []});
+ } else {
+ var empty = {};
+ sec.fields.forEach(function(f) {
+ empty[f[0]] = f[2] === 'checkbox' ? false : (f[2] === 'number' ? 0 : '');
+ });
+ arr.push(empty);
+ }
itemData[sec.path] = arr;
renderCurrent();
}
@@ -994,11 +1016,24 @@ function removeArrayItem(cardID, idx) {
var sec = SECTIONS.find(function(s) { return s.id === cardID; });
if (!sec || !sec.isArray) return;
ced_syncDOMToData(itemData);
+ if (window._ieSyncAll) window._ieSyncAll(itemData);
var arr = itemData[sec.path] || [];
arr.splice(idx, 1);
renderItemEditor(itemID, itemData);
}
+function showInterField(secId, idx, key) {
+ window._interVis = window._interVis || {};
+ ie_showField(window._interVis, secId, idx, key);
+ renderCurrent();
+}
+
+function hideInterField(secId, idx, key) {
+ window._interVis = window._interVis || {};
+ ie_hideField(window._interVis, secId, idx, key);
+ renderCurrent();
+}
+
// =========================================================================
// Subtable row add/remove
// =========================================================================
@@ -1332,6 +1367,19 @@ function saveItem() {
var el = document.getElementById(fid);
if (el) item[f[0]] = collectFieldValue(el, f[2]);
});
+ if (sec.interactionStyle) {
+ var dataArr = itemData[sec.path] || [];
+ var dataItem = dataArr[idx] || {};
+ if (dataItem.condition && typeof dataItem.condition === 'object') {
+ var cleanedCond = ie_cleanCondition(dataItem.condition);
+ if (cleanedCond) item.condition = cleanedCond;
+ }
+ if (dataItem.lock) item.lock = true;
+ if (dataItem.steps && Array.isArray(dataItem.steps)) {
+ var cleanedSteps = dataItem.steps.map(ie_cleanStep).filter(function(s) { return Object.keys(s).length > 0; });
+ if (cleanedSteps.length > 0) item.steps = cleanedSteps;
+ }
+ }
if (Object.keys(item).length > 0) arr.push(item);
});
if (arr.length > 0) out[sec.path] = arr;
--
cgit v1.2.3