import { ConvertToAttachmentResponse } from "@triliumnext/commons"; import appContext, { CommandNames } from "../../components/app_context"; import FNote from "../../entities/fnote" import dialog from "../../services/dialog"; import { t } from "../../services/i18n" import server from "../../services/server"; import toast from "../../services/toast"; import ws from "../../services/ws"; import ActionButton from "../react/ActionButton" import Dropdown from "../react/Dropdown"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { isElectron as getIsElectron, isMac as getIsMac } from "../../services/utils"; import { ParentComponent } from "../react/react_utils"; import { useContext } from "preact/hooks"; import NoteContext from "../../components/note_context"; import branches from "../../services/branches"; interface NoteActionsProps { note?: FNote; noteContext?: NoteContext; } export default function NoteActions({ note, noteContext }: NoteActionsProps) { return ( <> {note && } {note && note.type !== "launcher" && } ); } function RevisionsButton({ note }: { note: FNote }) { const isEnabled = !["launcher", "doc"].includes(note?.type ?? ""); return (isEnabled && ); } function NoteContextMenu({ note, noteContext }: { note: FNote, noteContext?: NoteContext }) { const parentComponent = useContext(ParentComponent); const canBeConvertedToAttachment = note?.isEligibleForConversionToAttachment(); const isSearchable = ["text", "code", "book", "mindMap", "doc"].includes(note.type); const isInOptionsOrHelp = note?.noteId.startsWith("_options") || note?.noteId.startsWith("_help"); const isPrintable = ["text", "code"].includes(note.type) || (note.type === "book" && note.getLabelValue("viewType") === "presentation"); const isElectron = getIsElectron(); const isMac = getIsMac(); const hasSource = ["text", "code", "relationMap", "mermaid", "canvas", "mindMap", "aiChat"].includes(note.type); const isSearchOrBook = ["search", "book"].includes(note.type); return ( {canBeConvertedToAttachment && } {note.type === "render" && } {isElectron && } parentComponent?.triggerCommand("showImportDialog", { noteId: note.noteId })} /> noteContext?.notePath && parentComponent?.triggerCommand("showExportDialog", { notePath: noteContext.notePath, defaultType: "single" })} /> branches.deleteNotes([note.getParentBranches()[0].branchId])} /> ); } function CommandItem({ icon, text, title, command, disabled }: { icon: string, text: string, title?: string, command: CommandNames | (() => void), disabled?: boolean, destructive?: boolean }) { return {text} } function ConvertToAttachment({ note }: { note: FNote }) { return ( { if (!note || !(await dialog.confirm(t("note_actions.convert_into_attachment_prompt", { title: note.title })))) { return; } const { attachment: newAttachment } = await server.post(`notes/${note.noteId}/convert-to-attachment`); if (!newAttachment) { toast.showMessage(t("note_actions.convert_into_attachment_failed", { title: note.title })); return; } toast.showMessage(t("note_actions.convert_into_attachment_successful", { title: newAttachment.title })); await ws.waitForMaxKnownEntityChangeId(); await appContext.tabManager.getActiveContext()?.setNote(newAttachment.ownerId, { viewScope: { viewMode: "attachments", attachmentId: newAttachment.attachmentId } }); }} >{t("note_actions.convert_into_attachment")} ) }