From 90b11a525064ee71610b9817c11b209fcbcf45c7 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 18 Nov 2024 01:30:36 +0300 Subject: [PATCH] feat: schizo sorting --- src/components/Dnd/Board/Board.tsx | 55 ++++++++++++++++++------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/components/Dnd/Board/Board.tsx b/src/components/Dnd/Board/Board.tsx index 5d84ff5..0d3634a 100644 --- a/src/components/Dnd/Board/Board.tsx +++ b/src/components/Dnd/Board/Board.tsx @@ -39,18 +39,7 @@ export const Board: FC = ({ return has(obj, "deals"); }; - const getDateFromDealOrGroup = (obj: GroupWithDeals | DealSummary) => { - // if is group get group with the delivery earliest date - if (isGroup(obj)) { - const dates = obj.deals.map(d => d.deliveryDate || d.createdAt).filter(Boolean); - if (dates.length === 0) return null; - return new Date(Math.min(...dates.map(d => { - return new Date(d).getTime(); - }))); - } - // if is deal get deal delivery date - return new Date(obj.deliveryDate || obj.createdAt); - }; + const getDealGroups = (): GroupWithDeals[] => { const groups = uniq(summaries.filter(s => s.group).map(summary => summary.group) as DealGroupSchema[]); if (groups.length === 0) return []; @@ -71,23 +60,45 @@ export const Board: FC = ({ return acc; }, [] as { group: DealGroupSchema; deals: DealSummary[] }[]); }; + + const getDateFromDealOrGroup = (obj: GroupWithDeals | DealSummary) => { + // if is group get group with the delivery earliest date + if (isGroup(obj)) { + const dates = obj.deals.map(d => d.deliveryDate || d.createdAt).filter(Boolean); + if (dates.length === 0) return null; + return new Date(Math.min(...dates.map(d => { + return new Date(d).getTime(); + }))); + } + // if is deal get deal delivery date + return new Date(obj.deliveryDate || obj.createdAt); + }; + const getDealsAndGroups = (): (GroupWithDeals | DealSummary)[] => { const groups = getDealGroups(); const deals = summaries.filter(s => !s.group); - const data = [...groups, ...deals]; - return data.sort((a, b) => { + const dealsWithDeliveryDate = deals.filter(d => d.deliveryDate).sort((a, b) => { + if (!a.deliveryDate || !b.deliveryDate) return 0; + return new Date(a.deliveryDate).getTime() - new Date(b.deliveryDate).getTime(); + }); + const dealsWithoutDeliveryDate = deals.filter(d => !d.deliveryDate).sort((a, b) => { + return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(); + }); + const groupsWithDeliveryDate = groups.filter(g => g.deals.some(d => d.deliveryDate)); + const groupsWithoutDeliveryDate = groups.filter(g => g.deals.some(d => !d.deliveryDate)); + const firstRankData = [...dealsWithDeliveryDate, ...groupsWithDeliveryDate].sort((a, b) => { const aDate = getDateFromDealOrGroup(a); const bDate = getDateFromDealOrGroup(b); if (!aDate || !bDate) return 0; return aDate.getTime() - bDate.getTime(); - }).map((obj, index) => { - if (isGroup(obj)) { - obj.deals[0].rank = index; - return obj; - } - obj.rank = index; - return obj; - }) as (GroupWithDeals | DealSummary)[]; + }); + const secondRankData = [...dealsWithoutDeliveryDate, ...groupsWithoutDeliveryDate].sort((a, b) => { + const aDate = getDateFromDealOrGroup(a); + const bDate = getDateFromDealOrGroup(b); + if (!aDate || !bDate) return 0; + return aDate.getTime() - bDate.getTime(); + }); + return [...firstRankData, ...secondRankData]; }; const renderDeal = (deal: DealSummary) => {