From 8d920402308b3e7db4442ef6476fdc49cb24128e Mon Sep 17 00:00:00 2001 From: Oliver-Akins Date: Sat, 11 Jan 2025 20:04:27 -0700 Subject: [PATCH] RC-91 | Add dropdown option support --- langs/en-ca.json | 8 +++- module/data/Item/Weapon.mjs | 25 +++++++++--- .../handlebarHelpers/inputs/dropdownInput.mjs | 38 +++++++++++++++++++ module/handlebarHelpers/inputs/formFields.mjs | 4 +- templates/Apps/AllItemSheetV1/style.css | 10 ++--- templates/css/elements/select.css | 3 ++ 6 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 module/handlebarHelpers/inputs/dropdownInput.mjs diff --git a/langs/en-ca.json b/langs/en-ca.json index abb3e88..b47708c 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -55,7 +55,13 @@ "arms": "Arms", "legs": "Legs" }, - "shield": "Shield" + "shield": "Shield", + "access": { + "Common": "Common", + "Uncommon": "Uncommon", + "Rare": "Rare", + "Scarce": "Scarce" + } }, "setting": { "abbrAccess": { diff --git a/module/data/Item/Weapon.mjs b/module/data/Item/Weapon.mjs index f269961..ff28d88 100644 --- a/module/data/Item/Weapon.mjs +++ b/module/data/Item/Weapon.mjs @@ -64,31 +64,46 @@ export class WeaponData extends foundry.abstract.TypeDataModel { label: `RipCrypt.common.traits`, placeholder: `RipCrypt.Apps.traits-placeholder`, path: `system.traits`, - value: ctx.meta.limited ? `???` : this.traitString, + value: this.traitString, }, { type: `integer`, label: `RipCrypt.Apps.short-range`, path: `system.range.short`, - value: ctx.meta.limited ? `???` : (this.range.short ?? ``), + value: this.range.short ?? ``, min: 0, }, { type: `integer`, label: `RipCrypt.Apps.long-range`, path: `system.range.long`, - value: ctx.meta.limited ? `???` : (this.range.long ?? ``), + value: this.range.long ?? ``, min: 0, }, { type: `integer`, label: `RipCrypt.common.damage`, path: `system.damage`, - value: ctx.meta.limited ? `???` : this.damage, + value: this.damage, min: 0, }, // { type: `bar`, label: `Wear` }, - // { type: `dropdown`, label: `Access` }, + { + type: `dropdown`, + label: `Access`, + path: `system.access`, + value: this.access, + options: [ + { + label: `RipCrypt.common.empty`, + value: ``, + }, + ...gameTerms.Access.map(opt => ({ + label: `RipCrypt.common.access.${opt}`, + value: opt, + })), + ], + }, ]; if (this.parent.isEmbedded) { diff --git a/module/handlebarHelpers/inputs/dropdownInput.mjs b/module/handlebarHelpers/inputs/dropdownInput.mjs new file mode 100644 index 0000000..3b4d10d --- /dev/null +++ b/module/handlebarHelpers/inputs/dropdownInput.mjs @@ -0,0 +1,38 @@ +import { localizer } from "../../utils/Localizer.mjs"; +import { options } from "../options.mjs"; + +const { randomID } = foundry.utils; + +export function dropdownInput(input, data) { + const label = localizer(input.label); + const id = `${data.meta.idp}-${randomID(10)}`; + + if (!data.meta.editable) { + return `
+ ${label} + ${data.meta.limited ? `???` : input.value} +
`; + }; + + if (!input.options.length) { + throw new Error(`dropdown type inputs must have some options`); + }; + + return `
+ + +
`; +}; diff --git a/module/handlebarHelpers/inputs/formFields.mjs b/module/handlebarHelpers/inputs/formFields.mjs index cd081f0..3268d79 100644 --- a/module/handlebarHelpers/inputs/formFields.mjs +++ b/module/handlebarHelpers/inputs/formFields.mjs @@ -1,3 +1,4 @@ +import { dropdownInput } from "./dropdownInput.mjs"; import { numberInput } from "./numberInput.mjs"; import { stringSet } from "./stringSet.mjs"; @@ -5,7 +6,7 @@ const inputTypes = { "string-set": stringSet, integer: numberInput, bar: displayOnly, - dropdown: displayOnly, + dropdown: dropdownInput, boolean: displayOnly, }; @@ -17,6 +18,7 @@ export function formFields(inputs, opts) { const fields = []; for (const input of inputs) { if (inputTypes[input.type] == null) { continue }; + input.value = Handlebars.escapeExpression(input.value); fields.push(inputTypes[input.type](input, opts.data.root)); }; return fields.join(opts.hash?.joiner ?? `
`); diff --git a/templates/Apps/AllItemSheetV1/style.css b/templates/Apps/AllItemSheetV1/style.css index 549fdcd..a90fd1e 100644 --- a/templates/Apps/AllItemSheetV1/style.css +++ b/templates/Apps/AllItemSheetV1/style.css @@ -9,7 +9,10 @@ --string-tags-add-text: white; --string-tags-add-background: var(--accent-1); --string-tags-input-text: white; - --string-tags-input-background: var(--accent-1); + --string-tags-input-background: var(--accent-2); + + --input-text: white; + --input-background: var(--accent-2); display: grid; grid-template-columns: auto minmax(0, 1fr); @@ -45,13 +48,10 @@ font-weight: bold; } - input, .value, [data-tag-count] { + input, select, .value, [data-tag-count] { border-radius: 4px; padding: 2px 4px; } - input { - background: var(--accent-2); - } .value, [data-tag-count="0"] { border: 2px solid var(--accent-2); } diff --git a/templates/css/elements/select.css b/templates/css/elements/select.css index 2ea8495..b822816 100644 --- a/templates/css/elements/select.css +++ b/templates/css/elements/select.css @@ -8,4 +8,7 @@ font-size: inherit; display: flex; align-items: center; + + background: var(--input-background); + color: var(--input-text); }