mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-08-11 19:22:31 +08:00
chore(client/ts): port options_widget
This commit is contained in:
parent
b6e97c1ae9
commit
428ffa7826
@ -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<T extends OptionNames>(name: T, value: string) {
|
||||
const opts = { [name]: value };
|
||||
|
||||
await this.updateMultipleOptions(opts);
|
||||
}
|
||||
|
||||
async updateMultipleOptions(opts) {
|
||||
async updateMultipleOptions(opts: Partial<OptionMap>) {
|
||||
await server.put('options', opts);
|
||||
|
||||
this.showUpdateNotification();
|
||||
@ -32,17 +37,17 @@ export default class OptionsWidget extends NoteContextAwareWidget {
|
||||
});
|
||||
}
|
||||
|
||||
async updateCheckboxOption(name, $checkbox) {
|
||||
async updateCheckboxOption<T extends FilterOptionsByType<boolean>>(name: T, $checkbox: JQuery<HTMLElement>) {
|
||||
const isChecked = $checkbox.prop("checked");
|
||||
|
||||
return await this.updateOption(name, isChecked ? 'true' : 'false');
|
||||
}
|
||||
|
||||
setCheckboxState($checkbox, optionValue) {
|
||||
setCheckboxState($checkbox: JQuery<HTMLElement>, 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<OptionMap>('options');
|
||||
|
||||
if (options) {
|
||||
this.optionsLoaded(options);
|
||||
}
|
||||
}
|
||||
|
||||
async entitiesReloadedEvent({loadResults}) {
|
||||
async entitiesReloadedEvent({loadResults}: EventData<"entitiesReloaded">) {
|
||||
if (loadResults.getOptionNames().length > 0) {
|
||||
this.refresh();
|
||||
}
|
@ -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<T extends KeyboardActionNames> = {
|
||||
[key in T as `keyboardShortcuts${Capitalize<key>}`]: string
|
||||
};
|
||||
|
||||
interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActionNames> {
|
||||
"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<U> = {
|
||||
[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<OptionNames, string>;
|
||||
|
||||
function getOptionOrNull(name: OptionNames): string | null {
|
||||
let option;
|
||||
|
||||
|
99
src/services/options_interface.ts
Normal file
99
src/services/options_interface.ts
Normal file
@ -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<OptionNames, string>;
|
||||
|
||||
/**
|
||||
* For each keyboard action, there is a corresponding option which identifies the key combination defined by the user.
|
||||
*/
|
||||
type KeyboardShortcutsOptions<T extends KeyboardActionNames> = {
|
||||
[key in T as `keyboardShortcuts${Capitalize<key>}`]: string
|
||||
};
|
||||
|
||||
export interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActionNames> {
|
||||
"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<U> = {
|
||||
[K in keyof OptionDefinitions]: OptionDefinitions[K] extends U ? K : never;
|
||||
}[keyof OptionDefinitions];
|
Loading…
x
Reference in New Issue
Block a user