saleor-dashboard/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx

191 lines
6.7 KiB
TypeScript
Raw Normal View History

2019-06-19 14:40:52 +00:00
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 {
createStyles,
Theme,
withStyles,
WithStyles
} from "@material-ui/core/styles";
import Table from "@material-ui/core/Table";
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableRow from "@material-ui/core/TableRow";
import TextField from "@material-ui/core/TextField";
import Typography from "@material-ui/core/Typography";
import { filter } from "fuzzaldrin";
2019-08-09 10:26:22 +00:00
import React from "react";
2019-06-19 14:40:52 +00:00
import Checkbox from "@saleor/components/Checkbox";
import ConfirmButton, {
ConfirmButtonTransitionState
} from "@saleor/components/ConfirmButton";
import Form from "@saleor/components/Form";
import FormSpacer from "@saleor/components/FormSpacer";
import Hr from "@saleor/components/Hr";
// tslint:disable no-submodule-imports
import { ShopInfo_shop_countries } from "@saleor/components/Shop/types/ShopInfo";
import i18n from "../../../i18n";
interface FormData {
allCountries: boolean;
countries: string[];
query: string;
}
export interface DiscountCountrySelectDialogProps {
confirmButtonState: ConfirmButtonTransitionState;
countries: ShopInfo_shop_countries[];
initial: string[];
open: boolean;
onClose: () => void;
onConfirm: (data: FormData) => void;
}
const styles = (theme: Theme) =>
createStyles({
checkboxCell: {
paddingLeft: 0
},
container: {
maxHeight: 500
},
heading: {
marginBottom: theme.spacing.unit * 2,
marginTop: theme.spacing.unit * 2
},
wideCell: {
width: "100%"
}
});
const DiscountCountrySelectDialog = withStyles(styles, {
name: "DiscountCountrySelectDialog"
})(
({
classes,
confirmButtonState,
onClose,
countries,
open,
initial,
onConfirm
}: DiscountCountrySelectDialogProps & WithStyles<typeof styles>) => {
const initialForm: FormData = {
allCountries: true,
countries: initial,
query: ""
};
return (
<Dialog onClose={onClose} open={open} fullWidth maxWidth="sm">
<Form initial={initialForm} onSubmit={onConfirm}>
{({ data, change }) => {
const countrySelectionMap = countries.reduce((acc, country) => {
acc[country.code] = !!data.countries.find(
selectedCountries => selectedCountries === country.code
);
return acc;
}, {});
return (
<>
<DialogTitle>{i18n.t("Assign Countries")}</DialogTitle>
<DialogContent>
<Typography>
{i18n.t(
"Choose countries, you want voucher to be limited to, from the list below"
)}
</Typography>
<FormSpacer />
<TextField
name="query"
value={data.query}
onChange={event => change(event, () => fetch(data.query))}
label={i18n.t("Search Countries", {
context: "country search input label"
})}
placeholder={i18n.t("Search by country name", {
context: "country search input placeholder"
})}
fullWidth
/>
</DialogContent>
<Hr />
<DialogContent className={classes.container}>
<Typography className={classes.heading} variant="subtitle1">
{i18n.t("Countries A to Z", {
context: "country selection"
})}
</Typography>
<Table>
<TableBody>
{filter(countries, data.query, {
key: "country"
}).map(country => {
const isChecked = countrySelectionMap[country.code];
return (
<TableRow key={country.code}>
<TableCell className={classes.wideCell}>
{country.country}
</TableCell>
<TableCell
padding="checkbox"
className={classes.checkboxCell}
>
<Checkbox
checked={isChecked}
onChange={() =>
isChecked
? change({
target: {
name: "countries" as keyof FormData,
value: data.countries.filter(
selectedCountries =>
selectedCountries !== country.code
)
}
} as any)
: change({
target: {
name: "countries" as keyof FormData,
value: [
...data.countries,
country.code
]
}
} as any)
}
/>
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</DialogContent>
<DialogActions>
<Button onClick={onClose}>
{i18n.t("Cancel", { context: "button" })}
</Button>
<ConfirmButton
transitionState={confirmButtonState}
color="primary"
variant="contained"
type="submit"
>
{i18n.t("Assign countries", { context: "button" })}
</ConfirmButton>
</DialogActions>
</>
);
}}
</Form>
</Dialog>
);
}
);
DiscountCountrySelectDialog.displayName = "DiscountCountrySelectDialog";
export default DiscountCountrySelectDialog;