From 8f4f82a9c0825e4db490f4e16a0aee99bdaa968e Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 19 Aug 2024 01:00:03 +0530 Subject: [PATCH 1/8] chore: update issue identifier component. --- .../issues/issue-details/issue-identifier.tsx | 33 +++- .../command-palette/command-modal.tsx | 34 ++-- .../components/command-palette/helpers.tsx | 21 ++- .../modals/bulk-delete-issues-modal-item.tsx | 11 +- .../core/modals/bulk-delete-issues-modal.tsx | 19 +-- .../modals/existing-issues-list-modal.tsx | 22 ++- .../cycles/active-cycle/cycle-stats.tsx | 22 ++- .../widgets/issue-panels/issue-list-item.tsx | 148 ++++++++++++------ .../widgets/issue-panels/issues-list.tsx | 19 +-- .../issues/issue-detail/main-content.tsx | 4 +- .../issues/issue-detail/parent-select.tsx | 21 ++- .../issues/issue-detail/parent/root.tsx | 17 +- .../issue-detail/parent/sibling-item.tsx | 17 +- .../issue-layouts/calendar/issue-block.tsx | 24 +-- .../issues/issue-layouts/gantt/blocks.tsx | 23 +-- .../issues/issue-layouts/kanban/block.tsx | 25 +-- .../issues/issue-layouts/list/block.tsx | 15 +- .../issue-layouts/spreadsheet/issue-row.tsx | 10 +- .../issues/parent-issues-list-modal.tsx | 28 ++-- .../issues/peek-overview/issue-detail.tsx | 2 +- .../components/issues/peek-overview/view.tsx | 2 +- .../issues/relations/issue-list-item.tsx | 16 +- .../issues/sub-issues/issue-list-item.tsx | 21 ++- 23 files changed, 358 insertions(+), 196 deletions(-) diff --git a/web/ce/components/issues/issue-details/issue-identifier.tsx b/web/ce/components/issues/issue-details/issue-identifier.tsx index 8b32a8d3218..019acbac575 100644 --- a/web/ce/components/issues/issue-details/issue-identifier.tsx +++ b/web/ce/components/issues/issue-details/issue-identifier.tsx @@ -1,27 +1,44 @@ import { observer } from "mobx-react"; +// helpers +import { cn } from "@/helpers/common.helper"; // hooks import { useIssueDetail, useProject } from "@/hooks/store"; -type TIssueIdentifierProps = { - issueId: string; +type TIssueIdentifierBaseProps = { projectId: string; + size?: "xs" | "sm" | "md" | "lg"; + textContainerClassName?: string; +}; + +type TIssueIdentifierFromStore = TIssueIdentifierBaseProps & { + issueId: string; +}; + +type TIssueIdentifierWithDetails = TIssueIdentifierBaseProps & { + issueTypeId?: string | null; + projectIdentifier: string; + issueSequenceId: string | number; }; +type TIssueIdentifierProps = TIssueIdentifierFromStore | TIssueIdentifierWithDetails; export const IssueIdentifier: React.FC = observer((props) => { - const { issueId, projectId } = props; + const { projectId, textContainerClassName } = props; // store hooks - const { getProjectById } = useProject(); + const { getProjectIdentifierById } = useProject(); const { issue: { getIssueById }, } = useIssueDetail(); + // Determine if the component is using store data or not + const isUsingStoreData = "issueId" in props; // derived values - const issue = getIssueById(issueId); - const projectDetails = getProjectById(projectId); + const issue = isUsingStoreData ? getIssueById(props.issueId) : null; + const projectIdentifier = isUsingStoreData ? getProjectIdentifierById(projectId) : props.projectIdentifier; + const issueSequenceId = isUsingStoreData ? issue?.sequence_id : props.issueSequenceId; return (
- - {projectDetails?.identifier}-{issue?.sequence_id} + + {projectIdentifier}-{issueSequenceId}
); diff --git a/web/core/components/command-palette/command-modal.tsx b/web/core/components/command-palette/command-modal.tsx index f0c779c55a5..e7b65b44903 100644 --- a/web/core/components/command-palette/command-modal.tsx +++ b/web/core/components/command-palette/command-modal.tsx @@ -7,10 +7,11 @@ import { useParams } from "next/navigation"; import useSWR from "swr"; import { FolderPlus, Search, Settings } from "lucide-react"; import { Dialog, Transition } from "@headlessui/react"; -// icons +// types import { IWorkspaceSearchResults } from "@plane/types"; -// hooks +// ui import { LayersIcon, Loader, ToggleSwitch, Tooltip } from "@plane/ui"; +// components import { ChangeIssueAssignee, ChangeIssuePriority, @@ -23,28 +24,28 @@ import { CommandPaletteWorkspaceSettingsActions, } from "@/components/command-palette"; import { EmptyState } from "@/components/empty-state"; +// constants import { EmptyStateType } from "@/constants/empty-state"; +// fetch-keys import { ISSUE_DETAILS } from "@/constants/fetch-keys"; +// hooks import { useCommandPalette, useEventTracker, useProject, useUser } from "@/hooks/store"; import { useAppRouter } from "@/hooks/use-app-router"; import useDebounce from "@/hooks/use-debounce"; import { usePlatformOS } from "@/hooks/use-platform-os"; -// services +// plane web components +import { IssueIdentifier } from "@/plane-web/components/issues"; +// plane web services import { WorkspaceService } from "@/plane-web/services"; +// services import { IssueService } from "@/services/issue"; -// ui -// components -// types -// fetch-keys -// constants - const workspaceService = new WorkspaceService(); const issueService = new IssueService(); export const CommandModal: React.FC = observer(() => { // hooks - const { getProjectById, workspaceProjectIds } = useProject(); + const { workspaceProjectIds } = useProject(); const { isMobile } = usePlatformOS(); const { canPerformAnyCreateAction } = useUser(); // states @@ -141,8 +142,6 @@ export const CommandModal: React.FC = observer(() => { [debouncedSearchTerm, isWorkspaceLevel, projectId, workspaceSlug] // Only call effect if debounced search term changes ); - const projectDetails = getProjectById(issueDetails?.project_id ?? ""); - return ( setSearchTerm("")} as={React.Fragment}> closePalette()}> @@ -198,8 +197,15 @@ export const CommandModal: React.FC = observer(() => { }`} > {issueDetails && ( -
- {projectDetails?.identifier}-{issueDetails.sequence_id} {issueDetails.name} +
+ {issueDetails.project_id && ( + + )} + {issueDetails.name}
)} {projectId && ( diff --git a/web/core/components/command-palette/helpers.tsx b/web/core/components/command-palette/helpers.tsx index cc3e80bb7ca..cc07f0aaa50 100644 --- a/web/core/components/command-palette/helpers.tsx +++ b/web/core/components/command-palette/helpers.tsx @@ -9,11 +9,14 @@ import { IWorkspaceProjectSearchResult, IWorkspaceSearchResult, } from "@plane/types"; -import { ContrastIcon, DiceIcon, LayersIcon } from "@plane/ui"; +// ui +import { ContrastIcon, DiceIcon } from "@plane/ui"; +// plane web components +import { IssueIdentifier } from "@/plane-web/components/issues"; export const commandGroups: { [key: string]: { - icon: JSX.Element; + icon: JSX.Element | null; itemName: (item: any) => React.ReactNode; path: (item: any, projectId: string | undefined) => string; title: string; @@ -31,14 +34,16 @@ export const commandGroups: { title: "Cycles", }, issue: { - icon: , + icon: null, itemName: (issue: IWorkspaceIssueSearchResult) => ( -
- - {issue.project__identifier}-{issue.sequence_id} - {" "} +
+ {" "} {issue.name} -
+
), path: (issue: IWorkspaceIssueSearchResult) => `/${issue?.workspace__slug}/projects/${issue?.project_id}/issues/${issue?.id}`, diff --git a/web/core/components/core/modals/bulk-delete-issues-modal-item.tsx b/web/core/components/core/modals/bulk-delete-issues-modal-item.tsx index 9947324645d..6fb44d11a0c 100644 --- a/web/core/components/core/modals/bulk-delete-issues-modal-item.tsx +++ b/web/core/components/core/modals/bulk-delete-issues-modal-item.tsx @@ -2,15 +2,16 @@ import { observer } from "mobx-react"; import { Combobox } from "@headlessui/react"; // hooks import { ISearchIssueResponse } from "@plane/types"; +// plane web hooks +import { IssueIdentifier } from "@/plane-web/components/issues"; interface Props { issue: ISearchIssueResponse; canDeleteIssueIds: boolean; - identifier: string | undefined; } export const BulkDeleteIssuesModalItem: React.FC = observer((props: Props) => { - const { issue, canDeleteIssueIds, identifier } = props; + const { issue, canDeleteIssueIds } = props; const color = issue.state__color; @@ -20,7 +21,7 @@ export const BulkDeleteIssuesModalItem: React.FC = observer((props: Props as="div" value={issue.id} className={({ active }) => - `flex cursor-pointer select-none items-center justify-between rounded-md px-3 py-2 ${ + `flex cursor-pointer select-none items-center justify-between rounded-md px-3 py-2 my-0.5 ${ active ? "bg-custom-background-80 text-custom-text-100" : "" }` } @@ -33,9 +34,7 @@ export const BulkDeleteIssuesModalItem: React.FC = observer((props: Props backgroundColor: color, }} /> - - {identifier}-{issue.sequence_id} - + {issue.name} diff --git a/web/core/components/core/modals/bulk-delete-issues-modal.tsx b/web/core/components/core/modals/bulk-delete-issues-modal.tsx index fc1a4cd9aa4..1d397a315e0 100644 --- a/web/core/components/core/modals/bulk-delete-issues-modal.tsx +++ b/web/core/components/core/modals/bulk-delete-issues-modal.tsx @@ -6,22 +6,21 @@ import { useParams } from "next/navigation"; import { SubmitHandler, useForm } from "react-hook-form"; import { Search } from "lucide-react"; import { Combobox, Dialog, Transition } from "@headlessui/react"; -//plane +// types import { ISearchIssueResponse, IUser } from "@plane/types"; +// ui import { Button, Loader, TOAST_TYPE, setToast } from "@plane/ui"; -//components +// components import { EmptyState } from "@/components/empty-state"; -//constants +// constants import { EmptyStateType } from "@/constants/empty-state"; import { EIssuesStoreType } from "@/constants/issue"; -//hooks -import { useIssues, useProject } from "@/hooks/store"; +// hooks +import { useIssues } from "@/hooks/store"; import useDebounce from "@/hooks/use-debounce"; // services import { ProjectService } from "@/services/project"; -// ui -// icons -// components +// local components import { BulkDeleteIssuesModalItem } from "./bulk-delete-issues-modal-item"; type FormInput = { @@ -41,7 +40,6 @@ export const BulkDeleteIssuesModal: React.FC = observer((props) => { // router params const { workspaceSlug, projectId } = useParams(); // hooks - const { getProjectById } = useProject(); const { issues: { removeBulkIssues }, } = useIssues(EIssuesStoreType.PROJECT); @@ -115,8 +113,6 @@ export const BulkDeleteIssuesModal: React.FC = observer((props) => { ); }; - const projectDetails = getProjectById(projectId as string); - const issueList = issues.length > 0 ? (
  • @@ -127,7 +123,6 @@ export const BulkDeleteIssuesModal: React.FC = observer((props) => { {issues.map((issue) => ( diff --git a/web/core/components/core/modals/existing-issues-list-modal.tsx b/web/core/components/core/modals/existing-issues-list-modal.tsx index a07582b8afc..780a8642d09 100644 --- a/web/core/components/core/modals/existing-issues-list-modal.tsx +++ b/web/core/components/core/modals/existing-issues-list-modal.tsx @@ -10,6 +10,8 @@ import { Button, Loader, ToggleSwitch, Tooltip, TOAST_TYPE, setToast } from "@pl // hooks import useDebounce from "@/hooks/use-debounce"; import { usePlatformOS } from "@/hooks/use-platform-os"; +// plane web components +import { IssueIdentifier } from "@/plane-web/components/issues"; // services import { ProjectService } from "@/services/project"; // components @@ -149,7 +151,13 @@ export const ExistingIssuesListModal: React.FC = (props) => { key={issue.id} className="flex items-center gap-1 whitespace-nowrap rounded-md border border-custom-border-200 bg-custom-background-80 py-1 pl-2 text-xs text-custom-text-100" > - {issue.project__identifier}-{issue.sequence_id} +