From cacf3030a24f263d79af5d18a22b54f321e72686 Mon Sep 17 00:00:00 2001 From: Piotr Grundas Date: Thu, 29 Jul 2021 14:47:22 +0200 Subject: [PATCH] [SALEOR-3965] Extend Sale & Voucher to include Metadata #7653 (#1245) * Add base logic * Add missing metadata handlers * Update changelog * Cleanup schema * Add messages --- CHANGELOG.md | 1 + schema.graphql | 8 +- .../SaleCreatePage/SaleCreatePage.tsx | 14 +- .../SaleDetailsPage/SaleDetailsPage.tsx | 27 +- .../VoucherCreatePage/VoucherCreatePage.tsx | 14 +- .../VoucherDetailsPage/VoucherDetailsPage.tsx | 35 +- src/discounts/fixtures.ts | 18 + src/discounts/types/SaleCataloguesAdd.ts | 14 + src/discounts/types/SaleCataloguesRemove.ts | 14 + .../types/SaleChannelListingUpdate.ts | 14 + src/discounts/types/SaleCreate.ts | 14 + src/discounts/types/SaleDetails.ts | 14 + src/discounts/types/SaleList.ts | 14 + src/discounts/types/SaleUpdate.ts | 14 + src/discounts/types/VoucherCataloguesAdd.ts | 14 + .../types/VoucherCataloguesRemove.ts | 14 + .../types/VoucherChannelListingUpdate.ts | 14 + src/discounts/types/VoucherCreate.ts | 14 + src/discounts/types/VoucherDetails.ts | 14 + src/discounts/types/VoucherList.ts | 14 + src/discounts/types/VoucherUpdate.ts | 14 + src/discounts/views/SaleCreate/SaleCreate.tsx | 15 +- src/discounts/views/SaleCreate/handlers.ts | 2 + .../views/SaleDetails/SaleDetails.tsx | 16 +- src/discounts/views/SaleDetails/handlers.ts | 34 +- .../views/VoucherCreate/VoucherCreate.tsx | 15 +- src/discounts/views/VoucherCreate/handlers.ts | 1 + .../views/VoucherDetails/VoucherDetails.tsx | 16 +- .../views/VoucherDetails/handlers.ts | 69 +- src/fragments/discounts.ts | 5 + src/fragments/types/MetadataFragment.ts | 2 +- src/fragments/types/SaleDetailsFragment.ts | 14 + src/fragments/types/SaleFragment.ts | 14 + src/fragments/types/VoucherDetailsFragment.ts | 14 + src/fragments/types/VoucherFragment.ts | 14 + .../__snapshots__/Stories.test.ts.snap | 1455 +++++++++++++++++ src/utils/handlers/metadataCreateHandler.ts | 1 + src/utils/handlers/metadataUpdateHandler.ts | 1 + src/utils/metadata/types/UpdateMetadata.ts | 2 +- .../metadata/types/UpdatePrivateMetadata.ts | 2 +- 40 files changed, 1924 insertions(+), 81 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a98d3c40..d6387d43d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,7 @@ All notable, unreleased changes to this project will be documented in this file. - Fix list pagination crash on search - #1230 by @orzechdev - Fix positive float number input validation - #1233 by @orzechdev - Use MacawUI - #1229 by @dominik-zeglen +- Add Metadata for Sale & Voucher - #7653 by @piotrgrundas - Add variant create options dialog - #1238 by @orzechdev # 2.11.1 diff --git a/schema.graphql b/schema.graphql index 4cfb60155..1ef1347d2 100644 --- a/schema.graphql +++ b/schema.graphql @@ -4839,12 +4839,14 @@ type RequestPasswordReset { errors: [AccountError!]! } -type Sale implements Node { +type Sale implements Node & ObjectWithMetadata { id: ID! name: String! type: SaleType! startDate: DateTime! endDate: DateTime + privateMetadata: [MetadataItem]! + metadata: [MetadataItem]! categories(before: String, after: String, first: Int, last: Int): CategoryCountableConnection collections(before: String, after: String, first: Int, last: Int): CollectionCountableConnection products(before: String, after: String, first: Int, last: Int): ProductCountableConnection @@ -5757,7 +5759,7 @@ enum VolumeUnitsEnum { ACRE_FT } -type Voucher implements Node { +type Voucher implements Node & ObjectWithMetadata { id: ID! name: String type: VoucherTypeEnum! @@ -5771,6 +5773,8 @@ type Voucher implements Node { onlyForStaff: Boolean! discountValueType: DiscountValueTypeEnum! minCheckoutItemsQuantity: Int + privateMetadata: [MetadataItem]! + metadata: [MetadataItem]! categories(before: String, after: String, first: Int, last: Int): CategoryCountableConnection collections(before: String, after: String, first: Int, last: Int): CollectionCountableConnection products(before: String, after: String, first: Int, last: Int): ProductCountableConnection diff --git a/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx b/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx index 6a4292b25..2811bbfdf 100644 --- a/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx +++ b/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx @@ -5,6 +5,7 @@ import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; +import Metadata, { MetadataFormData } from "@saleor/components/Metadata"; import PageHeader from "@saleor/components/PageHeader"; import Savebar from "@saleor/components/Savebar"; import { createSaleChannelsChangeHandler } from "@saleor/discounts/handlers"; @@ -12,6 +13,7 @@ import { DiscountErrorFragment } from "@saleor/fragments/types/DiscountErrorFrag import { sectionNames } from "@saleor/intl"; import { Backlink } from "@saleor/macaw-ui"; import { validatePrice } from "@saleor/products/utils/validation"; +import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger"; import React from "react"; import { useIntl } from "react-intl"; @@ -24,7 +26,7 @@ import SaleInfo from "../SaleInfo"; import SaleType from "../SaleType"; import SaleValue from "../SaleValue"; -export interface FormData { +export interface FormData extends MetadataFormData { channelListings: ChannelSaleData[]; endDate: string; endTime: string; @@ -60,6 +62,9 @@ const SaleCreatePage: React.FC = ({ onBack }) => { const intl = useIntl(); + const { + makeChangeHandler: makeMetadataChangeHandler + } = useMetadataChangeTrigger(); const initialForm: FormData = { channelListings, @@ -70,7 +75,9 @@ const SaleCreatePage: React.FC = ({ startDate: "", startTime: "", type: SaleTypeEnum.FIXED, - value: "" + value: "", + metadata: [], + privateMetadata: [] }; return (
@@ -83,6 +90,8 @@ const SaleCreatePage: React.FC = ({ const formDisabled = data.channelListings?.some(channel => validatePrice(channel?.discountValue) ); + const changeMetadata = makeMetadataChangeHandler(change); + return ( @@ -132,6 +141,7 @@ const SaleCreatePage: React.FC = ({ openModal={openChannelsModal} /> + = ({ toggleAll }) => { const intl = useIntl(); + const { + makeChangeHandler: makeMetadataChangeHandler + } = useMetadataChangeTrigger(); const initialForm: SaleDetailsPageFormData = { channelListings, - endDate: splitDateTime(maybe(() => sale.endDate, "")).date, - endTime: splitDateTime(maybe(() => sale.endDate, "")).time, - hasEndDate: maybe(() => !!sale.endDate), - name: maybe(() => sale.name, ""), - startDate: splitDateTime(maybe(() => sale.startDate, "")).date, - startTime: splitDateTime(maybe(() => sale.startDate, "")).time, - type: maybe(() => sale.type, SaleTypeEnum.FIXED) + endDate: splitDateTime(sale?.endDate ?? "").date, + endTime: splitDateTime(sale?.endDate ?? "").time, + hasEndDate: !!sale?.endDate, + name: sale?.name ?? "", + startDate: splitDateTime(sale?.startDate ?? "").date, + startTime: splitDateTime(sale?.startDate ?? "").time, + type: sale?.type ?? SaleTypeEnum.FIXED, + metadata: sale?.metadata.map(mapMetadataItemToInput), + privateMetadata: sale?.privateMetadata.map(mapMetadataItemToInput) }; return ( @@ -149,6 +157,8 @@ const SaleDetailsPage: React.FC = ({ const formDisabled = data.channelListings?.some(channel => validatePrice(channel.discountValue) ); + const changeMetadata = makeMetadataChangeHandler(change); + return ( @@ -307,6 +317,7 @@ const SaleDetailsPage: React.FC = ({ openModal={openChannelsModal} /> + = ({ openChannelsModal }) => { const intl = useIntl(); + const { + makeChangeHandler: makeMetadataChangeHandler + } = useMetadataChangeTrigger(); const initialForm: FormData = { applyOncePerCustomer: false, @@ -91,7 +96,9 @@ const VoucherCreatePage: React.FC = ({ startTime: "", type: VoucherTypeEnum.ENTIRE_ORDER, usageLimit: "0", - value: 0 + value: 0, + metadata: [], + privateMetadata: [] }; return ( @@ -113,6 +120,8 @@ const VoucherCreatePage: React.FC = ({ (data.requirementsPicker === RequirementsPicker.ORDER && validatePrice(channel.minSpent)) ); + const changeMetadata = makeMetadataChangeHandler(change); + return ( @@ -189,6 +198,7 @@ const VoucherCreatePage: React.FC = ({ openModal={openChannelsModal} /> + = ({ productListToolbar }) => { const intl = useIntl(); + const { + makeChangeHandler: makeMetadataChangeHandler + } = useMetadataChangeTrigger(); const channel = voucher?.channelListings?.find( listing => listing.channel.id === selectedChannelId ); @@ -175,19 +181,19 @@ const VoucherDetailsPage: React.FC = ({ channelListings, code: voucher?.code || "", discountType, - endDate: splitDateTime(maybe(() => voucher.endDate, "")).date, - endTime: splitDateTime(maybe(() => voucher.endDate, "")).time, - hasEndDate: maybe(() => !!voucher.endDate), - hasUsageLimit: maybe(() => !!voucher.usageLimit), - minCheckoutItemsQuantity: maybe( - () => voucher.minCheckoutItemsQuantity.toString(), - "0" - ), + endDate: splitDateTime(voucher?.endDate ?? "").date, + endTime: splitDateTime(voucher?.endDate ?? "").time, + hasEndDate: !!voucher?.endDate, + hasUsageLimit: !!voucher?.usageLimit, + minCheckoutItemsQuantity: + voucher?.minCheckoutItemsQuantity?.toString() ?? "0", requirementsPicker: requirementsPickerInitValue, - startDate: splitDateTime(maybe(() => voucher.startDate, "")).date, - startTime: splitDateTime(maybe(() => voucher.startDate, "")).time, - type: maybe(() => voucher.type, VoucherTypeEnum.ENTIRE_ORDER), - usageLimit: maybe(() => voucher.usageLimit.toString(), "0") + startDate: splitDateTime(voucher?.startDate ?? "").date, + startTime: splitDateTime(voucher?.startDate ?? "").time, + type: voucher?.type ?? VoucherTypeEnum.ENTIRE_ORDER, + usageLimit: voucher?.usageLimit?.toString() ?? "0", + metadata: voucher?.metadata.map(mapMetadataItemToInput), + privateMetadata: voucher?.privateMetadata.map(mapMetadataItemToInput) }; return ( @@ -209,6 +215,8 @@ const VoucherDetailsPage: React.FC = ({ (data.requirementsPicker === RequirementsPicker.ORDER && validatePrice(channel.minSpent)) ); + const changeMetadata = makeMetadataChangeHandler(change); + return ( @@ -420,6 +428,7 @@ const VoucherDetailsPage: React.FC = ({ openModal={openChannelsModal} /> + = ({ params }) => { const pushMessage = useNotifier(); const intl = useIntl(); + const [updateMetadata] = useMetadataUpdate({}); + const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const [openModal, closeModal] = createDialogActionHandlers< ChannelsAction, SaleCreateUrlQueryParams @@ -92,10 +99,16 @@ export const SaleCreateView: React.FC = ({ params }) => { )} {(saleCreate, saleCreateOpts) => { - const handleSubmit = createHandler( + const handleCreate = createHandler( variables => saleCreate({ variables }), updateChannels ); + const handleSubmit = createMetadataCreateHandler( + handleCreate, + updateMetadata, + updatePrivateMetadata + ); + return ( <> diff --git a/src/discounts/views/SaleCreate/handlers.ts b/src/discounts/views/SaleCreate/handlers.ts index c173a2637..938f40122 100644 --- a/src/discounts/views/SaleCreate/handlers.ts +++ b/src/discounts/views/SaleCreate/handlers.ts @@ -39,6 +39,7 @@ export function createHandler( value: decimal(formData.value) } }); + if (!response.data.saleCreate.errors.length) { updateChannels({ variables: getSaleChannelsVariables( @@ -46,6 +47,7 @@ export function createHandler( formData ) }); + return response.data.saleCreate.sale.id; } }; } diff --git a/src/discounts/views/SaleDetails/SaleDetails.tsx b/src/discounts/views/SaleDetails/SaleDetails.tsx index 7ef9a6667..8ed0bdcb2 100644 --- a/src/discounts/views/SaleDetails/SaleDetails.tsx +++ b/src/discounts/views/SaleDetails/SaleDetails.tsx @@ -50,7 +50,12 @@ import useCategorySearch from "@saleor/searches/useCategorySearch"; import useCollectionSearch from "@saleor/searches/useCollectionSearch"; import useProductSearch from "@saleor/searches/useProductSearch"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; +import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler"; import { mapEdgesToItems } from "@saleor/utils/maps"; +import { + useMetadataUpdate, + usePrivateMetadataUpdate +} from "@saleor/utils/metadata/updateMetadata"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -62,6 +67,8 @@ interface SaleDetailsProps { } export const SaleDetails: React.FC = ({ id, params }) => { + const [updateMetadata] = useMetadataUpdate({}); + const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const navigate = useNavigator(); const paginate = usePaginator(); const notify = useNotifier(); @@ -253,12 +260,19 @@ export const SaleDetails: React.FC = ({ id, params }) => { pageInfo } = paginate(tabPageInfo, paginationState, params); - const handleSubmit = createUpdateHandler( + const handleUpdate = createUpdateHandler( data?.sale, saleChannelsChoices, variables => saleUpdate({ variables }), updateChannels ); + const handleSubmit = createMetadataUpdateHandler( + data?.sale, + handleUpdate, + variables => updateMetadata({ variables }), + variables => updatePrivateMetadata({ variables }) + ); + return ( <> Promise> ) { - return (formData: SaleDetailsPageFormData) => { + return async (formData: SaleDetailsPageFormData) => { const { id } = sale; - updateSale({ - id, - input: { - endDate: formData.hasEndDate - ? joinDateTime(formData.endDate, formData.endTime) - : null, - name: formData.name, - startDate: joinDateTime(formData.startDate, formData.startTime), - type: discountValueTypeEnum(formData.type) - } - }); + const errors = await Promise.all([ + updateSale({ + id, + input: { + endDate: formData.hasEndDate + ? joinDateTime(formData.endDate, formData.endTime) + : null, + name: formData.name, + startDate: joinDateTime(formData.startDate, formData.startTime), + type: discountValueTypeEnum(formData.type) + } + }).then(({ data }) => data?.saleUpdate.errors ?? []), - updateChannels({ - variables: getSaleChannelsVariables(id, formData, saleChannelsChoices) - }); + updateChannels({ + variables: getSaleChannelsVariables(id, formData, saleChannelsChoices) + }).then(({ data }) => data?.saleChannelListingUpdate.errors ?? []) + ]); + + return errors.flat(); }; } diff --git a/src/discounts/views/VoucherCreate/VoucherCreate.tsx b/src/discounts/views/VoucherCreate/VoucherCreate.tsx index d5ff715fe..4143eb12b 100644 --- a/src/discounts/views/VoucherCreate/VoucherCreate.tsx +++ b/src/discounts/views/VoucherCreate/VoucherCreate.tsx @@ -11,6 +11,11 @@ import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import { sectionNames } from "@saleor/intl"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; +import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler"; +import { + useMetadataUpdate, + usePrivateMetadataUpdate +} from "@saleor/utils/metadata/updateMetadata"; import React from "react"; import { useIntl } from "react-intl"; @@ -37,6 +42,8 @@ export const VoucherCreateView: React.FC = ({ params }) => { const notify = useNotifier(); const intl = useIntl(); + const [updateMetadata] = useMetadataUpdate({}); + const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const [openModal, closeModal] = createDialogActionHandlers< ChannelsAction, VoucherCreateUrlQueryParams @@ -79,10 +86,16 @@ export const VoucherCreateView: React.FC = ({ params }) => { return ( {(voucherCreate, voucherCreateOpts) => { - const handleSubmit = createHandler( + const handleCreate = createHandler( variables => voucherCreate({ variables }), updateChannels ); + const handleSubmit = createMetadataCreateHandler( + handleCreate, + updateMetadata, + updatePrivateMetadata + ); + return ( <> {!!allChannels?.length && ( diff --git a/src/discounts/views/VoucherCreate/handlers.ts b/src/discounts/views/VoucherCreate/handlers.ts index 9e0573838..a2fdb138f 100644 --- a/src/discounts/views/VoucherCreate/handlers.ts +++ b/src/discounts/views/VoucherCreate/handlers.ts @@ -63,6 +63,7 @@ export function createHandler( formData.channelListings ) }); + return response.data.voucherCreate.voucher.id; } }; } diff --git a/src/discounts/views/VoucherDetails/VoucherDetails.tsx b/src/discounts/views/VoucherDetails/VoucherDetails.tsx index 5e31131c7..31f0f45e8 100644 --- a/src/discounts/views/VoucherDetails/VoucherDetails.tsx +++ b/src/discounts/views/VoucherDetails/VoucherDetails.tsx @@ -47,7 +47,12 @@ import useCategorySearch from "@saleor/searches/useCategorySearch"; import useCollectionSearch from "@saleor/searches/useCollectionSearch"; import useProductSearch from "@saleor/searches/useProductSearch"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; +import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler"; import { mapEdgesToItems } from "@saleor/utils/maps"; +import { + useMetadataUpdate, + usePrivateMetadataUpdate +} from "@saleor/utils/metadata/updateMetadata"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -95,6 +100,8 @@ export const VoucherDetails: React.FC = ({ } = useProductSearch({ variables: DEFAULT_INITIAL_SEARCH_DATA }); + const [updateMetadata] = useMetadataUpdate({}); + const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const paginationState = createPaginationState(PAGINATE_BY, params); const changeTab = (tab: VoucherDetailsPageTab) => { @@ -218,13 +225,20 @@ export const VoucherDetails: React.FC = ({ {(voucherUpdate, voucherUpdateOpts) => ( {(voucherDelete, voucherDeleteOpts) => { - const handleSubmit = createUpdateHandler( + const handleUpdate = createUpdateHandler( data?.voucher, voucherChannelsChoices, variables => voucherUpdate({ variables }), updateChannels ); + const handleSubmit = createMetadataUpdateHandler( + data?.voucher, + handleUpdate, + variables => updateMetadata({ variables }), + variables => updatePrivateMetadata({ variables }) + ); + const tabPageInfo = params.activeTab === VoucherDetailsPageTab.categories ? maybe(() => data.voucher.categories.pageInfo) diff --git a/src/discounts/views/VoucherDetails/handlers.ts b/src/discounts/views/VoucherDetails/handlers.ts index 9244cafda..1f808a618 100644 --- a/src/discounts/views/VoucherDetails/handlers.ts +++ b/src/discounts/views/VoucherDetails/handlers.ts @@ -30,38 +30,43 @@ export function createUpdateHandler( ) { return async (formData: VoucherDetailsPageFormData) => { const { id } = voucher; - await updateVoucher({ - id, - input: { - applyOncePerCustomer: formData.applyOncePerCustomer, - applyOncePerOrder: formData.applyOncePerOrder, - onlyForStaff: formData.onlyForStaff, - discountValueType: - formData.discountType === DiscountTypeEnum.VALUE_PERCENTAGE - ? DiscountValueTypeEnum.PERCENTAGE - : formData.discountType === DiscountTypeEnum.VALUE_FIXED - ? DiscountValueTypeEnum.FIXED - : DiscountValueTypeEnum.PERCENTAGE, - endDate: formData.hasEndDate - ? joinDateTime(formData.endDate, formData.endTime) - : null, - minCheckoutItemsQuantity: - formData.requirementsPicker !== RequirementsPicker.ITEM - ? 0 - : parseFloat(formData.minCheckoutItemsQuantity), - startDate: joinDateTime(formData.startDate, formData.startTime), - type: - formData.discountType === DiscountTypeEnum.SHIPPING - ? VoucherTypeEnum.SHIPPING - : formData.type, - usageLimit: formData.hasUsageLimit - ? parseInt(formData.usageLimit, 10) - : null - } - }); - updateChannels({ - variables: getChannelsVariables(id, formData, voucherChannelsChoices) - }); + const errors = await Promise.all([ + updateVoucher({ + id, + input: { + applyOncePerCustomer: formData.applyOncePerCustomer, + applyOncePerOrder: formData.applyOncePerOrder, + onlyForStaff: formData.onlyForStaff, + discountValueType: + formData.discountType === DiscountTypeEnum.VALUE_PERCENTAGE + ? DiscountValueTypeEnum.PERCENTAGE + : formData.discountType === DiscountTypeEnum.VALUE_FIXED + ? DiscountValueTypeEnum.FIXED + : DiscountValueTypeEnum.PERCENTAGE, + endDate: formData.hasEndDate + ? joinDateTime(formData.endDate, formData.endTime) + : null, + minCheckoutItemsQuantity: + formData.requirementsPicker !== RequirementsPicker.ITEM + ? 0 + : parseFloat(formData.minCheckoutItemsQuantity), + startDate: joinDateTime(formData.startDate, formData.startTime), + type: + formData.discountType === DiscountTypeEnum.SHIPPING + ? VoucherTypeEnum.SHIPPING + : formData.type, + usageLimit: formData.hasUsageLimit + ? parseInt(formData.usageLimit, 10) + : null + } + }).then(({ data }) => data?.voucherUpdate.errors ?? []), + + updateChannels({ + variables: getChannelsVariables(id, formData, voucherChannelsChoices) + }).then(({ data }) => data?.voucherChannelListingUpdate.errors ?? []) + ]); + + return errors.flat(); }; } diff --git a/src/fragments/discounts.ts b/src/fragments/discounts.ts index 491954fd4..48972d1fd 100644 --- a/src/fragments/discounts.ts +++ b/src/fragments/discounts.ts @@ -1,10 +1,13 @@ +import { metadataFragment } from "@saleor/fragments/metadata"; import { channelListingProductWithoutPricingFragment } from "@saleor/fragments/products"; import gql from "graphql-tag"; import { pageInfoFragment } from "./pageInfo"; export const saleFragment = gql` + ${metadataFragment} fragment SaleFragment on Sale { + ...MetadataFragment id name type @@ -85,7 +88,9 @@ export const saleDetailsFragment = gql` `; export const voucherFragment = gql` + ${metadataFragment} fragment VoucherFragment on Voucher { + ...MetadataFragment id code startDate diff --git a/src/fragments/types/MetadataFragment.ts b/src/fragments/types/MetadataFragment.ts index dea14e3f6..f36f74cca 100644 --- a/src/fragments/types/MetadataFragment.ts +++ b/src/fragments/types/MetadataFragment.ts @@ -20,7 +20,7 @@ export interface MetadataFragment_privateMetadata { } export interface MetadataFragment { - __typename: "App" | "Warehouse" | "ShippingZone" | "ShippingMethod" | "Product" | "ProductType" | "Attribute" | "Category" | "ProductVariant" | "DigitalContent" | "Collection" | "Page" | "PageType" | "MenuItem" | "Menu" | "User" | "Checkout" | "Order" | "Fulfillment" | "Invoice"; + __typename: "App" | "Warehouse" | "ShippingZone" | "ShippingMethod" | "Product" | "ProductType" | "Attribute" | "Category" | "ProductVariant" | "DigitalContent" | "Collection" | "Page" | "PageType" | "Sale" | "Voucher" | "MenuItem" | "Menu" | "User" | "Checkout" | "Order" | "Fulfillment" | "Invoice"; metadata: (MetadataFragment_metadata | null)[]; privateMetadata: (MetadataFragment_privateMetadata | null)[]; } diff --git a/src/fragments/types/SaleDetailsFragment.ts b/src/fragments/types/SaleDetailsFragment.ts index e3196e615..7dc3d36f3 100644 --- a/src/fragments/types/SaleDetailsFragment.ts +++ b/src/fragments/types/SaleDetailsFragment.ts @@ -9,6 +9,18 @@ import { SaleType } from "./../../types/globalTypes"; // GraphQL fragment: SaleDetailsFragment // ==================================================== +export interface SaleDetailsFragment_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface SaleDetailsFragment_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + export interface SaleDetailsFragment_channelListings_channel { __typename: "Channel"; id: string; @@ -147,6 +159,8 @@ export interface SaleDetailsFragment_collections { export interface SaleDetailsFragment { __typename: "Sale"; + metadata: (SaleDetailsFragment_metadata | null)[]; + privateMetadata: (SaleDetailsFragment_privateMetadata | null)[]; id: string; name: string; type: SaleType; diff --git a/src/fragments/types/SaleFragment.ts b/src/fragments/types/SaleFragment.ts index 5056957c5..474ffb0be 100644 --- a/src/fragments/types/SaleFragment.ts +++ b/src/fragments/types/SaleFragment.ts @@ -9,6 +9,18 @@ import { SaleType } from "./../../types/globalTypes"; // GraphQL fragment: SaleFragment // ==================================================== +export interface SaleFragment_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface SaleFragment_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + export interface SaleFragment_channelListings_channel { __typename: "Channel"; id: string; @@ -26,6 +38,8 @@ export interface SaleFragment_channelListings { export interface SaleFragment { __typename: "Sale"; + metadata: (SaleFragment_metadata | null)[]; + privateMetadata: (SaleFragment_privateMetadata | null)[]; id: string; name: string; type: SaleType; diff --git a/src/fragments/types/VoucherDetailsFragment.ts b/src/fragments/types/VoucherDetailsFragment.ts index 3a09ccdf0..5442a40e1 100644 --- a/src/fragments/types/VoucherDetailsFragment.ts +++ b/src/fragments/types/VoucherDetailsFragment.ts @@ -9,6 +9,18 @@ import { VoucherTypeEnum, DiscountValueTypeEnum } from "./../../types/globalType // GraphQL fragment: VoucherDetailsFragment // ==================================================== +export interface VoucherDetailsFragment_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface VoucherDetailsFragment_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + export interface VoucherDetailsFragment_countries { __typename: "CountryDisplay"; code: string; @@ -160,6 +172,8 @@ export interface VoucherDetailsFragment_categories { export interface VoucherDetailsFragment { __typename: "Voucher"; + metadata: (VoucherDetailsFragment_metadata | null)[]; + privateMetadata: (VoucherDetailsFragment_privateMetadata | null)[]; id: string; code: string; startDate: any; diff --git a/src/fragments/types/VoucherFragment.ts b/src/fragments/types/VoucherFragment.ts index 4ef7334a2..52b680e5b 100644 --- a/src/fragments/types/VoucherFragment.ts +++ b/src/fragments/types/VoucherFragment.ts @@ -9,6 +9,18 @@ import { VoucherTypeEnum, DiscountValueTypeEnum } from "./../../types/globalType // GraphQL fragment: VoucherFragment // ==================================================== +export interface VoucherFragment_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface VoucherFragment_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + export interface VoucherFragment_countries { __typename: "CountryDisplay"; code: string; @@ -39,6 +51,8 @@ export interface VoucherFragment_channelListings { export interface VoucherFragment { __typename: "Voucher"; + metadata: (VoucherFragment_metadata | null)[]; + privateMetadata: (VoucherFragment_privateMetadata | null)[]; id: string; code: string; startDate: any; diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index ca6f9be32..8b5755f2c 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -82103,6 +82103,125 @@ exports[`Storyshots Views / Discounts / Sale create default 1`] = ` +
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -83068,6 +83187,125 @@ exports[`Storyshots Views / Discounts / Sale create form errors 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -84032,6 +84270,125 @@ exports[`Storyshots Views / Discounts / Sale create loading 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -85336,6 +85693,125 @@ exports[`Storyshots Views / Discounts / Sale details collections 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -86640,6 +87116,125 @@ exports[`Storyshots Views / Discounts / Sale details default 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -87959,6 +88554,125 @@ exports[`Storyshots Views / Discounts / Sale details form errors 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -89319,6 +90033,79 @@ exports[`Storyshots Views / Discounts / Sale details loading 1`] = `
+
+
+ + Metadata + +
+
+
+
+
+ + ‌ + +
+
+
+
+
+ + Private Metadata + +
+
+
+
+
+ + ‌ + +
+
@@ -91015,6 +91802,125 @@ exports[`Storyshots Views / Discounts / Sale details products 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -94511,6 +95417,125 @@ exports[`Storyshots Views / Discounts / Voucher create default 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -95962,6 +96987,125 @@ exports[`Storyshots Views / Discounts / Voucher create form errors 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -98171,6 +99315,125 @@ exports[`Storyshots Views / Discounts / Voucher details default 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -100405,6 +101668,125 @@ exports[`Storyshots Views / Discounts / Voucher details form errors 1`] = `
+
+
+ + Metadata + +
+
+
+
+ +
+
+
+ + Private Metadata + +
+
+
+
+
@@ -102219,6 +103601,79 @@ exports[`Storyshots Views / Discounts / Voucher details loading 1`] = `
+
+
+ + Metadata + +
+
+
+
+
+ + ‌ + +
+
+
+
+
+ + Private Metadata + +
+
+
+
+
+ + ‌ + +
+
diff --git a/src/utils/handlers/metadataCreateHandler.ts b/src/utils/handlers/metadataCreateHandler.ts index e24491b80..2c3587f4d 100644 --- a/src/utils/handlers/metadataCreateHandler.ts +++ b/src/utils/handlers/metadataCreateHandler.ts @@ -42,6 +42,7 @@ function createMetadataCreateHandler( return updateMetaErrors; } } + if (data.privateMetadata.length > 0) { const updatePrivateMetaResult = await setPrivateMetadata({ variables: { diff --git a/src/utils/handlers/metadataUpdateHandler.ts b/src/utils/handlers/metadataUpdateHandler.ts index aa436b391..b92144c78 100644 --- a/src/utils/handlers/metadataUpdateHandler.ts +++ b/src/utils/handlers/metadataUpdateHandler.ts @@ -60,6 +60,7 @@ function createMetadataUpdateHandler( return updateMetaErrors; } } + if (data.privateMetadata) { const privateMetaDiff = diff( initial.privateMetadata, diff --git a/src/utils/metadata/types/UpdateMetadata.ts b/src/utils/metadata/types/UpdateMetadata.ts index 807bf2b03..b6ec48547 100644 --- a/src/utils/metadata/types/UpdateMetadata.ts +++ b/src/utils/metadata/types/UpdateMetadata.ts @@ -39,7 +39,7 @@ export interface UpdateMetadata_deleteMetadata_item_privateMetadata { } export interface UpdateMetadata_deleteMetadata_item { - __typename: "App" | "Warehouse" | "ShippingZone" | "ShippingMethod" | "Product" | "ProductType" | "Attribute" | "Category" | "ProductVariant" | "DigitalContent" | "Collection" | "Page" | "PageType" | "MenuItem" | "Menu" | "User" | "Checkout" | "Order" | "Fulfillment" | "Invoice"; + __typename: "App" | "Warehouse" | "ShippingZone" | "ShippingMethod" | "Product" | "ProductType" | "Attribute" | "Category" | "ProductVariant" | "DigitalContent" | "Collection" | "Page" | "PageType" | "Sale" | "Voucher" | "MenuItem" | "Menu" | "User" | "Checkout" | "Order" | "Fulfillment" | "Invoice"; metadata: (UpdateMetadata_deleteMetadata_item_metadata | null)[]; privateMetadata: (UpdateMetadata_deleteMetadata_item_privateMetadata | null)[]; id: string; diff --git a/src/utils/metadata/types/UpdatePrivateMetadata.ts b/src/utils/metadata/types/UpdatePrivateMetadata.ts index 6b8ee3902..0a3ae8363 100644 --- a/src/utils/metadata/types/UpdatePrivateMetadata.ts +++ b/src/utils/metadata/types/UpdatePrivateMetadata.ts @@ -39,7 +39,7 @@ export interface UpdatePrivateMetadata_deletePrivateMetadata_item_privateMetadat } export interface UpdatePrivateMetadata_deletePrivateMetadata_item { - __typename: "App" | "Warehouse" | "ShippingZone" | "ShippingMethod" | "Product" | "ProductType" | "Attribute" | "Category" | "ProductVariant" | "DigitalContent" | "Collection" | "Page" | "PageType" | "MenuItem" | "Menu" | "User" | "Checkout" | "Order" | "Fulfillment" | "Invoice"; + __typename: "App" | "Warehouse" | "ShippingZone" | "ShippingMethod" | "Product" | "ProductType" | "Attribute" | "Category" | "ProductVariant" | "DigitalContent" | "Collection" | "Page" | "PageType" | "Sale" | "Voucher" | "MenuItem" | "Menu" | "User" | "Checkout" | "Order" | "Fulfillment" | "Invoice"; metadata: (UpdatePrivateMetadata_deletePrivateMetadata_item_metadata | null)[]; privateMetadata: (UpdatePrivateMetadata_deletePrivateMetadata_item_privateMetadata | null)[]; id: string;