diff options
| author | historia <[not public]> | 2026-07-01 04:53:56 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-01 04:53:56 -0400 |
| commit | bf7c27c2cbf3eb56a0a4c5141e39b152c51614b5 (patch) | |
| tree | 5383c325fafeb34c01ea737a7070402f040fc5af /internal/admin/static/itemeditor.js | |
| parent | fbe5090ac3325ff8ea6989cdf4515c7f077c975b (diff) | |
| download | thehouseoficarus-bf7c27c2cbf3eb56a0a4c5141e39b152c51614b5.tar.gz | |
feat: admin gui map, item, and objects mostly complete
Diffstat (limited to 'internal/admin/static/itemeditor.js')
| -rw-r--r-- | internal/admin/static/itemeditor.js | 84 |
1 files changed, 73 insertions, 11 deletions
diff --git a/internal/admin/static/itemeditor.js b/internal/admin/static/itemeditor.js index d02945a..7c7c676 100644 --- a/internal/admin/static/itemeditor.js +++ b/internal/admin/static/itemeditor.js @@ -48,10 +48,10 @@ var SECTIONS = [ label: 'Recipes to Craft This Item', key: 'craft', fields: [ ['type', 'Type', 'select', 'smithing|cooking|crafting|fletching|combine|pharmacy|construction'], - ['subtype', 'Subtype', 'select', '|smelt|clean'], + ['subtype', 'Subtype', 'select', '|smelting|cleaning'], ['level', 'Level', 'number', '', 'narrow'], ['xp', 'XP', 'number', '', 'narrow'], - ['wait', 'Wait', 'number', '', 'narrow'], + ['ticks_per_cycle', 'Ticks/Cycle', 'number', '', 'narrow'], ['output_qty', 'Output Qty', 'number', '', 'narrow'], ['station', 'Station', 'select', '|anvil|cooking_range|fire|furnace|pottery_oven|pottery_wheel|spinning_wheel|workbench'], ['tool', 'Tool', 'select', '|pickaxe|axe|fire|chisel|hammer|knife|needle|rake|saw|shears|spade|watering_can|fishing_rod|fly_rod|harpoon|small_net|big_net|lobster_pot'], @@ -65,8 +65,9 @@ var SECTIONS = [ ['end_message', 'End Message', 'text', 'e.g. You\'ve finished smithing.', 'wide'], ], fieldGroups: [ - ['type', 'subtype', 'level', 'xp', 'wait', 'output_qty'], - {fields: ['station', 'tool'], right: true}, + ['type', 'subtype', 'level', 'xp', 'ticks_per_cycle', 'output_qty'], + {note: 'Output Qty is the quantity produced per cycle, only relevant for stackable items.'}, + ['station', 'tool'], {label: 'Success', fields: ['success_base', 'success_per_level', 'success_cap', 'fail']}, ['start_message', 'success_message', 'fail_message', 'end_message'], ], @@ -213,6 +214,7 @@ function renderItemEditor(id, data) { $('#editorMain').innerHTML = html; setupSearchFields(); setupCraftTypeChange(); + updateOutputQtyVisibility(); setTimeout(function() { document.querySelectorAll('.color-field').forEach(function(el) { bindColorField(el); }); }, 50); @@ -229,7 +231,7 @@ function renderCurrent() { function renderCard(sec, data) { var collapsed = expandedCards[sec.id] === false; - var h = '<div class="obj-card' + (sec.id === 'crafting' ? ' obj-card-full' : '') + '" data-card="' + sec.id + '">'; + var h = '<div class="obj-card" data-card="' + sec.id + '">'; h += '<div class="obj-card-header" onclick="toggleCard(\'' + sec.id + '\')">'; h += '<span class="obj-card-arrow">' + (collapsed ? '▶' : '▼') + '</span>'; h += '<span class="obj-card-label">' + sec.label + '</span>'; @@ -600,6 +602,10 @@ function renderSubtable(sec, st, data) { function renderGroup(fieldKeys) { fieldKeys.forEach(function(fieldKey) { + if (fieldKey === '|') { + h += '<span class="craft-sep" style="color:#555;margin:0 4px;font-size:14px;line-height:1;align-self:center">|</span>'; + return; + } var f = st.fields.find(function(sf) { return sf[0] === fieldKey; }); if (!f) return; if (f[5] && !f[5](item)) return; @@ -610,9 +616,11 @@ function renderSubtable(sec, st, data) { if (st.fieldGroups) { st.fieldGroups.forEach(function(group) { - if (group.label) { + if (group.note) { + h += '<div class="obj-field-note output-qty-note" style="margin:2px 0;padding:2px 8px;font-size:11px;color:#888;font-style:italic;line-height:1.3">' + esc(group.note) + '</div>'; + } else if (group.label) { if (group.label === 'Success') { - var hasSuccess = !!(item.fail || item.success_base || item.success_per_level || item.success_cap); + var hasSuccess = !!(item.fail || (item.success && (item.success.base || item.success.per_level || item.success.cap)) || item.success_base || item.success_per_level || item.success_cap); var gid = 'sg_' + sec.id + '_' + st.key + '_' + idx; h += '<div class="obj-inline-group success-group" id="' + gid + '" style="margin:2px 0;padding:4px 8px' + (hasSuccess ? '' : ';display:none') + '">'; h += '<div style="display:flex;align-items:center;margin-bottom:2px">'; @@ -1039,7 +1047,7 @@ function setupCraftTypeChange() { var xpField = document.getElementById(id.replace(/_type$/, '_xp')); var stationField = document.getElementById(id.replace(/_type$/, '_station')); - var combineHideFields = ['success_message', 'fail_message', 'tool', 'wait', + var combineHideFields = ['success_message', 'fail_message', 'tool', 'ticks_per_cycle', 'success_base', 'success_per_level', 'success_cap', 'fail']; var recipeRow = typeSelect.closest('.obj-sub-row'); @@ -1065,6 +1073,9 @@ function setupCraftTypeChange() { if (lbl) lbl.style.display = t === 'combine' ? 'none' : ''; }); + var sepEl = recipeRow.querySelector('.craft-sep'); + if (sepEl) sepEl.style.display = t === 'combine' ? 'none' : ''; + var successGroup = document.querySelector('.success-group'); if (successGroup) successGroup.style.display = t === 'combine' ? 'none' : ''; var successBtn = document.getElementById(successGroup ? successGroup.id + '_btn' : ''); @@ -1081,10 +1092,10 @@ function setupCraftTypeChange() { var sLbl = subtypeSel.closest('.obj-field'); if (t === 'smithing') { if (sLbl) sLbl.style.display = ''; - subtypeSel.innerHTML = '<option value="">none</option><option value="smelt">smelt</option>'; + subtypeSel.innerHTML = '<option value="">none</option><option value="smelting">smelting</option>'; } else if (t === 'pharmacy') { if (sLbl) sLbl.style.display = ''; - subtypeSel.innerHTML = '<option value="">none</option><option value="clean">clean</option>'; + subtypeSel.innerHTML = '<option value="">none</option><option value="cleaning">cleaning</option>'; } else { if (sLbl) sLbl.style.display = 'none'; subtypeSel.value = ''; @@ -1097,6 +1108,26 @@ function setupCraftTypeChange() { }); } +function updateOutputQtyVisibility() { + var isStackable = false; + var stackableEl = document.getElementById('f_core_stackable'); + if (stackableEl) { + isStackable = stackableEl.checked; + if (!stackableEl._hasOutputQtyListener) { + stackableEl._hasOutputQtyListener = true; + stackableEl.addEventListener('change', updateOutputQtyVisibility); + } + } + + document.querySelectorAll('[id$="_output_qty"]').forEach(function(el) { + var lbl = el.closest('.obj-field'); + if (lbl) lbl.style.display = isStackable ? '' : 'none'; + }); + document.querySelectorAll('.output-qty-note').forEach(function(el) { + el.style.display = isStackable ? '' : 'none'; + }); +} + function setupSearchFields() { document.querySelectorAll('.search-input').forEach(function(input) { if (input._searchSetup) return; @@ -1109,7 +1140,7 @@ function setupSearchFields() { input.addEventListener('input', function() { var val = input.value.trim(); - if (!val) { results.style.display = 'none'; results.innerHTML = ''; return; } + if (!val) { results.style.display = 'none'; results.innerHTML = ''; results._selectedIndex = -1; return; } API.get('/api/search?q=' + encodeURIComponent(val)).then(function(data) { var items = []; if (entityType === 'items' && data.items) items = data.items; @@ -1126,6 +1157,7 @@ function setupSearchFields() { return '<div class="sr-item" onclick="event.stopPropagation();selectSearchResult(this)">' + esc(r.id) + ' <span style="color:#aaa">' + esc(r.name || '') + '</span></div>'; }).join(''); results._items = items; + results._selectedIndex = -1; }).catch(function() { results.style.display = 'none'; }); @@ -1140,6 +1172,29 @@ function setupSearchFields() { input.addEventListener('blur', function() { setTimeout(function() { results.style.display = 'none'; }, 200); }); + + input.addEventListener('keydown', function(e) { + if (results.style.display === 'none' || !results.children.length) return; + if (results._selectedIndex === undefined) results._selectedIndex = -1; + + if (e.key === 'ArrowDown') { + e.preventDefault(); + results._selectedIndex = Math.min(results._selectedIndex + 1, results.children.length - 1); + updateSearchHighlight(results); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + results._selectedIndex = Math.max(results._selectedIndex - 1, 0); + updateSearchHighlight(results); + } else if (e.key === 'Enter') { + if (results._selectedIndex >= 0) { + e.preventDefault(); + selectSearchResult(results.children[results._selectedIndex]); + } + } else if (e.key === 'Escape') { + results.style.display = 'none'; + results._selectedIndex = -1; + } + }); }); document.addEventListener('click', function(e) { @@ -1160,6 +1215,13 @@ function selectSearchResult(el) { } } +function updateSearchHighlight(results) { + for (var i = 0; i < results.children.length; i++) { + results.children[i].classList.toggle('active', i === results._selectedIndex); + if (i === results._selectedIndex) results.children[i].scrollIntoView({block: 'nearest'}); + } +} + // ========================================================================= // Validation // ========================================================================= |
