From 63a9923bb1cb02454a2f23ebf82ef01f9aca3a69 Mon Sep 17 00:00:00 2001 From: jhimanish <54194957+jhimanish@users.noreply.github.com> Date: Tue, 11 Jul 2023 17:27:46 -0400 Subject: [PATCH 1/2] Starting work on the Pending Orders cards on the Admin Dashboard (#485) * Starting work on the Pending Orders cards on the Admin Dashboard * Creating test and updating styles * Using grid to display cards * Fixing test * removing extra styles * Using absolute imports and fixing other review comments * Updating admindashboard test to use mockdata * Fixing variable * Adding onclick events to the order cards --------- Co-authored-by: Mustafa --- .../components/orders/OrderCard/OrderCard.tsx | 5 +- .../AdminDashboard/AdminDashboard.module.scss | 24 ++++++ .../AdminDashboard/AdminDashboard.test.tsx | 53 +++++++++++++ .../pages/AdminDashboard/AdminDashboard.tsx | 74 +++++++++++++++++++ 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.module.scss create mode 100644 hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.test.tsx diff --git a/hackathon_site/dashboard/frontend/src/components/orders/OrderCard/OrderCard.tsx b/hackathon_site/dashboard/frontend/src/components/orders/OrderCard/OrderCard.tsx index 797560a9c..32d86b914 100644 --- a/hackathon_site/dashboard/frontend/src/components/orders/OrderCard/OrderCard.tsx +++ b/hackathon_site/dashboard/frontend/src/components/orders/OrderCard/OrderCard.tsx @@ -14,7 +14,10 @@ const OrderCard = ({ teamCode, orderQuantity, time, id, status }: OrderProps) => const date = new Date(time); const month = date.toLocaleString("default", { month: "short" }); const day = date.getDate(); - const hoursAndMinutes = date.getHours() + ":" + date.getMinutes(); + const hoursAndMinutes = + date.getHours() + + ":" + + ((date.getMinutes() < 10 ? "0" : "") + date.getMinutes()); const orderDetails = [ { title: "Team", value: teamCode }, diff --git a/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.module.scss b/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.module.scss new file mode 100644 index 000000000..c6c02965f --- /dev/null +++ b/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.module.scss @@ -0,0 +1,24 @@ +@import "assets/abstracts/mixins"; +@import "assets/abstracts/variables"; + +.titleButton { + margin-left: 45px; +} + +.title { + text-justify: left; + margin-bottom: 10px; + font-family: "Roboto"; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 19px; +} + +.dashboard { + width: 100%; +} + +.section { + margin-bottom: 1rem; +} diff --git a/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.test.tsx b/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.test.tsx new file mode 100644 index 000000000..749cf73f8 --- /dev/null +++ b/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.test.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import AdminDashboard from "pages/AdminDashboard/AdminDashboard"; + +import { makeStoreWithEntities, render, waitFor } from "testing/utils"; +import { RootStore } from "slices/store"; +import { within } from "testing/utils"; +import { mockPendingOrders } from "testing/mockData"; + +describe("Admin Dashboard Page", () => { + let store: RootStore; + + beforeEach(() => { + store = makeStoreWithEntities({ + allOrders: mockPendingOrders, + }); + }); + test("Display correct order cards", () => { + const { getByText, getByTestId } = render(, { store }); + mockPendingOrders.forEach((order) => { + const orderStatus = order.status; + + if (orderStatus === "Submitted" || orderStatus === "Ready for Pickup") { + const orderItem = getByTestId(`order-item-${order.id}`); + const orderDetails = within(orderItem); + const date = new Date(order.updated_at); + const month = date.toLocaleString("default", { month: "short" }); + const day = date.getDate(); + const hoursAndMinutes = + date.getHours() + + ":" + + ((date.getMinutes() < 10 ? "0" : "") + date.getMinutes()); + + expect(orderDetails.getByText(order.team_code)).toBeInTheDocument(); + expect(orderDetails.getByText(order.items.length)).toBeInTheDocument(); + expect(orderDetails.getByText(order.id)).toBeInTheDocument(); + expect(orderDetails.getByText(order.status)).toBeInTheDocument(); + expect( + orderDetails.getByText(`${month} ${day}, ${hoursAndMinutes}`) + ).toBeInTheDocument(); + } + }); + }); + + test("Renders correctly when the dashboard appears with Title texts", async () => { + const { getByText } = render(); + + await waitFor(() => { + expect(getByText("Hackathon Name Admin Dashboard")).toBeInTheDocument(); + expect(getByText("Overview")).toBeInTheDocument(); + expect(getByText("Pending Orders")).toBeInTheDocument(); + }); + }); +}); diff --git a/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.tsx b/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.tsx index 720ae3ad8..113d307a8 100644 --- a/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.tsx +++ b/hackathon_site/dashboard/frontend/src/pages/AdminDashboard/AdminDashboard.tsx @@ -2,12 +2,86 @@ import React from "react"; import Typography from "@material-ui/core/Typography"; import Header from "components/general/Header/Header"; import { hackathonName } from "constants.js"; +import OrderCard from "components/orders/OrderCard/OrderCard"; +import { useDispatch, useSelector } from "react-redux"; +import styles from "./AdminDashboard.module.scss"; +import Grid from "@material-ui/core/Grid"; +import Button from "@material-ui/core/Button"; +import { + adminOrderSelectors, + getOrdersWithFilters, + setFilters, +} from "slices/order/adminOrderSlice"; +import { OrderFilters } from "api/types"; +import { useHistory } from "react-router-dom"; const AdminDashboard = () => { + const dispatch = useDispatch(); + const history = useHistory(); + const allOrders = useSelector(adminOrderSelectors.selectAll); + const pendingFilter: OrderFilters = { + status: ["Submitted", "Ready for Pickup"], + }; + dispatch(setFilters(pendingFilter)); + dispatch(getOrdersWithFilters()); + const numOrdersOnPage = 6; + const ordersLength = + allOrders.length <= numOrdersOnPage ? allOrders.length : numOrdersOnPage; return ( <>
{hackathonName} Admin Dashboard + +
+ Overview +
+ +
+ + Pending Orders + + + + {allOrders.slice(0, ordersLength).map((order, idx) => ( + + history.push(`/teams/${order.team_code}`) + } + > + {["Submitted", "Ready for Pickup"].includes( + order.status + ) && ( + + )} + + ))} + +
+
); }; From 879689dc9115e567aae5a8b909beecab072f8221 Mon Sep 17 00:00:00 2001 From: liu-samuel <68487937+liu-samuel@users.noreply.github.com> Date: Mon, 17 Jul 2023 22:15:22 -0400 Subject: [PATCH 2/2] IEEE-266: Sort orders by date instead of ID (#498) * IEEE-266: Sort pending orders from oldest to newest, sort returned and checked out orders from newest to oldest * add on admin side * make ready for pick up at top of list * IEEE-258: PATCH /hardware/incidents/{id}/ (#493) * add patch path to IncidentDetailView class * reformat code * reformat with black * add request validation + unit tests * make order_item field read only * update test case names * create a patch serializer * reformat file with black * reformat with black * remove test docstring for consistency * IEEE 253 fixing order modal cancel bug (#491) * updated changes to animation prop [status: not working] * Merged conflicts in PopupModal.tsx and ItemsTable.tsx * reliminary changes to ItemTable.tsx to resolve modal cancel bug * shortened comments for bug fixes * changed implementation to use propagation, removed comments * merge changes * alternate (but still not working) changes to modal bug * alterned email address of django participant + made comment changes * revert implementation from event.propagation back to useState solution * made changes based on PR comments * made naming changes to constants in ItemTable.tsx --------- Co-authored-by: Mustafa Co-authored-by: Luke Cheseldine <36282235+lukecheseldine@users.noreply.github.com> * IEEE-262 Update Teams model with a project_description field and Implement PATCH /event/teams/{team_code}/ endpoint (#499) * IEEE-262 Update Teams model with a project_description field * IEEE-262 format with black * IEEE-262 Implement PATCH /event/teams/{team_code}/ endpoint --------- Co-authored-by: Karandeep Lubana Co-authored-by: Mustafa * add on admin side * make ready for pick up at top of list * tests for admin side * dashboard checks * add back accidental removal of bracket * abstract repetitive code * absolute imports * remove console.log --------- Co-authored-by: root Co-authored-by: Luke Cheseldine <36282235+lukecheseldine@users.noreply.github.com> Co-authored-by: Daniel Qiu <65613404+danielqiuu@users.noreply.github.com> Co-authored-by: carmen-chau <80921817+carmen-chau@users.noreply.github.com> Co-authored-by: Mustafa Co-authored-by: KarandeepLubana <70231862+KarandeepLubana@users.noreply.github.com> Co-authored-by: Karandeep Lubana --- .../dashboard/frontend/src/api/helpers.ts | 112 ++++++++++++++++++ .../dashboard/ItemTable/ItemTable.test.tsx | 75 +++++++++++- .../dashboard/ItemTable/ItemTable.tsx | 15 ++- .../general/OrderTables/OrderTables.tsx | 6 +- .../SimpleOrderTables.test.tsx | 42 +++++++ .../SimpleOrderTables/SimpleOrderTables.tsx | 9 +- .../TeamCheckedOutOrderTable.test.tsx | 21 ++++ .../TeamCheckedOutOrderTable.tsx | 4 +- 8 files changed, 275 insertions(+), 9 deletions(-) diff --git a/hackathon_site/dashboard/frontend/src/api/helpers.ts b/hackathon_site/dashboard/frontend/src/api/helpers.ts index 3d8d21134..70f006753 100644 --- a/hackathon_site/dashboard/frontend/src/api/helpers.ts +++ b/hackathon_site/dashboard/frontend/src/api/helpers.ts @@ -94,3 +94,115 @@ export const teamOrderListSerialization = ( hardwareIdsToFetch: Object.values(hardwareIdsToFetch), }; }; + +export const sortReturnedOrders = ( + order1: ReturnOrderInTable, + order2: ReturnOrderInTable +): number => { + const orderDate1 = order1.hardwareInOrder[0].time; + const orderDate2 = order2.hardwareInOrder[0].time; + + const matchResult = orderDate1.match( + /(\d{1,2}):(\d{2}):(\d{2}) (AM|PM) \((\w{3}) (\w{3}) (\d{2}) (\d{4})\)/ + ); + const matchResult2 = orderDate2.match( + /(\d{1,2}):(\d{2}):(\d{2}) (AM|PM) \((\w{3}) (\w{3}) (\d{2}) (\d{4})\)/ + ); + + if (matchResult && matchResult2) { + // converting invalid date to a valid Date for first order to be compared + const [, hours, minutes, seconds, meridiem, , month, day, year] = matchResult; + const monthIndex = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ].indexOf(month); + + const date = new Date( + Number(year), + monthIndex, + Number(day), + Number(hours) + (meridiem === "PM" ? 12 : 0), + Number(minutes), + Number(seconds) + ); + const formattedDate = date.toISOString(); + + // converting invalid date to a valid Date for first order to be compared + const [, hours2, minutes2, seconds2, meridiem2, , month2, day2, year2] = + matchResult2; + const monthIndex2 = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ].indexOf(month2); + + const date2 = new Date( + Number(year2), + monthIndex2, + Number(day2), + Number(hours2) + (meridiem2 === "PM" ? 12 : 0), + Number(minutes2), + Number(seconds2) + ); + const formattedDate2 = date2.toISOString(); + + return new Date(formattedDate2).valueOf() - new Date(formattedDate).valueOf(); + } + return 0; +}; + +export const sortCheckedOutOrders = ( + order1: OrderInTable, + order2: OrderInTable +): number => { + return ( + new Date(order2.updatedTime).valueOf() - new Date(order1.updatedTime).valueOf() + ); +}; + +export const sortPendingOrders = (orders: OrderInTable[]): OrderInTable[] => { + let ready_orders = []; + let submitted_orders = []; + for (let order of orders) { + if (order.status === "Ready for Pickup") { + ready_orders.push(order); + } else { + submitted_orders.push(order); + } + } + ready_orders.sort((order1, order2) => { + return ( + new Date(order1.updatedTime).valueOf() - + new Date(order2.updatedTime).valueOf() + ); + }); + + submitted_orders.sort((order1, order2) => { + return ( + new Date(order1.updatedTime).valueOf() - + new Date(order2.updatedTime).valueOf() + ); + }); + + orders.splice(0, orders.length, ...submitted_orders, ...ready_orders); + return orders; +}; diff --git a/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.test.tsx b/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.test.tsx index c4fba9846..aa4fcab16 100644 --- a/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.test.tsx +++ b/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.test.tsx @@ -14,7 +14,7 @@ import { mockReturnedOrdersInTable, } from "testing/mockData"; import { ReturnOrderInTable } from "api/types"; -import { getAllByText, queryAllByText } from "@testing-library/react"; +import { getAllByText } from "@testing-library/react"; describe("", () => { it("Shows pending items and status chip", () => { @@ -136,6 +136,29 @@ describe("", () => { expect(cancelOrderModalMessage[0]).not.toBeInTheDocument(); }); + + it("Displays pending orders from oldest to newest", () => { + const store = makeStoreWithEntities({ + pendingOrders: mockPendingOrdersInTable, + }); + const { getAllByTestId } = render(, { store }); + const orderElements = getAllByTestId(/pending-order-table-\d+/); + const orders = orderElements.map((element) => { + const updatedTime = element.getAttribute("data-updated-time"); + return { updatedTime }; + }); + let isSorted = true; + for (let i = 0; i < orders.length - 1; i++) { + const currentDate = orders[i]; + const previousDate = orders[i + 1]; + + if (currentDate > previousDate) { + isSorted = false; + break; + } + } + expect(isSorted).toBe(true); + }); }); describe("", () => { @@ -207,6 +230,31 @@ describe("", () => { }); }); + it("Displays checked out orders from most recent to oldest order", async () => { + const store = makeStoreWithEntities({ + orderState: { + checkedOutOrders: mockCheckedOutOrdersInTable, + }, + }); + const { getAllByTestId } = render(, { store }); + const orderElements = getAllByTestId(/checked-out-order-table-\d+/); + const orders = orderElements.map((element) => { + const updatedTime = element.getAttribute("data-updated-time"); + return { updatedTime }; + }); + let isSorted = true; + for (let i = 0; i < orders.length - 1; i++) { + const currentDate = orders[i]; + const previousDate = orders[i + 1]; + + if (currentDate < previousDate) { + isSorted = false; + break; + } + } + expect(isSorted).toBe(true); + }); + // TODO: implement when incidents are ready // it("Calls 'push' and 'reportIncident' when 'Report broken/lost' is clicked", () => { // const push = jest.fn(); @@ -312,6 +360,31 @@ describe("", () => { expect(queryByText(`Order #${id}`)).not.toBeInTheDocument(); }); }); + + it("Displays the returned orders from newest to oldest", () => { + const store = makeStoreWithReturnedOrders(mockReturnedOrdersInTable, false); + const { getAllByTestId, getByText } = render(, { + store, + }); + const button = getByText("Show all"); + fireEvent.click(button); + const orderElements = getAllByTestId(/returned-order-table-\d+/); + const orders = orderElements.map((element) => { + const updatedTime = element.getAttribute("data-updated-time"); + return { updatedTime }; + }); + let isSorted = true; + for (let i = 0; i < orders.length - 1; i++) { + const currentDate = orders[i]; + const previousDate = orders[i + 1]; + + if (currentDate < previousDate) { + isSorted = false; + break; + } + } + expect(isSorted).toBe(true); + }); }); // TODO: add back in when incidents are done diff --git a/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.tsx b/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.tsx index 23006e44a..b27ceae3b 100644 --- a/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.tsx +++ b/hackathon_site/dashboard/frontend/src/components/dashboard/ItemTable/ItemTable.tsx @@ -43,6 +43,8 @@ import { GeneralReturnTable, } from "components/general/OrderTables/OrderTables"; import PopupModal from "components/general/PopupModal/PopupModal"; +import { sortPendingOrders, sortReturnedOrders } from "api/helpers"; +import { sortCheckedOutOrders } from "api/helpers"; export const CheckedOutTables = () => // TODO: for incident reports @@ -50,7 +52,8 @@ export const CheckedOutTables = () => // reportIncident, } { const dispatch = useDispatch(); - const orders = useSelector(checkedOutOrdersSelector); + const unsorted_orders = useSelector(checkedOutOrdersSelector); + const orders = unsorted_orders.slice().sort(sortCheckedOutOrders); const hardware = useSelector(hardwareSelectors.selectEntities); const isVisible = useSelector(isCheckedOutTableVisibleSelector); const fetchOrdersError = useSelector(orderErrorSelector); @@ -86,6 +89,8 @@ export const CheckedOutTables = () =>
export const ReturnedTable = () => { const dispatch = useDispatch(); - const orders = useSelector(returnedOrdersSelector); + const unsorted_orders = useSelector(returnedOrdersSelector); + const orders = unsorted_orders.slice().sort(sortReturnedOrders); const fetchOrdersError = useSelector(orderErrorSelector); const isVisible = useSelector(isReturnedTableVisibleSelector); const toggleVisibility = () => dispatch(toggleReturnedTable()); @@ -224,7 +230,9 @@ export const ReturnedTable = () => { export const PendingTables = () => { const dispatch = useDispatch(); - const orders = useSelector(pendingOrderSelectors.selectAll); + const unsorted_orders = useSelector(pendingOrderSelectors.selectAll); + const orders = sortPendingOrders(unsorted_orders); + orders.reverse(); const isVisible = useSelector(isPendingTableVisibleSelector); const isCancelOrderLoading = useSelector(cancelOrderLoadingSelector); const toggleVisibility = () => dispatch(togglePendingTable()); @@ -271,6 +279,7 @@ export const PendingTables = () => { id={`order${pendingOrder.id}`} key={pendingOrder.id} data-testid={`pending-order-table-${pendingOrder.id}`} + data-updated-time={`pending-order-time-${pendingOrder.updatedTime}`} > {pendingOrder.status !== "Ready for Pickup" && ( diff --git a/hackathon_site/dashboard/frontend/src/components/general/OrderTables/OrderTables.tsx b/hackathon_site/dashboard/frontend/src/components/general/OrderTables/OrderTables.tsx index f7e056f7f..6dc79eb04 100644 --- a/hackathon_site/dashboard/frontend/src/components/general/OrderTables/OrderTables.tsx +++ b/hackathon_site/dashboard/frontend/src/components/general/OrderTables/OrderTables.tsx @@ -251,7 +251,11 @@ export const GeneralReturnTable = ({ ) : ( orders.map((order) => ( -
+
", () => { }); } }); + + it("Displays pending orders from oldest to newest on the admin side", () => { + const { getAllByTestId } = render(, { + store, + }); + const orderElements = getAllByTestId(/admin-simple-pending-order-\d+/); + const orders = orderElements.map((element) => { + const updatedTime = element.getAttribute("data-updated-time"); + return { updatedTime }; + }); + let isSorted = true; + for (let i = 0; i < orders.length - 1; i++) { + const currentDate = orders[i]; + const previousDate = orders[i + 1]; + + if (currentDate > previousDate) { + isSorted = false; + break; + } + } + expect(isSorted).toBe(true); + }); }); describe("", () => { @@ -201,4 +223,24 @@ describe("", () => { expect(queryByText(`Order #${id}`)).toBeNull(); }); }); + + it("Displays returned orders from newest to oldest on the admin side", () => { + const { getAllByTestId } = render(, { store }); + const orderElements = getAllByTestId(/returned-order-table-\d+/); + const orders = orderElements.map((element) => { + const updatedTime = element.getAttribute("data-updated-time"); + return { updatedTime }; + }); + let isSorted = true; + for (let i = 0; i < orders.length - 1; i++) { + const currentDate = orders[i]; + const previousDate = orders[i + 1]; + + if (currentDate > previousDate) { + isSorted = false; + break; + } + } + expect(isSorted).toBe(true); + }); }); diff --git a/hackathon_site/dashboard/frontend/src/components/teamDetail/SimpleOrderTables/SimpleOrderTables.tsx b/hackathon_site/dashboard/frontend/src/components/teamDetail/SimpleOrderTables/SimpleOrderTables.tsx index 12a7138ae..ef0ff82b5 100644 --- a/hackathon_site/dashboard/frontend/src/components/teamDetail/SimpleOrderTables/SimpleOrderTables.tsx +++ b/hackathon_site/dashboard/frontend/src/components/teamDetail/SimpleOrderTables/SimpleOrderTables.tsx @@ -18,6 +18,7 @@ import { UpdateOrderAttributes, updateOrderStatus, } from "slices/order/teamOrderSlice"; +import { sortPendingOrders, sortReturnedOrders } from "api/helpers"; interface SimpleOrderFormValues { itemIdsChecked: string[]; @@ -142,8 +143,8 @@ const CompleteOrderButton = ({ order }: { order: OrderInTable }) => { export const SimplePendingOrderFulfillmentTable = () => { const dispatch = useDispatch(); - const orders = useSelector(pendingOrdersSelector); - + const unsorted_orders = useSelector(pendingOrdersSelector); + const orders = sortPendingOrders(unsorted_orders); const [isVisible, setVisibility] = useState(true); const toggleVisibility = () => setVisibility(!isVisible); @@ -186,6 +187,7 @@ export const SimplePendingOrderFulfillmentTable = () => { >
{ }; export const AdminReturnedItemsTable = () => { - const orders = useSelector(returnedOrdersSelector); + const unsorted_orders = useSelector(returnedOrdersSelector); + const orders = unsorted_orders.slice().sort(sortReturnedOrders); const [isVisible, setVisibility] = useState(true); const toggleVisibility = () => setVisibility(!isVisible); diff --git a/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.test.tsx b/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.test.tsx index a2f1eab0d..56c87c669 100644 --- a/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.test.tsx +++ b/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.test.tsx @@ -91,4 +91,25 @@ describe("team pending order table", () => { }); } }); + it("Displays checked out orders from most recent to oldest order", async () => { + const { getAllByTestId, container } = render(, { + store, + }); + let orderElements = getAllByTestId(/table-\d+-\d+/); + const orders = orderElements.map((element) => { + const updatedTime = element.getAttribute("data-updated-time"); + return { updatedTime }; + }); + let isSorted = true; + for (let i = 0; i < orders.length - 1; i++) { + const currentDate = orders[i]; + const previousDate = orders[i + 1]; + + if (currentDate < previousDate) { + isSorted = false; + break; + } + } + expect(isSorted).toBe(true); + }); }); diff --git a/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.tsx b/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.tsx index 5f1410d75..b79ff6295 100644 --- a/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.tsx +++ b/hackathon_site/dashboard/frontend/src/components/teamDetail/TeamCheckedOutOrderTable/TeamCheckedOutOrderTable.tsx @@ -38,6 +38,7 @@ import { hardwareSelectors, } from "slices/hardware/hardwareSlice"; import { displaySnackbar, openProductOverview } from "slices/ui/uiSlice"; +import { sortCheckedOutOrders } from "api/helpers"; const createDropdownList = (number: number) => { let entry = []; @@ -67,7 +68,8 @@ const setInitialValues = ( }; export const TeamCheckedOutOrderTable = () => { - const orders = useSelector(checkedOutOrdersSelector); + const unsorted_orders = useSelector(checkedOutOrdersSelector); + const orders = unsorted_orders.slice().sort(sortCheckedOutOrders); const fetchOrdersError = useSelector(errorSelector); const returnIsLoading = useSelector(isReturnedLoadingSelector); const hardware = useSelector(hardwareSelectors.selectEntities);