diff options
Diffstat (limited to 'internal/admin/static/cardeditor.js')
| -rw-r--r-- | internal/admin/static/cardeditor.js | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/internal/admin/static/cardeditor.js b/internal/admin/static/cardeditor.js index 1e8d259..1b2b76b 100644 --- a/internal/admin/static/cardeditor.js +++ b/internal/admin/static/cardeditor.js @@ -90,6 +90,46 @@ function ced_addKVRow(cardID, subKey) { el.appendChild(row); } +function ced_buildDynamicSelect(fid, dpAttr, val, dynKey) { + var items = (window._dynOpts && window._dynOpts[dynKey]) ? window._dynOpts[dynKey].slice().sort() : []; + var s = '<select id="' + fid + '"' + dpAttr + '>'; + s += '<option value="">(none)</option>'; + items.forEach(function(o) { + s += '<option value="' + escAttr(o) + '"' + (String(val) === o ? ' selected' : '') + '>' + esc(o) + '</option>'; + }); + s += '</select>'; + return s; +} + +function ced_renderKVSearch(sec, il, data, getter) { + var sectionRoot = data[ced_cardPath(sec)] || data; + var map = getter ? getter(sectionRoot, il) : (sectionRoot[il.key] || {}); + var entity = il.searchEntity || 'items'; + var h = '<div class="obj-inline-group">'; + h += '<span class="obj-inline-label">' + esc(il.label) + '</span>'; + h += '<div class="obj-kv-list" data-sec="' + sec.id + '" data-key="' + il.key + '">'; + Object.keys(map).forEach(function(k, idx) { + h += '<div class="obj-kv-row">'; + h += '<div class="obj-kv-key-wrap obj-search" style="flex:1;position:relative"><div style="position:relative;width:100%"><input value="' + escAttr(k) + '" class="search-input obj-kv-key" data-search-type="' + entity + '" placeholder="Search ' + entity + '..."><div class="search-results" style="display:none"></div></div></div>'; + h += '<input value="' + escAttr(String(map[k])) + '" placeholder="val" class="obj-kv-val">'; + h += '<button class="btn btn-sm btn-danger" onclick="this.parentElement.remove()">X</button></div>'; + }); + h += '</div>'; + h += '<button class="btn btn-sm obj-sub-add" onclick="ced_addKVSearchRow(\'' + sec.id + '\',\'' + il.key + '\',\'' + entity + '\')">+ Add</button>'; + h += '</div>'; + return h; +} + +function ced_addKVSearchRow(cardID, subKey, entity) { + var el = document.querySelector('.obj-kv-list[data-sec="' + cardID + '"][data-key="' + subKey + '"]'); + if (!el) return; + var row = document.createElement('div'); + row.className = 'obj-kv-row'; + row.innerHTML = '<div class="obj-kv-key-wrap obj-search" style="flex:1;position:relative"><div style="position:relative;width:100%"><input value="" class="search-input obj-kv-key" data-search-type="' + entity + '" placeholder="Search ' + entity + '..."><div class="search-results" style="display:none"></div></div></div><input value="0" placeholder="val" class="obj-kv-val"><button class="btn btn-sm btn-danger" onclick="this.parentElement.remove()">X</button>'; + el.appendChild(row); + ced_setupSearchFields(row); +} + // ---- Search autocomplete ---- function ced_setupSearchFields(root) { @@ -114,7 +154,7 @@ function ced_setupSearchFields(root) { if (entityType === 'drops' && data.drops) items = data.drops; if (items.length === 0) { results.style.display = 'block'; - results.innerHTML = '<div class="sr-item" style="color:#888">No results</div>'; + results.innerHTML = '<div class="sr-item sr-no-results">No results</div>'; return; } results.style.display = 'block'; @@ -315,6 +355,10 @@ function ced_renderField(sec, f, data, idx, subPath, optStyle, cardPathFn, field return wrap('obj-field', '<span>' + esc(label) + '</span><textarea id="' + fid + '" rows="3"' + dpAttr + '>' + esc(dstr) + '</textarea>'); } if (type === 'select') { + if (hint && hint.indexOf('dyn:') === 0) { + var inner = '<span>' + esc(label) + '</span>' + ced_buildDynamicSelect(fid, dpAttr, val, hint.substring(4)); + return wrap('obj-field', inner); + } var opts = hint ? hint.split('|') : []; var inner = '<span>' + esc(label) + '</span><select id="' + fid + '"' + dpAttr + '>'; opts.forEach(function(o) { @@ -423,7 +467,7 @@ function ced_saveInlineFields(sec, sectionObj, cardPathFn, fieldIDFn) { sectionObj[il.key] = el.value.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s; }); hasValues = true; } - } else if (il.type === 'kv') { + } else if (il.type === 'kv' || il.type === 'kv_search') { var kvEl = document.querySelector('.obj-kv-list[data-sec="' + sec.id + '"][data-key="' + il.key + '"]'); if (kvEl) { var map = {}; |
