@open-mercato/core 0.6.8-develop.7031.1.005201cd70 → 0.6.8-develop.7037.1.ea0277b01e
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/.turbo/turbo-build.log +1 -1
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +64 -6
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +5 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +43 -8
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/package.json +7 -7
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +89 -6
- package/src/modules/wms/commands/shared.ts +8 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +65 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/wms/commands/shared.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { ensureOrganizationScope } from '@open-mercato/shared/lib/commands/scope'\nimport type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n InventoryBalance,\n InventoryMovement,\n InventoryReservation,\n} from '../data/entities'\n\nexport function ensureTenantScope(ctx: CommandRuntimeContext, tenantId: string): void {\n const currentTenant = ctx.auth?.tenantId ?? null\n if (currentTenant && currentTenant !== tenantId) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nexport function requireId(id: string | null | undefined, label: string): string {\n if (typeof id === 'string' && id.trim().length > 0) return id.trim()\n throw new CrudHttpError(400, { error: `${label} id is required.` })\n}\n\nexport function normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function toNumericString(value: number | string | null | undefined, fallback = '0'): string {\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return fallback\n}\n\n// CRUD indexer configs \u2014 used by emitCrudSideEffects to drive query_index updates.\n// Cache invalidation cross-aliases (e.g. balance lists invalidated when a reservation mutates)\n// are declared in command-level metadata.context.cacheAliases so the command bus picks them up.\nexport const inventoryBalanceCrudIndexer: CrudIndexerConfig<InventoryBalance> = {\n entityType: E.wms.inventory_balance,\n}\n\nexport const inventoryReservationCrudIndexer: CrudIndexerConfig<InventoryReservation> = {\n entityType: E.wms.inventory_reservation,\n}\n\nexport const inventoryMovementCrudIndexer: CrudIndexerConfig<InventoryMovement> = {\n entityType: E.wms.inventory_movement,\n}\n\nexport const inventoryBalanceCrudEvents: CrudEventsConfig<InventoryBalance> = {\n module: 'wms',\n entity: 'inventory_balance',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryReservationCrudEvents: CrudEventsConfig<InventoryReservation> = {\n module: 'wms',\n entity: 'inventory_reservation',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryMovementCrudEvents: CrudEventsConfig<InventoryMovement> = {\n module: 'wms',\n entity: 'inventory_movement',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\n// Cache alias resource kinds used to extend command-level cache invalidation\n// when a single mutation impacts multiple list resources.\nexport const WMS_INVENTORY_BALANCE_RESOURCE = 'wms.inventoryBalance'\nexport const WMS_INVENTORY_RESERVATION_RESOURCE = 'wms.inventoryReservation'\nexport const WMS_INVENTORY_MOVEMENT_RESOURCE = 'wms.inventoryMovement'\n\nexport { ensureOrganizationScope }\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,qBAAqB;AAC9B,SAAS,+BAA+B;AAExC,SAAS,SAAS;
|
|
4
|
+
"sourcesContent": ["import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { ensureOrganizationScope } from '@open-mercato/shared/lib/commands/scope'\nimport type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n InventoryBalance,\n InventoryMovement,\n InventoryReservation,\n WarehouseZone,\n} from '../data/entities'\n\nexport function ensureTenantScope(ctx: CommandRuntimeContext, tenantId: string): void {\n const currentTenant = ctx.auth?.tenantId ?? null\n if (currentTenant && currentTenant !== tenantId) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nexport function requireId(id: string | null | undefined, label: string): string {\n if (typeof id === 'string' && id.trim().length > 0) return id.trim()\n throw new CrudHttpError(400, { error: `${label} id is required.` })\n}\n\nexport function normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function toNumericString(value: number | string | null | undefined, fallback = '0'): string {\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return fallback\n}\n\n// CRUD indexer configs \u2014 used by emitCrudSideEffects to drive query_index updates.\n// Cache invalidation cross-aliases (e.g. balance lists invalidated when a reservation mutates)\n// are declared in command-level metadata.context.cacheAliases so the command bus picks them up.\nexport const inventoryBalanceCrudIndexer: CrudIndexerConfig<InventoryBalance> = {\n entityType: E.wms.inventory_balance,\n}\n\nexport const inventoryReservationCrudIndexer: CrudIndexerConfig<InventoryReservation> = {\n entityType: E.wms.inventory_reservation,\n}\n\nexport const inventoryMovementCrudIndexer: CrudIndexerConfig<InventoryMovement> = {\n entityType: E.wms.inventory_movement,\n}\n\n// Zones are read through the hybrid query engine, which projects `cf:*` out of\n// `entity_indexes` rather than joining `custom_field_values`. Without this indexer the\n// zone commands write custom field values that no read path can ever see (#5239).\nexport const warehouseZoneCrudIndexer: CrudIndexerConfig<WarehouseZone> = {\n entityType: E.wms.warehouse_zone,\n}\n\nexport const inventoryBalanceCrudEvents: CrudEventsConfig<InventoryBalance> = {\n module: 'wms',\n entity: 'inventory_balance',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryReservationCrudEvents: CrudEventsConfig<InventoryReservation> = {\n module: 'wms',\n entity: 'inventory_reservation',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryMovementCrudEvents: CrudEventsConfig<InventoryMovement> = {\n module: 'wms',\n entity: 'inventory_movement',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\n// Cache alias resource kinds used to extend command-level cache invalidation\n// when a single mutation impacts multiple list resources.\nexport const WMS_INVENTORY_BALANCE_RESOURCE = 'wms.inventoryBalance'\nexport const WMS_INVENTORY_RESERVATION_RESOURCE = 'wms.inventoryReservation'\nexport const WMS_INVENTORY_MOVEMENT_RESOURCE = 'wms.inventoryMovement'\n\nexport { ensureOrganizationScope }\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,qBAAqB;AAC9B,SAAS,+BAA+B;AAExC,SAAS,SAAS;AAQX,SAAS,kBAAkB,KAA4B,UAAwB;AACpF,QAAM,gBAAgB,IAAI,MAAM,YAAY;AAC5C,MAAI,iBAAiB,kBAAkB,UAAU;AAC/C,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,EACrD;AACF;AAEO,SAAS,UAAU,IAA+B,OAAuB;AAC9E,MAAI,OAAO,OAAO,YAAY,GAAG,KAAK,EAAE,SAAS,EAAG,QAAO,GAAG,KAAK;AACnE,QAAM,IAAI,cAAc,KAAK,EAAE,OAAO,GAAG,KAAK,mBAAmB,CAAC;AACpE;AAEO,SAAS,wBAAwB,OAAiD;AACvF,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEO,SAAS,gBAAgB,OAA2C,WAAW,KAAa;AACjG,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,EAAG,QAAO,MAAM,KAAK;AAC5E,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO,OAAO,KAAK;AAC5E,SAAO;AACT;AAKO,MAAM,8BAAmE;AAAA,EAC9E,YAAY,EAAE,IAAI;AACpB;AAEO,MAAM,kCAA2E;AAAA,EACtF,YAAY,EAAE,IAAI;AACpB;AAEO,MAAM,+BAAqE;AAAA,EAChF,YAAY,EAAE,IAAI;AACpB;AAKO,MAAM,2BAA6D;AAAA,EACxE,YAAY,EAAE,IAAI;AACpB;AAEO,MAAM,6BAAiE;AAAA,EAC5E,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,cAAc,CAAC,SAAS;AAAA,IACtB,IAAI,IAAI,YAAY;AAAA,IACpB,gBAAgB,IAAI,YAAY;AAAA,IAChC,UAAU,IAAI,YAAY;AAAA,EAC5B;AACF;AAEO,MAAM,iCAAyE;AAAA,EACpF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,cAAc,CAAC,SAAS;AAAA,IACtB,IAAI,IAAI,YAAY;AAAA,IACpB,gBAAgB,IAAI,YAAY;AAAA,IAChC,UAAU,IAAI,YAAY;AAAA,EAC5B;AACF;AAEO,MAAM,8BAAmE;AAAA,EAC9E,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,cAAc,CAAC,SAAS;AAAA,IACtB,IAAI,IAAI,YAAY;AAAA,IACpB,gBAAgB,IAAI,YAAY;AAAA,IAChC,UAAU,IAAI,YAAY;AAAA,EAC5B;AACF;AAIO,MAAM,iCAAiC;AACvC,MAAM,qCAAqC;AAC3C,MAAM,kCAAkC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -10,10 +10,12 @@ import { Page, PageBody } from "@open-mercato/ui/backend/Page";
|
|
|
10
10
|
import { DataTable } from "@open-mercato/ui/backend/DataTable";
|
|
11
11
|
import { EmptyState } from "@open-mercato/ui/backend/EmptyState";
|
|
12
12
|
import { CrudForm } from "@open-mercato/ui/backend/CrudForm";
|
|
13
|
+
import { extractCustomFieldEntries } from "@open-mercato/shared/lib/crud/custom-fields-client";
|
|
13
14
|
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
14
15
|
import { useGuardedMutation } from "@open-mercato/ui/backend/injection/useGuardedMutation";
|
|
15
16
|
import { useConfirmDialog } from "@open-mercato/ui/backend/confirm-dialog";
|
|
16
17
|
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
18
|
+
import { collectCustomFieldValues } from "@open-mercato/ui/backend/utils/customFieldValues";
|
|
17
19
|
import { raiseCrudError } from "@open-mercato/ui/backend/utils/serverErrors";
|
|
18
20
|
import { Button } from "@open-mercato/ui/primitives/button";
|
|
19
21
|
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@open-mercato/ui/primitives/dialog";
|
|
@@ -50,7 +52,7 @@ const zoneFormSchema = z.object({
|
|
|
50
52
|
code: z.string().trim().min(1).max(80),
|
|
51
53
|
name: z.string().trim().min(1).max(200),
|
|
52
54
|
priority: z.coerce.number().int().min(0).optional()
|
|
53
|
-
});
|
|
55
|
+
}).passthrough();
|
|
54
56
|
function buildInventoryProfileFormSchema(fefoRequiredMsg) {
|
|
55
57
|
return z.object({
|
|
56
58
|
catalogProductId: z.string().uuid(),
|
|
@@ -428,19 +430,45 @@ function ZoneSection({ viewAllHref } = {}) {
|
|
|
428
430
|
return call.result ?? { items: [], total: 0, totalPages: 1 };
|
|
429
431
|
}
|
|
430
432
|
});
|
|
433
|
+
const warehouseOptionsQuery = useQuery({
|
|
434
|
+
queryKey: ["wms-config", "zones", "warehouse-options"],
|
|
435
|
+
queryFn: () => loadWarehouseOptions(),
|
|
436
|
+
enabled: dialog !== null,
|
|
437
|
+
staleTime: 3e4
|
|
438
|
+
});
|
|
439
|
+
const warehouseOptions = React.useMemo(
|
|
440
|
+
() => warehouseOptionsQuery.data ?? [],
|
|
441
|
+
[warehouseOptionsQuery.data]
|
|
442
|
+
);
|
|
443
|
+
const soleWarehouseId = warehouseOptions.length === 1 ? warehouseOptions[0].value : null;
|
|
444
|
+
const warehouseSeedOptions = React.useMemo(() => {
|
|
445
|
+
if (dialog?.mode === "edit") {
|
|
446
|
+
const warehouseId = dialog.row.warehouse_id;
|
|
447
|
+
if (!warehouseId) return void 0;
|
|
448
|
+
const label = dialog.row.warehouse_name?.trim() || dialog.row.warehouse_code?.trim() || "";
|
|
449
|
+
return label ? [{ value: warehouseId, label }] : void 0;
|
|
450
|
+
}
|
|
451
|
+
return soleWarehouseId ? warehouseOptions : void 0;
|
|
452
|
+
}, [dialog, soleWarehouseId, warehouseOptions]);
|
|
453
|
+
const loadZoneWarehouseOptions = React.useCallback(async (query2) => {
|
|
454
|
+
const term = query2?.trim();
|
|
455
|
+
if (!term) return warehouseOptionsQuery.data ?? loadWarehouseOptions();
|
|
456
|
+
return loadWarehouseOptions(term);
|
|
457
|
+
}, [warehouseOptionsQuery.data]);
|
|
431
458
|
const fields = React.useMemo(() => [
|
|
432
459
|
{
|
|
433
460
|
id: "warehouseId",
|
|
434
461
|
type: "combobox",
|
|
435
462
|
label: t("wms.backend.config.zones.form.warehouse", "Warehouse"),
|
|
436
463
|
required: true,
|
|
437
|
-
loadOptions:
|
|
438
|
-
allowCustomValues: false
|
|
464
|
+
loadOptions: loadZoneWarehouseOptions,
|
|
465
|
+
allowCustomValues: false,
|
|
466
|
+
seedOptions: warehouseSeedOptions
|
|
439
467
|
},
|
|
440
468
|
{ id: "code", type: "text", label: t("wms.backend.config.zones.form.code", "Code"), required: true },
|
|
441
469
|
{ id: "name", type: "text", label: t("wms.backend.config.zones.form.name", "Name"), required: true },
|
|
442
470
|
{ id: "priority", type: "number", label: t("wms.backend.config.zones.form.priority", "Priority") }
|
|
443
|
-
], [t]);
|
|
471
|
+
], [t, loadZoneWarehouseOptions, warehouseSeedOptions]);
|
|
444
472
|
const columns = React.useMemo(() => [
|
|
445
473
|
{
|
|
446
474
|
accessorKey: "name",
|
|
@@ -465,19 +493,22 @@ function ZoneSection({ viewAllHref } = {}) {
|
|
|
465
493
|
const initialValues = React.useMemo(() => {
|
|
466
494
|
if (dialog?.mode === "edit") {
|
|
467
495
|
return {
|
|
496
|
+
id: dialog.row.id,
|
|
497
|
+
updatedAt: dialog.row.updated_at ?? null,
|
|
468
498
|
warehouseId: dialog.row.warehouse_id || "",
|
|
469
499
|
code: dialog.row.code || "",
|
|
470
500
|
name: dialog.row.name || "",
|
|
471
|
-
priority: dialog.row.priority == null ? void 0 : Number(dialog.row.priority)
|
|
501
|
+
priority: dialog.row.priority == null ? void 0 : Number(dialog.row.priority),
|
|
502
|
+
...extractCustomFieldEntries(dialog.row)
|
|
472
503
|
};
|
|
473
504
|
}
|
|
474
505
|
return {
|
|
475
|
-
warehouseId: "",
|
|
506
|
+
warehouseId: soleWarehouseId ?? "",
|
|
476
507
|
code: "",
|
|
477
508
|
name: "",
|
|
478
509
|
priority: void 0
|
|
479
510
|
};
|
|
480
|
-
}, [dialog]);
|
|
511
|
+
}, [dialog, soleWarehouseId]);
|
|
481
512
|
const closeDialog = React.useCallback(() => {
|
|
482
513
|
setDialog(null);
|
|
483
514
|
setSubmitting(false);
|
|
@@ -490,10 +521,14 @@ function ZoneSection({ viewAllHref } = {}) {
|
|
|
490
521
|
const submitMode = dialog.mode;
|
|
491
522
|
setSubmitting(true);
|
|
492
523
|
try {
|
|
524
|
+
const customFields = collectCustomFieldValues(values);
|
|
493
525
|
const payload = {
|
|
494
|
-
|
|
526
|
+
warehouseId: values.warehouseId,
|
|
527
|
+
code: values.code,
|
|
528
|
+
name: values.name,
|
|
495
529
|
priority: values.priority === void 0 || Number.isNaN(values.priority) ? void 0 : Number(values.priority)
|
|
496
530
|
};
|
|
531
|
+
if (Object.keys(customFields).length) payload.customFields = customFields;
|
|
497
532
|
await runMutation({
|
|
498
533
|
operation: async () => {
|
|
499
534
|
const call = await apiCall(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/wms/components/backend/WmsConfigurationPage.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/wms/extension-points'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { z } from 'zod'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport type { SortingState } from '@tanstack/react-table'\nimport { useQuery, useQueryClient, type QueryClient } from '@tanstack/react-query'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { EmptyState } from '@open-mercato/ui/backend/EmptyState'\nimport { CrudForm, type CrudField, type CrudFieldOption } from '@open-mercato/ui/backend/CrudForm'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Boxes, Layers, MapPinned, Warehouse } from 'lucide-react'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n buildQuery,\n loadCatalogVariantOptions,\n loadWarehouseOptions,\n} from './wmsLookupLoaders'\nimport {\n createInventoryQuantityFormatter,\n formatCatalogProductLabel,\n formatCatalogVariantLabel,\n formatInventoryQuantity,\n inventoryRotationStrategyLabel,\n} from '../../lib/inventoryDisplayUi'\nimport { LocationEditDialog } from './LocationEditDialog'\nimport { useWmsInventoryMutationAccess } from './useWmsInventoryMutationAccess'\nimport { flashMutationError } from '../../lib/flashMutationError'\n\ntype PagedResponse<T> = {\n items: T[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n page?: number\n pageSize?: number\n}\n\ntype WarehouseRow = {\n id: string\n name?: string | null\n code?: string | null\n city?: string | null\n country?: string | null\n timezone?: string | null\n is_active?: boolean | null\n is_primary?: boolean | null\n}\n\ntype LocationRow = {\n id: string\n warehouse_id?: string | null\n warehouse_name?: string | null\n warehouse_code?: string | null\n code?: string | null\n type?: string | null\n capacity_units?: string | number | null\n capacity_weight?: string | number | null\n is_active?: boolean | null\n updated_at?: string | null\n}\n\ntype ZoneRow = {\n id: string\n warehouse_id?: string | null\n warehouse_name?: string | null\n warehouse_code?: string | null\n code?: string | null\n name?: string | null\n priority?: number | null\n}\n\ntype InventoryProfileRow = {\n id: string\n catalog_product_id?: string | null\n catalog_variant_id?: string | null\n product_title?: string | null\n product_sku?: string | null\n variant_name?: string | null\n variant_sku?: string | null\n default_uom?: string | null\n default_strategy?: string | null\n track_lot?: boolean | null\n track_serial?: boolean | null\n track_expiration?: boolean | null\n reorder_point?: string | number | null\n safety_stock?: string | number | null\n}\n\ntype WarehouseFormValues = {\n name: string\n code: string\n city?: string\n country?: string\n timezone?: string\n isActive: boolean\n isPrimary: boolean\n}\n\ntype ZoneFormValues = {\n warehouseId: string\n code: string\n name: string\n priority?: number\n}\n\ntype InventoryProfileFormValues = {\n catalogProductId: string\n catalogVariantId?: string\n defaultUom: string\n defaultStrategy: 'fifo' | 'lifo' | 'fefo'\n trackLot: boolean\n trackSerial: boolean\n trackExpiration: boolean\n reorderPoint?: number\n safetyStock?: number\n}\n\ntype DialogMode<T> =\n | { mode: 'create' }\n | { mode: 'edit'; row: T }\n\nconst warehouseFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n city: z.string().trim().optional(),\n country: z.string().trim().optional(),\n timezone: z.string().trim().optional(),\n isActive: z.boolean().default(true),\n isPrimary: z.boolean().default(false),\n})\n\nconst zoneFormSchema = z.object({\n warehouseId: z.string().uuid(),\n code: z.string().trim().min(1).max(80),\n name: z.string().trim().min(1).max(200),\n priority: z.coerce.number().int().min(0).optional(),\n})\n\nfunction buildInventoryProfileFormSchema(fefoRequiredMsg: string) {\n return z.object({\n catalogProductId: z.string().uuid(),\n catalogVariantId: z.string().uuid().optional().or(z.literal('')),\n defaultUom: z.string().trim().min(1),\n defaultStrategy: z.enum(['fifo', 'lifo', 'fefo']),\n trackLot: z.boolean().default(false),\n trackSerial: z.boolean().default(false),\n trackExpiration: z.boolean().default(false),\n reorderPoint: z.coerce.number().min(0).optional(),\n safetyStock: z.coerce.number().min(0).optional(),\n }).superRefine((payload, ctx) => {\n if (payload.trackExpiration && payload.defaultStrategy !== 'fefo') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['defaultStrategy'],\n message: fefoRequiredMsg,\n })\n }\n })\n}\n\nconst STRATEGY_OPTIONS: CrudFieldOption[] = [\n { value: 'fifo', label: 'FIFO' },\n { value: 'lifo', label: 'LIFO' },\n { value: 'fefo', label: 'FEFO' },\n]\n\n/** Merge a newly created row into all cached warehouse list queries so the table updates immediately (refetch can lag or match stale HTTP cache). */\nfunction mergeCreatedWarehouseIntoWarehousesCaches(\n queryClient: QueryClient,\n newId: string,\n values: WarehouseFormValues,\n) {\n const row: WarehouseRow = {\n id: newId,\n name: values.name,\n code: values.code,\n city: values.city || null,\n country: values.country || null,\n timezone: values.timezone || null,\n is_active: values.isActive,\n is_primary: values.isPrimary,\n }\n const haystack = `${values.name}\\n${values.code}`.toLowerCase()\n\n const entries = queryClient.getQueriesData<PagedResponse<WarehouseRow>>({\n queryKey: ['wms-config', 'warehouses'],\n exact: false,\n })\n for (const [key, old] of entries) {\n if (!old || !Array.isArray(old.items)) continue\n if (old.items.some((r: WarehouseRow) => r.id === newId)) continue\n\n const paramStr = Array.isArray(key) && typeof key[2] === 'string' ? key[2] : ''\n const sp = new URLSearchParams(paramStr)\n const searchTerm = (sp.get('search') || '').trim().toLowerCase()\n if (searchTerm && !haystack.includes(searchTerm)) continue\n\n const pageSize = typeof old.pageSize === 'number' && old.pageSize > 0 ? old.pageSize : 10\n const nextTotal = (old.total ?? 0) + 1\n queryClient.setQueryData<PagedResponse<WarehouseRow>>(key, {\n ...old,\n items: [row, ...old.items.filter((r: WarehouseRow) => r.id !== newId)].slice(0, pageSize),\n total: nextTotal,\n totalPages: Math.max(1, Math.ceil(nextTotal / pageSize)),\n })\n }\n}\n\nasync function loadCatalogProductOptions(query?: string): Promise<CrudFieldOption[]> {\n const params = buildQuery({ page: 1, pageSize: 25, search: query?.trim() || undefined })\n const call = await apiCall<PagedResponse<{ id?: string | null; title?: string | null; sku?: string | null }>>(`/api/catalog/products?${params}`)\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const label = item.title || item.sku || value\n return { value, label }\n })\n .filter((option): option is CrudFieldOption => option !== null)\n}\n\nfunction SectionCard({\n title,\n description,\n icon,\n viewAllHref,\n viewAllLabel,\n children,\n}: {\n title: string\n description: string\n icon: React.ReactNode\n viewAllHref?: string\n viewAllLabel?: string\n children: React.ReactNode\n}) {\n return (\n <section className=\"rounded-lg border bg-card p-5 text-card-foreground shadow-sm\">\n <div className=\"mb-4 flex items-start gap-3\">\n <div className=\"rounded-md border bg-muted/40 p-2 text-muted-foreground\">{icon}</div>\n <div className=\"flex flex-1 items-start justify-between gap-2\">\n <div className=\"space-y-1\">\n <h2 className=\"text-xl font-semibold\">{title}</h2>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n {viewAllHref && (\n <Link href={viewAllHref} className=\"shrink-0 text-sm font-medium text-primary hover:underline\">\n {viewAllLabel}\n </Link>\n )}\n </div>\n </div>\n {children}\n </section>\n )\n}\n\ntype ConfigSectionOptions = {\n /** When set, show a \"View all\" link to the standalone list page. Omit on that list page itself. */\n viewAllHref?: string\n}\n\nexport function WarehouseSection({ viewAllHref }: ConfigSectionOptions = {}) {\n const t = useT()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-warehouses' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'updatedAt', desc: true }])\n const [submitting, setSubmitting] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogMode<WarehouseRow> | null>(null)\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n search: search.trim() || undefined,\n sortField: sortCol ? sortCol.id : 'updatedAt',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'desc',\n })\n }, [page, search, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'warehouses', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<WarehouseRow>>(`/api/wms/warehouses?${params}`, {\n cache: 'no-store',\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.warehouses.errors.load', 'Failed to load warehouses.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', type: 'text', label: t('wms.backend.config.warehouses.form.name', 'Name'), required: true },\n { id: 'code', type: 'text', label: t('wms.backend.config.warehouses.form.code', 'Code'), required: true },\n { id: 'city', type: 'text', label: t('wms.backend.config.warehouses.form.city', 'City') },\n { id: 'country', type: 'text', label: t('wms.backend.config.warehouses.form.country', 'Country') },\n { id: 'timezone', type: 'text', label: t('wms.backend.config.warehouses.form.timezone', 'Timezone') },\n { id: 'isPrimary', type: 'checkbox', label: t('wms.backend.config.warehouses.form.primary', 'Primary warehouse') },\n { id: 'isActive', type: 'checkbox', label: t('wms.backend.config.warehouses.form.active', 'Active') },\n ], [t])\n\n const columns = React.useMemo<ColumnDef<WarehouseRow>[]>(() => [\n {\n accessorKey: 'name',\n header: t('wms.backend.config.warehouses.columns.name', 'Warehouse'),\n enableSorting: true,\n cell: ({ row }) => row.original.name || row.original.code || row.original.id,\n },\n { accessorKey: 'code', header: t('wms.backend.config.warehouses.columns.code', 'Code'), enableSorting: true },\n { accessorKey: 'city', header: t('wms.backend.config.warehouses.columns.city', 'City'), cell: ({ row }) => row.original.city || '\u2014' },\n { accessorKey: 'country', header: t('wms.backend.config.warehouses.columns.country', 'Country'), cell: ({ row }) => row.original.country || '\u2014' },\n {\n accessorKey: 'is_primary',\n header: t('wms.backend.config.warehouses.columns.primary', 'Primary'),\n cell: ({ row }) =>\n row.original.is_primary\n ? t('wms.backend.config.warehouses.primary.yes', 'Primary')\n : '\u2014',\n },\n {\n accessorKey: 'is_active',\n header: t('wms.backend.config.warehouses.columns.status', 'Status'),\n cell: ({ row }) =>\n row.original.is_active === false\n ? t('wms.common.inactive', 'Inactive')\n : t('wms.common.active', 'Active'),\n },\n ], [t])\n\n const initialValues = React.useMemo<WarehouseFormValues>(() => {\n if (dialog?.mode === 'edit') {\n return {\n name: dialog.row.name || '',\n code: dialog.row.code || '',\n city: dialog.row.city || '',\n country: dialog.row.country || '',\n timezone: dialog.row.timezone || '',\n isActive: dialog.row.is_active !== false,\n isPrimary: dialog.row.is_primary === true,\n }\n }\n return {\n name: '',\n code: '',\n city: '',\n country: '',\n timezone: '',\n isActive: true,\n isPrimary: false,\n }\n }, [dialog])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setSubmitting(false)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.cancelQueries({ queryKey: ['wms-config', 'warehouses'] })\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'warehouses'] })\n await queryClient.refetchQueries({ queryKey: ['wms-config', 'warehouses'], type: 'all' })\n }, [queryClient])\n\n const handleSubmit = React.useCallback(async (values: WarehouseFormValues) => {\n if (!dialog) return\n const submitMode = dialog.mode\n setSubmitting(true)\n try {\n const call = await runMutation({\n operation: async () => {\n const result = await apiCall<{ id?: string | null }>(\n '/api/wms/warehouses',\n {\n method: submitMode === 'edit' ? 'PUT' : 'POST',\n body: JSON.stringify(\n submitMode === 'edit'\n ? { id: dialog.row.id, ...values }\n : values,\n ),\n },\n )\n if (!result.ok) {\n await raiseCrudError(result.response, t('wms.backend.config.warehouses.errors.save', 'Failed to save warehouse.'))\n }\n return result\n },\n context: {},\n mutationPayload: submitMode === 'edit' ? { id: dialog.row.id, ...values } : values,\n })\n flash(\n submitMode === 'edit'\n ? t('wms.backend.config.warehouses.flash.updated', 'Warehouse updated')\n : t('wms.backend.config.warehouses.flash.created', 'Warehouse created'),\n 'success',\n )\n\n const createdId =\n submitMode === 'create' &&\n call?.result &&\n typeof call.result === 'object' &&\n typeof (call.result as { id?: unknown }).id === 'string'\n ? (call.result as { id: string }).id.trim()\n : null\n\n closeDialog()\n\n if (submitMode === 'create' && createdId) {\n mergeCreatedWarehouseIntoWarehousesCaches(queryClient, createdId, values)\n setSearch('')\n setPage(1)\n }\n\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.warehouses.errors.save', 'Failed to save warehouse.'), t)\n setSubmitting(false)\n }\n }, [closeDialog, dialog, queryClient, refresh, runMutation, t])\n\n const handleDelete = React.useCallback(async (row: WarehouseRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.warehouses.confirmDelete', 'Archive warehouse \"{name}\"?', {\n name: row.name || row.code || row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/warehouses?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.warehouses.errors.delete', 'Failed to archive warehouse.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.warehouses.flash.deleted', 'Warehouse archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.warehouses.errors.delete', 'Failed to archive warehouse.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.warehouses.title', 'Warehouses')}\n description={t('wms.backend.config.warehouses.description', 'Manage the high-level warehouse nodes used by WMS reservations and inventory movements.')}\n icon={<Warehouse className=\"size-5\" />}\n viewAllHref={viewAllHref}\n viewAllLabel={viewAllHref ? t('wms.backend.config.viewAll', 'View all \u2192') : undefined}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.warehouses.title', 'Warehouses')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.warehouses.errors.load', 'Failed to load warehouses.') : null}\n entityId={E.wms.warehouse}\n searchValue={search}\n onSearchChange={(value) => {\n setSearch(value)\n setPage(1)\n }}\n searchPlaceholder={t('wms.backend.config.warehouses.search', 'Search warehouses')}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManageWarehouses ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addWarehouse', 'Add warehouse')}\n </Button>\n ) : null}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.warehousesTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.warehouses.empty.title', 'No warehouses')}\n description={t('wms.backend.config.warehouses.empty.description', 'Create the first warehouse to expose topology and inventory assignment in WMS.')}\n action={access.canManageWarehouses ? { label: t('wms.backend.config.actions.addWarehouse', 'Add warehouse'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit'\n ? t('wms.backend.config.warehouses.dialog.edit', 'Edit warehouse')\n : t('wms.backend.config.warehouses.dialog.create', 'Create warehouse')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<WarehouseFormValues>\n schema={warehouseFormSchema}\n fields={fields}\n entityId={E.wms.warehouse}\n initialValues={initialValues}\n submitLabel={t('common.save', 'Save')}\n onSubmit={handleSubmit}\n embedded\n isLoading={submitting}\n twoColumn\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport function ZoneSection({ viewAllHref }: ConfigSectionOptions = {}) {\n const t = useT()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-zones' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'priority', desc: false }])\n const [submitting, setSubmitting] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogMode<ZoneRow> | null>(null)\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n search: search.trim() || undefined,\n sortField: sortCol ? sortCol.id : 'priority',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'asc',\n })\n }, [page, search, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'zones', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<ZoneRow>>(`/api/wms/zones?${params}`, {\n cache: 'no-store',\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.zones.errors.load', 'Failed to load zones.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'warehouseId',\n type: 'combobox',\n label: t('wms.backend.config.zones.form.warehouse', 'Warehouse'),\n required: true,\n loadOptions: loadWarehouseOptions,\n allowCustomValues: false,\n },\n { id: 'code', type: 'text', label: t('wms.backend.config.zones.form.code', 'Code'), required: true },\n { id: 'name', type: 'text', label: t('wms.backend.config.zones.form.name', 'Name'), required: true },\n { id: 'priority', type: 'number', label: t('wms.backend.config.zones.form.priority', 'Priority') },\n ], [t])\n\n const columns = React.useMemo<ColumnDef<ZoneRow>[]>(() => [\n {\n accessorKey: 'name',\n header: t('wms.backend.config.zones.columns.name', 'Zone'),\n enableSorting: true,\n cell: ({ row }) => row.original.name || row.original.code || row.original.id,\n },\n { accessorKey: 'code', header: t('wms.backend.config.zones.columns.code', 'Code'), enableSorting: true },\n {\n accessorKey: 'warehouse_name',\n header: t('wms.backend.config.zones.columns.warehouse', 'Warehouse'),\n enableSorting: false,\n cell: ({ row }) =>\n row.original.warehouse_name\n || row.original.warehouse_code\n || row.original.warehouse_id\n || '\u2014',\n },\n {\n accessorKey: 'priority',\n header: t('wms.backend.config.zones.columns.priority', 'Priority'),\n enableSorting: true,\n cell: ({ row }) => (row.original.priority == null ? '\u2014' : String(row.original.priority)),\n },\n ], [t])\n\n const initialValues = React.useMemo<ZoneFormValues>(() => {\n if (dialog?.mode === 'edit') {\n return {\n warehouseId: dialog.row.warehouse_id || '',\n code: dialog.row.code || '',\n name: dialog.row.name || '',\n priority: dialog.row.priority == null ? undefined : Number(dialog.row.priority),\n }\n }\n return {\n warehouseId: '',\n code: '',\n name: '',\n priority: undefined,\n }\n }, [dialog])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setSubmitting(false)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'zones'] })\n }, [queryClient])\n\n const handleSubmit = React.useCallback(async (values: ZoneFormValues) => {\n if (!dialog) return\n const submitMode = dialog.mode\n setSubmitting(true)\n try {\n const payload = {\n ...values,\n priority: values.priority === undefined || Number.isNaN(values.priority) ? undefined : Number(values.priority),\n }\n await runMutation({\n operation: async () => {\n const call = await apiCall(\n '/api/wms/zones',\n {\n method: submitMode === 'edit' ? 'PUT' : 'POST',\n body: JSON.stringify(submitMode === 'edit' ? { id: dialog.row.id, ...payload } : payload),\n },\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.zones.errors.save', 'Failed to save zone.'))\n }\n return call\n },\n context: {},\n mutationPayload: submitMode === 'edit' ? { id: dialog.row.id, ...payload } : payload,\n })\n flash(\n submitMode === 'edit'\n ? t('wms.backend.config.zones.flash.updated', 'Zone updated')\n : t('wms.backend.config.zones.flash.created', 'Zone created'),\n 'success',\n )\n closeDialog()\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.zones.errors.save', 'Failed to save zone.'), t)\n setSubmitting(false)\n }\n }, [closeDialog, dialog, refresh, runMutation, t])\n\n const handleDelete = React.useCallback(async (row: ZoneRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.zones.confirmDelete', 'Archive zone \"{name}\"?', {\n name: row.name || row.code || row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/zones?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.zones.errors.delete', 'Failed to archive zone.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.zones.flash.deleted', 'Zone archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.zones.errors.delete', 'Failed to archive zone.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.zones.title', 'Zones')}\n description={t('wms.backend.config.zones.description', 'Group locations into functional zones (e.g. receiving, pick face, bulk) to drive routing and priority.')}\n icon={<Layers className=\"size-5\" />}\n viewAllHref={viewAllHref}\n viewAllLabel={viewAllHref ? t('wms.backend.config.viewAll', 'View all \u2192') : undefined}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.zones.title', 'Zones')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.zones.errors.load', 'Failed to load zones.') : null}\n entityId={E.wms.warehouse_zone}\n searchValue={search}\n onSearchChange={(value) => {\n setSearch(value)\n setPage(1)\n }}\n searchPlaceholder={t('wms.backend.config.zones.search', 'Search zones')}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManageZones ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addZone', 'Add zone')}\n </Button>\n ) : null}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.zonesTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.zones.empty.title', 'No zones')}\n description={t('wms.backend.config.zones.empty.description', 'Zones group locations into functional areas to drive picking priority and routing rules.')}\n action={access.canManageZones ? { label: t('wms.backend.config.actions.addZone', 'Add zone'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit'\n ? t('wms.backend.config.zones.dialog.edit', 'Edit zone')\n : t('wms.backend.config.zones.dialog.create', 'Create zone')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<ZoneFormValues>\n schema={zoneFormSchema}\n fields={fields}\n entityId={E.wms.warehouse_zone}\n initialValues={initialValues}\n submitLabel={t('common.save', 'Save')}\n onSubmit={handleSubmit}\n embedded\n isLoading={submitting}\n twoColumn\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport function LocationSection({ viewAllHref }: ConfigSectionOptions = {}) {\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-locations' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'updatedAt', desc: true }])\n const [dialog, setDialog] = React.useState<DialogMode<LocationRow> | null>(null)\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n search: search.trim() || undefined,\n sortField: sortCol ? sortCol.id : 'updatedAt',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'desc',\n })\n }, [page, search, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'locations', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<LocationRow>>(`/api/wms/locations?${params}`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.locations.errors.load', 'Failed to load locations.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const columns = React.useMemo<ColumnDef<LocationRow>[]>(() => [\n {\n accessorKey: 'code',\n header: t('wms.backend.config.locations.columns.code', 'Location'),\n enableSorting: true,\n cell: ({ row }) => {\n const locationId = row.original.id?.trim()\n const code = row.original.code || '\u2014'\n if (!locationId) return code\n return (\n <Link\n href={`/backend/wms/location/${encodeURIComponent(locationId)}`}\n className=\"font-medium text-primary hover:underline\"\n >\n {code}\n </Link>\n )\n },\n },\n { accessorKey: 'type', header: t('wms.backend.config.locations.columns.type', 'Type'), enableSorting: true, cell: ({ row }) => row.original.type || '\u2014' },\n {\n accessorKey: 'warehouse_name',\n header: t('wms.backend.config.locations.columns.warehouse', 'Warehouse'),\n enableSorting: false,\n cell: ({ row }) =>\n row.original.warehouse_name\n || row.original.warehouse_code\n || row.original.warehouse_id\n || '\u2014',\n },\n { accessorKey: 'capacity_units', header: t('wms.backend.config.locations.columns.capacityUnits', 'Capacity units'), cell: ({ row }) => String(row.original.capacity_units ?? '\u2014') },\n {\n accessorKey: 'is_active',\n header: t('wms.backend.config.locations.columns.status', 'Status'),\n cell: ({ row }) =>\n row.original.is_active === false\n ? t('wms.common.inactive', 'Inactive')\n : t('wms.common.active', 'Active'),\n },\n ], [t])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'locations'] })\n }, [queryClient])\n\n const handleDelete = React.useCallback(async (row: LocationRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.locations.confirmDelete', 'Archive location \"{code}\"?', {\n code: row.code || row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/locations?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.locations.errors.delete', 'Failed to archive location.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.locations.flash.deleted', 'Location archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.locations.errors.delete', 'Failed to archive location.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.locations.title', 'Locations')}\n description={t('wms.backend.config.locations.description', 'Maintain aisle/bin/dock level topology buckets that hold operational inventory.')}\n icon={<MapPinned className=\"size-5\" />}\n viewAllHref={viewAllHref}\n viewAllLabel={viewAllHref ? t('wms.backend.config.viewAll', 'View all \u2192') : undefined}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.locations.title', 'Locations')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.locations.errors.load', 'Failed to load locations.') : null}\n entityId={E.wms.warehouse_location}\n searchValue={search}\n onSearchChange={(value) => {\n setSearch(value)\n setPage(1)\n }}\n searchPlaceholder={t('wms.backend.config.locations.search', 'Search locations')}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManageLocations ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addLocation', 'Add location')}\n </Button>\n ) : null}\n onRowClick={(row) => {\n const locationId = row.id?.trim()\n if (locationId) {\n router.push(`/backend/wms/location/${encodeURIComponent(locationId)}`)\n }\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.locationsTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.locations.empty.title', 'No locations')}\n description={t('wms.backend.config.locations.empty.description', 'Create locations to define the buckets used by balances, reservations, and movement ledger rows.')}\n action={access.canManageLocations ? { label: t('wms.backend.config.actions.addLocation', 'Add location'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <LocationEditDialog\n open={dialog !== null}\n onOpenChange={(next) => !next && closeDialog()}\n mode={dialog?.mode ?? 'create'}\n row={dialog?.mode === 'edit' ? dialog.row : null}\n onSaved={refresh}\n />\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport function InventoryProfilesSection() {\n const t = useT()\n const locale = useLocale()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-profiles' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'updatedAt', desc: true }])\n const [submitting, setSubmitting] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogMode<InventoryProfileRow> | null>(null)\n const inventoryProfileFormSchema = React.useMemo(\n () => buildInventoryProfileFormSchema(t('wms.backend.config.profiles.validation.fefoRequired', 'FEFO is required when expiration tracking is enabled.')),\n [t],\n )\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n sortField: sortCol ? sortCol.id : 'updatedAt',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'desc',\n })\n }, [page, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'inventory-profiles', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<InventoryProfileRow>>(`/api/wms/inventory-profiles?${params}`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.profiles.errors.load', 'Failed to load inventory profiles.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'catalogProductId',\n type: 'combobox',\n label: t('wms.backend.config.profiles.form.product', 'Product'),\n required: true,\n loadOptions: loadCatalogProductOptions,\n allowCustomValues: false,\n },\n {\n id: 'catalogVariantId',\n type: 'combobox',\n label: t('wms.backend.config.profiles.form.variant', 'Variant'),\n loadOptions: loadCatalogVariantOptions,\n allowCustomValues: false,\n },\n { id: 'defaultUom', type: 'text', label: t('wms.backend.config.profiles.form.uom', 'Default UOM'), required: true },\n {\n id: 'defaultStrategy',\n type: 'select',\n label: t('wms.backend.config.profiles.form.strategy', 'Rotation strategy'),\n required: true,\n options: STRATEGY_OPTIONS,\n },\n { id: 'reorderPoint', type: 'number', label: t('wms.backend.config.profiles.form.reorderPoint', 'Reorder point') },\n { id: 'safetyStock', type: 'number', label: t('wms.backend.config.profiles.form.safetyStock', 'Safety stock') },\n { id: 'trackLot', type: 'checkbox', label: t('wms.backend.config.profiles.form.trackLot', 'Track lots') },\n { id: 'trackSerial', type: 'checkbox', label: t('wms.backend.config.profiles.form.trackSerial', 'Track serials') },\n { id: 'trackExpiration', type: 'checkbox', label: t('wms.backend.config.profiles.form.trackExpiration', 'Track expiration') },\n ], [t])\n\n const quantityFormatter = React.useMemo(\n () => createInventoryQuantityFormatter(locale),\n [locale],\n )\n\n const columns = React.useMemo<ColumnDef<InventoryProfileRow>[]>(() => [\n {\n accessorKey: 'catalog_product_id',\n header: t('wms.backend.config.profiles.columns.product', 'Product'),\n cell: ({ row }) => formatCatalogProductLabel(row.original),\n },\n {\n accessorKey: 'catalog_variant_id',\n header: t('wms.backend.config.profiles.columns.variant', 'Variant'),\n cell: ({ row }) => {\n if (!row.original.catalog_variant_id?.trim()) {\n return t('wms.backend.config.profiles.allVariants', 'All variants')\n }\n return formatCatalogVariantLabel(row.original)\n },\n },\n { accessorKey: 'default_uom', header: t('wms.backend.config.profiles.columns.uom', 'UOM'), cell: ({ row }) => row.original.default_uom || '\u2014' },\n {\n accessorKey: 'default_strategy',\n id: 'defaultStrategy',\n header: t('wms.backend.config.profiles.columns.strategy', 'Strategy'),\n enableSorting: true,\n cell: ({ row }) => {\n const strategy = row.original.default_strategy?.trim()\n if (!strategy) return '\u2014'\n return inventoryRotationStrategyLabel(strategy, t)\n },\n },\n {\n accessorKey: 'reorder_point',\n id: 'reorderPoint',\n header: t('wms.backend.config.profiles.columns.reorderPoint', 'Reorder point'),\n enableSorting: true,\n cell: ({ row }) => (\n <span className=\"tabular-nums\">\n {formatInventoryQuantity(row.original.reorder_point, quantityFormatter)}\n </span>\n ),\n },\n {\n accessorKey: 'safety_stock',\n id: 'safetyStock',\n header: t('wms.backend.config.profiles.columns.safetyStock', 'Safety stock'),\n enableSorting: true,\n cell: ({ row }) => (\n <span className=\"tabular-nums\">\n {formatInventoryQuantity(row.original.safety_stock, quantityFormatter)}\n </span>\n ),\n },\n ], [quantityFormatter, t])\n\n const initialValues = React.useMemo<InventoryProfileFormValues>(() => {\n if (dialog?.mode === 'edit') {\n return {\n catalogProductId: dialog.row.catalog_product_id || '',\n catalogVariantId: dialog.row.catalog_variant_id || '',\n defaultUom: dialog.row.default_uom || '',\n defaultStrategy: (dialog.row.default_strategy as InventoryProfileFormValues['defaultStrategy']) || 'fifo',\n trackLot: dialog.row.track_lot === true,\n trackSerial: dialog.row.track_serial === true,\n trackExpiration: dialog.row.track_expiration === true,\n reorderPoint: dialog.row.reorder_point == null ? undefined : Number(dialog.row.reorder_point),\n safetyStock: dialog.row.safety_stock == null ? undefined : Number(dialog.row.safety_stock),\n }\n }\n return {\n catalogProductId: '',\n catalogVariantId: '',\n defaultUom: 'pcs',\n defaultStrategy: 'fifo',\n trackLot: false,\n trackSerial: false,\n trackExpiration: false,\n reorderPoint: 0,\n safetyStock: 0,\n }\n }, [dialog])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setSubmitting(false)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'inventory-profiles'] })\n }, [queryClient])\n\n const handleSubmit = React.useCallback(async (values: InventoryProfileFormValues) => {\n setSubmitting(true)\n try {\n const payload = {\n ...values,\n catalogVariantId: values.catalogVariantId?.trim() ? values.catalogVariantId : null,\n }\n await runMutation({\n operation: async () => {\n const call = await apiCall(\n '/api/wms/inventory-profiles',\n {\n method: dialog?.mode === 'edit' ? 'PUT' : 'POST',\n body: JSON.stringify(dialog?.mode === 'edit' ? { id: dialog.row.id, ...payload } : payload),\n },\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.profiles.errors.save', 'Failed to save inventory profile.'))\n }\n return call\n },\n context: {},\n mutationPayload: dialog?.mode === 'edit' ? { id: dialog.row.id, ...payload } : payload,\n })\n flash(\n dialog?.mode === 'edit'\n ? t('wms.backend.config.profiles.flash.updated', 'Inventory profile updated')\n : t('wms.backend.config.profiles.flash.created', 'Inventory profile created'),\n 'success',\n )\n closeDialog()\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.profiles.errors.save', 'Failed to save inventory profile.'), t)\n setSubmitting(false)\n }\n }, [closeDialog, dialog, refresh, runMutation, t])\n\n const handleDelete = React.useCallback(async (row: InventoryProfileRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.profiles.confirmDelete', 'Archive inventory profile \"{id}\"?', {\n id: row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/inventory-profiles?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.profiles.errors.delete', 'Failed to archive inventory profile.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.profiles.flash.deleted', 'Inventory profile archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.profiles.errors.delete', 'Failed to archive inventory profile.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.profiles.title', 'Inventory profiles')}\n description={t('wms.backend.config.profiles.description', 'Configure tracking strategy, reorder thresholds, and lot/serial behavior per product scope.')}\n icon={<Boxes className=\"size-5\" />}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.profiles.title', 'Inventory profiles')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.profiles.errors.load', 'Failed to load inventory profiles.') : null}\n entityId={E.wms.product_inventory_profile}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManage ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addProfile', 'Add profile')}\n </Button>\n ) : null}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.inventoryProfilesTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.profiles.empty.title', 'No inventory profiles')}\n description={t('wms.backend.config.profiles.empty.description', 'Create profiles to control reservation strategy, lot/serial tracking, and low-stock thresholds.')}\n action={access.canManage ? { label: t('wms.backend.config.actions.addProfile', 'Add profile'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit'\n ? t('wms.backend.config.profiles.dialog.edit', 'Edit inventory profile')\n : t('wms.backend.config.profiles.dialog.create', 'Create inventory profile')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<InventoryProfileFormValues>\n schema={inventoryProfileFormSchema}\n fields={fields}\n entityId={E.wms.product_inventory_profile}\n initialValues={initialValues}\n submitLabel={t('common.save', 'Save')}\n onSubmit={handleSubmit}\n embedded\n isLoading={submitting}\n twoColumn\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport default function WmsConfigurationPage() {\n const t = useT()\n\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n <section className=\"rounded-lg border bg-card p-5 text-card-foreground shadow-sm\">\n <div className=\"space-y-1\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('wms.backend.config.title', 'WMS configuration')}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('wms.backend.config.description', 'Phase-1 operational configuration for warehouses, storage locations, and inventory tracking policies.')}\n </p>\n </div>\n </section>\n <WarehouseSection viewAllHref=\"/backend/wms/warehouses\" />\n <ZoneSection viewAllHref=\"/backend/wms/zones\" />\n <LocationSection viewAllHref=\"/backend/wms/locations\" />\n <InventoryProfilesSection />\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/wms/extension-points'\nimport Link from 'next/link'\nimport { useRouter } from 'next/navigation'\nimport { z } from 'zod'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport type { SortingState } from '@tanstack/react-table'\nimport { useQuery, useQueryClient, type QueryClient } from '@tanstack/react-query'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { EmptyState } from '@open-mercato/ui/backend/EmptyState'\nimport { CrudForm, type CrudField, type CrudFieldOption } from '@open-mercato/ui/backend/CrudForm'\nimport { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Boxes, Layers, MapPinned, Warehouse } from 'lucide-react'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n buildQuery,\n loadCatalogVariantOptions,\n loadWarehouseOptions,\n} from './wmsLookupLoaders'\nimport {\n createInventoryQuantityFormatter,\n formatCatalogProductLabel,\n formatCatalogVariantLabel,\n formatInventoryQuantity,\n inventoryRotationStrategyLabel,\n} from '../../lib/inventoryDisplayUi'\nimport { LocationEditDialog } from './LocationEditDialog'\nimport { useWmsInventoryMutationAccess } from './useWmsInventoryMutationAccess'\nimport { flashMutationError } from '../../lib/flashMutationError'\n\ntype PagedResponse<T> = {\n items: T[]\n total: number\n totalPages: number\n totalIsCapped?: boolean\n page?: number\n pageSize?: number\n}\n\ntype WarehouseRow = {\n id: string\n name?: string | null\n code?: string | null\n city?: string | null\n country?: string | null\n timezone?: string | null\n is_active?: boolean | null\n is_primary?: boolean | null\n}\n\ntype LocationRow = {\n id: string\n warehouse_id?: string | null\n warehouse_name?: string | null\n warehouse_code?: string | null\n code?: string | null\n type?: string | null\n capacity_units?: string | number | null\n capacity_weight?: string | number | null\n is_active?: boolean | null\n updated_at?: string | null\n}\n\ntype ZoneRow = {\n id: string\n warehouse_id?: string | null\n warehouse_name?: string | null\n warehouse_code?: string | null\n code?: string | null\n name?: string | null\n priority?: number | null\n updated_at?: string | null\n // The zones list route decorates with `stripPrefixedKeys: true`, so custom values\n // arrive only under this canonical key \u2014 never as top-level `cf_*` / `cf:*`.\n customValues?: Record<string, unknown> | null\n customFields?: Array<{ key: string; label: string | null; value: unknown; kind: string | null; multi: boolean }>\n}\n\ntype InventoryProfileRow = {\n id: string\n catalog_product_id?: string | null\n catalog_variant_id?: string | null\n product_title?: string | null\n product_sku?: string | null\n variant_name?: string | null\n variant_sku?: string | null\n default_uom?: string | null\n default_strategy?: string | null\n track_lot?: boolean | null\n track_serial?: boolean | null\n track_expiration?: boolean | null\n reorder_point?: string | number | null\n safety_stock?: string | number | null\n}\n\ntype WarehouseFormValues = {\n name: string\n code: string\n city?: string\n country?: string\n timezone?: string\n isActive: boolean\n isPrimary: boolean\n}\n\n// `id` / `updatedAt` are carried in edit mode so CrudForm recognises the form as an edit\n// and derives the optimistic-lock header; the `cf_` index signature holds the values\n// collected from the injected custom-field inputs.\ntype ZoneFormValues = {\n warehouseId: string\n code: string\n name: string\n priority?: number\n id?: string\n updatedAt?: string | null\n} & { [key: `cf_${string}`]: unknown }\n\ntype InventoryProfileFormValues = {\n catalogProductId: string\n catalogVariantId?: string\n defaultUom: string\n defaultStrategy: 'fifo' | 'lifo' | 'fefo'\n trackLot: boolean\n trackSerial: boolean\n trackExpiration: boolean\n reorderPoint?: number\n safetyStock?: number\n}\n\ntype DialogMode<T> =\n | { mode: 'create' }\n | { mode: 'edit'; row: T }\n\nconst warehouseFormSchema = z.object({\n name: z.string().trim().min(1),\n code: z.string().trim().min(1),\n city: z.string().trim().optional(),\n country: z.string().trim().optional(),\n timezone: z.string().trim().optional(),\n isActive: z.boolean().default(true),\n isPrimary: z.boolean().default(false),\n})\n\n// passthrough so CrudForm's schema.safeParse keeps the `cf_*` custom field values\n// it collected from the injected custom-field inputs \u2014 a plain z.object strips them\n// before onSubmit ever sees them.\nconst zoneFormSchema = z.object({\n warehouseId: z.string().uuid(),\n code: z.string().trim().min(1).max(80),\n name: z.string().trim().min(1).max(200),\n priority: z.coerce.number().int().min(0).optional(),\n}).passthrough()\n\nfunction buildInventoryProfileFormSchema(fefoRequiredMsg: string) {\n return z.object({\n catalogProductId: z.string().uuid(),\n catalogVariantId: z.string().uuid().optional().or(z.literal('')),\n defaultUom: z.string().trim().min(1),\n defaultStrategy: z.enum(['fifo', 'lifo', 'fefo']),\n trackLot: z.boolean().default(false),\n trackSerial: z.boolean().default(false),\n trackExpiration: z.boolean().default(false),\n reorderPoint: z.coerce.number().min(0).optional(),\n safetyStock: z.coerce.number().min(0).optional(),\n }).superRefine((payload, ctx) => {\n if (payload.trackExpiration && payload.defaultStrategy !== 'fefo') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['defaultStrategy'],\n message: fefoRequiredMsg,\n })\n }\n })\n}\n\nconst STRATEGY_OPTIONS: CrudFieldOption[] = [\n { value: 'fifo', label: 'FIFO' },\n { value: 'lifo', label: 'LIFO' },\n { value: 'fefo', label: 'FEFO' },\n]\n\n/** Merge a newly created row into all cached warehouse list queries so the table updates immediately (refetch can lag or match stale HTTP cache). */\nfunction mergeCreatedWarehouseIntoWarehousesCaches(\n queryClient: QueryClient,\n newId: string,\n values: WarehouseFormValues,\n) {\n const row: WarehouseRow = {\n id: newId,\n name: values.name,\n code: values.code,\n city: values.city || null,\n country: values.country || null,\n timezone: values.timezone || null,\n is_active: values.isActive,\n is_primary: values.isPrimary,\n }\n const haystack = `${values.name}\\n${values.code}`.toLowerCase()\n\n const entries = queryClient.getQueriesData<PagedResponse<WarehouseRow>>({\n queryKey: ['wms-config', 'warehouses'],\n exact: false,\n })\n for (const [key, old] of entries) {\n if (!old || !Array.isArray(old.items)) continue\n if (old.items.some((r: WarehouseRow) => r.id === newId)) continue\n\n const paramStr = Array.isArray(key) && typeof key[2] === 'string' ? key[2] : ''\n const sp = new URLSearchParams(paramStr)\n const searchTerm = (sp.get('search') || '').trim().toLowerCase()\n if (searchTerm && !haystack.includes(searchTerm)) continue\n\n const pageSize = typeof old.pageSize === 'number' && old.pageSize > 0 ? old.pageSize : 10\n const nextTotal = (old.total ?? 0) + 1\n queryClient.setQueryData<PagedResponse<WarehouseRow>>(key, {\n ...old,\n items: [row, ...old.items.filter((r: WarehouseRow) => r.id !== newId)].slice(0, pageSize),\n total: nextTotal,\n totalPages: Math.max(1, Math.ceil(nextTotal / pageSize)),\n })\n }\n}\n\nasync function loadCatalogProductOptions(query?: string): Promise<CrudFieldOption[]> {\n const params = buildQuery({ page: 1, pageSize: 25, search: query?.trim() || undefined })\n const call = await apiCall<PagedResponse<{ id?: string | null; title?: string | null; sku?: string | null }>>(`/api/catalog/products?${params}`)\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const label = item.title || item.sku || value\n return { value, label }\n })\n .filter((option): option is CrudFieldOption => option !== null)\n}\n\nfunction SectionCard({\n title,\n description,\n icon,\n viewAllHref,\n viewAllLabel,\n children,\n}: {\n title: string\n description: string\n icon: React.ReactNode\n viewAllHref?: string\n viewAllLabel?: string\n children: React.ReactNode\n}) {\n return (\n <section className=\"rounded-lg border bg-card p-5 text-card-foreground shadow-sm\">\n <div className=\"mb-4 flex items-start gap-3\">\n <div className=\"rounded-md border bg-muted/40 p-2 text-muted-foreground\">{icon}</div>\n <div className=\"flex flex-1 items-start justify-between gap-2\">\n <div className=\"space-y-1\">\n <h2 className=\"text-xl font-semibold\">{title}</h2>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n {viewAllHref && (\n <Link href={viewAllHref} className=\"shrink-0 text-sm font-medium text-primary hover:underline\">\n {viewAllLabel}\n </Link>\n )}\n </div>\n </div>\n {children}\n </section>\n )\n}\n\ntype ConfigSectionOptions = {\n /** When set, show a \"View all\" link to the standalone list page. Omit on that list page itself. */\n viewAllHref?: string\n}\n\nexport function WarehouseSection({ viewAllHref }: ConfigSectionOptions = {}) {\n const t = useT()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-warehouses' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'updatedAt', desc: true }])\n const [submitting, setSubmitting] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogMode<WarehouseRow> | null>(null)\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n search: search.trim() || undefined,\n sortField: sortCol ? sortCol.id : 'updatedAt',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'desc',\n })\n }, [page, search, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'warehouses', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<WarehouseRow>>(`/api/wms/warehouses?${params}`, {\n cache: 'no-store',\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.warehouses.errors.load', 'Failed to load warehouses.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const fields = React.useMemo<CrudField[]>(() => [\n { id: 'name', type: 'text', label: t('wms.backend.config.warehouses.form.name', 'Name'), required: true },\n { id: 'code', type: 'text', label: t('wms.backend.config.warehouses.form.code', 'Code'), required: true },\n { id: 'city', type: 'text', label: t('wms.backend.config.warehouses.form.city', 'City') },\n { id: 'country', type: 'text', label: t('wms.backend.config.warehouses.form.country', 'Country') },\n { id: 'timezone', type: 'text', label: t('wms.backend.config.warehouses.form.timezone', 'Timezone') },\n { id: 'isPrimary', type: 'checkbox', label: t('wms.backend.config.warehouses.form.primary', 'Primary warehouse') },\n { id: 'isActive', type: 'checkbox', label: t('wms.backend.config.warehouses.form.active', 'Active') },\n ], [t])\n\n const columns = React.useMemo<ColumnDef<WarehouseRow>[]>(() => [\n {\n accessorKey: 'name',\n header: t('wms.backend.config.warehouses.columns.name', 'Warehouse'),\n enableSorting: true,\n cell: ({ row }) => row.original.name || row.original.code || row.original.id,\n },\n { accessorKey: 'code', header: t('wms.backend.config.warehouses.columns.code', 'Code'), enableSorting: true },\n { accessorKey: 'city', header: t('wms.backend.config.warehouses.columns.city', 'City'), cell: ({ row }) => row.original.city || '\u2014' },\n { accessorKey: 'country', header: t('wms.backend.config.warehouses.columns.country', 'Country'), cell: ({ row }) => row.original.country || '\u2014' },\n {\n accessorKey: 'is_primary',\n header: t('wms.backend.config.warehouses.columns.primary', 'Primary'),\n cell: ({ row }) =>\n row.original.is_primary\n ? t('wms.backend.config.warehouses.primary.yes', 'Primary')\n : '\u2014',\n },\n {\n accessorKey: 'is_active',\n header: t('wms.backend.config.warehouses.columns.status', 'Status'),\n cell: ({ row }) =>\n row.original.is_active === false\n ? t('wms.common.inactive', 'Inactive')\n : t('wms.common.active', 'Active'),\n },\n ], [t])\n\n const initialValues = React.useMemo<WarehouseFormValues>(() => {\n if (dialog?.mode === 'edit') {\n return {\n name: dialog.row.name || '',\n code: dialog.row.code || '',\n city: dialog.row.city || '',\n country: dialog.row.country || '',\n timezone: dialog.row.timezone || '',\n isActive: dialog.row.is_active !== false,\n isPrimary: dialog.row.is_primary === true,\n }\n }\n return {\n name: '',\n code: '',\n city: '',\n country: '',\n timezone: '',\n isActive: true,\n isPrimary: false,\n }\n }, [dialog])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setSubmitting(false)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.cancelQueries({ queryKey: ['wms-config', 'warehouses'] })\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'warehouses'] })\n await queryClient.refetchQueries({ queryKey: ['wms-config', 'warehouses'], type: 'all' })\n }, [queryClient])\n\n const handleSubmit = React.useCallback(async (values: WarehouseFormValues) => {\n if (!dialog) return\n const submitMode = dialog.mode\n setSubmitting(true)\n try {\n const call = await runMutation({\n operation: async () => {\n const result = await apiCall<{ id?: string | null }>(\n '/api/wms/warehouses',\n {\n method: submitMode === 'edit' ? 'PUT' : 'POST',\n body: JSON.stringify(\n submitMode === 'edit'\n ? { id: dialog.row.id, ...values }\n : values,\n ),\n },\n )\n if (!result.ok) {\n await raiseCrudError(result.response, t('wms.backend.config.warehouses.errors.save', 'Failed to save warehouse.'))\n }\n return result\n },\n context: {},\n mutationPayload: submitMode === 'edit' ? { id: dialog.row.id, ...values } : values,\n })\n flash(\n submitMode === 'edit'\n ? t('wms.backend.config.warehouses.flash.updated', 'Warehouse updated')\n : t('wms.backend.config.warehouses.flash.created', 'Warehouse created'),\n 'success',\n )\n\n const createdId =\n submitMode === 'create' &&\n call?.result &&\n typeof call.result === 'object' &&\n typeof (call.result as { id?: unknown }).id === 'string'\n ? (call.result as { id: string }).id.trim()\n : null\n\n closeDialog()\n\n if (submitMode === 'create' && createdId) {\n mergeCreatedWarehouseIntoWarehousesCaches(queryClient, createdId, values)\n setSearch('')\n setPage(1)\n }\n\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.warehouses.errors.save', 'Failed to save warehouse.'), t)\n setSubmitting(false)\n }\n }, [closeDialog, dialog, queryClient, refresh, runMutation, t])\n\n const handleDelete = React.useCallback(async (row: WarehouseRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.warehouses.confirmDelete', 'Archive warehouse \"{name}\"?', {\n name: row.name || row.code || row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/warehouses?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.warehouses.errors.delete', 'Failed to archive warehouse.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.warehouses.flash.deleted', 'Warehouse archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.warehouses.errors.delete', 'Failed to archive warehouse.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.warehouses.title', 'Warehouses')}\n description={t('wms.backend.config.warehouses.description', 'Manage the high-level warehouse nodes used by WMS reservations and inventory movements.')}\n icon={<Warehouse className=\"size-5\" />}\n viewAllHref={viewAllHref}\n viewAllLabel={viewAllHref ? t('wms.backend.config.viewAll', 'View all \u2192') : undefined}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.warehouses.title', 'Warehouses')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.warehouses.errors.load', 'Failed to load warehouses.') : null}\n entityId={E.wms.warehouse}\n searchValue={search}\n onSearchChange={(value) => {\n setSearch(value)\n setPage(1)\n }}\n searchPlaceholder={t('wms.backend.config.warehouses.search', 'Search warehouses')}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManageWarehouses ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addWarehouse', 'Add warehouse')}\n </Button>\n ) : null}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.warehousesTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.warehouses.empty.title', 'No warehouses')}\n description={t('wms.backend.config.warehouses.empty.description', 'Create the first warehouse to expose topology and inventory assignment in WMS.')}\n action={access.canManageWarehouses ? { label: t('wms.backend.config.actions.addWarehouse', 'Add warehouse'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit'\n ? t('wms.backend.config.warehouses.dialog.edit', 'Edit warehouse')\n : t('wms.backend.config.warehouses.dialog.create', 'Create warehouse')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<WarehouseFormValues>\n schema={warehouseFormSchema}\n fields={fields}\n entityId={E.wms.warehouse}\n initialValues={initialValues}\n submitLabel={t('common.save', 'Save')}\n onSubmit={handleSubmit}\n embedded\n isLoading={submitting}\n twoColumn\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport function ZoneSection({ viewAllHref }: ConfigSectionOptions = {}) {\n const t = useT()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-zones' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'priority', desc: false }])\n const [submitting, setSubmitting] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogMode<ZoneRow> | null>(null)\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n search: search.trim() || undefined,\n sortField: sortCol ? sortCol.id : 'priority',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'asc',\n })\n }, [page, search, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'zones', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<ZoneRow>>(`/api/wms/zones?${params}`, {\n cache: 'no-store',\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.zones.errors.load', 'Failed to load zones.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n // Warehouse options for the dialog's combobox. Loaded whenever the dialog opens so a tenant\n // with a single warehouse gets it pre-selected instead of an empty \"type to search\" input,\n // and so the edit dialog can label the currently linked warehouse without a lookup round-trip.\n const warehouseOptionsQuery = useQuery({\n queryKey: ['wms-config', 'zones', 'warehouse-options'],\n queryFn: () => loadWarehouseOptions(),\n enabled: dialog !== null,\n staleTime: 30_000,\n })\n const warehouseOptions = React.useMemo(\n () => warehouseOptionsQuery.data ?? [],\n [warehouseOptionsQuery.data],\n )\n const soleWarehouseId = warehouseOptions.length === 1 ? warehouseOptions[0].value : null\n\n const warehouseSeedOptions = React.useMemo<CrudFieldOption[] | undefined>(() => {\n if (dialog?.mode === 'edit') {\n const warehouseId = dialog.row.warehouse_id\n if (!warehouseId) return undefined\n const label = dialog.row.warehouse_name?.trim() || dialog.row.warehouse_code?.trim() || ''\n return label ? [{ value: warehouseId, label }] : undefined\n }\n return soleWarehouseId ? warehouseOptions : undefined\n }, [dialog, soleWarehouseId, warehouseOptions])\n\n // The dialog already holds the first page of warehouses; serve the combobox's initial\n // (unsearched) open from that cache instead of repeating the same request, and only go\n // back to the network once the user actually types a term the cached page cannot answer.\n const loadZoneWarehouseOptions = React.useCallback(async (query?: string) => {\n const term = query?.trim()\n if (!term) return warehouseOptionsQuery.data ?? loadWarehouseOptions()\n return loadWarehouseOptions(term)\n }, [warehouseOptionsQuery.data])\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'warehouseId',\n type: 'combobox',\n label: t('wms.backend.config.zones.form.warehouse', 'Warehouse'),\n required: true,\n loadOptions: loadZoneWarehouseOptions,\n allowCustomValues: false,\n seedOptions: warehouseSeedOptions,\n },\n { id: 'code', type: 'text', label: t('wms.backend.config.zones.form.code', 'Code'), required: true },\n { id: 'name', type: 'text', label: t('wms.backend.config.zones.form.name', 'Name'), required: true },\n { id: 'priority', type: 'number', label: t('wms.backend.config.zones.form.priority', 'Priority') },\n ], [t, loadZoneWarehouseOptions, warehouseSeedOptions])\n\n const columns = React.useMemo<ColumnDef<ZoneRow>[]>(() => [\n {\n accessorKey: 'name',\n header: t('wms.backend.config.zones.columns.name', 'Zone'),\n enableSorting: true,\n cell: ({ row }) => row.original.name || row.original.code || row.original.id,\n },\n { accessorKey: 'code', header: t('wms.backend.config.zones.columns.code', 'Code'), enableSorting: true },\n {\n accessorKey: 'warehouse_name',\n header: t('wms.backend.config.zones.columns.warehouse', 'Warehouse'),\n enableSorting: false,\n cell: ({ row }) =>\n row.original.warehouse_name\n || row.original.warehouse_code\n || row.original.warehouse_id\n || '\u2014',\n },\n {\n accessorKey: 'priority',\n header: t('wms.backend.config.zones.columns.priority', 'Priority'),\n enableSorting: true,\n cell: ({ row }) => (row.original.priority == null ? '\u2014' : String(row.original.priority)),\n },\n ], [t])\n\n const initialValues = React.useMemo<ZoneFormValues>(() => {\n if (dialog?.mode === 'edit') {\n return {\n id: dialog.row.id,\n updatedAt: dialog.row.updated_at ?? null,\n warehouseId: dialog.row.warehouse_id || '',\n code: dialog.row.code || '',\n name: dialog.row.name || '',\n priority: dialog.row.priority == null ? undefined : Number(dialog.row.priority),\n ...extractCustomFieldEntries(dialog.row),\n }\n }\n return {\n warehouseId: soleWarehouseId ?? '',\n code: '',\n name: '',\n priority: undefined,\n }\n }, [dialog, soleWarehouseId])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setSubmitting(false)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'zones'] })\n }, [queryClient])\n\n const handleSubmit = React.useCallback(async (values: ZoneFormValues) => {\n if (!dialog) return\n const submitMode = dialog.mode\n setSubmitting(true)\n try {\n const customFields = collectCustomFieldValues(values)\n const payload: Record<string, unknown> = {\n warehouseId: values.warehouseId,\n code: values.code,\n name: values.name,\n priority: values.priority === undefined || Number.isNaN(values.priority) ? undefined : Number(values.priority),\n }\n if (Object.keys(customFields).length) payload.customFields = customFields\n await runMutation({\n operation: async () => {\n const call = await apiCall(\n '/api/wms/zones',\n {\n method: submitMode === 'edit' ? 'PUT' : 'POST',\n body: JSON.stringify(submitMode === 'edit' ? { id: dialog.row.id, ...payload } : payload),\n },\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.zones.errors.save', 'Failed to save zone.'))\n }\n return call\n },\n context: {},\n mutationPayload: submitMode === 'edit' ? { id: dialog.row.id, ...payload } : payload,\n })\n flash(\n submitMode === 'edit'\n ? t('wms.backend.config.zones.flash.updated', 'Zone updated')\n : t('wms.backend.config.zones.flash.created', 'Zone created'),\n 'success',\n )\n closeDialog()\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.zones.errors.save', 'Failed to save zone.'), t)\n setSubmitting(false)\n }\n }, [closeDialog, dialog, refresh, runMutation, t])\n\n const handleDelete = React.useCallback(async (row: ZoneRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.zones.confirmDelete', 'Archive zone \"{name}\"?', {\n name: row.name || row.code || row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/zones?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.zones.errors.delete', 'Failed to archive zone.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.zones.flash.deleted', 'Zone archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.zones.errors.delete', 'Failed to archive zone.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.zones.title', 'Zones')}\n description={t('wms.backend.config.zones.description', 'Group locations into functional zones (e.g. receiving, pick face, bulk) to drive routing and priority.')}\n icon={<Layers className=\"size-5\" />}\n viewAllHref={viewAllHref}\n viewAllLabel={viewAllHref ? t('wms.backend.config.viewAll', 'View all \u2192') : undefined}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.zones.title', 'Zones')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.zones.errors.load', 'Failed to load zones.') : null}\n entityId={E.wms.warehouse_zone}\n searchValue={search}\n onSearchChange={(value) => {\n setSearch(value)\n setPage(1)\n }}\n searchPlaceholder={t('wms.backend.config.zones.search', 'Search zones')}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManageZones ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addZone', 'Add zone')}\n </Button>\n ) : null}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.zonesTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.zones.empty.title', 'No zones')}\n description={t('wms.backend.config.zones.empty.description', 'Zones group locations into functional areas to drive picking priority and routing rules.')}\n action={access.canManageZones ? { label: t('wms.backend.config.actions.addZone', 'Add zone'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit'\n ? t('wms.backend.config.zones.dialog.edit', 'Edit zone')\n : t('wms.backend.config.zones.dialog.create', 'Create zone')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<ZoneFormValues>\n schema={zoneFormSchema}\n fields={fields}\n entityId={E.wms.warehouse_zone}\n initialValues={initialValues}\n submitLabel={t('common.save', 'Save')}\n onSubmit={handleSubmit}\n embedded\n isLoading={submitting}\n twoColumn\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport function LocationSection({ viewAllHref }: ConfigSectionOptions = {}) {\n const t = useT()\n const router = useRouter()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-locations' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'updatedAt', desc: true }])\n const [dialog, setDialog] = React.useState<DialogMode<LocationRow> | null>(null)\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n search: search.trim() || undefined,\n sortField: sortCol ? sortCol.id : 'updatedAt',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'desc',\n })\n }, [page, search, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'locations', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<LocationRow>>(`/api/wms/locations?${params}`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.locations.errors.load', 'Failed to load locations.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const columns = React.useMemo<ColumnDef<LocationRow>[]>(() => [\n {\n accessorKey: 'code',\n header: t('wms.backend.config.locations.columns.code', 'Location'),\n enableSorting: true,\n cell: ({ row }) => {\n const locationId = row.original.id?.trim()\n const code = row.original.code || '\u2014'\n if (!locationId) return code\n return (\n <Link\n href={`/backend/wms/location/${encodeURIComponent(locationId)}`}\n className=\"font-medium text-primary hover:underline\"\n >\n {code}\n </Link>\n )\n },\n },\n { accessorKey: 'type', header: t('wms.backend.config.locations.columns.type', 'Type'), enableSorting: true, cell: ({ row }) => row.original.type || '\u2014' },\n {\n accessorKey: 'warehouse_name',\n header: t('wms.backend.config.locations.columns.warehouse', 'Warehouse'),\n enableSorting: false,\n cell: ({ row }) =>\n row.original.warehouse_name\n || row.original.warehouse_code\n || row.original.warehouse_id\n || '\u2014',\n },\n { accessorKey: 'capacity_units', header: t('wms.backend.config.locations.columns.capacityUnits', 'Capacity units'), cell: ({ row }) => String(row.original.capacity_units ?? '\u2014') },\n {\n accessorKey: 'is_active',\n header: t('wms.backend.config.locations.columns.status', 'Status'),\n cell: ({ row }) =>\n row.original.is_active === false\n ? t('wms.common.inactive', 'Inactive')\n : t('wms.common.active', 'Active'),\n },\n ], [t])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'locations'] })\n }, [queryClient])\n\n const handleDelete = React.useCallback(async (row: LocationRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.locations.confirmDelete', 'Archive location \"{code}\"?', {\n code: row.code || row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/locations?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.locations.errors.delete', 'Failed to archive location.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.locations.flash.deleted', 'Location archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.locations.errors.delete', 'Failed to archive location.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.locations.title', 'Locations')}\n description={t('wms.backend.config.locations.description', 'Maintain aisle/bin/dock level topology buckets that hold operational inventory.')}\n icon={<MapPinned className=\"size-5\" />}\n viewAllHref={viewAllHref}\n viewAllLabel={viewAllHref ? t('wms.backend.config.viewAll', 'View all \u2192') : undefined}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.locations.title', 'Locations')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.locations.errors.load', 'Failed to load locations.') : null}\n entityId={E.wms.warehouse_location}\n searchValue={search}\n onSearchChange={(value) => {\n setSearch(value)\n setPage(1)\n }}\n searchPlaceholder={t('wms.backend.config.locations.search', 'Search locations')}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManageLocations ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addLocation', 'Add location')}\n </Button>\n ) : null}\n onRowClick={(row) => {\n const locationId = row.id?.trim()\n if (locationId) {\n router.push(`/backend/wms/location/${encodeURIComponent(locationId)}`)\n }\n }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.locationsTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.locations.empty.title', 'No locations')}\n description={t('wms.backend.config.locations.empty.description', 'Create locations to define the buckets used by balances, reservations, and movement ledger rows.')}\n action={access.canManageLocations ? { label: t('wms.backend.config.actions.addLocation', 'Add location'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <LocationEditDialog\n open={dialog !== null}\n onOpenChange={(next) => !next && closeDialog()}\n mode={dialog?.mode ?? 'create'}\n row={dialog?.mode === 'edit' ? dialog.row : null}\n onSaved={refresh}\n />\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport function InventoryProfilesSection() {\n const t = useT()\n const locale = useLocale()\n const queryClient = useQueryClient()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const { runMutation } = useGuardedMutation<Record<string, unknown>>({ contextId: 'wms-config-profiles' })\n const access = useWmsInventoryMutationAccess()\n const [page, setPage] = React.useState(1)\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'updatedAt', desc: true }])\n const [submitting, setSubmitting] = React.useState(false)\n const [dialog, setDialog] = React.useState<DialogMode<InventoryProfileRow> | null>(null)\n const inventoryProfileFormSchema = React.useMemo(\n () => buildInventoryProfileFormSchema(t('wms.backend.config.profiles.validation.fefoRequired', 'FEFO is required when expiration tracking is enabled.')),\n [t],\n )\n\n const handleSortingChange = React.useCallback((nextSorting: SortingState) => {\n setSorting(nextSorting)\n setPage(1)\n }, [])\n\n const params = React.useMemo(() => {\n const sortCol = sorting[0]\n return buildQuery({\n page,\n pageSize: 10,\n sortField: sortCol ? sortCol.id : 'updatedAt',\n sortDir: sortCol ? (sortCol.desc ? 'desc' : 'asc') : 'desc',\n })\n }, [page, sorting])\n\n const query = useQuery({\n queryKey: ['wms-config', 'inventory-profiles', params],\n queryFn: async () => {\n const call = await apiCall<PagedResponse<InventoryProfileRow>>(`/api/wms/inventory-profiles?${params}`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.profiles.errors.load', 'Failed to load inventory profiles.'))\n }\n return call.result ?? { items: [], total: 0, totalPages: 1 }\n },\n })\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'catalogProductId',\n type: 'combobox',\n label: t('wms.backend.config.profiles.form.product', 'Product'),\n required: true,\n loadOptions: loadCatalogProductOptions,\n allowCustomValues: false,\n },\n {\n id: 'catalogVariantId',\n type: 'combobox',\n label: t('wms.backend.config.profiles.form.variant', 'Variant'),\n loadOptions: loadCatalogVariantOptions,\n allowCustomValues: false,\n },\n { id: 'defaultUom', type: 'text', label: t('wms.backend.config.profiles.form.uom', 'Default UOM'), required: true },\n {\n id: 'defaultStrategy',\n type: 'select',\n label: t('wms.backend.config.profiles.form.strategy', 'Rotation strategy'),\n required: true,\n options: STRATEGY_OPTIONS,\n },\n { id: 'reorderPoint', type: 'number', label: t('wms.backend.config.profiles.form.reorderPoint', 'Reorder point') },\n { id: 'safetyStock', type: 'number', label: t('wms.backend.config.profiles.form.safetyStock', 'Safety stock') },\n { id: 'trackLot', type: 'checkbox', label: t('wms.backend.config.profiles.form.trackLot', 'Track lots') },\n { id: 'trackSerial', type: 'checkbox', label: t('wms.backend.config.profiles.form.trackSerial', 'Track serials') },\n { id: 'trackExpiration', type: 'checkbox', label: t('wms.backend.config.profiles.form.trackExpiration', 'Track expiration') },\n ], [t])\n\n const quantityFormatter = React.useMemo(\n () => createInventoryQuantityFormatter(locale),\n [locale],\n )\n\n const columns = React.useMemo<ColumnDef<InventoryProfileRow>[]>(() => [\n {\n accessorKey: 'catalog_product_id',\n header: t('wms.backend.config.profiles.columns.product', 'Product'),\n cell: ({ row }) => formatCatalogProductLabel(row.original),\n },\n {\n accessorKey: 'catalog_variant_id',\n header: t('wms.backend.config.profiles.columns.variant', 'Variant'),\n cell: ({ row }) => {\n if (!row.original.catalog_variant_id?.trim()) {\n return t('wms.backend.config.profiles.allVariants', 'All variants')\n }\n return formatCatalogVariantLabel(row.original)\n },\n },\n { accessorKey: 'default_uom', header: t('wms.backend.config.profiles.columns.uom', 'UOM'), cell: ({ row }) => row.original.default_uom || '\u2014' },\n {\n accessorKey: 'default_strategy',\n id: 'defaultStrategy',\n header: t('wms.backend.config.profiles.columns.strategy', 'Strategy'),\n enableSorting: true,\n cell: ({ row }) => {\n const strategy = row.original.default_strategy?.trim()\n if (!strategy) return '\u2014'\n return inventoryRotationStrategyLabel(strategy, t)\n },\n },\n {\n accessorKey: 'reorder_point',\n id: 'reorderPoint',\n header: t('wms.backend.config.profiles.columns.reorderPoint', 'Reorder point'),\n enableSorting: true,\n cell: ({ row }) => (\n <span className=\"tabular-nums\">\n {formatInventoryQuantity(row.original.reorder_point, quantityFormatter)}\n </span>\n ),\n },\n {\n accessorKey: 'safety_stock',\n id: 'safetyStock',\n header: t('wms.backend.config.profiles.columns.safetyStock', 'Safety stock'),\n enableSorting: true,\n cell: ({ row }) => (\n <span className=\"tabular-nums\">\n {formatInventoryQuantity(row.original.safety_stock, quantityFormatter)}\n </span>\n ),\n },\n ], [quantityFormatter, t])\n\n const initialValues = React.useMemo<InventoryProfileFormValues>(() => {\n if (dialog?.mode === 'edit') {\n return {\n catalogProductId: dialog.row.catalog_product_id || '',\n catalogVariantId: dialog.row.catalog_variant_id || '',\n defaultUom: dialog.row.default_uom || '',\n defaultStrategy: (dialog.row.default_strategy as InventoryProfileFormValues['defaultStrategy']) || 'fifo',\n trackLot: dialog.row.track_lot === true,\n trackSerial: dialog.row.track_serial === true,\n trackExpiration: dialog.row.track_expiration === true,\n reorderPoint: dialog.row.reorder_point == null ? undefined : Number(dialog.row.reorder_point),\n safetyStock: dialog.row.safety_stock == null ? undefined : Number(dialog.row.safety_stock),\n }\n }\n return {\n catalogProductId: '',\n catalogVariantId: '',\n defaultUom: 'pcs',\n defaultStrategy: 'fifo',\n trackLot: false,\n trackSerial: false,\n trackExpiration: false,\n reorderPoint: 0,\n safetyStock: 0,\n }\n }, [dialog])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setSubmitting(false)\n }, [])\n\n const refresh = React.useCallback(async () => {\n await queryClient.invalidateQueries({ queryKey: ['wms-config', 'inventory-profiles'] })\n }, [queryClient])\n\n const handleSubmit = React.useCallback(async (values: InventoryProfileFormValues) => {\n setSubmitting(true)\n try {\n const payload = {\n ...values,\n catalogVariantId: values.catalogVariantId?.trim() ? values.catalogVariantId : null,\n }\n await runMutation({\n operation: async () => {\n const call = await apiCall(\n '/api/wms/inventory-profiles',\n {\n method: dialog?.mode === 'edit' ? 'PUT' : 'POST',\n body: JSON.stringify(dialog?.mode === 'edit' ? { id: dialog.row.id, ...payload } : payload),\n },\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.profiles.errors.save', 'Failed to save inventory profile.'))\n }\n return call\n },\n context: {},\n mutationPayload: dialog?.mode === 'edit' ? { id: dialog.row.id, ...payload } : payload,\n })\n flash(\n dialog?.mode === 'edit'\n ? t('wms.backend.config.profiles.flash.updated', 'Inventory profile updated')\n : t('wms.backend.config.profiles.flash.created', 'Inventory profile created'),\n 'success',\n )\n closeDialog()\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.profiles.errors.save', 'Failed to save inventory profile.'), t)\n setSubmitting(false)\n }\n }, [closeDialog, dialog, refresh, runMutation, t])\n\n const handleDelete = React.useCallback(async (row: InventoryProfileRow) => {\n const confirmed = await confirm({\n title: t('wms.backend.config.profiles.confirmDelete', 'Archive inventory profile \"{id}\"?', {\n id: row.id,\n }),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall(`/api/wms/inventory-profiles?id=${encodeURIComponent(row.id)}`, { method: 'DELETE' })\n if (!call.ok) {\n await raiseCrudError(call.response, t('wms.backend.config.profiles.errors.delete', 'Failed to archive inventory profile.'))\n }\n return call\n },\n context: {},\n mutationPayload: { id: row.id },\n })\n flash(t('wms.backend.config.profiles.flash.deleted', 'Inventory profile archived'), 'success')\n await refresh()\n } catch (error) {\n flashMutationError(error, t('wms.backend.config.profiles.errors.delete', 'Failed to archive inventory profile.'), t)\n }\n }, [confirm, refresh, runMutation, t])\n\n return (\n <>\n <SectionCard\n title={t('wms.backend.config.profiles.title', 'Inventory profiles')}\n description={t('wms.backend.config.profiles.description', 'Configure tracking strategy, reorder thresholds, and lot/serial behavior per product scope.')}\n icon={<Boxes className=\"size-5\" />}\n >\n <DataTable\n embedded\n title={t('wms.backend.config.profiles.title', 'Inventory profiles')}\n columns={columns}\n data={query.data?.items ?? []}\n isLoading={query.isLoading}\n error={query.isError ? t('wms.backend.config.profiles.errors.load', 'Failed to load inventory profiles.') : null}\n entityId={E.wms.product_inventory_profile}\n sorting={sorting}\n onSortingChange={handleSortingChange}\n sortable\n manualSorting\n actions={access.canManage ? (\n <Button type=\"button\" size=\"sm\" onClick={() => setDialog({ mode: 'create' })}>\n {t('wms.backend.config.actions.addProfile', 'Add profile')}\n </Button>\n ) : null}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), onSelect: () => setDialog({ mode: 'edit', row }) },\n { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },\n ]}\n />\n )}\n pagination={{\n page,\n pageSize: 10,\n total: query.data?.total ?? 0,\n totalPages: query.data?.totalPages ?? 1,\n totalIsCapped: query.data?.totalIsCapped === true,\n onPageChange: setPage,\n }}\n perspective={{ tableId: extensionPoints.hosts.inventoryProfilesTable.tableId }}\n emptyState={(\n <EmptyState\n title={t('wms.backend.config.profiles.empty.title', 'No inventory profiles')}\n description={t('wms.backend.config.profiles.empty.description', 'Create profiles to control reservation strategy, lot/serial tracking, and low-stock thresholds.')}\n action={access.canManage ? { label: t('wms.backend.config.actions.addProfile', 'Add profile'), onClick: () => setDialog({ mode: 'create' }) } : undefined}\n />\n )}\n />\n </SectionCard>\n\n <Dialog open={dialog !== null} onOpenChange={(next) => !next && closeDialog()}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>\n {dialog?.mode === 'edit'\n ? t('wms.backend.config.profiles.dialog.edit', 'Edit inventory profile')\n : t('wms.backend.config.profiles.dialog.create', 'Create inventory profile')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm<InventoryProfileFormValues>\n schema={inventoryProfileFormSchema}\n fields={fields}\n entityId={E.wms.product_inventory_profile}\n initialValues={initialValues}\n submitLabel={t('common.save', 'Save')}\n onSubmit={handleSubmit}\n embedded\n isLoading={submitting}\n twoColumn\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </>\n )\n}\n\nexport default function WmsConfigurationPage() {\n const t = useT()\n\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n <section className=\"rounded-lg border bg-card p-5 text-card-foreground shadow-sm\">\n <div className=\"space-y-1\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('wms.backend.config.title', 'WMS configuration')}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('wms.backend.config.description', 'Phase-1 operational configuration for warehouses, storage locations, and inventory tracking policies.')}\n </p>\n </div>\n </section>\n <WarehouseSection viewAllHref=\"/backend/wms/warehouses\" />\n <ZoneSection viewAllHref=\"/backend/wms/zones\" />\n <LocationSection viewAllHref=\"/backend/wms/locations\" />\n <InventoryProfilesSection />\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["query"]
|
|
7
7
|
}
|