From fd2c65dcc00b06406c7a6a62b9b2bbe1df73e514 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 22:14:56 +0100 Subject: [PATCH 1/6] feat(time_selector): add minimumSeconds class property --- src/public/app/widgets/type_widgets/options/time_selector.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/public/app/widgets/type_widgets/options/time_selector.ts b/src/public/app/widgets/type_widgets/options/time_selector.ts index 7e12f5fbd..d34aefec4 100644 --- a/src/public/app/widgets/type_widgets/options/time_selector.ts +++ b/src/public/app/widgets/type_widgets/options/time_selector.ts @@ -9,6 +9,7 @@ type TimeSelectorConstructor = { optionValueId: keyof OptionDefinitions; optionTimeScaleId: keyof OptionDefinitions; includedTimeScales?: Set; + minimumSeconds?: number; }; type TimeSelectorScale = "seconds" | "minutes" | "hours" | "days"; @@ -43,6 +44,7 @@ export default class TimeSelector extends OptionsWidget { private optionValueId: keyof OptionDefinitions; private optionTimeScaleId: keyof OptionDefinitions; private includedTimeScales: Set; + private minimumSeconds: number; constructor(options: TimeSelectorConstructor) { super(); @@ -51,6 +53,7 @@ export default class TimeSelector extends OptionsWidget { this.optionValueId = options.optionValueId; this.optionTimeScaleId = options.optionTimeScaleId; this.includedTimeScales = !options.includedTimeScales ? new Set(["seconds", "minutes", "hours", "days"]) : options.includedTimeScales; + this.minimumSeconds = options.minimumSeconds || 0 } doRender() { From 2d968b8e9c3a9a9765aa968654eec344bf01f92e Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 22:15:36 +0100 Subject: [PATCH 2/6] refactor(time_selector): mark methods as private --- src/public/app/widgets/type_widgets/options/time_selector.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/public/app/widgets/type_widgets/options/time_selector.ts b/src/public/app/widgets/type_widgets/options/time_selector.ts index d34aefec4..4c5e89f57 100644 --- a/src/public/app/widgets/type_widgets/options/time_selector.ts +++ b/src/public/app/widgets/type_widgets/options/time_selector.ts @@ -98,7 +98,7 @@ export default class TimeSelector extends OptionsWidget { this.$timeScaleSelect.val(options[this.optionTimeScaleId]); } - convertTime(time: string | number, timeScale: string | number) { + private convertTime(time: string | number, timeScale: string | number) { const value = typeof time === "number" ? time : parseInt(time); if (Number.isNaN(value)) { throw new Error(`Time needs to be a valid integer, but received: ${time}`); @@ -115,7 +115,7 @@ export default class TimeSelector extends OptionsWidget { }; } - handleTimeValidation() { + private handleTimeValidation() { if (this.$timeValueInput.is(":invalid")) { toastService.showError(t("time_selector.invalid_input")); return false; From 0332ade13c7e978f521c2c98eafb534b78f9ac4b Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 22:16:13 +0100 Subject: [PATCH 3/6] refactor(time_selector): simplify setting of includedTimeScales --- src/public/app/widgets/type_widgets/options/time_selector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/public/app/widgets/type_widgets/options/time_selector.ts b/src/public/app/widgets/type_widgets/options/time_selector.ts index 4c5e89f57..63275bc93 100644 --- a/src/public/app/widgets/type_widgets/options/time_selector.ts +++ b/src/public/app/widgets/type_widgets/options/time_selector.ts @@ -52,7 +52,7 @@ export default class TimeSelector extends OptionsWidget { this.widgetLabelId = options.widgetLabelId; this.optionValueId = options.optionValueId; this.optionTimeScaleId = options.optionTimeScaleId; - this.includedTimeScales = !options.includedTimeScales ? new Set(["seconds", "minutes", "hours", "days"]) : options.includedTimeScales; + this.includedTimeScales = options.includedTimeScales || new Set(["seconds", "minutes", "hours", "days"]); this.minimumSeconds = options.minimumSeconds || 0 } From bb4c3ae6ff456137544a4a817a8225ddb3156e7d Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 22:18:11 +0100 Subject: [PATCH 4/6] feat(time_selector): add minimumSeconds handling --- .../widgets/type_widgets/options/time_selector.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/public/app/widgets/type_widgets/options/time_selector.ts b/src/public/app/widgets/type_widgets/options/time_selector.ts index 63275bc93..705cc7f75 100644 --- a/src/public/app/widgets/type_widgets/options/time_selector.ts +++ b/src/public/app/widgets/type_widgets/options/time_selector.ts @@ -74,7 +74,8 @@ export default class TimeSelector extends OptionsWidget { if (!this.handleTimeValidation() || typeof timeScale !== "string" || !time) return; - this.internalTimeInSeconds = this.convertTime(time, timeScale).toOption(); + this.setInternalTimeInSeconds(this.convertTime(time, timeScale).toOption()); + this.updateOption(this.optionValueId, this.internalTimeInSeconds); }); @@ -122,4 +123,13 @@ export default class TimeSelector extends OptionsWidget { } return true; } + + private setInternalTimeInSeconds(time: number) { + if (time < this.minimumSeconds) { + toastService.showError(`Entered time needs to be at least ${this.minimumSeconds} seconds.`); + return this.internalTimeInSeconds = this.minimumSeconds; + } + return this.internalTimeInSeconds = time; + } + } From ce1f418aa72a443a1a546e437c5e4832a0d6d3c8 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 22:18:58 +0100 Subject: [PATCH 5/6] feat(time_selector): make use of optionsService --- .../app/widgets/type_widgets/options/time_selector.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/public/app/widgets/type_widgets/options/time_selector.ts b/src/public/app/widgets/type_widgets/options/time_selector.ts index 705cc7f75..94f607b99 100644 --- a/src/public/app/widgets/type_widgets/options/time_selector.ts +++ b/src/public/app/widgets/type_widgets/options/time_selector.ts @@ -2,6 +2,7 @@ import OptionsWidget from "./options_widget.js"; import toastService from "../../../services/toast.js"; import { t } from "../../../services/i18n.js"; import type { OptionDefinitions, OptionMap } from "../../../../../services/options_interface.js"; +import optionsService from "../../../services/options.js"; type TimeSelectorConstructor = { widgetId: string; @@ -93,10 +94,14 @@ export default class TimeSelector extends OptionsWidget { } async optionsLoaded(options: OptionMap) { - this.internalTimeInSeconds = options[this.optionValueId]; - const displayedTime = this.convertTime(options[this.optionValueId], options[this.optionTimeScaleId]).toDisplay(); + const optionValue = optionsService.getInt(this.optionValueId) || 0; + const optionTimeScale = optionsService.getInt(this.optionTimeScaleId) || 1; + + this.setInternalTimeInSeconds(optionValue); + + const displayedTime = this.convertTime(optionValue, optionTimeScale).toDisplay(); this.$timeValueInput.val(displayedTime); - this.$timeScaleSelect.val(options[this.optionTimeScaleId]); + this.$timeScaleSelect.val(optionTimeScale); } private convertTime(time: string | number, timeScale: string | number) { From a0c2715980a176a5c5e303f42ca432225bcf7731 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 22:26:32 +0100 Subject: [PATCH 6/6] i18n(time_selector): add i18n for minimum_input --- src/public/app/widgets/type_widgets/options/time_selector.ts | 2 +- src/public/translations/en/translation.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/public/app/widgets/type_widgets/options/time_selector.ts b/src/public/app/widgets/type_widgets/options/time_selector.ts index 94f607b99..a3ec7c9bb 100644 --- a/src/public/app/widgets/type_widgets/options/time_selector.ts +++ b/src/public/app/widgets/type_widgets/options/time_selector.ts @@ -131,7 +131,7 @@ export default class TimeSelector extends OptionsWidget { private setInternalTimeInSeconds(time: number) { if (time < this.minimumSeconds) { - toastService.showError(`Entered time needs to be at least ${this.minimumSeconds} seconds.`); + toastService.showError(t("time_selector.minimum_input", {minimumSeconds: this.minimumSeconds})); return this.internalTimeInSeconds = this.minimumSeconds; } return this.internalTimeInSeconds = time; diff --git a/src/public/translations/en/translation.json b/src/public/translations/en/translation.json index 1a5d92b32..32474d5c1 100644 --- a/src/public/translations/en/translation.json +++ b/src/public/translations/en/translation.json @@ -1656,6 +1656,7 @@ "days": "Days" }, "time_selector": { - "invalid_input": "The entered time value is not a valid number." + "invalid_input": "The entered time value is not a valid number.", + "minimum_input": "The entered time value needs to be at least {{minimumSeconds}} seconds." } }