From 3e6cc1b4495a13bfe6c105735efba24604fa6462 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:08:34 +0200 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20tree.ts=20refact?= =?UTF-8?q?or?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/services/tree.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/public/app/services/tree.ts b/src/public/app/services/tree.ts index ff4c34210..ca38c69da 100644 --- a/src/public/app/services/tree.ts +++ b/src/public/app/services/tree.ts @@ -1,13 +1,11 @@ -import ws from "./ws.js"; -import utils from "./utils.js"; -import froca from "./froca.js"; -import hoistedNoteService from "../services/hoisted_note.js"; import appContext from "../components/app_context.js"; +import hoistedNoteService from "../services/hoisted_note.js"; +import froca from "./froca.js"; +import utils from "./utils.js"; +import ws from "./ws.js"; -/** - * @returns {string|null} - */ -async function resolveNotePath(notePath: string, hoistedNoteId = "root") { + +async function resolveNotePath(notePath: string, hoistedNoteId = "root"): Promise { const runPath = await resolveNotePathToSegments(notePath, hoistedNoteId); return runPath ? runPath.join("/") : null; From 14a3b2811deb13e9c70579528d3d3d8f487c16c1 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:09:04 +0200 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20=F0=9F=90=9B=20fix=20calendar=20widg?= =?UTF-8?q?et=20doesn't=20close=20when=20click=20on=20a=20note?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/widgets/note_tree.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/public/app/widgets/note_tree.ts b/src/public/app/widgets/note_tree.ts index 7fc801ecb..0497e6eb7 100644 --- a/src/public/app/widgets/note_tree.ts +++ b/src/public/app/widgets/note_tree.ts @@ -418,6 +418,9 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { // click event won't propagate so let's close context menu manually contextMenu.hide(); + // hide all dropdowns, fix calendar widget dropdown doesn't close when click on a note + $('.dropdown-menu').parent('.dropdown').find('[data-bs-toggle="dropdown"]').dropdown('hide'); + this.clearSelectedNodes(); const notePath = treeService.getNotePath(data.node); From e555a3354f70d0212703e68fd316bf1aad5d1009 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:18:12 +0200 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20fix=20note=5Ftre?= =?UTF-8?q?e.ts=20lint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/types-fancytree.d.ts | 2 +- src/public/app/widgets/note_tree.ts | 65 +++++++++++++++-------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/public/app/types-fancytree.d.ts b/src/public/app/types-fancytree.d.ts index 38a4b0295..9c99fe904 100644 --- a/src/public/app/types-fancytree.d.ts +++ b/src/public/app/types-fancytree.d.ts @@ -969,7 +969,7 @@ declare namespace Fancytree { /** * Callback(targetNode, data), return true, to enable dnd drop */ - dragEnter?: ((targetNode: FancytreeNode, data: any) => void) | undefined; + dragEnter?: ((targetNode: FancytreeNode) => void) | undefined; /** * Events (drag over) */ diff --git a/src/public/app/widgets/note_tree.ts b/src/public/app/widgets/note_tree.ts index 0497e6eb7..96f6a4c1b 100644 --- a/src/public/app/widgets/note_tree.ts +++ b/src/public/app/widgets/note_tree.ts @@ -1,30 +1,30 @@ -import hoistedNoteService from "../services/hoisted_note.js"; -import treeService from "../services/tree.js"; -import utils from "../services/utils.js"; -import contextMenu from "../menus/context_menu.js"; -import froca from "../services/froca.js"; -import branchService from "../services/branches.js"; -import ws from "../services/ws.js"; -import NoteContextAwareWidget from "./note_context_aware_widget.js"; -import server from "../services/server.js"; -import noteCreateService from "../services/note_create.js"; -import toastService from "../services/toast.js"; import appContext, { type CommandListenerData, type EventData } from "../components/app_context.js"; -import keyboardActionsService from "../services/keyboard_actions.js"; -import clipboard from "../services/clipboard.js"; -import protectedSessionService from "../services/protected_session.js"; -import linkService from "../services/link.js"; -import options from "../services/options.js"; -import protectedSessionHolder from "../services/protected_session_holder.js"; -import dialogService from "../services/dialog.js"; -import shortcutService from "../services/shortcuts.js"; -import { t } from "../services/i18n.js"; +import type { SetNoteOpts } from "../components/note_context.js"; import type FBranch from "../entities/fbranch.js"; -import type LoadResults from "../services/load_results.js"; import type FNote from "../entities/fnote.js"; import type { NoteType } from "../entities/fnote.js"; +import contextMenu from "../menus/context_menu.js"; +import branchService from "../services/branches.js"; +import clipboard from "../services/clipboard.js"; +import dialogService from "../services/dialog.js"; +import froca from "../services/froca.js"; +import hoistedNoteService from "../services/hoisted_note.js"; +import { t } from "../services/i18n.js"; +import keyboardActionsService from "../services/keyboard_actions.js"; +import linkService from "../services/link.js"; +import type LoadResults from "../services/load_results.js"; import type { AttributeRow, BranchRow } from "../services/load_results.js"; -import type { SetNoteOpts } from "../components/note_context.js"; +import noteCreateService from "../services/note_create.js"; +import options from "../services/options.js"; +import protectedSessionService from "../services/protected_session.js"; +import protectedSessionHolder from "../services/protected_session_holder.js"; +import server from "../services/server.js"; +import shortcutService from "../services/shortcuts.js"; +import toastService from "../services/toast.js"; +import treeService from "../services/tree.js"; +import utils from "../services/utils.js"; +import ws from "../services/ws.js"; +import NoteContextAwareWidget from "./note_context_aware_widget.js"; const TPL = /*html*/`
@@ -241,7 +241,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { this.$autoCollapseNoteTree = this.$treeSettingsPopup.find(".auto-collapse-note-tree"); this.$treeSettingsButton = this.$widget.find(".tree-settings-button"); - this.$treeSettingsButton.on("click", (e) => { + this.$treeSettingsButton.on("click", () => { if (this.$treeSettingsPopup.is(":visible")) { this.$treeSettingsPopup.hide(); return; @@ -466,7 +466,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { data.dataTransfer.setData("text", JSON.stringify(notes)); return true; // allow dragging to start }, - dragEnter: (node, data) => { + dragEnter: (node) => { if (node.data.noteType === "search") { return false; } else if (node.data.noteId === "_lbRoot") { @@ -512,8 +512,12 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { try { notes = JSON.parse(jsonStr); - } catch (e) { - logError(`Cannot parse JSON '${jsonStr}' into notes for drop`); + } catch (error: unknown) { + if (error instanceof Error) { + logError(`Cannot parse JSON '${jsonStr}' into notes for drop: ${error.message}`); + } else { + logError(`Cannot parse JSON '${jsonStr}' into notes for drop: Unknown error`); + } return; } @@ -671,17 +675,16 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { let showTimeout: Timeout; this.$tree.on("touchstart", ".fancytree-node", (e) => { - touchStart = new Date().getTime(); showTimeout = setTimeout(() => { this.showContextMenu(e); }, 300); }); - this.$tree.on("touchmove", ".fancytree-node", (e) => { + this.$tree.on("touchmove", ".fancytree-node", () => { clearTimeout(showTimeout); }); - this.$tree.on("touchend", ".fancytree-node", (e) => { + this.$tree.on("touchend", ".fancytree-node", () => { clearTimeout(showTimeout); }); } else { @@ -703,8 +706,6 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { }); } - let touchStart; - this.tree = $.ui.fancytree.getTree(this.$tree); } @@ -1251,7 +1252,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { // activeNode is supposed to be moved when we find out activeNode is deleted but not all branches are deleted. save it for fixing activeNodePath after all nodes loaded. let movedActiveNode = null; - let parentsOfAddedNodes = []; + const parentsOfAddedNodes = []; for (const branchRow of branchRows) { if (branchRow.noteId) { From 54a0bdeb1473cd841c805e2cf481b27aed8d7666 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:19:04 +0200 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20remove=20unused?= =?UTF-8?q?=20command=20data=20(editNoteTitle)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/components/app_context.ts | 1 - src/public/app/widgets/note_tree.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/public/app/components/app_context.ts b/src/public/app/components/app_context.ts index 01715e071..c27f63b39 100644 --- a/src/public/app/components/app_context.ts +++ b/src/public/app/components/app_context.ts @@ -138,7 +138,6 @@ export type CommandMappings = { insertNoteAfter: ContextMenuCommandData; insertChildNote: ContextMenuCommandData; delete: ContextMenuCommandData; - editNoteTitle: ContextMenuCommandData; protectSubtree: ContextMenuCommandData; unprotectSubtree: ContextMenuCommandData; openBulkActionsDialog: diff --git a/src/public/app/widgets/note_tree.ts b/src/public/app/widgets/note_tree.ts index 96f6a4c1b..4a89425c5 100644 --- a/src/public/app/widgets/note_tree.ts +++ b/src/public/app/widgets/note_tree.ts @@ -1687,7 +1687,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { this.triggerCommand("showImportDialog", { noteId: node.data.noteId }); } - editNoteTitleCommand({ node }: CommandListenerData<"editNoteTitle">) { + editNoteTitleCommand() { appContext.triggerCommand("focusOnTitle"); } From 522b96f978b629a589b70a7856607e3645a8a0c5 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:21:07 +0200 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20sort=20app=5Fcon?= =?UTF-8?q?text.ts=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/components/app_context.ts | 37 ++++++++++++------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/public/app/components/app_context.ts b/src/public/app/components/app_context.ts index c27f63b39..11bf72420 100644 --- a/src/public/app/components/app_context.ts +++ b/src/public/app/components/app_context.ts @@ -1,30 +1,29 @@ -import froca from "../services/froca.js"; +import type { Attribute } from "../services/attribute_parser.js"; import bundleService from "../services/bundle.js"; -import RootCommandExecutor from "./root_command_executor.js"; -import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js"; -import options from "../services/options.js"; -import utils from "../services/utils.js"; -import zoomComponent from "./zoom.js"; -import TabManager from "./tab_manager.js"; -import Component from "./component.js"; +import froca from "../services/froca.js"; +import { initLocale,t } from "../services/i18n.js"; import keyboardActionsService from "../services/keyboard_actions.js"; import linkService, { type ViewScope } from "../services/link.js"; -import MobileScreenSwitcherExecutor, { type Screen } from "./mobile_screen_switcher.js"; -import MainTreeExecutors from "./main_tree_executors.js"; +import type LoadResults from "../services/load_results.js"; +import options from "../services/options.js"; import toast from "../services/toast.js"; -import ShortcutComponent from "./shortcut_component.js"; -import { t, initLocale } from "../services/i18n.js"; -import type NoteDetailWidget from "../widgets/note_detail.js"; +import utils from "../services/utils.js"; +import type { ConfirmWithMessageOptions, ConfirmWithTitleOptions } from "../widgets/dialogs/confirm.js"; import type { ResolveOptions } from "../widgets/dialogs/delete_notes.js"; import type { PromptDialogOptions } from "../widgets/dialogs/prompt.js"; -import type { ConfirmWithMessageOptions, ConfirmWithTitleOptions } from "../widgets/dialogs/confirm.js"; -import type LoadResults from "../services/load_results.js"; -import type { Attribute } from "../services/attribute_parser.js"; +import type NoteDetailWidget from "../widgets/note_detail.js"; import type NoteTreeWidget from "../widgets/note_tree.js"; -import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js"; -import type TypeWidget from "../widgets/type_widgets/type_widget.js"; import type EditableTextTypeWidget from "../widgets/type_widgets/editable_text.js"; -import type FAttribute from "../entities/fattribute.js"; +import type TypeWidget from "../widgets/type_widgets/type_widget.js"; +import Component from "./component.js"; +import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js"; +import MainTreeExecutors from "./main_tree_executors.js"; +import MobileScreenSwitcherExecutor, { type Screen } from "./mobile_screen_switcher.js"; +import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js"; +import RootCommandExecutor from "./root_command_executor.js"; +import ShortcutComponent from "./shortcut_component.js"; +import TabManager from "./tab_manager.js"; +import zoomComponent from "./zoom.js"; interface Layout { getRootWidget: (appContext: AppContext) => RootWidget; From 1e7f15b3c238c3e84c790829d4bb500117f0c908 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:22:07 +0200 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20sort=20calendar.?= =?UTF-8?q?ts=20imports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/widgets/buttons/calendar.ts | 28 ++++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/public/app/widgets/buttons/calendar.ts b/src/public/app/widgets/buttons/calendar.ts index a8b2d4542..2122cf811 100644 --- a/src/public/app/widgets/buttons/calendar.ts +++ b/src/public/app/widgets/buttons/calendar.ts @@ -1,18 +1,20 @@ -import { t } from "../../services/i18n.js"; -import dateNoteService from "../../services/date_notes.js"; -import server from "../../services/server.js"; -import appContext from "../../components/app_context.js"; -import RightDropdownButtonWidget from "./right_dropdown_button.js"; -import toastService from "../../services/toast.js"; -import options from "../../services/options.js"; -import { Dropdown } from "bootstrap"; -import type { EventData } from "../../components/app_context.js"; -import dayjs, { Dayjs } from "dayjs"; -import utc from "dayjs/plugin/utc.js"; -import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; -import type BAttribute from "../../../../becca/entities/battribute.js"; import "../../../stylesheets/calendar.css"; +import { Dropdown } from "bootstrap"; +import dayjs, { Dayjs } from "dayjs"; +import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; +import utc from "dayjs/plugin/utc.js"; + +import type BAttribute from "../../../../becca/entities/battribute.js"; +import type { EventData } from "../../components/app_context.js"; +import appContext from "../../components/app_context.js"; +import dateNoteService from "../../services/date_notes.js"; +import { t } from "../../services/i18n.js"; +import options from "../../services/options.js"; +import server from "../../services/server.js"; +import toastService from "../../services/toast.js"; +import RightDropdownButtonWidget from "./right_dropdown_button.js"; + dayjs.extend(utc); dayjs.extend(isSameOrAfter); From b4dbf4d7a58587320d2409265672579b5a6f156e Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Fri, 11 Apr 2025 17:25:04 +0200 Subject: [PATCH 7/8] Revert sort imports refector to avoid conflits --- src/public/app/components/app_context.ts | 37 ++++++------ src/public/app/services/tree.ts | 14 +++-- src/public/app/types-fancytree.d.ts | 2 +- src/public/app/widgets/buttons/calendar.ts | 24 ++++---- src/public/app/widgets/note_tree.ts | 65 +++++++++++----------- 5 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/public/app/components/app_context.ts b/src/public/app/components/app_context.ts index 11bf72420..c27f63b39 100644 --- a/src/public/app/components/app_context.ts +++ b/src/public/app/components/app_context.ts @@ -1,29 +1,30 @@ -import type { Attribute } from "../services/attribute_parser.js"; -import bundleService from "../services/bundle.js"; import froca from "../services/froca.js"; -import { initLocale,t } from "../services/i18n.js"; +import bundleService from "../services/bundle.js"; +import RootCommandExecutor from "./root_command_executor.js"; +import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js"; +import options from "../services/options.js"; +import utils from "../services/utils.js"; +import zoomComponent from "./zoom.js"; +import TabManager from "./tab_manager.js"; +import Component from "./component.js"; import keyboardActionsService from "../services/keyboard_actions.js"; import linkService, { type ViewScope } from "../services/link.js"; -import type LoadResults from "../services/load_results.js"; -import options from "../services/options.js"; +import MobileScreenSwitcherExecutor, { type Screen } from "./mobile_screen_switcher.js"; +import MainTreeExecutors from "./main_tree_executors.js"; import toast from "../services/toast.js"; -import utils from "../services/utils.js"; -import type { ConfirmWithMessageOptions, ConfirmWithTitleOptions } from "../widgets/dialogs/confirm.js"; +import ShortcutComponent from "./shortcut_component.js"; +import { t, initLocale } from "../services/i18n.js"; +import type NoteDetailWidget from "../widgets/note_detail.js"; import type { ResolveOptions } from "../widgets/dialogs/delete_notes.js"; import type { PromptDialogOptions } from "../widgets/dialogs/prompt.js"; -import type NoteDetailWidget from "../widgets/note_detail.js"; +import type { ConfirmWithMessageOptions, ConfirmWithTitleOptions } from "../widgets/dialogs/confirm.js"; +import type LoadResults from "../services/load_results.js"; +import type { Attribute } from "../services/attribute_parser.js"; import type NoteTreeWidget from "../widgets/note_tree.js"; -import type EditableTextTypeWidget from "../widgets/type_widgets/editable_text.js"; -import type TypeWidget from "../widgets/type_widgets/type_widget.js"; -import Component from "./component.js"; -import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js"; -import MainTreeExecutors from "./main_tree_executors.js"; -import MobileScreenSwitcherExecutor, { type Screen } from "./mobile_screen_switcher.js"; import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js"; -import RootCommandExecutor from "./root_command_executor.js"; -import ShortcutComponent from "./shortcut_component.js"; -import TabManager from "./tab_manager.js"; -import zoomComponent from "./zoom.js"; +import type TypeWidget from "../widgets/type_widgets/type_widget.js"; +import type EditableTextTypeWidget from "../widgets/type_widgets/editable_text.js"; +import type FAttribute from "../entities/fattribute.js"; interface Layout { getRootWidget: (appContext: AppContext) => RootWidget; diff --git a/src/public/app/services/tree.ts b/src/public/app/services/tree.ts index ca38c69da..ff4c34210 100644 --- a/src/public/app/services/tree.ts +++ b/src/public/app/services/tree.ts @@ -1,11 +1,13 @@ -import appContext from "../components/app_context.js"; -import hoistedNoteService from "../services/hoisted_note.js"; -import froca from "./froca.js"; -import utils from "./utils.js"; import ws from "./ws.js"; +import utils from "./utils.js"; +import froca from "./froca.js"; +import hoistedNoteService from "../services/hoisted_note.js"; +import appContext from "../components/app_context.js"; - -async function resolveNotePath(notePath: string, hoistedNoteId = "root"): Promise { +/** + * @returns {string|null} + */ +async function resolveNotePath(notePath: string, hoistedNoteId = "root") { const runPath = await resolveNotePathToSegments(notePath, hoistedNoteId); return runPath ? runPath.join("/") : null; diff --git a/src/public/app/types-fancytree.d.ts b/src/public/app/types-fancytree.d.ts index 9c99fe904..38a4b0295 100644 --- a/src/public/app/types-fancytree.d.ts +++ b/src/public/app/types-fancytree.d.ts @@ -969,7 +969,7 @@ declare namespace Fancytree { /** * Callback(targetNode, data), return true, to enable dnd drop */ - dragEnter?: ((targetNode: FancytreeNode) => void) | undefined; + dragEnter?: ((targetNode: FancytreeNode, data: any) => void) | undefined; /** * Events (drag over) */ diff --git a/src/public/app/widgets/buttons/calendar.ts b/src/public/app/widgets/buttons/calendar.ts index 2122cf811..a8b2d4542 100644 --- a/src/public/app/widgets/buttons/calendar.ts +++ b/src/public/app/widgets/buttons/calendar.ts @@ -1,19 +1,17 @@ -import "../../../stylesheets/calendar.css"; - -import { Dropdown } from "bootstrap"; -import dayjs, { Dayjs } from "dayjs"; -import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; -import utc from "dayjs/plugin/utc.js"; - -import type BAttribute from "../../../../becca/entities/battribute.js"; -import type { EventData } from "../../components/app_context.js"; -import appContext from "../../components/app_context.js"; -import dateNoteService from "../../services/date_notes.js"; import { t } from "../../services/i18n.js"; -import options from "../../services/options.js"; +import dateNoteService from "../../services/date_notes.js"; import server from "../../services/server.js"; -import toastService from "../../services/toast.js"; +import appContext from "../../components/app_context.js"; import RightDropdownButtonWidget from "./right_dropdown_button.js"; +import toastService from "../../services/toast.js"; +import options from "../../services/options.js"; +import { Dropdown } from "bootstrap"; +import type { EventData } from "../../components/app_context.js"; +import dayjs, { Dayjs } from "dayjs"; +import utc from "dayjs/plugin/utc.js"; +import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; +import type BAttribute from "../../../../becca/entities/battribute.js"; +import "../../../stylesheets/calendar.css"; dayjs.extend(utc); dayjs.extend(isSameOrAfter); diff --git a/src/public/app/widgets/note_tree.ts b/src/public/app/widgets/note_tree.ts index 4a89425c5..b42b27c83 100644 --- a/src/public/app/widgets/note_tree.ts +++ b/src/public/app/widgets/note_tree.ts @@ -1,30 +1,30 @@ -import appContext, { type CommandListenerData, type EventData } from "../components/app_context.js"; -import type { SetNoteOpts } from "../components/note_context.js"; -import type FBranch from "../entities/fbranch.js"; -import type FNote from "../entities/fnote.js"; -import type { NoteType } from "../entities/fnote.js"; -import contextMenu from "../menus/context_menu.js"; -import branchService from "../services/branches.js"; -import clipboard from "../services/clipboard.js"; -import dialogService from "../services/dialog.js"; -import froca from "../services/froca.js"; import hoistedNoteService from "../services/hoisted_note.js"; -import { t } from "../services/i18n.js"; -import keyboardActionsService from "../services/keyboard_actions.js"; -import linkService from "../services/link.js"; -import type LoadResults from "../services/load_results.js"; -import type { AttributeRow, BranchRow } from "../services/load_results.js"; -import noteCreateService from "../services/note_create.js"; -import options from "../services/options.js"; -import protectedSessionService from "../services/protected_session.js"; -import protectedSessionHolder from "../services/protected_session_holder.js"; -import server from "../services/server.js"; -import shortcutService from "../services/shortcuts.js"; -import toastService from "../services/toast.js"; import treeService from "../services/tree.js"; import utils from "../services/utils.js"; +import contextMenu from "../menus/context_menu.js"; +import froca from "../services/froca.js"; +import branchService from "../services/branches.js"; import ws from "../services/ws.js"; import NoteContextAwareWidget from "./note_context_aware_widget.js"; +import server from "../services/server.js"; +import noteCreateService from "../services/note_create.js"; +import toastService from "../services/toast.js"; +import appContext, { type CommandListenerData, type EventData } from "../components/app_context.js"; +import keyboardActionsService from "../services/keyboard_actions.js"; +import clipboard from "../services/clipboard.js"; +import protectedSessionService from "../services/protected_session.js"; +import linkService from "../services/link.js"; +import options from "../services/options.js"; +import protectedSessionHolder from "../services/protected_session_holder.js"; +import dialogService from "../services/dialog.js"; +import shortcutService from "../services/shortcuts.js"; +import { t } from "../services/i18n.js"; +import type FBranch from "../entities/fbranch.js"; +import type LoadResults from "../services/load_results.js"; +import type FNote from "../entities/fnote.js"; +import type { NoteType } from "../entities/fnote.js"; +import type { AttributeRow, BranchRow } from "../services/load_results.js"; +import type { SetNoteOpts } from "../components/note_context.js"; const TPL = /*html*/`
@@ -241,7 +241,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { this.$autoCollapseNoteTree = this.$treeSettingsPopup.find(".auto-collapse-note-tree"); this.$treeSettingsButton = this.$widget.find(".tree-settings-button"); - this.$treeSettingsButton.on("click", () => { + this.$treeSettingsButton.on("click", (e) => { if (this.$treeSettingsPopup.is(":visible")) { this.$treeSettingsPopup.hide(); return; @@ -466,7 +466,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { data.dataTransfer.setData("text", JSON.stringify(notes)); return true; // allow dragging to start }, - dragEnter: (node) => { + dragEnter: (node, data) => { if (node.data.noteType === "search") { return false; } else if (node.data.noteId === "_lbRoot") { @@ -512,12 +512,8 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { try { notes = JSON.parse(jsonStr); - } catch (error: unknown) { - if (error instanceof Error) { - logError(`Cannot parse JSON '${jsonStr}' into notes for drop: ${error.message}`); - } else { - logError(`Cannot parse JSON '${jsonStr}' into notes for drop: Unknown error`); - } + } catch (e) { + logError(`Cannot parse JSON '${jsonStr}' into notes for drop`); return; } @@ -675,16 +671,17 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { let showTimeout: Timeout; this.$tree.on("touchstart", ".fancytree-node", (e) => { + touchStart = new Date().getTime(); showTimeout = setTimeout(() => { this.showContextMenu(e); }, 300); }); - this.$tree.on("touchmove", ".fancytree-node", () => { + this.$tree.on("touchmove", ".fancytree-node", (e) => { clearTimeout(showTimeout); }); - this.$tree.on("touchend", ".fancytree-node", () => { + this.$tree.on("touchend", ".fancytree-node", (e) => { clearTimeout(showTimeout); }); } else { @@ -706,6 +703,8 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { }); } + let touchStart; + this.tree = $.ui.fancytree.getTree(this.$tree); } @@ -1252,7 +1251,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { // activeNode is supposed to be moved when we find out activeNode is deleted but not all branches are deleted. save it for fixing activeNodePath after all nodes loaded. let movedActiveNode = null; - const parentsOfAddedNodes = []; + let parentsOfAddedNodes = []; for (const branchRow of branchRows) { if (branchRow.noteId) { From 73b043fe8dfb93eab4bf82dc567533c8de7b84c1 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Fri, 11 Apr 2025 20:41:04 +0200 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20add=20command=20?= =?UTF-8?q?data=20back=20for=20tracing=20aspect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/components/app_context.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/public/app/components/app_context.ts b/src/public/app/components/app_context.ts index c27f63b39..b7e5b6a45 100644 --- a/src/public/app/components/app_context.ts +++ b/src/public/app/components/app_context.ts @@ -138,6 +138,7 @@ export type CommandMappings = { insertNoteAfter: ContextMenuCommandData; insertChildNote: ContextMenuCommandData; delete: ContextMenuCommandData; + editNoteTitle: {}; protectSubtree: ContextMenuCommandData; unprotectSubtree: ContextMenuCommandData; openBulkActionsDialog: