@open-mercato/core 0.4.6-develop-e321a4e2a1 → 0.4.6-main-24e64eef39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +0 -22
- package/dist/modules/api_docs/frontend/docs/api/page.js +1 -1
- package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
- package/dist/modules/attachments/api/library/[id]/route.js +1 -0
- package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +1 -1
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/lib/partitionEnv.js +1 -1
- package/dist/modules/attachments/lib/partitionEnv.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +1 -1
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/commands/users.js +1 -1
- package/dist/modules/auth/commands/users.js.map +2 -2
- package/dist/modules/business_rules/components/utils/formHelpers.js +1 -1
- package/dist/modules/business_rules/components/utils/formHelpers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -1
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +1 -1
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/shared.js +1 -1
- package/dist/modules/catalog/commands/shared.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +1 -1
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/productForm.js +1 -1
- package/dist/modules/catalog/components/products/productForm.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js.map +1 -1
- package/dist/modules/currencies/services/providers/raiffeisen.js +1 -1
- package/dist/modules/currencies/services/providers/raiffeisen.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +3 -3
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +3 -3
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +3 -3
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/cli.js +2 -2
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/lib/detailHelpers.js +1 -1
- package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
- package/dist/modules/entities/cli.js +1 -1
- package/dist/modules/entities/cli.js.map +2 -2
- package/dist/modules/entities/lib/field-definitions.js +1 -1
- package/dist/modules/entities/lib/field-definitions.js.map +2 -2
- package/dist/modules/entities/lib/install-from-ce.js +1 -1
- package/dist/modules/entities/lib/install-from-ce.js.map +2 -2
- package/dist/modules/inbox_ops/lib/emailParser.js +1 -1
- package/dist/modules/inbox_ops/lib/emailParser.js.map +2 -2
- package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +0 -8
- package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
- package/dist/modules/perspectives/services/perspectiveService.js +1 -1
- package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +7 -7
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +1 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/commands/resources.js +1 -1
- package/dist/modules/resources/commands/resources.js.map +2 -2
- package/dist/modules/resources/lib/seeds.js +1 -1
- package/dist/modules/resources/lib/seeds.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js +1 -1
- package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js.map +2 -2
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js +1 -1
- package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +2 -2
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/channels/offerTableUtils.js +2 -3
- package/dist/modules/sales/components/channels/offerTableUtils.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +4 -4
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +1 -1
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/lib/shipments/snapshots.js.map +1 -1
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -8
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +2 -2
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -8
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +2 -2
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/lib/graph-utils.js +1 -1
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/package.json +2 -2
- package/src/modules/api_docs/frontend/docs/api/page.tsx +1 -1
- package/src/modules/attachments/api/library/[id]/route.ts +1 -0
- package/src/modules/attachments/components/AttachmentLibrary.tsx +1 -1
- package/src/modules/attachments/lib/partitionEnv.ts +1 -1
- package/src/modules/auth/backend/users/page.tsx +1 -1
- package/src/modules/auth/cli.ts +1 -1
- package/src/modules/auth/commands/users.ts +1 -1
- package/src/modules/business_rules/components/utils/formHelpers.ts +1 -1
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -1
- package/src/modules/catalog/commands/products.ts +1 -1
- package/src/modules/catalog/commands/shared.ts +1 -1
- package/src/modules/catalog/components/PriceKindSettings.tsx +1 -1
- package/src/modules/catalog/components/products/productForm.ts +1 -1
- package/src/modules/configs/lib/upgrade-actions.ts +1 -1
- package/src/modules/currencies/services/providers/raiffeisen.ts +1 -1
- package/src/modules/customers/backend/customers/companies/page.tsx +3 -3
- package/src/modules/customers/backend/customers/deals/page.tsx +3 -3
- package/src/modules/customers/backend/customers/people/page.tsx +3 -3
- package/src/modules/customers/cli.ts +2 -2
- package/src/modules/customers/lib/detailHelpers.ts +1 -1
- package/src/modules/entities/cli.ts +1 -1
- package/src/modules/entities/lib/field-definitions.ts +1 -1
- package/src/modules/entities/lib/install-from-ce.ts +1 -1
- package/src/modules/inbox_ops/lib/emailParser.ts +1 -1
- package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +0 -8
- package/src/modules/perspectives/services/perspectiveService.ts +1 -1
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -3
- package/src/modules/query_index/components/QueryIndexesTable.tsx +7 -7
- package/src/modules/query_index/lib/engine.ts +1 -1
- package/src/modules/resources/backend/resources/resource-types/page.tsx +3 -2
- package/src/modules/resources/backend/resources/resources/page.tsx +3 -3
- package/src/modules/resources/commands/resources.ts +1 -1
- package/src/modules/resources/lib/seeds.ts +1 -1
- package/src/modules/sales/api/dashboard/widgets/new-orders/route.ts +1 -1
- package/src/modules/sales/api/dashboard/widgets/new-quotes/route.ts +1 -1
- package/src/modules/sales/backend/sales/channels/page.tsx +3 -3
- package/src/modules/sales/commands/documents.ts +2 -2
- package/src/modules/sales/components/channels/offerTableUtils.tsx +2 -3
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +4 -4
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +1 -1
- package/src/modules/sales/lib/shipments/snapshots.ts +1 -1
- package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -8
- package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -8
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +3 -3
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +3 -3
- package/src/modules/staff/backend/staff/team-members/page.tsx +3 -3
- package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -3
- package/src/modules/staff/backend/staff/teams/page.tsx +3 -2
- package/src/modules/workflows/backend/instances/page.tsx +2 -2
- package/src/modules/workflows/backend/tasks/page.tsx +1 -1
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
- package/src/modules/workflows/lib/graph-utils.ts +1 -1
- package/dist/modules/integrations/acl.js +0 -8
- package/dist/modules/integrations/acl.js.map +0 -7
- package/dist/modules/integrations/data/enrichers.js +0 -72
- package/dist/modules/integrations/data/enrichers.js.map +0 -7
- package/dist/modules/integrations/data/entities.js +0 -63
- package/dist/modules/integrations/data/entities.js.map +0 -7
- package/dist/modules/integrations/index.js +0 -9
- package/dist/modules/integrations/index.js.map +0 -7
- package/dist/modules/integrations/setup.js +0 -13
- package/dist/modules/integrations/setup.js.map +0 -7
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -69
- package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +0 -7
- package/dist/modules/integrations/widgets/injection-table.js +0 -13
- package/dist/modules/integrations/widgets/injection-table.js.map +0 -7
- package/src/modules/integrations/acl.ts +0 -4
- package/src/modules/integrations/data/enrichers.ts +0 -98
- package/src/modules/integrations/data/entities.ts +0 -46
- package/src/modules/integrations/index.ts +0 -5
- package/src/modules/integrations/setup.ts +0 -11
- package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -94
- package/src/modules/integrations/widgets/injection-table.ts +0 -17
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/catalog/backend/catalog/products/create/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport dynamic from \"next/dynamic\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport type { ZodType } from \"zod\";\nimport { Page, PageBody } from \"@open-mercato/ui/backend/Page\";\nimport {\n CrudForm,\n type CrudFormGroup,\n type CrudFormGroupComponentProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { createCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { flash } from \"@open-mercato/ui/backend/FlashMessages\";\nimport { TagsInput } from \"@open-mercato/ui/backend/inputs/TagsInput\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport { Label } from \"@open-mercato/ui/primitives/label\";\nimport { cn } from \"@open-mercato/shared/lib/utils\";\nimport {\n Plus,\n Trash2,\n FileText,\n AlignLeft,\n ChevronLeft,\n ChevronRight,\n AlertCircle,\n Settings,\n} from \"lucide-react\";\nimport {\n apiCall,\n readApiResultOrThrow,\n} from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport {\n ProductMediaManager,\n type ProductMediaItem,\n} from \"@open-mercato/core/modules/catalog/components/products/ProductMediaManager\";\nimport { ProductCategorizeSection } from \"@open-mercato/core/modules/catalog/components/products/ProductCategorizeSection\";\nimport {\n PRODUCT_FORM_STEPS,\n type PriceKindSummary,\n type PriceKindApiPayload,\n type TaxRateSummary,\n type ProductOptionInput,\n type VariantPriceValue,\n type VariantDraft,\n type ProductFormValues,\n type ProductUnitConversionDraft,\n type ProductUnitPriceReferenceUnit,\n type ProductUnitRoundingMode,\n productFormSchema,\n createInitialProductFormValues,\n createVariantDraft,\n buildOptionValuesKey,\n haveSameOptionValues,\n normalizePriceKindSummary,\n formatTaxRateLabel,\n slugify,\n createLocalId,\n buildOptionSchemaDefinition,\n buildVariantCombinations,\n normalizeProductDimensions,\n normalizeProductWeight,\n sanitizeProductDimensions,\n sanitizeProductWeight,\n updateDimensionValue,\n updateWeightValue,\n} from \"@open-mercato/core/modules/catalog/components/products/productForm\";\nimport {\n buildAttachmentImageUrl,\n slugifyAttachmentFileName,\n} from \"@open-mercato/core/modules/attachments/lib/imageUrls\";\nimport { ProductUomSection } from \"@open-mercato/core/modules/catalog/components/products/ProductUomSection\";\nimport { canonicalizeUnitCode } from \"@open-mercato/core/modules/catalog/lib/unitCodes\";\nimport {\n UNIT_PRICE_REFERENCE_UNITS,\n toTrimmedOrNull,\n parseNumericInput,\n toPositiveNumberOrNull,\n toIntegerInRangeOrDefault,\n normalizeProductConversionInputs,\n type ProductUnitConversionInput,\n} from \"@open-mercato/core/modules/catalog/components/products/productFormUtils\";\n\nconst productFormTypedSchema =\n productFormSchema as unknown as ZodType<ProductFormValues>;\n\ntype VariantPriceRequest = {\n variantDraftId: string;\n priceKindId: string;\n currencyCode: string;\n amount: number;\n displayMode: PriceKindSummary[\"displayMode\"];\n taxRateId: string | null;\n taxRateValue: number | null;\n};\n\ntype UiMarkdownEditorProps = {\n value?: string;\n height?: number;\n onChange?: (value?: string) => void;\n previewOptions?: { remarkPlugins?: unknown[] };\n};\n\nconst MarkdownEditor = dynamic(() => import(\"@uiw/react-md-editor\"), {\n ssr: false,\n loading: () => (\n <div className=\"flex h-48 items-center justify-center text-sm text-muted-foreground\">\n Loading editor\u2026\n </div>\n ),\n}) as unknown as React.ComponentType<UiMarkdownEditorProps>;\n\ntype ProductFormStep = (typeof PRODUCT_FORM_STEPS)[number];\n\nconst TRUE_BOOLEAN_VALUES = new Set([\"true\", \"1\", \"yes\", \"y\", \"t\"]);\n\nconst matchField = (fieldId: string) => (value: string) =>\n value === fieldId ||\n value.startsWith(`${fieldId}.`) ||\n value.startsWith(`${fieldId}[`);\nconst matchPrefix = (prefix: string) => (value: string) =>\n value.startsWith(prefix);\n\nconst STEP_FIELD_MATCHERS: Record<\n ProductFormStep,\n ((value: string) => boolean)[]\n> = {\n general: [\n matchField(\"title\"),\n matchField(\"description\"),\n matchField(\"mediaItems\"),\n matchField(\"mediaDraftId\"),\n matchPrefix(\"defaultMedia\"),\n matchPrefix(\"dimensions\"),\n matchPrefix(\"weight\"),\n ],\n organize: [\n matchField(\"categoryIds\"),\n matchField(\"channelIds\"),\n matchField(\"tags\"),\n ],\n uom: [\n matchField(\"defaultUnit\"),\n matchField(\"defaultSalesUnit\"),\n matchField(\"defaultSalesUnitQuantity\"),\n matchField(\"uomRoundingScale\"),\n matchField(\"uomRoundingMode\"),\n matchField(\"unitPriceEnabled\"),\n matchField(\"unitPriceReferenceUnit\"),\n matchField(\"unitPriceBaseQuantity\"),\n matchPrefix(\"unitConversions\"),\n ],\n variants: [\n matchField(\"hasVariants\"),\n matchPrefix(\"options\"),\n matchPrefix(\"variants\"),\n ],\n};\n\nfunction resolveStepForField(fieldId: string): ProductFormStep | null {\n const normalized = fieldId?.trim();\n if (!normalized) return null;\n for (const step of PRODUCT_FORM_STEPS) {\n const matchers = STEP_FIELD_MATCHERS[step];\n if (matchers.some((matcher) => matcher(normalized))) return step;\n }\n return null;\n}\n\nfunction resolveBooleanFlag(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return false;\n if (TRUE_BOOLEAN_VALUES.has(normalized)) return true;\n if ([\"false\", \"0\", \"no\", \"n\", \"f\"].includes(normalized)) return false;\n }\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n\n\ninterface InboxProductDraft {\n actionId: string;\n proposalId: string;\n payload: Record<string, unknown>;\n}\n\nfunction readInboxProductDraft(): InboxProductDraft | null {\n try {\n const raw = sessionStorage.getItem(\"inbox_ops.productDraft\");\n if (!raw) return null;\n const parsed = JSON.parse(raw) as InboxProductDraft;\n if (!parsed.actionId || !parsed.proposalId || !parsed.payload) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport default function CreateCatalogProductPage() {\n const t = useT();\n const router = useRouter();\n const searchParams = useSearchParams();\n const fromInboxAction = searchParams.get(\"fromInboxAction\");\n\n const inboxDraft = React.useMemo<InboxProductDraft | null>(() => {\n if (!fromInboxAction) return null;\n return readInboxProductDraft();\n }, [fromInboxAction]);\n\n const initialValuesRef = React.useRef<ProductFormValues | null>(null);\n if (!initialValuesRef.current) {\n const initial = createInitialProductFormValues();\n if (inboxDraft?.payload) {\n const p = inboxDraft.payload;\n if (typeof p.title === \"string\" && p.title.trim()) initial.title = p.title.trim();\n if (typeof p.description === \"string\" && p.description.trim()) initial.description = p.description.trim();\n }\n initialValuesRef.current = initial;\n }\n const [priceKinds, setPriceKinds] = React.useState<PriceKindSummary[]>([]);\n const [taxRates, setTaxRates] = React.useState<TaxRateSummary[]>([]);\n React.useEffect(() => {\n const loadPriceKinds = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: PriceKindApiPayload[];\n }>(\"/api/catalog/price-kinds?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.priceKinds.errors.load\",\n \"Failed to load price kinds.\",\n ),\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setPriceKinds(\n items\n .map((item) => normalizePriceKindSummary(item))\n .filter((item): item is PriceKindSummary => item !== null),\n );\n } catch (err) {\n console.error(\"catalog.price-kinds.fetch failed\", err);\n setPriceKinds([]);\n }\n };\n loadPriceKinds().catch(() => {});\n }, [t]);\n\n React.useEffect(() => {\n const loadTaxRates = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.products.create.taxRates.error\",\n \"Failed to load tax rates.\",\n ),\n fallback: { items: [] },\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setTaxRates(\n items.map((item) => {\n const rawRate =\n typeof item.rate === \"number\"\n ? item.rate\n : Number(item.rate ?? Number.NaN);\n return {\n id: String(item.id),\n name:\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name\n : t(\n \"catalog.products.create.taxRates.unnamed\",\n \"Untitled tax rate\",\n ),\n code:\n typeof item.code === \"string\" && item.code.trim().length\n ? item.code\n : null,\n rate: Number.isFinite(rawRate) ? rawRate : null,\n isDefault: resolveBooleanFlag(\n typeof item.isDefault !== \"undefined\"\n ? item.isDefault\n : item.is_default,\n ),\n };\n }),\n );\n } catch (err) {\n console.error(\"sales.tax-rates.fetch failed\", err);\n setTaxRates([]);\n }\n };\n loadTaxRates().catch(() => {});\n }, [t]);\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => [\n {\n id: \"builder\",\n column: 1,\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductBuilder\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n priceKinds={priceKinds}\n taxRates={taxRates}\n />\n ),\n },\n {\n id: \"product-meta\",\n column: 2,\n title: t(\"catalog.products.create.meta.title\", \"Product meta\"),\n description: t(\n \"catalog.products.create.meta.description\",\n \"Manage subtitle and handle for storefronts.\",\n ),\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductMetaSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n taxRates={taxRates}\n />\n ),\n },\n ],\n [priceKinds, taxRates, t],\n );\n\n return (\n <Page>\n <PageBody>\n <CrudForm<ProductFormValues>\n title={t(\"catalog.products.create.title\", \"Create product\")}\n backHref=\"/backend/catalog/products\"\n fields={[]}\n groups={groups}\n injectionSpotId=\"crud-form:catalog.product\"\n initialValues={\n initialValuesRef.current ?? createInitialProductFormValues()\n }\n schema={productFormTypedSchema}\n submitLabel={t(\"catalog.products.create.submit\", \"Create\")}\n cancelHref=\"/backend/catalog/products\"\n onSubmit={async (formValues) => {\n const title = formValues.title?.trim();\n if (!title) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n {\n title: t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n },\n );\n }\n const handle = formValues.handle?.trim() || undefined;\n const description = formValues.description?.trim() || undefined;\n const defaultMediaId =\n typeof formValues.defaultMediaId === \"string\" &&\n formValues.defaultMediaId.trim().length\n ? formValues.defaultMediaId\n : null;\n const mediaItems = Array.isArray(formValues.mediaItems)\n ? formValues.mediaItems\n : [];\n const attachmentIds = mediaItems\n .map((item) => (typeof item.id === \"string\" ? item.id : null))\n .filter((value): value is string => !!value);\n const mediaDraftId =\n typeof formValues.mediaDraftId === \"string\"\n ? formValues.mediaDraftId\n : \"\";\n const defaultMediaEntry = defaultMediaId\n ? mediaItems.find((item) => item.id === defaultMediaId)\n : null;\n const defaultMediaUrl = defaultMediaEntry\n ? buildAttachmentImageUrl(defaultMediaEntry.id, {\n slug: slugifyAttachmentFileName(defaultMediaEntry.fileName),\n })\n : null;\n const optionSchemaDefinition = buildOptionSchemaDefinition(\n formValues.options,\n title,\n );\n const dimensions = sanitizeProductDimensions(\n formValues.dimensions ?? null,\n );\n const weight = sanitizeProductWeight(formValues.weight ?? null);\n const resolveTaxRateValue = (taxRateId?: string | null) => {\n if (!taxRateId) return null;\n const match = taxRates.find((rate) => rate.id === taxRateId);\n return typeof match?.rate === \"number\" ? match.rate : null;\n };\n const productLevelTaxRateId = formValues.taxRateId ?? null;\n const productTaxRate = resolveTaxRateValue(productLevelTaxRateId);\n const resolveVariantTax = (variant: VariantDraft) => {\n const resolvedVariantTaxRateId =\n variant.taxRateId ?? productLevelTaxRateId;\n const resolvedVariantTaxRate =\n resolveTaxRateValue(resolvedVariantTaxRateId) ??\n (resolvedVariantTaxRateId ? null : (productTaxRate ?? null));\n return { resolvedVariantTaxRateId, resolvedVariantTaxRate };\n };\n const defaultUnit = canonicalizeUnitCode(formValues.defaultUnit);\n const defaultSalesUnit = canonicalizeUnitCode(\n formValues.defaultSalesUnit,\n );\n const defaultSalesUnitQuantity =\n toPositiveNumberOrNull(formValues.defaultSalesUnitQuantity) ?? 1;\n const uomRoundingScale = toIntegerInRangeOrDefault(\n formValues.uomRoundingScale,\n 0,\n 6,\n 4,\n );\n const uomRoundingMode: ProductUnitRoundingMode =\n formValues.uomRoundingMode === \"down\" ||\n formValues.uomRoundingMode === \"up\"\n ? formValues.uomRoundingMode\n : \"half_up\";\n const unitPriceEnabled = Boolean(formValues.unitPriceEnabled);\n const unitPriceReferenceUnit = canonicalizeUnitCode(\n formValues.unitPriceReferenceUnit,\n );\n const unitPriceBaseQuantity = toPositiveNumberOrNull(\n formValues.unitPriceBaseQuantity,\n );\n if (defaultSalesUnit && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequired\",\n \"Base unit is required when default sales unit is set.\",\n );\n throw createCrudFormError(message, { defaultSalesUnit: message });\n }\n const conversionInputs = normalizeProductConversionInputs(\n formValues.unitConversions,\n t(\n \"catalog.products.uom.errors.duplicateConversion\",\n \"Duplicate conversion unit is not allowed.\",\n ),\n );\n if (conversionInputs.length && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequiredForConversions\",\n \"Base unit is required when conversions are configured.\",\n );\n throw createCrudFormError(message, { defaultUnit: message });\n }\n const defaultUnitKey = defaultUnit?.toLowerCase() ?? null;\n const defaultSalesUnitKey = defaultSalesUnit?.toLowerCase() ?? null;\n if (\n defaultUnitKey &&\n defaultSalesUnitKey &&\n defaultSalesUnitKey !== defaultUnitKey\n ) {\n const hasDefaultSalesConversion = conversionInputs.some(\n (entry) =>\n entry.isActive &&\n entry.unitCode.toLowerCase() === defaultSalesUnitKey,\n );\n if (!hasDefaultSalesConversion) {\n const message = t(\n \"catalog.products.uom.errors.defaultSalesConversionRequired\",\n \"Active conversion for default sales unit is required when it differs from base unit.\",\n );\n throw createCrudFormError(message, {\n defaultSalesUnit: message,\n unitConversions: message,\n });\n }\n }\n if (unitPriceEnabled) {\n if (\n !unitPriceReferenceUnit ||\n !UNIT_PRICE_REFERENCE_UNITS.has(\n unitPriceReferenceUnit as ProductUnitPriceReferenceUnit,\n )\n ) {\n const message = t(\n \"catalog.products.unitPrice.errors.referenceUnit\",\n \"Reference unit is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceReferenceUnit: message,\n });\n }\n if (unitPriceBaseQuantity === null) {\n const message = t(\n \"catalog.products.unitPrice.errors.baseQuantity\",\n \"Base quantity is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceBaseQuantity: message,\n });\n }\n }\n const productPayload: Record<string, unknown> = {\n title,\n subtitle: formValues.subtitle?.trim() || undefined,\n description,\n handle,\n taxRateId: formValues.taxRateId ?? null,\n taxRate: productTaxRate ?? null,\n isConfigurable: Boolean(formValues.hasVariants),\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n dimensions,\n weightValue: weight?.value ?? null,\n weightUnit: weight?.unit ?? null,\n defaultUnit: defaultUnit ?? null,\n defaultSalesUnit: defaultSalesUnit ?? defaultUnit ?? null,\n defaultSalesUnitQuantity,\n uomRoundingScale,\n uomRoundingMode,\n unitPriceEnabled,\n unitPriceReferenceUnit: unitPriceEnabled\n ? unitPriceReferenceUnit\n : undefined,\n unitPriceBaseQuantity: unitPriceEnabled\n ? unitPriceBaseQuantity\n : undefined,\n };\n if (optionSchemaDefinition) {\n productPayload.optionSchema = optionSchemaDefinition;\n }\n const categoryIds = Array.isArray(formValues.categoryIds)\n ? formValues.categoryIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (categoryIds.length) {\n productPayload.categoryIds = Array.from(new Set(categoryIds));\n }\n const tags = Array.isArray(formValues.tags)\n ? Array.from(\n new Set(\n formValues.tags\n .map((tag) => (typeof tag === \"string\" ? tag.trim() : \"\"))\n .filter((tag) => tag.length),\n ),\n )\n : [];\n if (tags.length) {\n productPayload.tags = tags;\n }\n const channelIds = Array.isArray(formValues.channelIds)\n ? formValues.channelIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (channelIds.length) {\n productPayload.offers = channelIds.map((channelId) => ({\n channelId,\n title,\n description,\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n }));\n }\n\n const variantDrafts =\n (Array.isArray(formValues.variants) && formValues.variants.length\n ? formValues.variants\n : [\n createVariantDraft(formValues.taxRateId ?? null, {\n isDefault: true,\n }),\n ]) ?? [];\n const priceRequests: VariantPriceRequest[] = [];\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n for (const priceKind of priceKinds) {\n const value = variant.prices?.[priceKind.id]?.amount?.trim();\n if (!value) continue;\n const numeric = Number(value);\n if (\n Number.isNaN(numeric) ||\n !Number.isFinite(numeric) ||\n numeric < 0\n ) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.priceNonNegative\",\n \"Prices must be zero or greater.\",\n ),\n );\n }\n const currencyCode =\n typeof priceKind.currencyCode === \"string\" &&\n priceKind.currencyCode.trim().length\n ? priceKind.currencyCode.trim().toUpperCase()\n : \"\";\n if (!currencyCode) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.currency\",\n \"Provide a currency for all price kinds.\",\n ),\n {},\n );\n }\n priceRequests.push({\n variantDraftId: variant.id,\n priceKindId: priceKind.id,\n currencyCode,\n amount: numeric,\n displayMode: priceKind.displayMode,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRateValue: resolvedVariantTaxRate ?? null,\n });\n }\n }\n\n const cleanupState: {\n productId: string | null;\n variantIds: string[];\n } = { productId: null, variantIds: [] };\n try {\n const { result: created } = await createCrud<{ id?: string }>(\n \"catalog/products\",\n productPayload,\n );\n const productId = created?.id;\n if (!productId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.id\",\n \"Product id missing after create.\",\n ),\n );\n }\n cleanupState.productId = productId;\n\n for (const conversion of conversionInputs) {\n await createCrud(\"catalog/product-unit-conversions\", {\n productId,\n unitCode: conversion.unitCode,\n toBaseFactor: conversion.toBaseFactor,\n sortOrder: conversion.sortOrder,\n isActive: conversion.isActive,\n });\n }\n\n const variantIdMap: Record<string, string> = {};\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n const variantPayload: Record<string, unknown> = {\n productId,\n name:\n variant.title?.trim() ||\n Object.values(variant.optionValues).join(\" / \") ||\n \"Variant\",\n sku: variant.sku?.trim() || undefined,\n isDefault: Boolean(variant.isDefault),\n isActive: true,\n optionValues: Object.keys(variant.optionValues).length\n ? variant.optionValues\n : undefined,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRate: resolvedVariantTaxRate ?? null,\n };\n const { result: variantResult } = await createCrud<{\n id?: string;\n variantId?: string;\n }>(\"catalog/variants\", variantPayload);\n const variantId = variantResult?.variantId ?? variantResult?.id;\n if (!variantId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.variant\",\n \"Failed to create variant.\",\n ),\n );\n }\n variantIdMap[variant.id] = variantId;\n cleanupState.variantIds.push(variantId);\n }\n\n for (const draft of priceRequests) {\n const variantId = variantIdMap[draft.variantDraftId];\n if (!variantId) continue;\n const pricePayload: Record<string, unknown> = {\n productId,\n variantId,\n currencyCode: draft.currencyCode,\n priceKindId: draft.priceKindId,\n };\n if (draft.taxRateId) {\n pricePayload.taxRateId = draft.taxRateId;\n } else if (\n typeof draft.taxRateValue === \"number\" &&\n Number.isFinite(draft.taxRateValue)\n ) {\n pricePayload.taxRate = draft.taxRateValue;\n }\n if (draft.displayMode === \"including-tax\") {\n pricePayload.unitPriceGross = draft.amount;\n } else {\n pricePayload.unitPriceNet = draft.amount;\n }\n await createCrud(\"catalog/prices\", pricePayload);\n }\n\n if (mediaDraftId && attachmentIds.length) {\n const transfer = await apiCall<{\n ok?: boolean;\n error?: string;\n }>(\n \"/api/attachments/transfer\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n entityId: E.catalog.catalog_product,\n attachmentIds,\n fromRecordId: mediaDraftId,\n toRecordId: productId,\n }),\n },\n { fallback: null },\n );\n if (!transfer.ok) {\n console.error(\n \"attachments.transfer.failed\",\n transfer.result?.error,\n );\n }\n }\n\n if (inboxDraft) {\n try {\n sessionStorage.removeItem(\"inbox_ops.productDraft\");\n } catch { /* ignore */ }\n try {\n await apiCall(\n `/api/inbox_ops/proposals/${inboxDraft.proposalId}/actions/${inboxDraft.actionId}/complete`,\n {\n method: \"PATCH\",\n body: JSON.stringify({\n createdEntityId: productId,\n createdEntityType: \"catalog_product\",\n }),\n },\n );\n } catch {\n flash(\n t(\n \"inbox_ops.flash.complete_failed\",\n \"Product created but failed to update inbox action status.\",\n ),\n \"warning\",\n );\n }\n }\n\n flash(\n t(\"catalog.products.create.success\", \"Product created.\"),\n \"success\",\n );\n if (inboxDraft) {\n router.push(\n `/backend/inbox-ops/proposals/${encodeURIComponent(inboxDraft.proposalId)}`,\n );\n } else {\n router.push(\"/backend/catalog/products\");\n }\n } catch (err) {\n await cleanupFailedProduct(\n cleanupState.productId,\n cleanupState.variantIds,\n );\n throw err;\n }\n }}\n />\n </PageBody>\n </Page>\n );\n}\n\nasync function cleanupFailedProduct(\n productId: string | null,\n variantIds: string[],\n): Promise<void> {\n if (!productId && variantIds.length === 0) return;\n if (variantIds.length) {\n const variantDeletes = variantIds.map((variantId) =>\n apiCall(`/api/catalog/variants?id=${encodeURIComponent(variantId)}`, {\n method: \"DELETE\",\n }).catch(() => null),\n );\n await Promise.allSettled(variantDeletes);\n }\n if (productId) {\n await apiCall(`/api/catalog/products?id=${encodeURIComponent(productId)}`, {\n method: \"DELETE\",\n }).catch(() => null);\n }\n}\n\ntype ProductBuilderProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n priceKinds: PriceKindSummary[];\n taxRates: TaxRateSummary[];\n};\n\ntype ProductMetaSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n taxRates: TaxRateSummary[];\n};\n\ntype ProductDimensionsSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n};\n\nfunction ProductDimensionsFields({\n values,\n setValue,\n}: ProductDimensionsSectionProps) {\n const t = useT();\n const dimensionValues = normalizeProductDimensions(values.dimensions);\n const weightValues = normalizeProductWeight(values.weight);\n\n return (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <h3 className=\"text-sm font-semibold\">\n {t(\"catalog.products.edit.dimensions\", \"Dimensions & weight\")}\n </h3>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.width\", \"Width\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.width ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"width\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.height\", \"Height\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.height ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"height\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.depth\", \"Depth\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.depth ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"depth\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.unit\", \"Size unit\")}\n </Label>\n <Input\n value={dimensionValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"cm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.value\", \"Weight\")}\n </Label>\n <Input\n type=\"number\"\n value={weightValues?.value ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"value\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.unit\", \"Weight unit\")}\n </Label>\n <Input\n value={weightValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"kg\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProductBuilder({\n values,\n setValue,\n errors,\n priceKinds,\n taxRates,\n}: ProductBuilderProps) {\n const t = useT();\n const steps = PRODUCT_FORM_STEPS;\n const [currentStep, setCurrentStep] = React.useState(0);\n const defaultTaxRate = React.useMemo(\n () =>\n values.taxRateId\n ? (taxRates.find((rate) => rate.id === values.taxRateId) ?? null)\n : null,\n [taxRates, values.taxRateId],\n );\n React.useEffect(() => {\n if (values.taxRateId) return;\n if (!taxRates.length) return;\n const fallback = taxRates.find((rate) => rate.isDefault);\n if (!fallback) return;\n setValue(\"taxRateId\", fallback.id);\n }, [taxRates, setValue, values.taxRateId]);\n const stepErrors = React.useMemo(() => {\n const map = steps.reduce<Record<ProductFormStep, string[]>>(\n (acc, step) => {\n acc[step] = [];\n return acc;\n },\n {} as Record<ProductFormStep, string[]>,\n );\n Object.entries(errors).forEach(([fieldId, message]) => {\n const step = resolveStepForField(fieldId);\n if (!step) return;\n const text =\n typeof message === \"string\" && message.trim().length\n ? message.trim()\n : null;\n if (text) map[step] = [...map[step], text];\n });\n return map;\n }, [errors, steps]);\n const errorSignature = React.useMemo(\n () => Object.keys(errors).sort((a, b) => a.localeCompare(b)).join(\"|\"),\n [errors],\n );\n const lastErrorSignatureRef = React.useRef<string | null>(null);\n React.useEffect(() => {\n if (!errorSignature || errorSignature === lastErrorSignatureRef.current)\n return;\n lastErrorSignatureRef.current = errorSignature;\n const currentStepKey = steps[currentStep];\n if (currentStepKey && stepErrors[currentStepKey]?.length) return;\n const fallbackIndex = steps.findIndex(\n (step) => (stepErrors[step] ?? []).length > 0,\n );\n if (fallbackIndex >= 0 && fallbackIndex !== currentStep) {\n setCurrentStep(fallbackIndex);\n }\n }, [currentStep, errorSignature, setCurrentStep, stepErrors, steps]);\n const defaultTaxRateLabel = defaultTaxRate\n ? formatTaxRateLabel(defaultTaxRate)\n : null;\n const inventoryDisabledHint = t(\n \"catalog.products.create.variantsBuilder.inventoryDisabled\",\n \"Inventory tracking controls are not available yet.\",\n );\n\n React.useEffect(() => {\n if (currentStep >= steps.length) setCurrentStep(0);\n }, [currentStep, steps.length]);\n\n const currentStepKey = steps[currentStep] ?? steps[0];\n\n const mediaItems = React.useMemo(\n () => (Array.isArray(values.mediaItems) ? values.mediaItems : []),\n [values.mediaItems],\n );\n\n const handleMediaItemsChange = React.useCallback(\n (nextItems: ProductMediaItem[]) => {\n setValue(\"mediaItems\", nextItems);\n const hasCurrent = nextItems.some(\n (item) => item.id === values.defaultMediaId,\n );\n if (!hasCurrent) {\n const fallbackId = nextItems[0]?.id ?? null;\n setValue(\"defaultMediaId\", fallbackId);\n if (fallbackId && nextItems[0]) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(fallbackId, {\n slug: slugifyAttachmentFileName(nextItems[0].fileName),\n }),\n );\n } else {\n setValue(\"defaultMediaUrl\", \"\");\n }\n }\n },\n [setValue, values.defaultMediaId],\n );\n\n const handleDefaultMediaChange = React.useCallback(\n (attachmentId: string | null) => {\n setValue(\"defaultMediaId\", attachmentId);\n if (!attachmentId) {\n setValue(\"defaultMediaUrl\", \"\");\n return;\n }\n const target = mediaItems.find((item) => item.id === attachmentId);\n if (target) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(target.id, {\n slug: slugifyAttachmentFileName(target.fileName),\n }),\n );\n }\n },\n [mediaItems, setValue],\n );\n\n const ensureVariants = React.useCallback(() => {\n const optionDefinitions = Array.isArray(values.options)\n ? values.options\n : [];\n if (!values.hasVariants || !optionDefinitions.length) {\n if (!values.variants || !values.variants.length) {\n setValue(\"variants\", [\n createVariantDraft(values.taxRateId ?? null, { isDefault: true }),\n ]);\n }\n return;\n }\n const combos = buildVariantCombinations(optionDefinitions);\n const existing = Array.isArray(values.variants) ? values.variants : [];\n const existingByKey = new Map(\n existing.map((variant) => [\n buildOptionValuesKey(variant.optionValues),\n variant,\n ]),\n );\n let hasDefault = existing.some((variant) => variant.isDefault);\n let changed = existing.length !== combos.length;\n const nextVariants: VariantDraft[] = combos.map((combo, index) => {\n const key = buildOptionValuesKey(combo);\n const existingMatch = existingByKey.get(key);\n if (existingMatch) {\n if (existingMatch.isDefault) hasDefault = true;\n if (!haveSameOptionValues(existingMatch.optionValues, combo)) {\n changed = true;\n return { ...existingMatch, optionValues: combo };\n }\n if (existing[index] !== existingMatch) {\n changed = true;\n }\n return existingMatch;\n }\n changed = true;\n return createVariantDraft(values.taxRateId ?? null, {\n title: Object.values(combo).join(\" / \"),\n optionValues: combo,\n });\n });\n if (!nextVariants.length) return;\n if (!hasDefault) {\n changed = true;\n nextVariants[0] = { ...nextVariants[0], isDefault: true };\n }\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [\n values.options,\n values.variants,\n values.hasVariants,\n values.taxRateId,\n setValue,\n ]);\n\n React.useEffect(() => {\n ensureVariants();\n }, [ensureVariants]);\n\n React.useEffect(() => {\n if (!values.taxRateId) return;\n const variants = Array.isArray(values.variants) ? values.variants : [];\n if (!variants.length) return;\n let changed = false;\n const nextVariants = variants.map((variant) => {\n if (variant.taxRateId) return variant;\n changed = true;\n return { ...variant, taxRateId: values.taxRateId };\n });\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [values.taxRateId, values.variants, setValue]);\n const setVariantField = React.useCallback(\n (variantId: string, field: keyof VariantDraft, value: unknown) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n return { ...variant, [field]: value };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const setVariantPrice = React.useCallback(\n (variantId: string, priceKindId: string, amount: string) => {\n if (amount.trim().startsWith(\"-\")) return;\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n const nextPrices = { ...(variant.prices ?? {}) };\n if (amount === \"\") {\n delete nextPrices[priceKindId];\n } else {\n nextPrices[priceKindId] = { amount };\n }\n return {\n ...variant,\n prices: nextPrices,\n };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const markDefaultVariant = React.useCallback(\n (variantId: string) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => ({\n ...variant,\n isDefault: variant.id === variantId,\n }),\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const handleOptionTitleChange = React.useCallback(\n (optionId: string, title: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n return { ...option, title };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const setOptionValues = React.useCallback(\n (optionId: string, labels: string[]) => {\n const normalized = labels\n .map((label) => label.trim())\n .filter((label) => label.length);\n const unique = Array.from(new Set(normalized));\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n const existingByLabel = new Map(\n option.values.map((value) => [value.label, value]),\n );\n const nextValues = unique.map(\n (label) =>\n existingByLabel.get(label) ?? { id: createLocalId(), label },\n );\n return {\n ...option,\n values: nextValues,\n };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const addOption = React.useCallback(() => {\n const next = [\n ...(Array.isArray(values.options) ? values.options : []),\n { id: createLocalId(), title: \"\", values: [] },\n ];\n setValue(\"options\", next);\n }, [values.options, setValue]);\n\n const removeOption = React.useCallback(\n (optionId: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).filter(\n (option) => option.id !== optionId,\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n return (\n <div className=\"space-y-6\">\n <nav className=\"flex gap-6 border-b pb-2 text-sm font-medium\">\n {steps.map((step, index) => (\n <Button\n key={step}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"relative h-auto rounded-none px-0 py-1 pb-2 font-medium\",\n currentStep === index\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n onClick={() => setCurrentStep(index)}\n >\n {step === \"general\" &&\n t(\"catalog.products.create.steps.general\", \"General data\")}\n {step === \"organize\" &&\n t(\"catalog.products.create.steps.organize\", \"Organize\")}\n {step === \"uom\" &&\n t(\"catalog.products.uom.title\", \"Units of measure\")}\n {step === \"variants\" &&\n t(\"catalog.products.create.steps.variants\", \"Variants\")}\n {(stepErrors[step]?.length ?? 0) > 0 ? (\n <span\n className=\"absolute -right-2 top-0 h-2 w-2 rounded-full bg-destructive\"\n aria-hidden=\"true\"\n />\n ) : null}\n {currentStep === index ? (\n <span className=\"absolute inset-x-0 -bottom-px h-0.5 bg-foreground rounded-full\" />\n ) : null}\n </Button>\n ))}\n </nav>\n\n {currentStepKey === \"general\" ? (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1\">\n {t(\"catalog.products.form.title\", \"Title\")}\n <span className=\"text-red-600\">*</span>\n </Label>\n <Input\n value={values.title}\n onChange={(event) => setValue(\"title\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.title\",\n \"e.g., Summer sneaker\",\n )}\n />\n {errors.title ? (\n <p className=\"text-xs text-red-600\">{errors.title}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label>\n {t(\"catalog.products.form.description\", \"Description\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setValue(\"useMarkdown\", !values.useMarkdown)}\n className=\"gap-2 text-xs\"\n >\n {values.useMarkdown ? (\n <AlignLeft className=\"h-4 w-4\" />\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n {values.useMarkdown\n ? t(\n \"catalog.products.create.actions.usePlain\",\n \"Use plain text\",\n )\n : t(\n \"catalog.products.create.actions.useMarkdown\",\n \"Use markdown\",\n )}\n </Button>\n </div>\n {values.useMarkdown ? (\n <div\n data-color-mode=\"light\"\n className=\"overflow-hidden rounded-md border\"\n >\n <MarkdownEditor\n value={values.description}\n height={260}\n onChange={(val) => setValue(\"description\", val ?? \"\")}\n previewOptions={{ remarkPlugins: [] }}\n />\n </div>\n ) : (\n <textarea\n className=\"min-h-[180px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.description}\n onChange={(event) =>\n setValue(\"description\", event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.placeholders.description\",\n \"Describe the product...\",\n )}\n />\n )}\n </div>\n\n <ProductMediaManager\n entityId={E.catalog.catalog_product}\n draftRecordId={values.mediaDraftId}\n items={mediaItems}\n defaultMediaId={values.defaultMediaId ?? null}\n onItemsChange={handleMediaItemsChange}\n onDefaultChange={handleDefaultMediaChange}\n />\n\n <ProductDimensionsFields\n values={values as ProductFormValues}\n setValue={setValue}\n />\n </div>\n ) : null}\n\n {currentStepKey === \"organize\" ? (\n <ProductCategorizeSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n />\n ) : null}\n\n {currentStepKey === \"uom\" ? (\n <ProductUomSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n embedded\n />\n ) : null}\n\n {currentStepKey === \"variants\" ? (\n <div className=\"space-y-6\">\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border\"\n checked={values.hasVariants}\n onChange={(event) =>\n setValue(\"hasVariants\", event.target.checked)\n }\n />\n {t(\n \"catalog.products.create.variantsBuilder.toggle\",\n \"Yes, this is a product with variants\",\n )}\n </label>\n\n {values.hasVariants ? (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">\n {t(\n \"catalog.products.create.optionsBuilder.title\",\n \"Product options\",\n )}\n </h3>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addOption}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {t(\n \"catalog.products.create.optionsBuilder.add\",\n \"Add option\",\n )}\n </Button>\n </div>\n {(Array.isArray(values.options) ? values.options : []).map(\n (option) => (\n <div key={option.id} className=\"rounded-md bg-muted/40 p-4\">\n <div className=\"flex items-center gap-2\">\n <Input\n value={option.title}\n onChange={(event) =>\n handleOptionTitleChange(option.id, event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.placeholder\",\n \"e.g., Color\",\n )}\n className=\"flex-1\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n type=\"button\"\n onClick={() => removeOption(option.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"mt-3 space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.values\",\n \"Values\",\n )}\n </Label>\n <TagsInput\n value={option.values.map((value) => value.label)}\n onChange={(labels) =>\n setOptionValues(option.id, labels)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.valuePlaceholder\",\n \"Type a value and press Enter\",\n )}\n />\n </div>\n </div>\n ),\n )}\n {!values.options?.length ? (\n <p className=\"text-sm text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.empty\",\n \"No options yet. Add your first option to generate variants.\",\n )}\n </p>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"rounded-lg border\">\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full min-w-[900px] table-fixed border-collapse text-sm\">\n <thead className=\"bg-muted/40\">\n <tr>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.defaultOption\",\n \"Default option\",\n )}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.form.variants\", \"Variant title\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.create.variantsBuilder.sku\", \"SKU\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.vatColumn\",\n \"Tax class\",\n )}\n </th>\n {priceKinds.map((kind) => (\n <th key={kind.id} className=\"px-3 py-2 text-left\">\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1\">\n <span>\n {t(\n \"catalog.products.create.variantsBuilder.priceColumn\",\n \"Price {{title}}\",\n ).replace(\"{{title}}\", kind.title)}\n </span>\n <small\n title={\n kind.displayMode === \"including-tax\"\n ? t(\n \"catalog.priceKinds.form.displayMode.include\",\n \"Including tax\",\n )\n : t(\n \"catalog.priceKinds.form.displayMode.exclude\",\n \"Excluding tax\",\n )\n }\n className=\"text-xs text-muted-foreground\"\n >\n {kind.displayMode === \"including-tax\" ? \"\u24C9\" : \"\u24C3\"}\n </small>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode?.toUpperCase() ??\n t(\n \"catalog.products.create.variantsBuilder.currencyMissing\",\n \"Currency missing\",\n )}\n </span>\n </div>\n </th>\n ))}\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.manageInventory\",\n \"Managed inventory\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.allowBackorder\",\n \"Allow backorder\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.inventoryKit\",\n \"Has inventory kit\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {(Array.isArray(values.variants) && values.variants.length\n ? values.variants\n : [\n createVariantDraft(values.taxRateId ?? null, {\n isDefault: true,\n }),\n ]\n ).map((variant) => (\n <tr key={variant.id} className=\"border-t\">\n <td className=\"px-3 py-2\">\n <label className=\"inline-flex items-center gap-1 text-xs\">\n <input\n type=\"radio\"\n name=\"defaultVariant\"\n checked={variant.isDefault}\n onChange={() => markDefaultVariant(variant.id)}\n />\n {variant.isDefault\n ? t(\n \"catalog.products.create.variantsBuilder.defaultLabel\",\n \"Default option value\",\n )\n : t(\n \"catalog.products.create.variantsBuilder.makeDefault\",\n \"Set as default\",\n )}\n </label>\n {values.hasVariants && variant.optionValues ? (\n <p className=\"text-xs text-muted-foreground\">\n {Object.values(variant.optionValues).join(\" / \")}\n </p>\n ) : null}\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.title}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"title\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.titlePlaceholder\",\n \"Variant title\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.sku}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"sku\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.skuPlaceholder\",\n \"e.g., SKU-001\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n value={variant.taxRateId ?? \"\"}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"taxRateId\",\n event.target.value || null,\n )\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {defaultTaxRateLabel\n ? t(\n \"catalog.products.create.variantsBuilder.vatOptionDefault\",\n \"Use product tax class ({{label}})\",\n ).replace(\"{{label}}\", defaultTaxRateLabel)\n : t(\n \"catalog.products.create.variantsBuilder.vatOptionNone\",\n \"No tax class\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n </td>\n {priceKinds.map((kind) => (\n <td key={kind.id} className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode ?? \"\u2014\"}\n </span>\n <input\n type=\"number\"\n className=\"w-full rounded-md border px-2 py-1\"\n value={variant.prices?.[kind.id]?.amount ?? \"\"}\n onChange={(event) =>\n setVariantPrice(\n variant.id,\n kind.id,\n event.target.value,\n )\n }\n placeholder=\"0.00\"\n min={0}\n />\n </div>\n </td>\n ))}\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.manageInventory}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"manageInventory\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.allowBackorder}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"allowBackorder\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.hasInventoryKit}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"hasInventoryKit\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!priceKinds.length ? (\n <div className=\"flex items-center gap-2 border-t px-4 py-3 text-sm text-muted-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n {t(\n \"catalog.products.create.variantsBuilder.noPriceKinds\",\n \"Configure price kinds in Catalog settings to add price columns.\",\n )}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div className=\"flex justify-between border-t pt-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentStep(Math.max(0, currentStep - 1))}\n disabled={currentStep === 0}\n className=\"gap-2\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t(\"catalog.products.create.steps.previous\", \"Previous\")}\n </Button>\n {currentStepKey !== \"variants\" ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n setCurrentStep(Math.min(steps.length - 1, currentStep + 1))\n }\n className=\"gap-2\"\n >\n {t(\"catalog.products.create.steps.continue\", \"Continue\")}\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n\nfunction ProductMetaSection({\n values,\n setValue,\n errors,\n taxRates,\n}: ProductMetaSectionProps) {\n const t = useT();\n const handleValue = typeof values.handle === \"string\" ? values.handle : \"\";\n const titleSource = typeof values.title === \"string\" ? values.title : \"\";\n const autoHandleEnabledRef = React.useRef(handleValue.trim().length === 0);\n\n React.useEffect(() => {\n if (!autoHandleEnabledRef.current) return;\n const normalizedTitle = titleSource.trim();\n if (!normalizedTitle) {\n if (handleValue) {\n setValue(\"handle\", \"\");\n }\n return;\n }\n const nextHandle = slugify(normalizedTitle);\n if (nextHandle !== handleValue) {\n setValue(\"handle\", nextHandle);\n }\n }, [titleSource, handleValue, setValue]);\n\n const handleHandleInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n autoHandleEnabledRef.current = nextValue.trim().length === 0;\n setValue(\"handle\", nextValue);\n },\n [setValue],\n );\n\n const handleGenerateHandle = React.useCallback(() => {\n const slug = slugify(titleSource);\n autoHandleEnabledRef.current = true;\n setValue(\"handle\", slug);\n }, [titleSource, setValue]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.subtitle\", \"Subtitle\")}</Label>\n <Input\n value={typeof values.subtitle === \"string\" ? values.subtitle : \"\"}\n onChange={(event) => setValue(\"subtitle\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.subtitle\",\n \"Optional subtitle\",\n )}\n />\n {errors.subtitle ? (\n <p className=\"text-xs text-red-600\">{errors.subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.handle\", \"Handle\")}</Label>\n <div className=\"flex gap-2\">\n <Input\n value={handleValue}\n onChange={handleHandleInputChange}\n placeholder={t(\n \"catalog.products.create.placeholders.handle\",\n \"e.g., summer-sneaker\",\n )}\n className=\"font-mono lowercase\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleGenerateHandle}\n >\n {t(\"catalog.products.create.actions.generateHandle\", \"Generate\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"catalog.products.create.handleHelp\",\n \"Handle is used for URLs and must be unique.\",\n )}\n </p>\n {errors.handle ? (\n <p className=\"text-xs text-red-600\">{errors.handle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label>\n {t(\"catalog.products.create.taxRates.label\", \"Tax class\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n </span>\n </Button>\n </div>\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.taxRateId ?? \"\"}\n onChange={(event) =>\n setValue(\"taxRateId\", event.target.value || null)\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.noneSelected\",\n \"No tax class selected\",\n )\n : t(\n \"catalog.products.create.taxRates.emptyOption\",\n \"No tax classes available\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-muted-foreground\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.help\",\n \"Applied to new prices unless overridden per variant.\",\n )\n : t(\n \"catalog.products.create.taxRates.empty\",\n \"Define tax classes under Sales \u2192 Configuration.\",\n )}\n </p>\n {errors.taxRateId ? (\n <p className=\"text-xs text-red-600\">{errors.taxRateId}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport dynamic from \"next/dynamic\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport type { ZodType } from \"zod\";\nimport { Page, PageBody } from \"@open-mercato/ui/backend/Page\";\nimport {\n CrudForm,\n type CrudFormGroup,\n type CrudFormGroupComponentProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { createCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { flash } from \"@open-mercato/ui/backend/FlashMessages\";\nimport { TagsInput } from \"@open-mercato/ui/backend/inputs/TagsInput\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport { Label } from \"@open-mercato/ui/primitives/label\";\nimport { cn } from \"@open-mercato/shared/lib/utils\";\nimport {\n Plus,\n Trash2,\n FileText,\n AlignLeft,\n ChevronLeft,\n ChevronRight,\n AlertCircle,\n Settings,\n} from \"lucide-react\";\nimport {\n apiCall,\n readApiResultOrThrow,\n} from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport {\n ProductMediaManager,\n type ProductMediaItem,\n} from \"@open-mercato/core/modules/catalog/components/products/ProductMediaManager\";\nimport { ProductCategorizeSection } from \"@open-mercato/core/modules/catalog/components/products/ProductCategorizeSection\";\nimport {\n PRODUCT_FORM_STEPS,\n type PriceKindSummary,\n type PriceKindApiPayload,\n type TaxRateSummary,\n type ProductOptionInput,\n type VariantPriceValue,\n type VariantDraft,\n type ProductFormValues,\n type ProductUnitConversionDraft,\n type ProductUnitPriceReferenceUnit,\n type ProductUnitRoundingMode,\n productFormSchema,\n createInitialProductFormValues,\n createVariantDraft,\n buildOptionValuesKey,\n haveSameOptionValues,\n normalizePriceKindSummary,\n formatTaxRateLabel,\n slugify,\n createLocalId,\n buildOptionSchemaDefinition,\n buildVariantCombinations,\n normalizeProductDimensions,\n normalizeProductWeight,\n sanitizeProductDimensions,\n sanitizeProductWeight,\n updateDimensionValue,\n updateWeightValue,\n} from \"@open-mercato/core/modules/catalog/components/products/productForm\";\nimport {\n buildAttachmentImageUrl,\n slugifyAttachmentFileName,\n} from \"@open-mercato/core/modules/attachments/lib/imageUrls\";\nimport { ProductUomSection } from \"@open-mercato/core/modules/catalog/components/products/ProductUomSection\";\nimport { canonicalizeUnitCode } from \"@open-mercato/core/modules/catalog/lib/unitCodes\";\nimport {\n UNIT_PRICE_REFERENCE_UNITS,\n toTrimmedOrNull,\n parseNumericInput,\n toPositiveNumberOrNull,\n toIntegerInRangeOrDefault,\n normalizeProductConversionInputs,\n type ProductUnitConversionInput,\n} from \"@open-mercato/core/modules/catalog/components/products/productFormUtils\";\n\nconst productFormTypedSchema =\n productFormSchema as unknown as ZodType<ProductFormValues>;\n\ntype VariantPriceRequest = {\n variantDraftId: string;\n priceKindId: string;\n currencyCode: string;\n amount: number;\n displayMode: PriceKindSummary[\"displayMode\"];\n taxRateId: string | null;\n taxRateValue: number | null;\n};\n\ntype UiMarkdownEditorProps = {\n value?: string;\n height?: number;\n onChange?: (value?: string) => void;\n previewOptions?: { remarkPlugins?: unknown[] };\n};\n\nconst MarkdownEditor = dynamic(() => import(\"@uiw/react-md-editor\"), {\n ssr: false,\n loading: () => (\n <div className=\"flex h-48 items-center justify-center text-sm text-muted-foreground\">\n Loading editor\u2026\n </div>\n ),\n}) as unknown as React.ComponentType<UiMarkdownEditorProps>;\n\ntype ProductFormStep = (typeof PRODUCT_FORM_STEPS)[number];\n\nconst TRUE_BOOLEAN_VALUES = new Set([\"true\", \"1\", \"yes\", \"y\", \"t\"]);\n\nconst matchField = (fieldId: string) => (value: string) =>\n value === fieldId ||\n value.startsWith(`${fieldId}.`) ||\n value.startsWith(`${fieldId}[`);\nconst matchPrefix = (prefix: string) => (value: string) =>\n value.startsWith(prefix);\n\nconst STEP_FIELD_MATCHERS: Record<\n ProductFormStep,\n ((value: string) => boolean)[]\n> = {\n general: [\n matchField(\"title\"),\n matchField(\"description\"),\n matchField(\"mediaItems\"),\n matchField(\"mediaDraftId\"),\n matchPrefix(\"defaultMedia\"),\n matchPrefix(\"dimensions\"),\n matchPrefix(\"weight\"),\n ],\n organize: [\n matchField(\"categoryIds\"),\n matchField(\"channelIds\"),\n matchField(\"tags\"),\n ],\n uom: [\n matchField(\"defaultUnit\"),\n matchField(\"defaultSalesUnit\"),\n matchField(\"defaultSalesUnitQuantity\"),\n matchField(\"uomRoundingScale\"),\n matchField(\"uomRoundingMode\"),\n matchField(\"unitPriceEnabled\"),\n matchField(\"unitPriceReferenceUnit\"),\n matchField(\"unitPriceBaseQuantity\"),\n matchPrefix(\"unitConversions\"),\n ],\n variants: [\n matchField(\"hasVariants\"),\n matchPrefix(\"options\"),\n matchPrefix(\"variants\"),\n ],\n};\n\nfunction resolveStepForField(fieldId: string): ProductFormStep | null {\n const normalized = fieldId?.trim();\n if (!normalized) return null;\n for (const step of PRODUCT_FORM_STEPS) {\n const matchers = STEP_FIELD_MATCHERS[step];\n if (matchers.some((matcher) => matcher(normalized))) return step;\n }\n return null;\n}\n\nfunction resolveBooleanFlag(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return false;\n if (TRUE_BOOLEAN_VALUES.has(normalized)) return true;\n if ([\"false\", \"0\", \"no\", \"n\", \"f\"].includes(normalized)) return false;\n }\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n\n\ninterface InboxProductDraft {\n actionId: string;\n proposalId: string;\n payload: Record<string, unknown>;\n}\n\nfunction readInboxProductDraft(): InboxProductDraft | null {\n try {\n const raw = sessionStorage.getItem(\"inbox_ops.productDraft\");\n if (!raw) return null;\n const parsed = JSON.parse(raw) as InboxProductDraft;\n if (!parsed.actionId || !parsed.proposalId || !parsed.payload) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport default function CreateCatalogProductPage() {\n const t = useT();\n const router = useRouter();\n const searchParams = useSearchParams();\n const fromInboxAction = searchParams.get(\"fromInboxAction\");\n\n const inboxDraft = React.useMemo<InboxProductDraft | null>(() => {\n if (!fromInboxAction) return null;\n return readInboxProductDraft();\n }, [fromInboxAction]);\n\n const initialValuesRef = React.useRef<ProductFormValues | null>(null);\n if (!initialValuesRef.current) {\n const initial = createInitialProductFormValues();\n if (inboxDraft?.payload) {\n const p = inboxDraft.payload;\n if (typeof p.title === \"string\" && p.title.trim()) initial.title = p.title.trim();\n if (typeof p.description === \"string\" && p.description.trim()) initial.description = p.description.trim();\n }\n initialValuesRef.current = initial;\n }\n const [priceKinds, setPriceKinds] = React.useState<PriceKindSummary[]>([]);\n const [taxRates, setTaxRates] = React.useState<TaxRateSummary[]>([]);\n React.useEffect(() => {\n const loadPriceKinds = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: PriceKindApiPayload[];\n }>(\"/api/catalog/price-kinds?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.priceKinds.errors.load\",\n \"Failed to load price kinds.\",\n ),\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setPriceKinds(\n items\n .map((item) => normalizePriceKindSummary(item))\n .filter((item): item is PriceKindSummary => item !== null),\n );\n } catch (err) {\n console.error(\"catalog.price-kinds.fetch failed\", err);\n setPriceKinds([]);\n }\n };\n loadPriceKinds().catch(() => {});\n }, [t]);\n\n React.useEffect(() => {\n const loadTaxRates = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.products.create.taxRates.error\",\n \"Failed to load tax rates.\",\n ),\n fallback: { items: [] },\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setTaxRates(\n items.map((item) => {\n const rawRate =\n typeof item.rate === \"number\"\n ? item.rate\n : Number(item.rate ?? Number.NaN);\n return {\n id: String(item.id),\n name:\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name\n : t(\n \"catalog.products.create.taxRates.unnamed\",\n \"Untitled tax rate\",\n ),\n code:\n typeof item.code === \"string\" && item.code.trim().length\n ? item.code\n : null,\n rate: Number.isFinite(rawRate) ? rawRate : null,\n isDefault: resolveBooleanFlag(\n typeof item.isDefault !== \"undefined\"\n ? item.isDefault\n : item.is_default,\n ),\n };\n }),\n );\n } catch (err) {\n console.error(\"sales.tax-rates.fetch failed\", err);\n setTaxRates([]);\n }\n };\n loadTaxRates().catch(() => {});\n }, [t]);\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => [\n {\n id: \"builder\",\n column: 1,\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductBuilder\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n priceKinds={priceKinds}\n taxRates={taxRates}\n />\n ),\n },\n {\n id: \"product-meta\",\n column: 2,\n title: t(\"catalog.products.create.meta.title\", \"Product meta\"),\n description: t(\n \"catalog.products.create.meta.description\",\n \"Manage subtitle and handle for storefronts.\",\n ),\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductMetaSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n taxRates={taxRates}\n />\n ),\n },\n ],\n [priceKinds, taxRates, t],\n );\n\n return (\n <Page>\n <PageBody>\n <CrudForm<ProductFormValues>\n title={t(\"catalog.products.create.title\", \"Create product\")}\n backHref=\"/backend/catalog/products\"\n fields={[]}\n groups={groups}\n injectionSpotId=\"crud-form:catalog.product\"\n initialValues={\n initialValuesRef.current ?? createInitialProductFormValues()\n }\n schema={productFormTypedSchema}\n submitLabel={t(\"catalog.products.create.submit\", \"Create\")}\n cancelHref=\"/backend/catalog/products\"\n onSubmit={async (formValues) => {\n const title = formValues.title?.trim();\n if (!title) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n {\n title: t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n },\n );\n }\n const handle = formValues.handle?.trim() || undefined;\n const description = formValues.description?.trim() || undefined;\n const defaultMediaId =\n typeof formValues.defaultMediaId === \"string\" &&\n formValues.defaultMediaId.trim().length\n ? formValues.defaultMediaId\n : null;\n const mediaItems = Array.isArray(formValues.mediaItems)\n ? formValues.mediaItems\n : [];\n const attachmentIds = mediaItems\n .map((item) => (typeof item.id === \"string\" ? item.id : null))\n .filter((value): value is string => !!value);\n const mediaDraftId =\n typeof formValues.mediaDraftId === \"string\"\n ? formValues.mediaDraftId\n : \"\";\n const defaultMediaEntry = defaultMediaId\n ? mediaItems.find((item) => item.id === defaultMediaId)\n : null;\n const defaultMediaUrl = defaultMediaEntry\n ? buildAttachmentImageUrl(defaultMediaEntry.id, {\n slug: slugifyAttachmentFileName(defaultMediaEntry.fileName),\n })\n : null;\n const optionSchemaDefinition = buildOptionSchemaDefinition(\n formValues.options,\n title,\n );\n const dimensions = sanitizeProductDimensions(\n formValues.dimensions ?? null,\n );\n const weight = sanitizeProductWeight(formValues.weight ?? null);\n const resolveTaxRateValue = (taxRateId?: string | null) => {\n if (!taxRateId) return null;\n const match = taxRates.find((rate) => rate.id === taxRateId);\n return typeof match?.rate === \"number\" ? match.rate : null;\n };\n const productLevelTaxRateId = formValues.taxRateId ?? null;\n const productTaxRate = resolveTaxRateValue(productLevelTaxRateId);\n const resolveVariantTax = (variant: VariantDraft) => {\n const resolvedVariantTaxRateId =\n variant.taxRateId ?? productLevelTaxRateId;\n const resolvedVariantTaxRate =\n resolveTaxRateValue(resolvedVariantTaxRateId) ??\n (resolvedVariantTaxRateId ? null : (productTaxRate ?? null));\n return { resolvedVariantTaxRateId, resolvedVariantTaxRate };\n };\n const defaultUnit = canonicalizeUnitCode(formValues.defaultUnit);\n const defaultSalesUnit = canonicalizeUnitCode(\n formValues.defaultSalesUnit,\n );\n const defaultSalesUnitQuantity =\n toPositiveNumberOrNull(formValues.defaultSalesUnitQuantity) ?? 1;\n const uomRoundingScale = toIntegerInRangeOrDefault(\n formValues.uomRoundingScale,\n 0,\n 6,\n 4,\n );\n const uomRoundingMode: ProductUnitRoundingMode =\n formValues.uomRoundingMode === \"down\" ||\n formValues.uomRoundingMode === \"up\"\n ? formValues.uomRoundingMode\n : \"half_up\";\n const unitPriceEnabled = Boolean(formValues.unitPriceEnabled);\n const unitPriceReferenceUnit = canonicalizeUnitCode(\n formValues.unitPriceReferenceUnit,\n );\n const unitPriceBaseQuantity = toPositiveNumberOrNull(\n formValues.unitPriceBaseQuantity,\n );\n if (defaultSalesUnit && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequired\",\n \"Base unit is required when default sales unit is set.\",\n );\n throw createCrudFormError(message, { defaultSalesUnit: message });\n }\n const conversionInputs = normalizeProductConversionInputs(\n formValues.unitConversions,\n t(\n \"catalog.products.uom.errors.duplicateConversion\",\n \"Duplicate conversion unit is not allowed.\",\n ),\n );\n if (conversionInputs.length && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequiredForConversions\",\n \"Base unit is required when conversions are configured.\",\n );\n throw createCrudFormError(message, { defaultUnit: message });\n }\n const defaultUnitKey = defaultUnit?.toLowerCase() ?? null;\n const defaultSalesUnitKey = defaultSalesUnit?.toLowerCase() ?? null;\n if (\n defaultUnitKey &&\n defaultSalesUnitKey &&\n defaultSalesUnitKey !== defaultUnitKey\n ) {\n const hasDefaultSalesConversion = conversionInputs.some(\n (entry) =>\n entry.isActive &&\n entry.unitCode.toLowerCase() === defaultSalesUnitKey,\n );\n if (!hasDefaultSalesConversion) {\n const message = t(\n \"catalog.products.uom.errors.defaultSalesConversionRequired\",\n \"Active conversion for default sales unit is required when it differs from base unit.\",\n );\n throw createCrudFormError(message, {\n defaultSalesUnit: message,\n unitConversions: message,\n });\n }\n }\n if (unitPriceEnabled) {\n if (\n !unitPriceReferenceUnit ||\n !UNIT_PRICE_REFERENCE_UNITS.has(\n unitPriceReferenceUnit as ProductUnitPriceReferenceUnit,\n )\n ) {\n const message = t(\n \"catalog.products.unitPrice.errors.referenceUnit\",\n \"Reference unit is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceReferenceUnit: message,\n });\n }\n if (unitPriceBaseQuantity === null) {\n const message = t(\n \"catalog.products.unitPrice.errors.baseQuantity\",\n \"Base quantity is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceBaseQuantity: message,\n });\n }\n }\n const productPayload: Record<string, unknown> = {\n title,\n subtitle: formValues.subtitle?.trim() || undefined,\n description,\n handle,\n taxRateId: formValues.taxRateId ?? null,\n taxRate: productTaxRate ?? null,\n isConfigurable: Boolean(formValues.hasVariants),\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n dimensions,\n weightValue: weight?.value ?? null,\n weightUnit: weight?.unit ?? null,\n defaultUnit: defaultUnit ?? null,\n defaultSalesUnit: defaultSalesUnit ?? defaultUnit ?? null,\n defaultSalesUnitQuantity,\n uomRoundingScale,\n uomRoundingMode,\n unitPriceEnabled,\n unitPriceReferenceUnit: unitPriceEnabled\n ? unitPriceReferenceUnit\n : undefined,\n unitPriceBaseQuantity: unitPriceEnabled\n ? unitPriceBaseQuantity\n : undefined,\n };\n if (optionSchemaDefinition) {\n productPayload.optionSchema = optionSchemaDefinition;\n }\n const categoryIds = Array.isArray(formValues.categoryIds)\n ? formValues.categoryIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (categoryIds.length) {\n productPayload.categoryIds = Array.from(new Set(categoryIds));\n }\n const tags = Array.isArray(formValues.tags)\n ? Array.from(\n new Set(\n formValues.tags\n .map((tag) => (typeof tag === \"string\" ? tag.trim() : \"\"))\n .filter((tag) => tag.length),\n ),\n )\n : [];\n if (tags.length) {\n productPayload.tags = tags;\n }\n const channelIds = Array.isArray(formValues.channelIds)\n ? formValues.channelIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (channelIds.length) {\n productPayload.offers = channelIds.map((channelId) => ({\n channelId,\n title,\n description,\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n }));\n }\n\n const variantDrafts =\n (Array.isArray(formValues.variants) && formValues.variants.length\n ? formValues.variants\n : [\n createVariantDraft(formValues.taxRateId ?? null, {\n isDefault: true,\n }),\n ]) ?? [];\n const priceRequests: VariantPriceRequest[] = [];\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n for (const priceKind of priceKinds) {\n const value = variant.prices?.[priceKind.id]?.amount?.trim();\n if (!value) continue;\n const numeric = Number(value);\n if (\n Number.isNaN(numeric) ||\n !Number.isFinite(numeric) ||\n numeric < 0\n ) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.priceNonNegative\",\n \"Prices must be zero or greater.\",\n ),\n );\n }\n const currencyCode =\n typeof priceKind.currencyCode === \"string\" &&\n priceKind.currencyCode.trim().length\n ? priceKind.currencyCode.trim().toUpperCase()\n : \"\";\n if (!currencyCode) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.currency\",\n \"Provide a currency for all price kinds.\",\n ),\n {},\n );\n }\n priceRequests.push({\n variantDraftId: variant.id,\n priceKindId: priceKind.id,\n currencyCode,\n amount: numeric,\n displayMode: priceKind.displayMode,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRateValue: resolvedVariantTaxRate ?? null,\n });\n }\n }\n\n const cleanupState: {\n productId: string | null;\n variantIds: string[];\n } = { productId: null, variantIds: [] };\n try {\n const { result: created } = await createCrud<{ id?: string }>(\n \"catalog/products\",\n productPayload,\n );\n const productId = created?.id;\n if (!productId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.id\",\n \"Product id missing after create.\",\n ),\n );\n }\n cleanupState.productId = productId;\n\n for (const conversion of conversionInputs) {\n await createCrud(\"catalog/product-unit-conversions\", {\n productId,\n unitCode: conversion.unitCode,\n toBaseFactor: conversion.toBaseFactor,\n sortOrder: conversion.sortOrder,\n isActive: conversion.isActive,\n });\n }\n\n const variantIdMap: Record<string, string> = {};\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n const variantPayload: Record<string, unknown> = {\n productId,\n name:\n variant.title?.trim() ||\n Object.values(variant.optionValues).join(\" / \") ||\n \"Variant\",\n sku: variant.sku?.trim() || undefined,\n isDefault: Boolean(variant.isDefault),\n isActive: true,\n optionValues: Object.keys(variant.optionValues).length\n ? variant.optionValues\n : undefined,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRate: resolvedVariantTaxRate ?? null,\n };\n const { result: variantResult } = await createCrud<{\n id?: string;\n variantId?: string;\n }>(\"catalog/variants\", variantPayload);\n const variantId = variantResult?.variantId ?? variantResult?.id;\n if (!variantId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.variant\",\n \"Failed to create variant.\",\n ),\n );\n }\n variantIdMap[variant.id] = variantId;\n cleanupState.variantIds.push(variantId);\n }\n\n for (const draft of priceRequests) {\n const variantId = variantIdMap[draft.variantDraftId];\n if (!variantId) continue;\n const pricePayload: Record<string, unknown> = {\n productId,\n variantId,\n currencyCode: draft.currencyCode,\n priceKindId: draft.priceKindId,\n };\n if (draft.taxRateId) {\n pricePayload.taxRateId = draft.taxRateId;\n } else if (\n typeof draft.taxRateValue === \"number\" &&\n Number.isFinite(draft.taxRateValue)\n ) {\n pricePayload.taxRate = draft.taxRateValue;\n }\n if (draft.displayMode === \"including-tax\") {\n pricePayload.unitPriceGross = draft.amount;\n } else {\n pricePayload.unitPriceNet = draft.amount;\n }\n await createCrud(\"catalog/prices\", pricePayload);\n }\n\n if (mediaDraftId && attachmentIds.length) {\n const transfer = await apiCall<{\n ok?: boolean;\n error?: string;\n }>(\n \"/api/attachments/transfer\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n entityId: E.catalog.catalog_product,\n attachmentIds,\n fromRecordId: mediaDraftId,\n toRecordId: productId,\n }),\n },\n { fallback: null },\n );\n if (!transfer.ok) {\n console.error(\n \"attachments.transfer.failed\",\n transfer.result?.error,\n );\n }\n }\n\n if (inboxDraft) {\n try {\n sessionStorage.removeItem(\"inbox_ops.productDraft\");\n } catch { /* ignore */ }\n try {\n await apiCall(\n `/api/inbox_ops/proposals/${inboxDraft.proposalId}/actions/${inboxDraft.actionId}/complete`,\n {\n method: \"PATCH\",\n body: JSON.stringify({\n createdEntityId: productId,\n createdEntityType: \"catalog_product\",\n }),\n },\n );\n } catch {\n flash(\n t(\n \"inbox_ops.flash.complete_failed\",\n \"Product created but failed to update inbox action status.\",\n ),\n \"warning\",\n );\n }\n }\n\n flash(\n t(\"catalog.products.create.success\", \"Product created.\"),\n \"success\",\n );\n if (inboxDraft) {\n router.push(\n `/backend/inbox-ops/proposals/${encodeURIComponent(inboxDraft.proposalId)}`,\n );\n } else {\n router.push(\"/backend/catalog/products\");\n }\n } catch (err) {\n await cleanupFailedProduct(\n cleanupState.productId,\n cleanupState.variantIds,\n );\n throw err;\n }\n }}\n />\n </PageBody>\n </Page>\n );\n}\n\nasync function cleanupFailedProduct(\n productId: string | null,\n variantIds: string[],\n): Promise<void> {\n if (!productId && variantIds.length === 0) return;\n if (variantIds.length) {\n const variantDeletes = variantIds.map((variantId) =>\n apiCall(`/api/catalog/variants?id=${encodeURIComponent(variantId)}`, {\n method: \"DELETE\",\n }).catch(() => null),\n );\n await Promise.allSettled(variantDeletes);\n }\n if (productId) {\n await apiCall(`/api/catalog/products?id=${encodeURIComponent(productId)}`, {\n method: \"DELETE\",\n }).catch(() => null);\n }\n}\n\ntype ProductBuilderProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n priceKinds: PriceKindSummary[];\n taxRates: TaxRateSummary[];\n};\n\ntype ProductMetaSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n taxRates: TaxRateSummary[];\n};\n\ntype ProductDimensionsSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n};\n\nfunction ProductDimensionsFields({\n values,\n setValue,\n}: ProductDimensionsSectionProps) {\n const t = useT();\n const dimensionValues = normalizeProductDimensions(values.dimensions);\n const weightValues = normalizeProductWeight(values.weight);\n\n return (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <h3 className=\"text-sm font-semibold\">\n {t(\"catalog.products.edit.dimensions\", \"Dimensions & weight\")}\n </h3>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.width\", \"Width\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.width ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"width\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.height\", \"Height\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.height ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"height\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.depth\", \"Depth\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.depth ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"depth\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.unit\", \"Size unit\")}\n </Label>\n <Input\n value={dimensionValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"cm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.value\", \"Weight\")}\n </Label>\n <Input\n type=\"number\"\n value={weightValues?.value ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"value\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.unit\", \"Weight unit\")}\n </Label>\n <Input\n value={weightValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"kg\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProductBuilder({\n values,\n setValue,\n errors,\n priceKinds,\n taxRates,\n}: ProductBuilderProps) {\n const t = useT();\n const steps = PRODUCT_FORM_STEPS;\n const [currentStep, setCurrentStep] = React.useState(0);\n const defaultTaxRate = React.useMemo(\n () =>\n values.taxRateId\n ? (taxRates.find((rate) => rate.id === values.taxRateId) ?? null)\n : null,\n [taxRates, values.taxRateId],\n );\n React.useEffect(() => {\n if (values.taxRateId) return;\n if (!taxRates.length) return;\n const fallback = taxRates.find((rate) => rate.isDefault);\n if (!fallback) return;\n setValue(\"taxRateId\", fallback.id);\n }, [taxRates, setValue, values.taxRateId]);\n const stepErrors = React.useMemo(() => {\n const map = steps.reduce<Record<ProductFormStep, string[]>>(\n (acc, step) => {\n acc[step] = [];\n return acc;\n },\n {} as Record<ProductFormStep, string[]>,\n );\n Object.entries(errors).forEach(([fieldId, message]) => {\n const step = resolveStepForField(fieldId);\n if (!step) return;\n const text =\n typeof message === \"string\" && message.trim().length\n ? message.trim()\n : null;\n if (text) map[step] = [...map[step], text];\n });\n return map;\n }, [errors, steps]);\n const errorSignature = React.useMemo(\n () => Object.keys(errors).sort().join(\"|\"),\n [errors],\n );\n const lastErrorSignatureRef = React.useRef<string | null>(null);\n React.useEffect(() => {\n if (!errorSignature || errorSignature === lastErrorSignatureRef.current)\n return;\n lastErrorSignatureRef.current = errorSignature;\n const currentStepKey = steps[currentStep];\n if (currentStepKey && stepErrors[currentStepKey]?.length) return;\n const fallbackIndex = steps.findIndex(\n (step) => (stepErrors[step] ?? []).length > 0,\n );\n if (fallbackIndex >= 0 && fallbackIndex !== currentStep) {\n setCurrentStep(fallbackIndex);\n }\n }, [currentStep, errorSignature, setCurrentStep, stepErrors, steps]);\n const defaultTaxRateLabel = defaultTaxRate\n ? formatTaxRateLabel(defaultTaxRate)\n : null;\n const inventoryDisabledHint = t(\n \"catalog.products.create.variantsBuilder.inventoryDisabled\",\n \"Inventory tracking controls are not available yet.\",\n );\n\n React.useEffect(() => {\n if (currentStep >= steps.length) setCurrentStep(0);\n }, [currentStep, steps.length]);\n\n const currentStepKey = steps[currentStep] ?? steps[0];\n\n const mediaItems = React.useMemo(\n () => (Array.isArray(values.mediaItems) ? values.mediaItems : []),\n [values.mediaItems],\n );\n\n const handleMediaItemsChange = React.useCallback(\n (nextItems: ProductMediaItem[]) => {\n setValue(\"mediaItems\", nextItems);\n const hasCurrent = nextItems.some(\n (item) => item.id === values.defaultMediaId,\n );\n if (!hasCurrent) {\n const fallbackId = nextItems[0]?.id ?? null;\n setValue(\"defaultMediaId\", fallbackId);\n if (fallbackId && nextItems[0]) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(fallbackId, {\n slug: slugifyAttachmentFileName(nextItems[0].fileName),\n }),\n );\n } else {\n setValue(\"defaultMediaUrl\", \"\");\n }\n }\n },\n [setValue, values.defaultMediaId],\n );\n\n const handleDefaultMediaChange = React.useCallback(\n (attachmentId: string | null) => {\n setValue(\"defaultMediaId\", attachmentId);\n if (!attachmentId) {\n setValue(\"defaultMediaUrl\", \"\");\n return;\n }\n const target = mediaItems.find((item) => item.id === attachmentId);\n if (target) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(target.id, {\n slug: slugifyAttachmentFileName(target.fileName),\n }),\n );\n }\n },\n [mediaItems, setValue],\n );\n\n const ensureVariants = React.useCallback(() => {\n const optionDefinitions = Array.isArray(values.options)\n ? values.options\n : [];\n if (!values.hasVariants || !optionDefinitions.length) {\n if (!values.variants || !values.variants.length) {\n setValue(\"variants\", [\n createVariantDraft(values.taxRateId ?? null, { isDefault: true }),\n ]);\n }\n return;\n }\n const combos = buildVariantCombinations(optionDefinitions);\n const existing = Array.isArray(values.variants) ? values.variants : [];\n const existingByKey = new Map(\n existing.map((variant) => [\n buildOptionValuesKey(variant.optionValues),\n variant,\n ]),\n );\n let hasDefault = existing.some((variant) => variant.isDefault);\n let changed = existing.length !== combos.length;\n const nextVariants: VariantDraft[] = combos.map((combo, index) => {\n const key = buildOptionValuesKey(combo);\n const existingMatch = existingByKey.get(key);\n if (existingMatch) {\n if (existingMatch.isDefault) hasDefault = true;\n if (!haveSameOptionValues(existingMatch.optionValues, combo)) {\n changed = true;\n return { ...existingMatch, optionValues: combo };\n }\n if (existing[index] !== existingMatch) {\n changed = true;\n }\n return existingMatch;\n }\n changed = true;\n return createVariantDraft(values.taxRateId ?? null, {\n title: Object.values(combo).join(\" / \"),\n optionValues: combo,\n });\n });\n if (!nextVariants.length) return;\n if (!hasDefault) {\n changed = true;\n nextVariants[0] = { ...nextVariants[0], isDefault: true };\n }\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [\n values.options,\n values.variants,\n values.hasVariants,\n values.taxRateId,\n setValue,\n ]);\n\n React.useEffect(() => {\n ensureVariants();\n }, [ensureVariants]);\n\n React.useEffect(() => {\n if (!values.taxRateId) return;\n const variants = Array.isArray(values.variants) ? values.variants : [];\n if (!variants.length) return;\n let changed = false;\n const nextVariants = variants.map((variant) => {\n if (variant.taxRateId) return variant;\n changed = true;\n return { ...variant, taxRateId: values.taxRateId };\n });\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [values.taxRateId, values.variants, setValue]);\n const setVariantField = React.useCallback(\n (variantId: string, field: keyof VariantDraft, value: unknown) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n return { ...variant, [field]: value };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const setVariantPrice = React.useCallback(\n (variantId: string, priceKindId: string, amount: string) => {\n if (amount.trim().startsWith(\"-\")) return;\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n const nextPrices = { ...(variant.prices ?? {}) };\n if (amount === \"\") {\n delete nextPrices[priceKindId];\n } else {\n nextPrices[priceKindId] = { amount };\n }\n return {\n ...variant,\n prices: nextPrices,\n };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const markDefaultVariant = React.useCallback(\n (variantId: string) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => ({\n ...variant,\n isDefault: variant.id === variantId,\n }),\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const handleOptionTitleChange = React.useCallback(\n (optionId: string, title: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n return { ...option, title };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const setOptionValues = React.useCallback(\n (optionId: string, labels: string[]) => {\n const normalized = labels\n .map((label) => label.trim())\n .filter((label) => label.length);\n const unique = Array.from(new Set(normalized));\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n const existingByLabel = new Map(\n option.values.map((value) => [value.label, value]),\n );\n const nextValues = unique.map(\n (label) =>\n existingByLabel.get(label) ?? { id: createLocalId(), label },\n );\n return {\n ...option,\n values: nextValues,\n };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const addOption = React.useCallback(() => {\n const next = [\n ...(Array.isArray(values.options) ? values.options : []),\n { id: createLocalId(), title: \"\", values: [] },\n ];\n setValue(\"options\", next);\n }, [values.options, setValue]);\n\n const removeOption = React.useCallback(\n (optionId: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).filter(\n (option) => option.id !== optionId,\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n return (\n <div className=\"space-y-6\">\n <nav className=\"flex gap-6 border-b pb-2 text-sm font-medium\">\n {steps.map((step, index) => (\n <Button\n key={step}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"relative h-auto rounded-none px-0 py-1 pb-2 font-medium\",\n currentStep === index\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n onClick={() => setCurrentStep(index)}\n >\n {step === \"general\" &&\n t(\"catalog.products.create.steps.general\", \"General data\")}\n {step === \"organize\" &&\n t(\"catalog.products.create.steps.organize\", \"Organize\")}\n {step === \"uom\" &&\n t(\"catalog.products.uom.title\", \"Units of measure\")}\n {step === \"variants\" &&\n t(\"catalog.products.create.steps.variants\", \"Variants\")}\n {(stepErrors[step]?.length ?? 0) > 0 ? (\n <span\n className=\"absolute -right-2 top-0 h-2 w-2 rounded-full bg-destructive\"\n aria-hidden=\"true\"\n />\n ) : null}\n {currentStep === index ? (\n <span className=\"absolute inset-x-0 -bottom-px h-0.5 bg-foreground rounded-full\" />\n ) : null}\n </Button>\n ))}\n </nav>\n\n {currentStepKey === \"general\" ? (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1\">\n {t(\"catalog.products.form.title\", \"Title\")}\n <span className=\"text-red-600\">*</span>\n </Label>\n <Input\n value={values.title}\n onChange={(event) => setValue(\"title\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.title\",\n \"e.g., Summer sneaker\",\n )}\n />\n {errors.title ? (\n <p className=\"text-xs text-red-600\">{errors.title}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label>\n {t(\"catalog.products.form.description\", \"Description\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setValue(\"useMarkdown\", !values.useMarkdown)}\n className=\"gap-2 text-xs\"\n >\n {values.useMarkdown ? (\n <AlignLeft className=\"h-4 w-4\" />\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n {values.useMarkdown\n ? t(\n \"catalog.products.create.actions.usePlain\",\n \"Use plain text\",\n )\n : t(\n \"catalog.products.create.actions.useMarkdown\",\n \"Use markdown\",\n )}\n </Button>\n </div>\n {values.useMarkdown ? (\n <div\n data-color-mode=\"light\"\n className=\"overflow-hidden rounded-md border\"\n >\n <MarkdownEditor\n value={values.description}\n height={260}\n onChange={(val) => setValue(\"description\", val ?? \"\")}\n previewOptions={{ remarkPlugins: [] }}\n />\n </div>\n ) : (\n <textarea\n className=\"min-h-[180px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.description}\n onChange={(event) =>\n setValue(\"description\", event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.placeholders.description\",\n \"Describe the product...\",\n )}\n />\n )}\n </div>\n\n <ProductMediaManager\n entityId={E.catalog.catalog_product}\n draftRecordId={values.mediaDraftId}\n items={mediaItems}\n defaultMediaId={values.defaultMediaId ?? null}\n onItemsChange={handleMediaItemsChange}\n onDefaultChange={handleDefaultMediaChange}\n />\n\n <ProductDimensionsFields\n values={values as ProductFormValues}\n setValue={setValue}\n />\n </div>\n ) : null}\n\n {currentStepKey === \"organize\" ? (\n <ProductCategorizeSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n />\n ) : null}\n\n {currentStepKey === \"uom\" ? (\n <ProductUomSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n embedded\n />\n ) : null}\n\n {currentStepKey === \"variants\" ? (\n <div className=\"space-y-6\">\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border\"\n checked={values.hasVariants}\n onChange={(event) =>\n setValue(\"hasVariants\", event.target.checked)\n }\n />\n {t(\n \"catalog.products.create.variantsBuilder.toggle\",\n \"Yes, this is a product with variants\",\n )}\n </label>\n\n {values.hasVariants ? (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">\n {t(\n \"catalog.products.create.optionsBuilder.title\",\n \"Product options\",\n )}\n </h3>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addOption}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {t(\n \"catalog.products.create.optionsBuilder.add\",\n \"Add option\",\n )}\n </Button>\n </div>\n {(Array.isArray(values.options) ? values.options : []).map(\n (option) => (\n <div key={option.id} className=\"rounded-md bg-muted/40 p-4\">\n <div className=\"flex items-center gap-2\">\n <Input\n value={option.title}\n onChange={(event) =>\n handleOptionTitleChange(option.id, event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.placeholder\",\n \"e.g., Color\",\n )}\n className=\"flex-1\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n type=\"button\"\n onClick={() => removeOption(option.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"mt-3 space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.values\",\n \"Values\",\n )}\n </Label>\n <TagsInput\n value={option.values.map((value) => value.label)}\n onChange={(labels) =>\n setOptionValues(option.id, labels)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.valuePlaceholder\",\n \"Type a value and press Enter\",\n )}\n />\n </div>\n </div>\n ),\n )}\n {!values.options?.length ? (\n <p className=\"text-sm text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.empty\",\n \"No options yet. Add your first option to generate variants.\",\n )}\n </p>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"rounded-lg border\">\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full min-w-[900px] table-fixed border-collapse text-sm\">\n <thead className=\"bg-muted/40\">\n <tr>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.defaultOption\",\n \"Default option\",\n )}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.form.variants\", \"Variant title\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.create.variantsBuilder.sku\", \"SKU\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.vatColumn\",\n \"Tax class\",\n )}\n </th>\n {priceKinds.map((kind) => (\n <th key={kind.id} className=\"px-3 py-2 text-left\">\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1\">\n <span>\n {t(\n \"catalog.products.create.variantsBuilder.priceColumn\",\n \"Price {{title}}\",\n ).replace(\"{{title}}\", kind.title)}\n </span>\n <small\n title={\n kind.displayMode === \"including-tax\"\n ? t(\n \"catalog.priceKinds.form.displayMode.include\",\n \"Including tax\",\n )\n : t(\n \"catalog.priceKinds.form.displayMode.exclude\",\n \"Excluding tax\",\n )\n }\n className=\"text-xs text-muted-foreground\"\n >\n {kind.displayMode === \"including-tax\" ? \"\u24C9\" : \"\u24C3\"}\n </small>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode?.toUpperCase() ??\n t(\n \"catalog.products.create.variantsBuilder.currencyMissing\",\n \"Currency missing\",\n )}\n </span>\n </div>\n </th>\n ))}\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.manageInventory\",\n \"Managed inventory\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.allowBackorder\",\n \"Allow backorder\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.inventoryKit\",\n \"Has inventory kit\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {(Array.isArray(values.variants) && values.variants.length\n ? values.variants\n : [\n createVariantDraft(values.taxRateId ?? null, {\n isDefault: true,\n }),\n ]\n ).map((variant) => (\n <tr key={variant.id} className=\"border-t\">\n <td className=\"px-3 py-2\">\n <label className=\"inline-flex items-center gap-1 text-xs\">\n <input\n type=\"radio\"\n name=\"defaultVariant\"\n checked={variant.isDefault}\n onChange={() => markDefaultVariant(variant.id)}\n />\n {variant.isDefault\n ? t(\n \"catalog.products.create.variantsBuilder.defaultLabel\",\n \"Default option value\",\n )\n : t(\n \"catalog.products.create.variantsBuilder.makeDefault\",\n \"Set as default\",\n )}\n </label>\n {values.hasVariants && variant.optionValues ? (\n <p className=\"text-xs text-muted-foreground\">\n {Object.values(variant.optionValues).join(\" / \")}\n </p>\n ) : null}\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.title}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"title\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.titlePlaceholder\",\n \"Variant title\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.sku}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"sku\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.skuPlaceholder\",\n \"e.g., SKU-001\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n value={variant.taxRateId ?? \"\"}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"taxRateId\",\n event.target.value || null,\n )\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {defaultTaxRateLabel\n ? t(\n \"catalog.products.create.variantsBuilder.vatOptionDefault\",\n \"Use product tax class ({{label}})\",\n ).replace(\"{{label}}\", defaultTaxRateLabel)\n : t(\n \"catalog.products.create.variantsBuilder.vatOptionNone\",\n \"No tax class\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n </td>\n {priceKinds.map((kind) => (\n <td key={kind.id} className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode ?? \"\u2014\"}\n </span>\n <input\n type=\"number\"\n className=\"w-full rounded-md border px-2 py-1\"\n value={variant.prices?.[kind.id]?.amount ?? \"\"}\n onChange={(event) =>\n setVariantPrice(\n variant.id,\n kind.id,\n event.target.value,\n )\n }\n placeholder=\"0.00\"\n min={0}\n />\n </div>\n </td>\n ))}\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.manageInventory}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"manageInventory\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.allowBackorder}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"allowBackorder\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.hasInventoryKit}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"hasInventoryKit\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!priceKinds.length ? (\n <div className=\"flex items-center gap-2 border-t px-4 py-3 text-sm text-muted-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n {t(\n \"catalog.products.create.variantsBuilder.noPriceKinds\",\n \"Configure price kinds in Catalog settings to add price columns.\",\n )}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div className=\"flex justify-between border-t pt-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentStep(Math.max(0, currentStep - 1))}\n disabled={currentStep === 0}\n className=\"gap-2\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t(\"catalog.products.create.steps.previous\", \"Previous\")}\n </Button>\n {currentStepKey !== \"variants\" ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n setCurrentStep(Math.min(steps.length - 1, currentStep + 1))\n }\n className=\"gap-2\"\n >\n {t(\"catalog.products.create.steps.continue\", \"Continue\")}\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n\nfunction ProductMetaSection({\n values,\n setValue,\n errors,\n taxRates,\n}: ProductMetaSectionProps) {\n const t = useT();\n const handleValue = typeof values.handle === \"string\" ? values.handle : \"\";\n const titleSource = typeof values.title === \"string\" ? values.title : \"\";\n const autoHandleEnabledRef = React.useRef(handleValue.trim().length === 0);\n\n React.useEffect(() => {\n if (!autoHandleEnabledRef.current) return;\n const normalizedTitle = titleSource.trim();\n if (!normalizedTitle) {\n if (handleValue) {\n setValue(\"handle\", \"\");\n }\n return;\n }\n const nextHandle = slugify(normalizedTitle);\n if (nextHandle !== handleValue) {\n setValue(\"handle\", nextHandle);\n }\n }, [titleSource, handleValue, setValue]);\n\n const handleHandleInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n autoHandleEnabledRef.current = nextValue.trim().length === 0;\n setValue(\"handle\", nextValue);\n },\n [setValue],\n );\n\n const handleGenerateHandle = React.useCallback(() => {\n const slug = slugify(titleSource);\n autoHandleEnabledRef.current = true;\n setValue(\"handle\", slug);\n }, [titleSource, setValue]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.subtitle\", \"Subtitle\")}</Label>\n <Input\n value={typeof values.subtitle === \"string\" ? values.subtitle : \"\"}\n onChange={(event) => setValue(\"subtitle\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.subtitle\",\n \"Optional subtitle\",\n )}\n />\n {errors.subtitle ? (\n <p className=\"text-xs text-red-600\">{errors.subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.handle\", \"Handle\")}</Label>\n <div className=\"flex gap-2\">\n <Input\n value={handleValue}\n onChange={handleHandleInputChange}\n placeholder={t(\n \"catalog.products.create.placeholders.handle\",\n \"e.g., summer-sneaker\",\n )}\n className=\"font-mono lowercase\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleGenerateHandle}\n >\n {t(\"catalog.products.create.actions.generateHandle\", \"Generate\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"catalog.products.create.handleHelp\",\n \"Handle is used for URLs and must be unique.\",\n )}\n </p>\n {errors.handle ? (\n <p className=\"text-xs text-red-600\">{errors.handle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label>\n {t(\"catalog.products.create.taxRates.label\", \"Tax class\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n </span>\n </Button>\n </div>\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.taxRateId ?? \"\"}\n onChange={(event) =>\n setValue(\"taxRateId\", event.target.value || null)\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.noneSelected\",\n \"No tax class selected\",\n )\n : t(\n \"catalog.products.create.taxRates.emptyOption\",\n \"No tax classes available\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-muted-foreground\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.help\",\n \"Applied to new prices unless overridden per variant.\",\n )\n : t(\n \"catalog.products.create.taxRates.empty\",\n \"Define tax classes under Sales \u2192 Configuration.\",\n )}\n </p>\n {errors.taxRateId ? (\n <p className=\"text-xs text-red-600\">{errors.taxRateId}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["currentStepKey"]
|
|
7
7
|
}
|
|
@@ -199,7 +199,7 @@ async function resolveScopedTaxRate(em, taxRateId, taxRateInput, organizationId,
|
|
|
199
199
|
return { taxRateId, taxRate: record.rate ?? normalizedRate };
|
|
200
200
|
}
|
|
201
201
|
function slugifyCode(input) {
|
|
202
|
-
return input.toLowerCase().trim().replace(/[^a-z0-9\-]+/g, "-").replace(
|
|
202
|
+
return input.toLowerCase().trim().replace(/[^a-z0-9\-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
203
203
|
}
|
|
204
204
|
function normalizeCatalogOptionSchema(input) {
|
|
205
205
|
if (!input || !Array.isArray(input.options) || !input.options.length)
|