Allow creating warehouse from shipping zone view
This commit is contained in:
parent
60ec16961c
commit
93d1d74230
6 changed files with 420 additions and 180 deletions
190
src/components/CompanyAddressInput/CompanyAddressForm.tsx
Normal file
190
src/components/CompanyAddressInput/CompanyAddressForm.tsx
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
import { makeStyles } from "@material-ui/core/styles";
|
||||||
|
import TextField from "@material-ui/core/TextField";
|
||||||
|
import React from "react";
|
||||||
|
import { useIntl, IntlShape } from "react-intl";
|
||||||
|
|
||||||
|
import FormSpacer from "@saleor/components/FormSpacer";
|
||||||
|
import Grid from "@saleor/components/Grid";
|
||||||
|
import SingleAutocompleteSelectField, {
|
||||||
|
SingleAutocompleteChoiceType
|
||||||
|
} from "@saleor/components/SingleAutocompleteSelectField";
|
||||||
|
import { AddressTypeInput } from "@saleor/customers/types";
|
||||||
|
import { ChangeEvent } from "@saleor/hooks/useForm";
|
||||||
|
import getShopErrorMessage from "@saleor/utils/errors/shop";
|
||||||
|
import { getFormErrors } from "@saleor/utils/errors";
|
||||||
|
import { ShopErrorFragment } from "@saleor/siteSettings/types/ShopErrorFragment";
|
||||||
|
import { AccountErrorFragment } from "@saleor/customers/types/AccountErrorFragment";
|
||||||
|
import getAccountErrorMessage from "@saleor/utils/errors/account";
|
||||||
|
|
||||||
|
export interface CompanyAddressFormProps {
|
||||||
|
countries: SingleAutocompleteChoiceType[];
|
||||||
|
data: AddressTypeInput;
|
||||||
|
displayCountry: string;
|
||||||
|
errors: Array<AccountErrorFragment | ShopErrorFragment>;
|
||||||
|
disabled: boolean;
|
||||||
|
onChange: (event: ChangeEvent) => void;
|
||||||
|
onCountryChange: (event: ChangeEvent) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const useStyles = makeStyles(
|
||||||
|
{
|
||||||
|
root: {}
|
||||||
|
},
|
||||||
|
{ name: "CompanyAddressForm" }
|
||||||
|
);
|
||||||
|
|
||||||
|
function getErrorMessage(
|
||||||
|
err: AccountErrorFragment | ShopErrorFragment,
|
||||||
|
intl: IntlShape
|
||||||
|
): string {
|
||||||
|
if (err?.__typename === "AccountError") {
|
||||||
|
return getAccountErrorMessage(err, intl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return getShopErrorMessage(err, intl);
|
||||||
|
}
|
||||||
|
|
||||||
|
const CompanyAddressForm: React.FC<CompanyAddressFormProps> = props => {
|
||||||
|
const {
|
||||||
|
countries,
|
||||||
|
data,
|
||||||
|
disabled,
|
||||||
|
displayCountry,
|
||||||
|
errors,
|
||||||
|
onChange,
|
||||||
|
onCountryChange
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
const classes = useStyles(props);
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
|
const formFields = [
|
||||||
|
"companyName",
|
||||||
|
"streetAddress1",
|
||||||
|
"streetAddress2",
|
||||||
|
"city",
|
||||||
|
"postalCode",
|
||||||
|
"country",
|
||||||
|
"companyArea",
|
||||||
|
"phone"
|
||||||
|
];
|
||||||
|
const formErrors = getFormErrors(formFields, errors);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={classes.root}>
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.companyName}
|
||||||
|
helperText={getErrorMessage(formErrors.companyName, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Company"
|
||||||
|
})}
|
||||||
|
name={"companyName" as keyof AddressTypeInput}
|
||||||
|
onChange={onChange}
|
||||||
|
value={data.companyName}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<FormSpacer />
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.streetAddress1}
|
||||||
|
helperText={getErrorMessage(formErrors.streetAddress1, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Address line 1"
|
||||||
|
})}
|
||||||
|
name={"streetAddress1" as keyof AddressTypeInput}
|
||||||
|
onChange={onChange}
|
||||||
|
value={data.streetAddress1}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<FormSpacer />
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.streetAddress2}
|
||||||
|
helperText={getErrorMessage(formErrors.streetAddress2, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Address line 2"
|
||||||
|
})}
|
||||||
|
name={"streetAddress2" as keyof AddressTypeInput}
|
||||||
|
onChange={onChange}
|
||||||
|
value={data.streetAddress2}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<FormSpacer />
|
||||||
|
<Grid>
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.city}
|
||||||
|
helperText={getErrorMessage(formErrors.city, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "City"
|
||||||
|
})}
|
||||||
|
name={"city" as keyof AddressTypeInput}
|
||||||
|
onChange={onChange}
|
||||||
|
value={data.city}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.postalCode}
|
||||||
|
helperText={getErrorMessage(formErrors.postalCode, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "ZIP / Postal code"
|
||||||
|
})}
|
||||||
|
name={"postalCode" as keyof AddressTypeInput}
|
||||||
|
onChange={onChange}
|
||||||
|
value={data.postalCode}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
<FormSpacer />
|
||||||
|
<Grid>
|
||||||
|
<SingleAutocompleteSelectField
|
||||||
|
disabled={disabled}
|
||||||
|
displayValue={displayCountry}
|
||||||
|
error={!!formErrors.country}
|
||||||
|
helperText={getErrorMessage(formErrors.country, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Country"
|
||||||
|
})}
|
||||||
|
name={"country" as keyof AddressTypeInput}
|
||||||
|
onChange={onCountryChange}
|
||||||
|
value={data.country}
|
||||||
|
choices={countries}
|
||||||
|
InputProps={{
|
||||||
|
inputProps: {
|
||||||
|
autocomplete: "plsdontautocomplete" // Somehow it shuts it down
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.countryArea}
|
||||||
|
helperText={getErrorMessage(formErrors.countryArea, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Country area"
|
||||||
|
})}
|
||||||
|
name={"countryArea" as keyof AddressTypeInput}
|
||||||
|
onChange={onChange}
|
||||||
|
value={data.countryArea}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
<FormSpacer />
|
||||||
|
<TextField
|
||||||
|
disabled={disabled}
|
||||||
|
error={!!formErrors.phone}
|
||||||
|
fullWidth
|
||||||
|
helperText={getErrorMessage(formErrors.phone, intl)}
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Phone"
|
||||||
|
})}
|
||||||
|
name={"phone" as keyof AddressTypeInput}
|
||||||
|
value={data.phone}
|
||||||
|
onChange={onChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
CompanyAddressForm.displayName = "CompanyAddressForm";
|
||||||
|
export default CompanyAddressForm;
|
|
@ -1,33 +1,17 @@
|
||||||
import Card from "@material-ui/core/Card";
|
import Card from "@material-ui/core/Card";
|
||||||
import CardContent from "@material-ui/core/CardContent";
|
import CardContent from "@material-ui/core/CardContent";
|
||||||
import { makeStyles } from "@material-ui/core/styles";
|
import { makeStyles } from "@material-ui/core/styles";
|
||||||
import TextField from "@material-ui/core/TextField";
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useIntl, IntlShape } from "react-intl";
|
import classNames from "classnames";
|
||||||
|
|
||||||
import CardTitle from "@saleor/components/CardTitle";
|
import CardTitle from "../CardTitle";
|
||||||
import FormSpacer from "@saleor/components/FormSpacer";
|
import CompanyAddressForm, {
|
||||||
import Grid from "@saleor/components/Grid";
|
CompanyAddressFormProps
|
||||||
import SingleAutocompleteSelectField, {
|
} from "./CompanyAddressForm";
|
||||||
SingleAutocompleteChoiceType
|
|
||||||
} from "@saleor/components/SingleAutocompleteSelectField";
|
|
||||||
import { ChangeEvent } from "@saleor/hooks/useForm";
|
|
||||||
import { getFormErrors } from "@saleor/utils/errors";
|
|
||||||
import { ShopErrorFragment } from "@saleor/siteSettings/types/ShopErrorFragment";
|
|
||||||
import getShopErrorMessage from "@saleor/utils/errors/shop";
|
|
||||||
import { AccountErrorFragment } from "@saleor/customers/types/AccountErrorFragment";
|
|
||||||
import getAccountErrorMessage from "@saleor/utils/errors/account";
|
|
||||||
import { AddressTypeInput } from "@saleor/customers/types";
|
|
||||||
|
|
||||||
interface CompanyAddressInputProps {
|
interface CompanyAddressInputProps extends CompanyAddressFormProps {
|
||||||
countries: SingleAutocompleteChoiceType[];
|
className: string;
|
||||||
data: AddressTypeInput;
|
|
||||||
displayCountry: string;
|
|
||||||
errors: Array<AccountErrorFragment | ShopErrorFragment>;
|
|
||||||
disabled: boolean;
|
|
||||||
header: string;
|
header: string;
|
||||||
onChange: (event: ChangeEvent) => void;
|
|
||||||
onCountryChange: (event: ChangeEvent) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const useStyles = makeStyles(
|
const useStyles = makeStyles(
|
||||||
|
@ -39,159 +23,15 @@ const useStyles = makeStyles(
|
||||||
{ name: "CompanyAddressInput" }
|
{ name: "CompanyAddressInput" }
|
||||||
);
|
);
|
||||||
|
|
||||||
function getErrorMessage(
|
|
||||||
err: AccountErrorFragment | ShopErrorFragment,
|
|
||||||
intl: IntlShape
|
|
||||||
): string {
|
|
||||||
if (err?.__typename === "AccountError") {
|
|
||||||
return getAccountErrorMessage(err, intl);
|
|
||||||
}
|
|
||||||
|
|
||||||
return getShopErrorMessage(err, intl);
|
|
||||||
}
|
|
||||||
|
|
||||||
const CompanyAddressInput: React.FC<CompanyAddressInputProps> = props => {
|
const CompanyAddressInput: React.FC<CompanyAddressInputProps> = props => {
|
||||||
const {
|
const { className, header, ...formProps } = props;
|
||||||
countries,
|
|
||||||
data,
|
|
||||||
disabled,
|
|
||||||
displayCountry,
|
|
||||||
errors,
|
|
||||||
header,
|
|
||||||
onChange,
|
|
||||||
onCountryChange
|
|
||||||
} = props;
|
|
||||||
|
|
||||||
const classes = useStyles(props);
|
const classes = useStyles(props);
|
||||||
const intl = useIntl();
|
|
||||||
|
|
||||||
const formFields = [
|
|
||||||
"companyName",
|
|
||||||
"streetAddress1",
|
|
||||||
"streetAddress2",
|
|
||||||
"city",
|
|
||||||
"postalCode",
|
|
||||||
"country",
|
|
||||||
"companyArea",
|
|
||||||
"phone"
|
|
||||||
];
|
|
||||||
const formErrors = getFormErrors(formFields, errors);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className={classes.root}>
|
<Card className={classNames(classes.root, className)}>
|
||||||
<CardTitle title={header} />
|
<CardTitle title={header} />
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<TextField
|
<CompanyAddressForm {...formProps} />
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.companyName}
|
|
||||||
helperText={getErrorMessage(formErrors.companyName, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "Company"
|
|
||||||
})}
|
|
||||||
name={"companyName" as keyof AddressTypeInput}
|
|
||||||
onChange={onChange}
|
|
||||||
value={data.companyName}
|
|
||||||
fullWidth
|
|
||||||
/>
|
|
||||||
<FormSpacer />
|
|
||||||
<TextField
|
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.streetAddress1}
|
|
||||||
helperText={getErrorMessage(formErrors.streetAddress1, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "Address line 1"
|
|
||||||
})}
|
|
||||||
name={"streetAddress1" as keyof AddressTypeInput}
|
|
||||||
onChange={onChange}
|
|
||||||
value={data.streetAddress1}
|
|
||||||
fullWidth
|
|
||||||
/>
|
|
||||||
<FormSpacer />
|
|
||||||
<TextField
|
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.streetAddress2}
|
|
||||||
helperText={getErrorMessage(formErrors.streetAddress2, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "Address line 2"
|
|
||||||
})}
|
|
||||||
name={"streetAddress2" as keyof AddressTypeInput}
|
|
||||||
onChange={onChange}
|
|
||||||
value={data.streetAddress2}
|
|
||||||
fullWidth
|
|
||||||
/>
|
|
||||||
<FormSpacer />
|
|
||||||
<Grid>
|
|
||||||
<TextField
|
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.city}
|
|
||||||
helperText={getErrorMessage(formErrors.city, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "City"
|
|
||||||
})}
|
|
||||||
name={"city" as keyof AddressTypeInput}
|
|
||||||
onChange={onChange}
|
|
||||||
value={data.city}
|
|
||||||
fullWidth
|
|
||||||
/>
|
|
||||||
<TextField
|
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.postalCode}
|
|
||||||
helperText={getErrorMessage(formErrors.postalCode, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "ZIP / Postal code"
|
|
||||||
})}
|
|
||||||
name={"postalCode" as keyof AddressTypeInput}
|
|
||||||
onChange={onChange}
|
|
||||||
value={data.postalCode}
|
|
||||||
fullWidth
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<FormSpacer />
|
|
||||||
<Grid>
|
|
||||||
<SingleAutocompleteSelectField
|
|
||||||
disabled={disabled}
|
|
||||||
displayValue={displayCountry}
|
|
||||||
error={!!formErrors.country}
|
|
||||||
helperText={getErrorMessage(formErrors.country, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "Country"
|
|
||||||
})}
|
|
||||||
name={"country" as keyof AddressTypeInput}
|
|
||||||
onChange={onCountryChange}
|
|
||||||
value={data.country}
|
|
||||||
choices={countries}
|
|
||||||
InputProps={{
|
|
||||||
inputProps: {
|
|
||||||
autocomplete: "plsdontautocomplete" // Somehow it shuts it down
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<TextField
|
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.countryArea}
|
|
||||||
helperText={getErrorMessage(formErrors.countryArea, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "Country area"
|
|
||||||
})}
|
|
||||||
name={"countryArea" as keyof AddressTypeInput}
|
|
||||||
onChange={onChange}
|
|
||||||
value={data.countryArea}
|
|
||||||
fullWidth
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<FormSpacer />
|
|
||||||
<TextField
|
|
||||||
disabled={disabled}
|
|
||||||
error={!!formErrors.phone}
|
|
||||||
fullWidth
|
|
||||||
helperText={getErrorMessage(formErrors.phone, intl)}
|
|
||||||
label={intl.formatMessage({
|
|
||||||
defaultMessage: "Phone"
|
|
||||||
})}
|
|
||||||
name={"phone" as keyof AddressTypeInput}
|
|
||||||
value={data.phone}
|
|
||||||
onChange={onChange}
|
|
||||||
/>
|
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
|
@ -26,7 +26,7 @@ const useStyles = makeStyles(
|
||||||
|
|
||||||
export interface SingleAutocompleteSelectFieldProps
|
export interface SingleAutocompleteSelectFieldProps
|
||||||
extends Partial<FetchMoreProps> {
|
extends Partial<FetchMoreProps> {
|
||||||
add: SingleAutocompleteActionType;
|
add?: SingleAutocompleteActionType;
|
||||||
error?: boolean;
|
error?: boolean;
|
||||||
name: string;
|
name: string;
|
||||||
displayValue: string;
|
displayValue: string;
|
||||||
|
@ -147,13 +147,15 @@ const SingleAutocompleteSelectFieldComponent: React.FC<SingleAutocompleteSelectF
|
||||||
/>
|
/>
|
||||||
{isOpen && (!!inputValue || !!choices.length) && (
|
{isOpen && (!!inputValue || !!choices.length) && (
|
||||||
<SingleAutocompleteSelectFieldContent
|
<SingleAutocompleteSelectFieldContent
|
||||||
add={{
|
add={
|
||||||
|
!!add && {
|
||||||
...add,
|
...add,
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
add.onClick();
|
add.onClick();
|
||||||
closeMenu();
|
closeMenu();
|
||||||
}
|
}
|
||||||
}}
|
}
|
||||||
|
}
|
||||||
choices={choices}
|
choices={choices}
|
||||||
displayCustomValue={displayCustomValue}
|
displayCustomValue={displayCustomValue}
|
||||||
emptyOption={emptyOption}
|
emptyOption={emptyOption}
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
import Button from "@material-ui/core/Button";
|
||||||
|
import Dialog from "@material-ui/core/Dialog";
|
||||||
|
import DialogActions from "@material-ui/core/DialogActions";
|
||||||
|
import DialogContent from "@material-ui/core/DialogContent";
|
||||||
|
import DialogTitle from "@material-ui/core/DialogTitle";
|
||||||
|
import TextField from "@material-ui/core/TextField";
|
||||||
|
import React from "react";
|
||||||
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
|
import makeStyles from "@material-ui/core/styles/makeStyles";
|
||||||
|
|
||||||
|
import ConfirmButton, {
|
||||||
|
ConfirmButtonTransitionState
|
||||||
|
} from "@saleor/components/ConfirmButton";
|
||||||
|
import { DialogProps, UserError } from "@saleor/types";
|
||||||
|
import { AddressTypeInput } from "@saleor/customers/types";
|
||||||
|
import useModalDialogOpen from "@saleor/hooks/useModalDialogOpen";
|
||||||
|
import useModalDialogErrors from "@saleor/hooks/useModalDialogErrors";
|
||||||
|
import CompanyAddressForm from "@saleor/components/CompanyAddressInput/CompanyAddressForm";
|
||||||
|
import { buttonMessages } from "@saleor/intl";
|
||||||
|
import Hr from "@saleor/components/Hr";
|
||||||
|
import Form from "@saleor/components/Form";
|
||||||
|
import useAddressValidation from "@saleor/hooks/useAddressValidation";
|
||||||
|
import useStateFromProps from "@saleor/hooks/useStateFromProps";
|
||||||
|
import { ShopInfo_shop_countries } from "@saleor/components/Shop/types/ShopInfo";
|
||||||
|
import createSingleAutocompleteSelectHandler from "@saleor/utils/handlers/singleAutocompleteSelectChangeHandler";
|
||||||
|
import FormSpacer from "@saleor/components/FormSpacer";
|
||||||
|
|
||||||
|
export interface ShippingZoneAddWarehouseDialogSubmitData
|
||||||
|
extends AddressTypeInput {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
export interface ShippingZoneAddWarehouseDialogProps extends DialogProps {
|
||||||
|
confirmButtonState: ConfirmButtonTransitionState;
|
||||||
|
countries: ShopInfo_shop_countries[];
|
||||||
|
disabled: boolean;
|
||||||
|
errors: UserError[];
|
||||||
|
onSubmit: (data: ShippingZoneAddWarehouseDialogSubmitData) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const initialForm: ShippingZoneAddWarehouseDialogSubmitData = {
|
||||||
|
city: "",
|
||||||
|
cityArea: "",
|
||||||
|
companyName: "",
|
||||||
|
country: "",
|
||||||
|
countryArea: "",
|
||||||
|
firstName: "",
|
||||||
|
lastName: "",
|
||||||
|
name: "",
|
||||||
|
phone: "",
|
||||||
|
postalCode: "",
|
||||||
|
streetAddress1: "",
|
||||||
|
streetAddress2: ""
|
||||||
|
};
|
||||||
|
|
||||||
|
const useStyles = makeStyles(
|
||||||
|
{
|
||||||
|
overflow: {
|
||||||
|
overflowY: "visible"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ShippingZoneAddWarehouseDialog"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const ShippingZoneAddWarehouseDialog: React.FC<ShippingZoneAddWarehouseDialogProps> = ({
|
||||||
|
confirmButtonState,
|
||||||
|
countries,
|
||||||
|
disabled,
|
||||||
|
errors: apiErrors,
|
||||||
|
open,
|
||||||
|
onClose,
|
||||||
|
onSubmit
|
||||||
|
}) => {
|
||||||
|
const classes = useStyles({});
|
||||||
|
const [countryDisplayName, setCountryDisplayName] = useStateFromProps("");
|
||||||
|
const {
|
||||||
|
errors: validationErrors,
|
||||||
|
submit: handleSubmit
|
||||||
|
} = useAddressValidation(onSubmit);
|
||||||
|
const errors = useModalDialogErrors(
|
||||||
|
[...apiErrors, ...validationErrors],
|
||||||
|
open
|
||||||
|
);
|
||||||
|
useModalDialogOpen(open, {});
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
|
const countryChoices = countries.map(country => ({
|
||||||
|
label: country.country,
|
||||||
|
value: country.code
|
||||||
|
}));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dialog
|
||||||
|
classes={{ paper: classes.overflow }}
|
||||||
|
onClose={onClose}
|
||||||
|
open={open}
|
||||||
|
fullWidth
|
||||||
|
maxWidth="sm"
|
||||||
|
>
|
||||||
|
<DialogTitle>
|
||||||
|
<FormattedMessage
|
||||||
|
defaultMessage="Create New Warehouse"
|
||||||
|
description="header, dialog"
|
||||||
|
/>
|
||||||
|
</DialogTitle>
|
||||||
|
<Form errors={errors} initial={initialForm} onSubmit={handleSubmit}>
|
||||||
|
{({ change, data, errors: formErrors, submit }) => {
|
||||||
|
const handleCountrySelect = createSingleAutocompleteSelectHandler(
|
||||||
|
change,
|
||||||
|
setCountryDisplayName,
|
||||||
|
countryChoices
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<DialogContent className={classes.overflow}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
label={intl.formatMessage({
|
||||||
|
defaultMessage: "Warehouse Name"
|
||||||
|
})}
|
||||||
|
name="name"
|
||||||
|
value={data.name}
|
||||||
|
onChange={change}
|
||||||
|
/>
|
||||||
|
<FormSpacer />
|
||||||
|
<Hr />
|
||||||
|
<FormSpacer />
|
||||||
|
<CompanyAddressForm
|
||||||
|
countries={countryChoices}
|
||||||
|
data={data}
|
||||||
|
disabled={disabled}
|
||||||
|
displayCountry={countryDisplayName}
|
||||||
|
errors={formErrors}
|
||||||
|
onChange={change}
|
||||||
|
onCountryChange={handleCountrySelect}
|
||||||
|
/>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={onClose}>
|
||||||
|
<FormattedMessage {...buttonMessages.back} />
|
||||||
|
</Button>
|
||||||
|
<ConfirmButton
|
||||||
|
transitionState={confirmButtonState}
|
||||||
|
color="primary"
|
||||||
|
variant="contained"
|
||||||
|
type="submit"
|
||||||
|
>
|
||||||
|
<FormattedMessage {...buttonMessages.create} />
|
||||||
|
</ConfirmButton>
|
||||||
|
</DialogActions>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form>
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ShippingZoneAddWarehouseDialog.displayName = "ShippingZoneAddWarehouseDialog";
|
||||||
|
export default ShippingZoneAddWarehouseDialog;
|
|
@ -0,0 +1,2 @@
|
||||||
|
export { default } from "./ShippingZoneAddWarehouseDialog";
|
||||||
|
export * from "./ShippingZoneAddWarehouseDialog";
|
|
@ -21,8 +21,13 @@ import ShippingZoneRateDialog from "@saleor/shipping/components/ShippingZoneRate
|
||||||
import useShop from "@saleor/hooks/useShop";
|
import useShop from "@saleor/hooks/useShop";
|
||||||
import ShippingZoneCountriesAssignDialog from "@saleor/shipping/components/ShippingZoneCountriesAssignDialog";
|
import ShippingZoneCountriesAssignDialog from "@saleor/shipping/components/ShippingZoneCountriesAssignDialog";
|
||||||
import NotFoundPage from "@saleor/components/NotFoundPage";
|
import NotFoundPage from "@saleor/components/NotFoundPage";
|
||||||
import { getStringOrPlaceholder } from "../../../misc";
|
import ShippingZoneAddWarehouseDialog from "@saleor/shipping/components/ShippingZoneAddWarehouseDialog";
|
||||||
import { ShippingMethodTypeEnum } from "../../../types/globalTypes";
|
import { useWarehouseCreate } from "@saleor/warehouses/mutations";
|
||||||
|
import { getStringOrPlaceholder, findValueInEnum } from "../../../misc";
|
||||||
|
import {
|
||||||
|
ShippingMethodTypeEnum,
|
||||||
|
CountryCode
|
||||||
|
} from "../../../types/globalTypes";
|
||||||
import ShippingZoneDetailsPage, {
|
import ShippingZoneDetailsPage, {
|
||||||
FormData
|
FormData
|
||||||
} from "../../components/ShippingZoneDetailsPage";
|
} from "../../components/ShippingZoneDetailsPage";
|
||||||
|
@ -126,6 +131,17 @@ const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [createWarehouse, createWarehouseOpts] = useWarehouseCreate({
|
||||||
|
onCompleted: data => {
|
||||||
|
if (data.createWarehouse.errors.length === 0) {
|
||||||
|
notify({
|
||||||
|
text: intl.formatMessage(commonMessages.savedChanges)
|
||||||
|
});
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const handleSubmit = (data: FormData) => {
|
const handleSubmit = (data: FormData) => {
|
||||||
updateShippingZone({
|
updateShippingZone({
|
||||||
variables: {
|
variables: {
|
||||||
|
@ -138,7 +154,7 @@ const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
|
||||||
assignToWarehouse({
|
assignToWarehouse({
|
||||||
variables: {
|
variables: {
|
||||||
shippingZoneId: id,
|
shippingZoneId: id,
|
||||||
warehouseId: data.warehouse
|
warehouseId: data.warehouses[0]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -346,6 +362,34 @@ const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
|
||||||
/>
|
/>
|
||||||
</DialogContentText>
|
</DialogContentText>
|
||||||
</ActionDialog>
|
</ActionDialog>
|
||||||
|
<ShippingZoneAddWarehouseDialog
|
||||||
|
countries={shop?.countries || []}
|
||||||
|
disabled={createWarehouseOpts.loading}
|
||||||
|
open={params.action === "add-warehouse"}
|
||||||
|
confirmButtonState={createWarehouseOpts.status}
|
||||||
|
errors={createWarehouseOpts.data?.createWarehouse.errors || []}
|
||||||
|
onClose={closeModal}
|
||||||
|
onSubmit={data =>
|
||||||
|
createWarehouse({
|
||||||
|
variables: {
|
||||||
|
input: {
|
||||||
|
address: {
|
||||||
|
city: data.city,
|
||||||
|
cityArea: data.cityArea,
|
||||||
|
country: findValueInEnum(data.country, CountryCode),
|
||||||
|
countryArea: data.countryArea,
|
||||||
|
phone: data.phone,
|
||||||
|
postalCode: data.postalCode,
|
||||||
|
streetAddress1: data.streetAddress1,
|
||||||
|
streetAddress2: data.streetAddress2
|
||||||
|
},
|
||||||
|
companyName: data.companyName,
|
||||||
|
name: data.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue