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={
-