import server from "../../services/server.js"; import froca from "../../services/froca.js"; import linkService from "../../services/link.js"; import utils from "../../services/utils.js"; import BasicWidget from "../basic_widget.js"; import { t } from "../../services/i18n.js"; import type { FAttributeRow } from "../../entities/fattribute.js"; // TODO: Use common with server. interface Response { noteIdsToBeDeleted: string[]; brokenRelations: FAttributeRow[]; } export interface ResolveOptions { proceed: boolean; deleteAllClones?: boolean; eraseNotes?: boolean; } interface ShowDeleteNotesDialogOpts { branchIdsToDelete: string[]; callback: (opts: ResolveOptions) => void; forceDeleteAllClones: boolean; } const TPL = ` `; export default class DeleteNotesDialog extends BasicWidget { private branchIds: string[] | null; private resolve!: (options: ResolveOptions) => void; private $content!: JQuery; private $okButton!: JQuery; private $cancelButton!: JQuery; private $deleteNotesList!: JQuery; private $brokenRelationsList!: JQuery; private $deletedNotesCount!: JQuery; private $noNoteToDeleteWrapper!: JQuery; private $deleteNotesListWrapper!: JQuery; private $brokenRelationsListWrapper!: JQuery; private $brokenRelationsCount!: JQuery; private $deleteAllClones!: JQuery; private $eraseNotes!: JQuery; private forceDeleteAllClones?: boolean; constructor() { super(); this.branchIds = null; } doRender() { this.$widget = $(TPL); this.$content = this.$widget.find(".recent-changes-content"); this.$okButton = this.$widget.find(".delete-notes-dialog-ok-button"); this.$cancelButton = this.$widget.find(".delete-notes-dialog-cancel-button"); this.$deleteNotesList = this.$widget.find(".delete-notes-list"); this.$brokenRelationsList = this.$widget.find(".broken-relations-list"); this.$deletedNotesCount = this.$widget.find(".deleted-notes-count"); this.$noNoteToDeleteWrapper = this.$widget.find(".no-note-to-delete-wrapper"); this.$deleteNotesListWrapper = this.$widget.find(".delete-notes-list-wrapper"); this.$brokenRelationsListWrapper = this.$widget.find(".broken-relations-wrapper"); this.$brokenRelationsCount = this.$widget.find(".broke-relations-count"); this.$deleteAllClones = this.$widget.find(".delete-all-clones"); this.$eraseNotes = this.$widget.find(".erase-notes"); this.$widget.on("shown.bs.modal", () => this.$okButton.trigger("focus")); this.$cancelButton.on("click", () => { utils.closeActiveDialog(); this.resolve({ proceed: false }); }); this.$okButton.on("click", () => { utils.closeActiveDialog(); this.resolve({ proceed: true, deleteAllClones: this.forceDeleteAllClones || this.isDeleteAllClonesChecked(), eraseNotes: this.isEraseNotesChecked() }); }); this.$deleteAllClones.on("click", () => this.renderDeletePreview()); } async renderDeletePreview() { const response = await server.post("delete-notes-preview", { branchIdsToDelete: this.branchIds, deleteAllClones: this.forceDeleteAllClones || this.isDeleteAllClonesChecked() }); this.$deleteNotesList.empty(); this.$brokenRelationsList.empty(); this.$deleteNotesListWrapper.toggle(response.noteIdsToBeDeleted.length > 0); this.$noNoteToDeleteWrapper.toggle(response.noteIdsToBeDeleted.length === 0); for (const note of await froca.getNotes(response.noteIdsToBeDeleted)) { this.$deleteNotesList.append($("
  • ").append(await linkService.createLink(note.noteId, { showNotePath: true }))); } this.$deletedNotesCount.text(response.noteIdsToBeDeleted.length); this.$brokenRelationsListWrapper.toggle(response.brokenRelations.length > 0); this.$brokenRelationsCount.text(response.brokenRelations.length); await froca.getNotes(response.brokenRelations.map((br) => br.noteId)); for (const attr of response.brokenRelations) { this.$brokenRelationsList.append( $("
  • ").html( t("delete_notes.deleted_relation_text", { note: (await linkService.createLink(attr.value)).html(), relation: `${attr.name}`, source: (await linkService.createLink(attr.noteId)).html() }) ) ); } } async showDeleteNotesDialogEvent({ branchIdsToDelete, callback, forceDeleteAllClones }: ShowDeleteNotesDialogOpts) { this.branchIds = branchIdsToDelete; this.forceDeleteAllClones = forceDeleteAllClones; await this.renderDeletePreview(); utils.openDialog(this.$widget); this.$deleteAllClones.prop("checked", !!forceDeleteAllClones).prop("disabled", !!forceDeleteAllClones); this.$eraseNotes.prop("checked", false); this.resolve = callback; } isDeleteAllClonesChecked() { return this.$deleteAllClones.is(":checked"); } isEraseNotesChecked() { return this.$eraseNotes.is(":checked"); } }