From 2b92211b9949dccf4a4ed22b91962fcaa0f240af Mon Sep 17 00:00:00 2001 From: dominik-zeglen Date: Wed, 23 Sep 2020 10:29:13 +0200 Subject: [PATCH] Add tax section to product view --- .../SingleAutocompleteSelectField.tsx | 8 +- src/fragments/products.ts | 8 ++ src/fragments/taxes.ts | 6 + src/fragments/types/Product.ts | 14 +++ src/fragments/types/TaxTypeFragment.ts | 13 +++ .../ProductPricing/ProductPricing.tsx | 14 +-- .../components/ProductTaxes/ProductTaxes.tsx | 109 ++++++++++++++++++ src/products/components/ProductTaxes/index.ts | 2 + .../ProductUpdatePage/ProductUpdatePage.tsx | 27 +++++ src/products/fixtures.ts | 10 +- src/products/mutations.ts | 103 +---------------- src/products/queries.ts | 5 + src/products/types/ProductCreate.ts | 33 +++--- src/products/types/ProductDetails.ts | 21 ++++ src/products/types/ProductImageCreate.ts | 14 +++ src/products/types/ProductImageUpdate.ts | 14 +++ src/products/types/ProductUpdate.ts | 28 +++-- src/products/types/ProductVariantReorder.ts | 14 +++ src/products/types/SimpleProductUpdate.ts | 29 ++--- src/products/utils/data.ts | 11 +- src/products/views/ProductCreate.tsx | 54 ++++----- .../views/ProductUpdate/ProductUpdate.tsx | 1 + src/products/views/ProductUpdate/handlers.ts | 48 ++++---- src/types/globalTypes.ts | 42 +++++++ 24 files changed, 424 insertions(+), 204 deletions(-) create mode 100644 src/fragments/types/TaxTypeFragment.ts create mode 100644 src/products/components/ProductTaxes/ProductTaxes.tsx create mode 100644 src/products/components/ProductTaxes/index.ts diff --git a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx index bca5ac905..a7913a898 100644 --- a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx +++ b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx @@ -3,6 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"; import TextField from "@material-ui/core/TextField"; import useStateFromProps from "@saleor/hooks/useStateFromProps"; import { FetchMoreProps } from "@saleor/types"; +import classNames from "classnames"; import Downshift from "downshift"; import { filter } from "fuzzaldrin"; import React from "react"; @@ -27,6 +28,7 @@ const useStyles = makeStyles( export interface SingleAutocompleteSelectFieldProps extends Partial { add?: SingleAutocompleteActionType; + className?: string; error?: boolean; name: string; displayValue: string; @@ -51,6 +53,7 @@ const SingleAutocompleteSelectFieldComponent: React.FC +
= props => { defaultMessage: "Pricing", description: "product pricing" })} - > - - + />
({ + content: { + paddingTop: theme.spacing(2) + }, + hr: { + margin: theme.spacing(2, 0) + }, + select: { + margin: theme.spacing(2, 0) + } + }), + { + name: "ProductTaxes" + } +); + +const ProductTaxes: React.FC = ({ + data, + disabled, + selectedTaxTypeDisplayName, + taxTypes, + onChange, + onTaxTypeChange +}) => { + const intl = useIntl(); + const classes = useStyles({}); + + return ( + + + + +
+ + {data.changeTaxCode && ( + ({ + label: taxType.description, + value: taxType.taxCode + })) || [] + } + InputProps={{ + autoComplete: "off" + }} + /> + )} +
+
+ ); +}; + +ProductTaxes.displayName = "ProductTaxes"; +export default ProductTaxes; diff --git a/src/products/components/ProductTaxes/index.ts b/src/products/components/ProductTaxes/index.ts new file mode 100644 index 000000000..e789213a0 --- /dev/null +++ b/src/products/components/ProductTaxes/index.ts @@ -0,0 +1,2 @@ +export * from "./ProductTaxes"; +export { default } from "./ProductTaxes"; diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx index ad8f27270..e037bc241 100644 --- a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx @@ -10,6 +10,7 @@ import PageHeader from "@saleor/components/PageHeader"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import SeoForm from "@saleor/components/SeoForm"; import { ProductErrorFragment } from "@saleor/fragments/types/ProductErrorFragment"; +import { TaxTypeFragment } from "@saleor/fragments/types/TaxTypeFragment"; import { WarehouseFragment } from "@saleor/fragments/types/WarehouseFragment"; import useDateLocalize from "@saleor/hooks/useDateLocalize"; import useFormset from "@saleor/hooks/useFormset"; @@ -52,6 +53,7 @@ import ProductOrganization from "../ProductOrganization"; import ProductPricing from "../ProductPricing"; import ProductShipping from "../ProductShipping/ProductShipping"; import ProductStocks, { ProductStockInput } from "../ProductStocks"; +import ProductTaxes from "../ProductTaxes"; import ProductVariants from "../ProductVariants"; export interface ProductUpdatePageProps extends ListActions { @@ -69,6 +71,7 @@ export interface ProductUpdatePageProps extends ListActions { header: string; saveButtonBarState: ConfirmButtonTransitionState; warehouses: WarehouseFragment[]; + taxTypes: TaxTypeFragment[]; fetchCategories: (query: string) => void; fetchCollections: (query: string) => void; onVariantsAdd: () => void; @@ -110,6 +113,7 @@ export const ProductUpdatePage: React.FC = ({ saveButtonBarState, variants, warehouses, + taxTypes, onBack, onDelete, onImageDelete, @@ -159,6 +163,10 @@ export const ProductUpdatePage: React.FC = ({ getChoices(maybe(() => product.collections, [])) ); + const [selectedTaxType, setSelectedTaxType] = useStateFromProps( + product?.taxType.description + ); + const { isMetadataModified, isPrivateMetadataModified, @@ -175,6 +183,11 @@ export const ProductUpdatePage: React.FC = ({ const currency = product?.variants?.length && product.variants[0].price.currency; const hasVariants = maybe(() => product.productType.hasVariants, false); + const taxTypeChoices = + taxTypes?.map(taxType => ({ + label: taxType.description, + value: taxType.taxCode + })) || []; const handleSubmit = (data: ProductUpdatePageFormData) => { const metadata = isMetadataModified ? data.metadata : undefined; @@ -244,6 +257,11 @@ export const ProductUpdatePage: React.FC = ({ triggerChange ); const changeMetadata = makeMetadataChangeHandler(change); + const handleTaxTypeSelect = createSingleAutocompleteSelectHandler( + change, + setSelectedTaxType, + taxTypeChoices + ); return ( <> @@ -415,6 +433,15 @@ export const ProductUpdatePage: React.FC = ({ }} onChange={change} /> + +
( const productDetailsQuery = gql` ${productFragmentDetails} + ${taxTypeFragment} query ProductDetails($id: ID!) { product(id: $id) { ...Product } + taxTypes { + ...TaxTypeFragment + } } `; export const useProductDetails = makeQuery< diff --git a/src/products/types/ProductCreate.ts b/src/products/types/ProductCreate.ts index 68c154d91..840f45675 100644 --- a/src/products/types/ProductCreate.ts +++ b/src/products/types/ProductCreate.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { AttributeValueInput, SeoInput, StockInput, ProductErrorCode, AttributeInputTypeEnum, WeightUnitsEnum } from "./../../types/globalTypes"; +import { ProductCreateInput, ProductErrorCode, AttributeInputTypeEnum, WeightUnitsEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: ProductCreate @@ -58,12 +58,19 @@ export interface ProductCreate_productCreate_product_productType_variantAttribut values: (ProductCreate_productCreate_product_productType_variantAttributes_values | null)[] | null; } +export interface ProductCreate_productCreate_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductCreate_productCreate_product_productType { __typename: "ProductType"; id: string; variantAttributes: (ProductCreate_productCreate_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: ProductCreate_productCreate_product_productType_taxType | null; } export interface ProductCreate_productCreate_product_pricing_priceRangeUndiscounted_start_gross { @@ -192,6 +199,12 @@ export interface ProductCreate_productCreate_product_weight { value: number; } +export interface ProductCreate_productCreate_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductCreate_productCreate_product { __typename: "Product"; id: string; @@ -216,6 +229,7 @@ export interface ProductCreate_productCreate_product { images: (ProductCreate_productCreate_product_images | null)[] | null; variants: (ProductCreate_productCreate_product_variants | null)[] | null; weight: ProductCreate_productCreate_product_weight | null; + taxType: ProductCreate_productCreate_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } @@ -231,20 +245,5 @@ export interface ProductCreate { } export interface ProductCreateVariables { - attributes?: (AttributeValueInput | null)[] | null; - publicationDate?: any | null; - category: string; - chargeTaxes: boolean; - collections?: (string | null)[] | null; - descriptionJson?: any | null; - isPublished: boolean; - name: string; - basePrice?: any | null; - productType: string; - sku?: string | null; - seo?: SeoInput | null; - stocks: StockInput[]; - trackInventory: boolean; - weight?: any | null; - visibleInListings?: boolean | null; + input: ProductCreateInput; } diff --git a/src/products/types/ProductDetails.ts b/src/products/types/ProductDetails.ts index 06e579bae..c4669780c 100644 --- a/src/products/types/ProductDetails.ts +++ b/src/products/types/ProductDetails.ts @@ -52,12 +52,19 @@ export interface ProductDetails_product_productType_variantAttributes { values: (ProductDetails_product_productType_variantAttributes_values | null)[] | null; } +export interface ProductDetails_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductDetails_product_productType { __typename: "ProductType"; id: string; variantAttributes: (ProductDetails_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: ProductDetails_product_productType_taxType | null; } export interface ProductDetails_product_pricing_priceRangeUndiscounted_start_gross { @@ -186,6 +193,12 @@ export interface ProductDetails_product_weight { value: number; } +export interface ProductDetails_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductDetails_product { __typename: "Product"; id: string; @@ -210,12 +223,20 @@ export interface ProductDetails_product { images: (ProductDetails_product_images | null)[] | null; variants: (ProductDetails_product_variants | null)[] | null; weight: ProductDetails_product_weight | null; + taxType: ProductDetails_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } +export interface ProductDetails_taxTypes { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductDetails { product: ProductDetails_product | null; + taxTypes: (ProductDetails_taxTypes | null)[] | null; } export interface ProductDetailsVariables { diff --git a/src/products/types/ProductImageCreate.ts b/src/products/types/ProductImageCreate.ts index 9c472c556..e9878f34d 100644 --- a/src/products/types/ProductImageCreate.ts +++ b/src/products/types/ProductImageCreate.ts @@ -58,12 +58,19 @@ export interface ProductImageCreate_productImageCreate_product_productType_varia values: (ProductImageCreate_productImageCreate_product_productType_variantAttributes_values | null)[] | null; } +export interface ProductImageCreate_productImageCreate_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductImageCreate_productImageCreate_product_productType { __typename: "ProductType"; id: string; variantAttributes: (ProductImageCreate_productImageCreate_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: ProductImageCreate_productImageCreate_product_productType_taxType | null; } export interface ProductImageCreate_productImageCreate_product_pricing_priceRangeUndiscounted_start_gross { @@ -192,6 +199,12 @@ export interface ProductImageCreate_productImageCreate_product_weight { value: number; } +export interface ProductImageCreate_productImageCreate_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductImageCreate_productImageCreate_product { __typename: "Product"; id: string; @@ -216,6 +229,7 @@ export interface ProductImageCreate_productImageCreate_product { images: (ProductImageCreate_productImageCreate_product_images | null)[] | null; variants: (ProductImageCreate_productImageCreate_product_variants | null)[] | null; weight: ProductImageCreate_productImageCreate_product_weight | null; + taxType: ProductImageCreate_productImageCreate_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } diff --git a/src/products/types/ProductImageUpdate.ts b/src/products/types/ProductImageUpdate.ts index e85899725..c8980b156 100644 --- a/src/products/types/ProductImageUpdate.ts +++ b/src/products/types/ProductImageUpdate.ts @@ -58,12 +58,19 @@ export interface ProductImageUpdate_productImageUpdate_product_productType_varia values: (ProductImageUpdate_productImageUpdate_product_productType_variantAttributes_values | null)[] | null; } +export interface ProductImageUpdate_productImageUpdate_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductImageUpdate_productImageUpdate_product_productType { __typename: "ProductType"; id: string; variantAttributes: (ProductImageUpdate_productImageUpdate_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: ProductImageUpdate_productImageUpdate_product_productType_taxType | null; } export interface ProductImageUpdate_productImageUpdate_product_pricing_priceRangeUndiscounted_start_gross { @@ -192,6 +199,12 @@ export interface ProductImageUpdate_productImageUpdate_product_weight { value: number; } +export interface ProductImageUpdate_productImageUpdate_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductImageUpdate_productImageUpdate_product { __typename: "Product"; id: string; @@ -216,6 +229,7 @@ export interface ProductImageUpdate_productImageUpdate_product { images: (ProductImageUpdate_productImageUpdate_product_images | null)[] | null; variants: (ProductImageUpdate_productImageUpdate_product_variants | null)[] | null; weight: ProductImageUpdate_productImageUpdate_product_weight | null; + taxType: ProductImageUpdate_productImageUpdate_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } diff --git a/src/products/types/ProductUpdate.ts b/src/products/types/ProductUpdate.ts index f03604480..7330a41f0 100644 --- a/src/products/types/ProductUpdate.ts +++ b/src/products/types/ProductUpdate.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { AttributeValueInput, SeoInput, ProductErrorCode, AttributeInputTypeEnum, WeightUnitsEnum } from "./../../types/globalTypes"; +import { ProductInput, ProductErrorCode, AttributeInputTypeEnum, WeightUnitsEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: ProductUpdate @@ -58,12 +58,19 @@ export interface ProductUpdate_productUpdate_product_productType_variantAttribut values: (ProductUpdate_productUpdate_product_productType_variantAttributes_values | null)[] | null; } +export interface ProductUpdate_productUpdate_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductUpdate_productUpdate_product_productType { __typename: "ProductType"; id: string; variantAttributes: (ProductUpdate_productUpdate_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: ProductUpdate_productUpdate_product_productType_taxType | null; } export interface ProductUpdate_productUpdate_product_pricing_priceRangeUndiscounted_start_gross { @@ -192,6 +199,12 @@ export interface ProductUpdate_productUpdate_product_weight { value: number; } +export interface ProductUpdate_productUpdate_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductUpdate_productUpdate_product { __typename: "Product"; id: string; @@ -216,6 +229,7 @@ export interface ProductUpdate_productUpdate_product { images: (ProductUpdate_productUpdate_product_images | null)[] | null; variants: (ProductUpdate_productUpdate_product_variants | null)[] | null; weight: ProductUpdate_productUpdate_product_weight | null; + taxType: ProductUpdate_productUpdate_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } @@ -232,15 +246,5 @@ export interface ProductUpdate { export interface ProductUpdateVariables { id: string; - attributes?: (AttributeValueInput | null)[] | null; - publicationDate?: any | null; - category?: string | null; - chargeTaxes: boolean; - collections?: (string | null)[] | null; - descriptionJson?: any | null; - isPublished: boolean; - name?: string | null; - basePrice?: any | null; - seo?: SeoInput | null; - visibleInListings?: boolean | null; + input: ProductInput; } diff --git a/src/products/types/ProductVariantReorder.ts b/src/products/types/ProductVariantReorder.ts index 8c5f1741f..4996e3c00 100644 --- a/src/products/types/ProductVariantReorder.ts +++ b/src/products/types/ProductVariantReorder.ts @@ -58,12 +58,19 @@ export interface ProductVariantReorder_productVariantReorder_product_productType values: (ProductVariantReorder_productVariantReorder_product_productType_variantAttributes_values | null)[] | null; } +export interface ProductVariantReorder_productVariantReorder_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductVariantReorder_productVariantReorder_product_productType { __typename: "ProductType"; id: string; variantAttributes: (ProductVariantReorder_productVariantReorder_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: ProductVariantReorder_productVariantReorder_product_productType_taxType | null; } export interface ProductVariantReorder_productVariantReorder_product_pricing_priceRangeUndiscounted_start_gross { @@ -192,6 +199,12 @@ export interface ProductVariantReorder_productVariantReorder_product_weight { value: number; } +export interface ProductVariantReorder_productVariantReorder_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface ProductVariantReorder_productVariantReorder_product { __typename: "Product"; id: string; @@ -216,6 +229,7 @@ export interface ProductVariantReorder_productVariantReorder_product { images: (ProductVariantReorder_productVariantReorder_product_images | null)[] | null; variants: (ProductVariantReorder_productVariantReorder_product_variants | null)[] | null; weight: ProductVariantReorder_productVariantReorder_product_weight | null; + taxType: ProductVariantReorder_productVariantReorder_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } diff --git a/src/products/types/SimpleProductUpdate.ts b/src/products/types/SimpleProductUpdate.ts index e023f09b1..c207771aa 100644 --- a/src/products/types/SimpleProductUpdate.ts +++ b/src/products/types/SimpleProductUpdate.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { AttributeValueInput, ProductVariantInput, SeoInput, StockInput, ProductErrorCode, AttributeInputTypeEnum, WeightUnitsEnum, StockErrorCode } from "./../../types/globalTypes"; +import { ProductInput, ProductVariantInput, StockInput, ProductErrorCode, AttributeInputTypeEnum, WeightUnitsEnum, StockErrorCode } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: SimpleProductUpdate @@ -58,12 +58,19 @@ export interface SimpleProductUpdate_productUpdate_product_productType_variantAt values: (SimpleProductUpdate_productUpdate_product_productType_variantAttributes_values | null)[] | null; } +export interface SimpleProductUpdate_productUpdate_product_productType_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface SimpleProductUpdate_productUpdate_product_productType { __typename: "ProductType"; id: string; variantAttributes: (SimpleProductUpdate_productUpdate_product_productType_variantAttributes | null)[] | null; name: string; hasVariants: boolean; + taxType: SimpleProductUpdate_productUpdate_product_productType_taxType | null; } export interface SimpleProductUpdate_productUpdate_product_pricing_priceRangeUndiscounted_start_gross { @@ -192,6 +199,12 @@ export interface SimpleProductUpdate_productUpdate_product_weight { value: number; } +export interface SimpleProductUpdate_productUpdate_product_taxType { + __typename: "TaxType"; + description: string | null; + taxCode: string | null; +} + export interface SimpleProductUpdate_productUpdate_product { __typename: "Product"; id: string; @@ -216,6 +229,7 @@ export interface SimpleProductUpdate_productUpdate_product { images: (SimpleProductUpdate_productUpdate_product_images | null)[] | null; variants: (SimpleProductUpdate_productUpdate_product_variants | null)[] | null; weight: SimpleProductUpdate_productUpdate_product_weight | null; + taxType: SimpleProductUpdate_productUpdate_product_taxType | null; availableForPurchase: any | null; visibleInListings: boolean; } @@ -814,21 +828,10 @@ export interface SimpleProductUpdate { export interface SimpleProductUpdateVariables { id: string; - attributes?: (AttributeValueInput | null)[] | null; - publicationDate?: any | null; - category?: string | null; - chargeTaxes: boolean; - collections?: (string | null)[] | null; - descriptionJson?: any | null; - isPublished: boolean; - name?: string | null; - basePrice?: any | null; + input: ProductInput; productVariantId: string; productVariantInput: ProductVariantInput; - seo?: SeoInput | null; addStocks: StockInput[]; deleteStocks: string[]; updateStocks: StockInput[]; - weight?: any | null; - visibleInListings?: boolean | null; } diff --git a/src/products/utils/data.ts b/src/products/utils/data.ts index 28eab8a18..e9606b0de 100644 --- a/src/products/utils/data.ts +++ b/src/products/utils/data.ts @@ -174,20 +174,22 @@ export interface ProductUpdatePageFormData extends MetadataFormData { availableForPurchase: string; basePrice: number; category: string | null; - collections: string[]; + changeTaxCode: boolean; chargeTaxes: boolean; + collections: string[]; description: RawDraftContentState; - isAvailableForPurchase: boolean; isAvailable: boolean; + isAvailableForPurchase: boolean; isPublished: boolean; name: string; publicationDate: string; seoDescription: string; seoTitle: string; sku: string; + taxCode: string; trackInventory: boolean; - weight: string; visibleInListings: boolean; + weight: string; } export function getProductUpdatePageFormData( @@ -198,6 +200,8 @@ export function getProductUpdatePageFormData( availableForPurchase: product?.availableForPurchase, basePrice: maybe(() => product.variants[0].price.amount, 0), category: maybe(() => product.category.id, ""), + changeTaxCode: + product?.productType.taxType.taxCode !== product?.taxType.taxCode, chargeTaxes: maybe(() => product.chargeTaxes, false), collections: maybe( () => product.collections.map(collection => collection.id), @@ -222,6 +226,7 @@ export function getProductUpdatePageFormData( : undefined, "" ), + taxCode: product?.taxType.taxCode, trackInventory: !!product?.variants[0]?.trackInventory, visibleInListings: !!product?.visibleInListings, weight: product?.weight?.value.toString() || "" diff --git a/src/products/views/ProductCreate.tsx b/src/products/views/ProductCreate.tsx index f59685bff..4dfdccf41 100644 --- a/src/products/views/ProductCreate.tsx +++ b/src/products/views/ProductCreate.tsx @@ -91,32 +91,34 @@ export const ProductCreateView: React.FC = () => { const handleCreate = async (formData: ProductCreatePageSubmitData) => { const result = await productCreate({ variables: { - attributes: formData.attributes.map(attribute => ({ - id: attribute.id, - values: attribute.value - })), - basePrice: decimal(formData.basePrice), - category: formData.category, - chargeTaxes: formData.chargeTaxes, - collections: formData.collections, - descriptionJson: JSON.stringify(formData.description), - isPublished: formData.isPublished, - name: formData.name, - productType: formData.productType, - publicationDate: - formData.publicationDate !== "" ? formData.publicationDate : null, - seo: { - description: formData.seoDescription, - title: formData.seoTitle - }, - sku: formData.sku, - stocks: formData.stocks.map(stock => ({ - quantity: parseInt(stock.value, 0), - warehouse: stock.id - })), - trackInventory: formData.trackInventory, - visibleInListings: formData.visibleInListings, - weight: weight(formData.weight) + input: { + attributes: formData.attributes.map(attribute => ({ + id: attribute.id, + values: attribute.value + })), + basePrice: decimal(formData.basePrice), + category: formData.category, + chargeTaxes: formData.chargeTaxes, + collections: formData.collections, + descriptionJson: JSON.stringify(formData.description), + isPublished: formData.isPublished, + name: formData.name, + productType: formData.productType, + publicationDate: + formData.publicationDate !== "" ? formData.publicationDate : null, + seo: { + description: formData.seoDescription, + title: formData.seoTitle + }, + sku: formData.sku, + stocks: formData.stocks.map(stock => ({ + quantity: parseInt(stock.value, 0), + warehouse: stock.id + })), + trackInventory: formData.trackInventory, + visibleInListings: formData.visibleInListings, + weight: weight(formData.weight) + } } }); diff --git a/src/products/views/ProductUpdate/ProductUpdate.tsx b/src/products/views/ProductUpdate/ProductUpdate.tsx index 8aeef201c..dd7bad66a 100644 --- a/src/products/views/ProductUpdate/ProductUpdate.tsx +++ b/src/products/views/ProductUpdate/ProductUpdate.tsx @@ -292,6 +292,7 @@ export const ProductUpdate: React.FC = ({ id, params }) => { warehouses={ warehouses.data?.warehouses.edges.map(edge => edge.node) || [] } + taxTypes={data?.taxTypes} variants={maybe(() => product.variants)} onBack={handleBack} onDelete={() => openModal("remove")} diff --git a/src/products/views/ProductUpdate/handlers.ts b/src/products/views/ProductUpdate/handlers.ts index 6e3de1180..3ba2b62be 100644 --- a/src/products/views/ProductUpdate/handlers.ts +++ b/src/products/views/ProductUpdate/handlers.ts @@ -41,25 +41,30 @@ export function createUpdateHandler( ) { return async (data: ProductUpdatePageSubmitData) => { const productVariables: ProductUpdateVariables = { - attributes: data.attributes.map(attribute => ({ - id: attribute.id, - values: attribute.value[0] === "" ? [] : attribute.value - })), - basePrice: decimal(data.basePrice), - category: data.category, - chargeTaxes: data.chargeTaxes, - collections: data.collections, - descriptionJson: JSON.stringify(data.description), id: product.id, - isPublished: data.isPublished, - name: data.name, - publicationDate: - data.publicationDate !== "" ? data.publicationDate : null, - seo: { - description: data.seoDescription, - title: data.seoTitle - }, - visibleInListings: data.visibleInListings + input: { + attributes: data.attributes.map(attribute => ({ + id: attribute.id, + values: attribute.value[0] === "" ? [] : attribute.value + })), + basePrice: decimal(data.basePrice), + category: data.category, + chargeTaxes: data.chargeTaxes, + collections: data.collections, + descriptionJson: JSON.stringify(data.description), + isPublished: data.isPublished, + name: data.name, + publicationDate: + data.publicationDate !== "" ? data.publicationDate : null, + seo: { + description: data.seoDescription, + title: data.seoTitle + }, + taxCode: data.changeTaxCode + ? data.taxCode + : product.productType.taxType.taxCode, + visibleInListings: data.visibleInListings + } }; let errors: Array< @@ -74,13 +79,16 @@ export function createUpdateHandler( ...productVariables, addStocks: data.addStocks.map(mapFormsetStockToStockInput), deleteStocks: data.removeStocks, + input: { + ...productVariables.input, + weight: weight(data.weight) + }, productVariantId: product.variants[0].id, productVariantInput: { sku: data.sku, trackInventory: data.trackInventory }, - updateStocks: data.updateStocks.map(mapFormsetStockToStockInput), - weight: weight(data.weight) + updateStocks: data.updateStocks.map(mapFormsetStockToStockInput) }); errors = [ ...result.data.productUpdate.errors, diff --git a/src/types/globalTypes.ts b/src/types/globalTypes.ts index 5d626b4df..f79be52c5 100644 --- a/src/types/globalTypes.ts +++ b/src/types/globalTypes.ts @@ -1341,6 +1341,28 @@ export interface PriceRangeInput { lte?: number | null; } +export interface ProductCreateInput { + attributes?: (AttributeValueInput | null)[] | null; + publicationDate?: any | null; + category?: string | null; + chargeTaxes?: boolean | null; + collections?: (string | null)[] | null; + description?: string | null; + descriptionJson?: any | null; + isPublished?: boolean | null; + name?: string | null; + slug?: string | null; + taxCode?: string | null; + seo?: SeoInput | null; + weight?: any | null; + sku?: string | null; + trackInventory?: boolean | null; + basePrice?: any | null; + visibleInListings?: boolean | null; + productType: string; + stocks?: StockInput[] | null; +} + export interface ProductFilterInput { isPublished?: boolean | null; collections?: (string | null)[] | null; @@ -1356,6 +1378,26 @@ export interface ProductFilterInput { productTypes?: (string | null)[] | null; } +export interface ProductInput { + attributes?: (AttributeValueInput | null)[] | null; + publicationDate?: any | null; + category?: string | null; + chargeTaxes?: boolean | null; + collections?: (string | null)[] | null; + description?: string | null; + descriptionJson?: any | null; + isPublished?: boolean | null; + name?: string | null; + slug?: string | null; + taxCode?: string | null; + seo?: SeoInput | null; + weight?: any | null; + sku?: string | null; + trackInventory?: boolean | null; + basePrice?: any | null; + visibleInListings?: boolean | null; +} + export interface ProductOrder { direction: OrderDirection; attributeId?: string | null;