From 21c1997a3fd0f5ec5dcff1add45e4dfaf7a338ca Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Sun, 5 Jul 2026 03:45:48 -0400 Subject: fix: use interaction cards in admin gui work, fix card css on object tab --- internal/admin/static/admin.css | 6 +- internal/admin/static/cardeditor.js | 41 ++++++- internal/admin/static/itemeditor.js | 15 ++- internal/admin/static/mobeditor.js | 4 +- internal/admin/static/objecteditor.js | 216 ++++++++++++++++++++++++++++------ 5 files changed, 241 insertions(+), 41 deletions(-) (limited to 'internal/admin') diff --git a/internal/admin/static/admin.css b/internal/admin/static/admin.css index 33dbdc4..3c6aaa4 100644 --- a/internal/admin/static/admin.css +++ b/internal/admin/static/admin.css @@ -277,9 +277,9 @@ g.ud-hover:hover text{font-weight:bold} .obj-card-header:hover{background:rgba(15,52,96,.5)} .obj-card-arrow{font-size:10px;width:14px;color:#888} .obj-card-label{flex:1;color:var(--text)} -.obj-card-remove{padding:2px 6px;font-size:10px;min-width:auto} -.obj-card-expand{padding:2px 5px;font-size:11px;min-width:auto;background:transparent;color:#888;border:1px solid transparent;border-radius:3px;cursor:pointer;font-family:monospace;line-height:1} -.obj-card-expand:hover{color:var(--text);border-color:var(--border);background:rgba(255,255,255,.05)} +.obj-card-remove{width:18px;height:18px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:10px;min-width:auto;flex-shrink:0} +.obj-card-expand{width:18px;height:18px;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:9px;min-width:auto;background:rgba(255,255,255,0.07);color:#888;border:1px solid rgba(255,255,255,0.12);border-radius:3px;cursor:pointer;font-family:monospace;line-height:1;flex-shrink:0} +.obj-card-expand:hover{color:var(--text);border-color:var(--border);background:rgba(255,255,255,0.12)} .obj-card-body{padding:10px 12px} .obj-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:6px 8px} .obj-field{display:flex;flex-direction:column;gap:2px;font-size:11px} diff --git a/internal/admin/static/cardeditor.js b/internal/admin/static/cardeditor.js index 0235894..f2316e1 100644 --- a/internal/admin/static/cardeditor.js +++ b/internal/admin/static/cardeditor.js @@ -166,12 +166,42 @@ function ced_selectSearchResult(el) { var idx = Array.prototype.indexOf.call(results.children, el); if (results._items && results._items[idx] && results._targetInput) { results._targetInput.value = results._items[idx].id; + ced_persistSearchToData(results._targetInput, results._items[idx].id); results._targetInput.dispatchEvent(new Event('input')); results.style.display = 'none'; results.innerHTML = ''; } } +function ced_persistSearchToData(input, value) { + var ed = window._editorData; + var dataPath = input.getAttribute('data-data-path'); + if (!ed || !dataPath) return; + var m = dataPath.match(/^(.+)\[(\d+)\]\.(.+)$/); + if (m) { + var arr = ced_resolveDataPath(ed, m[1]); + if (arr && Array.isArray(arr)) { + if (!arr[m[2]]) arr[m[2]] = {}; + arr[m[2]][m[3]] = value; + } + } else { + var m2 = dataPath.match(/^(.+)\.(.+)$/); + if (m2) { + var obj = ced_resolveDataPath(ed, m2[1]); + if (obj) obj[m2[2]] = value; + } else { + ed[dataPath] = value; + } + } +} + +function ced_resolveDataPath(obj, path) { + return path.split('.').reduce(function(o, k) { + if (o === undefined || o === null) return undefined; + return o[k] !== undefined ? o[k] : undefined; + }, obj); +} + function ced_updateSearchHighlight(results) { for (var i = 0; i < results.children.length; i++) { results.children[i].classList.toggle('active', i === results._selectedIndex); @@ -240,7 +270,16 @@ function ced_renderField(sec, f, data, idx, subPath, optStyle, cardPathFn, field if (type === 'search') { var entity = searchEntity || 'items'; var ph = hint ? ' placeholder="' + esc(hint) + '"' : ' placeholder="Search ' + entity + '..."'; - return wrap('obj-field obj-search', '' + esc(label) + '
Failed to load: ' + esc(e.message) + '
'; @@ -524,7 +525,16 @@ function renderField(sec, f, data, idx, subPath, optStyle) { if (type === 'search') { var entity = searchEntity || 'items'; var ph = hint ? ' placeholder="' + esc(hint) + '"' : ' placeholder="Search ' + entity + '..."'; - return wrap('obj-field obj-search', '' + esc(label) + 'Failed to load: ' + esc(e.message) + '
'; @@ -230,7 +233,11 @@ function renderCard(sec, data) { var h = '