Add warehouse selection to restock items

This commit is contained in:
dominik-zeglen 2020-04-22 01:09:51 +02:00
parent 596cc41a7f
commit 7cc3492e71
4 changed files with 102 additions and 63 deletions

View file

@ -81,6 +81,10 @@ export const commonMessages = defineMessages({
}); });
export const buttonMessages = defineMessages({ export const buttonMessages = defineMessages({
accept: {
defaultMessage: "Accept",
description: "button"
},
back: { back: {
defaultMessage: "Back", defaultMessage: "Back",
description: "button" description: "button"

View file

@ -144,7 +144,7 @@ const OrderFulfillment: React.FC<OrderFulfillmentProps> = props => {
menuItems={[ menuItems={[
{ {
label: intl.formatMessage({ label: intl.formatMessage({
defaultMessage: "Cancel shipment", defaultMessage: "Cancel Fulfillment",
description: "button" description: "button"
}), }),
onSelect: onOrderFulfillmentCancel onSelect: onOrderFulfillmentCancel

View file

@ -11,25 +11,29 @@ import { FormattedMessage, useIntl } from "react-intl";
import ConfirmButton, { import ConfirmButton, {
ConfirmButtonTransitionState ConfirmButtonTransitionState
} from "@saleor/components/ConfirmButton"; } from "@saleor/components/ConfirmButton";
import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox";
import Form from "@saleor/components/Form"; import Form from "@saleor/components/Form";
import { buttonMessages } from "@saleor/intl"; import { buttonMessages } from "@saleor/intl";
import { OrderErrorFragment } from "@saleor/orders/types/OrderErrorFragment"; import { OrderErrorFragment } from "@saleor/orders/types/OrderErrorFragment";
import FormSpacer from "@saleor/components/FormSpacer"; import FormSpacer from "@saleor/components/FormSpacer";
import getOrderErrorMessage from "@saleor/utils/errors/order"; import getOrderErrorMessage from "@saleor/utils/errors/order";
import { WarehouseFragment } from "@saleor/warehouses/types/WarehouseFragment";
import SingleAutocompleteSelectField from "@saleor/components/SingleAutocompleteSelectField";
import createSingleAutocompleteSelectHandler from "@saleor/utils/handlers/singleAutocompleteSelectChangeHandler";
export interface FormData { export interface OrderFulfillmentCancelDialogFormData {
restock: boolean; warehouse: string;
} }
const useStyles = makeStyles( const useStyles = makeStyles(
theme => ({ theme => ({
deleteButton: { enableOverflow: {
"&:hover": { overflow: "visible"
backgroundColor: theme.palette.error.main },
}, paragraph: {
backgroundColor: theme.palette.error.main, marginBottom: theme.spacing(2)
color: theme.palette.error.contrastText },
selectCcontainer: {
width: "60%"
} }
}), }),
{ name: "OrderFulfillmentCancelDialog" } { name: "OrderFulfillmentCancelDialog" }
@ -39,69 +43,98 @@ export interface OrderFulfillmentCancelDialogProps {
confirmButtonState: ConfirmButtonTransitionState; confirmButtonState: ConfirmButtonTransitionState;
errors: OrderErrorFragment[]; errors: OrderErrorFragment[];
open: boolean; open: boolean;
warehouses: WarehouseFragment[];
onClose(); onClose();
onConfirm(data: FormData); onConfirm(data: OrderFulfillmentCancelDialogFormData);
} }
const OrderFulfillmentCancelDialog: React.FC<OrderFulfillmentCancelDialogProps> = props => { const OrderFulfillmentCancelDialog: React.FC<OrderFulfillmentCancelDialogProps> = props => {
const { confirmButtonState, errors, open, onConfirm, onClose } = props; const {
confirmButtonState,
errors,
open,
warehouses,
onConfirm,
onClose
} = props;
const classes = useStyles(props); const classes = useStyles(props);
const intl = useIntl(); const intl = useIntl();
const [displayValue, setDisplayValue] = React.useState("");
const choices = warehouses?.map(warehouse => ({
label: warehouse.name,
value: warehouse.id
}));
return ( return (
<Dialog onClose={onClose} open={open} fullWidth maxWidth="xs"> <Dialog
<Form initial={{ restock: true }} onSubmit={onConfirm}> classes={{
{({ change, data, submit }) => ( paper: classes.enableOverflow
<> }}
<DialogTitle> onClose={onClose}
<FormattedMessage open={open}
defaultMessage="Cancel Fulfillment" fullWidth
description="dialog header" maxWidth="sm"
/> >
</DialogTitle> <Form initial={{ warehouse: null }} onSubmit={onConfirm}>
<DialogContent> {({ change, data: formData, submit }) => {
<DialogContentText> const handleChange = createSingleAutocompleteSelectHandler(
<FormattedMessage defaultMessage="Are you sure you want to cancel this fulfillment?" /> change,
</DialogContentText> setDisplayValue,
<ControlledCheckbox choices
checked={data.restock} );
label={intl.formatMessage({ return (
defaultMessage: "Restock items?", <>
description: "switch button" <DialogTitle>
})}
name="restock"
onChange={change}
/>
{errors.length > 0 && (
<>
<FormSpacer />
{errors.map(err => (
<DialogContentText color="error">
{getOrderErrorMessage(err, intl)}
</DialogContentText>
))}
</>
)}
</DialogContent>
<DialogActions>
<Button onClick={onClose}>
<FormattedMessage {...buttonMessages.back} />
</Button>
<ConfirmButton
transitionState={confirmButtonState}
className={classes.deleteButton}
variant="contained"
onClick={submit}
>
<FormattedMessage <FormattedMessage
defaultMessage="Cancel fulfillment" defaultMessage="Cancel Fulfillment"
description="button" description="dialog header"
/> />
</ConfirmButton> </DialogTitle>
</DialogActions> <DialogContent className={classes.enableOverflow}>
</> <DialogContentText className={classes.paragraph}>
)} <FormattedMessage defaultMessage="Are you sure you want to cancel fulfillment? Canceling a fulfillment will restock products at a selected warehouse." />
</DialogContentText>
<div className={classes.selectCcontainer}>
<SingleAutocompleteSelectField
choices={choices}
displayValue={displayValue}
label={intl.formatMessage({
defaultMessage: "Select Warehouse",
description: "select warehouse to restock items"
})}
name="warehouse"
value={formData.warehouse}
onChange={handleChange}
/>
</div>
{errors.length > 0 && (
<>
<FormSpacer />
{errors.map(err => (
<DialogContentText color="error">
{getOrderErrorMessage(err, intl)}
</DialogContentText>
))}
</>
)}
</DialogContent>
<DialogActions>
<Button onClick={onClose}>
<FormattedMessage {...buttonMessages.back} />
</Button>
<ConfirmButton
transitionState={confirmButtonState}
variant="contained"
onClick={submit}
>
<FormattedMessage {...buttonMessages.accept} />
</ConfirmButton>
</DialogActions>
</>
);
}}
</Form> </Form>
</Dialog> </Dialog>
); );

View file

@ -2,6 +2,7 @@ import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
import { OrderErrorCode } from "@saleor/types/globalTypes"; import { OrderErrorCode } from "@saleor/types/globalTypes";
import { warehouseList } from "@saleor/warehouses/fixtures";
import OrderFulfillmentCancelDialog, { import OrderFulfillmentCancelDialog, {
OrderFulfillmentCancelDialogProps OrderFulfillmentCancelDialogProps
} from "../../../orders/components/OrderFulfillmentCancelDialog"; } from "../../../orders/components/OrderFulfillmentCancelDialog";
@ -12,7 +13,8 @@ const props: OrderFulfillmentCancelDialogProps = {
errors: [], errors: [],
onClose: () => undefined, onClose: () => undefined,
onConfirm: () => undefined, onConfirm: () => undefined,
open: true open: true,
warehouses: warehouseList
}; };
storiesOf("Orders / OrderFulfillmentCancelDialog", module) storiesOf("Orders / OrderFulfillmentCancelDialog", module)