diff options
Diffstat (limited to 'internal/admin/static/itemeditor.js')
| -rw-r--r-- | internal/admin/static/itemeditor.js | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/internal/admin/static/itemeditor.js b/internal/admin/static/itemeditor.js index 5a2b371..5ffb0cb 100644 --- a/internal/admin/static/itemeditor.js +++ b/internal/admin/static/itemeditor.js @@ -224,6 +224,7 @@ function renderItemEditor(id, data) { } function renderCurrent() { + ced_syncDOMToData(itemData); if (!itemData || !itemID) return; renderItemEditor(itemID, itemData); } @@ -349,6 +350,8 @@ function equipFieldID(key) { function renderEquipField(key, label, type, hint, val, wide, searchEntity) { var fid = equipFieldID(key); val = val === undefined || val === null ? '' : val; + var dp = 'equipment.' + key; + var dpAttr = ' data-field-path="' + escAttr(dp) + '"'; function wrap(cls, inner) { var w = (wide === 'wide') ? ' obj-wide' : ''; @@ -358,7 +361,7 @@ function renderEquipField(key, label, type, hint, val, wide, searchEntity) { if (type === 'select') { var opts = hint ? hint.split('|') : []; - var inner = '<span>' + esc(label) + '</span><select id="' + fid + '">'; + var inner = '<span>' + esc(label) + '</span><select id="' + fid + '"' + dpAttr + '>'; opts.forEach(function(o) { inner += '<option value="' + escAttr(o) + '"' + (String(val) === o ? ' selected' : '') + '>' + esc(o) + '</option>'; }); @@ -368,10 +371,10 @@ function renderEquipField(key, label, type, hint, val, wide, searchEntity) { if (type === 'search') { var entity = searchEntity || 'items'; var ph = hint ? ' placeholder="' + esc(hint) + '"' : ' placeholder="Search ' + entity + '..."'; - return wrap('obj-field obj-search', '<span>' + esc(label) + '</span><div style="position:relative;width:100%"><input id="' + fid + '" value="' + escAttr(String(val)) + '" class="search-input" data-search-type="' + entity + '"' + ph + '><div class="search-results" style="display:none"></div></div>'); + return wrap('obj-field obj-search', '<span>' + esc(label) + '</span><div style="position:relative;width:100%"><input id="' + fid + '" value="' + escAttr(String(val)) + '" class="search-input" data-search-type="' + entity + '" data-field-path="' + escAttr(dp) + '"' + ph + '><div class="search-results" style="display:none"></div></div>'); } var ph = hint ? ' placeholder="' + esc(hint) + '"' : ''; - return wrap('obj-field', '<span>' + esc(label) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + ph + '>'); + return wrap('obj-field', '<span>' + esc(label) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + ph + dpAttr + '>'); } function renderEquipmentCard(data) { @@ -491,6 +494,17 @@ function renderField(sec, f, data, idx, subPath, optStyle) { if (!showIf(sectionData)) hiddenStyle = ' style="display:none"'; } + var pfx = cardPath(sec); + var dp; + if (idx >= 0) { + dp = pfx + '[' + idx + '].' + key; + } else if (subPath) { + dp = (pfx ? pfx + '.' : '') + subPath + '.' + key; + } else { + dp = (pfx ? pfx + '.' : '') + key; + } + var dpAttr = ' data-field-path="' + escAttr(dp) + '"'; + function wrap(cls, inner) { var w = (wide === 'wide') ? ' obj-wide' : ''; if (wide === 'narrow') w = ' obj-narrow'; @@ -499,19 +513,19 @@ function renderField(sec, f, data, idx, subPath, optStyle) { } if (type === 'checkbox') { - return wrap('obj-field obj-check', '<input type="checkbox" id="' + fid + '"' + (val ? ' checked' : '') + '> <span>' + esc(label) + '</span>'); + return wrap('obj-field obj-check', '<input type="checkbox" id="' + fid + '"' + (val ? ' checked' : '') + dpAttr + '> <span>' + esc(label) + '</span>'); } if (type === 'json') { var jstr = typeof val === 'object' ? JSON.stringify(val) : String(val); - return wrap('obj-field', '<span>' + esc(label) + '</span><textarea id="' + fid + '" rows="2" placeholder="{}">' + esc(jstr) + '</textarea>'); + return wrap('obj-field', '<span>' + esc(label) + '</span><textarea id="' + fid + '" rows="2" placeholder="{}"' + dpAttr + '>' + esc(jstr) + '</textarea>'); } if (type === 'textarea') { var dstr = typeof val === 'object' ? (Array.isArray(val) ? val.map(function(v){return v.text||'';}).join('\n') : JSON.stringify(val)) : String(val); - return wrap('obj-field', '<span>' + esc(label) + '</span><textarea id="' + fid + '" rows="3">' + esc(dstr) + '</textarea>'); + return wrap('obj-field', '<span>' + esc(label) + '</span><textarea id="' + fid + '" rows="3"' + dpAttr + '>' + esc(dstr) + '</textarea>'); } if (type === 'select') { var opts = hint ? hint.split('|') : []; - var inner = '<span>' + esc(label) + '</span><select id="' + fid + '">'; + var inner = '<span>' + esc(label) + '</span><select id="' + fid + '"' + dpAttr + '>'; opts.forEach(function(o) { inner += '<option value="' + escAttr(o) + '"' + (String(val) === o ? ' selected' : '') + '>' + esc(o) + '</option>'; }); @@ -520,24 +534,15 @@ function renderField(sec, f, data, idx, subPath, optStyle) { } if (type === 'color') { var swatch = '<span class="color-swatch" style="background:#' + escAttr(String(val) || '808080') + '"></span>'; - return wrap('obj-field color-field', '<span>' + esc(label) + '</span><div class="obj-color-row">' + swatch + '<input id="' + fid + '" value="' + escAttr(String(val)) + '" class="color-input"></div>'); + return wrap('obj-field color-field', '<span>' + esc(label) + '</span><div class="obj-color-row">' + swatch + '<input id="' + fid + '" value="' + escAttr(String(val)) + '" class="color-input"' + dpAttr + '></div>'); } if (type === 'search') { var entity = searchEntity || 'items'; var ph = hint ? ' placeholder="' + esc(hint) + '"' : ' placeholder="Search ' + entity + '..."'; - var pfx = cardPath(sec); - var dp; - if (idx >= 0) { - dp = pfx + '[' + idx + '].' + key; - } else if (subPath) { - dp = (pfx ? pfx + '.' : '') + subPath + '.' + key; - } else { - dp = (pfx ? pfx + '.' : '') + key; - } - return wrap('obj-field obj-search', '<span>' + esc(label) + '</span><div style="position:relative;width:100%"><input id="' + fid + '" value="' + escAttr(String(val)) + '" class="search-input" data-search-type="' + entity + '" data-data-path="' + escAttr(dp) + '"' + ph + '><div class="search-results" style="display:none"></div></div>'); + return wrap('obj-field obj-search', '<span>' + esc(label) + '</span><div style="position:relative;width:100%"><input id="' + fid + '" value="' + escAttr(String(val)) + '" class="search-input" data-search-type="' + entity + '" data-field-path="' + escAttr(dp) + '"' + ph + '><div class="search-results" style="display:none"></div></div>'); } var ph = hint ? ' placeholder="' + esc(hint) + '"' : ''; - return wrap('obj-field', '<span>' + esc(label) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + ph + '>'); + return wrap('obj-field', '<span>' + esc(label) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + ph + dpAttr + '>'); } // ========================================================================= @@ -575,25 +580,26 @@ function renderSubFieldHTML(sec, stKey, idx, f, val) { if (f[4] === 'wide') extraStyle = ' style="flex:1 1 100%"'; var defaultPh = ''; if (f[3]) defaultPh = ' placeholder="' + escAttr(f[3]) + '"'; + var dp = cardPath(sec) + '.' + stKey + '[' + idx + '].' + f[0]; + var dpAttr = ' data-field-path="' + escAttr(dp) + '"'; if (f[2] === 'search') { var entity = f[6] || 'items'; var ph = f[3] ? ' placeholder="' + escAttr(f[3]) + '"' : ' placeholder="Search ' + entity + '..."'; - var dp = cardPath(sec) + '.' + stKey + '[' + idx + '].' + f[0]; - return '<label class="obj-field obj-search' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><div style="position:relative;width:100%"><input id="' + fid + '" value="' + escAttr(String(val)) + '" class="search-input" data-search-type="' + entity + '" data-data-path="' + escAttr(dp) + '"' + ph + '><div class="search-results" style="display:none"></div></div></label>'; + return '<label class="obj-field obj-search' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><div style="position:relative;width:100%"><input id="' + fid + '" value="' + escAttr(String(val)) + '" class="search-input" data-search-type="' + entity + '" data-field-path="' + escAttr(dp) + '"' + ph + '><div class="search-results" style="display:none"></div></div></label>'; } if (f[2] === 'checkbox') { - return '<label class="obj-field obj-check' + extraCls + '"' + extraStyle + '><input type="checkbox" id="' + fid + '"' + (val ? ' checked' : '') + '> <span>' + esc(f[1]) + '</span></label>'; + return '<label class="obj-field obj-check' + extraCls + '"' + extraStyle + '><input type="checkbox" id="' + fid + '"' + (val ? ' checked' : '') + dpAttr + '> <span>' + esc(f[1]) + '</span></label>'; } if (f[2] === 'select') { var opts = f[3] ? f[3].split('|') : []; - var sel = '<label class="obj-field' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><select id="' + fid + '">'; + var sel = '<label class="obj-field' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><select id="' + fid + '"' + dpAttr + '>'; opts.forEach(function(o) { sel += '<option value="' + escAttr(o) + '"' + (String(val) === o ? ' selected' : '') + '>' + esc(o || '(none)') + '</option>'; }); sel += '</select></label>'; return sel; } - return '<label class="obj-field' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + defaultPh + '></label>'; + return '<label class="obj-field' + extraCls + '"' + extraStyle + '><span>' + esc(f[1]) + '</span><input id="' + fid + '" value="' + escAttr(String(val)) + '"' + defaultPh + dpAttr + '></label>'; } function renderSubtable(sec, st, data) { |
