diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index bc2717854..9f4452a08 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -3123,6 +3123,10 @@ "context": "voucher usage limit, header", "string": "Usage Limit" }, + "src_dot_discounts_dot_components_dot_VoucherLimits_dot_usesLeftCaption": { + "context": "usage limit uses left caption", + "string": "Uses left" + }, "src_dot_discounts_dot_components_dot_VoucherListPage_dot_1112241061": { "context": "tab name", "string": "All Vouchers" diff --git a/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx b/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx index 63a4f1a55..6d85cf627 100644 --- a/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx +++ b/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx @@ -45,7 +45,8 @@ export interface FormData extends MetadataFormData { startDate: string; startTime: string; type: VoucherTypeEnum; - usageLimit: string; + usageLimit: number; + used: number; value: number; } @@ -95,7 +96,8 @@ const VoucherCreatePage: React.FC = ({ startDate: "", startTime: "", type: VoucherTypeEnum.ENTIRE_ORDER, - usageLimit: "0", + usageLimit: 1, + used: 0, value: 0, metadata: [], privateMetadata: [] @@ -103,7 +105,7 @@ const VoucherCreatePage: React.FC = ({ return (
- {({ change, data, hasChanged, submit, triggerChange }) => { + {({ change, data, hasChanged, submit, triggerChange, set }) => { const handleDiscountTypeChange = createDiscountTypeChangeHandler( change ); @@ -173,9 +175,12 @@ const VoucherCreatePage: React.FC = ({ = ({ startDate: splitDateTime(voucher?.startDate ?? "").date, startTime: splitDateTime(voucher?.startDate ?? "").time, type: voucher?.type ?? VoucherTypeEnum.ENTIRE_ORDER, - usageLimit: voucher?.usageLimit?.toString() ?? "0", + usageLimit: voucher?.usageLimit ?? 1, + used: voucher?.used ?? 0, metadata: voucher?.metadata.map(mapMetadataItemToInput), privateMetadata: voucher?.privateMetadata.map(mapMetadataItemToInput) }; return ( - {({ change, data, hasChanged, submit, triggerChange }) => { + {({ change, data, hasChanged, submit, triggerChange, set }) => { const handleDiscountTypeChange = createDiscountTypeChangeHandler( change ); @@ -209,13 +211,14 @@ const VoucherDetailsPage: React.FC = ({ triggerChange ); const formDisabled = - data.discountType.toString() !== "SHIPPING" && - data.channelListings?.some( - channel => - validatePrice(channel.discountValue) || - (data.requirementsPicker === RequirementsPicker.ORDER && - validatePrice(channel.minSpent)) - ); + (data.discountType.toString() !== "SHIPPING" && + data.channelListings?.some( + channel => + validatePrice(channel.discountValue) || + (data.requirementsPicker === RequirementsPicker.ORDER && + validatePrice(channel.minSpent)) + )) || + data.usageLimit <= 0; const changeMetadata = makeMetadataChangeHandler(change); return ( @@ -399,9 +402,12 @@ const VoucherDetailsPage: React.FC = ({ ) => void; + setData: (data: Partial) => void; + isNewVoucher: boolean; } const VoucherLimits = ({ data, disabled, errors, - onChange + initialUsageLimit, + onChange, + setData, + isNewVoucher }: VoucherLimitsProps) => { const intl = useIntl(); + const classes = useStyles(); const formErrors = getFormErrors(["usageLimit"], errors); + const usesLeft = data.usageLimit - data.used; + return ( - + { + onChange(evt); + setData({ usageLimit: initialUsageLimit }); + }} /> - {data.hasUsageLimit && ( - - )} + {data.hasUsageLimit && + (isNewVoucher ? ( + + ) : ( + + +
+ + {intl.formatMessage(messages.usesLeftCaption)} + + {usesLeft >= 0 ? usesLeft : 0} +
+
+ ))} ({ + cardContent: { + display: "flex", + flexDirection: "column" + }, + usesLeftLabelWrapper: { + display: "flex", + flexDirection: "column", + flex: 1 + } + }), + { name: "VoucherLimits" } +); diff --git a/src/discounts/views/VoucherCreate/handlers.ts b/src/discounts/views/VoucherCreate/handlers.ts index a2fdb138f..cf4487d11 100644 --- a/src/discounts/views/VoucherCreate/handlers.ts +++ b/src/discounts/views/VoucherCreate/handlers.ts @@ -49,9 +49,7 @@ export function createHandler( formData.discountType === DiscountTypeEnum.SHIPPING ? VoucherTypeEnum.SHIPPING : formData.type, - usageLimit: formData.hasUsageLimit - ? parseInt(formData.usageLimit, 10) - : null + usageLimit: formData.hasUsageLimit ? formData.usageLimit : null } }); diff --git a/src/discounts/views/VoucherDetails/handlers.ts b/src/discounts/views/VoucherDetails/handlers.ts index 1f808a618..5a545bd9f 100644 --- a/src/discounts/views/VoucherDetails/handlers.ts +++ b/src/discounts/views/VoucherDetails/handlers.ts @@ -56,9 +56,7 @@ export function createUpdateHandler( formData.discountType === DiscountTypeEnum.SHIPPING ? VoucherTypeEnum.SHIPPING : formData.type, - usageLimit: formData.hasUsageLimit - ? parseInt(formData.usageLimit, 10) - : null + usageLimit: formData.hasUsageLimit ? formData.usageLimit : null } }).then(({ data }) => data?.voucherUpdate.errors ?? []), diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index 529fab307..597755a26 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -99037,7 +99037,7 @@ exports[`Storyshots Views / Discounts / Voucher create default 1`] = ` class="CardTitle-hr-id" />