diff --git a/src/public/app/types.d.ts b/src/public/app/types.d.ts
index cab82d103..942d10f4b 100644
--- a/src/public/app/types.d.ts
+++ b/src/public/app/types.d.ts
@@ -283,6 +283,7 @@ declare global {
getLastPosition(): undefined | TextPosition;
}
},
+ insertContent(modelFragment: any, selection: any);
change(cb: (writer: Writer) => void)
},
editing: {
@@ -311,6 +312,12 @@ declare global {
plugins: {
get(command: string)
},
+ data: {
+ processor: {
+ toView(html: string);
+ };
+ toModel(viewFeragment: any);
+ },
getData(): string;
setData(data: string): void;
getSelectedHtml(): string;
diff --git a/src/public/app/widgets/dialogs/jump_to_note.js b/src/public/app/widgets/dialogs/jump_to_note.ts
similarity index 82%
rename from src/public/app/widgets/dialogs/jump_to_note.js
rename to src/public/app/widgets/dialogs/jump_to_note.ts
index f57acb4f7..1fbb67a57 100644
--- a/src/public/app/widgets/dialogs/jump_to_note.js
+++ b/src/public/app/widgets/dialogs/jump_to_note.ts
@@ -28,6 +28,13 @@ const TPL = `
{
reposition();
});
- window.visualViewport.addEventListener("resize", () => {
+ window.visualViewport?.addEventListener("resize", () => {
reposition();
});
@@ -84,7 +91,7 @@ export default class JumpToNoteDialog extends BasicWidget {
allowCreatingNotes: true,
hideGoToSelectedNoteButton: true,
allowJumpToSearchNotes: true,
- container: this.$results
+ container: this.$results[0]
})
// clear any event listener added in previous invocation of this function
.off("autocomplete:noteselected")
@@ -93,7 +100,7 @@ export default class JumpToNoteDialog extends BasicWidget {
return false;
}
- appContext.tabManager.getActiveContext().setNote(suggestion.notePath);
+ appContext.tabManager.getActiveContext()?.setNote(suggestion.notePath);
});
// if you open the Jump To dialog soon after using it previously, it can often mean that you
@@ -112,15 +119,14 @@ export default class JumpToNoteDialog extends BasicWidget {
}
}
- showInFullText(e) {
+ showInFullText(e: JQuery.TriggeredEvent) {
// stop from propagating upwards (dangerous, especially with ctrl+enter executable javascript notes)
e.preventDefault();
e.stopPropagation();
- const searchString = this.$autoComplete.val();
+ const searchString = String(this.$autoComplete.val());
this.triggerCommand("searchNotes", { searchString });
-
this.modal.hide();
}
}
diff --git a/src/public/app/widgets/dialogs/markdown_import.js b/src/public/app/widgets/dialogs/markdown_import.ts
similarity index 82%
rename from src/public/app/widgets/dialogs/markdown_import.js
rename to src/public/app/widgets/dialogs/markdown_import.ts
index 1cd2fdd29..e5450ac48 100644
--- a/src/public/app/widgets/dialogs/markdown_import.js
+++ b/src/public/app/widgets/dialogs/markdown_import.ts
@@ -27,7 +27,17 @@ const TPL = `
`;
+interface RenderMarkdownResponse {
+ htmlContent: string;
+}
+
export default class MarkdownImportDialog extends BasicWidget {
+
+ private lastOpenedTs: number;
+ private modal!: bootstrap.Modal;
+ private $importTextarea!: JQuery;
+ private $importButton!: JQuery;
+
constructor() {
super();
@@ -36,7 +46,7 @@ export default class MarkdownImportDialog extends BasicWidget {
doRender() {
this.$widget = $(TPL);
- this.modal = Modal.getOrCreateInstance(this.$widget);
+ this.modal = Modal.getOrCreateInstance(this.$widget[0]);
this.$importTextarea = this.$widget.find(".markdown-import-textarea");
this.$importButton = this.$widget.find(".markdown-import-button");
@@ -47,10 +57,13 @@ export default class MarkdownImportDialog extends BasicWidget {
shortcutService.bindElShortcut(this.$widget, "ctrl+return", () => this.sendForm());
}
- async convertMarkdownToHtml(markdownContent) {
- const { htmlContent } = await server.post("other/render-markdown", { markdownContent });
+ async convertMarkdownToHtml(markdownContent: string) {
+ const { htmlContent } = await server.post("other/render-markdown", { markdownContent });
- const textEditor = await appContext.tabManager.getActiveContext().getTextEditor();
+ const textEditor = await appContext.tabManager.getActiveContext()?.getTextEditor();
+ if (!textEditor) {
+ return;
+ }
const viewFragment = textEditor.data.processor.toView(htmlContent);
const modelFragment = textEditor.data.toModel(viewFragment);
@@ -80,7 +93,7 @@ export default class MarkdownImportDialog extends BasicWidget {
}
async sendForm() {
- const text = this.$importTextarea.val();
+ const text = String(this.$importTextarea.val());
this.modal.hide();
diff --git a/src/public/app/widgets/dialogs/move_to.js b/src/public/app/widgets/dialogs/move_to.ts
similarity index 76%
rename from src/public/app/widgets/dialogs/move_to.js
rename to src/public/app/widgets/dialogs/move_to.ts
index 061af25db..af4adfe1d 100644
--- a/src/public/app/widgets/dialogs/move_to.js
+++ b/src/public/app/widgets/dialogs/move_to.ts
@@ -6,6 +6,7 @@ import branchService from "../../services/branches.js";
import treeService from "../../services/tree.js";
import BasicWidget from "../basic_widget.js";
import { t } from "../../services/i18n.js";
+import type { EventData } from "../../components/app_context.js";
const TPL = `
@@ -39,6 +40,12 @@ const TPL = `
`;
export default class MoveToDialog extends BasicWidget {
+
+ private movedBranchIds: string[] | null;
+ private $form!: JQuery;
+ private $noteAutoComplete!: JQuery;
+ private $noteList!: JQuery;
+
constructor() {
super();
@@ -58,7 +65,13 @@ export default class MoveToDialog extends BasicWidget {
this.$widget.modal("hide");
const { noteId, parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(notePath);
- froca.getBranchId(parentNoteId, noteId).then((branchId) => this.moveNotesTo(branchId));
+ if (parentNoteId) {
+ froca.getBranchId(parentNoteId, noteId).then((branchId) => {
+ if (branchId) {
+ this.moveNotesTo(branchId);
+ }
+ });
+ }
} else {
logError(t("move_to.error_no_path"));
}
@@ -67,7 +80,7 @@ export default class MoveToDialog extends BasicWidget {
});
}
- async moveBranchIdsToEvent({ branchIds }) {
+ async moveBranchIdsToEvent({ branchIds }: EventData<"moveBranchIdsTo">) {
this.movedBranchIds = branchIds;
utils.openDialog(this.$widget);
@@ -78,7 +91,14 @@ export default class MoveToDialog extends BasicWidget {
for (const branchId of this.movedBranchIds) {
const branch = froca.getBranch(branchId);
+ if (!branch) {
+ continue;
+ }
+
const note = await froca.getNote(branch.noteId);
+ if (!note) {
+ continue;
+ }
this.$noteList.append($("").text(note.title));
}
@@ -87,12 +107,14 @@ export default class MoveToDialog extends BasicWidget {
noteAutocompleteService.showRecentNotes(this.$noteAutoComplete);
}
- async moveNotesTo(parentBranchId) {
- await branchService.moveToParentNote(this.movedBranchIds, parentBranchId);
+ async moveNotesTo(parentBranchId: string) {
+ if (this.movedBranchIds) {
+ await branchService.moveToParentNote(this.movedBranchIds, parentBranchId);
+ }
const parentBranch = froca.getBranch(parentBranchId);
- const parentNote = await parentBranch.getNote();
+ const parentNote = await parentBranch?.getNote();
- toastService.showMessage(`${t("move_to.move_success_message")} ${parentNote.title}`);
+ toastService.showMessage(`${t("move_to.move_success_message")} ${parentNote?.title}`);
}
}