import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; import Card from "@material-ui/core/Card"; import Typography from "@material-ui/core/Typography"; import TableBody from "@material-ui/core/TableBody"; import TableCell from "@material-ui/core/TableCell"; import TableHead from "@material-ui/core/TableHead"; import TableRow from "@material-ui/core/TableRow"; import TextField from "@material-ui/core/TextField"; import classNames from "classnames"; import useFormset, { FormsetData } from "@saleor/hooks/useFormset"; import { StockInput } from "@saleor/types/globalTypes"; import { WarehouseFragment } from "@saleor/warehouses/types/WarehouseFragment"; import TableCellAvatar, { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar"; import Container from "@saleor/components/Container"; import PageHeader from "@saleor/components/PageHeader"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Form from "@saleor/components/Form"; import { OrderFulfillData_order } from "@saleor/orders/types/OrderFulfillData"; import CardTitle from "@saleor/components/CardTitle"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; import makeStyles from "@material-ui/core/styles/makeStyles"; const useStyles = makeStyles( theme => ({ colName: { width: 300 }, colNameLabel: { marginLeft: AVATAR_MARGIN }, colQuantity: { textAlign: "right", width: 200 }, colQuantityContent: { alignItems: "center", display: "inline-flex" }, colQuantityTotal: { textAlign: "right", width: 180 }, colSku: { textAlign: "right", width: 120 }, error: { color: theme.palette.error.main }, quantityInput: { width: "4rem" }, remainingQuantity: { marginLeft: theme.spacing(), paddingTop: 14 }, table: { "&&": { tableLayout: "fixed" } } }), { name: "OrderFulfillPage" } ); interface OrderFulfillFormData { sendInfo: boolean; } interface OrderFulfillSubmitData extends OrderFulfillFormData { items: FormsetData; } export interface OrderFulfillPageProps { disabled: boolean; order: OrderFulfillData_order; saveButtonBar: ConfirmButtonTransitionState; warehouses: WarehouseFragment[]; onBack: () => undefined; onSubmit: (data: OrderFulfillSubmitData) => void; } const initialFormData: OrderFulfillFormData = { sendInfo: true }; const OrderFulfillPage: React.FC = ({ disabled, order, saveButtonBar, warehouses, onBack, onSubmit }) => { const intl = useIntl(); const classes = useStyles({}); const { change, data: formsetData } = useFormset( order?.lines.map(line => ({ data: null, id: line.id, label: line.variant.attributes .map(attribute => attribute.values .map(attributeValue => attributeValue.name) .join(" , ") ) .join(" / "), value: line.variant.stocks.map(stock => ({ quantity: 0, warehouse: stock.warehouse.id })) })) ); const handleSubmit = (formData: OrderFulfillFormData) => onSubmit({ ...formData, items: formsetData }); return (
{({ change, data, submit }) => ( <> {warehouses.map(warehouse => ( {warehouse.name} ))} {order?.lines.map((line, lineIndex) => { const remainingQuantity = line.quantity - line.quantityFulfilled; return ( {line.productName} {line.variant.sku} {warehouses.map(warehouse => { const warehouseStock = line.variant.stocks.find( stock => stock.warehouse.id === warehouse.id ); if (!warehouseStock) { return ( ); } return (
undefined} error={ remainingQuantity < formsetData[lineIndex].value[0] .quantity || formsetData[lineIndex].value[0].quantity > warehouseStock.quantity } />
/ {warehouseStock.quantity}
); })} {formsetData[lineIndex].value.reduce( (acc, stock) => acc + stock.quantity, 0 )}{" "} / {remainingQuantity}
); })}
)}
); }; OrderFulfillPage.displayName = "OrderFulfillPage"; export default OrderFulfillPage;