saleor-dashboard/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx

170 lines
5 KiB
TypeScript
Raw Normal View History

import {
Button,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
Typography
} from "@material-ui/core";
2019-06-19 14:40:52 +00:00
import ConfirmButton, {
ConfirmButtonTransitionState
} from "@saleor/components/ConfirmButton";
import Form from "@saleor/components/Form";
import FormSpacer from "@saleor/components/FormSpacer";
2019-06-19 14:40:52 +00:00
import Money from "@saleor/components/Money";
import { SingleSelectField } from "@saleor/components/SingleSelectField";
import { OrderErrorFragment } from "@saleor/fragments/types/OrderErrorFragment";
import useModalDialogErrors from "@saleor/hooks/useModalDialogErrors";
import { buttonMessages } from "@saleor/intl";
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
import { makeStyles } from "@saleor/macaw-ui";
2020-03-16 12:28:52 +00:00
import { getFormErrors } from "@saleor/utils/errors";
import getOrderErrorMessage from "@saleor/utils/errors/order";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { OrderDetails_order_shippingMethods } from "../../types/OrderDetails";
2019-06-19 14:40:52 +00:00
export interface FormData {
shippingMethod: string;
}
2019-12-03 15:28:40 +00:00
const useStyles = makeStyles(
theme => ({
dialog: {
overflowY: "visible"
},
menuItem: {
display: "flex",
width: "100%",
flexWrap: "wrap"
2019-12-03 15:28:40 +00:00
},
price: {
marginRight: theme.spacing(3)
},
root: {
overflowY: "visible",
width: theme.breakpoints.values.sm,
margin: 0,
padding: theme.spacing(3)
2019-12-03 15:28:40 +00:00
},
shippingMethodName: {
flex: 1,
overflowX: "hidden",
textOverflow: "ellipsis"
},
message: {
width: "100%"
2019-12-03 15:28:40 +00:00
}
}),
{ name: "OrderShippingMethodEditDialog" }
);
2019-06-19 14:40:52 +00:00
2020-03-16 12:28:52 +00:00
export interface OrderShippingMethodEditDialogProps {
2019-06-19 14:40:52 +00:00
confirmButtonState: ConfirmButtonTransitionState;
2020-03-16 12:28:52 +00:00
errors: OrderErrorFragment[];
2019-06-19 14:40:52 +00:00
open: boolean;
shippingMethod: string;
shippingMethods?: OrderDetails_order_shippingMethods[];
2019-06-19 14:40:52 +00:00
onClose();
onSubmit?(data: FormData);
}
2020-03-16 12:28:52 +00:00
const OrderShippingMethodEditDialog: React.FC<OrderShippingMethodEditDialogProps> = props => {
2019-10-30 14:34:24 +00:00
const {
2019-06-19 14:40:52 +00:00
confirmButtonState,
2020-03-16 12:28:52 +00:00
errors: apiErrors,
2019-06-19 14:40:52 +00:00
open,
shippingMethod,
shippingMethods,
onClose,
onSubmit
2019-10-30 14:34:24 +00:00
} = props;
const classes = useStyles(props);
2020-03-16 12:28:52 +00:00
const errors = useModalDialogErrors(apiErrors, open);
const intl = useIntl();
const formFields = ["shippingMethod"];
const formErrors = getFormErrors(formFields, errors);
const nonFieldErrors = errors.filter(err => !formFields.includes(err.field));
2019-10-30 14:34:24 +00:00
const choices = shippingMethods
? shippingMethods
.map(s => ({
label: (
<div className={classes.menuItem}>
<span className={classes.shippingMethodName}>{s.name}</span>
&nbsp;
<span className={classes.price}>
<Money money={s.price} />
</span>
{!s.active && (
<Typography className={classes.message} variant="caption">
{s.message}
</Typography>
)}
</div>
),
disabled: !s.active,
value: s.id
}))
.sort((x, y) => (x.disabled === y.disabled ? 0 : x.disabled ? 1 : -1))
2019-10-30 14:34:24 +00:00
: [];
const initialForm: FormData = {
shippingMethod
};
2020-03-16 12:28:52 +00:00
2019-10-30 14:34:24 +00:00
return (
<Dialog onClose={onClose} open={open} classes={{ paper: classes.dialog }}>
<DialogTitle>
<FormattedMessage
defaultMessage="Edit Shipping Method"
description="dialog header"
/>
</DialogTitle>
<Form initial={initialForm} onSubmit={onSubmit}>
{({ change, data }) => (
<>
<DialogContent className={classes.root}>
<SingleSelectField
choices={choices}
2020-03-16 12:28:52 +00:00
error={!!formErrors.shippingMethod}
hint={getOrderErrorMessage(formErrors.shippingMethod, intl)}
2019-10-30 14:34:24 +00:00
name="shippingMethod"
value={data.shippingMethod}
onChange={change}
/>
2020-03-16 12:28:52 +00:00
{nonFieldErrors.length > 0 && (
<>
<FormSpacer />
{nonFieldErrors.map((err, index) => (
<DialogContentText color="error" key={index}>
2020-03-16 12:28:52 +00:00
{getOrderErrorMessage(err, intl)}
</DialogContentText>
))}
</>
)}
2019-10-30 14:34:24 +00:00
</DialogContent>
<DialogActions>
<Button onClick={onClose}>
<FormattedMessage {...buttonMessages.back} />
</Button>
<ConfirmButton
transitionState={confirmButtonState}
color="primary"
variant="contained"
type="submit"
disabled={!data.shippingMethod}
2019-10-30 14:34:24 +00:00
>
<FormattedMessage {...buttonMessages.confirm} />
</ConfirmButton>
</DialogActions>
</>
)}
</Form>
</Dialog>
);
};
2019-06-19 14:40:52 +00:00
OrderShippingMethodEditDialog.displayName = "OrderShippingMethodEditDialog";
export default OrderShippingMethodEditDialog;