From 9d55dc920bc8347acbe37569cbbab9bd100d1ba0 Mon Sep 17 00:00:00 2001 From: Dawid Tarasiuk Date: Tue, 12 Jan 2021 12:33:50 +0100 Subject: [PATCH] Add shipping delivery days (#914) * Add shipping delivery days * Update changelog with shipping delivery days * Update data-test and messages * Add shipping delivery days to shipping rate create page * Update shipping test snapshots * Make max delivery time of shipping optional --- CHANGELOG.md | 1 + locale/defaultMessages.json | 27 +- src/fragments/shipping.ts | 2 + src/fragments/types/ShippingMethodFragment.ts | 2 + ...ppingMethodWithExcludedProductsFragment.ts | 2 + .../types/ShippingZoneDetailsFragment.ts | 2 + .../ShippingRateInfo/ShippingRateInfo.tsx | 92 ++- .../ShippingZoneInfo/ShippingZoneInfo.tsx | 34 +- .../ShippingZoneRatesCreatePage.tsx | 4 + .../ShippingZoneRatesPage.tsx | 4 + src/shipping/fixtures.ts | 8 + src/shipping/handlers.ts | 16 + src/shipping/types/CreateShippingRate.ts | 4 + src/shipping/types/DeleteShippingRate.ts | 2 + .../ShippingMethodChannelListingUpdate.ts | 2 + src/shipping/types/ShippingZone.ts | 2 + src/shipping/types/UpdateShippingRate.ts | 2 + .../__snapshots__/Stories.test.ts.snap | 642 ++++++++++++++++++ 18 files changed, 814 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41eaaebbf..f629addf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable, unreleased changes to this project will be documented in this file. - Add zip code exclusion - #877 by @dominik-zeglen - Update quantity column in Inventory part of Product Variant view - #904 by @dominik-zeglen - Add file attributes - #884 by @orzechdev +- Add shipping delivery days - #914 by @orzechdev # 2.11.1 diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index b75ed8344..d80faf95c 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -5388,7 +5388,16 @@ "src_dot_shipping_dot_components_dot_ShippingMethodProducts_dot_4190792473": { "string": "Actions" }, - "src_dot_shipping_dot_components_dot_ShippingRateInfo_dot_579967655": { + "src_dot_shipping_dot_components_dot_ShippingRateInfo_dot_maxDays": { + "context": "label", + "string": "Max Delivery Time" + }, + "src_dot_shipping_dot_components_dot_ShippingRateInfo_dot_minDays": { + "context": "label", + "string": "Min Delivery Time" + }, + "src_dot_shipping_dot_components_dot_ShippingRateInfo_dot_name": { + "context": "label", "string": "Shipping rate name" }, "src_dot_shipping_dot_components_dot_ShippingRateZipCodeRangeRemoveDialog_dot_3640694505": { @@ -5469,20 +5478,18 @@ "context": "shipping section header", "string": "Shipping" }, - "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_1470703814": { + "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_descriptionCharacterLimit": { + "context": "character limit", + "string": "{numberOfCharacters} of {maxCharacters} characters" + }, + "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_descriptionPlaceholder": { "context": "field placeholder", "string": "Description of a shipping zone." }, - "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_1560416099": { + "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_name": { + "context": "label", "string": "Shipping zone name" }, - "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_3374163063": { - "string": "Description" - }, - "src_dot_shipping_dot_components_dot_ShippingZoneInfo_dot_3877274856": { - "context": "character limit", - "string": "{numberOfCharacters} of {maxCharacters} characters" - }, "src_dot_shipping_dot_components_dot_ShippingZoneRatesCreatePage_dot_1161979494": { "context": "page title", "string": "Price Rate Create" diff --git a/src/fragments/shipping.ts b/src/fragments/shipping.ts index bf19fe7d9..a77a19bb7 100644 --- a/src/fragments/shipping.ts +++ b/src/fragments/shipping.ts @@ -42,6 +42,8 @@ export const shippingMethodFragment = gql` unit value } + minimumDeliveryDays + maximumDeliveryDays name type channelListings { diff --git a/src/fragments/types/ShippingMethodFragment.ts b/src/fragments/types/ShippingMethodFragment.ts index a22064bfd..18f00b309 100644 --- a/src/fragments/types/ShippingMethodFragment.ts +++ b/src/fragments/types/ShippingMethodFragment.ts @@ -81,6 +81,8 @@ export interface ShippingMethodFragment { privateMetadata: (ShippingMethodFragment_privateMetadata | null)[]; minimumOrderWeight: ShippingMethodFragment_minimumOrderWeight | null; maximumOrderWeight: ShippingMethodFragment_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: ShippingMethodFragment_channelListings[] | null; diff --git a/src/fragments/types/ShippingMethodWithExcludedProductsFragment.ts b/src/fragments/types/ShippingMethodWithExcludedProductsFragment.ts index 23bd1e154..c980fec94 100644 --- a/src/fragments/types/ShippingMethodWithExcludedProductsFragment.ts +++ b/src/fragments/types/ShippingMethodWithExcludedProductsFragment.ts @@ -112,6 +112,8 @@ export interface ShippingMethodWithExcludedProductsFragment { privateMetadata: (ShippingMethodWithExcludedProductsFragment_privateMetadata | null)[]; minimumOrderWeight: ShippingMethodWithExcludedProductsFragment_minimumOrderWeight | null; maximumOrderWeight: ShippingMethodWithExcludedProductsFragment_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: ShippingMethodWithExcludedProductsFragment_channelListings[] | null; diff --git a/src/fragments/types/ShippingZoneDetailsFragment.ts b/src/fragments/types/ShippingZoneDetailsFragment.ts index 961b71048..1600675ae 100644 --- a/src/fragments/types/ShippingZoneDetailsFragment.ts +++ b/src/fragments/types/ShippingZoneDetailsFragment.ts @@ -99,6 +99,8 @@ export interface ShippingZoneDetailsFragment_shippingMethods { privateMetadata: (ShippingZoneDetailsFragment_shippingMethods_privateMetadata | null)[]; minimumOrderWeight: ShippingZoneDetailsFragment_shippingMethods_minimumOrderWeight | null; maximumOrderWeight: ShippingZoneDetailsFragment_shippingMethods_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: ShippingZoneDetailsFragment_shippingMethods_channelListings[] | null; diff --git a/src/shipping/components/ShippingRateInfo/ShippingRateInfo.tsx b/src/shipping/components/ShippingRateInfo/ShippingRateInfo.tsx index b66937bee..fc06222c6 100644 --- a/src/shipping/components/ShippingRateInfo/ShippingRateInfo.tsx +++ b/src/shipping/components/ShippingRateInfo/ShippingRateInfo.tsx @@ -1,30 +1,63 @@ import Card from "@material-ui/core/Card"; import CardContent from "@material-ui/core/CardContent"; +import { makeStyles } from "@material-ui/core/styles"; import TextField from "@material-ui/core/TextField"; +import CardSpacer from "@saleor/components/CardSpacer"; import CardTitle from "@saleor/components/CardTitle"; import { ShippingErrorFragment } from "@saleor/fragments/types/ShippingErrorFragment"; import { commonMessages } from "@saleor/intl"; import { getFormErrors } from "@saleor/utils/errors"; import getShippingErrorMessage from "@saleor/utils/errors/shipping"; import React from "react"; -import { useIntl } from "react-intl"; +import { defineMessages, useIntl } from "react-intl"; + +const messages = defineMessages({ + maxDays: { + defaultMessage: "Max Delivery Time", + description: "label" + }, + minDays: { + defaultMessage: "Min Delivery Time", + description: "label" + }, + name: { + defaultMessage: "Shipping rate name", + description: "label" + } +}); + +const useStyles = makeStyles( + theme => ({ + deliveryTimeFields: { + display: "grid", + gridColumnGap: theme.spacing(2), + gridRowGap: theme.spacing(1), + gridTemplateColumns: "1fr 1fr 1fr", + [theme.breakpoints.down("md")]: { + gridTemplateColumns: "1fr 1fr" + }, + [theme.breakpoints.down("xs")]: { + gridTemplateColumns: "1fr" + } + } + }), + { name: "ShippingRateInfo" } +); export interface ShippingRateInfoProps { - data: Record<"name", string>; + data: Record<"name" | "maxDays" | "minDays", string>; disabled: boolean; errors: ShippingErrorFragment[]; onChange: (event: React.ChangeEvent) => void; } -const ShippingRateInfo: React.FC = ({ - data, - disabled, - errors, - onChange -}) => { - const intl = useIntl(); +const ShippingRateInfo: React.FC = props => { + const { data, disabled, errors, onChange } = props; - const formErrors = getFormErrors(["name"], errors); + const intl = useIntl(); + const classes = useStyles(props); + + const formErrors = getFormErrors(["name", "minDays", "maxDays"], errors); return ( @@ -37,13 +70,46 @@ const ShippingRateInfo: React.FC = ({ error={!!formErrors.name} fullWidth helperText={getShippingErrorMessage(formErrors.name, intl)} - label={intl.formatMessage({ - defaultMessage: "Shipping rate name" - })} + label={intl.formatMessage(messages.name)} name="name" value={data.name} onChange={onChange} /> + +
+ + +
); diff --git a/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx b/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx index a712592a6..0bf7f156a 100644 --- a/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx +++ b/src/shipping/components/ShippingZoneInfo/ShippingZoneInfo.tsx @@ -9,7 +9,22 @@ import { commonMessages } from "@saleor/intl"; import { getFormErrors } from "@saleor/utils/errors"; import getShippingErrorMessage from "@saleor/utils/errors/shipping"; import React from "react"; -import { FormattedMessage, useIntl } from "react-intl"; +import { defineMessages, FormattedMessage, useIntl } from "react-intl"; + +const messages = defineMessages({ + descriptionCharacterLimit: { + defaultMessage: "{numberOfCharacters} of {maxCharacters} characters", + description: "character limit" + }, + descriptionPlaceholder: { + defaultMessage: "Description of a shipping zone.", + description: "field placeholder" + }, + name: { + defaultMessage: "Shipping zone name", + description: "label" + } +}); export interface ShippingZoneInfoProps { data: Record<"name" | "description", string>; @@ -57,9 +72,10 @@ const ShippingZoneInfo: React.FC = ({ error={!!formErrors.name} fullWidth helperText={getShippingErrorMessage(formErrors.name, intl)} - label={intl.formatMessage({ - defaultMessage: "Shipping zone name" - })} + label={intl.formatMessage(messages.name)} + inputProps={{ + "data-test": "name" + }} name="name" value={data.name} onChange={onChange} @@ -71,13 +87,12 @@ const ShippingZoneInfo: React.FC = ({ label={
- +
{data.description?.length > 0 && ( = ({ disabled={disabled} fullWidth multiline - placeholder={intl.formatMessage({ - defaultMessage: "Description of a shipping zone.", - description: "field placeholder" - })} + placeholder={intl.formatMessage(messages.descriptionPlaceholder)} rows={10} /> diff --git a/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx b/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx index 952c9c421..67cd1615b 100644 --- a/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx +++ b/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx @@ -32,6 +32,8 @@ export interface FormData { noLimits: boolean; minValue: string; maxValue: string; + minDays: string; + maxDays: string; type: ShippingMethodTypeEnum; } @@ -77,7 +79,9 @@ export const ShippingZoneRatesCreatePage: React.FC = ({ const initialForm: FormData = { channelListings: shippingChannels, includeZipCodes: ZipCodeInclusion.Exclude, + maxDays: rate?.maximumDeliveryDays?.toString() || "", maxValue: rate?.maximumOrderWeight?.value.toString() || "", metadata: rate?.metadata.map(mapMetadataItemToInput), + minDays: rate?.minimumDeliveryDays?.toString() || "", minValue: rate?.minimumOrderWeight?.value.toString() || "", name: rate?.name || "", noLimits: false, diff --git a/src/shipping/fixtures.ts b/src/shipping/fixtures.ts index 661226bd4..f42f69dd8 100644 --- a/src/shipping/fixtures.ts +++ b/src/shipping/fixtures.ts @@ -1618,12 +1618,14 @@ export const shippingZone: ShippingZone_shippingZone = { } }, id: "U2hpcHBpbmdNZXRob2Q6NA==", + maximumDeliveryDays: 10, maximumOrderWeight: { __typename: "Weight", unit: WeightUnitsEnum.KG, value: 80 }, metadata: [], + minimumDeliveryDays: 0, minimumOrderWeight: { __typename: "Weight", unit: WeightUnitsEnum.KG, @@ -1681,8 +1683,10 @@ export const shippingZone: ShippingZone_shippingZone = { } }, id: "U2hpcHBpbmdNZXRob2Q6Mw==", + maximumDeliveryDays: 10, maximumOrderWeight: null, metadata: [], + minimumDeliveryDays: 0, minimumOrderWeight: { __typename: "Weight", unit: WeightUnitsEnum.KG, @@ -1740,8 +1744,10 @@ export const shippingZone: ShippingZone_shippingZone = { } }, id: "U2hpcHBpbmdNZXRob2Q6Mg==", + maximumDeliveryDays: 10, maximumOrderWeight: null, metadata: [], + minimumDeliveryDays: 0, minimumOrderWeight: { __typename: "Weight", unit: WeightUnitsEnum.KG, @@ -1786,8 +1792,10 @@ export const shippingZone: ShippingZone_shippingZone = { } }, id: "U2hpcHBpbmdNZXRob2Q6MQ==", + maximumDeliveryDays: 10, maximumOrderWeight: null, metadata: [], + minimumDeliveryDays: 0, minimumOrderWeight: { __typename: "Weight", unit: WeightUnitsEnum.KG, diff --git a/src/shipping/handlers.ts b/src/shipping/handlers.ts index 3e34b148c..9e8fefa4e 100644 --- a/src/shipping/handlers.ts +++ b/src/shipping/handlers.ts @@ -47,8 +47,12 @@ export function getCreateShippingPriceRateVariables( data: ShippingZoneRatesPageFormData, id: string ): CreateShippingRateVariables { + const parsedMinDays = parseInt(data.minDays, 10); + const parsedMaxDays = parseInt(data.maxDays, 10); return { input: { + maximumDeliveryDays: parsedMaxDays, + minimumDeliveryDays: parsedMinDays, name: data.name, shippingZone: id, type: ShippingMethodTypeEnum.PRICE @@ -62,10 +66,14 @@ export function getCreateShippingWeightRateVariables( ): CreateShippingRateVariables { const parsedMinValue = parseFloat(data.minValue); const parsedMaxValue = parseFloat(data.maxValue); + const parsedMinDays = parseInt(data.minDays, 10); + const parsedMaxDays = parseInt(data.maxDays, 10); const isWeightSet = !data.noLimits; return { input: { + maximumDeliveryDays: parsedMaxDays, maximumOrderWeight: isWeightSet ? parsedMaxValue : null, + minimumDeliveryDays: parsedMinDays, minimumOrderWeight: isWeightSet ? parsedMinValue : null, name: data.name, shippingZone: id, @@ -79,9 +87,13 @@ export function getUpdateShippingPriceRateVariables( id: string, rateId: string ): UpdateShippingRateVariables { + const parsedMinDays = parseInt(data.minDays, 10); + const parsedMaxDays = parseInt(data.maxDays, 10); return { id: rateId, input: { + maximumDeliveryDays: parsedMaxDays, + minimumDeliveryDays: parsedMinDays, name: data.name, shippingZone: id, type: ShippingMethodTypeEnum.PRICE @@ -96,11 +108,15 @@ export function getUpdateShippingWeightRateVariables( ): UpdateShippingRateVariables { const parsedMinValue = parseFloat(data.minValue); const parsedMaxValue = parseFloat(data.maxValue); + const parsedMinDays = parseInt(data.minDays, 10); + const parsedMaxDays = parseInt(data.maxDays, 10); const isWeightSet = !data.noLimits; return { id: rateId, input: { + maximumDeliveryDays: parsedMaxDays, maximumOrderWeight: isWeightSet ? parsedMaxValue : null, + minimumDeliveryDays: parsedMinDays, minimumOrderWeight: isWeightSet ? parsedMinValue : null, name: data.name, shippingZone: id, diff --git a/src/shipping/types/CreateShippingRate.ts b/src/shipping/types/CreateShippingRate.ts index 389f75be1..c98d9827b 100644 --- a/src/shipping/types/CreateShippingRate.ts +++ b/src/shipping/types/CreateShippingRate.ts @@ -105,6 +105,8 @@ export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMet privateMetadata: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_privateMetadata | null)[]; minimumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_minimumOrderWeight | null; maximumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_channelListings[] | null; @@ -202,6 +204,8 @@ export interface CreateShippingRate_shippingPriceCreate_shippingMethod { privateMetadata: (CreateShippingRate_shippingPriceCreate_shippingMethod_privateMetadata | null)[]; minimumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingMethod_minimumOrderWeight | null; maximumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingMethod_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: CreateShippingRate_shippingPriceCreate_shippingMethod_channelListings[] | null; diff --git a/src/shipping/types/DeleteShippingRate.ts b/src/shipping/types/DeleteShippingRate.ts index bf0e7b83a..8d63eea92 100644 --- a/src/shipping/types/DeleteShippingRate.ts +++ b/src/shipping/types/DeleteShippingRate.ts @@ -105,6 +105,8 @@ export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMet privateMetadata: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_privateMetadata | null)[]; minimumOrderWeight: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_minimumOrderWeight | null; maximumOrderWeight: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_channelListings[] | null; diff --git a/src/shipping/types/ShippingMethodChannelListingUpdate.ts b/src/shipping/types/ShippingMethodChannelListingUpdate.ts index a146d17f3..1eae5797c 100644 --- a/src/shipping/types/ShippingMethodChannelListingUpdate.ts +++ b/src/shipping/types/ShippingMethodChannelListingUpdate.ts @@ -81,6 +81,8 @@ export interface ShippingMethodChannelListingUpdate_shippingMethodChannelListing privateMetadata: (ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_privateMetadata | null)[]; minimumOrderWeight: ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_minimumOrderWeight | null; maximumOrderWeight: ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_channelListings[] | null; diff --git a/src/shipping/types/ShippingZone.ts b/src/shipping/types/ShippingZone.ts index 0b846ed7e..c717e840a 100644 --- a/src/shipping/types/ShippingZone.ts +++ b/src/shipping/types/ShippingZone.ts @@ -130,6 +130,8 @@ export interface ShippingZone_shippingZone_shippingMethods { privateMetadata: (ShippingZone_shippingZone_shippingMethods_privateMetadata | null)[]; minimumOrderWeight: ShippingZone_shippingZone_shippingMethods_minimumOrderWeight | null; maximumOrderWeight: ShippingZone_shippingZone_shippingMethods_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: ShippingZone_shippingZone_shippingMethods_channelListings[] | null; diff --git a/src/shipping/types/UpdateShippingRate.ts b/src/shipping/types/UpdateShippingRate.ts index d688b54c2..ac938c79c 100644 --- a/src/shipping/types/UpdateShippingRate.ts +++ b/src/shipping/types/UpdateShippingRate.ts @@ -87,6 +87,8 @@ export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod { privateMetadata: (UpdateShippingRate_shippingPriceUpdate_shippingMethod_privateMetadata | null)[]; minimumOrderWeight: UpdateShippingRate_shippingPriceUpdate_shippingMethod_minimumOrderWeight | null; maximumOrderWeight: UpdateShippingRate_shippingPriceUpdate_shippingMethod_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; name: string; type: ShippingMethodTypeEnum | null; channelListings: UpdateShippingRate_shippingPriceUpdate_shippingMethod_channelListings[] | null; diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index 0066ea8c4..b003a7dea 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -15427,6 +15427,85 @@ exports[`Storyshots Shipping / ShippingZoneRatesCreatePage page create price 1`]
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+