From dca02081731d37ed9bbbd823f10e7252bb4b309e Mon Sep 17 00:00:00 2001 From: dominik-zeglen Date: Mon, 20 Apr 2020 19:18:20 +0200 Subject: [PATCH] Add fulfillment view --- .../OrderFulfillPage/OrderFulfillPage.tsx | 32 +++++++++++++-- src/orders/index.tsx | 9 +++- src/orders/urls.ts | 6 ++- src/orders/views/OrderDetails/index.tsx | 39 ++---------------- .../views/OrderFulfill/OrderFulfill.tsx | 41 +++++++++++++++++++ src/orders/views/OrderFulfill/index.ts | 2 + 6 files changed, 87 insertions(+), 42 deletions(-) diff --git a/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx b/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx index b2cd30842..2e6ff2c74 100644 --- a/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx +++ b/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx @@ -25,6 +25,8 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable"; import makeStyles from "@material-ui/core/styles/makeStyles"; import { update } from "@saleor/utils/lists"; import ControlledCheckbox from "@saleor/components/ControlledCheckbox"; +import { renderCollection } from "@saleor/misc"; +import Skeleton from "@saleor/components/Skeleton"; const useStyles = makeStyles( theme => ({ @@ -86,7 +88,7 @@ export interface OrderFulfillPageProps { order: OrderFulfillData_order; saveButtonBar: ConfirmButtonTransitionState; warehouses: WarehouseFragment[]; - onBack: () => undefined; + onBack: () => void; onSubmit: (data: OrderFulfillSubmitData) => void; } @@ -167,7 +169,7 @@ const OrderFulfillPage: React.FC = ({ description="product's sku" /> - {warehouses.map(warehouse => ( + {warehouses?.map(warehouse => ( = ({ - {order?.lines.map((line, lineIndex) => { + {renderCollection(order?.lines, (line, lineIndex) => { + if (!line) { + return ( + + + + + + + + {warehouses?.map(() => ( + + + + ))} + + {" "} + + + + ); + } + const remainingQuantity = line.quantity - line.quantityFulfilled; const quantityToFulfill = formsetData[ @@ -216,7 +240,7 @@ const OrderFulfillPage: React.FC = ({ {line.variant.sku} - {warehouses.map(warehouse => { + {warehouses?.map(warehouse => { const warehouseStock = line.variant.stocks.find( stock => stock.warehouse.id === warehouse.id ); diff --git a/src/orders/index.tsx b/src/orders/index.tsx index 608cba793..c8db1246e 100644 --- a/src/orders/index.tsx +++ b/src/orders/index.tsx @@ -14,9 +14,11 @@ import { orderPath, OrderUrlQueryParams, OrderDraftListUrlSortField, - OrderListUrlSortField + OrderListUrlSortField, + orderFulfillPath } from "./urls"; import OrderDetailsComponent from "./views/OrderDetails"; +import OrderFulfillComponent from "./views/OrderFulfill"; import OrderDraftListComponent from "./views/OrderDraftList"; import OrderListComponent from "./views/OrderList"; @@ -57,6 +59,10 @@ const OrderDetails: React.FC> = ({ ); }; +const OrderFulfill: React.FC> = ({ match }) => ( + +); + const Component = () => { const intl = useIntl(); @@ -66,6 +72,7 @@ const Component = () => { + diff --git a/src/orders/urls.ts b/src/orders/urls.ts index c8e7e3af7..d500f7f12 100644 --- a/src/orders/urls.ts +++ b/src/orders/urls.ts @@ -97,10 +97,14 @@ export type OrderUrlDialog = | "edit-shipping" | "edit-shipping-address" | "finalize" - | "fulfill" | "mark-paid" | "refund" | "void"; export type OrderUrlQueryParams = Dialog & SingleAction; export const orderUrl = (id: string, params?: OrderUrlQueryParams) => orderPath(encodeURIComponent(id)) + "?" + stringifyQs(params); + +export const orderFulfillPath = (id: string) => + urlJoin(orderPath(id), "fulfill"); +export const orderFulfillUrl = (id: string) => + orderFulfillPath(encodeURIComponent(id)); diff --git a/src/orders/views/OrderDetails/index.tsx b/src/orders/views/OrderDetails/index.tsx index 928c44239..67fb571ff 100644 --- a/src/orders/views/OrderDetails/index.tsx +++ b/src/orders/views/OrderDetails/index.tsx @@ -26,7 +26,6 @@ import OrderDraftFinalizeDialog, { } from "../../components/OrderDraftFinalizeDialog"; import OrderDraftPage from "../../components/OrderDraftPage"; import OrderFulfillmentCancelDialog from "../../components/OrderFulfillmentCancelDialog"; -import OrderFulfillmentDialog from "../../components/OrderFulfillmentDialog"; import OrderFulfillmentTrackingDialog from "../../components/OrderFulfillmentTrackingDialog"; import OrderMarkAsPaidDialog from "../../components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog"; import OrderPaymentDialog from "../../components/OrderPaymentDialog"; @@ -40,7 +39,8 @@ import { orderListUrl, orderUrl, OrderUrlQueryParams, - OrderUrlDialog + OrderUrlDialog, + orderFulfillUrl } from "../../urls"; import { OrderDetailsMessages } from "./OrderDetailsMessages"; @@ -154,7 +154,6 @@ export const OrderDetails: React.FC = ({ id, params }) => { {({ orderAddNote, orderCancel, - orderCreateFulfillment, orderDraftUpdate, orderLinesAdd, orderLineDelete, @@ -201,7 +200,7 @@ export const OrderDetails: React.FC = ({ id, params }) => { )} userPermissions={user?.userPermissions || []} onOrderCancel={() => openModal("cancel")} - onOrderFulfill={() => openModal("fulfill")} + onOrderFulfill={() => navigate(orderFulfillUrl(id))} onFulfillmentCancel={fulfillmentId => navigate( orderUrl(id, { @@ -305,38 +304,6 @@ export const OrderDetails: React.FC = ({ id, params }) => { }) } /> - order.lines, []).filter( - line => line.quantityFulfilled < line.quantity - )} - onClose={closeModal} - onSubmit={variables => - orderCreateFulfillment.mutate({ - input: { - ...variables, - lines: maybe(() => order.lines, []) - .filter( - line => - line.quantityFulfilled < line.quantity - ) - .map((line, lineIndex) => ({ - orderLineId: line.id, - quantity: variables.lines[lineIndex] - })) - .filter(line => line.quantity > 0) - }, - order: order.id - }) - } - /> = ({ orderId }) => { + const navigate = useNavigator(); + const { data, loading } = useOrderFulfillData({ + displayLoader: true, + variables: { + orderId + } + }); + const { data: warehouseData, loading: warehousesLoading } = useWarehouseList({ + displayLoader: true, + variables: { + first: 20 + } + }); + + return ( + navigate(orderUrl(orderId))} + onSubmit={() => undefined} + order={data?.order} + saveButtonBar="default" + warehouses={warehouseData?.warehouses.edges.map(edge => edge.node)} + /> + ); +}; + +OrderFulfill.displayName = "OrderFulfill"; +export default OrderFulfill; diff --git a/src/orders/views/OrderFulfill/index.ts b/src/orders/views/OrderFulfill/index.ts index e69de29bb..62368b27d 100644 --- a/src/orders/views/OrderFulfill/index.ts +++ b/src/orders/views/OrderFulfill/index.ts @@ -0,0 +1,2 @@ +export * from "./OrderFulfill"; +export { default } from "./OrderFulfill";