diff --git a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectFieldContent.tsx b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectFieldContent.tsx index 0029b0f1a..1375deebf 100644 --- a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectFieldContent.tsx +++ b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectFieldContent.tsx @@ -110,13 +110,14 @@ const useStyles = makeStyles( function getChoiceIndex( index: number, emptyValue: boolean, - customValue: boolean + customValue: boolean, + add: boolean ) { let choiceIndex = index; if (emptyValue) { choiceIndex += 1; } - if (customValue) { + if (customValue || add) { choiceIndex += 2; } @@ -222,7 +223,8 @@ const SingleAutocompleteSelectFieldContent: React.FC -): MultiAutocompleteChoiceType { +): SingleAutocompleteChoiceType { return { label: warehouse.name, value: warehouse.id @@ -86,10 +86,10 @@ const ShippingZoneDetailsPage: React.FC = ({ const initialForm: FormData = { name: shippingZone?.name || "", - warehouses: shippingZone?.warehouses.map(warehouse => warehouse.id) || [] + warehouse: shippingZone?.warehouses[0]?.id || null }; - const [warehouseDisplayValues, setWarehouseDisplayValues] = useStateFromProps( - shippingZone?.warehouses.map(warehouseToChoice) || [] + const [warehouseDisplayValue, setWarehouseDisplayValue] = useStateFromProps( + shippingZone?.warehouses[0]?.name || "" ); const warehouseChoices = warehouses.map(warehouseToChoice); @@ -97,10 +97,9 @@ const ShippingZoneDetailsPage: React.FC = ({ return (
{({ change, data, hasChanged, submit }) => { - const handleWarehouseChange = createMultiAutocompleteSelectHandler( + const handleWarehouseChange = createSingleAutocompleteSelectHandler( change, - setWarehouseDisplayValues, - warehouseDisplayValues, + setWarehouseDisplayValue, warehouseChoices ); @@ -122,18 +121,18 @@ const ShippingZoneDetailsPage: React.FC = ({ - shippingZone.default - ? intl.formatMessage({ - defaultMessage: - "This is default shipping zone, which means that it covers all of the countries which are not assigned to other shipping zones" - }) - : intl.formatMessage({ - defaultMessage: - "Currently, there are no countries assigned to this shipping zone" - }), - "..." + emptyText={getStringOrPlaceholder( + shippingZone?.default === undefined + ? undefined + : shippingZone.default + ? intl.formatMessage({ + defaultMessage: + "This is default shipping zone, which means that it covers all of the countries which are not assigned to other shipping zones" + }) + : intl.formatMessage({ + defaultMessage: + "Currently, there are no countries assigned to this shipping zone" + }) )} onCountryAssign={onCountryAdd} onCountryUnassign={onCountryRemove} @@ -167,7 +166,7 @@ const ShippingZoneDetailsPage: React.FC = ({
void; } @@ -44,7 +44,7 @@ export const ShippingZoneWarehouses: React.FC = pr })} /> - = pr onClick: onWarehouseAdd }} choices={warehouses} - displayValues={displayValue} + displayValue={displayValue} fetchChoices={onSearchChange} hasMore={hasMore} helperText={intl.formatMessage({ @@ -66,14 +66,14 @@ export const ShippingZoneWarehouses: React.FC = pr id: "shippingZoneWarehouses.autocomplete.label" })} loading={loading} - name="warehouses" + name="warehouse" onChange={onChange} onFetchMore={onFetchMore} placeholder={intl.formatMessage({ defaultMessage: "Select Warehouse", description: "input placeholder" })} - value={data.warehouses} + value={data.warehouse} /> diff --git a/src/shipping/mutations.ts b/src/shipping/mutations.ts index c9e32169a..b5430e640 100644 --- a/src/shipping/mutations.ts +++ b/src/shipping/mutations.ts @@ -1,6 +1,7 @@ import gql from "graphql-tag"; import makeMutation from "@saleor/hooks/makeMutation"; +import { warehouseErrorFragment } from "@saleor/warehouses/mutations"; import { countryFragment } from "../taxes/queries"; import { shippingMethodFragment, shippingZoneDetailsFragment } from "./queries"; import { @@ -43,10 +44,6 @@ import { AssignShippingZoneToWarehouse, AssignShippingZoneToWarehouseVariables } from "./types/AssignShippingZoneToWarehouse"; -import { - UnassignShippingZoneToWarehouse, - UnassignShippingZoneToWarehouseVariables -} from "./types/UnassignShippingZoneToWarehouse"; export const shippingErrorFragment = gql` fragment ShippingErrorFragment on ShippingError { @@ -224,6 +221,7 @@ export const useShippingRateBulkDelete = makeMutation< >(bulkDeleteShippingRate); const assignShippingZoneToWarehouse = gql` + ${warehouseErrorFragment} mutation AssignShippingZoneToWarehouse( $warehouseId: ID! $shippingZoneId: ID! @@ -232,9 +230,8 @@ const assignShippingZoneToWarehouse = gql` id: $warehouseId shippingZoneIds: [$shippingZoneId] ) { - warehouseErrors { - code - field + errors: warehouseErrors { + ...WarehouseErrorFragment } } } @@ -243,24 +240,3 @@ export const useAssignShippingZoneToWarehouse = makeMutation< AssignShippingZoneToWarehouse, AssignShippingZoneToWarehouseVariables >(assignShippingZoneToWarehouse); - -const unassignShippingZoneToWarehouse = gql` - mutation UnassignShippingZoneToWarehouse( - $warehouseId: ID! - $shippingZoneId: ID! - ) { - unassignWarehouseShippingZone( - id: $warehouseId - shippingZoneIds: [$shippingZoneId] - ) { - warehouseErrors { - code - field - } - } - } -`; -export const useUnassignShippingZoneToWarehouse = makeMutation< - UnassignShippingZoneToWarehouse, - UnassignShippingZoneToWarehouseVariables ->(unassignShippingZoneToWarehouse); diff --git a/src/shipping/types/AssignShippingZoneToWarehouse.ts b/src/shipping/types/AssignShippingZoneToWarehouse.ts index 2f8b1789a..ae104a3a4 100644 --- a/src/shipping/types/AssignShippingZoneToWarehouse.ts +++ b/src/shipping/types/AssignShippingZoneToWarehouse.ts @@ -8,7 +8,7 @@ import { WarehouseErrorCode } from "./../../types/globalTypes"; // GraphQL mutation operation: AssignShippingZoneToWarehouse // ==================================================== -export interface AssignShippingZoneToWarehouse_assignWarehouseShippingZone_warehouseErrors { +export interface AssignShippingZoneToWarehouse_assignWarehouseShippingZone_errors { __typename: "WarehouseError"; code: WarehouseErrorCode; field: string | null; @@ -16,7 +16,7 @@ export interface AssignShippingZoneToWarehouse_assignWarehouseShippingZone_wareh export interface AssignShippingZoneToWarehouse_assignWarehouseShippingZone { __typename: "WarehouseShippingZoneAssign"; - warehouseErrors: AssignShippingZoneToWarehouse_assignWarehouseShippingZone_warehouseErrors[]; + errors: AssignShippingZoneToWarehouse_assignWarehouseShippingZone_errors[]; } export interface AssignShippingZoneToWarehouse { diff --git a/src/shipping/views/ShippingZoneDetails/index.tsx b/src/shipping/views/ShippingZoneDetails/index.tsx index b91810aee..dc66c7d59 100644 --- a/src/shipping/views/ShippingZoneDetails/index.tsx +++ b/src/shipping/views/ShippingZoneDetails/index.tsx @@ -144,21 +144,45 @@ const ShippingZoneDetails: React.FC = ({ } }); - const handleSubmit = (data: FormData) => { - updateShippingZone({ - variables: { - id, - input: { - name: data.name + const handleSubmit = async (data: FormData) => { + try { + const updateResult = await updateShippingZone({ + variables: { + id, + input: { + name: data.name + } } + }); + const updateErrors = updateResult.data.shippingZoneUpdate.errors; + + if (updateErrors.length === 0) { + const assignResult = await assignToWarehouse({ + variables: { + shippingZoneId: id, + warehouseId: data.warehouse + } + }); + const assignErrors = + assignResult.data.assignWarehouseShippingZone.errors; + + if (assignErrors.length === 0) { + notify({ + text: intl.formatMessage(commonMessages.savedChanges) + }); + } else { + throw new Error( + `Assigning to warehouse failed: ${assignErrors[0].code}` + ); + } + } else { + throw new Error(`Updating failed: ${updateErrors[0].message}`); } - }); - assignToWarehouse({ - variables: { - shippingZoneId: id, - warehouseId: data.warehouses[0] - } - }); + } catch (err) { + notify({ + text: intl.formatMessage(commonMessages.somethingWentWrong) + }); + } }; if (data?.shippingZone === null) { diff --git a/src/warehouses/mutations.ts b/src/warehouses/mutations.ts index 26a9b2805..fbc86e437 100644 --- a/src/warehouses/mutations.ts +++ b/src/warehouses/mutations.ts @@ -15,6 +15,13 @@ import { } from "./types/WarehouseDelete"; import { warehouseDetailsFragment } from "./queries"; +export const warehouseErrorFragment = gql` + fragment WarehouseErrorFragment on WarehouseError { + code + field + } +`; + const deleteWarehouse = gql` mutation WarehouseDelete($id: ID!) { deleteWarehouse(id: $id) { diff --git a/src/warehouses/types/WarehouseErrorFragment.ts b/src/warehouses/types/WarehouseErrorFragment.ts new file mode 100644 index 000000000..efb04bb45 --- /dev/null +++ b/src/warehouses/types/WarehouseErrorFragment.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { WarehouseErrorCode } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: WarehouseErrorFragment +// ==================================================== + +export interface WarehouseErrorFragment { + __typename: "WarehouseError"; + code: WarehouseErrorCode; + field: string | null; +}