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