diff --git a/lang/en.json b/lang/en.json index e991aed..5f065d5 100644 --- a/lang/en.json +++ b/lang/en.json @@ -94,7 +94,8 @@ "JDTIMEKEEPING.WeekName": "Week", "JDTIMEKEEPING.Settings.WeekdayConfig.name": "Configure the Days of the Week", - "JDTIMEKEEPING.Settings.WeekdayConfig.label": "Rename Weekdays", + "JDTIMEKEEPING.Settings.WeekdayConfig.label": "Weekday Settings", + "JDTIMEKEEPING.Settings.RenameWeekdays": "Rename Weekdays", "JDTIMEKEEPING.Settings.WeekdayConfig.hint": "", "JDTIMEKEEPING.longTimeFormat": "{time}, {dayName} {weekName} {weekNumber}", @@ -120,5 +121,14 @@ "JDTIMEKEEPING.Settings.UIFocusOpacity.name": "UI Transparency", "JDTIMEKEEPING.Settings.UIFocusOpacity.hint": "Controls the UI transparency when in use. 0 is fully hidden, and 1 is fully visible.", "JDTIMEKEEPING.Settings.UIBackgroundColor.name": "UI Background Color", - "JDTIMEKEEPING.Settings.UIBackgroundColor.hint": "Used on both the docked and floating panels" + "JDTIMEKEEPING.Settings.UIBackgroundColor.hint": "Used on both the docked and floating panels", + "JDTIMEKEEPING.Settings.DaysInWeek": "Number of Days in a Week", + "JDTIMEKEEPING.Settings.WeekName.label": "Name of the Week", + "JDTIMEKEEPING.EightDay": "Eightday", + "JDTIMEKEEPING.NineDay": "Nineday", + "JDTIMEKEEPING.TenDay": "Tenday", + "JDTIMEKEEPING.ElevenDay": "Elevenday", + "JDTIMEKEEPING.TwelveDay": "Twelveday", + "JDTIMEKEEPING.ThirteenDay": "Thirteenday", + "JDTIMEKEEPING.FourteenDay": "Fourteenday" } \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json index d56118c..38bae09 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -94,7 +94,8 @@ "JDTIMEKEEPING.WeekName": "Semaine", "JDTIMEKEEPING.Settings.WeekdayConfig.name": "Configurer les jours de la semaine", - "JDTIMEKEEPING.Settings.WeekdayConfig.label": "Renommer les jours de la semaine", + "JDTIMEKEEPING.Settings.WeekdayConfig.label": "Weekday Settings", + "JDTIMEKEEPING.Settings.RenameWeekdays": "Renommer les jours de la semaine", "JDTIMEKEEPING.Settings.WeekdayConfig.hint": "", "JDTIMEKEEPING.longTimeFormat": "{dayName}, {time} | {weekName}: {weekNumber}", @@ -120,5 +121,14 @@ "JDTIMEKEEPING.Settings.UIFocusOpacity.name": "UI Transparency", "JDTIMEKEEPING.Settings.UIFocusOpacity.hint": "Controls the UI transparency when in use. 0 is fully hidden, and 1 is fully visible.", "JDTIMEKEEPING.Settings.UIBackgroundColor.name": "UI Background Color", - "JDTIMEKEEPING.Settings.UIBackgroundColor.hint": "Used on both the docked and floating panels" + "JDTIMEKEEPING.Settings.UIBackgroundColor.hint": "Used on both the docked and floating panels", + "JDTIMEKEEPING.Settings.DaysInWeek": "Number of Days in a Week", + "JDTIMEKEEPING.Settings.WeekName.label": "Name of the Week", + "JDTIMEKEEPING.EightDay": "Eightday", + "JDTIMEKEEPING.NineDay": "Nineday", + "JDTIMEKEEPING.TenDay": "Tenday", + "JDTIMEKEEPING.ElevenDay": "Elevenday", + "JDTIMEKEEPING.TwelveDay": "Twelveday", + "JDTIMEKEEPING.ThirteenDay": "Thirteenday", + "JDTIMEKEEPING.FourteenDay": "Fourteenday" } \ No newline at end of file diff --git a/lang/it.json b/lang/it.json index 0519da2..a48d779 100644 --- a/lang/it.json +++ b/lang/it.json @@ -94,7 +94,8 @@ "JDTIMEKEEPING.WeekName": "Settimana", "JDTIMEKEEPING.Settings.WeekdayConfig.name": "Configura i Giorni della Settimana", - "JDTIMEKEEPING.Settings.WeekdayConfig.label": "Rinomina i Giorni della Settimana", + "JDTIMEKEEPING.Settings.WeekdayConfig.label": "Weekday Settings", + "JDTIMEKEEPING.Settings.RenameWeekdays": "Rinomina i Giorni della Settimana", "JDTIMEKEEPING.Settings.WeekdayConfig.hint": "Imposta i nomi dei giorni della settimana", "JDTIMEKEEPING.longTimeFormat": "{time}, {dayName}, {weekName} {weekNumber}", @@ -120,5 +121,14 @@ "JDTIMEKEEPING.Settings.UIFocusOpacity.name": "UI Transparency", "JDTIMEKEEPING.Settings.UIFocusOpacity.hint": "Controls the UI transparency when in use. 0 is fully hidden, and 1 is fully visible.", "JDTIMEKEEPING.Settings.UIBackgroundColor.name": "UI Background Color", - "JDTIMEKEEPING.Settings.UIBackgroundColor.hint": "Used on both the docked and floating panels" + "JDTIMEKEEPING.Settings.UIBackgroundColor.hint": "Used on both the docked and floating panels", + "JDTIMEKEEPING.Settings.DaysInWeek": "Number of Days in a Week", + "JDTIMEKEEPING.Settings.WeekName.label": "Name of the Week", + "JDTIMEKEEPING.EightDay": "Eightday", + "JDTIMEKEEPING.NineDay": "Nineday", + "JDTIMEKEEPING.TenDay": "Tenday", + "JDTIMEKEEPING.ElevenDay": "Elevenday", + "JDTIMEKEEPING.TwelveDay": "Twelveday", + "JDTIMEKEEPING.ThirteenDay": "Thirteenday", + "JDTIMEKEEPING.FourteenDay": "Fourteenday" } diff --git a/src/constants.mjs b/src/constants.mjs index 10f500a..6b3ff29 100644 --- a/src/constants.mjs +++ b/src/constants.mjs @@ -25,7 +25,10 @@ export class Constants { static shiftsPerDay = 4 static minutesPerShift = 6 * 60 // hoursPerShift * minutesPerHour static hoursPerShift = 6 - static daysPerWeek = 7 + + static get daysPerWeek() { + return game.settings.get(MODULE_ID, SETTINGS.DAYS_PER_WEEK) + } static get minutesPerTurn () { return game.settings.get(MODULE_ID, SETTINGS.SMALL_TIME_DELTA) diff --git a/src/helpers.mjs b/src/helpers.mjs index a469220..b2e9fa1 100644 --- a/src/helpers.mjs +++ b/src/helpers.mjs @@ -139,7 +139,7 @@ export class Helpers { /** * Gets a localised weekday name - * @param {number} dayIndex the 0-based day index, range [0..6] + * @param {number} dayIndex the 0-based day index, range [0..14) * @returns {string} the localized name of the corresponding day of the week. * Weeks start on Monday. */ @@ -152,7 +152,6 @@ export class Helpers { * Returns the current world setting for the word used for the name of a week */ static get weekName () { - const weekSettings = game.settings.get(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS) - return weekSettings.weekname + return game.settings.get(MODULE_ID, SETTINGS.WEEK_NAME) } } diff --git a/src/settings.mjs b/src/settings.mjs index 3935d5b..b5ead12 100644 --- a/src/settings.mjs +++ b/src/settings.mjs @@ -14,6 +14,8 @@ export const SETTINGS = { SHIFT_SETTINGS: 'shiftSettings', SHIFT_MENU: 'shiftMenu', WEEKDAY_SETTINGS: 'weekdaySettings', + DAYS_PER_WEEK: 'daysPerWeek', + WEEK_NAME: 'weekName', WEEKDAY_MENU: 'weekdayMenu', SHOW_LONG_FORMAT_TIME: 'showDayInExactTime', DISPLAY_24_HOUR_TIME: 'display24HourTime', diff --git a/src/weekdaysettings.mjs b/src/weekdaysettings.mjs index 1b09761..abe944b 100644 --- a/src/weekdaysettings.mjs +++ b/src/weekdaysettings.mjs @@ -1,7 +1,26 @@ import { Helpers } from './helpers.mjs' import { MODULE_ID, SETTINGS } from './settings.mjs' -const weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'WeekName'] +const weekdays = [ + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + 'EightDay', + 'NineDay', + 'TenDay', + 'ElevenDay', + 'TwelveDay', + 'ThirteenDay', + 'FourteenDay', +] + +const MIN_DAYS_PER_WEEK = 5 +const MAX_DAYS_PER_WEEK = 14 +const DEFAULT_DAYS_PER_WEEK = 7 export function registerWeekdaySettings () { // The settings menu @@ -19,13 +38,28 @@ export function registerWeekdaySettings () { defaults[v.toLowerCase()] = game.i18n.localize(`JDTIMEKEEPING.${v}`) }) - // the settings object + defaults.daysPerWeek = DEFAULT_DAYS_PER_WEEK + + // the settings objects game.settings.register(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS, { scope: 'world', config: false, type: Object, default: defaults, - requiresReload: true, + }) + + game.settings.register(MODULE_ID, SETTINGS.DAYS_PER_WEEK, { + scope: 'world', + config: false, + type: Number, + default: DEFAULT_DAYS_PER_WEEK, + }) + + game.settings.register(MODULE_ID, SETTINGS.WEEK_NAME, { + scope: 'world', + config: false, + type: String, + default: game.i18n.localize('JDTIMEKEEPING.WeekName'), }) } @@ -34,6 +68,7 @@ class WeekdaySettings extends FormApplication { return foundry.utils.mergeObject(super.defaultOptions, { popOut: true, width: 400, + resizable: true, template: `modules/${MODULE_ID}/templates/weekdaysettings.hbs`, id: SETTINGS.WEEKDAY_MENU, title: 'JDTIMEKEEPING.Settings.WeekdayConfig.name', @@ -41,39 +76,91 @@ class WeekdaySettings extends FormApplication { } getData () { - const initialValues = game.settings.get(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS) + const initialDayNames = game.settings.get(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS) + const daysPerWeek = game.settings.get(MODULE_ID, SETTINGS.DAYS_PER_WEEK) + const weekName = game.settings.get(MODULE_ID, SETTINGS.WEEK_NAME) + const data = {} + + // build the list of week days + data.weekdays = {} weekdays.forEach((v, i) => { - data[i] = { + const value = game.i18n.localize(`JDTIMEKEEPING.${v}`) + data.weekdays[i] = { id: `${v.toLowerCase()}`, - label: game.i18n.localize(`JDTIMEKEEPING.${v}`), - value: initialValues[v.toLowerCase()], + label: value, + // initial value if we have one, or the default localised string if we don't have a setting value + value: initialDayNames[v.toLowerCase()] ?? value, + class: i >= daysPerWeek ? 'hidden' : '', // hide if not in use } }) - // data.weekday = { - // id: 'weekName', - // label: game.i18n.localize('JDTIMEKEEPING.WeekName'), - // value: initialValues['weekName'], - // } + // The number of days per week + data.daysPerWeek = { + id: 'daysPerWeek', + label: game.i18n.localize('JDTIMEKEEPING.Settings.DaysInWeek'), + value: daysPerWeek, + min: MIN_DAYS_PER_WEEK, + max: MAX_DAYS_PER_WEEK, + } + + // the name of the week itself + data.weekName = { + id: 'weekName', + label: game.i18n.localize('JDTIMEKEEPING.Settings.WeekName.label'), + value: weekName, + } return data } - _updateObject (event, formData) { + async _updateObject (event, formData) { const data = foundry.utils.expandObject(formData) - const current = game.settings.get(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS) + var reload = false + const daysPerWeek = await game.settings.get(MODULE_ID, SETTINGS.DAYS_PER_WEEK) + if (daysPerWeek != data.daysPerWeek) { + game.settings.set(MODULE_ID, SETTINGS.DAYS_PER_WEEK, data.daysPerWeek) + reload = true + } + delete data.daysPerWeek + + const weekName = await game.settings.get(MODULE_ID, SETTINGS.WEEK_NAME) + if (weekName != data.weekName) { + game.settings.set(MODULE_ID, SETTINGS.WEEK_NAME, data.weekName) + reload = true + } + delete data.weekName + + const current = game.settings.get(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS) if (!Helpers.objectsShallowEqual(data, current)) { game.settings.set(MODULE_ID, SETTINGS.WEEKDAY_SETTINGS, data) - // The days of the week don't need a reload at the moment. - // SettingsConfig.reloadConfirm({ world: true }) + reload = true } + + if (reload) SettingsConfig.reloadConfirm({ world: true }) } activateListeners (html) { super.activateListeners(html) - html.on('click', '[data-action=reset]', this._handleResetButtonClicked) + html.on('click', '[data-action=reset]', this._handleResetButtonClicked.bind(this)) + html.on('change', '[name=daysPerWeek]', this._handleDaysPerWeekChanged.bind(this)) + } + + _handleDaysPerWeekChanged (event) { + const daysPerWeek = Number.parseInt(event.currentTarget.value) + this.#updateDayElements(event.delegateTarget, daysPerWeek) + } + + #updateDayElements (delegateTarget, daysPerWeek) { + weekdays.forEach((name, i) => { + let element = $(delegateTarget).find(`[name=${name.toLowerCase()}]`).parent() + if (element && element.length) { + element = element[0] + if (i >= daysPerWeek) element.style.display = 'none' + else element.style.display = 'flex' + } + }) } async _handleResetButtonClicked (event) { @@ -84,6 +171,13 @@ class WeekdaySettings extends FormApplication { element[0].value = game.i18n.localize(`JDTIMEKEEPING.${id}`) } }) + + $(event.delegateTarget).find('[name=daysPerWeek]')[0].value = DEFAULT_DAYS_PER_WEEK + $(event.delegateTarget).find('[name=weekName]')[0].value = + game.i18n.localize('JDTIMEKEEPING.WeekName') + + this.#updateDayElements(event.delegateTarget, DEFAULT_DAYS_PER_WEEK) + ui.notifications.notify(game.i18n.localize('SETTINGS.ResetInfo')) } } diff --git a/templates/weekdaysettings.hbs b/templates/weekdaysettings.hbs index fbd8a88..0d0604b 100644 --- a/templates/weekdaysettings.hbs +++ b/templates/weekdaysettings.hbs @@ -1,14 +1,23 @@ {{#*inline "dayPartial"}} -
+
{{/inline}}
+ +
+ + +
+ + {{> dayPartial weekName}} +
- {{localize "JDTIMEKEEPING.Settings.WeekdayConfig.label"}}: - {{#each this}} + {{localize "JDTIMEKEEPING.Settings.RenameWeekdays"}}: + {{#each this.weekdays}} {{> dayPartial}} {{/each}}