diff --git a/assets/images/close-thin.svg b/assets/images/close-thin.svg new file mode 100644 index 000000000..eebda0b81 --- /dev/null +++ b/assets/images/close-thin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/VisibilityCard/DateVisibilitySelector.tsx b/src/components/VisibilityCard/DateVisibilitySelector.tsx new file mode 100644 index 000000000..dbc6d0681 --- /dev/null +++ b/src/components/VisibilityCard/DateVisibilitySelector.tsx @@ -0,0 +1,83 @@ +import closeIcon from "@assets/images/close-thin.svg"; +import { Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; +import React, { useState } from "react"; + +import FormSpacer from "../FormSpacer"; + +const CLOSE_ICON_SIZE = 14; + +const useStyles = makeStyles( + theme => ({ + buttonText: { + color: theme.palette.primary.main, + cursor: "pointer", + fontSize: 14, + marginBottom: theme.spacing(1), + paddingBottom: 10, + paddingTop: 0 + }, + container: { + alignItems: "baseline", + display: "flex", + flexDirection: "row", + justifyContent: "space-between" + }, + icon: { + cursor: "pointer", + marginLeft: theme.spacing(2) + } + }), + { name: "closeableInputWrapper" } +); + +interface Props { + buttonText: string; + children: React.ReactNode; + onInputClose: () => void; +} + +const DateVisibilitySelector = ({ + buttonText, + children, + onInputClose +}: Props) => { + const classes = useStyles({}); + + const [showInput, setShowInput] = useState(false); + + const handleCloseIconClick = () => { + setShowInput(false); + onInputClose(); + }; + + if (!showInput) { + return ( + setShowInput(true)} + > + {buttonText} + + ); + } + + return ( + <> +
+ {children} +
+ +
+
+ + + ); +}; + +export default DateVisibilitySelector; diff --git a/src/components/VisibilityCard/VisibilityCard.tsx b/src/components/VisibilityCard/VisibilityCard.tsx index a97754e83..c915fe5af 100644 --- a/src/components/VisibilityCard/VisibilityCard.tsx +++ b/src/components/VisibilityCard/VisibilityCard.tsx @@ -12,11 +12,12 @@ import { ChangeEvent } from "@saleor/hooks/useForm"; import { UserError } from "@saleor/types"; import { getFieldError } from "@saleor/utils/errors"; import classNames from "classnames"; -import React, { useState } from "react"; +import React from "react"; import { useIntl } from "react-intl"; import { DateContext } from "../Date/DateContext"; import FormSpacer from "../FormSpacer"; +import DateVisibilitySelector from "./DateVisibilitySelector"; const useStyles = makeStyles( theme => ({ @@ -36,7 +37,7 @@ const useStyles = makeStyles( "& svg": { fill: theme.palette.primary.main }, - marginTop: theme.spacing(3) + marginTop: theme.spacing(1) }, label: { lineHeight: 1.2, @@ -48,14 +49,11 @@ const useStyles = makeStyles( }, secondLabel: { color: theme.palette.text.hint, - fontSize: 12 + fontSize: 12, + marginBottom: theme.spacing(2) }, - setPublicationDate: { - color: theme.palette.primary.main, - cursor: "pointer", - fontSize: 14, - paddingBottom: 10, - paddingTop: 0 + switchField: { + marginTop: theme.spacing(1) } }), { name: "VisibilityCard" } @@ -108,13 +106,6 @@ export const VisibilityCard: React.FC = props => { const hasAvailableProps = isAvailable !== undefined && availableForPurchase !== undefined; - const [isPublicationDate, setPublicationDate] = useState( - publicationDate === null ? true : false - ); - const [isAvailableDate, setAvailableDate] = useState( - availableForPurchase === null ? true : false - ); - const visibleMessage = (date: string) => intl.formatMessage( { @@ -168,36 +159,33 @@ export const VisibilityCard: React.FC = props => { onChange={onChange} /> {!isPublished && ( - <> - setPublicationDate(!isPublicationDate)} - > - {intl.formatMessage({ - defaultMessage: "Set publication date" + + onChange({ target: { name: "publicationDate", value: null } }) + } + > + - {isPublicationDate && ( - - )} - + name="publicationDate" + type="date" + fullWidth={true} + helperText={getFieldError(errors, "publicationDate")?.message} + value={publicationDate ? publicationDate : ""} + onChange={onChange} + className={classes.date} + InputLabelProps={{ + shrink: true + }} + /> + )} {getFieldError(errors, "isPublished") && ( <> @@ -211,6 +199,7 @@ export const VisibilityCard: React.FC = props => { <>
= props => { }} /> {!isAvailable && ( - <> - setAvailableDate(!isAvailable)} - > - {messages.setAvailabilityDateLabel} - - {isAvailableDate && ( - - )} - + + onChange({ + target: { name: "availableForPurchase", value: null } + }) + } + > + + )} {getFieldError(errors, "isAvailableForPurchase") && ( <> diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx index a83cca3f4..5e31acecb 100644 --- a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx @@ -187,45 +187,50 @@ export const ProductUpdatePage: React.FC = ({ value: taxType.taxCode })) || []; - const handleSubmit = (data: ProductUpdatePageFormData) => { + const getAvailabilityData = (data: ProductUpdatePageFormData) => ({ + isAvailableForPurchase: !!data.availableForPurchase, + isPublished: !!data.publicationDate + }); + + const getStocksData = () => { + if (product.productType.hasVariants) { + return { removeStocks: [], updateStocks: [] }; + } + + const dataStocks = stocks.map(stock => stock.id); + const variantStocks = product.variants[0]?.stocks.map( + stock => stock.warehouse.id + ); + const stockDiff = diff(variantStocks, dataStocks); + + return { + removeStocks: stockDiff.removed, + updateStocks: stocks.filter( + stock => !stockDiff.added.some(addedStock => addedStock === stock.id) + ) + }; + }; + + const getParsedData = (data: ProductUpdatePageFormData) => { const metadata = isMetadataModified ? data.metadata : undefined; const privateMetadata = isPrivateMetadataModified ? data.privateMetadata : undefined; - if (product.productType.hasVariants) { - onSubmit({ - ...data, - addStocks: [], - attributes, - metadata, - privateMetadata, - removeStocks: [], - updateStocks: [] - }); - } else { - const dataStocks = stocks.map(stock => stock.id); - const variantStocks = product.variants[0]?.stocks.map( - stock => stock.warehouse.id - ); - const stockDiff = diff(variantStocks, dataStocks); - - onSubmit({ - ...data, - addStocks: stocks.filter(stock => - stockDiff.added.some(addedStock => addedStock === stock.id) - ), - attributes, - metadata, - privateMetadata, - removeStocks: stockDiff.removed, - updateStocks: stocks.filter( - stock => !stockDiff.added.some(addedStock => addedStock === stock.id) - ) - }); - } + return { + ...data, + ...getAvailabilityData(data), + ...getStocksData(), + addStocks: [], + attributes, + metadata, + privateMetadata + }; }; + const handleSubmit = (data: ProductUpdatePageFormData) => + onSubmit(getParsedData(data)); + return (
{({ change, data, hasChanged, submit, triggerChange, toggleValue }) => {