class SettingsMenuDorakoUX extends FormApplication { static namespace; static get defaultOptions() { const options = super.defaultOptions; options.classes.push("settings-menu"); return mergeObject(options, { title: `pf2e-dorako-ux.settings.${this.namespace}.name`, id: `${this.namespace}-settings`, template: `modules/pf2e-dorako-ui/templates/menu.hbs`, width: 550, height: "auto", closeOnSubmit: false, }); } static get prefix() { return `${this.namespace}.`; } get namespace() { return this.constructor.namespace; } get prefix() { return this.constructor.prefix; } static SETTINGS; /** Settings to be registered and also later referenced during user updates */ static get settings() { return {}; } static registerSettings() { const settings = this.settings; for (const setting of this.SETTINGS) { game.settings.register("pf2e-dorako-ux", `${this.prefix}${setting}`, { ...settings[setting], config: true, }); } } async getData() { const settings = this.constructor.settings; const templateData = Object.entries(settings).map(([key, setting]) => { const value = game.settings.get("pf2e-dorako-ux", `${this.prefix}${key}`); return { ...setting, key, value, isSelect: !!setting.choices, isCheckbox: setting.type === Boolean, isFilepicker: setting.type === String && setting.filePicker, isNumber: setting.type === Number && !setting.range, isText: setting.type === String && !setting.filePicker, isRange: setting.type === Number && !!setting.range, }; }); return mergeObject(await super.getData(), { settings: templateData, instructions: `pf2e-dorako-ux.settings.${this.namespace}.hint`, }); } async _updateObject(_event, data) { for (const key of this.constructor.SETTINGS) { const settingKey = `${this.prefix}${key}`; await game.settings.set("pf2e-dorako-ux", settingKey, data[key]); } } } export { SettingsMenuDorakoUX };