import { useEffect, useState } from "preact/hooks"; import { t } from "../../services/i18n"; import Modal from "../react/Modal"; import ReactBasicWidget from "../react/ReactBasicWidget"; import "./bulk_actions.css"; import { BulkActionAffectedNotes } from "@triliumnext/commons"; import server from "../../services/server"; import FormCheckbox from "../react/FormCheckbox"; import Button from "../react/Button"; import bulk_action from "../../services/bulk_action"; import toast from "../../services/toast"; import RenameNoteBulkAction from "../bulk_actions/note/rename_note"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; import useTriliumEvent from "../react/hooks"; function BulkActionComponent() { const [ selectedOrActiveNoteIds, setSelectedOrActiveNoteIds ] = useState(); const [ bulkActionNote, setBulkActionNote ] = useState(); const [ includeDescendants, setIncludeDescendants ] = useState(false); const [ affectedNoteCount, setAffectedNoteCount ] = useState(0); const [ existingActions, setExistingActions ] = useState([]); const [ shown, setShown ] = useState(false); useTriliumEvent("openBulkActionsDialog", async ({ selectedOrActiveNoteIds }) => { setSelectedOrActiveNoteIds(selectedOrActiveNoteIds); setBulkActionNote(await froca.getNote("_bulkAction")); setShown(true); }); if (selectedOrActiveNoteIds && bulkActionNote) { useEffect(() => { server.post("bulk-action/affected-notes", { noteIds: selectedOrActiveNoteIds, includeDescendants }).then(({ affectedNoteCount }) => setAffectedNoteCount(affectedNoteCount)); }, [ selectedOrActiveNoteIds, includeDescendants ]); function refreshExistingActions() { setExistingActions(bulk_action.parseActions(bulkActionNote!)); } useEffect(() => refreshExistingActions(), []); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { if (loadResults.getAttributeRows().find((row) => row.type === "label" && row.name === "action" && row.noteId === "_bulkAction")) { refreshExistingActions(); } }, shown); } return ( } show={shown} onSubmit={async () => { await server.post("bulk-action/execute", { noteIds: selectedOrActiveNoteIds, includeDescendants }); toast.showMessage(t("bulk_actions.bulk_actions_executed"), 3000); setShown(false); }} onHidden={() => setShown(false)} >

{t("bulk_actions.affected_notes")}: {affectedNoteCount}

{t("bulk_actions.available_actions")}

{t("bulk_actions.chosen_actions")}

) } function AvailableActionsList() { return {bulk_action.ACTION_GROUPS.map((actionGroup) => { return ( {actionGroup.actions.map(({ actionName, actionTitle }) => ); })}
{ actionGroup.title }:
; } function ExistingActionsList({ existingActions }: { existingActions?: RenameNoteBulkAction[] }) { return ( { existingActions ? existingActions .map(action => action.doRender()) .filter(renderedAction => renderedAction !== null) :

{t("bulk_actions.none_yet")}

}
); } export default class BulkActionsDialog extends ReactBasicWidget { get component() { return } }