diff --git a/src/public/app/widgets/type_widgets/options/options_widget.js b/src/public/app/widgets/type_widgets/options/options_widget.ts similarity index 65% rename from src/public/app/widgets/type_widgets/options/options_widget.js rename to src/public/app/widgets/type_widgets/options/options_widget.ts index a1d565aa1..1b80996ad 100644 --- a/src/public/app/widgets/type_widgets/options/options_widget.js +++ b/src/public/app/widgets/type_widgets/options/options_widget.ts @@ -1,22 +1,27 @@ +import { FilterOptionsByType, OptionDefinitions, OptionMap, OptionNames } from "../../../../../services/options_interface.js"; +import { EventData, EventListener } from "../../../components/app_context.js"; +import FNote from "../../../entities/fnote.js"; import { t } from "../../../services/i18n.js"; import server from "../../../services/server.js"; import toastService from "../../../services/toast.js"; import NoteContextAwareWidget from "../../note_context_aware_widget.js"; -export default class OptionsWidget extends NoteContextAwareWidget { +export default class OptionsWidget extends NoteContextAwareWidget + implements EventListener<"entitiesReloaded"> +{ constructor() { super(); this.contentSized(); } - async updateOption(name, value) { + async updateOption(name: T, value: string) { const opts = { [name]: value }; await this.updateMultipleOptions(opts); } - async updateMultipleOptions(opts) { + async updateMultipleOptions(opts: Partial) { await server.put('options', opts); this.showUpdateNotification(); @@ -32,17 +37,17 @@ export default class OptionsWidget extends NoteContextAwareWidget { }); } - async updateCheckboxOption(name, $checkbox) { + async updateCheckboxOption>(name: T, $checkbox: JQuery) { const isChecked = $checkbox.prop("checked"); return await this.updateOption(name, isChecked ? 'true' : 'false'); } - setCheckboxState($checkbox, optionValue) { + setCheckboxState($checkbox: JQuery, optionValue: string) { $checkbox.prop('checked', optionValue === 'true'); } - optionsLoaded(options) {} + optionsLoaded(options: OptionMap) {} async refresh() { this.toggleInt(this.isEnabled()); @@ -58,15 +63,15 @@ export default class OptionsWidget extends NoteContextAwareWidget { } } - async refreshWithNote(note) { - const options = await server.get('options'); + async refreshWithNote(note: FNote) { + const options = await server.get('options'); if (options) { this.optionsLoaded(options); } } - async entitiesReloadedEvent({loadResults}) { + async entitiesReloadedEvent({loadResults}: EventData<"entitiesReloaded">) { if (loadResults.getOptionNames().length > 0) { this.refresh(); } diff --git a/src/services/options.ts b/src/services/options.ts index d64f07c03..bcecc6c9e 100644 --- a/src/services/options.ts +++ b/src/services/options.ts @@ -15,107 +15,9 @@ import becca from "../becca/becca.js"; import BOption from "../becca/entities/boption.js"; import { OptionRow } from '../becca/entities/rows.js'; -import { KeyboardActionNames } from "./keyboard_actions_interface.js"; +import { FilterOptionsByType, OptionDefinitions, OptionMap, OptionNames } from "./options_interface.js"; import sql from "./sql.js"; -/** - * For each keyboard action, there is a corresponding option which identifies the key combination defined by the user. - */ -type KeyboardShortcutsOptions = { - [key in T as `keyboardShortcuts${Capitalize}`]: string -}; - -interface OptionDefinitions extends KeyboardShortcutsOptions { - "openNoteContexts": string; - "lastDailyBackupDate": string; - "lastWeeklyBackupDate": string; - "lastMonthlyBackupDate": string; - "dbVersion": string; - "theme": string; - "syncServerHost": string; - "syncServerTimeout": string; - "syncProxy": string; - "mainFontFamily": string; - "treeFontFamily": string; - "detailFontFamily": string; - "monospaceFontFamily": string; - "spellCheckLanguageCode": string; - "codeNotesMimeTypes": string; - "headingStyle": string; - "highlightsList": string; - "customSearchEngineName": string; - "customSearchEngineUrl": string; - "locale": string; - "codeBlockTheme": string; - "textNoteEditorType": string; - "layoutOrientation": string; - "allowedHtmlTags": string; - "documentId": string; - "documentSecret": string; - "passwordVerificationHash": string; - "passwordVerificationSalt": string; - "passwordDerivedKeySalt": string; - "encryptedDataKey": string; - - "lastSyncedPull": number; - "lastSyncedPush": number; - "revisionSnapshotTimeInterval": number; - "revisionSnapshotNumberLimit": number; - "protectedSessionTimeout": number; - "zoomFactor": number; - "mainFontSize": number; - "treeFontSize": number; - "detailFontSize": number; - "monospaceFontSize": number; - "imageMaxWidthHeight": number; - "imageJpegQuality": number; - "leftPaneWidth": number; - "rightPaneWidth": number; - "eraseEntitiesAfterTimeInSeconds": number; - "autoReadonlySizeText": number; - "autoReadonlySizeCode": number; - "maxContentWidth": number; - "minTocHeadings": number; - "eraseUnusedAttachmentsAfterSeconds": number; - "firstDayOfWeek": number; - - "initialized": boolean; - "overrideThemeFonts": boolean; - "spellCheckEnabled": boolean; - "autoFixConsistencyIssues": boolean; - "vimKeymapEnabled": boolean; - "codeLineWrapEnabled": boolean; - "leftPaneVisible": boolean; - "rightPaneVisible": boolean; - "nativeTitleBarVisible": boolean; - "hideArchivedNotes_main": boolean; - "debugModeEnabled": boolean; - "autoCollapseNoteTree": boolean; - "dailyBackupEnabled": boolean; - "weeklyBackupEnabled": boolean; - "monthlyBackupEnabled": boolean; - "compressImages": boolean; - "downloadImagesAutomatically": boolean; - "checkForUpdates": boolean; - "disableTray": boolean; - "promotedAttributesOpenInRibbon": boolean; - "editedNotesOpenInRibbon": boolean; - "codeBlockWordWrap": boolean; - "textNoteEditorMultilineToolbar": boolean; - "backgroundEffects": boolean; -}; - -export type OptionNames = keyof OptionDefinitions; - -type FilterOptionsByType = { - [K in keyof OptionDefinitions]: OptionDefinitions[K] extends U ? K : never; -}[keyof OptionDefinitions]; - -/** - * A dictionary where the keys are the option keys (e.g. `theme`) and their corresponding values. - */ -export type OptionMap = Record; - function getOptionOrNull(name: OptionNames): string | null { let option; diff --git a/src/services/options_interface.ts b/src/services/options_interface.ts new file mode 100644 index 000000000..6ea40dd8c --- /dev/null +++ b/src/services/options_interface.ts @@ -0,0 +1,99 @@ +import { KeyboardActionNames } from "./keyboard_actions_interface.js"; + +/** + * A dictionary where the keys are the option keys (e.g. `theme`) and their corresponding values. + */ +export type OptionMap = Record; + +/** + * For each keyboard action, there is a corresponding option which identifies the key combination defined by the user. + */ +type KeyboardShortcutsOptions = { + [key in T as `keyboardShortcuts${Capitalize}`]: string +}; + +export interface OptionDefinitions extends KeyboardShortcutsOptions { + "openNoteContexts": string; + "lastDailyBackupDate": string; + "lastWeeklyBackupDate": string; + "lastMonthlyBackupDate": string; + "dbVersion": string; + "theme": string; + "syncServerHost": string; + "syncServerTimeout": string; + "syncProxy": string; + "mainFontFamily": string; + "treeFontFamily": string; + "detailFontFamily": string; + "monospaceFontFamily": string; + "spellCheckLanguageCode": string; + "codeNotesMimeTypes": string; + "headingStyle": string; + "highlightsList": string; + "customSearchEngineName": string; + "customSearchEngineUrl": string; + "locale": string; + "codeBlockTheme": string; + "textNoteEditorType": string; + "layoutOrientation": string; + "allowedHtmlTags": string; + "documentId": string; + "documentSecret": string; + "passwordVerificationHash": string; + "passwordVerificationSalt": string; + "passwordDerivedKeySalt": string; + "encryptedDataKey": string; + + "lastSyncedPull": number; + "lastSyncedPush": number; + "revisionSnapshotTimeInterval": number; + "revisionSnapshotNumberLimit": number; + "protectedSessionTimeout": number; + "zoomFactor": number; + "mainFontSize": number; + "treeFontSize": number; + "detailFontSize": number; + "monospaceFontSize": number; + "imageMaxWidthHeight": number; + "imageJpegQuality": number; + "leftPaneWidth": number; + "rightPaneWidth": number; + "eraseEntitiesAfterTimeInSeconds": number; + "autoReadonlySizeText": number; + "autoReadonlySizeCode": number; + "maxContentWidth": number; + "minTocHeadings": number; + "eraseUnusedAttachmentsAfterSeconds": number; + "firstDayOfWeek": number; + + "initialized": boolean; + "overrideThemeFonts": boolean; + "spellCheckEnabled": boolean; + "autoFixConsistencyIssues": boolean; + "vimKeymapEnabled": boolean; + "codeLineWrapEnabled": boolean; + "leftPaneVisible": boolean; + "rightPaneVisible": boolean; + "nativeTitleBarVisible": boolean; + "hideArchivedNotes_main": boolean; + "debugModeEnabled": boolean; + "autoCollapseNoteTree": boolean; + "dailyBackupEnabled": boolean; + "weeklyBackupEnabled": boolean; + "monthlyBackupEnabled": boolean; + "compressImages": boolean; + "downloadImagesAutomatically": boolean; + "checkForUpdates": boolean; + "disableTray": boolean; + "promotedAttributesOpenInRibbon": boolean; + "editedNotesOpenInRibbon": boolean; + "codeBlockWordWrap": boolean; + "textNoteEditorMultilineToolbar": boolean; + "backgroundEffects": boolean; +}; + +export type OptionNames = keyof OptionDefinitions; + +export type FilterOptionsByType = { + [K in keyof OptionDefinitions]: OptionDefinitions[K] extends U ? K : never; +}[keyof OptionDefinitions];