diff --git a/CHANGELOG.md b/CHANGELOG.md index 56c31ece8..92e6f74e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable, unreleased changes to this project will be documented in this file. ## [Unreleased] +- Add weight field and fix warehouse country selection - #597 by @dominik-zeglen + ## 2.10.0 - Fix minor bugs - #244 by @dominik-zeglen diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index efb382289..c26dac2b1 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -3606,6 +3606,14 @@ "src_dot_products_dot_components_dot_ProductPricing_dot_3015886868": { "string": "Charge taxes for this item" }, + "src_dot_products_dot_components_dot_ProductShipping_dot_1325966144": { + "context": "product shipping", + "string": "Shipping" + }, + "src_dot_products_dot_components_dot_ProductShipping_dot_746695941": { + "context": "product weight", + "string": "Weight" + }, "src_dot_products_dot_components_dot_ProductStocks_dot_2585918415": { "string": "SKU (Stock Keeping Unit)" }, @@ -3643,14 +3651,6 @@ "src_dot_products_dot_components_dot_ProductUpdatePage_dot_2706108815": { "string": "Add search engine title and description to make this product easier to find" }, - "src_dot_products_dot_components_dot_ProductVariantAttributes_dot_1536841622": { - "context": "product attribute error", - "string": "All attributes should have value" - }, - "src_dot_products_dot_components_dot_ProductVariantAttributes_dot_258966189": { - "context": "product attribute error", - "string": "This variant already exists" - }, "src_dot_products_dot_components_dot_ProductVariantCreatePage_dot_2853608829": { "context": "button", "string": "Save variant" @@ -5032,6 +5032,10 @@ "src_dot_utils_dot_errors_dot_attributeCannotBeAssigned": { "string": "This attribute cannot be assigned to this product type" }, + "src_dot_utils_dot_errors_dot_attributeRequired": { + "context": "product attribute error", + "string": "All attributes should have value" + }, "src_dot_utils_dot_errors_dot_attributeVariantsDisabled": { "string": "Variants are disabled in this product type" }, @@ -5136,6 +5140,10 @@ "src_dot_utils_dot_errors_dot_variantNoDigitalContent": { "string": "This variant does not have any digital content" }, + "src_dot_utils_dot_errors_dot_variantUnique": { + "context": "product attribute error", + "string": "This variant already exists" + }, "src_dot_vouchers": { "context": "vouchers section name", "string": "Vouchers" diff --git a/src/components/Timeline/TimelineNote.tsx b/src/components/Timeline/TimelineNote.tsx index bdeb5cdef..28203686a 100644 --- a/src/components/Timeline/TimelineNote.tsx +++ b/src/components/Timeline/TimelineNote.tsx @@ -79,14 +79,16 @@ export const TimelineNote: React.FC = props => { return (
- - - + {user && ( + + + + )}
- {user.email} + {user?.email} diff --git a/src/misc.ts b/src/misc.ts index 4d51f42fa..f4934f862 100644 --- a/src/misc.ts +++ b/src/misc.ts @@ -59,6 +59,10 @@ export function decimal(value: string | number) { return value; } +export function weight(value: string) { + return value === "" ? null : parseFloat(value); +} + export const removeDoubleSlashes = (url: string) => url.replace(/([^:]\/)\/+/g, "$1"); diff --git a/src/orders/fixtures.ts b/src/orders/fixtures.ts index 41279fd34..fe69a4a58 100644 --- a/src/orders/fixtures.ts +++ b/src/orders/fixtures.ts @@ -825,6 +825,30 @@ export const order = (placeholder: string): OrderDetails_order => ({ email: "admin@example.com", id: "QWRkcmVzczoxNQ==" } + }, + { + __typename: "OrderEvent", + amount: null, + date: "2019-09-17T13:22:24.376193+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo0", + message: "This is note", + quantity: null, + type: OrderEventsEnum.NOTE_ADDED, + user: null + }, + { + __typename: "OrderEvent", + amount: null, + date: "2019-09-17T13:22:24.376193+00:00", + email: null, + emailType: null, + id: "T3JkZXJFdmVudDo1", + message: "This is note", + quantity: null, + type: OrderEventsEnum.NOTE_ADDED, + user: null } ], fulfillments: [ diff --git a/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx b/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx index 6616baebd..3a11f5705 100644 --- a/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx +++ b/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx @@ -105,7 +105,7 @@ const ProductTypeCreatePage: React.FC = ({
diff --git a/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx b/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx index d46382479..1737361f9 100644 --- a/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx +++ b/src/productTypes/components/ProductTypeDetailsPage/ProductTypeDetailsPage.tsx @@ -199,7 +199,7 @@ const ProductTypeDetailsPage: React.FC = ({
diff --git a/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx b/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx index afb146aca..cb8ca105f 100644 --- a/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx +++ b/src/productTypes/components/ProductTypeShipping/ProductTypeShipping.tsx @@ -6,21 +6,20 @@ import { useIntl } from "react-intl"; import CardTitle from "@saleor/components/CardTitle"; import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; -import { WeightUnitsEnum } from "../../../types/globalTypes"; interface ProductTypeShippingProps { data: { isShippingRequired: boolean; weight: number | null; }; - defaultWeightUnit: WeightUnitsEnum; + weightUnit: string; disabled: boolean; onChange: (event: React.ChangeEvent) => void; } const ProductTypeShipping: React.FC = ({ data, - defaultWeightUnit, + weightUnit, disabled, onChange }) => { @@ -48,7 +47,7 @@ const ProductTypeShipping: React.FC = ({ {data.isShippingRequired && ( ; header: string; saveButtonBarState: ConfirmButtonTransitionState; + weightUnit: string; warehouses: SearchWarehouses_search_edges_node[]; fetchCategories: (data: string) => void; fetchCollections: (data: string) => void; @@ -107,6 +110,7 @@ export const ProductCreatePage: React.FC = ({ warehouses, onBack, fetchProductTypes, + weightUnit, onSubmit }: ProductCreatePageProps) => { const intl = useIntl(); @@ -143,7 +147,8 @@ export const ProductCreatePage: React.FC = ({ seoTitle: "", sku: null, stockQuantity: null, - trackInventory: false + trackInventory: false, + weight: "" }; // Display values @@ -242,6 +247,14 @@ export const ProductCreatePage: React.FC = ({ {!!productType && !productType.hasVariants && ( <> + + ) => void; +} + +const ProductShipping: React.FC = props => { + const { data, disabled, errors, weightUnit, onChange } = props; + + const intl = useIntl(); + + const formErrors = getFormErrors(["weight"], errors); + + return ( + + + + + {weightUnit} + ), + inputProps: { + min: 0 + } + }} + /> + + + + ); +}; +ProductShipping.displayName = "ProductShipping"; +export default ProductShipping; diff --git a/src/products/components/ProductShipping/index.ts b/src/products/components/ProductShipping/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx index 0d3a4a28f..e6b8ade87 100644 --- a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx @@ -50,8 +50,10 @@ import ProductOrganization from "../ProductOrganization"; import ProductPricing from "../ProductPricing"; import ProductVariants from "../ProductVariants"; import ProductStocks, { ProductStockInput } from "../ProductStocks"; +import ProductShipping from "../ProductShipping/ProductShipping"; export interface ProductUpdatePageProps extends ListActions { + defaultWeightUnit: string; errors: ProductErrorFragment[]; placeholderImage: string; collections: SearchCollections_search_edges_node[]; @@ -89,6 +91,7 @@ export interface ProductUpdatePageSubmitData extends ProductUpdatePageFormData { } export const ProductUpdatePage: React.FC = ({ + defaultWeightUnit, disabled, categories: categoryChoiceList, collections: collectionChoiceList, @@ -269,33 +272,43 @@ export const ProductUpdatePage: React.FC = ({ toggleAll={toggleAll} /> ) : ( - { - triggerChange(); - changeStockData(id, value); - }} - onFormDataChange={change} - onWarehouseStockAdd={id => { - triggerChange(); - addStock({ - data: null, - id, - label: warehouses.find( - warehouse => warehouse.id === id - ).name, - value: "0" - }); - }} - onWarehouseStockDelete={id => { - triggerChange(); - removeStock(id); - }} - /> + <> + + + { + triggerChange(); + changeStockData(id, value); + }} + onFormDataChange={change} + onWarehouseStockAdd={id => { + triggerChange(); + addStock({ + data: null, + id, + label: warehouses.find( + warehouse => warehouse.id === id + ).name, + value: "0" + }); + }} + onWarehouseStockDelete={id => { + triggerChange(); + removeStock(id); + }} + /> + )} = ({ attributes, disabled, @@ -88,8 +75,6 @@ const ProductVariantAttributes: React.FC = ({ }) => { const intl = useIntl(); - const translatedErrors = translateErrors(intl); - return ( = ({ .filter(error => error.field === "attributes") .map(error => ( - {translatedErrors[error.code]} + {getProductVariantAttributeErrorMessage(error, intl)} ))} diff --git a/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx b/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx index f768787db..2e59ea446 100644 --- a/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx +++ b/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx @@ -18,6 +18,7 @@ import { ProductErrorFragment } from "@saleor/attributes/types/ProductErrorFragm import { SearchWarehouses_search_edges_node } from "@saleor/searches/types/SearchWarehouses"; import { maybe } from "../../../misc"; import { ProductVariantCreateData_product } from "../../types/ProductVariantCreateData"; +import ProductShipping from "../ProductShipping/ProductShipping"; import ProductVariantAttributes, { VariantAttributeInputData } from "../ProductVariantAttributes"; @@ -32,6 +33,7 @@ interface ProductVariantCreatePageFormData { quantity: string; sku: string; trackInventory: boolean; + weight: string; } export interface ProductVariantCreatePageSubmitData @@ -48,6 +50,7 @@ interface ProductVariantCreatePageProps { product: ProductVariantCreateData_product; saveButtonBarState: ConfirmButtonTransitionState; warehouses: SearchWarehouses_search_edges_node[]; + weightUnit: string; onBack: () => void; onSubmit: (data: ProductVariantCreatePageSubmitData) => void; onVariantClick: (variantId: string) => void; @@ -61,6 +64,7 @@ const ProductVariantCreatePage: React.FC = ({ product, saveButtonBarState, warehouses, + weightUnit, onBack, onSubmit, onVariantClick @@ -86,7 +90,8 @@ const ProductVariantCreatePage: React.FC = ({ priceOverride: "", quantity: "0", sku: "", - trackInventory: true + trackInventory: true, + weight: "" }; const handleSubmit = (data: ProductVariantCreatePageFormData) => @@ -137,6 +142,14 @@ const ProductVariantCreatePage: React.FC = ({ onChange={change} /> + + = ({ + defaultWeightUnit, errors, loading, header, @@ -112,7 +116,8 @@ const ProductVariantPage: React.FC = ({ costPrice: maybe(() => variant.costPrice.amount.toString(), ""), priceOverride: maybe(() => variant.priceOverride.amount.toString(), ""), sku: maybe(() => variant.sku, ""), - trackInventory: variant?.trackInventory + trackInventory: variant?.trackInventory, + weight: variant?.weight?.value.toString() || "" }; const handleSubmit = (data: ProductVariantPageFormData) => { @@ -195,6 +200,14 @@ const ProductVariantPage: React.FC = ({ onChange={change} /> + + ({ } } ], - trackInventory: true + trackInventory: true, + weight: { + __typename: "Weight", + unit: "kg", + value: 6 + } }); export const variantImages = (placeholderImage: string) => variant(placeholderImage).images; diff --git a/src/products/mutations.ts b/src/products/mutations.ts index d877e1b1a..18bcec297 100644 --- a/src/products/mutations.ts +++ b/src/products/mutations.ts @@ -206,6 +206,7 @@ export const simpleProductUpdateMutation = gql` $addStocks: [StockInput!]! $deleteStocks: [ID!]! $updateStocks: [StockInput!]! + $weight: WeightScalar ) { productUpdate( id: $id @@ -220,6 +221,7 @@ export const simpleProductUpdateMutation = gql` name: $name basePrice: $basePrice seo: $seo + weight: $weight } ) { errors: productErrors { @@ -295,6 +297,7 @@ export const productCreateMutation = gql` $seo: SeoInput $stocks: [StockInput!]! $trackInventory: Boolean! + $weight: WeightScalar ) { productCreate( input: { @@ -312,6 +315,7 @@ export const productCreateMutation = gql` seo: $seo stocks: $stocks trackInventory: $trackInventory + weight: $weight } ) { errors: productErrors { @@ -360,6 +364,7 @@ export const variantUpdateMutation = gql` $sku: String $trackInventory: Boolean! $stocks: [StockInput!]! + $weight: WeightScalar ) { productVariantUpdate( id: $id @@ -369,6 +374,7 @@ export const variantUpdateMutation = gql` priceOverride: $priceOverride sku: $sku trackInventory: $trackInventory + weight: $weight } ) { errors: productErrors { diff --git a/src/products/queries.ts b/src/products/queries.ts index a614f0318..5ae6e21d3 100644 --- a/src/products/queries.ts +++ b/src/products/queries.ts @@ -185,12 +185,20 @@ export const productFragmentDetails = gql` ...StockFragment } trackInventory + weight { + unit + value + } } productType { id name hasVariants } + weight { + unit + value + } } `; @@ -253,6 +261,10 @@ export const fragmentVariant = gql` ...StockFragment } trackInventory + weight { + unit + value + } } `; diff --git a/src/products/types/Product.ts b/src/products/types/Product.ts index a1c8c7696..370fdc3d0 100644 --- a/src/products/types/Product.ts +++ b/src/products/types/Product.ts @@ -163,6 +163,12 @@ export interface Product_variants_stocks { warehouse: Product_variants_stocks_warehouse; } +export interface Product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface Product_variants { __typename: "ProductVariant"; id: string; @@ -172,6 +178,13 @@ export interface Product_variants { margin: number | null; stocks: (Product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: Product_variants_weight | null; +} + +export interface Product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface Product { @@ -195,4 +208,5 @@ export interface Product { pricing: Product_pricing | null; images: (Product_images | null)[] | null; variants: (Product_variants | null)[] | null; + weight: Product_weight | null; } diff --git a/src/products/types/ProductCreate.ts b/src/products/types/ProductCreate.ts index d757729d0..e1d020c3f 100644 --- a/src/products/types/ProductCreate.ts +++ b/src/products/types/ProductCreate.ts @@ -169,6 +169,12 @@ export interface ProductCreate_productCreate_product_variants_stocks { warehouse: ProductCreate_productCreate_product_variants_stocks_warehouse; } +export interface ProductCreate_productCreate_product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductCreate_productCreate_product_variants { __typename: "ProductVariant"; id: string; @@ -178,6 +184,13 @@ export interface ProductCreate_productCreate_product_variants { margin: number | null; stocks: (ProductCreate_productCreate_product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: ProductCreate_productCreate_product_variants_weight | null; +} + +export interface ProductCreate_productCreate_product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface ProductCreate_productCreate_product { @@ -201,6 +214,7 @@ export interface ProductCreate_productCreate_product { pricing: ProductCreate_productCreate_product_pricing | null; images: (ProductCreate_productCreate_product_images | null)[] | null; variants: (ProductCreate_productCreate_product_variants | null)[] | null; + weight: ProductCreate_productCreate_product_weight | null; } export interface ProductCreate_productCreate { @@ -228,4 +242,5 @@ export interface ProductCreateVariables { seo?: SeoInput | null; stocks: StockInput[]; trackInventory: boolean; + weight?: any | null; } diff --git a/src/products/types/ProductDetails.ts b/src/products/types/ProductDetails.ts index 2c5913c5a..86d337d42 100644 --- a/src/products/types/ProductDetails.ts +++ b/src/products/types/ProductDetails.ts @@ -163,6 +163,12 @@ export interface ProductDetails_product_variants_stocks { warehouse: ProductDetails_product_variants_stocks_warehouse; } +export interface ProductDetails_product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductDetails_product_variants { __typename: "ProductVariant"; id: string; @@ -172,6 +178,13 @@ export interface ProductDetails_product_variants { margin: number | null; stocks: (ProductDetails_product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: ProductDetails_product_variants_weight | null; +} + +export interface ProductDetails_product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface ProductDetails_product { @@ -195,6 +208,7 @@ export interface ProductDetails_product { pricing: ProductDetails_product_pricing | null; images: (ProductDetails_product_images | null)[] | null; variants: (ProductDetails_product_variants | null)[] | null; + weight: ProductDetails_product_weight | null; } export interface ProductDetails { diff --git a/src/products/types/ProductImageCreate.ts b/src/products/types/ProductImageCreate.ts index 49cd57bda..6614ea716 100644 --- a/src/products/types/ProductImageCreate.ts +++ b/src/products/types/ProductImageCreate.ts @@ -169,6 +169,12 @@ export interface ProductImageCreate_productImageCreate_product_variants_stocks { warehouse: ProductImageCreate_productImageCreate_product_variants_stocks_warehouse; } +export interface ProductImageCreate_productImageCreate_product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductImageCreate_productImageCreate_product_variants { __typename: "ProductVariant"; id: string; @@ -178,6 +184,13 @@ export interface ProductImageCreate_productImageCreate_product_variants { margin: number | null; stocks: (ProductImageCreate_productImageCreate_product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: ProductImageCreate_productImageCreate_product_variants_weight | null; +} + +export interface ProductImageCreate_productImageCreate_product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface ProductImageCreate_productImageCreate_product { @@ -201,6 +214,7 @@ export interface ProductImageCreate_productImageCreate_product { pricing: ProductImageCreate_productImageCreate_product_pricing | null; images: (ProductImageCreate_productImageCreate_product_images | null)[] | null; variants: (ProductImageCreate_productImageCreate_product_variants | null)[] | null; + weight: ProductImageCreate_productImageCreate_product_weight | null; } export interface ProductImageCreate_productImageCreate { diff --git a/src/products/types/ProductImageUpdate.ts b/src/products/types/ProductImageUpdate.ts index abb5401cb..26adab936 100644 --- a/src/products/types/ProductImageUpdate.ts +++ b/src/products/types/ProductImageUpdate.ts @@ -169,6 +169,12 @@ export interface ProductImageUpdate_productImageUpdate_product_variants_stocks { warehouse: ProductImageUpdate_productImageUpdate_product_variants_stocks_warehouse; } +export interface ProductImageUpdate_productImageUpdate_product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductImageUpdate_productImageUpdate_product_variants { __typename: "ProductVariant"; id: string; @@ -178,6 +184,13 @@ export interface ProductImageUpdate_productImageUpdate_product_variants { margin: number | null; stocks: (ProductImageUpdate_productImageUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: ProductImageUpdate_productImageUpdate_product_variants_weight | null; +} + +export interface ProductImageUpdate_productImageUpdate_product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface ProductImageUpdate_productImageUpdate_product { @@ -201,6 +214,7 @@ export interface ProductImageUpdate_productImageUpdate_product { pricing: ProductImageUpdate_productImageUpdate_product_pricing | null; images: (ProductImageUpdate_productImageUpdate_product_images | null)[] | null; variants: (ProductImageUpdate_productImageUpdate_product_variants | null)[] | null; + weight: ProductImageUpdate_productImageUpdate_product_weight | null; } export interface ProductImageUpdate_productImageUpdate { diff --git a/src/products/types/ProductUpdate.ts b/src/products/types/ProductUpdate.ts index 9ea3e5fd8..6a4e68411 100644 --- a/src/products/types/ProductUpdate.ts +++ b/src/products/types/ProductUpdate.ts @@ -169,6 +169,12 @@ export interface ProductUpdate_productUpdate_product_variants_stocks { warehouse: ProductUpdate_productUpdate_product_variants_stocks_warehouse; } +export interface ProductUpdate_productUpdate_product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductUpdate_productUpdate_product_variants { __typename: "ProductVariant"; id: string; @@ -178,6 +184,13 @@ export interface ProductUpdate_productUpdate_product_variants { margin: number | null; stocks: (ProductUpdate_productUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: ProductUpdate_productUpdate_product_variants_weight | null; +} + +export interface ProductUpdate_productUpdate_product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface ProductUpdate_productUpdate_product { @@ -201,6 +214,7 @@ export interface ProductUpdate_productUpdate_product { pricing: ProductUpdate_productUpdate_product_pricing | null; images: (ProductUpdate_productUpdate_product_images | null)[] | null; variants: (ProductUpdate_productUpdate_product_variants | null)[] | null; + weight: ProductUpdate_productUpdate_product_weight | null; } export interface ProductUpdate_productUpdate { diff --git a/src/products/types/ProductVariant.ts b/src/products/types/ProductVariant.ts index ec79ea8ed..78926e644 100644 --- a/src/products/types/ProductVariant.ts +++ b/src/products/types/ProductVariant.ts @@ -103,6 +103,12 @@ export interface ProductVariant_stocks { warehouse: ProductVariant_stocks_warehouse; } +export interface ProductVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductVariant { __typename: "ProductVariant"; id: string; @@ -115,4 +121,5 @@ export interface ProductVariant { sku: string; stocks: (ProductVariant_stocks | null)[] | null; trackInventory: boolean; + weight: ProductVariant_weight | null; } diff --git a/src/products/types/ProductVariantDetails.ts b/src/products/types/ProductVariantDetails.ts index 3e7de3718..43a1871e7 100644 --- a/src/products/types/ProductVariantDetails.ts +++ b/src/products/types/ProductVariantDetails.ts @@ -103,6 +103,12 @@ export interface ProductVariantDetails_productVariant_stocks { warehouse: ProductVariantDetails_productVariant_stocks_warehouse; } +export interface ProductVariantDetails_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface ProductVariantDetails_productVariant { __typename: "ProductVariant"; id: string; @@ -115,6 +121,7 @@ export interface ProductVariantDetails_productVariant { sku: string; stocks: (ProductVariantDetails_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: ProductVariantDetails_productVariant_weight | null; } export interface ProductVariantDetails { diff --git a/src/products/types/SimpleProductUpdate.ts b/src/products/types/SimpleProductUpdate.ts index 7e4d34600..4ebea508f 100644 --- a/src/products/types/SimpleProductUpdate.ts +++ b/src/products/types/SimpleProductUpdate.ts @@ -169,6 +169,12 @@ export interface SimpleProductUpdate_productUpdate_product_variants_stocks { warehouse: SimpleProductUpdate_productUpdate_product_variants_stocks_warehouse; } +export interface SimpleProductUpdate_productUpdate_product_variants_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface SimpleProductUpdate_productUpdate_product_variants { __typename: "ProductVariant"; id: string; @@ -178,6 +184,13 @@ export interface SimpleProductUpdate_productUpdate_product_variants { margin: number | null; stocks: (SimpleProductUpdate_productUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; + weight: SimpleProductUpdate_productUpdate_product_variants_weight | null; +} + +export interface SimpleProductUpdate_productUpdate_product_weight { + __typename: "Weight"; + unit: string; + value: number; } export interface SimpleProductUpdate_productUpdate_product { @@ -201,6 +214,7 @@ export interface SimpleProductUpdate_productUpdate_product { pricing: SimpleProductUpdate_productUpdate_product_pricing | null; images: (SimpleProductUpdate_productUpdate_product_images | null)[] | null; variants: (SimpleProductUpdate_productUpdate_product_variants | null)[] | null; + weight: SimpleProductUpdate_productUpdate_product_weight | null; } export interface SimpleProductUpdate_productUpdate { @@ -312,6 +326,12 @@ export interface SimpleProductUpdate_productVariantUpdate_productVariant_stocks warehouse: SimpleProductUpdate_productVariantUpdate_productVariant_stocks_warehouse; } +export interface SimpleProductUpdate_productVariantUpdate_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface SimpleProductUpdate_productVariantUpdate_productVariant { __typename: "ProductVariant"; id: string; @@ -324,6 +344,7 @@ export interface SimpleProductUpdate_productVariantUpdate_productVariant { sku: string; stocks: (SimpleProductUpdate_productVariantUpdate_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: SimpleProductUpdate_productVariantUpdate_productVariant_weight | null; } export interface SimpleProductUpdate_productVariantUpdate { @@ -436,6 +457,12 @@ export interface SimpleProductUpdate_productVariantStocksCreate_productVariant_s warehouse: SimpleProductUpdate_productVariantStocksCreate_productVariant_stocks_warehouse; } +export interface SimpleProductUpdate_productVariantStocksCreate_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface SimpleProductUpdate_productVariantStocksCreate_productVariant { __typename: "ProductVariant"; id: string; @@ -448,6 +475,7 @@ export interface SimpleProductUpdate_productVariantStocksCreate_productVariant { sku: string; stocks: (SimpleProductUpdate_productVariantStocksCreate_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: SimpleProductUpdate_productVariantStocksCreate_productVariant_weight | null; } export interface SimpleProductUpdate_productVariantStocksCreate { @@ -559,6 +587,12 @@ export interface SimpleProductUpdate_productVariantStocksDelete_productVariant_s warehouse: SimpleProductUpdate_productVariantStocksDelete_productVariant_stocks_warehouse; } +export interface SimpleProductUpdate_productVariantStocksDelete_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface SimpleProductUpdate_productVariantStocksDelete_productVariant { __typename: "ProductVariant"; id: string; @@ -571,6 +605,7 @@ export interface SimpleProductUpdate_productVariantStocksDelete_productVariant { sku: string; stocks: (SimpleProductUpdate_productVariantStocksDelete_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: SimpleProductUpdate_productVariantStocksDelete_productVariant_weight | null; } export interface SimpleProductUpdate_productVariantStocksDelete { @@ -683,6 +718,12 @@ export interface SimpleProductUpdate_productVariantStocksUpdate_productVariant_s warehouse: SimpleProductUpdate_productVariantStocksUpdate_productVariant_stocks_warehouse; } +export interface SimpleProductUpdate_productVariantStocksUpdate_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface SimpleProductUpdate_productVariantStocksUpdate_productVariant { __typename: "ProductVariant"; id: string; @@ -695,6 +736,7 @@ export interface SimpleProductUpdate_productVariantStocksUpdate_productVariant { sku: string; stocks: (SimpleProductUpdate_productVariantStocksUpdate_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: SimpleProductUpdate_productVariantStocksUpdate_productVariant_weight | null; } export interface SimpleProductUpdate_productVariantStocksUpdate { @@ -728,4 +770,5 @@ export interface SimpleProductUpdateVariables { addStocks: StockInput[]; deleteStocks: string[]; updateStocks: StockInput[]; + weight?: any | null; } diff --git a/src/products/types/VariantCreate.ts b/src/products/types/VariantCreate.ts index 6d8e19e5c..004894e9b 100644 --- a/src/products/types/VariantCreate.ts +++ b/src/products/types/VariantCreate.ts @@ -111,6 +111,12 @@ export interface VariantCreate_productVariantCreate_productVariant_stocks { warehouse: VariantCreate_productVariantCreate_productVariant_stocks_warehouse; } +export interface VariantCreate_productVariantCreate_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface VariantCreate_productVariantCreate_productVariant { __typename: "ProductVariant"; id: string; @@ -123,6 +129,7 @@ export interface VariantCreate_productVariantCreate_productVariant { sku: string; stocks: (VariantCreate_productVariantCreate_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: VariantCreate_productVariantCreate_productVariant_weight | null; } export interface VariantCreate_productVariantCreate { diff --git a/src/products/types/VariantImageAssign.ts b/src/products/types/VariantImageAssign.ts index fad6f55d6..ac72c1c4f 100644 --- a/src/products/types/VariantImageAssign.ts +++ b/src/products/types/VariantImageAssign.ts @@ -111,6 +111,12 @@ export interface VariantImageAssign_variantImageAssign_productVariant_stocks { warehouse: VariantImageAssign_variantImageAssign_productVariant_stocks_warehouse; } +export interface VariantImageAssign_variantImageAssign_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface VariantImageAssign_variantImageAssign_productVariant { __typename: "ProductVariant"; id: string; @@ -123,6 +129,7 @@ export interface VariantImageAssign_variantImageAssign_productVariant { sku: string; stocks: (VariantImageAssign_variantImageAssign_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: VariantImageAssign_variantImageAssign_productVariant_weight | null; } export interface VariantImageAssign_variantImageAssign { diff --git a/src/products/types/VariantImageUnassign.ts b/src/products/types/VariantImageUnassign.ts index 51b14b8c0..8d7d870ac 100644 --- a/src/products/types/VariantImageUnassign.ts +++ b/src/products/types/VariantImageUnassign.ts @@ -111,6 +111,12 @@ export interface VariantImageUnassign_variantImageUnassign_productVariant_stocks warehouse: VariantImageUnassign_variantImageUnassign_productVariant_stocks_warehouse; } +export interface VariantImageUnassign_variantImageUnassign_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface VariantImageUnassign_variantImageUnassign_productVariant { __typename: "ProductVariant"; id: string; @@ -123,6 +129,7 @@ export interface VariantImageUnassign_variantImageUnassign_productVariant { sku: string; stocks: (VariantImageUnassign_variantImageUnassign_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: VariantImageUnassign_variantImageUnassign_productVariant_weight | null; } export interface VariantImageUnassign_variantImageUnassign { diff --git a/src/products/types/VariantUpdate.ts b/src/products/types/VariantUpdate.ts index 4ed244606..b898c17dc 100644 --- a/src/products/types/VariantUpdate.ts +++ b/src/products/types/VariantUpdate.ts @@ -111,6 +111,12 @@ export interface VariantUpdate_productVariantUpdate_productVariant_stocks { warehouse: VariantUpdate_productVariantUpdate_productVariant_stocks_warehouse; } +export interface VariantUpdate_productVariantUpdate_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface VariantUpdate_productVariantUpdate_productVariant { __typename: "ProductVariant"; id: string; @@ -123,6 +129,7 @@ export interface VariantUpdate_productVariantUpdate_productVariant { sku: string; stocks: (VariantUpdate_productVariantUpdate_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: VariantUpdate_productVariantUpdate_productVariant_weight | null; } export interface VariantUpdate_productVariantUpdate { @@ -235,6 +242,12 @@ export interface VariantUpdate_productVariantStocksUpdate_productVariant_stocks warehouse: VariantUpdate_productVariantStocksUpdate_productVariant_stocks_warehouse; } +export interface VariantUpdate_productVariantStocksUpdate_productVariant_weight { + __typename: "Weight"; + unit: string; + value: number; +} + export interface VariantUpdate_productVariantStocksUpdate_productVariant { __typename: "ProductVariant"; id: string; @@ -247,6 +260,7 @@ export interface VariantUpdate_productVariantStocksUpdate_productVariant { sku: string; stocks: (VariantUpdate_productVariantStocksUpdate_productVariant_stocks | null)[] | null; trackInventory: boolean; + weight: VariantUpdate_productVariantStocksUpdate_productVariant_weight | null; } export interface VariantUpdate_productVariantStocksUpdate { @@ -337,4 +351,5 @@ export interface VariantUpdateVariables { sku?: string | null; trackInventory: boolean; stocks: StockInput[]; + weight?: any | null; } diff --git a/src/products/utils/data.ts b/src/products/utils/data.ts index e348a6f84..d45704b44 100644 --- a/src/products/utils/data.ts +++ b/src/products/utils/data.ts @@ -181,6 +181,7 @@ export interface ProductUpdatePageFormData { seoTitle: string; sku: string; trackInventory: boolean; + weight: string; } export function getProductUpdatePageFormData( @@ -210,7 +211,8 @@ export function getProductUpdatePageFormData( : undefined, "" ), - trackInventory: !!product?.variants[0]?.trackInventory + trackInventory: !!product?.variants[0]?.trackInventory, + weight: product?.weight?.value.toString() || "" }; } diff --git a/src/products/views/ProductCreate.tsx b/src/products/views/ProductCreate.tsx index b9f329070..5dfc64225 100644 --- a/src/products/views/ProductCreate.tsx +++ b/src/products/views/ProductCreate.tsx @@ -10,7 +10,7 @@ import useCategorySearch from "@saleor/searches/useCategorySearch"; import useCollectionSearch from "@saleor/searches/useCollectionSearch"; import useProductTypeSearch from "@saleor/searches/useProductTypeSearch"; import { useWarehouseList } from "@saleor/warehouses/queries"; -import { decimal, maybe } from "../../misc"; +import { decimal, maybe, weight } from "../../misc"; import ProductCreatePage, { ProductCreatePageSubmitData } from "../components/ProductCreatePage"; @@ -95,7 +95,8 @@ export const ProductCreateView: React.FC = () => { quantity: parseInt(stock.value, 0), warehouse: stock.id })), - trackInventory: formData.trackInventory + trackInventory: formData.trackInventory, + weight: weight(formData.weight) } }); }; @@ -157,6 +158,7 @@ export const ProductCreateView: React.FC = () => { warehouses={ warehouses.data?.warehouses.edges.map(edge => edge.node) || [] } + weightUnit={shop?.defaultWeightUnit} /> ); diff --git a/src/products/views/ProductUpdate/ProductUpdate.tsx b/src/products/views/ProductUpdate/ProductUpdate.tsx index 91d28edd3..77423ea21 100644 --- a/src/products/views/ProductUpdate/ProductUpdate.tsx +++ b/src/products/views/ProductUpdate/ProductUpdate.tsx @@ -17,6 +17,7 @@ import useCollectionSearch from "@saleor/searches/useCollectionSearch"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import NotFoundPage from "@saleor/components/NotFoundPage"; import { useWarehouseList } from "@saleor/warehouses/queries"; +import useShop from "@saleor/hooks/useShop"; import { getMutationState, maybe } from "../../../misc"; import ProductUpdatePage from "../../components/ProductUpdatePage"; import ProductUpdateOperations from "../../containers/ProductUpdateOperations"; @@ -75,6 +76,7 @@ export const ProductUpdate: React.FC = ({ id, params }) => { first: 50 } }); + const shop = useShop(); const [openModal, closeModal] = createDialogActionHandlers< ProductUrlDialog, @@ -213,6 +215,7 @@ export const ProductUpdate: React.FC = ({ id, params }) => { = ({ productId, params }) => { + const shop = useShop(); const navigate = useNavigator(); const notify = useNotifier(); const intl = useIntl(); @@ -129,6 +131,7 @@ export const ProductVariant: React.FC = ({ <> = ({ stocks: data.updateStocks.map( mapFormsetStockToStockInput ), - trackInventory: data.trackInventory + trackInventory: data.trackInventory, + weight: weight(data.weight) }) } onVariantClick={variantId => { diff --git a/src/products/views/ProductVariantCreate.tsx b/src/products/views/ProductVariantCreate.tsx index fce437e40..b1545c2f2 100644 --- a/src/products/views/ProductVariantCreate.tsx +++ b/src/products/views/ProductVariantCreate.tsx @@ -8,7 +8,7 @@ import useShop from "@saleor/hooks/useShop"; import NotFoundPage from "@saleor/components/NotFoundPage"; import { commonMessages } from "@saleor/intl"; import { useWarehouseList } from "@saleor/warehouses/queries"; -import { decimal } from "../../misc"; +import { decimal, weight } from "../../misc"; import ProductVariantCreatePage, { ProductVariantCreatePageSubmitData } from "../components/ProductVariantCreatePage"; @@ -82,7 +82,8 @@ export const ProductVariant: React.FC = ({ quantity: parseInt(stock.value, 0), warehouse: stock.id })), - trackInventory: true + trackInventory: true, + weight: weight(formData.weight) } } }); @@ -120,6 +121,7 @@ export const ProductVariant: React.FC = ({ edge => edge.node ) || [] } + weightUnit={shop?.defaultWeightUnit} /> ); diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index ae0c2bc8f..b2c87ea14 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -9159,6 +9159,76 @@ exports[`Storyshots Orders / OrderHistory default 1`] = ` +
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -66733,6 +66803,76 @@ exports[`Storyshots Views / Orders / Order details cancelled 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -67729,6 +67869,76 @@ exports[`Storyshots Views / Orders / Order details default 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -68755,6 +68965,76 @@ exports[`Storyshots Views / Orders / Order details fulfilled 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -70351,6 +70631,76 @@ exports[`Storyshots Views / Orders / Order details no customer note 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -71377,6 +71727,76 @@ exports[`Storyshots Views / Orders / Order details no payment 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -72403,6 +72823,76 @@ exports[`Storyshots Views / Orders / Order details no shipping address 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -73429,6 +73919,76 @@ exports[`Storyshots Views / Orders / Order details partially fulfilled 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -74455,6 +75015,76 @@ exports[`Storyshots Views / Orders / Order details payment confirmed 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -75481,6 +76111,76 @@ exports[`Storyshots Views / Orders / Order details payment error 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -76507,6 +77207,76 @@ exports[`Storyshots Views / Orders / Order details pending payment 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -77533,6 +78303,76 @@ exports[`Storyshots Views / Orders / Order details refunded payment 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -78559,6 +79399,76 @@ exports[`Storyshots Views / Orders / Order details rejected payment 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -79585,6 +80495,76 @@ exports[`Storyshots Views / Orders / Order details unfulfilled 1`] = `
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ This is note +
+
+
+
@@ -108138,6 +109118,84 @@ exports[`Storyshots Views / Products / Create product variant add first variant
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -108732,6 +109790,84 @@ exports[`Storyshots Views / Products / Create product variant default 1`] = `
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -109250,6 +110386,85 @@ exports[`Storyshots Views / Products / Create product variant when loading data
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -109860,6 +111075,84 @@ exports[`Storyshots Views / Products / Create product variant with errors 1`] =
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -114600,6 +115893,84 @@ Ctrl + K"
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -116397,6 +117768,84 @@ Ctrl + K"
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -119545,6 +120994,85 @@ Ctrl + K"
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -123034,6 +124562,84 @@ Ctrl + K"
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -129479,6 +131085,84 @@ exports[`Storyshots Views / Products / Product variant details attribute errors
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -130371,6 +132055,84 @@ exports[`Storyshots Views / Products / Product variant details when loaded data
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -131029,6 +132791,85 @@ exports[`Storyshots Views / Products / Product variant details when loading data
+
+
+ + Shipping + +
+
+
+
+
+
+
+ +
+ +
+
+ kg +
+
+ +
+
+
+
+
+
@@ -151786,8 +153627,8 @@ exports[`Storyshots Views / Warehouses / Warehouse details default 1`] = ` class="MuiFormControl-root-id MuiTextField-root-id MuiFormControl-fullWidth-id" > @@ -151802,7 +153643,7 @@ exports[`Storyshots Views / Warehouses / Warehouse details default 1`] = ` autocomplete="off" class="MuiInputBase-input-id MuiOutlinedInput-input-id MuiInputBase-inputAdornedEnd-id MuiOutlinedInput-inputAdornedEnd-id" type="text" - value="" + value="Szwecja" />
​ @@ -152345,8 +154186,8 @@ exports[`Storyshots Views / Warehouses / Warehouse details form errors 1`] = ` class="MuiFormControl-root-id MuiTextField-root-id MuiFormControl-fullWidth-id" > @@ -152361,7 +154202,7 @@ exports[`Storyshots Views / Warehouses / Warehouse details form errors 1`] = ` autocomplete="off" class="MuiInputBase-input-id MuiOutlinedInput-input-id MuiInputBase-inputAdornedEnd-id MuiOutlinedInput-inputAdornedEnd-id" type="text" - value="" + value="Szwecja" />
​ @@ -152396,7 +154237,7 @@ exports[`Storyshots Views / Warehouses / Warehouse details form errors 1`] = `

Invalid value

diff --git a/src/storybook/stories/products/ProductCreatePage.tsx b/src/storybook/stories/products/ProductCreatePage.tsx index 145b5759b..06f1b8e36 100644 --- a/src/storybook/stories/products/ProductCreatePage.tsx +++ b/src/storybook/stories/products/ProductCreatePage.tsx @@ -34,6 +34,7 @@ storiesOf("Views / Products / Create product", module) onSubmit={() => undefined} saveButtonBarState="default" warehouses={warehouseList} + weightUnit="kg" /> )) .add("When loading", () => ( @@ -55,6 +56,7 @@ storiesOf("Views / Products / Create product", module) onSubmit={() => undefined} saveButtonBarState="default" warehouses={undefined} + weightUnit="kg" /> )) .add("form errors", () => ( @@ -82,5 +84,6 @@ storiesOf("Views / Products / Create product", module) onSubmit={() => undefined} saveButtonBarState="default" warehouses={warehouseList} + weightUnit="kg" /> )); diff --git a/src/storybook/stories/products/ProductUpdatePage.tsx b/src/storybook/stories/products/ProductUpdatePage.tsx index 9bc5478f7..2efef0dbc 100644 --- a/src/storybook/stories/products/ProductUpdatePage.tsx +++ b/src/storybook/stories/products/ProductUpdatePage.tsx @@ -19,6 +19,7 @@ const props: ProductUpdatePageProps = { ...listActionsProps, categories: [product.category], collections, + defaultWeightUnit: "kg", disabled: false, errors: [], fetchCategories: () => undefined, diff --git a/src/storybook/stories/products/ProductVariantCreatePage.tsx b/src/storybook/stories/products/ProductVariantCreatePage.tsx index d5ef0ac0b..f15d829ff 100644 --- a/src/storybook/stories/products/ProductVariantCreatePage.tsx +++ b/src/storybook/stories/products/ProductVariantCreatePage.tsx @@ -15,6 +15,7 @@ storiesOf("Views / Products / Create product variant", module) .add("default", () => ( ( ( ( ( ( ( undefined} diff --git a/src/utils/errors/product.ts b/src/utils/errors/product.ts index 0886770ec..01baeec1c 100644 --- a/src/utils/errors/product.ts +++ b/src/utils/errors/product.ts @@ -14,15 +14,26 @@ const messages = defineMessages({ attributeCannotBeAssigned: { defaultMessage: "This attribute cannot be assigned to this product type" }, + attributeRequired: { + defaultMessage: "All attributes should have value", + description: "product attribute error" + }, attributeVariantsDisabled: { defaultMessage: "Variants are disabled in this product type" }, + duplicatedInputItem: { + defaultMessage: "Variant with these attributes already exists" + }, skuUnique: { defaultMessage: "SKUs must be unique", description: "bulk variant create error" }, variantNoDigitalContent: { defaultMessage: "This variant does not have any digital content" + }, + variantUnique: { + defaultMessage: "This variant already exists", + description: "product attribute error" } }); @@ -38,6 +49,8 @@ function getProductErrorMessage( return intl.formatMessage(messages.attributeCannotBeAssigned); case ProductErrorCode.ATTRIBUTE_VARIANTS_DISABLED: return intl.formatMessage(messages.attributeVariantsDisabled); + case ProductErrorCode.DUPLICATED_INPUT_ITEM: + return intl.formatMessage(messages.duplicatedInputItem); case ProductErrorCode.GRAPHQL_ERROR: return intl.formatMessage(commonErrorMessages.graphqlError); case ProductErrorCode.REQUIRED: @@ -54,6 +67,24 @@ function getProductErrorMessage( return undefined; } +export function getProductVariantAttributeErrorMessage( + err: Omit | undefined, + intl: IntlShape +): string { + if (err) { + switch (err.code) { + case ProductErrorCode.REQUIRED: + return intl.formatMessage(messages.attributeRequired); + case ProductErrorCode.UNIQUE: + return intl.formatMessage(messages.variantUnique); + default: + return getProductErrorMessage(err, intl); + } + } + + return undefined; +} + export function getBulkProductErrorMessage( err: BulkProductErrorFragment | undefined, intl: IntlShape diff --git a/src/warehouses/components/WarehouseDetailsPage/WarehouseDetailsPage.tsx b/src/warehouses/components/WarehouseDetailsPage/WarehouseDetailsPage.tsx index c4c53c811..3877072ce 100644 --- a/src/warehouses/components/WarehouseDetailsPage/WarehouseDetailsPage.tsx +++ b/src/warehouses/components/WarehouseDetailsPage/WarehouseDetailsPage.tsx @@ -51,7 +51,9 @@ const WarehouseDetailsPage: React.FC = ({ onSubmit }) => { const intl = useIntl(); - const [displayCountry, setDisplayCountry] = useStateFromProps(""); + const [displayCountry, setDisplayCountry] = useStateFromProps( + warehouse?.address?.country.country || "" + ); const { errors: validationErrors,