From f601a40776843f6196221e74ba502c571a5b1bcd Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Sun, 12 Jul 2026 21:16:58 -0400 Subject: fix(admin): standardize most search dropdowns and radio buttons --- internal/admin/static/mobeditor.js | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'internal/admin/static/mobeditor.js') diff --git a/internal/admin/static/mobeditor.js b/internal/admin/static/mobeditor.js index 2c8db21..3934fcd 100644 --- a/internal/admin/static/mobeditor.js +++ b/internal/admin/static/mobeditor.js @@ -46,7 +46,7 @@ var MOB_SECTIONS = [ ['stats.defenses.crush_defense', 'Crush Def', 'number', '0', 'narrow'], ['stats.defenses.science_defense', 'Sci Def', 'number', '0', 'narrow'], ['stats.defenses.ranged_defense', 'Rng Def', 'number', '0', 'narrow'], - ['stats.defenses.weakness', 'Weakness', 'text', 'e.g. crush'], + ['stats.defenses.weakness', 'Weakness', 'select', '|bio|eco|hydro|solar|chaos'], ['stats.defenses.weakness_percent', 'Weakness %', 'number', '50', 'narrow'], ['assassin_level', 'Assassin Lvl', 'number', '1', 'narrow'], ['finishing_blow', 'Finishing Blow', 'search', 'e.g. stake', '', null, 'items'], @@ -314,19 +314,22 @@ function normalizeAttackTypes(v) { } // renderMobAttackTypeWidget renders the Atk Type selector: one required melee -// type (radio: stab/slash/crush) plus optional ranged/science (checkboxes). +// type (pill: stab/slash/crush) plus optional ranged/science (checkboxes). function renderMobAttackTypeWidget(data) { var combat = data.combat || {}; var types = normalizeAttackTypes(combat.attack_types); var melee = types.filter(function(t) { return t === 'stab' || t === 'slash' || t === 'crush'; })[0] || 'crush'; var hasRanged = types.indexOf('ranged') >= 0; var hasScience = types.indexOf('science') >= 0; + var meleeOpts = ['stab','slash','crush']; + var activeIdx = meleeOpts.indexOf(melee); + if (activeIdx < 0) activeIdx = 2; var h = '
'; h += 'Atk Type'; - h += '
'; - ['stab','slash','crush'].forEach(function(m) { - h += ''; + h += '
'; + meleeOpts.forEach(function(t, i) { + h += ''; }); h += '
'; h += '
'; @@ -337,12 +340,31 @@ function renderMobAttackTypeWidget(data) { return h; } +function mobAtkPillSelect(val, btn) { + var pill = document.getElementById('mob_atktype_pill'); + if (!pill) return; + var opts = pill.querySelectorAll('.seg-opt'); + var idx = -1; + opts.forEach(function(o, i) { + if (o.getAttribute('data-v') === val) { + o.classList.add('seg-active'); + idx = i; + } else { + o.classList.remove('seg-active'); + } + }); + pill.className = pill.className.replace(/seg-idx-\d/g, 'seg-idx-' + idx); +} + // collectMobAttackType reads the Atk Type widget into an array: the selected // melee type first, then any optional ranged/science types. function collectMobAttackType() { var melee = 'crush'; - var r = document.querySelector('input[name="mob_atktype_melee"]:checked'); - if (r) melee = r.value; + var pill = document.getElementById('mob_atktype_pill'); + if (pill) { + var active = pill.querySelector('.seg-opt.seg-active'); + if (active) melee = active.getAttribute('data-v'); + } var out = [melee]; var rng = document.getElementById('mob_atktype_ranged'); var sci = document.getElementById('mob_atktype_science'); @@ -852,7 +874,7 @@ function saveMob() { hasValues = ced_saveSectionFields(sec, sectionObj, cardPath, fieldID) || hasValues; } - if (sec.id === 'combat' && document.querySelector('input[name="mob_atktype_melee"]')) { + if (sec.id === 'combat' && document.getElementById('mob_atktype_pill')) { sectionObj['attack_types'] = collectMobAttackType(); hasValues = true; } -- cgit v1.2.3