import { useEffect, useState, useCallback } 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); }); useEffect(() => { if (!selectedOrActiveNoteIds || !bulkActionNote) return; server.post("bulk-action/affected-notes", { noteIds: selectedOrActiveNoteIds, includeDescendants }).then(({ affectedNoteCount }) => setAffectedNoteCount(affectedNoteCount)); }, [ selectedOrActiveNoteIds, includeDescendants, bulkActionNote ]); const refreshExistingActions = useCallback(() => { if (!bulkActionNote) return; setExistingActions(bulk_action.parseActions(bulkActionNote)); }, [bulkActionNote]); useEffect(() => { refreshExistingActions(); }, [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 } }