diff --git a/src/public/app/widgets/type_widgets/content_widget.ts b/src/public/app/widgets/type_widgets/content_widget.ts index 1f19e2b81..15a4d23fa 100644 --- a/src/public/app/widgets/type_widgets/content_widget.ts +++ b/src/public/app/widgets/type_widgets/content_widget.ts @@ -14,7 +14,8 @@ 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 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"; @@ -64,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.ts b/src/public/app/widgets/type_widgets/options/password/password.ts similarity index 82% rename from src/public/app/widgets/type_widgets/options/password.ts rename to src/public/app/widgets/type_widgets/options/password/password.ts index 9a838f9aa..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 = `
@@ -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 { 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..20d84a1ad --- /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")}

+
+
`; + +export default class ProtectedSessionTimeoutOptions extends TimeSelector { + constructor() { + super({ + widgetId: "protected-session-timeout", + widgetLabelId: "password.protected_session_timeout_label", + optionValueId: "protectedSessionTimeout", + optionTimeScaleId: "protectedSessionTimeoutTimeScale", + minimumSeconds: 60 + }); + super.doRender(); + } + + doRender() { + const $timeSelector = this.$widget; + // inject TimeSelector widget template + this.$widget = $(TPL); + this.$widget.find("#time-selector-placeholder").replaceWith($timeSelector) + } +} diff --git a/src/public/translations/cn/translation.json b/src/public/translations/cn/translation.json index 296a46136..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_label": "", "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 718285843..0339cde85 100644 --- a/src/public/translations/de/translation.json +++ b/src/public/translations/de/translation.json @@ -1286,7 +1286,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 1fc87feeb..18826376c 100644 --- a/src/public/translations/en/translation.json +++ b/src/public/translations/en/translation.json @@ -1286,7 +1286,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..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_label": "", "reset_confirmation": "重置密碼將永久喪失對所有現受保護筆記的訪問。您真的要重置密碼嗎?", "reset_success_message": "密碼已重置。請設定新密碼", "change_password_heading": "更改密碼", diff --git a/src/routes/api/options.ts b/src/routes/api/options.ts index 8be441b61..d2cf695fd 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