diff --git a/apps/web/core/components/issues/issue-layouts/list/block-root.tsx b/apps/web/core/components/issues/issue-layouts/list/block-root.tsx index 443d84612b7..94b1b59f438 100644 --- a/apps/web/core/components/issues/issue-layouts/list/block-root.tsx +++ b/apps/web/core/components/issues/issue-layouts/list/block-root.tsx @@ -13,7 +13,7 @@ import { observer } from "mobx-react"; // plane helpers import { useOutsideClickDetector } from "@plane/hooks"; // types -import type { IIssueDisplayProperties, TIssue, TIssueMap } from "@plane/types"; +import type { IIssueDisplayProperties, TIssue, TIssueMap, TIssueOrderByOptions } from "@plane/types"; import { EIssueServiceType } from "@plane/types"; // components import { DropIndicator } from "@plane/ui"; @@ -21,6 +21,9 @@ import RenderIfVisible from "@/components/core/render-if-visible-HOC"; import { ListLoaderItemRow } from "@/components/ui/loader/layouts/list-layout-loader"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; +import { useIssues } from "@/hooks/store/use-issues"; +import type { IBaseIssuesStore } from "@/store/issue/helpers/base-issues.store"; +import { useIssueStoreType } from "@/hooks/use-issue-layout-store"; import type { TSelectionHelper } from "@/hooks/use-multiple-select"; import { usePlatformOS } from "@/hooks/use-platform-os"; // types @@ -45,6 +48,7 @@ type Props = { isParentIssueBeingDragged?: boolean; isLastChild?: boolean; shouldRenderByDefault?: boolean; + orderBy: TIssueOrderByOptions | undefined; isEpic?: boolean; }; @@ -66,6 +70,7 @@ export const IssueBlockRoot = observer(function IssueBlockRoot(props: Props) { isLastChild = false, selectionHelpers, shouldRenderByDefault, + orderBy, isEpic = false, } = props; // states @@ -78,6 +83,8 @@ export const IssueBlockRoot = observer(function IssueBlockRoot(props: Props) { const { isMobile } = usePlatformOS(); // store hooks const { subIssues: subIssuesStore } = useIssueDetail(isEpic ? EIssueServiceType.EPICS : EIssueServiceType.ISSUES); + const storeType = useIssueStoreType(); + const { issues } = useIssues(storeType); const isSubIssue = nestingLevel !== 0; @@ -129,7 +136,11 @@ export const IssueBlockRoot = observer(function IssueBlockRoot(props: Props) { if (!issueId || !issuesMap[issueId]?.created_at) return null; - const subIssues = subIssuesStore.subIssuesByIssueId(issueId); + const subIssueIds = subIssuesStore.subIssuesByIssueId(issueId); + const subIssues = + orderBy && subIssueIds?.length && "issuesSortWithOrderBy" in issues + ? (issues as IBaseIssuesStore).issuesSortWithOrderBy(subIssueIds, orderBy) + : subIssueIds; return (
@@ -164,7 +175,7 @@ export const IssueBlockRoot = observer(function IssueBlockRoot(props: Props) { {isExpanded && !isEpic && - subIssues?.map((subIssueId) => ( + subIssues?.map((subIssueId: string) => ( ))} {isLastChild && } diff --git a/apps/web/core/components/issues/issue-layouts/list/blocks-list.tsx b/apps/web/core/components/issues/issue-layouts/list/blocks-list.tsx index cc3690900c2..114627e34d9 100644 --- a/apps/web/core/components/issues/issue-layouts/list/blocks-list.tsx +++ b/apps/web/core/components/issues/issue-layouts/list/blocks-list.tsx @@ -6,7 +6,7 @@ import type { MutableRefObject } from "react"; // components -import type { TIssue, IIssueDisplayProperties, TIssueMap, TGroupedIssues } from "@plane/types"; +import type { TIssue, IIssueDisplayProperties, TIssueMap, TGroupedIssues, TIssueOrderByOptions } from "@plane/types"; // hooks import type { TSelectionHelper } from "@/hooks/use-multiple-select"; // types @@ -25,6 +25,7 @@ interface Props { isDragAllowed: boolean; canDropOverIssue: boolean; selectionHelpers: TSelectionHelper; + orderBy: TIssueOrderByOptions | undefined; isEpic?: boolean; } @@ -41,6 +42,7 @@ export function IssueBlocksList(props: Props) { selectionHelpers, isDragAllowed, canDropOverIssue, + orderBy, isEpic = false, } = props; @@ -65,6 +67,7 @@ export function IssueBlocksList(props: Props) { isLastChild={index === issueIds.length - 1} isDragAllowed={isDragAllowed} canDropOverIssue={canDropOverIssue} + orderBy={orderBy} isEpic={isEpic} /> ))} diff --git a/apps/web/core/components/issues/issue-layouts/list/list-group.tsx b/apps/web/core/components/issues/issue-layouts/list/list-group.tsx index 5c8f56fb949..e19cb989a7e 100644 --- a/apps/web/core/components/issues/issue-layouts/list/list-group.tsx +++ b/apps/web/core/components/issues/issue-layouts/list/list-group.tsx @@ -132,14 +132,15 @@ export const ListGroup = observer(function ListGroup(props: Props) { const loadMore = isPaginating ? ( ) : ( -
loadMoreIssues(group.id)} > {t("common.load_more")} ↓ -
+ ); const validateEmptyIssueGroups = (issueCount: number = 0) => { @@ -198,7 +199,9 @@ export const ListGroup = observer(function ListGroup(props: Props) { const sourceGroupId = source?.data?.groupId as string | undefined; const currentGroupId = group.id; - sourceGroupId && handleWorkFlowState(sourceGroupId, currentGroupId); + if (sourceGroupId) { + handleWorkFlowState(sourceGroupId, currentGroupId); + } const sourceIndex = getGroupIndex(sourceGroupId); const currentIndex = getGroupIndex(currentGroupId); @@ -237,13 +240,17 @@ export const ListGroup = observer(function ListGroup(props: Props) { }) ); }, [ - groupRef?.current, group, orderBy, getGroupIndex, setDragColumnOrientation, setIsDraggingOverColumn, isWorkflowDropDisabled, + handleCollapsedGroups, + t, + handleWorkFlowState, + handleOnDrop, + isExpanded, ]); const isDragAllowed = group_by ? DRAG_ALLOWED_GROUPS.includes(group_by) : true; @@ -308,6 +315,7 @@ export const ListGroup = observer(function ListGroup(props: Props) { isDragAllowed={isDragAllowed} canDropOverIssue={!canOverlayBeVisible} selectionHelpers={selectionHelpers} + orderBy={orderBy} isEpic={isEpic} /> )} @@ -317,8 +325,8 @@ export const ListGroup = observer(function ListGroup(props: Props) { <>{loadMore} ) : ( <> - {Array.from({ length: 2 }).map((_, index) => ( - + {(["list-group-loader-1", "list-group-loader-2"] as const).map((loaderKey) => ( + ))} diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx index 6d060c4dbd3..073b7956c7f 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx @@ -15,7 +15,7 @@ import { useOutsideClickDetector } from "@plane/hooks"; import { ChevronRightIcon } from "@plane/propel/icons"; // types import { Tooltip } from "@plane/propel/tooltip"; -import type { IIssueDisplayProperties, TIssue } from "@plane/types"; +import type { IIssueDisplayProperties, TIssue, TIssueOrderByOptions } from "@plane/types"; import { EIssueServiceType } from "@plane/types"; // ui import { ControlLink, Row } from "@plane/ui"; @@ -27,6 +27,8 @@ import RenderIfVisible from "@/components/core/render-if-visible-HOC"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; import { useIssues } from "@/hooks/store/use-issues"; +import type { IBaseIssuesStore } from "@/store/issue/helpers/base-issues.store"; +import { useIssueStoreType } from "@/hooks/use-issue-layout-store"; import { useProject } from "@/hooks/store/use-project"; import useIssuePeekOverviewRedirection from "@/hooks/use-issue-peek-overview-redirection"; import type { TSelectionHelper } from "@/hooks/use-multiple-select"; @@ -53,6 +55,7 @@ interface Props { spacingLeft?: number; selectionHelpers: TSelectionHelper; shouldRenderByDefault?: boolean; + orderBy?: TIssueOrderByOptions; isEpic?: boolean; } @@ -72,17 +75,23 @@ export const SpreadsheetIssueRow = observer(function SpreadsheetIssueRow(props: spacingLeft = 6, selectionHelpers, shouldRenderByDefault, + orderBy, isEpic = false, } = props; // states const [isExpanded, setExpanded] = useState(false); // store hooks const { subIssues: subIssuesStore } = useIssueDetail(isEpic ? EIssueServiceType.EPICS : EIssueServiceType.ISSUES); - const { issueMap } = useIssues(); + const storeType = useIssueStoreType(); + const { issueMap, issues } = useIssues(storeType); // derived values const issue = issueMap[issueId]; - const subIssues = subIssuesStore.subIssuesByIssueId(issueId); + const subIssueIds = subIssuesStore.subIssuesByIssueId(issueId); + const subIssues = + orderBy && subIssueIds?.length && "issuesSortWithOrderBy" in issues + ? (issues as IBaseIssuesStore).issuesSortWithOrderBy(subIssueIds, orderBy) + : subIssueIds; const isIssueSelected = selectionHelpers.getIsEntitySelected(issueId); const isIssueActive = selectionHelpers.getIsEntityActive(issueId); @@ -147,6 +156,8 @@ export const SpreadsheetIssueRow = observer(function SpreadsheetIssueRow(props: spreadsheetColumnsList={spreadsheetColumnsList} selectionHelpers={selectionHelpers} shouldRenderByDefault={isExpanded} + orderBy={orderBy} + isEpic={isEpic} /> ))} @@ -193,7 +204,7 @@ const IssueRowDetails = observer(function IssueRowDetails(props: IssueRowDetails const [isMenuActive, setIsMenuActive] = useState(false); // refs const cellRef = useRef(null); - const menuActionRef = useRef(null); + const menuActionRef = useRef(null); // router const { workspaceSlug, projectId } = useParams(); // hooks @@ -215,7 +226,8 @@ const IssueRowDetails = observer(function IssueRowDetails(props: IssueRowDetails useOutsideClickDetector(menuActionRef, () => setIsMenuActive(false)); const customActionButton = ( -
setIsMenuActive(!isMenuActive)} > -
+ ); if (!issueDetail) return null; @@ -371,8 +383,9 @@ const IssueRowDetails = observer(function IssueRowDetails(props: IssueRowDetails
e.stopPropagation()} + onMouseDown={(e) => e.stopPropagation()} > {quickActions({ issue: issueDetail, diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-table.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-table.tsx index 799eb9b71ed..24a7cbf958c 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-table.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-table.tsx @@ -138,14 +138,15 @@ export const SpreadsheetTable = observer(function SpreadsheetTable(props: Props) isScrolled={isScrolled} spreadsheetColumnsList={spreadsheetColumnsList} selectionHelpers={selectionHelpers} + orderBy={displayFilters.order_by} isEpic={isEpic} /> ))} {canLoadMoreIssues && ( - {Array.from({ length: 3 }).map((_, index) => ( - + {(["spreadsheet-loader-1", "spreadsheet-loader-2", "spreadsheet-loader-3"] as const).map((loaderKey) => ( + ))} )}