* feat: add project shortcut in command palette * feat: global project switcher shortcut * refactor: generalize command palette entity handling * feat: extend command palette navigation * feat: add issue shortcut to command palette * feat: add modular project selection for cycle navigation * chore: add reusable command palette utilities * fix: update key sequence handling to use window methods for timeout management * fix: build errors * chore: minor ux copy improvements * feat: implement a new command registry and renderer for enhanced command palette functionality * feat: introduce new command palette components and enhance search functionality * feat: enhance command palette components with improved initialization and loading indicators * feat: Implement new command palette architecture with multi-step commands, context-aware filtering, and reusable components. Add comprehensive documentation and integration guides. Enhance command execution with a dedicated executor and context provider. Introduce new command types and improve existing command definitions for better usability and maintainability. * refactor: hook arguments * refactor: folder structure * refactor: update import paths * fix: context prop drilling * refactor: update search components * refactor: create actions * chore: add type to pages * chore: init contextual actions * refactor: context based actions code split * chore: module context-based actions * refactor: streamline command execution flow and enhance multi-step handling in command palette * refactor: remove placeholder management from command execution and implement centralized placeholder mapping * chore: cycle context based actions * refactor: simplify command execution by consolidating selection steps and adding page change handling * chore: added more options to work item contextual actions * chore: page context actions * refactor: update step type definitions and enhance page mapping for command execution * feat: implement Command Palette V2 with global shortcuts and enhanced context handling * refactor: power k v2 * refactor: creation commands * feat: add navigation utility for Power K context handling * feat: implement comprehensive navigation commands for Power K * refactor: work item contextual actions * fix: build errors * refactor: remaining contextual actions * refactor: remove old code * chore: update placeholder * refactor: enhance command registry with observable properties and context-aware shortcut handling * refactor: improve command filtering logic in CommandPaletteModal * chore: context indicator * chore: misc actions * style: shortcut badge * feat: add open entity actions and enhance navigation commands for Power K * refactor: rename and reorganize Power K components for improved clarity and structure * refactor: update CommandPalette components and streamline global shortcuts handling * refactor: adjust debounce timing in CommandPaletteModal for improved responsiveness * feat: implement shortcuts modal and enhance command registry for better shortcut management * fix: search implemented * refactor: search results code split * refactor: search results code split * feat: introduce creation and navigation command modules for Power K, enhancing command organization and functionality * chore: update menu logos * refactor: remove unused PowerKOpenEntityActionsExtended component from command palette * refactor: search menu * fix: clear context on backspace and manual clear * refactor: rename creation command keys for consistency and clarity in Power K * chore: added intake in global search * chore: preferences menu * chore: removed the empty serach params * revert: command palette changes * cleanup * refactor: update command IDs to use underscores for consistency across Power K components * refactor: extended context based actions * chore: modal command item status props * refactor: replace CommandPalette with CommandPaletteProvider in settings and profile layouts * refactor: update settings menu to use translated labels instead of i18n labels * refactor: update command titles to use translation keys for creation actions * refactor: update navigation command titles to use translation keys for consistency * chore: minor cleanup * chore: misc commands added * chore: code split for no search results command * chore: state menu items for work item context based commands * chore: add more props to no search results command * chore: add more props to no search results command * refactor: remove shortcut key for create workspace command * Refactor command palette to use PowerK store - Replaced instances of `useCommandPalette` with `usePowerK` across various components, including `AppSearch`, `CommandModal`, and `CommandPalette`. - Introduced `PowerKStore` to manage modal states and commands, enhancing the command palette functionality. - Updated modal handling to toggle `PowerKModal` and `ShortcutsListModal` instead of the previous command palette modals. - Refactored related components to ensure compatibility with the new store structure and maintain functionality. * Refactor PowerK command handling to remove context dependency - Updated `usePowerKCommands` and `usePowerKCreationCommands` to eliminate the need for a context parameter, simplifying their usage. - Adjusted related command records to utilize the new structure, ensuring consistent access to command configurations. - Enhanced permission checks in creation commands to utilize user project roles for better access control. * chore: add context indicator * chore: update type import * chore: migrate toast implementation from @plane/ui to @plane/propel/toast across multiple command files * refactor: power k modal wrapper and provider * fix: type imports * chore: update creation command shortcuts * fix: page context commands * chore: update navigation and open command shortcuts * fix: work item standalone page modals * fix: context indicator visibility * fix: potential error points * fix: build errors * fix: lint errors * fix: import order --------- Co-authored-by: Vihar Kurama <vihar.kurama@gmail.com> Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com> Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
105 lines
4 KiB
TypeScript
105 lines
4 KiB
TypeScript
import type { FC } from "react";
|
|
import { observer } from "mobx-react";
|
|
import { useParams } from "next/navigation";
|
|
// plane imports
|
|
import type { TIssue } from "@plane/types";
|
|
import { EIssueServiceType, EIssuesStoreType } from "@plane/types";
|
|
// components
|
|
import { BulkDeleteIssuesModal } from "@/components/core/modals/bulk-delete-issues-modal";
|
|
import { DeleteIssueModal } from "@/components/issues/delete-issue-modal";
|
|
import { CreateUpdateIssueModal } from "@/components/issues/issue-modal/modal";
|
|
// hooks
|
|
import { useCommandPalette } from "@/hooks/store/use-command-palette";
|
|
import { useIssueDetail } from "@/hooks/store/use-issue-detail";
|
|
import { useUser } from "@/hooks/store/user";
|
|
import { useAppRouter } from "@/hooks/use-app-router";
|
|
import { useIssuesActions } from "@/hooks/use-issues-actions";
|
|
|
|
export type TWorkItemLevelModalsProps = {
|
|
workItemIdentifier: string | undefined;
|
|
};
|
|
|
|
export const WorkItemLevelModals: FC<TWorkItemLevelModalsProps> = observer((props) => {
|
|
const { workItemIdentifier } = props;
|
|
// router
|
|
const { workspaceSlug, cycleId, moduleId } = useParams();
|
|
const router = useAppRouter();
|
|
// store hooks
|
|
const { data: currentUser } = useUser();
|
|
const {
|
|
issue: { getIssueById, getIssueIdByIdentifier },
|
|
} = useIssueDetail();
|
|
// derived values
|
|
const workItemId = workItemIdentifier ? getIssueIdByIdentifier(workItemIdentifier) : undefined;
|
|
const workItemDetails = workItemId ? getIssueById(workItemId) : undefined;
|
|
|
|
const { removeIssue: removeEpic } = useIssuesActions(EIssuesStoreType.EPIC);
|
|
const { removeIssue: removeWorkItem } = useIssuesActions(EIssuesStoreType.PROJECT);
|
|
|
|
const {
|
|
isCreateIssueModalOpen,
|
|
toggleCreateIssueModal,
|
|
isDeleteIssueModalOpen,
|
|
toggleDeleteIssueModal,
|
|
isBulkDeleteIssueModalOpen,
|
|
toggleBulkDeleteIssueModal,
|
|
createWorkItemAllowedProjectIds,
|
|
} = useCommandPalette();
|
|
// derived values
|
|
const { fetchSubIssues: fetchSubWorkItems } = useIssueDetail();
|
|
const { fetchSubIssues: fetchEpicSubWorkItems } = useIssueDetail(EIssueServiceType.EPICS);
|
|
|
|
const handleDeleteIssue = async (workspaceSlug: string, projectId: string, issueId: string) => {
|
|
try {
|
|
const isEpic = workItemDetails?.is_epic;
|
|
const deleteAction = isEpic ? removeEpic : removeWorkItem;
|
|
const redirectPath = `/${workspaceSlug}/projects/${projectId}/${isEpic ? "epics" : "issues"}`;
|
|
|
|
await deleteAction(projectId, issueId);
|
|
router.push(redirectPath);
|
|
} catch (error) {
|
|
console.error("Failed to delete issue:", error);
|
|
}
|
|
};
|
|
|
|
const handleCreateIssueSubmit = async (newIssue: TIssue) => {
|
|
if (!workspaceSlug || !newIssue.project_id || !newIssue.id || newIssue.parent_id !== workItemDetails?.id) return;
|
|
|
|
const fetchAction = workItemDetails?.is_epic ? fetchEpicSubWorkItems : fetchSubWorkItems;
|
|
await fetchAction(workspaceSlug?.toString(), newIssue.project_id, workItemDetails.id);
|
|
};
|
|
|
|
const getCreateIssueModalData = () => {
|
|
if (cycleId) return { cycle_id: cycleId.toString() };
|
|
if (moduleId) return { module_ids: [moduleId.toString()] };
|
|
return undefined;
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<CreateUpdateIssueModal
|
|
isOpen={isCreateIssueModalOpen}
|
|
onClose={() => toggleCreateIssueModal(false)}
|
|
data={getCreateIssueModalData()}
|
|
onSubmit={handleCreateIssueSubmit}
|
|
allowedProjectIds={createWorkItemAllowedProjectIds}
|
|
/>
|
|
{workspaceSlug && workItemId && workItemDetails && workItemDetails.project_id && (
|
|
<DeleteIssueModal
|
|
handleClose={() => toggleDeleteIssueModal(false)}
|
|
isOpen={isDeleteIssueModalOpen}
|
|
data={workItemDetails}
|
|
onSubmit={() =>
|
|
handleDeleteIssue(workspaceSlug.toString(), workItemDetails.project_id!, workItemId?.toString())
|
|
}
|
|
isEpic={workItemDetails?.is_epic}
|
|
/>
|
|
)}
|
|
<BulkDeleteIssuesModal
|
|
isOpen={isBulkDeleteIssueModalOpen}
|
|
onClose={() => toggleBulkDeleteIssueModal(false)}
|
|
user={currentUser}
|
|
/>
|
|
</>
|
|
);
|
|
});
|