import { MutableRefObject } from "react"; import { observer } from "mobx-react-lite"; // components import { useCycle, useLabel, useMember, useModule, useProject, useProjectState } from "hooks/store"; import { GroupByColumnTypes, IGroupByColumn, TGroupedIssues, TIssue, IIssueDisplayProperties, IIssueMap, TSubGroupedIssues, TIssueKanbanFilters, TGroupedIssueCount, TPaginationData, } from "@plane/types"; import { getGroupByColumns } from "../utils"; import { KanBan } from "./default"; import { HeaderGroupByCard } from "./headers/group-by-card"; import { HeaderSubGroupByCard } from "./headers/sub-group-by-card"; import { KanbanStoreType } from "./base-kanban-root"; // types // constants interface ISubGroupSwimlaneHeader { getGroupIssueCount: (groupId: string | undefined) => number | undefined; sub_group_by: string | null; group_by: string | null; list: IGroupByColumn[]; kanbanFilters: TIssueKanbanFilters; handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; storeType: KanbanStoreType; } const SubGroupSwimlaneHeader: React.FC = ({ getGroupIssueCount, sub_group_by, group_by, storeType, list, kanbanFilters, handleKanbanFilters, }) => (
{list && list.length > 0 && list.map((_list: IGroupByColumn) => (
))}
); interface ISubGroupSwimlane extends ISubGroupSwimlaneHeader { issuesMap: IIssueMap; groupedIssueIds: TGroupedIssues | TSubGroupedIssues; getGroupIssueCount: (groupId: string | undefined) => number | undefined; getPaginationData: (groupId: string | undefined) => TPaginationData | undefined; showEmptyGroup: boolean; displayProperties: IIssueDisplayProperties | undefined; updateIssue: | ((projectId: string | null | undefined, issueId: string, data: Partial) => Promise) | undefined; quickActions: (issue: TIssue, customActionButton?: React.ReactElement) => React.ReactNode; kanbanFilters: TIssueKanbanFilters; handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; isDragStarted?: boolean; disableIssueCreation?: boolean; storeType: KanbanStoreType; enableQuickIssueCreate: boolean; canEditProperties: (projectId: string | undefined) => boolean; addIssuesToView?: (issueIds: string[]) => Promise; quickAddCallback?: ( workspaceSlug: string, projectId: string, data: TIssue, viewId?: string ) => Promise; viewId?: string; scrollableContainerRef?: MutableRefObject; loadMoreIssues: (groupId?: string, subGroupId?: string) => void; } const SubGroupSwimlane: React.FC = observer((props) => { const { issuesMap, groupedIssueIds, getGroupIssueCount, getPaginationData, sub_group_by, group_by, list, storeType, updateIssue, quickActions, displayProperties, kanbanFilters, handleKanbanFilters, loadMoreIssues, showEmptyGroup, enableQuickIssueCreate, canEditProperties, addIssuesToView, quickAddCallback, viewId, scrollableContainerRef, isDragStarted, } = props; return (
{list && list.length > 0 && list.map((_list: any) => { const issueCount = getGroupIssueCount(_list.id) ?? 0; return (
{!kanbanFilters?.sub_group_by.includes(_list.id) && (
)}
); })}
); }); export interface IKanBanSwimLanes { issuesMap: IIssueMap; groupedIssueIds: TGroupedIssues | TSubGroupedIssues; getGroupIssueCount: (groupId: string | undefined) => number | undefined; getPaginationData: (groupId: string | undefined) => TPaginationData | undefined; displayProperties: IIssueDisplayProperties | undefined; sub_group_by: string | null; group_by: string | null; updateIssue: | ((projectId: string | null | undefined, issueId: string, data: Partial) => Promise) | undefined; quickActions: (issue: TIssue, customActionButton?: React.ReactElement) => React.ReactNode; kanbanFilters: TIssueKanbanFilters; handleKanbanFilters: (toggle: "group_by" | "sub_group_by", value: string) => void; loadMoreIssues: (groupId?: string, subGroupId?: string) => void; showEmptyGroup: boolean; isDragStarted?: boolean; disableIssueCreation?: boolean; storeType: KanbanStoreType; addIssuesToView?: (issueIds: string[]) => Promise; enableQuickIssueCreate: boolean; quickAddCallback?: ( workspaceSlug: string, projectId: string, data: TIssue, viewId?: string ) => Promise; viewId?: string; canEditProperties: (projectId: string | undefined) => boolean; scrollableContainerRef?: MutableRefObject; } export const KanBanSwimLanes: React.FC = observer((props) => { const { issuesMap, groupedIssueIds, getGroupIssueCount, getPaginationData, displayProperties, sub_group_by, group_by, updateIssue, storeType, quickActions, kanbanFilters, handleKanbanFilters, loadMoreIssues, showEmptyGroup, isDragStarted, disableIssueCreation, enableQuickIssueCreate, canEditProperties, addIssuesToView, quickAddCallback, viewId, scrollableContainerRef, } = props; const member = useMember(); const project = useProject(); const label = useLabel(); const cycle = useCycle(); const projectModule = useModule(); const projectState = useProjectState(); const groupByList = getGroupByColumns( group_by as GroupByColumnTypes, project, cycle, projectModule, label, projectState, member ); const subGroupByList = getGroupByColumns( sub_group_by as GroupByColumnTypes, project, cycle, projectModule, label, projectState, member ); if (!groupByList || !subGroupByList) return null; return (
{sub_group_by && ( )}
); });