From d58a626d0a4c793eb862b9eb10a3537e871dc07d Mon Sep 17 00:00:00 2001 From: Riqwan Thamir Date: Mon, 1 Jul 2024 17:23:45 +0200 Subject: [PATCH] fix: fix tabs + required fields (#7892) --- .../dashboard/src/i18n/translations/en.json | 8 ++++ .../create-campaign-form.tsx | 17 +++----- .../create-campaign-form-fields.tsx | 28 +++++++++---- .../rules-form-field/rules-form-field.tsx | 39 +++++++------------ .../create-promotion-form.tsx | 6 +-- .../core/types/src/promotion/mutations.ts | 2 +- .../src/api/admin/campaigns/validators.ts | 6 +-- .../modules/promotion/src/models/promotion.ts | 1 - 8 files changed, 57 insertions(+), 50 deletions(-) diff --git a/packages/admin-next/dashboard/src/i18n/translations/en.json b/packages/admin-next/dashboard/src/i18n/translations/en.json index 6c94142044..3588473099 100644 --- a/packages/admin-next/dashboard/src/i18n/translations/en.json +++ b/packages/admin-next/dashboard/src/i18n/translations/en.json @@ -1101,6 +1101,11 @@ "sections": { "details": "Promotion Details" }, + "tabs": { + "template": "Template", + "promotion": "Promotion", + "campaign": "Campaign" + }, "fields": { "method": "Method", "type": "Type", @@ -1128,6 +1133,9 @@ } } }, + "tooltips": { + "campaignType": "Select the currency code in the promotion tab to enable it." + }, "errors": { "requiredField": "Required field" }, diff --git a/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx b/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx index 0dbec8e81b..44cfa517f5 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/campaign-create/components/create-campaign-form/create-campaign-form.tsx @@ -18,16 +18,11 @@ export const CreateCampaignSchema = zod.object({ campaign_identifier: zod.string().min(1), starts_at: zod.date().optional(), ends_at: zod.date().optional(), - budget: zod - .object({ - limit: zod.number().min(0).optional().nullable(), - type: zod.enum(["spend", "usage"]), - currency_code: zod.string().optional().nullable(), - }) - .refine((data) => data.type !== "spend" || data.currency_code, { - path: ["currency_code"], - message: `required field`, - }), + budget: zod.object({ + limit: zod.number().min(0).nullish(), + type: zod.enum(["spend", "usage"]), + currency_code: zod.string().nullish(), + }), }) export const defaultCampaignValues = { @@ -35,7 +30,7 @@ export const defaultCampaignValues = { description: "", campaign_identifier: "", budget: { - type: "spend" as CampaignBudgetTypeValues, + type: "usage" as CampaignBudgetTypeValues, currency_code: null, limit: null, }, diff --git a/packages/admin-next/dashboard/src/routes/campaigns/common/components/create-campaign-form-fields/create-campaign-form-fields.tsx b/packages/admin-next/dashboard/src/routes/campaigns/common/components/create-campaign-form-fields/create-campaign-form-fields.tsx index bf6f483262..ceadd2b5a5 100644 --- a/packages/admin-next/dashboard/src/routes/campaigns/common/components/create-campaign-form-fields/create-campaign-form-fields.tsx +++ b/packages/admin-next/dashboard/src/routes/campaigns/common/components/create-campaign-form-fields/create-campaign-form-fields.tsx @@ -32,6 +32,11 @@ export const CreateCampaignFormFields = ({ form, fieldScope = "" }) => { name: `${fieldScope}budget.currency_code`, }) + const promotionCurrencyValue = useWatch({ + control: form.control, + name: `application_method.currency_code`, + }) + const watchPromotionCurrencyCode = useWatch({ control: form.control, name: "application_method.currency_code", @@ -192,7 +197,15 @@ export const CreateCampaignFormFields = ({ form, fieldScope = "" }) => { render={({ field }) => { return ( - {t("campaigns.budget.fields.type")} + + {t("campaigns.budget.fields.type")} + { {...field} onValueChange={field.onChange} > - - + + diff --git a/packages/admin-next/dashboard/src/routes/promotions/common/edit-rules/components/rules-form-field/rules-form-field.tsx b/packages/admin-next/dashboard/src/routes/promotions/common/edit-rules/components/rules-form-field/rules-form-field.tsx index ec17d0db61..4d34b82c5c 100644 --- a/packages/admin-next/dashboard/src/routes/promotions/common/edit-rules/components/rules-form-field/rules-form-field.tsx +++ b/packages/admin-next/dashboard/src/routes/promotions/common/edit-rules/components/rules-form-field/rules-form-field.tsx @@ -78,39 +78,30 @@ export const RulesFormField = ({ } if (ruleType === "rules" && !fields.length) { + form.resetField("rules") + replace(generateRuleAttributes(rules) as any) } - if (ruleType === "rules" && promotionType === "standard") { + if (ruleType === "buy-rules" && !fields.length) { form.resetField("application_method.buy_rules") - form.resetField("application_method.target_rules") - } - - if ( - ["buy-rules", "target-rules"].includes(ruleType) && - promotionType === "standard" - ) { - form.resetField(scope) - replace([]) - } - - if ( - ["buy-rules", "target-rules"].includes(ruleType) && - promotionType === "buyget" - ) { - form.resetField(scope) - const rulesToAppend = promotion?.id - ? rules - : [...rules, requiredProductRule] + const rulesToAppend = + promotion?.id || promotionType === "standard" + ? rules + : [...rules, requiredProductRule] replace(generateRuleAttributes(rulesToAppend) as any) - - return } - form.resetField(scope) + if (ruleType === "target-rules" && !fields.length) { + form.resetField("application_method.target_rules") + const rulesToAppend = + promotion?.id || promotionType === "standard" + ? rules + : [...rules, requiredProductRule] - replace(generateRuleAttributes(rules) as any) + replace(generateRuleAttributes(rulesToAppend) as any) + } }, [promotionType, isLoading]) return ( diff --git a/packages/admin-next/dashboard/src/routes/promotions/promotion-create/components/create-promotion-form/create-promotion-form.tsx b/packages/admin-next/dashboard/src/routes/promotions/promotion-create/components/create-promotion-form/create-promotion-form.tsx index 1b3958387f..18ba0e4824 100644 --- a/packages/admin-next/dashboard/src/routes/promotions/promotion-create/components/create-promotion-form/create-promotion-form.tsx +++ b/packages/admin-next/dashboard/src/routes/promotions/promotion-create/components/create-promotion-form/create-promotion-form.tsx @@ -322,18 +322,18 @@ export const CreatePromotionForm = () => { value={Tab.TYPE} status={detailsProgress} > - {t("fields.type")} + {t("promotions.tabs.template")} - {t("fields.details")} + {t("promotions.tabs.promotion")} - {t("promotions.fields.campaign")} + {t("promotions.tabs.campaign")} diff --git a/packages/core/types/src/promotion/mutations.ts b/packages/core/types/src/promotion/mutations.ts index e743fe9f0d..843cea7624 100644 --- a/packages/core/types/src/promotion/mutations.ts +++ b/packages/core/types/src/promotion/mutations.ts @@ -87,7 +87,7 @@ export interface CreateCampaignDTO { /** * The associated campaign budget. */ - budget?: CreateCampaignBudgetDTO + budget?: CreateCampaignBudgetDTO | null } /** diff --git a/packages/medusa/src/api/admin/campaigns/validators.ts b/packages/medusa/src/api/admin/campaigns/validators.ts index 965696ce6a..2c37971505 100644 --- a/packages/medusa/src/api/admin/campaigns/validators.ts +++ b/packages/medusa/src/api/admin/campaigns/validators.ts @@ -29,7 +29,7 @@ export const AdminGetCampaignsParams = createFindParams({ export const CreateCampaignBudget = z .object({ type: z.nativeEnum(CampaignBudgetType), - limit: z.number().optional(), + limit: z.number().nullish(), currency_code: z.string().nullish(), }) .strict() @@ -52,7 +52,7 @@ export const CreateCampaignBudget = z export const UpdateCampaignBudget = z .object({ - limit: z.number().optional(), + limit: z.number().nullish(), }) .strict() @@ -62,7 +62,7 @@ export const AdminCreateCampaign = z name: z.string(), campaign_identifier: z.string(), description: z.string().nullish(), - budget: CreateCampaignBudget.optional(), + budget: CreateCampaignBudget.nullish(), starts_at: z.coerce.date().nullish(), ends_at: z.coerce.date().nullish(), promotions: z.array(z.object({ id: z.string() })).optional(), diff --git a/packages/modules/promotion/src/models/promotion.ts b/packages/modules/promotion/src/models/promotion.ts index c35bc983d1..159278d914 100644 --- a/packages/modules/promotion/src/models/promotion.ts +++ b/packages/modules/promotion/src/models/promotion.ts @@ -51,7 +51,6 @@ export default class Promotion { fieldName: "campaign_id", nullable: true, mapToPk: true, - onDelete: "set null", }) campaign_id: string | null = null