|  |  |  | 
|---|
|  |  |  | }, CUSTOM_PAGES_DATA_INTERVAL); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return () => clearInterval(intervalId); | 
|---|
|  |  |  | }, [data, refetch]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | useEffect(() => { | 
|---|
|  |  |  | // if (data) { | 
|---|
|  |  |  | //     const newDealsByStage = getDealsByStage(unorderedDeals, dealStages); | 
|---|
|  |  |  | //     if (!isEqual(newDealsByStage, dealsByStage)) { | 
|---|
|  |  |  | //         setDealsByStage(newDealsByStage); | 
|---|
|  |  |  | //     } | 
|---|
|  |  |  | // } | 
|---|
|  |  |  | // eslint-disable-next-line react-hooks/exhaustive-deps | 
|---|
|  |  |  | }, [data]); | 
|---|
|  |  |  | }, [refetch]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (isPending) return <LinearProgress />; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const onDragEnd = result => { | 
|---|
|  |  |  | const { destination, source } = result; | 
|---|
|  |  |  | if (!destination) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | const { droppableId: sourceStage, index: sourceIdx } = source; | 
|---|
|  |  |  | const { droppableId: destinationStage, index: destinationIdx } = destination; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // if (!destination) { | 
|---|
|  |  |  | //     return; | 
|---|
|  |  |  | // } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // if ( | 
|---|
|  |  |  | //     destination.droppableId === source.droppableId && | 
|---|
|  |  |  | //     destination.index === source.index | 
|---|
|  |  |  | // ) { | 
|---|
|  |  |  | //     return; | 
|---|
|  |  |  | // } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // const sourceStage = source.droppableId; | 
|---|
|  |  |  | // const destinationStage = destination.droppableId; | 
|---|
|  |  |  | // const sourceDeal = dealsByStage[sourceStage][source.index]; | 
|---|
|  |  |  | // const destinationDeal = dealsByStage[destinationStage][ | 
|---|
|  |  |  | //     destination.index | 
|---|
|  |  |  | // ] ?? { | 
|---|
|  |  |  | //     stage: destinationStage, | 
|---|
|  |  |  | //     index: undefined, // undefined if dropped after the last item | 
|---|
|  |  |  | // }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // // compute local state change synchronously | 
|---|
|  |  |  | // setDealsByStage( | 
|---|
|  |  |  | //     updateDealStageLocal( | 
|---|
|  |  |  | //         sourceDeal, | 
|---|
|  |  |  | //         { stage: sourceStage, index: source.index }, | 
|---|
|  |  |  | //         { stage: destinationStage, index: destination.index }, | 
|---|
|  |  |  | //         dealsByStage | 
|---|
|  |  |  | //     ) | 
|---|
|  |  |  | // ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // // persist the changes | 
|---|
|  |  |  | // updateDealStage(sourceDeal, destinationDeal, dataProvider).then(() => { | 
|---|
|  |  |  | //     refetch(); | 
|---|
|  |  |  | // }); | 
|---|
|  |  |  | if (destinationStage === sourceStage | 
|---|
|  |  |  | && destinationIdx === sourceIdx) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | </DragDropContext> | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const updateDealStageLocal = ( | 
|---|
|  |  |  | sourceDeal, | 
|---|
|  |  |  | source, | 
|---|
|  |  |  | destination, | 
|---|
|  |  |  | dealsByStage | 
|---|
|  |  |  | ) => { | 
|---|
|  |  |  | if (source.stage === destination.stage) { | 
|---|
|  |  |  | // moving deal inside the same column | 
|---|
|  |  |  | const column = dealsByStage[source.stage]; | 
|---|
|  |  |  | column.splice(source.index, 1); | 
|---|
|  |  |  | column.splice(destination.index ?? column.length + 1, 0, sourceDeal); | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | ...dealsByStage, | 
|---|
|  |  |  | [destination.stage]: column, | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // moving deal across columns | 
|---|
|  |  |  | const sourceColumn = dealsByStage[source.stage]; | 
|---|
|  |  |  | const destinationColumn = dealsByStage[destination.stage]; | 
|---|
|  |  |  | sourceColumn.splice(source.index, 1); | 
|---|
|  |  |  | destinationColumn.splice( | 
|---|
|  |  |  | destination.index ?? destinationColumn.length + 1, | 
|---|
|  |  |  | 0, | 
|---|
|  |  |  | sourceDeal | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | ...dealsByStage, | 
|---|
|  |  |  | [source.stage]: sourceColumn, | 
|---|
|  |  |  | [destination.stage]: destinationColumn, | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const updateDealStage = async ( | 
|---|
|  |  |  | source, | 
|---|
|  |  |  | destination, | 
|---|
|  |  |  | dataProvider | 
|---|
|  |  |  | ) => { | 
|---|
|  |  |  | if (source.stage === destination.stage) { | 
|---|
|  |  |  | // moving deal inside the same column | 
|---|
|  |  |  | // Fetch all the deals in this stage (because the list may be filtered, but we need to update even non-filtered deals) | 
|---|
|  |  |  | const { data: columnDeals } = await dataProvider.getList('deals', { | 
|---|
|  |  |  | sort: { field: 'index', order: 'ASC' }, | 
|---|
|  |  |  | pagination: { page: 1, perPage: 100 }, | 
|---|
|  |  |  | filter: { stage: source.stage }, | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | const destinationIndex = destination.index ?? columnDeals.length + 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (source.index > destinationIndex) { | 
|---|
|  |  |  | // deal moved up, eg | 
|---|
|  |  |  | // dest   src | 
|---|
|  |  |  | //  <------ | 
|---|
|  |  |  | // [4, 7, 23, 5] | 
|---|
|  |  |  | await Promise.all([ | 
|---|
|  |  |  | // for all deals between destinationIndex and source.index, increase the index | 
|---|
|  |  |  | ...columnDeals | 
|---|
|  |  |  | .filter( | 
|---|
|  |  |  | deal => | 
|---|
|  |  |  | deal.index >= destinationIndex && | 
|---|
|  |  |  | deal.index < source.index | 
|---|
|  |  |  | ) | 
|---|
|  |  |  | .map(deal => | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: deal.id, | 
|---|
|  |  |  | data: { index: deal.index + 1 }, | 
|---|
|  |  |  | previousData: deal, | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | ), | 
|---|
|  |  |  | // for the deal that was moved, update its index | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: source.id, | 
|---|
|  |  |  | data: { index: destinationIndex }, | 
|---|
|  |  |  | previousData: source, | 
|---|
|  |  |  | }), | 
|---|
|  |  |  | ]); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // deal moved down, e.g | 
|---|
|  |  |  | // src   dest | 
|---|
|  |  |  | //  ------> | 
|---|
|  |  |  | // [4, 7, 23, 5] | 
|---|
|  |  |  | await Promise.all([ | 
|---|
|  |  |  | // for all deals between source.index and destinationIndex, decrease the index | 
|---|
|  |  |  | ...columnDeals | 
|---|
|  |  |  | .filter( | 
|---|
|  |  |  | deal => | 
|---|
|  |  |  | deal.index <= destinationIndex && | 
|---|
|  |  |  | deal.index > source.index | 
|---|
|  |  |  | ) | 
|---|
|  |  |  | .map(deal => | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: deal.id, | 
|---|
|  |  |  | data: { index: deal.index - 1 }, | 
|---|
|  |  |  | previousData: deal, | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | ), | 
|---|
|  |  |  | // for the deal that was moved, update its index | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: source.id, | 
|---|
|  |  |  | data: { index: destinationIndex }, | 
|---|
|  |  |  | previousData: source, | 
|---|
|  |  |  | }), | 
|---|
|  |  |  | ]); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // moving deal across columns | 
|---|
|  |  |  | // Fetch all the deals in both stages (because the list may be filtered, but we need to update even non-filtered deals) | 
|---|
|  |  |  | const [{ data: sourceDeals }, { data: destinationDeals }] = | 
|---|
|  |  |  | await Promise.all([ | 
|---|
|  |  |  | dataProvider.getList('deals', { | 
|---|
|  |  |  | sort: { field: 'index', order: 'ASC' }, | 
|---|
|  |  |  | pagination: { page: 1, perPage: 100 }, | 
|---|
|  |  |  | filter: { stage: source.stage }, | 
|---|
|  |  |  | }), | 
|---|
|  |  |  | dataProvider.getList('deals', { | 
|---|
|  |  |  | sort: { field: 'index', order: 'ASC' }, | 
|---|
|  |  |  | pagination: { page: 1, perPage: 100 }, | 
|---|
|  |  |  | filter: { stage: destination.stage }, | 
|---|
|  |  |  | }), | 
|---|
|  |  |  | ]); | 
|---|
|  |  |  | const destinationIndex = | 
|---|
|  |  |  | destination.index ?? destinationDeals.length + 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | await Promise.all([ | 
|---|
|  |  |  | // decrease index on the deals after the source index in the source columns | 
|---|
|  |  |  | ...sourceDeals | 
|---|
|  |  |  | .filter(deal => deal.index > source.index) | 
|---|
|  |  |  | .map(deal => | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: deal.id, | 
|---|
|  |  |  | data: { index: deal.index - 1 }, | 
|---|
|  |  |  | previousData: deal, | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | ), | 
|---|
|  |  |  | // increase index on the deals after the destination index in the destination columns | 
|---|
|  |  |  | ...destinationDeals | 
|---|
|  |  |  | .filter(deal => deal.index >= destinationIndex) | 
|---|
|  |  |  | .map(deal => | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: deal.id, | 
|---|
|  |  |  | data: { index: deal.index + 1 }, | 
|---|
|  |  |  | previousData: deal, | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | ), | 
|---|
|  |  |  | // change the dragged deal to take the destination index and column | 
|---|
|  |  |  | dataProvider.update('deals', { | 
|---|
|  |  |  | id: source.id, | 
|---|
|  |  |  | data: { | 
|---|
|  |  |  | index: destinationIndex, | 
|---|
|  |  |  | stage: destination.stage, | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | previousData: source, | 
|---|
|  |  |  | }), | 
|---|
|  |  |  | ]); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }; | 
|---|