Skip to content

Commit 316856a

Browse files
[WEB-5599] refactor: enhance Kanban swimlane components with improved props and structure (#8262)
1 parent f41e121 commit 316856a

File tree

1 file changed

+63
-52
lines changed
  • apps/web/core/components/issues/issue-layouts/kanban

1 file changed

+63
-52
lines changed

apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx

Lines changed: 63 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { MutableRefObject } from "react";
22
import { observer } from "mobx-react";
3+
// plane imports
34
import type {
45
GroupByColumnTypes,
56
IGroupByColumn,
@@ -12,33 +13,32 @@ import type {
1213
TIssueGroupByOptions,
1314
TIssueOrderByOptions,
1415
} from "@plane/types";
15-
// UI
1616
import { Row } from "@plane/ui";
1717
// hooks
1818
import { useIssueStoreType } from "@/hooks/use-issue-layout-store";
19-
// components
19+
// plane web imports
2020
import { useWorkFlowFDragNDrop } from "@/plane-web/components/workflow";
21+
// local imports
2122
import type { TRenderQuickActions } from "../list/list-view-types";
2223
import type { GroupDropLocation } from "../utils";
2324
import { getGroupByColumns, isWorkspaceLevel } from "../utils";
2425
import { KanBan } from "./default";
2526
import { HeaderGroupByCard } from "./headers/group-by-card";
2627
import { HeaderSubGroupByCard } from "./headers/sub-group-by-card";
27-
// types
28-
// constants
2928

3029
interface ISubGroupSwimlaneHeader {
30+
collapsedGroups: TIssueKanbanFilters;
31+
group_by: TIssueGroupByOptions | undefined;
3132
getGroupIssueCount: (
3233
groupId: string | undefined,
3334
subGroupId: string | undefined,
3435
isSubGroupCumulative: boolean
3536
) => number | undefined;
36-
sub_group_by: TIssueGroupByOptions | undefined;
37-
group_by: TIssueGroupByOptions | undefined;
38-
list: IGroupByColumn[];
39-
collapsedGroups: TIssueKanbanFilters;
4037
handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void;
38+
isEpic?: boolean;
39+
list: IGroupByColumn[];
4140
showEmptyGroup: boolean;
41+
sub_group_by: TIssueGroupByOptions | undefined;
4242
}
4343

4444
const visibilitySubGroupByGroupCount = (subGroupIssueCount: number, showEmptyGroup: boolean): boolean => {
@@ -54,13 +54,14 @@ const visibilitySubGroupByGroupCount = (subGroupIssueCount: number, showEmptyGro
5454
};
5555

5656
const SubGroupSwimlaneHeader = observer(function SubGroupSwimlaneHeader({
57+
collapsedGroups,
5758
getGroupIssueCount,
58-
sub_group_by,
5959
group_by,
60-
list,
61-
collapsedGroups,
6260
handleCollapsedGroups,
61+
isEpic = false,
62+
list,
6363
showEmptyGroup,
64+
sub_group_by,
6465
}: ISubGroupSwimlaneHeader) {
6566
const { getIsWorkflowWorkItemCreationDisabled } = useWorkFlowFDragNDrop(group_by, sub_group_by);
6667

@@ -88,6 +89,7 @@ const SubGroupSwimlaneHeader = observer(function SubGroupSwimlaneHeader({
8889
handleCollapsedGroups={handleCollapsedGroups}
8990
issuePayload={_list.payload}
9091
disableIssueCreation={getIsWorkflowWorkItemCreationDisabled(_list.id)}
92+
isEpic={isEpic}
9193
/>
9294
</div>
9395
);
@@ -97,53 +99,55 @@ const SubGroupSwimlaneHeader = observer(function SubGroupSwimlaneHeader({
9799
});
98100

99101
interface ISubGroupSwimlane extends ISubGroupSwimlaneHeader {
100-
issuesMap: IIssueMap;
101-
groupedIssueIds: TGroupedIssues | TSubGroupedIssues;
102+
addIssuesToView?: (issueIds: string[]) => Promise<TIssue>;
103+
canEditProperties: (projectId: string | undefined) => boolean;
104+
collapsedGroups: TIssueKanbanFilters;
105+
disableIssueCreation?: boolean;
106+
displayProperties: IIssueDisplayProperties | undefined;
107+
enableQuickIssueCreate: boolean;
102108
getGroupIssueCount: (
103109
groupId: string | undefined,
104110
subGroupId: string | undefined,
105111
isSubGroupCumulative: boolean
106112
) => number | undefined;
107-
showEmptyGroup: boolean;
108-
displayProperties: IIssueDisplayProperties | undefined;
109-
updateIssue: ((projectId: string | null, issueId: string, data: Partial<TIssue>) => Promise<void>) | undefined;
110-
quickActions: TRenderQuickActions;
111-
collapsedGroups: TIssueKanbanFilters;
113+
groupedIssueIds: TGroupedIssues | TSubGroupedIssues;
112114
handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void;
113115
handleOnDrop: (source: GroupDropLocation, destination: GroupDropLocation) => Promise<void>;
114-
disableIssueCreation?: boolean;
115-
enableQuickIssueCreate: boolean;
116+
isEpic?: boolean;
117+
issuesMap: IIssueMap;
118+
loadMoreIssues: (groupId?: string, subGroupId?: string) => void;
116119
orderBy: TIssueOrderByOptions | undefined;
117-
canEditProperties: (projectId: string | undefined) => boolean;
118-
addIssuesToView?: (issueIds: string[]) => Promise<TIssue>;
120+
quickActions: TRenderQuickActions;
119121
quickAddCallback?: (projectId: string | null | undefined, data: TIssue) => Promise<TIssue | undefined>;
120122
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
121-
loadMoreIssues: (groupId?: string, subGroupId?: string) => void;
123+
showEmptyGroup: boolean;
124+
updateIssue: ((projectId: string | null, issueId: string, data: Partial<TIssue>) => Promise<void>) | undefined;
122125
}
123126

124127
const SubGroupSwimlane = observer(function SubGroupSwimlane(props: ISubGroupSwimlane) {
125128
const {
126-
issuesMap,
127-
groupedIssueIds,
129+
addIssuesToView,
130+
canEditProperties,
131+
collapsedGroups,
132+
disableIssueCreation,
133+
displayProperties,
134+
enableQuickIssueCreate,
128135
getGroupIssueCount,
129-
sub_group_by,
130136
group_by,
131-
list,
132-
updateIssue,
133-
quickActions,
134-
displayProperties,
135-
collapsedGroups,
137+
groupedIssueIds,
136138
handleCollapsedGroups,
139+
handleOnDrop,
140+
isEpic = false,
141+
issuesMap,
142+
list,
137143
loadMoreIssues,
138-
showEmptyGroup,
139-
enableQuickIssueCreate,
140-
disableIssueCreation,
141-
canEditProperties,
142-
addIssuesToView,
144+
orderBy,
145+
quickActions,
143146
quickAddCallback,
144147
scrollableContainerRef,
145-
handleOnDrop,
146-
orderBy,
148+
showEmptyGroup,
149+
sub_group_by,
150+
updateIssue,
147151
} = props;
148152

149153
const visibilitySubGroupBy = (
@@ -214,6 +218,7 @@ const SubGroupSwimlane = observer(function SubGroupSwimlane(props: ISubGroupSwim
214218
orderBy={orderBy}
215219
isDropDisabled={_list.isDropDisabled}
216220
dropErrorMessage={_list.dropErrorMessage}
221+
isEpic={isEpic}
217222
/>
218223
</div>
219224
)}
@@ -225,30 +230,31 @@ const SubGroupSwimlane = observer(function SubGroupSwimlane(props: ISubGroupSwim
225230
});
226231

227232
export interface IKanBanSwimLanes {
228-
issuesMap: IIssueMap;
229-
groupedIssueIds: TGroupedIssues | TSubGroupedIssues;
233+
addIssuesToView?: (issueIds: string[]) => Promise<TIssue>;
234+
canEditProperties: (projectId: string | undefined) => boolean;
235+
collapsedGroups: TIssueKanbanFilters;
236+
disableIssueCreation?: boolean;
237+
displayProperties: IIssueDisplayProperties | undefined;
238+
enableQuickIssueCreate: boolean;
230239
getGroupIssueCount: (
231240
groupId: string | undefined,
232241
subGroupId: string | undefined,
233242
isSubGroupCumulative: boolean
234243
) => number | undefined;
235-
displayProperties: IIssueDisplayProperties | undefined;
236-
sub_group_by: TIssueGroupByOptions | undefined;
237244
group_by: TIssueGroupByOptions | undefined;
238-
updateIssue: ((projectId: string | null, issueId: string, data: Partial<TIssue>) => Promise<void>) | undefined;
239-
quickActions: TRenderQuickActions;
240-
collapsedGroups: TIssueKanbanFilters;
245+
groupedIssueIds: TGroupedIssues | TSubGroupedIssues;
241246
handleCollapsedGroups: (toggle: "group_by" | "sub_group_by", value: string) => void;
242-
loadMoreIssues: (groupId?: string, subGroupId?: string) => void;
243-
showEmptyGroup: boolean;
244247
handleOnDrop: (source: GroupDropLocation, destination: GroupDropLocation) => Promise<void>;
245-
disableIssueCreation?: boolean;
246-
addIssuesToView?: (issueIds: string[]) => Promise<TIssue>;
247-
enableQuickIssueCreate: boolean;
248+
isEpic?: boolean;
249+
issuesMap: IIssueMap;
250+
loadMoreIssues: (groupId?: string, subGroupId?: string) => void;
251+
orderBy: TIssueOrderByOptions | undefined;
252+
quickActions: TRenderQuickActions;
248253
quickAddCallback?: (projectId: string | null | undefined, data: TIssue) => Promise<TIssue | undefined>;
249-
canEditProperties: (projectId: string | undefined) => boolean;
250254
scrollableContainerRef?: MutableRefObject<HTMLDivElement | null>;
251-
orderBy: TIssueOrderByOptions | undefined;
255+
showEmptyGroup: boolean;
256+
sub_group_by: TIssueGroupByOptions | undefined;
257+
updateIssue: ((projectId: string | null, issueId: string, data: Partial<TIssue>) => Promise<void>) | undefined;
252258
}
253259

254260
export const KanBanSwimLanes = observer(function KanBanSwimLanes(props: IKanBanSwimLanes) {
@@ -273,6 +279,7 @@ export const KanBanSwimLanes = observer(function KanBanSwimLanes(props: IKanBanS
273279
addIssuesToView,
274280
quickAddCallback,
275281
scrollableContainerRef,
282+
isEpic = false,
276283
} = props;
277284
// store hooks
278285
const storeType = useIssueStoreType();
@@ -281,11 +288,13 @@ export const KanBanSwimLanes = observer(function KanBanSwimLanes(props: IKanBanS
281288
groupBy: group_by as GroupByColumnTypes,
282289
includeNone: true,
283290
isWorkspaceLevel: isWorkspaceLevel(storeType),
291+
isEpic: isEpic,
284292
});
285293
const subGroupByList = getGroupByColumns({
286294
groupBy: sub_group_by as GroupByColumnTypes,
287295
includeNone: true,
288296
isWorkspaceLevel: isWorkspaceLevel(storeType),
297+
isEpic: isEpic,
289298
});
290299

291300
if (!groupByList || !subGroupByList) return null;
@@ -301,6 +310,7 @@ export const KanBanSwimLanes = observer(function KanBanSwimLanes(props: IKanBanS
301310
handleCollapsedGroups={handleCollapsedGroups}
302311
list={groupByList}
303312
showEmptyGroup={showEmptyGroup}
313+
isEpic={isEpic}
304314
/>
305315
</Row>
306316

@@ -327,6 +337,7 @@ export const KanBanSwimLanes = observer(function KanBanSwimLanes(props: IKanBanS
327337
canEditProperties={canEditProperties}
328338
quickAddCallback={quickAddCallback}
329339
scrollableContainerRef={scrollableContainerRef}
340+
isEpic={isEpic}
330341
/>
331342
)}
332343
</div>

0 commit comments

Comments
 (0)