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 (