undefined}
- onZipCodeRangeAdd={onZipCodeAssign}
- zipCodes={zipCodes}
+ onPostalCodeDelete={onPostalCodeUnassign}
+ onPostalCodeInclusionChange={postalCodeInclusionChange}
+ onPostalCodeRangeAdd={onPostalCodeAssign}
+ postalCodes={postalCodes}
/>
diff --git a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx
index a56ea4b85..538cce234 100644
--- a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx
+++ b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.stories.tsx
@@ -48,12 +48,13 @@ const props: ShippingZoneRatesPageProps = {
onChannelsChange: () => undefined,
onDelete: () => undefined,
onNextPage: () => undefined,
+ onPostalCodeAssign: () => undefined,
+ onPostalCodeInclusionChange: () => undefined,
+ onPostalCodeUnassign: () => undefined,
onPreviousPage: () => undefined,
onProductAssign: () => undefined,
onProductUnassign: () => undefined,
onSubmit: () => undefined,
- onZipCodeAssign: () => undefined,
- onZipCodeUnassign: () => undefined,
openChannelsModal: () => undefined,
rate: shippingZone.shippingMethods[0],
saveButtonBarState: "default",
diff --git a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx
index c360c65b1..3b0691f9e 100644
--- a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx
+++ b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx
@@ -12,6 +12,7 @@ import PageHeader from "@saleor/components/PageHeader";
import SaveButtonBar from "@saleor/components/SaveButtonBar";
import { ShippingChannelsErrorFragment } from "@saleor/fragments/types/ShippingChannelsErrorFragment";
import { ShippingErrorFragment } from "@saleor/fragments/types/ShippingErrorFragment";
+import { ShippingMethodFragment_postalCodeRules } from "@saleor/fragments/types/ShippingMethodFragment";
import { validatePrice } from "@saleor/products/utils/validation";
import OrderValue from "@saleor/shipping/components/OrderValue";
import OrderWeight from "@saleor/shipping/components/OrderWeight";
@@ -21,19 +22,19 @@ import ShippingRateInfo from "@saleor/shipping/components/ShippingRateInfo";
import { createChannelsChangeHandler } from "@saleor/shipping/handlers";
import { ShippingZone_shippingZone_shippingMethods } from "@saleor/shipping/types/ShippingZone";
import { ListActions, ListProps } from "@saleor/types";
-import { ShippingMethodTypeEnum } from "@saleor/types/globalTypes";
+import {
+ PostalCodeRuleInclusionTypeEnum,
+ ShippingMethodTypeEnum
+} from "@saleor/types/globalTypes";
import { mapMetadataItemToInput } from "@saleor/utils/maps";
import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger";
import React from "react";
import { FormattedMessage } from "react-intl";
-import ShippingZoneZipCodes, {
- ZipCodeInclusion
-} from "../ShippingZoneZipCodes";
+import ShippingZonePostalCodes from "../ShippingZonePostalCodes";
export interface FormData extends MetadataFormData {
channelListings: ChannelShippingData[];
- includeZipCodes: ZipCodeInclusion;
name: string;
noLimits: boolean;
minValue: string;
@@ -50,6 +51,7 @@ export interface ShippingZoneRatesPageProps
shippingChannels: ChannelShippingData[];
disabled: boolean;
hasChannelChanged?: boolean;
+ havePostalCodesChanged?: boolean;
rate: ShippingZone_shippingZone_shippingMethods;
channelErrors: ShippingChannelsErrorFragment[];
errors: ShippingErrorFragment[];
@@ -57,8 +59,11 @@ export interface ShippingZoneRatesPageProps
onBack: () => void;
onDelete?: () => void;
onSubmit: (data: FormData) => void;
- onZipCodeAssign: () => void;
- onZipCodeUnassign: (id: string) => void;
+ onPostalCodeInclusionChange: (
+ inclusion: PostalCodeRuleInclusionTypeEnum
+ ) => void;
+ onPostalCodeAssign: () => void;
+ onPostalCodeUnassign: (code: ShippingMethodFragment_postalCodeRules) => void;
onChannelsChange: (data: ChannelShippingData[]) => void;
openChannelsModal: () => void;
onProductAssign: () => void;
@@ -73,12 +78,14 @@ export const ShippingZoneRatesPage: React.FC = ({
disabled,
errors,
hasChannelChanged,
+ havePostalCodesChanged,
onBack,
onDelete,
onSubmit,
+ onPostalCodeInclusionChange,
onChannelsChange,
- onZipCodeAssign,
- onZipCodeUnassign,
+ onPostalCodeAssign,
+ onPostalCodeUnassign,
onProductAssign,
onProductUnassign,
openChannelsModal,
@@ -90,7 +97,6 @@ export const ShippingZoneRatesPage: React.FC = ({
const isPriceVariant = variant === ShippingMethodTypeEnum.PRICE;
const initialForm: FormData = {
channelListings: shippingChannels,
- includeZipCodes: ZipCodeInclusion.Exclude,
maxDays: rate?.maximumDeliveryDays?.toString() || "",
maxValue: rate?.maximumOrderWeight?.value.toString() || "",
metadata: rate?.metadata.map(mapMetadataItemToInput),
@@ -102,6 +108,14 @@ export const ShippingZoneRatesPage: React.FC = ({
type: rate?.type || null
};
+ const postalCodesInclusionType = rate?.postalCodeRules[0]?.inclusionType;
+
+ const postalCodeInclusionChange = (
+ inclusion: PostalCodeRuleInclusionTypeEnum
+ ) => {
+ onPostalCodeInclusionChange(inclusion);
+ };
+
const {
makeChangeHandler: makeMetadataChangeHandler
} = useMetadataChangeTrigger();
@@ -119,6 +133,8 @@ export const ShippingZoneRatesPage: React.FC = ({
);
const changeMetadata = makeMetadataChangeHandler(change);
+ const formIsUnchanged =
+ !hasChanged && !hasChannelChanged && !havePostalCodesChanged;
return (
@@ -162,13 +178,13 @@ export const ShippingZoneRatesPage: React.FC = ({
errors={channelErrors}
/>
- undefined}
- onZipCodeRangeAdd={onZipCodeAssign}
- zipCodes={rate?.zipCodeRules}
+ onPostalCodeDelete={onPostalCodeUnassign}
+ onPostalCodeInclusionChange={postalCodeInclusionChange}
+ onPostalCodeRangeAdd={onPostalCodeAssign}
+ postalCodes={rate?.postalCodeRules}
+ initialInclusionType={postalCodesInclusionType}
/>
= ({
+ rules
+ .filter(code => !code.id || code.id === "0")
+ .map(
+ code =>
+ ({
+ end: code.end,
+ start: code.start
+ } as ShippingPostalCodeRulesCreateInputRange)
+ );
+
export function getCreateShippingPriceRateVariables(
data: ShippingZoneRatesPageFormData,
- id: string
+ id: string,
+ addPostalCodeRules: ShippingMethodFragment_postalCodeRules[],
+ inclusionType: PostalCodeRuleInclusionTypeEnum
): CreateShippingRateVariables {
const parsedMinDays = parseInt(data.minDays, 10);
const parsedMaxDays = parseInt(data.maxDays, 10);
+ const postalCodeRules = getPostalCodeRulesToAdd(addPostalCodeRules);
return {
input: {
+ addPostalCodeRules: postalCodeRules,
+ inclusionType,
maximumDeliveryDays: parsedMaxDays,
minimumDeliveryDays: parsedMinDays,
name: data.name,
@@ -62,15 +83,20 @@ export function getCreateShippingPriceRateVariables(
export function getCreateShippingWeightRateVariables(
data: ShippingZoneRatesPageFormData,
- id: string
+ id: string,
+ addPostalCodeRules: ShippingMethodFragment_postalCodeRules[],
+ inclusionType: PostalCodeRuleInclusionTypeEnum
): 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;
+ const postalCodeRules = getPostalCodeRulesToAdd(addPostalCodeRules);
return {
input: {
+ addPostalCodeRules: postalCodeRules,
+ inclusionType,
maximumDeliveryDays: parsedMaxDays,
maximumOrderWeight: isWeightSet ? parsedMaxValue : null,
minimumDeliveryDays: parsedMinDays,
@@ -85,13 +111,21 @@ export function getCreateShippingWeightRateVariables(
export function getUpdateShippingPriceRateVariables(
data: ShippingZoneRatesPageFormData,
id: string,
- rateId: string
+ rateId: string,
+ addPostalCodeRules: ShippingMethodFragment_postalCodeRules[],
+ deletePostalCodeRules: string[]
): UpdateShippingRateVariables {
const parsedMinDays = parseInt(data.minDays, 10);
const parsedMaxDays = parseInt(data.maxDays, 10);
+ const postalCodeRules = getPostalCodeRulesToAdd(addPostalCodeRules);
return {
id: rateId,
input: {
+ addPostalCodeRules: postalCodeRules,
+ deletePostalCodeRules,
+ inclusionType:
+ addPostalCodeRules[0]?.inclusionType ||
+ PostalCodeRuleInclusionTypeEnum.EXCLUDE,
maximumDeliveryDays: parsedMaxDays,
minimumDeliveryDays: parsedMinDays,
name: data.name,
@@ -104,16 +138,24 @@ export function getUpdateShippingPriceRateVariables(
export function getUpdateShippingWeightRateVariables(
data: ShippingZoneRatesPageFormData,
id: string,
- rateId: string
+ rateId: string,
+ addPostalCodeRules: ShippingMethodFragment_postalCodeRules[],
+ deletePostalCodeRules: string[]
): 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;
+ const postalCodeRules = getPostalCodeRulesToAdd(addPostalCodeRules);
return {
id: rateId,
input: {
+ addPostalCodeRules: postalCodeRules,
+ deletePostalCodeRules,
+ inclusionType:
+ addPostalCodeRules[0]?.inclusionType ||
+ PostalCodeRuleInclusionTypeEnum.EXCLUDE,
maximumDeliveryDays: parsedMaxDays,
maximumOrderWeight: isWeightSet ? parsedMaxValue : null,
minimumDeliveryDays: parsedMinDays,
@@ -156,7 +198,8 @@ export function getShippingMethodChannelVariables(
export function useShippingRateCreator(
shippingZoneId: string,
type: ShippingMethodTypeEnum,
- zipCodes: ShippingMethodFragment_zipCodeRules[]
+ postalCodes: ShippingMethodFragment_postalCodeRules[],
+ inclusionType: PostalCodeRuleInclusionTypeEnum
) {
const intl = useIntl();
const notify = useNotifier();
@@ -165,10 +208,6 @@ export function useShippingRateCreator(
createBaseShippingRate,
createBaseShippingRateOpts
] = useShippingRateCreate({});
- const [
- assignZipCodeRules,
- assignZipCodeRulesOpts
- ] = useShippingMethodZipCodeRangeAssign({});
const [
updateShippingMethodChannelListing,
updateShippingMethodChannelListingOpts
@@ -186,7 +225,7 @@ export function useShippingRateCreator(
const createShippingRate = async (data: ShippingZoneRatesPageFormData) => {
const response = await createBaseShippingRate({
- variables: getVariables(data, shippingZoneId)
+ variables: getVariables(data, shippingZoneId, postalCodes, inclusionType)
});
const createErrors = response.data.shippingPriceCreate.errors;
@@ -200,17 +239,6 @@ export function useShippingRateCreator(
data.noLimits,
data.channelListings
)
- }),
- assignZipCodeRules({
- variables: {
- id: rateId,
- input: {
- zipCodeRules: zipCodes.map(zipCodeRule => ({
- end: zipCodeRule.end || null,
- start: zipCodeRule.start
- }))
- }
- }
})
]);
@@ -236,16 +264,12 @@ export function useShippingRateCreator(
const called =
createBaseShippingRateOpts.called ||
- updateShippingMethodChannelListingOpts.called ||
- assignZipCodeRulesOpts.called;
+ updateShippingMethodChannelListingOpts.called;
const loading =
createBaseShippingRateOpts.loading ||
- updateShippingMethodChannelListingOpts.loading ||
- assignZipCodeRulesOpts.loading;
+ updateShippingMethodChannelListingOpts.loading;
const errors = [
- ...(createBaseShippingRateOpts.data?.shippingPriceCreate.errors || []),
- ...(assignZipCodeRulesOpts.data?.shippingMethodZipCodeRulesCreate.errors ||
- [])
+ ...(createBaseShippingRateOpts.data?.shippingPriceCreate.errors || [])
];
const channelErrors =
updateShippingMethodChannelListingOpts.data
diff --git a/src/shipping/mutations.ts b/src/shipping/mutations.ts
index 8874db557..b69d9bb8c 100644
--- a/src/shipping/mutations.ts
+++ b/src/shipping/mutations.ts
@@ -4,7 +4,6 @@ import {
} from "@saleor/fragments/errors";
import {
shippingMethodFragment,
- shippingMethodWithZipCodesFragment,
shippingZoneDetailsFragment
} from "@saleor/fragments/shipping";
import { countryFragment } from "@saleor/fragments/taxes";
@@ -39,14 +38,6 @@ import {
ShippingMethodChannelListingUpdate,
ShippingMethodChannelListingUpdateVariables
} from "./types/ShippingMethodChannelListingUpdate";
-import {
- ShippingMethodZipCodeRangeAssign,
- ShippingMethodZipCodeRangeAssignVariables
-} from "./types/ShippingMethodZipCodeRangeAssign";
-import {
- ShippingMethodZipCodeRangeUnassign,
- ShippingMethodZipCodeRangeUnassignVariables
-} from "./types/ShippingMethodZipCodeRangeUnassign";
import {
ShippingPriceExcludeProduct,
ShippingPriceExcludeProductVariables
@@ -263,49 +254,6 @@ export const useShippingMethodChannelListingUpdate = makeMutation<
ShippingMethodChannelListingUpdateVariables
>(shippingMethodChannelListingUpdate);
-export const shippingMethodZipCodeRangeAssign = gql`
- ${shippingChannelsErrorFragment}
- ${shippingMethodWithZipCodesFragment}
- mutation ShippingMethodZipCodeRangeAssign(
- $id: ID!
- $input: ShippingZipCodeRulesCreateInput!
- ) {
- shippingMethodZipCodeRulesCreate(shippingMethodId: $id, input: $input) {
- errors: shippingErrors {
- ...ShippingChannelsErrorFragment
- }
- shippingMethod {
- ...ShippingMethodWithZipCodesFragment
- }
- }
- }
-`;
-
-export const useShippingMethodZipCodeRangeAssign = makeMutation<
- ShippingMethodZipCodeRangeAssign,
- ShippingMethodZipCodeRangeAssignVariables
->(shippingMethodZipCodeRangeAssign);
-
-export const shippingMethodZipCodeRulesDelete = gql`
- ${shippingChannelsErrorFragment}
- ${shippingMethodWithZipCodesFragment}
- mutation ShippingMethodZipCodeRangeUnassign($id: ID!) {
- shippingMethodZipCodeRulesDelete(id: $id) {
- errors: shippingErrors {
- ...ShippingChannelsErrorFragment
- }
- shippingMethod {
- ...ShippingMethodWithZipCodesFragment
- }
- }
- }
-`;
-
-export const useShippingMethodZipCodeRangeUnassign = makeMutation<
- ShippingMethodZipCodeRangeUnassign,
- ShippingMethodZipCodeRangeUnassignVariables
->(shippingMethodZipCodeRulesDelete);
-
export const shippingPriceExcludeProducts = gql`
${shippingErrorFragment}
mutation ShippingPriceExcludeProduct(
diff --git a/src/shipping/types/CreateShippingRate.ts b/src/shipping/types/CreateShippingRate.ts
index c98d9827b..b14849f1c 100644
--- a/src/shipping/types/CreateShippingRate.ts
+++ b/src/shipping/types/CreateShippingRate.ts
@@ -2,7 +2,7 @@
/* eslint-disable */
// This file was automatically generated and should not be edited.
-import { ShippingPriceInput, ShippingErrorCode, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
+import { ShippingPriceInput, ShippingErrorCode, PostalCodeRuleInclusionTypeEnum, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: CreateShippingRate
@@ -32,9 +32,10 @@ export interface CreateShippingRate_shippingPriceCreate_shippingZone_countries {
country: string;
}
-export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
+export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_postalCodeRules {
+ __typename: "ShippingMethodPostalCodeRule";
id: string;
+ inclusionType: PostalCodeRuleInclusionTypeEnum | null;
start: string | null;
end: string | null;
}
@@ -100,7 +101,7 @@ export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMet
export interface CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods {
__typename: "ShippingMethod";
id: string;
- zipCodeRules: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_zipCodeRules | null)[] | null;
+ postalCodeRules: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_postalCodeRules | null)[] | null;
metadata: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_metadata | null)[];
privateMetadata: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_privateMetadata | null)[];
minimumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods_minimumOrderWeight | null;
@@ -131,9 +132,10 @@ export interface CreateShippingRate_shippingPriceCreate_shippingZone {
warehouses: (CreateShippingRate_shippingPriceCreate_shippingZone_warehouses | null)[] | null;
}
-export interface CreateShippingRate_shippingPriceCreate_shippingMethod_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
+export interface CreateShippingRate_shippingPriceCreate_shippingMethod_postalCodeRules {
+ __typename: "ShippingMethodPostalCodeRule";
id: string;
+ inclusionType: PostalCodeRuleInclusionTypeEnum | null;
start: string | null;
end: string | null;
}
@@ -199,7 +201,7 @@ export interface CreateShippingRate_shippingPriceCreate_shippingMethod_channelLi
export interface CreateShippingRate_shippingPriceCreate_shippingMethod {
__typename: "ShippingMethod";
id: string;
- zipCodeRules: (CreateShippingRate_shippingPriceCreate_shippingMethod_zipCodeRules | null)[] | null;
+ postalCodeRules: (CreateShippingRate_shippingPriceCreate_shippingMethod_postalCodeRules | null)[] | null;
metadata: (CreateShippingRate_shippingPriceCreate_shippingMethod_metadata | null)[];
privateMetadata: (CreateShippingRate_shippingPriceCreate_shippingMethod_privateMetadata | null)[];
minimumOrderWeight: CreateShippingRate_shippingPriceCreate_shippingMethod_minimumOrderWeight | null;
diff --git a/src/shipping/types/DeleteShippingRate.ts b/src/shipping/types/DeleteShippingRate.ts
index 8d63eea92..d71b61787 100644
--- a/src/shipping/types/DeleteShippingRate.ts
+++ b/src/shipping/types/DeleteShippingRate.ts
@@ -2,7 +2,7 @@
/* eslint-disable */
// This file was automatically generated and should not be edited.
-import { ShippingErrorCode, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
+import { ShippingErrorCode, PostalCodeRuleInclusionTypeEnum, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: DeleteShippingRate
@@ -32,9 +32,10 @@ export interface DeleteShippingRate_shippingPriceDelete_shippingZone_countries {
country: string;
}
-export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
+export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_postalCodeRules {
+ __typename: "ShippingMethodPostalCodeRule";
id: string;
+ inclusionType: PostalCodeRuleInclusionTypeEnum | null;
start: string | null;
end: string | null;
}
@@ -100,7 +101,7 @@ export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMet
export interface DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods {
__typename: "ShippingMethod";
id: string;
- zipCodeRules: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_zipCodeRules | null)[] | null;
+ postalCodeRules: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_postalCodeRules | null)[] | null;
metadata: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_metadata | null)[];
privateMetadata: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_privateMetadata | null)[];
minimumOrderWeight: DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods_minimumOrderWeight | null;
diff --git a/src/shipping/types/ShippingMethodChannelListingUpdate.ts b/src/shipping/types/ShippingMethodChannelListingUpdate.ts
index 1eae5797c..dc8122772 100644
--- a/src/shipping/types/ShippingMethodChannelListingUpdate.ts
+++ b/src/shipping/types/ShippingMethodChannelListingUpdate.ts
@@ -2,15 +2,16 @@
/* eslint-disable */
// This file was automatically generated and should not be edited.
-import { ShippingMethodChannelListingInput, WeightUnitsEnum, ShippingMethodTypeEnum, ShippingErrorCode } from "./../../types/globalTypes";
+import { ShippingMethodChannelListingInput, PostalCodeRuleInclusionTypeEnum, WeightUnitsEnum, ShippingMethodTypeEnum, ShippingErrorCode } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: ShippingMethodChannelListingUpdate
// ====================================================
-export interface ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
+export interface ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_postalCodeRules {
+ __typename: "ShippingMethodPostalCodeRule";
id: string;
+ inclusionType: PostalCodeRuleInclusionTypeEnum | null;
start: string | null;
end: string | null;
}
@@ -76,7 +77,7 @@ export interface ShippingMethodChannelListingUpdate_shippingMethodChannelListing
export interface ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod {
__typename: "ShippingMethod";
id: string;
- zipCodeRules: (ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_zipCodeRules | null)[] | null;
+ postalCodeRules: (ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_postalCodeRules | null)[] | null;
metadata: (ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_metadata | null)[];
privateMetadata: (ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_privateMetadata | null)[];
minimumOrderWeight: ShippingMethodChannelListingUpdate_shippingMethodChannelListingUpdate_shippingMethod_minimumOrderWeight | null;
diff --git a/src/shipping/types/ShippingMethodZipCodeRangeAssign.ts b/src/shipping/types/ShippingMethodZipCodeRangeAssign.ts
deleted file mode 100644
index e10053f47..000000000
--- a/src/shipping/types/ShippingMethodZipCodeRangeAssign.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/* tslint:disable */
-/* eslint-disable */
-// This file was automatically generated and should not be edited.
-
-import { ShippingZipCodeRulesCreateInput, ShippingErrorCode } from "./../../types/globalTypes";
-
-// ====================================================
-// GraphQL mutation operation: ShippingMethodZipCodeRangeAssign
-// ====================================================
-
-export interface ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate_errors {
- __typename: "ShippingError";
- code: ShippingErrorCode;
- field: string | null;
- channels: string[] | null;
-}
-
-export interface ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate_shippingMethod_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
- id: string;
- start: string | null;
- end: string | null;
-}
-
-export interface ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate_shippingMethod {
- __typename: "ShippingMethod";
- id: string;
- zipCodeRules: (ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate_shippingMethod_zipCodeRules | null)[] | null;
-}
-
-export interface ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate {
- __typename: "ShippingZipCodeRulesCreate";
- errors: ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate_errors[];
- shippingMethod: ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate_shippingMethod | null;
-}
-
-export interface ShippingMethodZipCodeRangeAssign {
- shippingMethodZipCodeRulesCreate: ShippingMethodZipCodeRangeAssign_shippingMethodZipCodeRulesCreate | null;
-}
-
-export interface ShippingMethodZipCodeRangeAssignVariables {
- id: string;
- input: ShippingZipCodeRulesCreateInput;
-}
diff --git a/src/shipping/types/ShippingMethodZipCodeRangeUnassign.ts b/src/shipping/types/ShippingMethodZipCodeRangeUnassign.ts
deleted file mode 100644
index 23fd0ca4a..000000000
--- a/src/shipping/types/ShippingMethodZipCodeRangeUnassign.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/* tslint:disable */
-/* eslint-disable */
-// This file was automatically generated and should not be edited.
-
-import { ShippingErrorCode } from "./../../types/globalTypes";
-
-// ====================================================
-// GraphQL mutation operation: ShippingMethodZipCodeRangeUnassign
-// ====================================================
-
-export interface ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete_errors {
- __typename: "ShippingError";
- code: ShippingErrorCode;
- field: string | null;
- channels: string[] | null;
-}
-
-export interface ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete_shippingMethod_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
- id: string;
- start: string | null;
- end: string | null;
-}
-
-export interface ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete_shippingMethod {
- __typename: "ShippingMethod";
- id: string;
- zipCodeRules: (ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete_shippingMethod_zipCodeRules | null)[] | null;
-}
-
-export interface ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete {
- __typename: "ShippingZipCodeRulesDelete";
- errors: ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete_errors[];
- shippingMethod: ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete_shippingMethod | null;
-}
-
-export interface ShippingMethodZipCodeRangeUnassign {
- shippingMethodZipCodeRulesDelete: ShippingMethodZipCodeRangeUnassign_shippingMethodZipCodeRulesDelete | null;
-}
-
-export interface ShippingMethodZipCodeRangeUnassignVariables {
- id: string;
-}
diff --git a/src/shipping/types/ShippingZone.ts b/src/shipping/types/ShippingZone.ts
index c717e840a..7e8f24f83 100644
--- a/src/shipping/types/ShippingZone.ts
+++ b/src/shipping/types/ShippingZone.ts
@@ -2,7 +2,7 @@
/* eslint-disable */
// This file was automatically generated and should not be edited.
-import { WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
+import { PostalCodeRuleInclusionTypeEnum, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL query operation: ShippingZone
@@ -26,9 +26,10 @@ export interface ShippingZone_shippingZone_countries {
country: string;
}
-export interface ShippingZone_shippingZone_shippingMethods_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
+export interface ShippingZone_shippingZone_shippingMethods_postalCodeRules {
+ __typename: "ShippingMethodPostalCodeRule";
id: string;
+ inclusionType: PostalCodeRuleInclusionTypeEnum | null;
start: string | null;
end: string | null;
}
@@ -125,7 +126,7 @@ export interface ShippingZone_shippingZone_shippingMethods_excludedProducts {
export interface ShippingZone_shippingZone_shippingMethods {
__typename: "ShippingMethod";
id: string;
- zipCodeRules: (ShippingZone_shippingZone_shippingMethods_zipCodeRules | null)[] | null;
+ postalCodeRules: (ShippingZone_shippingZone_shippingMethods_postalCodeRules | null)[] | null;
metadata: (ShippingZone_shippingZone_shippingMethods_metadata | null)[];
privateMetadata: (ShippingZone_shippingZone_shippingMethods_privateMetadata | null)[];
minimumOrderWeight: ShippingZone_shippingZone_shippingMethods_minimumOrderWeight | null;
diff --git a/src/shipping/types/UpdateShippingRate.ts b/src/shipping/types/UpdateShippingRate.ts
index ac938c79c..6e30ff3f0 100644
--- a/src/shipping/types/UpdateShippingRate.ts
+++ b/src/shipping/types/UpdateShippingRate.ts
@@ -2,7 +2,7 @@
/* eslint-disable */
// This file was automatically generated and should not be edited.
-import { ShippingPriceInput, ShippingErrorCode, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
+import { ShippingPriceInput, ShippingErrorCode, PostalCodeRuleInclusionTypeEnum, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: UpdateShippingRate
@@ -14,9 +14,10 @@ export interface UpdateShippingRate_shippingPriceUpdate_errors {
field: string | null;
}
-export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_zipCodeRules {
- __typename: "ShippingMethodZipCodeRule";
+export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_postalCodeRules {
+ __typename: "ShippingMethodPostalCodeRule";
id: string;
+ inclusionType: PostalCodeRuleInclusionTypeEnum | null;
start: string | null;
end: string | null;
}
@@ -82,7 +83,7 @@ export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod_channelLi
export interface UpdateShippingRate_shippingPriceUpdate_shippingMethod {
__typename: "ShippingMethod";
id: string;
- zipCodeRules: (UpdateShippingRate_shippingPriceUpdate_shippingMethod_zipCodeRules | null)[] | null;
+ postalCodeRules: (UpdateShippingRate_shippingPriceUpdate_shippingMethod_postalCodeRules | null)[] | null;
metadata: (UpdateShippingRate_shippingPriceUpdate_shippingMethod_metadata | null)[];
privateMetadata: (UpdateShippingRate_shippingPriceUpdate_shippingMethod_privateMetadata | null)[];
minimumOrderWeight: UpdateShippingRate_shippingPriceUpdate_shippingMethod_minimumOrderWeight | null;
diff --git a/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx b/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx
index 7df7c265b..3d98020cc 100644
--- a/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx
+++ b/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx
@@ -2,13 +2,11 @@ import { useChannelsList } from "@saleor/channels/queries";
import { createSortedShippingChannels } from "@saleor/channels/utils";
import ChannelsAvailabilityDialog from "@saleor/components/ChannelsAvailabilityDialog";
import { WindowTitle } from "@saleor/components/WindowTitle";
-import { ShippingMethodFragment_zipCodeRules } from "@saleor/fragments/types/ShippingMethodFragment";
import useChannels from "@saleor/hooks/useChannels";
import useNavigator from "@saleor/hooks/useNavigator";
import { sectionNames } from "@saleor/intl";
-import ShippingRateZipCodeRangeRemoveDialog from "@saleor/shipping/components/ShippingRateZipCodeRangeRemoveDialog";
+import ShippingZonePostalCodeRangeDialog from "@saleor/shipping/components/ShippingZonePostalCodeRangeDialog";
import ShippingZoneRatesCreatePage from "@saleor/shipping/components/ShippingZoneRatesCreatePage";
-import ShippingZoneZipCodeRangeDialog from "@saleor/shipping/components/ShippingZoneZipCodeRangeDialog";
import { useShippingRateCreator } from "@saleor/shipping/handlers";
import {
shippingPriceRatesUrl,
@@ -16,10 +14,13 @@ import {
ShippingRateCreateUrlQueryParams,
shippingZoneUrl
} from "@saleor/shipping/urls";
+import filterPostalCodes from "@saleor/shipping/views/utils";
import { MinMax } from "@saleor/types";
-import { ShippingMethodTypeEnum } from "@saleor/types/globalTypes";
+import {
+ PostalCodeRuleInclusionTypeEnum,
+ ShippingMethodTypeEnum
+} from "@saleor/types/globalTypes";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
-import { remove } from "@saleor/utils/lists";
import React from "react";
import { useIntl } from "react-intl";
@@ -35,9 +36,10 @@ export const PriceRatesCreate: React.FC = ({
const navigate = useNavigator();
const intl = useIntl();
- const [zipCodes, setZipCodes] = React.useState<
- ShippingMethodFragment_zipCodeRules[]
- >([]);
+ const [postalCodes, setPostalCodes] = React.useState([]);
+ const [radioInclusionType, setRadioInclusionType] = React.useState(
+ PostalCodeRuleInclusionTypeEnum.EXCLUDE
+ );
const { data: channelsData, loading: channelsLoading } = useChannelsList({});
@@ -66,30 +68,35 @@ export const PriceRatesCreate: React.FC = ({
createShippingRate,
errors,
status
- } = useShippingRateCreator(id, ShippingMethodTypeEnum.PRICE, zipCodes);
+ } = useShippingRateCreator(
+ id,
+ ShippingMethodTypeEnum.PRICE,
+ postalCodes,
+ radioInclusionType
+ );
const handleBack = () => navigate(shippingZoneUrl(id));
- const handleZipCodeRangeAdd = (data: MinMax) => {
- setZipCodes(zipCodes => [
- ...zipCodes,
+ const handlePostalCodeRangeAdd = (data: MinMax) => {
+ setPostalCodes(postalCodes => [
+ ...postalCodes,
{
- __typename: "ShippingMethodZipCodeRule",
end: data.max,
- id: zipCodes.length.toString(),
start: data.min
}
]);
closeModal();
};
- const handleZipCodeRangeDelete = (id: string) => {
- setZipCodes(zipCodes =>
- remove(
- zipCodes.find(zipCode => zipCode.id === id),
- zipCodes,
- (a, b) => a.id === b.id
- )
- );
+
+ const onPostalCodeInclusionChange = (
+ inclusion: PostalCodeRuleInclusionTypeEnum
+ ) => {
+ setRadioInclusionType(inclusion);
+ setPostalCodes([]);
+ };
+
+ const onPostalCodeUnassign = code => {
+ setPostalCodes(filterPostalCodes(postalCodes, code));
closeModal();
};
@@ -123,29 +130,20 @@ export const PriceRatesCreate: React.FC = ({
onBack={handleBack}
errors={errors}
channelErrors={channelErrors}
- zipCodes={zipCodes}
+ postalCodes={postalCodes}
openChannelsModal={handleChannelsModalOpen}
onChannelsChange={setCurrentChannels}
- onZipCodeAssign={() => openModal("add-range")}
- onZipCodeUnassign={id =>
- openModal("remove-range", {
- id
- })
- }
+ onPostalCodeAssign={() => openModal("add-range")}
+ onPostalCodeUnassign={onPostalCodeUnassign}
+ onPostalCodeInclusionChange={onPostalCodeInclusionChange}
variant={ShippingMethodTypeEnum.PRICE}
/>
-
- handleZipCodeRangeDelete(params.id)}
- open={params.action === "remove-range"}
- />
>
);
};
diff --git a/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx b/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx
index 010cbb8bd..a6c9c3eaa 100644
--- a/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx
+++ b/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx
@@ -20,11 +20,10 @@ import { commonMessages } from "@saleor/intl";
import useProductSearch from "@saleor/searches/useProductSearch";
import DeleteShippingRateDialog from "@saleor/shipping/components/DeleteShippingRateDialog";
import ShippingMethodProductsAddDialog from "@saleor/shipping/components/ShippingMethodProductsAddDialog";
-import ShippingRateZipCodeRangeRemoveDialog from "@saleor/shipping/components/ShippingRateZipCodeRangeRemoveDialog";
+import ShippingZonePostalCodeRangeDialog from "@saleor/shipping/components/ShippingZonePostalCodeRangeDialog";
import ShippingZoneRatesPage, {
FormData
} from "@saleor/shipping/components/ShippingZoneRatesPage";
-import ShippingZoneZipCodeRangeDialog from "@saleor/shipping/components/ShippingZoneZipCodeRangeDialog";
import UnassignDialog from "@saleor/shipping/components/UnassignDialog";
import {
getShippingMethodChannelVariables,
@@ -32,8 +31,6 @@ import {
} from "@saleor/shipping/handlers";
import {
useShippingMethodChannelListingUpdate,
- useShippingMethodZipCodeRangeAssign,
- useShippingMethodZipCodeRangeUnassign,
useShippingPriceExcludeProduct,
useShippingPriceRemoveProductsFromExclude,
useShippingRateDelete,
@@ -46,7 +43,12 @@ import {
ShippingRateUrlQueryParams,
shippingZoneUrl
} from "@saleor/shipping/urls";
-import { ShippingMethodTypeEnum } from "@saleor/types/globalTypes";
+import filterPostalCodes from "@saleor/shipping/views/utils";
+import { MinMax } from "@saleor/types";
+import {
+ PostalCodeRuleInclusionTypeEnum,
+ ShippingMethodTypeEnum
+} from "@saleor/types/globalTypes";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
import {
@@ -110,43 +112,6 @@ export const PriceRatesUpdate: React.FC = ({
updateShippingMethodChannelListingOpts
] = useShippingMethodChannelListingUpdate({});
- const [
- assignZipCodeRange,
- assignZipCodeRangeOpts
- ] = useShippingMethodZipCodeRangeAssign({
- onCompleted: data => {
- if (data.shippingMethodZipCodeRulesCreate.errors.length === 0) {
- notify({
- status: "success",
- text: intl.formatMessage(commonMessages.savedChanges)
- });
- closeModal();
- } else {
- notify({
- status: "error",
- text: intl.formatMessage({
- defaultMessage: "Cannot add specified postal codes range.",
- description: "postal code range add error text"
- })
- });
- }
- }
- });
-
- const [
- unassignZipCodeRange,
- unassignZipCodeRangeOpts
- ] = useShippingMethodZipCodeRangeUnassign({
- onCompleted: data => {
- if (data.shippingMethodZipCodeRulesDelete.errors.length === 0) {
- notify({
- status: "success",
- text: intl.formatMessage(commonMessages.savedChanges)
- });
- }
- }
- });
-
const [
unassignProduct,
unassignProductOpts
@@ -209,10 +174,40 @@ export const PriceRatesUpdate: React.FC = ({
const [updateMetadata] = useMetadataUpdate({});
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
+ const [codesToDelete, setCodesToDelete] = React.useState([]);
+ const [havePostalCodesChanged, setHavePostalCodesChanged] = React.useState(
+ false
+ );
+ const [originalCodes, setOriginalCodes] = React.useState([]);
+ const [inclusionType, setInclusionType] = React.useState(
+ rate?.postalCodeRules[0]?.inclusionType
+ );
+
+ const onPostalCodeInclusionChange = (
+ inclusion: PostalCodeRuleInclusionTypeEnum
+ ) => {
+ setInclusionType(inclusion);
+ setCodesToDelete(
+ rate.postalCodeRules
+ .filter(code => code.id !== undefined)
+ .map(code => code.id)
+ );
+ setHavePostalCodesChanged(true);
+ rate.postalCodeRules = [];
+ };
+
const updateData = async (formData: FormData): Promise => {
const response = await updateShippingRate({
- variables: getUpdateShippingPriceRateVariables(formData, id, rateId)
+ variables: getUpdateShippingPriceRateVariables(
+ formData,
+ id,
+ rateId,
+ rate.postalCodeRules,
+ codesToDelete
+ )
});
+ setCodesToDelete([]);
+ setHavePostalCodesChanged(false);
const errors = response.data.shippingPriceUpdate.errors;
if (errors.length === 0) {
handleSuccess();
@@ -248,6 +243,41 @@ export const PriceRatesUpdate: React.FC = ({
reset();
};
+ const onPostalCodeAssign = (rule: MinMax) => {
+ if (!originalCodes.length) {
+ setOriginalCodes([...rate.postalCodeRules]);
+ }
+ if (
+ rate.postalCodeRules.filter(
+ item => item.start === rule.min && item.end === rule.max
+ ).length > 0
+ ) {
+ closeModal();
+ return;
+ }
+ const newCode = {
+ __typename: undefined,
+ end: rule.max,
+ id: undefined,
+ inclusionType,
+ start: rule.min
+ };
+ rate.postalCodeRules.push(newCode);
+ closeModal();
+ };
+
+ const onPostalCodeUnassign = code => {
+ if (code.id !== undefined) {
+ setCodesToDelete([...codesToDelete, code.id]);
+ rate.postalCodeRules = rate.postalCodeRules.filter(
+ rule => rule.id !== code.id
+ );
+ } else {
+ rate.postalCodeRules = filterPostalCodes(rate.postalCodeRules, code);
+ }
+ setHavePostalCodesChanged(true);
+ };
+
const handleBack = () => navigate(shippingZoneUrl(id));
return (
@@ -314,6 +344,7 @@ export const PriceRatesUpdate: React.FC = ({
assignProductOpts?.status === "loading"
}
hasChannelChanged={shippingChannels?.length !== currentChannels?.length}
+ havePostalCodesChanged={havePostalCodesChanged}
saveButtonBarState={updateShippingRateOpts.status}
onDelete={() => openModal("remove")}
onSubmit={handleSubmit}
@@ -344,45 +375,19 @@ export const PriceRatesUpdate: React.FC = ({
/>