From 9a1d26e129a192c064a6209a3a0427263eeedcff Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Tue, 18 Feb 2025 09:20:57 +0100 Subject: [PATCH 1/9] feat: add protectedSessionTimeoutScale option to be used in the protected_session_timeout widget, when it is ported to use TimeSelector --- src/routes/api/options.ts | 1 + src/services/options_init.ts | 1 + src/services/options_interface.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/src/routes/api/options.ts b/src/routes/api/options.ts index 33cd5fa8c..5cb103a31 100644 --- a/src/routes/api/options.ts +++ b/src/routes/api/options.ts @@ -14,6 +14,7 @@ const ALLOWED_OPTIONS = new Set([ "eraseEntitiesAfterTimeInSeconds", "eraseEntitiesAfterTimeScale", "protectedSessionTimeout", + "protectedSessionTimeoutTimeScale", "revisionSnapshotTimeInterval", "revisionSnapshotNumberLimit", "zoomFactor", diff --git a/src/services/options_init.ts b/src/services/options_init.ts index 3bb87703e..394808c99 100644 --- a/src/services/options_init.ts +++ b/src/services/options_init.ts @@ -77,6 +77,7 @@ const defaultOptions: DefaultOption[] = [ { name: "revisionSnapshotTimeInterval", value: "600", isSynced: true }, { name: "revisionSnapshotNumberLimit", value: "-1", isSynced: true }, { name: "protectedSessionTimeout", value: "600", isSynced: true }, + { name: "protectedSessionTimeoutTimeScale", value: "60", isSynced: true }, { name: "zoomFactor", value: isWindows ? "0.9" : "1.0", isSynced: false }, { name: "overrideThemeFonts", value: "false", isSynced: false }, { name: "mainFontFamily", value: "theme", isSynced: false }, diff --git a/src/services/options_interface.ts b/src/services/options_interface.ts index fb234240c..c2da7e1b5 100644 --- a/src/services/options_interface.ts +++ b/src/services/options_interface.ts @@ -51,6 +51,7 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions Date: Tue, 18 Feb 2025 09:24:22 +0100 Subject: [PATCH 2/9] feat: use TimeSelector for protected_session_timeout to be used in the Password options --- .../password/protected_session_timeout.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts diff --git a/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts b/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts new file mode 100644 index 000000000..ec40dcfac --- /dev/null +++ b/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts @@ -0,0 +1,30 @@ +import { t } from "../../../../services/i18n.js"; +import TimeSelector from "../time_selector.js"; + +const TPL = ` +
+

${t("password.protected_session_timeout")}

+ +

${t("password.protected_session_timeout_description")} ${t("password.wiki")} ${t("password.for_more_info")}

+
+
`; + +// TriliumNextTODO: set minimum value to 60 seconds +export default class ProtectedSessionTimeoutOption extends TimeSelector { + constructor() { + super({ + widgetId: "protected-session-timeout", + widgetLabelId: "password.protected_session_timeout_label", + optionValueId: "protectedSessionTimeout", + optionTimeScaleId: "protectedSessionTimeoutTimeScale" + }); + super.doRender(); + } + + doRender() { + const $timeSelector = this.$widget; + // inject TimeSelector widget template + this.$widget = $(TPL); + this.$widget.find("#time-selector-placeholder").replaceWith($timeSelector) + } +} From 7f173b287aa85ebb463a98e3aa5342fb0d096325 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Wed, 19 Feb 2025 22:21:49 +0100 Subject: [PATCH 3/9] feat(protected_session_timeout): add minimumSeconds --- .../options/password/protected_session_timeout.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts b/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts index ec40dcfac..9608b14e7 100644 --- a/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts +++ b/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts @@ -9,14 +9,14 @@ const TPL = `
`; -// TriliumNextTODO: set minimum value to 60 seconds export default class ProtectedSessionTimeoutOption extends TimeSelector { constructor() { super({ widgetId: "protected-session-timeout", widgetLabelId: "password.protected_session_timeout_label", optionValueId: "protectedSessionTimeout", - optionTimeScaleId: "protectedSessionTimeoutTimeScale" + optionTimeScaleId: "protectedSessionTimeoutTimeScale", + minimumSeconds: 60 }); super.doRender(); } From 739eaf9fc073a5b398d9ad2c72f83597bd51fa20 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Wed, 19 Feb 2025 22:27:35 +0100 Subject: [PATCH 4/9] refactor(password): remove protected_session_timeout TPL element -> now part of protected_session_timeout widget --- .../app/widgets/type_widgets/options/password.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/public/app/widgets/type_widgets/options/password.ts b/src/public/app/widgets/type_widgets/options/password.ts index 9a838f9aa..d3800f85e 100644 --- a/src/public/app/widgets/type_widgets/options/password.ts +++ b/src/public/app/widgets/type_widgets/options/password.ts @@ -32,17 +32,7 @@ const TPL = ` - -
-

${t("password.protected_session_timeout")}

- -

${t("password.protected_session_timeout_description")} ${t("password.wiki")} ${t("password.for_more_info")}

- -
- - -
-
`; +`; // TODO: Deduplicate interface ChangePasswordResponse { From 1a80a379dc9625a4e25168c7cdd8270df8976350 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Wed, 19 Feb 2025 22:32:48 +0100 Subject: [PATCH 5/9] refactor(password): move password.ts to password subfolder --- .../app/widgets/type_widgets/content_widget.ts | 2 +- .../type_widgets/options/{ => password}/password.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) rename src/public/app/widgets/type_widgets/options/{ => password}/password.ts (92%) diff --git a/src/public/app/widgets/type_widgets/content_widget.ts b/src/public/app/widgets/type_widgets/content_widget.ts index 1f19e2b81..96252d251 100644 --- a/src/public/app/widgets/type_widgets/content_widget.ts +++ b/src/public/app/widgets/type_widgets/content_widget.ts @@ -14,7 +14,7 @@ import CodeAutoReadOnlySizeOptions from "./options/code_notes/code_auto_read_onl import CodeMimeTypesOptions from "./options/code_notes/code_mime_types.js"; import ImageOptions from "./options/images/images.js"; import SpellcheckOptions from "./options/spellcheck.js"; -import PasswordOptions from "./options/password.js"; +import PasswordOptions from "./options/password/password.js"; import EtapiOptions from "./options/etapi.js"; import BackupOptions from "./options/backup.js"; import SyncOptions from "./options/sync.js"; diff --git a/src/public/app/widgets/type_widgets/options/password.ts b/src/public/app/widgets/type_widgets/options/password/password.ts similarity index 92% rename from src/public/app/widgets/type_widgets/options/password.ts rename to src/public/app/widgets/type_widgets/options/password/password.ts index d3800f85e..3813d2aee 100644 --- a/src/public/app/widgets/type_widgets/options/password.ts +++ b/src/public/app/widgets/type_widgets/options/password/password.ts @@ -1,9 +1,9 @@ -import { t } from "../../../services/i18n.js"; -import server from "../../../services/server.js"; -import protectedSessionHolder from "../../../services/protected_session_holder.js"; -import toastService from "../../../services/toast.js"; -import OptionsWidget from "./options_widget.js"; -import type { OptionMap } from "../../../../../services/options_interface.js"; +import { t } from "../../../../services/i18n.js"; +import server from "../../../../services/server.js"; +import protectedSessionHolder from "../../../../services/protected_session_holder.js"; +import toastService from "../../../../services/toast.js"; +import OptionsWidget from "../options_widget.js"; +import type { OptionMap } from "../../../../../../services/options_interface.js"; const TPL = `
From cecde349b7cf3c9e7a92b46ea458280bdf833b1c Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Wed, 19 Feb 2025 22:35:02 +0100 Subject: [PATCH 6/9] feat: add ProtectedSessionTimeoutOption to content_widget --- src/public/app/widgets/type_widgets/content_widget.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/public/app/widgets/type_widgets/content_widget.ts b/src/public/app/widgets/type_widgets/content_widget.ts index 96252d251..d99865648 100644 --- a/src/public/app/widgets/type_widgets/content_widget.ts +++ b/src/public/app/widgets/type_widgets/content_widget.ts @@ -15,6 +15,7 @@ import CodeMimeTypesOptions from "./options/code_notes/code_mime_types.js"; import ImageOptions from "./options/images/images.js"; import SpellcheckOptions from "./options/spellcheck.js"; import PasswordOptions from "./options/password/password.js"; +import ProtectedSessionTimeoutOption from "./options/password/protected_session_timeout.js" import EtapiOptions from "./options/etapi.js"; import BackupOptions from "./options/backup.js"; import SyncOptions from "./options/sync.js"; From 19816493d6c2b69bd73bd94326b8f73a1c3a7545 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Wed, 19 Feb 2025 22:37:08 +0100 Subject: [PATCH 7/9] chore: rename ProtectedSessionTimeoutOption to plural matches the remaining Options widgets --- src/public/app/widgets/type_widgets/content_widget.ts | 4 ++-- .../options/password/protected_session_timeout.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/public/app/widgets/type_widgets/content_widget.ts b/src/public/app/widgets/type_widgets/content_widget.ts index d99865648..15a4d23fa 100644 --- a/src/public/app/widgets/type_widgets/content_widget.ts +++ b/src/public/app/widgets/type_widgets/content_widget.ts @@ -15,7 +15,7 @@ import CodeMimeTypesOptions from "./options/code_notes/code_mime_types.js"; import ImageOptions from "./options/images/images.js"; import SpellcheckOptions from "./options/spellcheck.js"; import PasswordOptions from "./options/password/password.js"; -import ProtectedSessionTimeoutOption from "./options/password/protected_session_timeout.js" +import ProtectedSessionTimeoutOptions from "./options/password/protected_session_timeout.js" import EtapiOptions from "./options/etapi.js"; import BackupOptions from "./options/backup.js"; import SyncOptions from "./options/sync.js"; @@ -65,7 +65,7 @@ const CONTENT_WIDGETS: Record = { _optionsCodeNotes: [VimKeyBindingsOptions, WrapLinesOptions, CodeAutoReadOnlySizeOptions, CodeMimeTypesOptions], _optionsImages: [ImageOptions], _optionsSpellcheck: [SpellcheckOptions], - _optionsPassword: [PasswordOptions], + _optionsPassword: [PasswordOptions, ProtectedSessionTimeoutOptions], _optionsEtapi: [EtapiOptions], _optionsBackup: [BackupOptions], _optionsSync: [SyncOptions], diff --git a/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts b/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts index 9608b14e7..20d84a1ad 100644 --- a/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts +++ b/src/public/app/widgets/type_widgets/options/password/protected_session_timeout.ts @@ -9,7 +9,7 @@ const TPL = `
`; -export default class ProtectedSessionTimeoutOption extends TimeSelector { +export default class ProtectedSessionTimeoutOptions extends TimeSelector { constructor() { super({ widgetId: "protected-session-timeout", From bf6c5dfb202d5d58eb3968020103d42052e90ded Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Wed, 19 Feb 2025 22:45:07 +0100 Subject: [PATCH 8/9] i18n: adjust protected_session_timeout_label we are not limited to seconds now anymore (at least in the UI :-)) --- src/public/translations/cn/translation.json | 2 +- src/public/translations/de/translation.json | 2 +- src/public/translations/en/translation.json | 2 +- src/public/translations/es/translation.json | 2 +- src/public/translations/fr/translation.json | 2 +- src/public/translations/ro/translation.json | 2 +- src/public/translations/tw/translation.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/public/translations/cn/translation.json b/src/public/translations/cn/translation.json index 7deb0d59c..5c4085fdc 100644 --- a/src/public/translations/cn/translation.json +++ b/src/public/translations/cn/translation.json @@ -1259,7 +1259,7 @@ "protected_session_timeout_description": "保护会话超时是一个时间段,超时后保护会话会从浏览器内存中清除。这是从最后一次与保护笔记的交互开始计时的。更多信息请见", "wiki": "维基", "for_more_info": "更多信息。", - "protected_session_timeout_label": "保护会话超时(秒)", + "protected_session_timeout_label": "Protected session timeout:", "reset_confirmation": "重置密码将永久丧失对所有现受保护笔记的访问。您真的要重置密码吗?", "reset_success_message": "密码已重置。请设置新密码", "change_password_heading": "更改密码", diff --git a/src/public/translations/de/translation.json b/src/public/translations/de/translation.json index c450085e3..bc37422a1 100644 --- a/src/public/translations/de/translation.json +++ b/src/public/translations/de/translation.json @@ -1225,7 +1225,7 @@ "protected_session_timeout_description": "Das Zeitlimit für geschützte Sitzungen ist ein Zeitraum, nach dem die geschützte Sitzung aus dem Speicher des Browsers gelöscht wird. Dies wird ab der letzten Interaktion mit geschützten Notizen gemessen. Sehen", "wiki": "Wiki", "for_more_info": "für weitere Informationen.", - "protected_session_timeout_label": "Zeitüberschreitung der geschützten Sitzung (in Sekunden)", + "protected_session_timeout_label": "Zeitüberschreitung der geschützten Sitzung:", "reset_confirmation": "Durch das Zurücksetzen des Passworts verlierst du für immer den Zugriff auf alle Ihre bestehenden geschützten Notizen. Möchtest du das Passwort wirklich zurücksetzen?", "reset_success_message": "Das Passwort wurde zurückgesetzt. Bitte lege ein neues Passwort fest", "change_password_heading": "Kennwort ändern", diff --git a/src/public/translations/en/translation.json b/src/public/translations/en/translation.json index 32474d5c1..bf2b94a3e 100644 --- a/src/public/translations/en/translation.json +++ b/src/public/translations/en/translation.json @@ -1285,7 +1285,7 @@ "protected_session_timeout_description": "Protected session timeout is a time period after which the protected session is wiped from the browser's memory. This is measured from the last interaction with protected notes. See", "wiki": "wiki", "for_more_info": "for more info.", - "protected_session_timeout_label": "Protected session timeout (in seconds)", + "protected_session_timeout_label": "Protected session timeout:", "reset_confirmation": "By resetting the password you will forever lose access to all your existing protected notes. Do you really want to reset the password?", "reset_success_message": "Password has been reset. Please set new password", "change_password_heading": "Change Password", diff --git a/src/public/translations/es/translation.json b/src/public/translations/es/translation.json index 3810997c3..65c15ad88 100644 --- a/src/public/translations/es/translation.json +++ b/src/public/translations/es/translation.json @@ -1283,7 +1283,7 @@ "protected_session_timeout_description": "El tiempo de espera de la sesión protegida es el período de tiempo después del cual la sesión protegida se borra de la memoria del navegador. Esto se mide desde la última interacción con notas protegidas. Ver", "wiki": "wiki", "for_more_info": "para más información.", - "protected_session_timeout_label": "Tiempo de espera de sesión protegida (en segundos)", + "protected_session_timeout_label": "Tiempo de espera de sesión protegida:", "reset_confirmation": "Al restablecer la contraseña, perderá para siempre el acceso a todas sus notas protegidas existentes. ¿Realmente quieres restablecer la contraseña?", "reset_success_message": "La contraseña ha sido restablecida. Por favor establezca una nueva contraseña", "change_password_heading": "Cambiar contraseña", diff --git a/src/public/translations/fr/translation.json b/src/public/translations/fr/translation.json index 891760da8..8e136200a 100644 --- a/src/public/translations/fr/translation.json +++ b/src/public/translations/fr/translation.json @@ -1226,7 +1226,7 @@ "protected_session_timeout_description": "Le délai d'expiration de la session protégée est une période de temps après laquelle la session protégée est effacée de la mémoire du navigateur. Il est mesuré à partir de la dernière interaction avec des notes protégées. Voir", "wiki": "wiki", "for_more_info": "pour plus d'informations.", - "protected_session_timeout_label": "Délai d'expiration de la session protégée (en secondes)", + "protected_session_timeout_label": "Délai d'expiration de la session protégée :", "reset_confirmation": "En réinitialisant le mot de passe, vous perdrez à jamais l'accès à toutes vos notes protégées existantes. Voulez-vous vraiment réinitialiser le mot de passe ?", "reset_success_message": "Le mot de passe a été réinitialisé. Veuillez définir un nouveau mot de passe", "change_password_heading": "Changer le mot de passe", diff --git a/src/public/translations/ro/translation.json b/src/public/translations/ro/translation.json index 2d22c2c3c..442507833 100644 --- a/src/public/translations/ro/translation.json +++ b/src/public/translations/ro/translation.json @@ -923,7 +923,7 @@ "password_mismatch": "Noile parole nu coincid.", "protected_session_timeout": "Timpul de expirare a sesiunii protejate", "protected_session_timeout_description": "Timpul de expirare a sesiunii protejate este o perioadă de timp după care sesiunea protejată este ștearsă din memoria navigatorului. Aceasta este măsurată de la timpul ultimei interacțiuni cu notițele protejate. Vezi", - "protected_session_timeout_label": "Timpul de expirare a sesiunii protejate (în secunde)", + "protected_session_timeout_label": "Timpul de expirare a sesiunii protejate:", "reset_confirmation": "Prin resetarea parolei se va pierde pentru totdeauna accesul la notițele protejate existente. Sigur doriți resetarea parolei?", "reset_link": "click aici pentru a o reseta.", "reset_success_message": "Parola a fost resetată. Setați o nouă parolă", diff --git a/src/public/translations/tw/translation.json b/src/public/translations/tw/translation.json index 654033580..cbf60c297 100644 --- a/src/public/translations/tw/translation.json +++ b/src/public/translations/tw/translation.json @@ -1237,7 +1237,7 @@ "protected_session_timeout_description": "保護會話超時是一個時間段,超時後保護會話會從瀏覽器內存中清除。這是從最後一次與保護筆記的交互開始計時的。更多資訊請見", "wiki": "維基", "for_more_info": "更多資訊。", - "protected_session_timeout_label": "保護會話超時(秒)", + "protected_session_timeout_label": "Protected session timeout:", "reset_confirmation": "重置密碼將永久喪失對所有現受保護筆記的訪問。您真的要重置密碼嗎?", "reset_success_message": "密碼已重置。請設定新密碼", "change_password_heading": "更改密碼", From 15209136867627dfbb2a022e5657f34371ec380c Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Fri, 21 Feb 2025 07:57:07 +0100 Subject: [PATCH 9/9] i18n: use empty string instead of English string it will fallback to the English string by default --- src/public/translations/cn/translation.json | 2 +- src/public/translations/tw/translation.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/public/translations/cn/translation.json b/src/public/translations/cn/translation.json index 3621c8bf0..5fcd7f392 100644 --- a/src/public/translations/cn/translation.json +++ b/src/public/translations/cn/translation.json @@ -1259,7 +1259,7 @@ "protected_session_timeout_description": "保护会话超时是一个时间段,超时后保护会话会从浏览器内存中清除。这是从最后一次与保护笔记的交互开始计时的。更多信息请见", "wiki": "维基", "for_more_info": "更多信息。", - "protected_session_timeout_label": "Protected session timeout:", + "protected_session_timeout_label": "", "reset_confirmation": "重置密码将永久丧失对所有现受保护笔记的访问。您真的要重置密码吗?", "reset_success_message": "密码已重置。请设置新密码", "change_password_heading": "更改密码", diff --git a/src/public/translations/tw/translation.json b/src/public/translations/tw/translation.json index cbf60c297..4e86b58f9 100644 --- a/src/public/translations/tw/translation.json +++ b/src/public/translations/tw/translation.json @@ -1237,7 +1237,7 @@ "protected_session_timeout_description": "保護會話超時是一個時間段,超時後保護會話會從瀏覽器內存中清除。這是從最後一次與保護筆記的交互開始計時的。更多資訊請見", "wiki": "維基", "for_more_info": "更多資訊。", - "protected_session_timeout_label": "Protected session timeout:", + "protected_session_timeout_label": "", "reset_confirmation": "重置密碼將永久喪失對所有現受保護筆記的訪問。您真的要重置密碼嗎?", "reset_success_message": "密碼已重置。請設定新密碼", "change_password_heading": "更改密碼",