chore(client/ts): port export

This commit is contained in:
Elian Doran 2025-02-01 16:23:28 +02:00
parent 02d4d011c3
commit dd12d7f314
No known key found for this signature in database
2 changed files with 40 additions and 16 deletions

View File

@ -83,7 +83,7 @@ export type CommandMappings = {
}; };
showExportDialog: CommandData & { showExportDialog: CommandData & {
notePath: string; notePath: string;
defaultType: "single"; defaultType: "single" | "subtree";
}; };
showDeleteNotesDialog: CommandData & { showDeleteNotesDialog: CommandData & {
branchIdsToDelete: string[]; branchIdsToDelete: string[];

View File

@ -1,11 +1,12 @@
import treeService from "../../services/tree.js"; import treeService from "../../services/tree.js";
import utils from "../../services/utils.js"; import utils from "../../services/utils.js";
import ws from "../../services/ws.js"; import ws from "../../services/ws.js";
import toastService from "../../services/toast.js"; import toastService, { type ToastOptions } from "../../services/toast.js";
import froca from "../../services/froca.js"; import froca from "../../services/froca.js";
import openService from "../../services/open.js"; import openService from "../../services/open.js";
import BasicWidget from "../basic_widget.js"; import BasicWidget from "../basic_widget.js";
import { t } from "../../services/i18n.js"; import { t } from "../../services/i18n.js";
import type { EventData } from "../../components/app_context.js";
const TPL = ` const TPL = `
<div class="export-dialog modal fade mx-auto" tabindex="-1" role="dialog"> <div class="export-dialog modal fade mx-auto" tabindex="-1" role="dialog">
@ -116,6 +117,19 @@ const TPL = `
</div>`; </div>`;
export default class ExportDialog extends BasicWidget { export default class ExportDialog extends BasicWidget {
private taskId: string;
private branchId: string | null;
private modal?: bootstrap.Modal;
private $form!: JQuery<HTMLElement>;
private $noteTitle!: JQuery<HTMLElement>;
private $subtreeFormats!: JQuery<HTMLElement>;
private $singleFormats!: JQuery<HTMLElement>;
private $subtreeType!: JQuery<HTMLElement>;
private $singleType!: JQuery<HTMLElement>;
private $exportButton!: JQuery<HTMLElement>;
private $opmlVersions!: JQuery<HTMLElement>;
constructor() { constructor() {
super(); super();
@ -125,6 +139,8 @@ export default class ExportDialog extends BasicWidget {
doRender() { doRender() {
this.$widget = $(TPL); this.$widget = $(TPL);
// Remove once bootstrap is fixed.
// @ts-ignore
this.modal = bootstrap.Modal.getOrCreateInstance(this.$widget); this.modal = bootstrap.Modal.getOrCreateInstance(this.$widget);
this.$form = this.$widget.find(".export-form"); this.$form = this.$widget.find(".export-form");
this.$noteTitle = this.$widget.find(".export-note-title"); this.$noteTitle = this.$widget.find(".export-note-title");
@ -136,7 +152,7 @@ export default class ExportDialog extends BasicWidget {
this.$opmlVersions = this.$widget.find(".opml-versions"); this.$opmlVersions = this.$widget.find(".opml-versions");
this.$form.on("submit", () => { this.$form.on("submit", () => {
this.modal.hide(); this.modal?.hide();
const exportType = this.$widget.find("input[name='export-type']:checked").val(); const exportType = this.$widget.find("input[name='export-type']:checked").val();
@ -149,13 +165,15 @@ export default class ExportDialog extends BasicWidget {
const exportVersion = exportFormat === "opml" ? this.$widget.find("input[name='opml-version']:checked").val() : "1.0"; const exportVersion = exportFormat === "opml" ? this.$widget.find("input[name='opml-version']:checked").val() : "1.0";
this.exportBranch(this.branchId, exportType, exportFormat, exportVersion); if (this.branchId) {
this.exportBranch(this.branchId, String(exportType), String(exportFormat), String(exportVersion));
}
return false; return false;
}); });
this.$widget.find("input[name=export-type]").on("change", (e) => { this.$widget.find("input[name=export-type]").on("change", (e) => {
if (e.currentTarget.value === "subtree") { if ((e.currentTarget as HTMLInputElement).value === "subtree") {
if (this.$widget.find("input[name=export-subtree-format]:checked").length === 0) { if (this.$widget.find("input[name=export-subtree-format]:checked").length === 0) {
this.$widget.find("input[name=export-subtree-format]:first").prop("checked", true); this.$widget.find("input[name=export-subtree-format]:first").prop("checked", true);
} }
@ -173,7 +191,7 @@ export default class ExportDialog extends BasicWidget {
}); });
this.$widget.find("input[name=export-subtree-format]").on("change", (e) => { this.$widget.find("input[name=export-subtree-format]").on("change", (e) => {
if (e.currentTarget.value === "opml") { if ((e.currentTarget as HTMLInputElement).value === "opml") {
this.$opmlVersions.slideDown(); this.$opmlVersions.slideDown();
} else { } else {
this.$opmlVersions.slideUp(); this.$opmlVersions.slideUp();
@ -181,7 +199,7 @@ export default class ExportDialog extends BasicWidget {
}); });
} }
async showExportDialogEvent({ notePath, defaultType }) { async showExportDialogEvent({ notePath, defaultType }: EventData<"showExportDialog">) {
this.taskId = ""; this.taskId = "";
this.$exportButton.removeAttr("disabled"); this.$exportButton.removeAttr("disabled");
@ -201,11 +219,15 @@ export default class ExportDialog extends BasicWidget {
const { noteId, parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(notePath); const { noteId, parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(notePath);
if (parentNoteId) {
this.branchId = await froca.getBranchId(parentNoteId, noteId); this.branchId = await froca.getBranchId(parentNoteId, noteId);
}
if (noteId) {
this.$noteTitle.text(await treeService.getNoteTitle(noteId)); this.$noteTitle.text(await treeService.getNoteTitle(noteId));
} }
}
exportBranch(branchId, type, format, version) { exportBranch(branchId: string, type: string, format: string, version: string) {
this.taskId = utils.randomString(10); this.taskId = utils.randomString(10);
const url = openService.getUrlForDownload(`api/branches/${branchId}/export/${type}/${format}/${version}/${this.taskId}`); const url = openService.getUrlForDownload(`api/branches/${branchId}/export/${type}/${format}/${version}/${this.taskId}`);
@ -215,12 +237,14 @@ export default class ExportDialog extends BasicWidget {
} }
ws.subscribeToMessages(async (message) => { ws.subscribeToMessages(async (message) => {
const makeToast = (id, message) => ({ function makeToast(id: string, message: string): ToastOptions {
return {
id: id, id: id,
title: t("export.export_status"), title: t("export.export_status"),
message: message, message: message,
icon: "arrow-square-up-right" icon: "arrow-square-up-right"
}); };
};
if (message.taskType !== "export") { if (message.taskType !== "export") {
return; return;