From 49923bb151c998271d8ab639e1552e4783be6c35 Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sat, 17 Jan 2026 22:13:36 +0700 Subject: [PATCH 01/54] feat(config-page): add new Tasks tab with placeholder for task settings --- src/app/pages/config-page/config-page.component.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/app/pages/config-page/config-page.component.html b/src/app/pages/config-page/config-page.component.html index 9add5f9cd..365828212 100644 --- a/src/app/pages/config-page/config-page.component.html +++ b/src/app/pages/config-page/config-page.component.html @@ -37,6 +37,17 @@ + + + + task + {{ 'PS.TABS.TASKS' | translate }} + +
+ +
+
+ From 19d41c75887a40bce3b564f5f9be7e65db2cfa4b Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sat, 17 Jan 2026 22:56:39 +0700 Subject: [PATCH 02/54] feat(i18n): add "Tasks" tab label to English and Russian translations --- src/assets/i18n/en.json | 1 + src/assets/i18n/ru.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 1b3e64f14..101118121 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -2187,6 +2187,7 @@ "SYNC_EXPORT": "Sync & Export", "TABS": { "GENERAL": "General", + "TASKS": "Tasks", "TIME_TRACKING": "Time & Tracking", "PRODUCTIVITY": "Productivity", "PLUGINS": "Plugins", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 0d085bfa7..394810fa7 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -1984,6 +1984,7 @@ "SYNC_EXPORT": "Синхронизация и экспорт", "TABS": { "GENERAL": "Общие", + "TASKS": "Задачи", "TIME_TRACKING": "Время и отслеживание", "PRODUCTIVITY": "Продуктивность", "PLUGINS": "Плагины", From d94ce06ea7cf7491719fd34a80d851f85da8a1e6 Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 01:21:50 +0700 Subject: [PATCH 03/54] feat(tasks): implement task settings configuration and integrate with global config --- .../config/default-global-config.const.ts | 26 ++++++---- .../form-cfgs/misc-settings-form.const.ts | 51 ------------------ .../form-cfgs/tasks-settings-form.const.ts | 52 +++++++++++++++++++ .../config/global-config-form-config.const.ts | 6 +++ .../features/config/global-config.model.ts | 19 ++++--- .../features/config/global-config.service.ts | 10 ++++ .../config/store/global-config.reducer.ts | 5 ++ .../focus-mode-main.component.ts | 6 +-- .../features/project/store/project.effects.ts | 4 +- .../add-task-bar/add-task-bar.component.ts | 10 ++-- .../tasks/store/short-syntax.effects.ts | 4 +- .../tasks/store/task-internal.effects.ts | 10 ++-- .../tasks/store/task-related-model.effects.ts | 4 +- .../task-context-menu-inner.component.ts | 2 +- .../task-detail-panel.component.ts | 4 +- src/app/features/tasks/task.service.ts | 4 +- src/app/features/tasks/task/task.component.ts | 2 +- .../config-page/config-page.component.html | 10 +++- .../config-page/config-page.component.ts | 3 ++ src/app/t.const.ts | 4 ++ 20 files changed, 141 insertions(+), 95 deletions(-) create mode 100644 src/app/features/config/form-cfgs/tasks-settings-form.const.ts diff --git a/src/app/features/config/default-global-config.const.ts b/src/app/features/config/default-global-config.const.ts index 9ff682f3e..b6e265a24 100644 --- a/src/app/features/config/default-global-config.const.ts +++ b/src/app/features/config/default-global-config.const.ts @@ -7,6 +7,13 @@ import { GlobalConfigState } from './global-config.model'; const minute = 60 * 1000; const defaultVoice = getDefaultVoice(); +const defaultTaskNoteTemplate = `**How can I best achieve it now?** + +**What do I want?** + +**Why do I want it?** +`; + export const DEFAULT_DAY_START = '9:00'; export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { appFeatures: { @@ -27,27 +34,24 @@ export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { dateTimeLocale: undefined, firstDayOfWeek: undefined, }, + tasks: { + isConfirmBeforeTaskDelete: true, + isAutoAddWorkedOnToToday: true, + isAutMarkParentAsDone: false, + isTrayShowCurrentTask: true, + defaultProjectId: null, + taskNotesTpl: defaultTaskNoteTemplate, + }, misc: { isConfirmBeforeExit: false, isConfirmBeforeExitWithoutFinishDay: true, - isConfirmBeforeTaskDelete: true, - isAutMarkParentAsDone: false, isTurnOffMarkdown: false, - isAutoAddWorkedOnToToday: true, isMinimizeToTray: false, - isTrayShowCurrentTask: true, isTrayShowCurrentCountdown: true, - defaultProjectId: null, startOfNextDay: 0, isDisableAnimations: false, isDisableCelebration: false, isShowProductivityTipLonger: false, - taskNotesTpl: `**How can I best achieve it now?** - -**What do I want?** - -**Why do I want it?** -`, isOverlayIndicatorEnabled: false, customTheme: 'default', defaultStartPage: 0, diff --git a/src/app/features/config/form-cfgs/misc-settings-form.const.ts b/src/app/features/config/form-cfgs/misc-settings-form.const.ts index 6e681f11b..8b41a036e 100644 --- a/src/app/features/config/form-cfgs/misc-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/misc-settings-form.const.ts @@ -12,13 +12,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { key: 'misc', help: T.GCF.MISC.HELP, items: [ - // { - // key: 'isDarkMode', - // type: 'checkbox', - // templateOptions: { - // label: T.GCF.MISC.IS_DARK_MODE, - // }, - // }, ...((IS_ELECTRON ? [ { @@ -38,21 +31,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { }, }, ]) as LimitedFormlyFieldConfig[]), - { - key: 'isConfirmBeforeTaskDelete', - type: 'checkbox', - templateOptions: { - label: T.GCF.MISC.IS_CONFIRM_BEFORE_TASK_DELETE, - }, - }, - { - key: 'isAutMarkParentAsDone', - type: 'checkbox', - templateOptions: { - label: T.GCF.MISC.IS_AUTO_MARK_PARENT_AS_DONE, - }, - }, - { key: 'isTurnOffMarkdown', type: 'checkbox', @@ -60,13 +38,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { label: T.GCF.MISC.IS_TURN_OFF_MARKDOWN, }, }, - { - key: 'isAutoAddWorkedOnToToday', - type: 'checkbox', - templateOptions: { - label: T.GCF.MISC.IS_AUTO_ADD_WORKED_ON_TO_TODAY, - }, - }, { key: 'isMinimizeToTray', type: 'checkbox', @@ -74,20 +45,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { label: T.GCF.MISC.IS_MINIMIZE_TO_TRAY, }, }, - { - key: 'isTrayShowCurrentTask', - type: 'checkbox', - templateOptions: { - label: T.GCF.MISC.IS_TRAY_SHOW_CURRENT_TASK, - }, - }, - { - key: 'defaultProjectId', - type: 'project-select', - templateOptions: { - label: T.GCF.MISC.DEFAULT_PROJECT, - }, - }, { key: 'startOfNextDay', type: 'input', @@ -101,14 +58,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { max: 23, }, }, - { - key: 'taskNotesTpl', - type: 'textarea', - templateOptions: { - rows: 5, - label: T.GCF.MISC.TASK_NOTES_TPL, - }, - }, { key: 'isDisableAnimations', type: 'checkbox', diff --git a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts new file mode 100644 index 000000000..cc00edc0b --- /dev/null +++ b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts @@ -0,0 +1,52 @@ +import { ConfigFormSection, TasksConfig } from '../global-config.model'; +import { T } from '../../../t.const'; + +export const TASKS_SETTINGS_FORM_CFG: ConfigFormSection = { + title: T.PS.TABS.TASKS, + key: 'tasks', + items: [ + { + key: 'isConfirmBeforeTaskDelete', + type: 'checkbox', + templateOptions: { + label: T.GCF.MISC.IS_CONFIRM_BEFORE_TASK_DELETE, + }, + }, + { + key: 'isAutMarkParentAsDone', + type: 'checkbox', + templateOptions: { + label: T.GCF.MISC.IS_AUTO_MARK_PARENT_AS_DONE, + }, + }, + { + key: 'isAutoAddWorkedOnToToday', + type: 'checkbox', + templateOptions: { + label: T.GCF.MISC.IS_AUTO_ADD_WORKED_ON_TO_TODAY, + }, + }, + { + key: 'isTrayShowCurrentTask', + type: 'checkbox', + templateOptions: { + label: T.GCF.MISC.IS_TRAY_SHOW_CURRENT_TASK, + }, + }, + { + key: 'defaultProjectId', + type: 'project-select', + templateOptions: { + label: T.GCF.MISC.DEFAULT_PROJECT, + }, + }, + { + key: 'taskNotesTpl', + type: 'textarea', + templateOptions: { + rows: 5, + label: T.GCF.MISC.TASK_NOTES_TPL, + }, + }, + ], +}; diff --git a/src/app/features/config/global-config-form-config.const.ts b/src/app/features/config/global-config-form-config.const.ts index d4f9eb192..a68c22c28 100644 --- a/src/app/features/config/global-config-form-config.const.ts +++ b/src/app/features/config/global-config-form-config.const.ts @@ -16,6 +16,7 @@ import { DOMINA_MODE_FORM } from './form-cfgs/domina-mode-form.const'; import { FOCUS_MODE_FORM_CFG } from './form-cfgs/focus-mode-form.const'; import { REMINDER_FORM_CFG } from './form-cfgs/reminder-form.const'; import { SHORT_SYNTAX_FORM_CFG } from './form-cfgs/short-syntax-form.const'; +import { TASKS_SETTINGS_FORM_CFG } from './form-cfgs/tasks-settings-form.const'; const filterGlobalConfigForm = (cfg: ConfigFormSection): boolean => { return ( @@ -58,3 +59,8 @@ export const GLOBAL_PRODUCTIVITY_FORM_CONFIG: ConfigFormConfig = [ SIMPLE_COUNTER_FORM, ...(!window.ea?.isSnap() && !!window.speechSynthesis ? [DOMINA_MODE_FORM] : []), ].filter(filterGlobalConfigForm); + +export const GLOBAL_TASKS_FORM_CONFIG: ConfigFormConfig = [ + TASKS_SETTINGS_FORM_CFG, + SHORT_SYNTAX_FORM_CFG, +].filter(filterGlobalConfigForm); diff --git a/src/app/features/config/global-config.model.ts b/src/app/features/config/global-config.model.ts index 9ff596247..c1c90d1a4 100644 --- a/src/app/features/config/global-config.model.ts +++ b/src/app/features/config/global-config.model.ts @@ -21,18 +21,11 @@ export type AppFeaturesConfig = Readonly<{ }>; export type MiscConfig = Readonly<{ - isAutMarkParentAsDone: boolean; isConfirmBeforeExit: boolean; isConfirmBeforeExitWithoutFinishDay: boolean; - isConfirmBeforeTaskDelete?: boolean; isTurnOffMarkdown: boolean; - isAutoAddWorkedOnToToday: boolean; isMinimizeToTray: boolean; - isTrayShowCurrentTask: boolean; - // allow also false because of #569 - defaultProjectId?: string | null | false; startOfNextDay: number; - taskNotesTpl: string; isDisableAnimations: boolean; // optional because it was added later isDisableCelebration?: boolean; @@ -45,6 +38,16 @@ export type MiscConfig = Readonly<{ unsplashApiKey?: string | null; }>; +export type TasksConfig = Readonly<{ + isAutMarkParentAsDone: boolean; + isConfirmBeforeTaskDelete?: boolean; + isAutoAddWorkedOnToToday: boolean; + isTrayShowCurrentTask: boolean; + // allow also false because of #569 + defaultProjectId?: string | null | false; + taskNotesTpl: string; +}>; + export type ShortSyntaxConfig = Readonly<{ isEnableProject: boolean; isEnableDue: boolean; @@ -217,6 +220,7 @@ export type GlobalConfigState = Readonly<{ appFeatures: AppFeaturesConfig; localization: LocalizationConfig; misc: MiscConfig; + tasks: TasksConfig; shortSyntax: ShortSyntaxConfig; evaluation: EvaluationConfig; idle: IdleConfig; @@ -239,6 +243,7 @@ export type GlobalConfigSectionKey = keyof GlobalConfigState | 'EMPTY'; export type GlobalSectionConfig = | MiscConfig + | TasksConfig | PomodoroConfig | KeyboardConfig | ScheduleConfig diff --git a/src/app/features/config/global-config.service.ts b/src/app/features/config/global-config.service.ts index b061de427..3d7a0be95 100644 --- a/src/app/features/config/global-config.service.ts +++ b/src/app/features/config/global-config.service.ts @@ -18,6 +18,7 @@ import { SoundConfig, SyncConfig, TakeABreakConfig, + TasksConfig, } from './global-config.model'; import { selectConfigFeatureState, @@ -30,6 +31,7 @@ import { selectSoundConfig, selectSyncConfig, selectTakeABreakConfig, + selectTasksConfig, selectTimelineConfig, } from './store/global-config.reducer'; import { distinctUntilChanged, shareReplay } from 'rxjs/operators'; @@ -48,6 +50,11 @@ export class GlobalConfigService { shareReplay(1), ); + tasks$: Observable = this._store.pipe( + select(selectTasksConfig), + shareReplay(1), + ); + localization$: Observable = this._store.pipe( select(selectLocalizationConfig), shareReplay(1), @@ -103,6 +110,9 @@ export class GlobalConfigService { this.localization$, { initialValue: undefined }, ); + readonly tasks: Signal = toSignal(this.tasks$, { + initialValue: undefined, + }); readonly misc: Signal = toSignal(this.misc$, { initialValue: undefined, }); diff --git a/src/app/features/config/store/global-config.reducer.ts b/src/app/features/config/store/global-config.reducer.ts index e7d1e4e68..a60d5ea61 100644 --- a/src/app/features/config/store/global-config.reducer.ts +++ b/src/app/features/config/store/global-config.reducer.ts @@ -15,6 +15,7 @@ import { SoundConfig, SyncConfig, TakeABreakConfig, + TasksConfig, } from '../global-config.model'; import { DEFAULT_GLOBAL_CONFIG } from '../default-global-config.const'; import { loadAllData } from '../../../root-store/meta/load-all-data.action'; @@ -27,6 +28,10 @@ export const selectLocalizationConfig = createSelector( selectConfigFeatureState, (cfg): LocalizationConfig => cfg.localization, ); +export const selectTasksConfig = createSelector( + selectConfigFeatureState, + (cfg): TasksConfig => cfg.tasks, +); export const selectMiscConfig = createSelector( selectConfigFeatureState, (cfg): MiscConfig => cfg.misc, diff --git a/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts b/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts index e1a7abab8..b6cd2f672 100644 --- a/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts +++ b/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts @@ -228,9 +228,9 @@ export class FocusModeMainComponent { // Use effect to reactively update defaultTaskNotes effect(() => { - const misc = this._globalConfigService.misc(); - if (misc) { - this.defaultTaskNotes.set(misc.taskNotesTpl); + const tasks = this._globalConfigService.tasks(); + if (tasks) { + this.defaultTaskNotes.set(tasks.taskNotesTpl); } }); diff --git a/src/app/features/project/store/project.effects.ts b/src/app/features/project/store/project.effects.ts index 5293c1ba2..548b899ab 100644 --- a/src/app/features/project/store/project.effects.ts +++ b/src/app/features/project/store/project.effects.ts @@ -35,8 +35,8 @@ export class ProjectEffects { tap(({ projectId }) => { // Clear defaultProjectId if the deleted project was the default const cfg = this._globalConfigService.cfg(); - if (cfg && projectId === cfg.misc.defaultProjectId) { - this._globalConfigService.updateSection('misc', { defaultProjectId: null }); + if (cfg && projectId === cfg.tasks.defaultProjectId) { + this._globalConfigService.updateSection('tasks', { defaultProjectId: null }); } }), ), diff --git a/src/app/features/tasks/add-task-bar/add-task-bar.component.ts b/src/app/features/tasks/add-task-bar/add-task-bar.component.ts index 722b9c6a9..4a38d1bdc 100644 --- a/src/app/features/tasks/add-task-bar/add-task-bar.component.ts +++ b/src/app/features/tasks/add-task-bar/add-task-bar.component.ts @@ -172,19 +172,19 @@ export class AddTaskBarComponent implements AfterViewInit, OnInit, OnDestroy { defaultProject$ = combineLatest([ this.projects$, this._workContextService.activeWorkContext$, - this._globalConfigService.misc$, + this._globalConfigService.tasks$, ]).pipe( - map(([projects, workContext, miscConfig]) => { + map(([projects, workContext, tasksConfig]) => { // Priority order: // 1. If current work context is a project → use that project - // 2. If misc.defaultProjectId is configured → use that project + // 2. If tasks.defaultProjectId is configured → use that project // 3. Otherwise → fall back to INBOX_PROJECT const defaultProject = (workContext?.type === WorkContextType.PROJECT ? projects.find((p) => p.id === workContext.id) : null) || - (miscConfig.defaultProjectId - ? projects.find((p) => p.id === miscConfig.defaultProjectId) + (tasksConfig.defaultProjectId + ? projects.find((p) => p.id === tasksConfig.defaultProjectId) : null) || projects.find((p) => p.id === 'INBOX_PROJECT'); return defaultProject; diff --git a/src/app/features/tasks/store/short-syntax.effects.ts b/src/app/features/tasks/store/short-syntax.effects.ts index 4b10d8c42..4acae1b80 100644 --- a/src/app/features/tasks/store/short-syntax.effects.ts +++ b/src/app/features/tasks/store/short-syntax.effects.ts @@ -74,8 +74,8 @@ export class ShortSyntaxEffects { withLatestFrom( this._tagService.tagsNoMyDayAndNoList$, this._projectService.list$, - this._globalConfigService.misc$.pipe( - map((misc) => misc.defaultProjectId), + this._globalConfigService.tasks$.pipe( + map((tasks) => tasks.defaultProjectId), concatMap((defaultProjectId) => { if (this._workContextService.activeWorkContextId === INBOX_PROJECT.id) { diff --git a/src/app/features/tasks/store/task-internal.effects.ts b/src/app/features/tasks/store/task-internal.effects.ts index 1635b680c..65863f597 100644 --- a/src/app/features/tasks/store/task-internal.effects.ts +++ b/src/app/features/tasks/store/task-internal.effects.ts @@ -13,7 +13,7 @@ import { filter, map, mergeMap, withLatestFrom } from 'rxjs/operators'; import { selectTaskFeatureState } from './task.selectors'; import { selectConfigFeatureState, - selectMiscConfig, + selectTasksConfig, } from '../../config/store/global-config.reducer'; import { Task, TaskState } from '../task.model'; import { EMPTY, of } from 'rxjs'; @@ -33,13 +33,13 @@ export class TaskInternalEffects { this._actions$.pipe( ofType(TaskSharedActions.updateTask), withLatestFrom( - this._store$.pipe(select(selectMiscConfig)), + this._store$.pipe(select(selectTasksConfig)), this._store$.pipe(select(selectTaskFeatureState)), ), filter( - ([{ task }, miscCfg, state]) => - !!miscCfg && - miscCfg.isAutMarkParentAsDone && + ([{ task }, tasksCfg, state]) => + !!tasksCfg && + tasksCfg.isAutMarkParentAsDone && !!task.changes.isDone && // @ts-ignore !!state.entities[task.id].parentId, diff --git a/src/app/features/tasks/store/task-related-model.effects.ts b/src/app/features/tasks/store/task-related-model.effects.ts index 78327a559..2c92bad2c 100644 --- a/src/app/features/tasks/store/task-related-model.effects.ts +++ b/src/app/features/tasks/store/task-related-model.effects.ts @@ -27,8 +27,8 @@ export class TaskRelatedModelEffects { // --------------------- ifAutoAddTodayEnabled$ = (obs: Observable): Observable => - this._globalConfigService.misc$.pipe( - switchMap((misc) => (misc.isAutoAddWorkedOnToToday ? obs : EMPTY)), + this._globalConfigService.tasks$.pipe( + switchMap((tasks) => (tasks.isAutoAddWorkedOnToToday ? obs : EMPTY)), ); autoAddTodayTagOnTracking = createEffect(() => diff --git a/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.ts b/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.ts index b91c5073a..989d0c3c3 100644 --- a/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.ts +++ b/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.ts @@ -290,7 +290,7 @@ export class TaskContextMenuInnerComponent implements AfterViewInit { } const isConfirmBeforeTaskDelete = - this._globalConfigService.cfg()?.misc?.isConfirmBeforeTaskDelete ?? true; + this._globalConfigService.cfg()?.tasks?.isConfirmBeforeTaskDelete ?? true; if (isConfirmBeforeTaskDelete) { this._matDialog diff --git a/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts b/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts index 54126d02b..afc3b07a0 100644 --- a/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts +++ b/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts @@ -244,8 +244,8 @@ export class TaskDetailPanelComponent implements OnInit, AfterViewInit, OnDestro // Default task notes computed signal defaultTaskNotes = computed(() => { - const misc = this._globalConfigService.misc(); - return misc?.taskNotesTpl || ''; + const tasks = this._globalConfigService.tasks(); + return tasks?.taskNotesTpl || ''; }); // Local attachments computed signal diff --git a/src/app/features/tasks/task.service.ts b/src/app/features/tasks/task.service.ts index 04039f3fa..2f428e3e4 100644 --- a/src/app/features/tasks/task.service.ts +++ b/src/app/features/tasks/task.service.ts @@ -1234,7 +1234,7 @@ export class TaskService { ? { projectId: workContextId } : { projectId: - this._globalConfigService.cfg()?.misc.defaultProjectId || INBOX_PROJECT.id, + this._globalConfigService.cfg()?.tasks.defaultProjectId || INBOX_PROJECT.id, }), tagIds: @@ -1258,7 +1258,7 @@ export class TaskService { d1.projectId = workContextType === WorkContextType.PROJECT ? workContextId - : this._globalConfigService.cfg()?.misc.defaultProjectId || INBOX_PROJECT.id; + : this._globalConfigService.cfg()?.tasks.defaultProjectId || INBOX_PROJECT.id; } // Validate that we have a valid task before returning diff --git a/src/app/features/tasks/task/task.component.ts b/src/app/features/tasks/task/task.component.ts index e0c87149a..431c48b4b 100644 --- a/src/app/features/tasks/task/task.component.ts +++ b/src/app/features/tasks/task/task.component.ts @@ -371,7 +371,7 @@ export class TaskComponent implements OnDestroy, AfterViewInit { } const isConfirmBeforeTaskDelete = - this._configService.cfg()?.misc?.isConfirmBeforeTaskDelete ?? true; + this._configService.cfg()?.tasks?.isConfirmBeforeTaskDelete ?? true; if (isConfirmBeforeTaskDelete) { this._matDialog diff --git a/src/app/pages/config-page/config-page.component.html b/src/app/pages/config-page/config-page.component.html index 365828212..f92eaa582 100644 --- a/src/app/pages/config-page/config-page.component.html +++ b/src/app/pages/config-page/config-page.component.html @@ -44,7 +44,15 @@ {{ 'PS.TABS.TASKS' | translate }}
- + @for (section of globalTasksFormCfg; track section.key) { +
+ +
+ }
diff --git a/src/app/pages/config-page/config-page.component.ts b/src/app/pages/config-page/config-page.component.ts index 195b7a324..6a614a35b 100644 --- a/src/app/pages/config-page/config-page.component.ts +++ b/src/app/pages/config-page/config-page.component.ts @@ -14,6 +14,7 @@ import { GLOBAL_PLUGINS_FORM_CONFIG, GLOBAL_PRODUCTIVITY_FORM_CONFIG, GLOBAL_TIME_TRACKING_FORM_CONFIG, + GLOBAL_TASKS_FORM_CONFIG, } from '../../features/config/global-config-form-config.const'; import { ConfigFormConfig, @@ -97,6 +98,7 @@ export class ConfigPageComponent implements OnInit, OnDestroy { // @todo - find better names for tabs configs forms // Tab-specific form configurations generalFormCfg: ConfigFormConfig; + globalTasksFormCfg: ConfigFormConfig; timeTrackingFormCfg: ConfigFormConfig; pluginsShortcutsFormCfg: ConfigFormConfig; globalImexFormCfg: ConfigFormConfig; @@ -134,6 +136,7 @@ export class ConfigPageComponent implements OnInit, OnDestroy { this.pluginsShortcutsFormCfg = GLOBAL_PLUGINS_FORM_CONFIG.slice(); this.globalImexFormCfg = GLOBAL_IMEX_FORM_CONFIG.slice(); this.globalProductivityConfigFormCfg = GLOBAL_PRODUCTIVITY_FORM_CONFIG.slice(); + this.globalTasksFormCfg = GLOBAL_TASKS_FORM_CONFIG.slice(); // NOTE: needs special handling cause of the async stuff if (IS_ANDROID_WEB_VIEW) { diff --git a/src/app/t.const.ts b/src/app/t.const.ts index 83e7f9a15..10d4cfd76 100644 --- a/src/app/t.const.ts +++ b/src/app/t.const.ts @@ -2202,11 +2202,15 @@ const T = { SYNC_EXPORT: 'PS.SYNC_EXPORT', TABS: { GENERAL: 'PS.TABS.GENERAL', + TASKS: 'PS.TABS.TASKS', TIME_TRACKING: 'PS.TABS.TIME_TRACKING', PRODUCTIVITY: 'PS.TABS.PRODUCTIVITY', PLUGINS: 'PS.TABS.PLUGINS', SYNC_BACKUP: 'PS.TABS.SYNC_BACKUP', }, + TASKS_SETTINGS: { + TITLE: 'PS.TASKS_SETTINGS.TITLE', + }, TAG_SETTINGS: 'PS.TAG_SETTINGS', TOGGLE_DARK_MODE: 'PS.TOGGLE_DARK_MODE', UPDATE_APP: 'PS.UPDATE_APP', From 16ba195f7da430166435b9b2f7022cec814fe903 Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 01:27:30 +0700 Subject: [PATCH 04/54] refactor(config): move another settings to 'Tasks' tab settings. --- .../config/global-config-form-config.const.ts | 1 - .../config-page/config-page.component.html | 19 ++++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/app/features/config/global-config-form-config.const.ts b/src/app/features/config/global-config-form-config.const.ts index a68c22c28..af4348b6d 100644 --- a/src/app/features/config/global-config-form-config.const.ts +++ b/src/app/features/config/global-config-form-config.const.ts @@ -30,7 +30,6 @@ export const GLOBAL_GENERAL_FORM_CONFIG: ConfigFormConfig = [ LANGUAGE_SELECTION_FORM_FORM, APP_FEATURES_FORM_CFG, MISC_SETTINGS_FORM_CFG, - SHORT_SYNTAX_FORM_CFG, KEYBOARD_SETTINGS_FORM_CFG, ].filter(filterGlobalConfigForm); diff --git a/src/app/pages/config-page/config-page.component.html b/src/app/pages/config-page/config-page.component.html index f92eaa582..ac0d63eaa 100644 --- a/src/app/pages/config-page/config-page.component.html +++ b/src/app/pages/config-page/config-page.component.html @@ -25,15 +25,6 @@ > } - -
- -
@@ -53,6 +44,16 @@ > } + + +
+ +
From 1de7005ecfee89e18a467546e37307d2fb4563ef Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 01:32:43 +0700 Subject: [PATCH 05/54] refactor(misc-settings): remove custom theme selection from misc settings form --- .../config/form-cfgs/misc-settings-form.const.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/app/features/config/form-cfgs/misc-settings-form.const.ts b/src/app/features/config/form-cfgs/misc-settings-form.const.ts index 8b41a036e..50a2be113 100644 --- a/src/app/features/config/form-cfgs/misc-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/misc-settings-form.const.ts @@ -5,7 +5,6 @@ import { } from '../global-config.model'; import { T } from '../../../t.const'; import { IS_ELECTRON } from '../../../app.constants'; -import { AVAILABLE_CUSTOM_THEMES } from '../../../core/theme/custom-theme.service'; export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { title: T.GCF.MISC.TITLE, @@ -105,17 +104,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { }, ] : []) as LimitedFormlyFieldConfig[]), - { - key: 'customTheme', - type: 'select', - templateOptions: { - label: T.GCF.MISC.THEME, - options: AVAILABLE_CUSTOM_THEMES.map((theme) => ({ - label: theme.name, - value: theme.id, - })), - }, - }, { key: 'defaultStartPage', type: 'select', From 4eb6a97a86bca4b7f95e314fda8789b91fdda7c6 Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 17:35:41 +0700 Subject: [PATCH 06/54] feat(markdown): move 'isTurnOffMarkdown' setting to tasks configuration and update related components --- src/app/features/config/default-global-config.const.ts | 2 +- .../features/config/form-cfgs/misc-settings-form.const.ts | 7 ------- .../features/config/form-cfgs/tasks-settings-form.const.ts | 7 +++++++ src/app/features/config/global-config.model.ts | 2 +- .../ui/inline-markdown/inline-markdown.component.spec.ts | 2 +- src/app/ui/inline-markdown/inline-markdown.component.ts | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/features/config/default-global-config.const.ts b/src/app/features/config/default-global-config.const.ts index b6e265a24..a89bfdbe2 100644 --- a/src/app/features/config/default-global-config.const.ts +++ b/src/app/features/config/default-global-config.const.ts @@ -40,12 +40,12 @@ export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { isAutMarkParentAsDone: false, isTrayShowCurrentTask: true, defaultProjectId: null, + isTurnOffMarkdown: false, taskNotesTpl: defaultTaskNoteTemplate, }, misc: { isConfirmBeforeExit: false, isConfirmBeforeExitWithoutFinishDay: true, - isTurnOffMarkdown: false, isMinimizeToTray: false, isTrayShowCurrentCountdown: true, startOfNextDay: 0, diff --git a/src/app/features/config/form-cfgs/misc-settings-form.const.ts b/src/app/features/config/form-cfgs/misc-settings-form.const.ts index 50a2be113..d24bf8adb 100644 --- a/src/app/features/config/form-cfgs/misc-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/misc-settings-form.const.ts @@ -30,13 +30,6 @@ export const MISC_SETTINGS_FORM_CFG: ConfigFormSection = { }, }, ]) as LimitedFormlyFieldConfig[]), - { - key: 'isTurnOffMarkdown', - type: 'checkbox', - templateOptions: { - label: T.GCF.MISC.IS_TURN_OFF_MARKDOWN, - }, - }, { key: 'isMinimizeToTray', type: 'checkbox', diff --git a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts index cc00edc0b..a44a0ff83 100644 --- a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts @@ -40,6 +40,13 @@ export const TASKS_SETTINGS_FORM_CFG: ConfigFormSection = { label: T.GCF.MISC.DEFAULT_PROJECT, }, }, + { + key: 'isTurnOffMarkdown', + type: 'checkbox', + templateOptions: { + label: T.GCF.MISC.IS_TURN_OFF_MARKDOWN, + }, + }, { key: 'taskNotesTpl', type: 'textarea', diff --git a/src/app/features/config/global-config.model.ts b/src/app/features/config/global-config.model.ts index c1c90d1a4..d9cd5cdb1 100644 --- a/src/app/features/config/global-config.model.ts +++ b/src/app/features/config/global-config.model.ts @@ -23,7 +23,6 @@ export type AppFeaturesConfig = Readonly<{ export type MiscConfig = Readonly<{ isConfirmBeforeExit: boolean; isConfirmBeforeExitWithoutFinishDay: boolean; - isTurnOffMarkdown: boolean; isMinimizeToTray: boolean; startOfNextDay: number; isDisableAnimations: boolean; @@ -45,6 +44,7 @@ export type TasksConfig = Readonly<{ isTrayShowCurrentTask: boolean; // allow also false because of #569 defaultProjectId?: string | null | false; + isTurnOffMarkdown: boolean; taskNotesTpl: string; }>; diff --git a/src/app/ui/inline-markdown/inline-markdown.component.spec.ts b/src/app/ui/inline-markdown/inline-markdown.component.spec.ts index 703e72d81..3359d0bcf 100644 --- a/src/app/ui/inline-markdown/inline-markdown.component.spec.ts +++ b/src/app/ui/inline-markdown/inline-markdown.component.spec.ts @@ -13,7 +13,7 @@ describe('InlineMarkdownComponent', () => { beforeEach(async () => { mockGlobalConfigService = jasmine.createSpyObj('GlobalConfigService', [], { - misc: jasmine.createSpy().and.returnValue({ isTurnOffMarkdown: false }), + tasks: jasmine.createSpy().and.returnValue({ isTurnOffMarkdown: false }), }); mockMatDialog = jasmine.createSpyObj('MatDialog', ['open']); diff --git a/src/app/ui/inline-markdown/inline-markdown.component.ts b/src/app/ui/inline-markdown/inline-markdown.component.ts index e02d0f804..2b72f8599 100644 --- a/src/app/ui/inline-markdown/inline-markdown.component.ts +++ b/src/app/ui/inline-markdown/inline-markdown.component.ts @@ -61,8 +61,8 @@ export class InlineMarkdownComponent implements OnInit, OnDestroy { modelCopy = signal(undefined); isTurnOffMarkdownParsing = computed(() => { - const misc = this._globalConfigService.misc(); - return misc?.isTurnOffMarkdown ?? false; + const tasks = this._globalConfigService.tasks(); + return tasks?.isTurnOffMarkdown ?? false; }); private _hideOverFlowTimeout: number | undefined; From fe3a7c6f0df9ff04b4785ddda2ae8745594383cf Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 17:44:45 +0700 Subject: [PATCH 07/54] fix(tasks): correct spelling of 'isAutoMarkParentAsDone' in configuration and tests --- src/app/features/config/default-global-config.const.ts | 2 +- .../config/form-cfgs/tasks-settings-form.const.ts | 2 +- src/app/features/config/global-config.model.ts | 2 +- .../tasks/add-task-bar/add-task-bar.component.spec.ts | 2 +- .../features/tasks/store/task-internal.effects.spec.ts | 8 ++++---- src/app/features/tasks/store/task-internal.effects.ts | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/features/config/default-global-config.const.ts b/src/app/features/config/default-global-config.const.ts index a89bfdbe2..2b86f3b4b 100644 --- a/src/app/features/config/default-global-config.const.ts +++ b/src/app/features/config/default-global-config.const.ts @@ -37,7 +37,7 @@ export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { tasks: { isConfirmBeforeTaskDelete: true, isAutoAddWorkedOnToToday: true, - isAutMarkParentAsDone: false, + isAutoMarkParentAsDone: false, isTrayShowCurrentTask: true, defaultProjectId: null, isTurnOffMarkdown: false, diff --git a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts index a44a0ff83..309a9faf0 100644 --- a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts @@ -13,7 +13,7 @@ export const TASKS_SETTINGS_FORM_CFG: ConfigFormSection = { }, }, { - key: 'isAutMarkParentAsDone', + key: 'isAutoMarkParentAsDone', type: 'checkbox', templateOptions: { label: T.GCF.MISC.IS_AUTO_MARK_PARENT_AS_DONE, diff --git a/src/app/features/config/global-config.model.ts b/src/app/features/config/global-config.model.ts index d9cd5cdb1..2e231e2f2 100644 --- a/src/app/features/config/global-config.model.ts +++ b/src/app/features/config/global-config.model.ts @@ -38,7 +38,7 @@ export type MiscConfig = Readonly<{ }>; export type TasksConfig = Readonly<{ - isAutMarkParentAsDone: boolean; + isAutoMarkParentAsDone: boolean; isConfirmBeforeTaskDelete?: boolean; isAutoAddWorkedOnToToday: boolean; isTrayShowCurrentTask: boolean; diff --git a/src/app/features/tasks/add-task-bar/add-task-bar.component.spec.ts b/src/app/features/tasks/add-task-bar/add-task-bar.component.spec.ts index f8e41aec7..044f8d79a 100644 --- a/src/app/features/tasks/add-task-bar/add-task-bar.component.spec.ts +++ b/src/app/features/tasks/add-task-bar/add-task-bar.component.spec.ts @@ -110,7 +110,7 @@ describe('AddTaskBarComponent', () => { const mockMiscConfig: MiscConfig = { defaultProjectId: null, - isAutMarkParentAsDone: false, + isAutoMarkParentAsDone: false, isConfirmBeforeExit: false, isConfirmBeforeExitWithoutFinishDay: false, isTurnOffMarkdown: false, diff --git a/src/app/features/tasks/store/task-internal.effects.spec.ts b/src/app/features/tasks/store/task-internal.effects.spec.ts index 25e10ea82..b80afdb35 100644 --- a/src/app/features/tasks/store/task-internal.effects.spec.ts +++ b/src/app/features/tasks/store/task-internal.effects.spec.ts @@ -92,7 +92,7 @@ describe('TaskInternalEffects', () => { selectors: [ { selector: selectMiscConfig, - value: createMiscConfig({ isAutMarkParentAsDone: true }), + value: createMiscConfig({ isAutoMarkParentAsDone: true }), }, { selector: selectTaskFeatureState, value: createTaskState([]) }, { selector: selectConfigFeatureState, value: createConfigState() }, @@ -130,7 +130,7 @@ describe('TaskInternalEffects', () => { store.overrideSelector( selectMiscConfig, - createMiscConfig({ isAutMarkParentAsDone: true }), + createMiscConfig({ isAutoMarkParentAsDone: true }), ); store.overrideSelector( selectTaskFeatureState, @@ -165,7 +165,7 @@ describe('TaskInternalEffects', () => { store.overrideSelector( selectMiscConfig, - createMiscConfig({ isAutMarkParentAsDone: false }), + createMiscConfig({ isAutoMarkParentAsDone: false }), ); store.overrideSelector( selectTaskFeatureState, @@ -206,7 +206,7 @@ describe('TaskInternalEffects', () => { store.overrideSelector( selectMiscConfig, - createMiscConfig({ isAutMarkParentAsDone: true }), + createMiscConfig({ isAutoMarkParentAsDone: true }), ); store.overrideSelector( selectTaskFeatureState, diff --git a/src/app/features/tasks/store/task-internal.effects.ts b/src/app/features/tasks/store/task-internal.effects.ts index 65863f597..3c48c8097 100644 --- a/src/app/features/tasks/store/task-internal.effects.ts +++ b/src/app/features/tasks/store/task-internal.effects.ts @@ -39,7 +39,7 @@ export class TaskInternalEffects { filter( ([{ task }, tasksCfg, state]) => !!tasksCfg && - tasksCfg.isAutMarkParentAsDone && + tasksCfg.isAutoMarkParentAsDone && !!task.changes.isDone && // @ts-ignore !!state.entities[task.id].parentId, From 182b7bb662921405298a958273c6b6d1d1fafdb3 Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 18:14:26 +0700 Subject: [PATCH 08/54] refactor(tasks): rename 'taskNotesTpl' to 'notesTemplate' for consistency across configurations --- src/app/features/config/default-global-config.const.ts | 2 +- src/app/features/config/form-cfgs/tasks-settings-form.const.ts | 2 +- src/app/features/config/global-config.model.ts | 2 +- .../focus-mode/focus-mode-main/focus-mode-main.component.ts | 2 +- .../tasks/task-detail-panel/task-detail-panel.component.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/features/config/default-global-config.const.ts b/src/app/features/config/default-global-config.const.ts index 2b86f3b4b..f21e73d0d 100644 --- a/src/app/features/config/default-global-config.const.ts +++ b/src/app/features/config/default-global-config.const.ts @@ -41,7 +41,7 @@ export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { isTrayShowCurrentTask: true, defaultProjectId: null, isTurnOffMarkdown: false, - taskNotesTpl: defaultTaskNoteTemplate, + notesTemplate: defaultTaskNoteTemplate, }, misc: { isConfirmBeforeExit: false, diff --git a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts index 309a9faf0..5429c1a5d 100644 --- a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts @@ -48,7 +48,7 @@ export const TASKS_SETTINGS_FORM_CFG: ConfigFormSection = { }, }, { - key: 'taskNotesTpl', + key: 'notesTemplate', type: 'textarea', templateOptions: { rows: 5, diff --git a/src/app/features/config/global-config.model.ts b/src/app/features/config/global-config.model.ts index 2e231e2f2..124f4bc64 100644 --- a/src/app/features/config/global-config.model.ts +++ b/src/app/features/config/global-config.model.ts @@ -45,7 +45,7 @@ export type TasksConfig = Readonly<{ // allow also false because of #569 defaultProjectId?: string | null | false; isTurnOffMarkdown: boolean; - taskNotesTpl: string; + notesTemplate: string; }>; export type ShortSyntaxConfig = Readonly<{ diff --git a/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts b/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts index b6cd2f672..155f58c9d 100644 --- a/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts +++ b/src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts @@ -230,7 +230,7 @@ export class FocusModeMainComponent { effect(() => { const tasks = this._globalConfigService.tasks(); if (tasks) { - this.defaultTaskNotes.set(tasks.taskNotesTpl); + this.defaultTaskNotes.set(tasks.notesTemplate); } }); diff --git a/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts b/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts index afc3b07a0..004bbe7dd 100644 --- a/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts +++ b/src/app/features/tasks/task-detail-panel/task-detail-panel.component.ts @@ -245,7 +245,7 @@ export class TaskDetailPanelComponent implements OnInit, AfterViewInit, OnDestro // Default task notes computed signal defaultTaskNotes = computed(() => { const tasks = this._globalConfigService.tasks(); - return tasks?.taskNotesTpl || ''; + return tasks?.notesTemplate || ''; }); // Local attachments computed signal From 7cdcd3c938db2c86e492bfd48f6da3d061d868a3 Mon Sep 17 00:00:00 2001 From: Ivan Kalashnikov Date: Sun, 18 Jan 2026 18:27:56 +0700 Subject: [PATCH 09/54] refactor(markdown): rename 'isTurnOffMarkdown' to 'isMarkdownNotesEnabled' for clarity and consistency --- src/app/features/config/default-global-config.const.ts | 2 +- .../features/config/form-cfgs/tasks-settings-form.const.ts | 2 +- src/app/features/config/global-config.model.ts | 2 +- src/app/ui/inline-markdown/inline-markdown.component.html | 6 +++--- src/app/ui/inline-markdown/inline-markdown.component.ts | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/features/config/default-global-config.const.ts b/src/app/features/config/default-global-config.const.ts index f21e73d0d..548d941ae 100644 --- a/src/app/features/config/default-global-config.const.ts +++ b/src/app/features/config/default-global-config.const.ts @@ -40,7 +40,7 @@ export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { isAutoMarkParentAsDone: false, isTrayShowCurrentTask: true, defaultProjectId: null, - isTurnOffMarkdown: false, + isMarkdownNotesEnabled: true, notesTemplate: defaultTaskNoteTemplate, }, misc: { diff --git a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts index 5429c1a5d..81f023500 100644 --- a/src/app/features/config/form-cfgs/tasks-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/tasks-settings-form.const.ts @@ -41,7 +41,7 @@ export const TASKS_SETTINGS_FORM_CFG: ConfigFormSection = { }, }, { - key: 'isTurnOffMarkdown', + key: 'isMarkdownNotesEnabled', type: 'checkbox', templateOptions: { label: T.GCF.MISC.IS_TURN_OFF_MARKDOWN, diff --git a/src/app/features/config/global-config.model.ts b/src/app/features/config/global-config.model.ts index 124f4bc64..728769847 100644 --- a/src/app/features/config/global-config.model.ts +++ b/src/app/features/config/global-config.model.ts @@ -44,7 +44,7 @@ export type TasksConfig = Readonly<{ isTrayShowCurrentTask: boolean; // allow also false because of #569 defaultProjectId?: string | null | false; - isTurnOffMarkdown: boolean; + isMarkdownNotesEnabled: boolean; notesTemplate: string; }>; diff --git a/src/app/ui/inline-markdown/inline-markdown.component.html b/src/app/ui/inline-markdown/inline-markdown.component.html index d0a304b09..f46c58136 100644 --- a/src/app/ui/inline-markdown/inline-markdown.component.html +++ b/src/app/ui/inline-markdown/inline-markdown.component.html @@ -3,7 +3,7 @@ [class.isHideOverflow]="isHideOverflow()" class="markdown-wrapper" > - @if (isShowEdit() || isTurnOffMarkdownParsing()) { + @if (isShowEdit() || !isMarkdownNotesEnabled()) {