diff --git a/apps/web/core/components/issues/attachment/attachment-list-item.tsx b/apps/web/core/components/issues/attachment/attachment-list-item.tsx index 870e9e5cd21..962d25e4b3f 100644 --- a/apps/web/core/components/issues/attachment/attachment-list-item.tsx +++ b/apps/web/core/components/issues/attachment/attachment-list-item.tsx @@ -60,14 +60,14 @@ export const IssueAttachmentsListItem = observer(function IssueAttachmentsListIt window.open(fileURL, "_blank"); }} > -
+
{fileIcon}

{`${fileName}.${fileExtension}`}

- {convertBytesToSize(attachment.attributes.size)} + {convertBytesToSize(attachment.attributes.size)}
diff --git a/apps/web/core/components/issues/issue-detail-widgets/attachments/root.tsx b/apps/web/core/components/issues/issue-detail-widgets/attachments/root.tsx index e1a94c7d79e..4a78463bbfa 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/attachments/root.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/attachments/root.tsx @@ -7,13 +7,14 @@ import React from "react"; import { observer } from "mobx-react"; // plane imports +import { Collapsible } from "@makeplane/propel/components/collapsible"; import type { TIssueServiceType } from "@plane/types"; -import { Collapsible } from "@plane/ui"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // local imports import { IssueAttachmentsCollapsibleContent } from "./content"; import { IssueAttachmentsCollapsibleTitle } from "./title"; +import { IssueAttachmentActionButton } from "./quick-action-button"; type Props = { workspaceSlug: string; @@ -33,19 +34,20 @@ export const AttachmentsCollapsible = observer(function AttachmentsCollapsible(p return ( toggleOpenWidget("attachments")} - title={ - + open={isCollapsibleOpen} + onOpenChange={() => toggleOpenWidget("attachments")} + trigger={} + trailing={ + isCollapsibleOpen && !disabled ? ( + + ) : undefined } - buttonClassName="w-full" > ( + return ( + + {t("common.attachments")} -

{attachmentCount}

+

{attachmentCount}

- ), - [attachmentCount] - ); - - return ( - - ) - } - /> +
); }); diff --git a/apps/web/core/components/issues/issue-detail-widgets/links/root.tsx b/apps/web/core/components/issues/issue-detail-widgets/links/root.tsx index bd963868a2e..0f30f4e5287 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/links/root.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/links/root.tsx @@ -7,13 +7,14 @@ import React from "react"; import { observer } from "mobx-react"; // plane imports +import { Collapsible } from "@makeplane/propel/components/collapsible"; import type { TIssueServiceType } from "@plane/types"; -import { Collapsible } from "@plane/ui"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // local imports import { IssueLinksCollapsibleContent } from "./content"; import { IssueLinksCollapsibleTitle } from "./title"; +import { IssueLinksActionButton } from "./quick-action-button"; type Props = { workspaceSlug: string; @@ -32,17 +33,14 @@ export const LinksCollapsible = observer(function LinksCollapsible(props: Props) return ( toggleOpenWidget("links")} - title={ - + open={isCollapsibleOpen} + onOpenChange={() => toggleOpenWidget("links")} + trigger={} + trailing={ + isCollapsibleOpen && !disabled ? ( + + ) : undefined } - buttonClassName="w-full" > ( + return ( + + {t("common.links")} -

{linksCount}

+

{linksCount}

- ), - [linksCount] - ); - - return ( - - } - /> +
); }); diff --git a/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx b/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx index b552380d184..043750fd305 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx @@ -7,10 +7,11 @@ import { useState } from "react"; import { observer } from "mobx-react"; // plane imports +import { Collapsible } from "@makeplane/propel/components/collapsible"; import { useTranslation } from "@plane/i18n"; import type { TIssue, TIssueServiceType, TIssueRelationTypes } from "@plane/types"; import { EIssueServiceType } from "@plane/types"; -import { Collapsible } from "@plane/ui"; +import { cn } from "@plane/utils"; // components import { CreateUpdateIssueModal } from "@/components/issues/issue-modal/modal"; import { useTimeLineRelationOptions } from "@/components/relations"; @@ -137,24 +138,29 @@ export const RelationsCollapsibleContent = observer(function RelationsCollapsibl {filteredRelationsArray.map((relation) => (
- {relation.icon ? relation.icon(14) : null} - {relation.label} -
- } defaultOpen + icon={ + relation.icon ? ( + + {relation.icon(14)} + + ) : undefined + } + trigger={{relation.label}} > - + {/* Cancels this nested Collapsible's own panel inset so rows realign under + the outer Relations collapsible's single inset instead of stacking two. */} +
+ +
))} diff --git a/apps/web/core/components/issues/issue-detail-widgets/relations/root.tsx b/apps/web/core/components/issues/issue-detail-widgets/relations/root.tsx index d1b5d80880d..b18d72c1aa0 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/relations/root.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/relations/root.tsx @@ -7,13 +7,14 @@ import React from "react"; import { observer } from "mobx-react"; // plane imports +import { Collapsible } from "@makeplane/propel/components/collapsible"; import type { TIssueServiceType } from "@plane/types"; -import { Collapsible } from "@plane/ui"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // local imports import { RelationsCollapsibleContent } from "./content"; import { RelationsCollapsibleTitle } from "./title"; +import { RelationActionButton } from "./quick-action-button"; type Props = { workspaceSlug: string; @@ -31,17 +32,14 @@ export const RelationsCollapsible = observer(function RelationsCollapsible(props return ( toggleOpenWidget("relations")} - title={ - + open={isCollapsibleOpen} + onOpenChange={() => toggleOpenWidget("relations")} + trigger={} + trailing={ + isCollapsibleOpen && !disabled ? ( + + ) : undefined } - buttonClassName="w-full" > ( + return ( + + {t("common.relations")} -

{relationsCount}

+

{relationsCount}

- ), - [relationsCount] - ); - - return ( - - } - /> +
); }); diff --git a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-group.tsx b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-group.tsx index 65cd542e658..f6ea11ac99f 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-group.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-group.tsx @@ -7,12 +7,10 @@ import { useState } from "react"; import { observer } from "mobx-react"; import { CircleDashed } from "lucide-react"; +import { Collapsible } from "@makeplane/propel/components/collapsible"; import { ALL_ISSUES } from "@plane/constants"; -import { ChevronRightOutline } from "@makeplane/propel/icons"; import type { IGroupByColumn, TIssue, TIssueServiceType, TSubIssueOperations } from "@plane/types"; import { EIssuesStoreType } from "@plane/types"; -import { Collapsible } from "@plane/ui"; -import { cn } from "@plane/utils"; import { SubIssuesListItem } from "./list-item"; interface TSubIssuesListGroupProps { @@ -57,46 +55,45 @@ export const SubIssuesListGroup = observer(function SubIssuesListGroup(props: TS if (!workItemIds.length) return null; + const items = workItemIds.map((workItemId) => ( + + )); + + if (isAllIssues) return <>{items}; + return ( - <> - setIsCollapsibleOpen(!isCollapsibleOpen)} - title={ - !isAllIssues && ( -
- -
- {group.icon ?? } -
- {group.name} - {workItemIds.length} -
- ) - } - buttonClassName={cn("hidden", !isAllIssues && "block")} - > - {workItemIds?.map((workItemId) => ( - - ))} -
- + + {group.icon ?? } +
+ } + trigger={ + <> + {group.name} + {workItemIds.length} + + } + > + {/* Cancels this nested Collapsible's own panel inset — the outer sub-work-items + Collapsible (root.tsx) already contributes one; without this, grouped rows + would sit inset twice. */} +
{items}
+ ); }); diff --git a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx index 4bc8c79690c..eac612e8d87 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/root.tsx @@ -7,13 +7,14 @@ import React from "react"; import { observer } from "mobx-react"; // plane imports +import { Collapsible } from "@makeplane/propel/components/collapsible"; import type { TIssueServiceType } from "@plane/types"; -import { Collapsible } from "@plane/ui"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // local imports import { SubIssuesCollapsibleContent } from "./content"; import { SubIssuesCollapsibleTitle } from "./title"; +import { SubWorkItemTitleActions } from "./title-actions"; type Props = { workspaceSlug: string; @@ -32,18 +33,19 @@ export const SubIssuesCollapsible = observer(function SubIssuesCollapsible(props return ( toggleOpenWidget("sub-work-items")} - title={ - + open={isCollapsibleOpen} + onOpenChange={() => toggleOpenWidget("sub-work-items")} + trigger={} + trailing={ + isCollapsibleOpen ? ( + + ) : undefined } - buttonClassName="w-full" > - - - {completedCount}/{totalCount} {t("common.done")} - -
- } - actionItemElement={ - + {issueServiceType === EIssueServiceType.EPICS ? t("issue.label", { count: 1 }) : t("common.sub_work_items")} + + - } - /> + + {completedCount}/{totalCount} {t("common.done")} + + + ); }); diff --git a/apps/web/core/components/issues/issue-detail/links/link-list.tsx b/apps/web/core/components/issues/issue-detail/links/link-list.tsx index e691ecba381..937f7e3bd5f 100644 --- a/apps/web/core/components/issues/issue-detail/links/link-list.tsx +++ b/apps/web/core/components/issues/issue-detail/links/link-list.tsx @@ -35,7 +35,7 @@ export const LinkList = observer(function LinkList(props: TLinkList) { if (!issueLinks) return null; return ( -
+
{issueLinks.map((linkId) => ( {isAdmin && searchedInvitationsIds && searchedInvitationsIds.length > 0 && ( - setShowPendingInvites((prev) => !prev)} - buttonClassName="w-full" - className="" - title={ -
-
-

{t("workspace_settings.settings.members.pending_invites")}

- {searchedInvitationsIds && ( - - )} -
{" "} - -
- } - > - +
+ + {t("workspace_settings.settings.members.pending_invites")} + {searchedInvitationsIds && } + + } + >
{searchedInvitationsIds?.map((invitationId) => ( ))}
- -
+ +
)} ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7e8251a913..c1091fa51f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -876,7 +876,7 @@ importers: version: 2.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@makeplane/propel': specifier: 'catalog:' - version: 0.2.0(@date-fns/tz@1.4.1)(@types/react@19.2.17)(date-fns@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.1.17) + version: 0.3.0(@date-fns/tz@1.4.1)(@types/react@19.2.17)(date-fns@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.1.17) '@plane/constants': specifier: workspace:* version: link:../../packages/constants