aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/static/cardeditor.js
diff options
context:
space:
mode:
Diffstat (limited to 'internal/admin/static/cardeditor.js')
-rw-r--r--internal/admin/static/cardeditor.js48
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 = {};