diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index b31969de5..4d4d65c38 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -100,23 +100,28 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr const targetLane = boardLanes.lanes.find((lane) => lane.id === destination.droppableId); const sourceLane = boardLanes.lanes.find((lane) => lane.id === source.droppableId); + if (!targetLane || !sourceLane) { + setIsMoving(false); + console.error("Invalid source or destination lane"); + return; + } + const sameColumnTransfer = source.droppableId === destination.droppableId; const sourceCard = getCardByID(boardLanes, draggableId); const movedCardWillBeFirst = destination.index === 0; - const movedCardWillBeLast = destination.index > targetLane.cards.length - 1; + const movedCardWillBeLast = destination.index >= targetLane.cards.length - 1; const lastCardInTargetLane = targetLane.cards[targetLane.cards.length - 1]; - - const oldChildCard = sourceLane.cards[destination.index + 1]; + const oldChildCard = sourceLane.cards[source.index + 1]; const newChildCard = movedCardWillBeLast ? null : targetLane.cards[ sameColumnTransfer - ? destination.index - destination.index > 0 - ? destination.index - : destination.index + 1 + ? source.index < destination.index + ? destination.index + 1 + : destination.index : destination.index ]; @@ -127,12 +132,25 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr movedCardNewKanbanParent = "-1"; } else if (movedCardWillBeLast) { movedCardNewKanbanParent = lastCardInTargetLane.id; - } else if (!!newChildCard) { + } else if (newChildCard) { movedCardNewKanbanParent = newChildCard.metadata.kanbanparent; } else { - console.log("==> !!!!!!Couldn't find a parent.!!!! <=="); + console.error("==> !!!!!!Couldn't find a parent.!!!! <=="); } + const newChildCardNewParent = newChildCard ? draggableId : null; + + console.log({ + oldChildCard, + newChildCard, + oldChildCardNewParent, + newChildCardNewParent, + movedCardNewKanbanParent, + sameColumnTransfer, + movedCardWillBeFirst, + movedCardWillBeLast + }); + try { const update = await client.mutate({ mutation: generate_UPDATE_JOB_KANBAN( diff --git a/client/src/components/production-board-kanban/production-board-kanban.utils.js b/client/src/components/production-board-kanban/production-board-kanban.utils.js index ab286794f..4d9d1e3aa 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.utils.js +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -1,128 +1,91 @@ import { groupBy } from "lodash"; +// Function to sort an array of objects by parentId const sortByParentId = (arr) => { - // return arr.reduce((accumulator, currentValue) => { - // //Find the parent item. - // let item = accumulator.find((x) => x.id === currentValue.kanbanparent); - // //Get index of parent item - // let index = accumulator.indexOf(item); - - // index = index !== -1 ? index + 1 : 0; - // accumulator.splice(index, 0, currentValue); - // return accumulator; - // }, []); - let parentId = "-1"; const sortedList = []; - const byParentsIdsList = groupBy(arr, "kanbanparent"); // Create a new array with objects indexed by parentId - //console.log("sortByParentId -> byParentsIdsList", byParentsIdsList); + const byParentsIdsList = groupBy(arr, "kanbanparent"); while (byParentsIdsList[parentId]) { - sortedList.push(...byParentsIdsList[parentId]); //Spread in the whole list in case several items have the same parents. - parentId = byParentsIdsList[parentId][byParentsIdsList[parentId].length - 1].id; //Grab the ID from the last one. + sortedList.push(...byParentsIdsList[parentId]); + parentId = byParentsIdsList[parentId][byParentsIdsList[parentId].length - 1].id; } - if (byParentsIdsList["null"]) byParentsIdsList["null"].map((i) => sortedList.push(i)); + if (byParentsIdsList["null"]) { + sortedList.push(...byParentsIdsList["null"]); + } - //Validate that the 2 arrays are of the same length and no children are missing. + // Ensure all items are included in the sorted list if (arr.length !== sortedList.length) { - arr.map((origItem) => { - if (!!!sortedList.find((s) => s.id === origItem.id)) { + arr.forEach((origItem) => { + if (!sortedList.some((s) => s.id === origItem.id)) { sortedList.push(origItem); - console.log("DATA CONSISTENCY ERROR: ", origItem.ro_number); } - return 1; }); } return sortedList; }; +// Function to create board data based on statuses and jobs, with optional filtering export const createBoardData = (AllStatuses, Jobs, filter) => { const { search, employeeId } = filter; - const lanes = AllStatuses.map((s) => { - return { - id: s, - title: s, - cards: [] - }; - }); + const lanes = AllStatuses.map((status) => ({ + id: status, + title: status, + cards: [] + })); const filteredJobs = - (search === "" || !search) && !employeeId - ? Jobs - : Jobs.filter((j) => { - let include = false; - if (search && search !== "") { - include = CheckSearch(search, j); - } + (search === "" || !search) && !employeeId ? Jobs : Jobs.filter((job) => checkFilter(search, employeeId, job)); - if (!!employeeId) { - include = - include || - j.employee_body === employeeId || - j.employee_prep === employeeId || - j.employee_csr === employeeId || - j.employee_refinish === employeeId; - } + const DataGroupedByStatus = groupBy(filteredJobs, "status"); - return include; - }); - - const DataGroupedByStatus = groupBy(filteredJobs, (d) => d.status); - - Object.keys(DataGroupedByStatus).map((statusGroupKey) => { + Object.keys(DataGroupedByStatus).forEach((statusGroupKey) => { try { const lane = lanes.find((l) => l.id === statusGroupKey); - if (!lane?.cards) return null; + if (!lane) return; + lane.cards = sortByParentId(DataGroupedByStatus[statusGroupKey]).map((job) => { const { id, title, description, due_date, ...metadata } = job; return { id, title, description, - label: job.due_date || "", + label: due_date || "", metadata }; }); } catch (error) { - console.log("Error while creating board card", error); + console.error("Error while creating board card", error); } - return null; }); return { lanes }; }; -const CheckSearch = (search, job) => { - return ( - (job.ro_number || "").toLowerCase().includes(search.toLowerCase()) || - (job.ownr_fn || "").toLowerCase().includes(search.toLowerCase()) || - (job.ownr_co_nm || "").toLowerCase().includes(search.toLowerCase()) || - (job.ownr_ln || "").toLowerCase().includes(search.toLowerCase()) || - (job.status || "").toLowerCase().includes(search.toLowerCase()) || - (job.v_make_desc || "").toLowerCase().includes(search.toLowerCase()) || - (job.v_model_desc || "").toLowerCase().includes(search.toLowerCase()) || - (job.clm_no || "").toLowerCase().includes(search.toLowerCase()) || - (job.plate_no || "").toLowerCase().includes(search.toLowerCase()) - ); +// Function to check if a job matches the search and/or employeeId filter +const checkFilter = (search, employeeId, job) => { + const lowerSearch = search?.toLowerCase() || ""; + + const matchesSearch = + lowerSearch && + ((job.ro_number || "").toLowerCase().includes(lowerSearch) || + (job.ownr_fn || "").toLowerCase().includes(lowerSearch) || + (job.ownr_co_nm || "").toLowerCase().includes(lowerSearch) || + (job.ownr_ln || "").toLowerCase().includes(lowerSearch) || + (job.status || "").toLowerCase().includes(lowerSearch) || + (job.v_make_desc || "").toLowerCase().includes(lowerSearch) || + (job.v_model_desc || "").toLowerCase().includes(lowerSearch) || + (job.clm_no || "").toLowerCase().includes(lowerSearch) || + (job.plate_no || "").toLowerCase().includes(lowerSearch)); + + const matchesEmployeeId = + employeeId && + (job.employee_body === employeeId || + job.employee_prep === employeeId || + job.employee_csr === employeeId || + job.employee_refinish === employeeId); + + return matchesSearch || matchesEmployeeId; }; - -// export const updateBoardOnMove = (board, card, source, destination) => { -// //Slice from source - -// const sourceCardList = board.columns.find((x) => x.id === source.fromColumnId) -// .cards; -// sourceCardList.slice(source.fromPosition, 0); - -// //Splice into destination. -// const destCardList = board.columns.find( -// (x) => x.id === destination.toColumnId -// ).cards; -// console.log("updateBoardOnMove -> destCardList", destCardList); - -// destCardList.splice(destination.toPosition, 0, card); -// console.log("updateBoardOnMove -> destCardList", destCardList); -// console.log("board", board); -// return board; -// };