@open-mercato/core 0.9.1-develop.7497.1.543ea44c40 → 0.9.1-develop.7513.1.ae2715553f
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/audit_logs/components/AuditLogsActions.js +1 -1
- package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
- package/dist/modules/auth/frontend/reset.js +7 -3
- package/dist/modules/auth/frontend/reset.js.map +2 -2
- package/dist/modules/business_rules/api/rules/route.js +12 -1
- package/dist/modules/business_rules/api/rules/route.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +17 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +3 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -0
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/products/productFormUtils.js +9 -0
- package/dist/modules/catalog/components/products/productFormUtils.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +32 -32
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +22 -22
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +34 -34
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/ecommerce/search.js +1 -2
- package/dist/modules/ecommerce/search.js.map +2 -2
- package/dist/modules/staff/backend/staff/time-tracking/entries/page.js +10 -7
- package/dist/modules/staff/backend/staff/time-tracking/entries/page.js.map +2 -2
- package/dist/modules/wms/api/interceptors.js +3 -0
- package/dist/modules/wms/api/interceptors.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +16 -16
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/events.js +1 -0
- package/dist/modules/wms/events.js.map +2 -2
- package/dist/modules/wms/lib/catalogInventoryProfileIntent.js +9 -0
- package/dist/modules/wms/lib/catalogInventoryProfileIntent.js.map +2 -2
- package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js +11 -3
- package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/audit_logs/components/AuditLogsActions.tsx +1 -1
- package/src/modules/auth/frontend/reset.tsx +8 -3
- package/src/modules/business_rules/api/rules/route.ts +11 -0
- package/src/modules/business_rules/i18n/de.json +1 -0
- package/src/modules/business_rules/i18n/en.json +1 -0
- package/src/modules/business_rules/i18n/es.json +1 -0
- package/src/modules/business_rules/i18n/ko.json +1 -0
- package/src/modules/business_rules/i18n/pl.json +1 -0
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +20 -1
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +2 -1
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -0
- package/src/modules/catalog/components/products/productFormUtils.ts +9 -0
- package/src/modules/customers/backend/customers/companies/page.tsx +32 -32
- package/src/modules/customers/backend/customers/deals/page.tsx +22 -22
- package/src/modules/customers/backend/customers/people/page.tsx +34 -34
- package/src/modules/customers/i18n/de.json +12 -0
- package/src/modules/customers/i18n/en.json +12 -0
- package/src/modules/customers/i18n/es.json +12 -0
- package/src/modules/customers/i18n/ko.json +12 -0
- package/src/modules/customers/i18n/pl.json +12 -0
- package/src/modules/ecommerce/i18n/de.json +2 -1
- package/src/modules/ecommerce/i18n/en.json +2 -1
- package/src/modules/ecommerce/i18n/es.json +2 -1
- package/src/modules/ecommerce/i18n/ko.json +2 -1
- package/src/modules/ecommerce/i18n/pl.json +2 -1
- package/src/modules/ecommerce/search.ts +0 -1
- package/src/modules/staff/backend/staff/time-tracking/entries/page.tsx +20 -14
- package/src/modules/wms/api/interceptors.ts +9 -0
- package/src/modules/wms/commands/configuration.ts +28 -16
- package/src/modules/wms/events.ts +1 -0
- package/src/modules/wms/lib/catalogInventoryProfileIntent.ts +9 -0
- package/src/modules/wms/widgets/injection/catalog-inventory-profile/widget.ts +13 -4
|
@@ -701,9 +701,9 @@ function CustomersDealsPage() {
|
|
|
701
701
|
header: t("customers.deals.list.columns.title"),
|
|
702
702
|
meta: {
|
|
703
703
|
alwaysVisible: true,
|
|
704
|
-
columnChooserGroup: "Basic Info",
|
|
704
|
+
columnChooserGroup: t("customers.columnGroups.basicInfo", "Basic Info"),
|
|
705
705
|
filterKey: "title",
|
|
706
|
-
filterGroup: "Deal",
|
|
706
|
+
filterGroup: t("customers.columnGroups.deal", "Deal"),
|
|
707
707
|
maxWidth: "280px"
|
|
708
708
|
},
|
|
709
709
|
cell: ({ row }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
@@ -724,9 +724,9 @@ function CustomersDealsPage() {
|
|
|
724
724
|
meta: {
|
|
725
725
|
filterType: "select",
|
|
726
726
|
filterOptions: dictionaryOptions.dealStatuses,
|
|
727
|
-
columnChooserGroup: "Basic Info",
|
|
727
|
+
columnChooserGroup: t("customers.columnGroups.basicInfo", "Basic Info"),
|
|
728
728
|
filterKey: "status",
|
|
729
|
-
filterGroup: "Deal"
|
|
729
|
+
filterGroup: t("customers.columnGroups.deal", "Deal")
|
|
730
730
|
},
|
|
731
731
|
cell: ({ row }) => {
|
|
732
732
|
const status = row.original.status;
|
|
@@ -743,9 +743,9 @@ function CustomersDealsPage() {
|
|
|
743
743
|
meta: {
|
|
744
744
|
filterType: "select",
|
|
745
745
|
filterOptions: dictionaryOptions.pipelineStages,
|
|
746
|
-
columnChooserGroup: "Pipeline",
|
|
746
|
+
columnChooserGroup: t("customers.columnGroups.pipeline", "Pipeline"),
|
|
747
747
|
filterKey: "pipeline_stage",
|
|
748
|
-
filterGroup: "Deal"
|
|
748
|
+
filterGroup: t("customers.columnGroups.deal", "Deal")
|
|
749
749
|
},
|
|
750
750
|
cell: ({ row }) => {
|
|
751
751
|
const stage = row.original.pipelineStage;
|
|
@@ -758,9 +758,9 @@ function CustomersDealsPage() {
|
|
|
758
758
|
accessorKey: "pipelineId",
|
|
759
759
|
header: t("customers.deals.list.columns.pipeline", "Pipeline"),
|
|
760
760
|
meta: {
|
|
761
|
-
columnChooserGroup: "Pipeline",
|
|
761
|
+
columnChooserGroup: t("customers.columnGroups.pipeline", "Pipeline"),
|
|
762
762
|
filterKey: "pipeline_id",
|
|
763
|
-
filterGroup: "Deal",
|
|
763
|
+
filterGroup: t("customers.columnGroups.deal", "Deal"),
|
|
764
764
|
maxWidth: "220px"
|
|
765
765
|
},
|
|
766
766
|
cell: ({ row }) => {
|
|
@@ -773,9 +773,9 @@ function CustomersDealsPage() {
|
|
|
773
773
|
header: t("customers.deals.list.columns.value"),
|
|
774
774
|
meta: {
|
|
775
775
|
filterType: "number",
|
|
776
|
-
columnChooserGroup: "Financial",
|
|
776
|
+
columnChooserGroup: t("customers.columnGroups.financial", "Financial"),
|
|
777
777
|
filterKey: "value_amount",
|
|
778
|
-
filterGroup: "Deal"
|
|
778
|
+
filterGroup: t("customers.columnGroups.deal", "Deal")
|
|
779
779
|
},
|
|
780
780
|
cell: ({ row }) => {
|
|
781
781
|
const amount = formatGroupedAmount(row.original.valueAmount ?? null);
|
|
@@ -792,9 +792,9 @@ function CustomersDealsPage() {
|
|
|
792
792
|
header: t("customers.deals.list.columns.probability"),
|
|
793
793
|
meta: {
|
|
794
794
|
filterType: "number",
|
|
795
|
-
columnChooserGroup: "Financial",
|
|
795
|
+
columnChooserGroup: t("customers.columnGroups.financial", "Financial"),
|
|
796
796
|
filterKey: "probability",
|
|
797
|
-
filterGroup: "Deal"
|
|
797
|
+
filterGroup: t("customers.columnGroups.deal", "Deal")
|
|
798
798
|
},
|
|
799
799
|
cell: ({ row }) => {
|
|
800
800
|
const value = row.original.probability;
|
|
@@ -808,9 +808,9 @@ function CustomersDealsPage() {
|
|
|
808
808
|
accessorKey: "expectedCloseAt",
|
|
809
809
|
header: t("customers.deals.list.columns.expectedClose"),
|
|
810
810
|
meta: {
|
|
811
|
-
columnChooserGroup: "Dates",
|
|
811
|
+
columnChooserGroup: t("customers.columnGroups.dates", "Dates"),
|
|
812
812
|
filterKey: "expected_close_at",
|
|
813
|
-
filterGroup: "Activity",
|
|
813
|
+
filterGroup: t("customers.columnGroups.activity", "Activity"),
|
|
814
814
|
filterIconName: "calendar"
|
|
815
815
|
},
|
|
816
816
|
cell: ({ row }) => {
|
|
@@ -839,11 +839,11 @@ function CustomersDealsPage() {
|
|
|
839
839
|
accessorKey: "ownerUserId",
|
|
840
840
|
header: t("customers.deals.list.columns.owner", "Owner"),
|
|
841
841
|
meta: {
|
|
842
|
-
columnChooserGroup: "CRM",
|
|
842
|
+
columnChooserGroup: t("customers.columnGroups.crm", "CRM"),
|
|
843
843
|
filterType: "select",
|
|
844
844
|
filterOptions: resolvedOwnerFilterOptions,
|
|
845
845
|
filterLoadOptions: loadOwnerFilterOptions,
|
|
846
|
-
filterGroup: "CRM",
|
|
846
|
+
filterGroup: t("customers.columnGroups.crm", "CRM"),
|
|
847
847
|
filterIconName: "user-round",
|
|
848
848
|
filterKey: "owner_user_id"
|
|
849
849
|
},
|
|
@@ -861,9 +861,9 @@ function CustomersDealsPage() {
|
|
|
861
861
|
accessorKey: "companies",
|
|
862
862
|
header: t("customers.deals.list.columns.companies"),
|
|
863
863
|
meta: {
|
|
864
|
-
columnChooserGroup: "Associations",
|
|
864
|
+
columnChooserGroup: t("customers.columnGroups.associations", "Associations"),
|
|
865
865
|
filterable: false,
|
|
866
|
-
filterGroup: "CRM",
|
|
866
|
+
filterGroup: t("customers.columnGroups.crm", "CRM"),
|
|
867
867
|
filterIconName: "building-2",
|
|
868
868
|
maxWidth: "220px",
|
|
869
869
|
tooltipContent: (row) => normalizeCollectionLabels(
|
|
@@ -886,9 +886,9 @@ function CustomersDealsPage() {
|
|
|
886
886
|
accessorKey: "people",
|
|
887
887
|
header: t("customers.deals.list.columns.people"),
|
|
888
888
|
meta: {
|
|
889
|
-
columnChooserGroup: "Associations",
|
|
889
|
+
columnChooserGroup: t("customers.columnGroups.associations", "Associations"),
|
|
890
890
|
filterable: false,
|
|
891
|
-
filterGroup: "CRM",
|
|
891
|
+
filterGroup: t("customers.columnGroups.crm", "CRM"),
|
|
892
892
|
filterIconName: "user-round",
|
|
893
893
|
maxWidth: "220px",
|
|
894
894
|
tooltipContent: (row) => normalizeCollectionLabels(
|
|
@@ -916,9 +916,9 @@ function CustomersDealsPage() {
|
|
|
916
916
|
accessorKey: "updatedAt",
|
|
917
917
|
header: t("customers.deals.list.columns.updatedAt"),
|
|
918
918
|
meta: {
|
|
919
|
-
columnChooserGroup: "Dates",
|
|
919
|
+
columnChooserGroup: t("customers.columnGroups.dates", "Dates"),
|
|
920
920
|
filterKey: "updated_at",
|
|
921
|
-
filterGroup: "Activity",
|
|
921
|
+
filterGroup: t("customers.columnGroups.activity", "Activity"),
|
|
922
922
|
filterIconName: "calendar"
|
|
923
923
|
},
|
|
924
924
|
cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "text-sm", children: formatDateValue(row.original.updatedAt ?? null, t("customers.deals.list.noValue")) })
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/customers/backend/customers/deals/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/customers/extension-points'\nimport Link from 'next/link'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport { useQueryClient } from '@tanstack/react-query'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable, type DataTableExportFormat, withDataTableNamespaces } from '@open-mercato/ui/backend/DataTable'\nimport type { AdvancedFilterTree } from '@open-mercato/shared/lib/query/advanced-filter-tree'\nimport { createEmptyTree, makeRuleTree, makeMultiRuleTree } from '@open-mercato/shared/lib/query/advanced-filter-tree'\nimport { deserializeTree, deserializeAdvancedFilter, flatToTree, mapDictionaryColorToTone, serializeTree, type FilterFieldDef, type FilterOption as AdvancedFilterOption } from '@open-mercato/shared/lib/query/advanced-filter'\nimport { useCurrentUserId } from '@open-mercato/ui/backend/utils/useCurrentUserId'\nimport { useCurrentOrganization } from '@open-mercato/ui/backend/BackendChromeProvider'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { buildCrudExportUrl, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { groupBulkDeleteFailures, runBulkDelete } from '@open-mercato/ui/backend/utils/bulkDelete'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { coalesceLastOperations } from '@open-mercato/ui/backend/operations/store'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { StatusBadge, type StatusBadgeVariant } from '@open-mercato/ui/primitives/status-badge'\nimport { Avatar, AvatarStack } from '@open-mercato/ui/primitives/avatar'\nimport { Tag } from '@open-mercato/ui/primitives/tag'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Briefcase, AlertTriangle, X } from 'lucide-react'\nimport { isLostDealStatus, isWonDealStatus } from '../../../lib/dealStatus'\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { useRegisteredComponent } from '@open-mercato/ui/backend/injection/useRegisteredComponent'\nimport {\n ViewTabsRow,\n VIEW_TABS_ROW_COMPONENT_ID,\n type ViewTabsRowProps,\n} from './pipeline/components/ViewTabsRow'\nimport { DealsKpiStrip } from '../../../components/DealsKpiStrip'\nimport { E } from '#generated/entities.ids.generated'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport {\n type CustomerDictionaryKind,\n type CustomerDictionaryMap,\n} from '../../../lib/dictionaries'\nimport {\n ensureCustomerDictionary,\n invalidateCustomerDictionary,\n} from '../../../components/detail/hooks/useCustomerDictionary'\nimport {\n useCustomFieldDefs,\n} from '@open-mercato/ui/backend/utils/customFieldDefs'\nimport {\n mapCustomFieldKindToFilterType,\n normalizeCustomFieldFilterOptions,\n supportsCustomFieldColumn,\n} from '@open-mercato/ui/backend/utils/customFieldColumns'\nimport { CollectionPreviewCell, normalizeCollectionLabels } from '../../../components/list/CollectionPreviewCell'\nimport { useAutoDiscoveredFields } from '@open-mercato/ui/backend/utils/useAutoDiscoveredFields'\nimport { useAdvancedFilterTree } from '@open-mercato/ui/backend/hooks/useAdvancedFilter'\nimport { AdvancedFilterPanel } from '@open-mercato/ui/backend/filters/AdvancedFilterPanel'\nimport { ActiveFilterChips } from '@open-mercato/ui/backend/filters/ActiveFilterChips'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport type { FilterPreset } from '@open-mercato/ui/backend/filters/QuickFilters'\nimport {\n ensureCurrentUserFilterOption,\n fetchCurrentUserName,\n fetchAssignableStaffMembers,\n mapAssignableStaffToFilterOptions,\n} from '../../../lib/assignableStaff'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { UserCircle2 } from 'lucide-react'\nimport { ReassignOwnerDialog } from './components/ReassignOwnerDialog'\nimport type { BulkActionExecuteResult } from '@open-mercato/ui/backend/DataTable'\nimport { requestBulkOwnerReassignment, buildReassignOwnerSuccess } from '../../../lib/reassignDealOwner'\n\nconst logger = createLogger('customers')\n\nfunction makeDealsPresets(): FilterPreset[] {\n return [\n {\n id: 'my-deals',\n labelKey: 'customers.deals.presets.myDeals',\n requiresUser: true,\n build: ({ userId }) => makeRuleTree({ field: 'owner_user_id', operator: 'is', value: userId }),\n },\n {\n id: 'closing-month',\n labelKey: 'customers.deals.presets.closingMonth',\n iconName: 'clock',\n build: ({ now }) => {\n const start = new Date(now.getFullYear(), now.getMonth(), 1).toISOString().slice(0, 10)\n const end = new Date(now.getFullYear(), now.getMonth() + 1, 0).toISOString().slice(0, 10)\n return makeRuleTree({ field: 'expected_close_at', operator: 'between', value: [start, end] })\n },\n },\n // The Deal entity has no dedicated \"at risk\" or health-score field \u2014 `customer_deals`\n // exposes only `status` (open/win/lost/closed/in_progress, dictionary-driven) and\n // `closure_outcome`. Rather than fabricate a mapping, the \"At risk\" preset is omitted\n // until the data model exposes a first-class signal.\n {\n id: 'won-quarter',\n labelKey: 'customers.deals.presets.wonQuarter',\n build: ({ now }) => {\n const quarter = Math.floor(now.getMonth() / 3)\n const start = new Date(now.getFullYear(), quarter * 3, 1).toISOString().slice(0, 10)\n return makeMultiRuleTree([\n { field: 'status', operator: 'is', value: 'win' },\n { field: 'expected_close_at', operator: 'is_after', value: start },\n ], 'and')\n },\n },\n ]\n}\n\ntype DealRow = {\n id: string\n title: string\n status?: string | null\n pipelineStage?: string | null\n pipelineStageId?: string | null\n pipelineId?: string | null\n valueAmount?: number | null\n valueCurrency?: string | null\n probability?: number | null\n expectedCloseAt?: string | null\n updatedAt?: string | null\n ownerUserId?: string | null\n companies: { id: string; label: string }[]\n people: { id: string; label: string }[]\n} & Record<string, unknown>\n\ntype DealsResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n totalIsCapped?: boolean\n}\n\ntype FilterOption = { value: string; label: string }\ntype DictionaryOptionWithTone = AdvancedFilterOption & FilterOption\n\ntype DictionaryKey = Extract<CustomerDictionaryKind, 'deal-statuses' | 'pipeline-stages'>\n\nconst PAGE_SIZE = 20\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\nfunction isUuid(value: string | null | undefined): value is string {\n if (!value) return false\n return UUID_REGEX.test(value.trim())\n}\n\nfunction normalizeIdCandidates(raw: Array<string>): string[] {\n const set = new Set<string>()\n raw.forEach((candidate) => {\n candidate\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .forEach((part) => {\n if (isUuid(part)) set.add(part)\n })\n })\n return Array.from(set)\n}\n\nfunction extractIdsFromParams(params: URLSearchParams | null | undefined, key: string): string[] {\n if (!params) return []\n const values = params.getAll(key)\n return normalizeIdCandidates(values)\n}\n\nfunction formatDateValue(value: string | null | undefined, fallback: string): string {\n if (!value) return fallback\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return fallback\n return date.toLocaleDateString()\n}\n\nconst STATUS_BADGE_VARIANTS: ReadonlySet<StatusBadgeVariant> = new Set([\n 'success',\n 'warning',\n 'error',\n 'info',\n 'neutral',\n])\n\nfunction coerceStatusBadgeVariant(\n tone: ReturnType<typeof mapDictionaryColorToTone>,\n): StatusBadgeVariant {\n if (tone && STATUS_BADGE_VARIANTS.has(tone as StatusBadgeVariant)) {\n return tone as StatusBadgeVariant\n }\n return 'neutral'\n}\n\nconst groupedAmountFormatter = new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 })\n\nfunction formatGroupedAmount(amount: number | null | undefined): string | null {\n if (typeof amount !== 'number' || Number.isNaN(amount)) return null\n return groupedAmountFormatter.format(amount)\n}\n\nexport default function CustomersDealsPage() {\n const t = useT()\n // Resolved through the component registry so downstream apps can hide a view\n // (or replace the whole switcher) without forking this page.\n const DealsViewTabsRow = useRegisteredComponent<ViewTabsRowProps>(\n VIEW_TABS_ROW_COMPONENT_ID,\n ViewTabsRow,\n )\n const locale = useLocale()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const router = useRouter()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const scopeVersion = useOrganizationScopeVersion()\n const queryClient = useQueryClient()\n\n const [rows, setRows] = React.useState<DealRow[]>([])\n const [page, setPage] = React.useState(() => {\n const raw = Number(searchParams?.get('page') ?? '1')\n return Number.isFinite(raw) && raw > 0 ? raw : 1\n })\n const [pageSize, setPageSize] = React.useState(PAGE_SIZE)\n const [sorting, setSorting] = React.useState<import('@tanstack/react-table').SortingState>([])\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const [search, setSearch] = React.useState(() => searchParams?.get('search')?.trim() ?? '')\n const [isLoading, setIsLoading] = React.useState(false)\n const [reloadToken, setReloadToken] = React.useState(0)\n const [pendingDeleteId, setPendingDeleteId] = React.useState<string | null>(null)\n const [needsAttentionOnly, setNeedsAttentionOnly] = React.useState(() => searchParams?.get('needsAttention') === 'true')\n // One-shot URL hydration used as the hook's initial value. The hook is the\n // single source of truth from this point on \u2014 the page MUST NOT keep a\n // parallel `useState<AdvancedFilterTree>` (see spec \"Migration & Backward\n // Compatibility\" \u2192 state ownership).\n const initialFilterTree = React.useMemo<AdvancedFilterTree>(() => {\n if (!searchParams) return createEmptyTree()\n const record: Record<string, string> = {}\n searchParams.forEach((value, key) => {\n if (key.startsWith('filter[')) record[key] = value\n })\n const v2 = deserializeTree(record)\n if (v2) return v2\n const flat = deserializeAdvancedFilter(record)\n if (flat) return flatToTree(flat)\n return createEmptyTree()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n // `filterPanel` lives at the top of the component so derived state below\n // (URL params, data fetch, export config) can read `filterPanel.appliedTree`\n // directly. Real `FilterFieldDef[]` arrives later from `useAutoDiscoveredFields`\n // (it depends on columns) and is synced into the hook via a small effect at\n // the bottom of the component. The hook reads fields through a ref at\n // validation time only \u2014 first validation cannot fire before user input, by\n // which point fields have settled, so the empty initial value is safe.\n const [panelFields, setPanelFields] = React.useState<FilterFieldDef[]>([])\n const [filtersOpen, setFiltersOpen] = React.useState(false)\n const filtersTriggerRef = React.useRef<HTMLButtonElement | null>(null)\n const filterPanel = useAdvancedFilterTree({\n initial: initialFilterTree,\n fields: panelFields,\n onApply: () => setPage(1),\n })\n const advancedFilterState = filterPanel.appliedTree\n const handleAdvancedFilterClear = React.useCallback(() => {\n filterPanel.clear()\n setPage(1)\n }, [filterPanel])\n const [cacheStatus, setCacheStatus] = React.useState<'hit' | 'miss' | null>(null)\n\n const initialPersonIds = React.useMemo(\n () => extractIdsFromParams(searchParams, 'personId'),\n [searchParams],\n )\n const initialCompanyIds = React.useMemo(\n () => extractIdsFromParams(searchParams, 'companyId'),\n [searchParams],\n )\n\n const [selectedPersonIds, setSelectedPersonIds] = React.useState<string[]>(initialPersonIds)\n const [selectedCompanyIds, setSelectedCompanyIds] = React.useState<string[]>(initialCompanyIds)\n\n const [dictionaryMaps, setDictionaryMaps] = React.useState<Record<DictionaryKey, CustomerDictionaryMap>>({\n 'deal-statuses': {},\n 'pipeline-stages': {},\n })\n\n const [pipelineNames, setPipelineNames] = React.useState<Record<string, string>>({})\n\n const fetchDictionaryEntries = React.useCallback(\n async (kind: DictionaryKey) => {\n try {\n const data = await ensureCustomerDictionary(queryClient, kind, scopeVersion)\n setDictionaryMaps((prev) => ({ ...prev, [kind]: data.map }))\n } catch {\n setDictionaryMaps((prev) => ({ ...prev, [kind]: {} }))\n }\n },\n [queryClient, scopeVersion],\n )\n\n React.useEffect(() => {\n let cancelled = false\n async function loadDictionaries() {\n if (cancelled) return\n await Promise.all([fetchDictionaryEntries('deal-statuses'), fetchDictionaryEntries('pipeline-stages')])\n }\n loadDictionaries().catch(() => {})\n return () => { cancelled = true }\n }, [fetchDictionaryEntries, reloadToken])\n const dictionaryOptions = React.useMemo(() => {\n const toOptions = (map?: CustomerDictionaryMap | null): DictionaryOptionWithTone[] =>\n Object.values(map ?? {})\n .map((entry) => {\n const tone = mapDictionaryColorToTone(entry.color)\n const option: DictionaryOptionWithTone = { value: entry.value, label: entry.label }\n if (tone) option.tone = tone\n return option\n })\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n return {\n dealStatuses: toOptions(dictionaryMaps['deal-statuses']),\n pipelineStages: toOptions(dictionaryMaps['pipeline-stages']),\n }\n }, [dictionaryMaps])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadPipelines() {\n try {\n const call = await apiCall<{ items?: Array<{ id: string; name: string }> }>('/api/customers/pipelines')\n if (cancelled || !call.ok) return\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const map: Record<string, string> = {}\n items.forEach((p) => { if (p.id && p.name) map[p.id] = p.name })\n setPipelineNames(map)\n } catch (err) {\n logger.warn('failed to load pipelines', { component: 'deals.list', err })\n }\n }\n loadPipelines().catch((err) => {\n logger.warn('loadPipelines threw', { component: 'deals.list', err })\n })\n return () => { cancelled = true }\n }, [reloadToken, scopeVersion])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearch(value.trim())\n setPage(1)\n }, [])\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n if (sorting.length > 0) {\n params.set('sort', sorting[0].id)\n params.set('order', sorting[0].desc ? 'desc' : 'asc')\n }\n if (search.trim().length) params.set('search', search.trim())\n if (selectedPersonIds.length) params.set('personId', selectedPersonIds.join(','))\n if (selectedCompanyIds.length) params.set('companyId', selectedCompanyIds.join(','))\n if (needsAttentionOnly) params.set('needsAttention', 'true')\n const advancedParams = serializeTree(advancedFilterState)\n for (const [key, val] of Object.entries(advancedParams)) {\n params.set(key, val)\n }\n return params.toString()\n }, [advancedFilterState, needsAttentionOnly, page, pageSize, search, selectedCompanyIds, selectedPersonIds, sorting])\n\n const currentParams = React.useMemo(\n () => Object.fromEntries(new URLSearchParams(queryParams)),\n [queryParams],\n )\n\n const exportConfig = React.useMemo(() => ({\n view: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl('customers/deals', { ...currentParams, exportScope: 'view' }, format),\n },\n full: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl('customers/deals', { ...currentParams, exportScope: 'full', all: 'true' }, format),\n },\n }), [currentParams])\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setIsLoading(true)\n setCacheStatus(null)\n try {\n const fallback: DealsResponse = { items: [], total: 0, totalPages: 1 }\n const call = await apiCall<DealsResponse>(`/api/customers/deals?${queryParams}`, undefined, { fallback })\n if (!call.ok) {\n const message =\n typeof (call.result as { error?: string } | undefined)?.error === 'string'\n ? (call.result as { error?: string }).error!\n : t('customers.deals.list.error.load')\n flash(message, 'error')\n if (!cancelled) setCacheStatus(null)\n return\n }\n const payload = call.result ?? fallback\n if (cancelled) return\n setCacheStatus(call.cacheStatus ?? null)\n const items = Array.isArray(payload.items) ? payload.items : []\n const mapped = items\n .map((item) => mapDeal(item as Record<string, unknown>))\n .filter((row): row is DealRow => !!row)\n setRows(mapped)\n setTotal(typeof payload.total === 'number' ? payload.total : mapped.length)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)\n setTotalIsCapped(payload.totalIsCapped === true)\n } catch (err) {\n if (!cancelled) {\n setCacheStatus(null)\n const message = err instanceof Error ? err.message : t('customers.deals.list.error.load')\n flash(message, 'error')\n }\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n load()\n return () => { cancelled = true }\n }, [queryParams, reloadToken, scopeVersion, t])\n\n React.useEffect(() => {\n // A capped totalPages is a floor \u2014 pages past it hold reachable rows, so\n // clamping would bounce a deep-linked user off data that exists.\n if (!totalIsCapped && totalPages > 0 && page > totalPages) {\n setPage(totalPages)\n }\n }, [page, totalPages, totalIsCapped])\n\n const queryRef = React.useRef(searchParams?.toString() ?? '')\n React.useEffect(() => {\n if (!pathname) return\n const params = new URLSearchParams()\n if (search.trim().length) params.set('search', search.trim())\n if (selectedPersonIds.length) selectedPersonIds.forEach((id) => params.append('personId', id))\n if (selectedCompanyIds.length) selectedCompanyIds.forEach((id) => params.append('companyId', id))\n if (needsAttentionOnly) params.set('needsAttention', 'true')\n if (page > 1) params.set('page', String(page))\n const advancedParams = serializeTree(advancedFilterState)\n for (const [key, val] of Object.entries(advancedParams)) {\n params.set(key, val)\n }\n const next = params.toString()\n if (queryRef.current === next) return\n queryRef.current = next\n router.replace(next ? `${pathname}?${next}` : pathname, { scroll: false })\n }, [pathname, router, page, search, selectedPersonIds, selectedCompanyIds, needsAttentionOnly, advancedFilterState])\n\n const handleRefresh = React.useCallback(() => {\n void Promise.all([\n invalidateCustomerDictionary(queryClient, 'deal-statuses'),\n invalidateCustomerDictionary(queryClient, 'pipeline-stages'),\n ])\n setReloadToken((token) => token + 1)\n }, [queryClient])\n\n const bulkMutationContextId = 'customers-deals-list:bulk-delete'\n const { runMutation: runBulkMutation, retryLastMutation: retryBulkMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: bulkMutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const singleMutationContextId = 'customers-deals-list:single-delete'\n const { runMutation: runSingleMutation, retryLastMutation: retrySingleMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: singleMutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n\n const handleDeleteDeal = React.useCallback(\n async (dealId: string) => {\n if (pendingDeleteId) return\n const confirmed = await confirm({\n title: t(\n 'customers.deals.list.deleteConfirm',\n 'Delete this deal? This action cannot be undone.',\n ),\n variant: 'destructive',\n })\n if (!confirmed) return\n const lockVersion = rows.find((row) => row.id === dealId)?.updatedAt ?? null\n setPendingDeleteId(dealId)\n try {\n await runSingleMutation({\n operation: async () => {\n await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(lockVersion),\n () => deleteCrud('customers/deals', {\n body: { id: dealId },\n errorMessage: t('customers.deals.list.deleteError', 'Failed to delete deal.'),\n }),\n )\n },\n context: {\n formId: singleMutationContextId,\n resourceKind: 'customers.deal',\n resourceId: dealId,\n retryLastMutation: retrySingleMutation,\n },\n })\n flash(t('customers.deals.list.deleteSuccess', 'Deal deleted.'), 'success')\n setRows((prev) => prev.filter((row) => row.id !== dealId))\n setTotal((prev) => Math.max(0, prev - 1))\n handleRefresh()\n } catch (err) {\n // A stale delete surfaces the unified conflict bar (via the guarded\n // mutation) \u2014 skip the generic error flash to avoid a double message (#2332).\n if (surfaceRecordConflict(err, t)) {\n handleRefresh()\n return\n }\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('customers.deals.list.deleteError', 'Failed to delete deal.')\n flash(message, 'error')\n } finally {\n setPendingDeleteId(null)\n }\n },\n [confirm, handleRefresh, pendingDeleteId, retrySingleMutation, rows, runSingleMutation, singleMutationContextId, t],\n )\n\n const handlePageSizeChange = React.useCallback((newSize: number) => {\n setPageSize(newSize)\n setPage(1)\n }, [])\n\n const handleNeedsAttentionFilter = React.useCallback(() => {\n setNeedsAttentionOnly(true)\n setPage(1)\n }, [])\n\n const handleNeedsAttentionClear = React.useCallback(() => {\n setNeedsAttentionOnly(false)\n setPage(1)\n }, [])\n\n // Bulk owner reassignment. The picker needs a user choice, so onExecute parks a resolver\n // and the dialog settles it: `false` on cancel keeps the selection, and the success shape\n // lets DataTable clear the selection and track the queued job in the top bar.\n const [reassignOwnerOpen, setReassignOwnerOpen] = React.useState(false)\n const [reassignOwnerRows, setReassignOwnerRows] = React.useState<DealRow[]>([])\n const [isReassigningOwner, setIsReassigningOwner] = React.useState(false)\n const reassignOwnerResolver = React.useRef<((result: BulkActionExecuteResult | false) => void) | null>(null)\n\n const settleReassignOwner = React.useCallback((result: BulkActionExecuteResult | false) => {\n const resolve = reassignOwnerResolver.current\n reassignOwnerResolver.current = null\n resolve?.(result)\n }, [])\n\n const handleBulkReassignOwner = React.useCallback(\n async (selectedRows: DealRow[]): Promise<BulkActionExecuteResult | false> => {\n if (!selectedRows.length) return false\n // A second invocation (double-click) would otherwise overwrite the parked resolver and\n // leave the first `onExecute` awaiting forever.\n settleReassignOwner(false)\n setReassignOwnerRows(selectedRows)\n setReassignOwnerOpen(true)\n return new Promise<BulkActionExecuteResult | false>((resolve) => {\n reassignOwnerResolver.current = resolve\n })\n },\n [settleReassignOwner],\n )\n\n const handleReassignOwnerCancel = React.useCallback(() => {\n setReassignOwnerOpen(false)\n settleReassignOwner(false)\n }, [settleReassignOwner])\n\n const handleReassignOwnerConfirm = React.useCallback(\n async (ownerUserId: string) => {\n const ids = reassignOwnerRows.map((row) => row.id)\n if (!ids.length) {\n setReassignOwnerOpen(false)\n settleReassignOwner(false)\n return\n }\n setIsReassigningOwner(true)\n let progressJobId: string | null = null\n try {\n await runBulkMutation({\n operation: async () => {\n const outcome = await requestBulkOwnerReassignment({\n ids,\n ownerUserId,\n errorMessage: t(\n 'customers.deals.list.bulkReassignOwner.error',\n 'Failed to start bulk owner update.',\n ),\n })\n progressJobId = outcome.progressJobId\n },\n context: {\n formId: bulkMutationContextId,\n resourceKind: 'customers.deals.bulk_owner',\n retryLastMutation: retryBulkMutation,\n },\n })\n } catch (error) {\n logger.error('customers.deals.list bulk owner update failed', { err: error })\n setIsReassigningOwner(false)\n setReassignOwnerOpen(false)\n // `runBulkMutation` already surfaced the failure. Returning a message here would make\n // DataTable flash a second error toast for the same event, so settle silently.\n settleReassignOwner({ ok: false })\n return\n }\n setIsReassigningOwner(false)\n setReassignOwnerOpen(false)\n // DataTable returns right after clearing the selection when a progressJobId is present,\n // so it never calls the refresh hook \u2014 reload the rows here instead.\n handleRefresh()\n settleReassignOwner(buildReassignOwnerSuccess({\n ids,\n progressJobId,\n message: t('customers.deals.list.bulkReassignOwner.queued', 'Bulk owner update started ({count} deals).', {\n count: ids.length,\n }),\n }))\n },\n [bulkMutationContextId, handleRefresh, reassignOwnerRows, retryBulkMutation, runBulkMutation, settleReassignOwner, t],\n )\n\n const handleBulkDelete = React.useCallback(async (selectedRows: DealRow[]) => {\n const confirmed = await confirm({\n title: t('customers.deals.list.bulkDelete.title', 'Delete {count} deals?', { count: selectedRows.length }),\n description: t('customers.deals.list.bulkDelete.description', 'This action cannot be undone.'),\n variant: 'destructive',\n })\n if (!confirmed) return false\n\n const { succeeded, failures } = await runBulkMutation({\n operation: async () =>\n runBulkDelete(\n selectedRows,\n async (row) => {\n await deleteCrud('customers/deals', {\n body: { id: row.id },\n errorMessage: t('customers.deals.list.deleteError', 'Failed to delete deal.'),\n })\n },\n {\n fallbackErrorMessage: t('customers.deals.list.deleteError', 'Failed to delete deal.'),\n logTag: 'customers.deals.list',\n progress: {\n jobType: 'customers.deals.bulk_delete',\n name: t('customers.deals.list.bulkDelete.progressName', 'Delete selected deals'),\n description: t(\n 'customers.deals.list.bulkDelete.progressDescription',\n '{count} deals selected for deletion',\n { count: selectedRows.length },\n ),\n meta: { source: 'customers.deals.list' },\n },\n },\n ),\n context: {\n formId: bulkMutationContextId,\n resourceKind: 'customers.deal',\n retryLastMutation: retryBulkMutation,\n },\n })\n\n if (succeeded.length > 0) {\n const succeededIds = new Set(succeeded.map((r) => r.id))\n setRows((prev) => prev.filter((r) => !succeededIds.has(r.id)))\n setTotal((prev) => Math.max(0, prev - succeeded.length))\n setReloadToken((prev) => prev + 1)\n if (succeeded.length > 1) {\n coalesceLastOperations(succeeded.length, {\n commandId: 'customers.deals.delete',\n actionLabel: t('customers.deals.list.bulkDelete.operationLabel', 'Delete {count} deals', { count: succeeded.length }),\n resourceKind: 'customers.deal',\n })\n }\n if (failures.length === 0) {\n flash(\n t('customers.deals.list.bulkDelete.success', '{count} deals deleted', { count: succeeded.length }),\n 'success',\n )\n } else {\n flash(\n t('customers.deals.list.bulkDelete.partial', '{deleted} of {total} deals deleted; {failed} failed', {\n deleted: succeeded.length,\n total: selectedRows.length,\n failed: failures.length,\n }),\n 'warning',\n )\n }\n }\n\n for (const group of groupBulkDeleteFailures(failures)) {\n const message = group.count === 1\n ? group.sampleMessage\n : t(\n 'customers.deals.list.bulkDelete.failedGroup',\n '{count} deals could not be deleted: {message}',\n { count: group.count, message: group.sampleMessage },\n )\n flash(message, 'error')\n }\n\n return succeeded.length > 0\n }, [bulkMutationContextId, confirm, retryBulkMutation, runBulkMutation, t])\n\n const { data: customFieldDefs = [] } = useCustomFieldDefs([E.customers.customer_deal], {\n keyExtras: [scopeVersion, reloadToken],\n })\n const currentUserId = useCurrentUserId()\n const activeOrgId = useCurrentOrganization()?.id ?? null\n const [ownerFilterOptions, setOwnerFilterOptions] = React.useState<AdvancedFilterOption[]>([])\n // Single staff load drives both the owner FILTER options and the owner-name\n // map shared with the OWNER cell + the KPI strip (userId \u2192 display name).\n // No per-row fetch \u2014 see spec audit \"Owner names\" resolution.\n const [ownerNames, setOwnerNames] = React.useState<Record<string, string>>({})\n React.useEffect(() => {\n const controller = new AbortController()\n let cancelled = false\n void fetchAssignableStaffMembers('', { pageSize: 100, activeOrgId, signal: controller.signal })\n .then((items) => {\n if (cancelled) return\n setOwnerFilterOptions(mapAssignableStaffToFilterOptions(items))\n const names: Record<string, string> = {}\n for (const item of items) {\n if (item.userId) names[item.userId] = item.displayName\n }\n setOwnerNames(names)\n })\n .catch(() => {\n if (cancelled) return\n setOwnerFilterOptions([])\n setOwnerNames({})\n })\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [activeOrgId, scopeVersion])\n React.useEffect(() => {\n if (!currentUserId || ownerNames[currentUserId]) return\n const controller = new AbortController()\n let cancelled = false\n void fetchCurrentUserName({ signal: controller.signal }).then((name) => {\n if (!cancelled && name) {\n setOwnerNames((current) => ({ [currentUserId]: name, ...current }))\n }\n })\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [currentUserId, ownerNames])\n const resolvedOwnerFilterOptions = React.useMemo(\n () => ensureCurrentUserFilterOption(\n ownerFilterOptions,\n currentUserId,\n t('customers.filters.currentUser', 'Current user'),\n ),\n [currentUserId, ownerFilterOptions, t],\n )\n const loadOwnerFilterOptions = React.useCallback(async (query?: string): Promise<AdvancedFilterOption[]> => {\n const items = await fetchAssignableStaffMembers(query ?? '', { pageSize: 100, activeOrgId })\n return mapAssignableStaffToFilterOptions(items)\n }, [activeOrgId])\n\n const startOfToday = React.useMemo(() => {\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n return today\n }, [])\n const isDealOverdue = React.useCallback(\n (row: DealRow): boolean =>\n !!row.expectedCloseAt && new Date(row.expectedCloseAt) < startOfToday && row.status === 'open',\n [startOfToday],\n )\n\n const columns = React.useMemo<ColumnDef<DealRow>[]>(() => {\n const noValue = <span className=\"text-muted-foreground text-sm\">{t('customers.deals.list.noValue')}</span>\n const unknownOwner = t('customers.deals.list.unknownOwner')\n\n const customColumns = customFieldDefs\n .filter((def) => supportsCustomFieldColumn(def))\n .map<ColumnDef<DealRow>>((def) => ({\n accessorKey: `cf_${def.key}`,\n header: def.label || def.key,\n meta: {\n columnChooserGroup: def.group?.title ?? t('ui.columnChooser.customFieldsGroup', 'Custom Fields'),\n filterGroup: def.group?.title ?? t('ui.columnChooser.customFieldsGroup', 'Custom Fields'),\n filterType: mapCustomFieldKindToFilterType(def.kind),\n filterOptions: normalizeCustomFieldFilterOptions(def.options),\n hidden: def.listVisible === false,\n maxWidth: '220px',\n },\n cell: ({ getValue }) => {\n const value = getValue()\n if (value == null) return noValue\n if (Array.isArray(value)) {\n const normalized = normalizeCollectionLabels(\n value\n .map((item) => {\n if (item == null) return ''\n if (typeof item === 'string') return item\n return String(item)\n }),\n )\n if (!normalized.length) return noValue\n return <CollectionPreviewCell labels={normalized} maxVisible={2} />\n }\n if (typeof value === 'boolean') {\n return (\n <span className=\"text-sm\">\n {value\n ? t('customers.deals.list.booleanYes', 'Yes')\n : t('customers.deals.list.booleanNo', 'No')}\n </span>\n )\n }\n const stringValue = typeof value === 'string' ? value.trim() : String(value)\n if (!stringValue) return noValue\n return <span className=\"text-sm\">{stringValue}</span>\n },\n }))\n\n return [\n {\n accessorKey: 'title',\n header: t('customers.deals.list.columns.title'),\n meta: {\n alwaysVisible: true,\n columnChooserGroup: 'Basic Info',\n filterKey: 'title',\n filterGroup: 'Deal',\n maxWidth: '280px',\n },\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <Briefcase className=\"h-4 w-4\" />\n </span>\n <span className=\"font-medium text-foreground truncate\">{row.original.title}</span>\n {isDealOverdue(row.original) ? (\n <AlertTriangle\n className=\"h-4 w-4 shrink-0 text-status-warning-text\"\n aria-label={t('customers.deals.list.close.overdue')}\n />\n ) : null}\n </div>\n ),\n },\n {\n accessorKey: 'status',\n header: t('customers.deals.list.columns.status'),\n meta: {\n filterType: 'select' as const,\n filterOptions: dictionaryOptions.dealStatuses,\n columnChooserGroup: 'Basic Info',\n filterKey: 'status',\n filterGroup: 'Deal',\n },\n cell: ({ row }) => {\n const status = row.original.status\n if (!status) return noValue\n const entry = dictionaryMaps['deal-statuses']?.[status]\n const label = entry?.label ?? status\n const variant = coerceStatusBadgeVariant(mapDictionaryColorToTone(entry?.color))\n return <StatusBadge variant={variant} dot>{label}</StatusBadge>\n },\n },\n {\n accessorKey: 'pipelineStage',\n header: t('customers.deals.list.columns.pipelineStage'),\n meta: {\n filterType: 'select' as const,\n filterOptions: dictionaryOptions.pipelineStages,\n columnChooserGroup: 'Pipeline',\n filterKey: 'pipeline_stage',\n filterGroup: 'Deal',\n },\n cell: ({ row }) => {\n const stage = row.original.pipelineStage\n if (!stage) return noValue\n const label = dictionaryMaps['pipeline-stages']?.[stage]?.label ?? stage\n return <span className=\"text-foreground\">{label}</span>\n },\n },\n {\n accessorKey: 'pipelineId',\n header: t('customers.deals.list.columns.pipeline', 'Pipeline'),\n meta: {\n columnChooserGroup: 'Pipeline',\n filterKey: 'pipeline_id',\n filterGroup: 'Deal',\n maxWidth: '220px',\n },\n cell: ({ row }) => {\n const name = row.original.pipelineId ? pipelineNames[row.original.pipelineId] : null\n return name ? <span className=\"text-sm\">{name}</span> : noValue\n },\n },\n {\n accessorKey: 'valueAmount',\n header: t('customers.deals.list.columns.value'),\n meta: {\n filterType: 'number' as const,\n columnChooserGroup: 'Financial',\n filterKey: 'value_amount',\n filterGroup: 'Deal',\n },\n cell: ({ row }) => {\n const amount = formatGroupedAmount(row.original.valueAmount ?? null)\n if (amount === null) return noValue\n const currency = row.original.valueCurrency\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">{amount}</span>\n {currency ? <span className=\"text-xs text-muted-foreground\">{currency}</span> : null}\n </div>\n )\n },\n },\n {\n accessorKey: 'probability',\n header: t('customers.deals.list.columns.probability'),\n meta: {\n filterType: 'number' as const,\n columnChooserGroup: 'Financial',\n filterKey: 'probability',\n filterGroup: 'Deal',\n },\n cell: ({ row }) => {\n const value = row.original.probability\n if (typeof value === 'number' && Number.isFinite(value)) {\n return <span className=\"font-medium text-foreground\">{`${Math.min(Math.max(value, 0), 100)}%`}</span>\n }\n return noValue\n },\n },\n {\n accessorKey: 'expectedCloseAt',\n header: t('customers.deals.list.columns.expectedClose'),\n meta: {\n columnChooserGroup: 'Dates',\n filterKey: 'expected_close_at',\n filterGroup: 'Activity',\n filterIconName: 'calendar',\n },\n cell: ({ row }) => {\n const expectedCloseAt = row.original.expectedCloseAt\n if (!expectedCloseAt) return noValue\n let subtitle: React.ReactNode = null\n if (isDealOverdue(row.original)) {\n subtitle = (\n <span className=\"text-xs text-status-error-text\">{t('customers.deals.list.close.overdue')}</span>\n )\n } else if (isWonDealStatus(row.original.status)) {\n subtitle = (\n <span className=\"text-xs text-muted-foreground\">{t('customers.deals.list.close.won')}</span>\n )\n } else if (isLostDealStatus(row.original.status)) {\n subtitle = (\n <span className=\"text-xs text-muted-foreground\">{t('customers.deals.list.close.lost')}</span>\n )\n } else {\n const relative = formatRelativeTime(expectedCloseAt, { locale, translate: t })\n if (relative) {\n subtitle = <span className=\"text-xs text-muted-foreground\">{relative}</span>\n }\n }\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-foreground\">\n {formatDateValue(expectedCloseAt, t('customers.deals.list.noValue'))}\n </span>\n {subtitle}\n </div>\n )\n },\n },\n {\n accessorKey: 'ownerUserId',\n header: t('customers.deals.list.columns.owner', 'Owner'),\n meta: {\n columnChooserGroup: 'CRM',\n filterType: 'select',\n filterOptions: resolvedOwnerFilterOptions,\n filterLoadOptions: loadOwnerFilterOptions,\n filterGroup: 'CRM',\n filterIconName: 'user-round',\n filterKey: 'owner_user_id',\n },\n cell: ({ row }) => {\n const ownerUserId = row.original.ownerUserId\n if (!ownerUserId) return noValue\n const label = ownerNames[ownerUserId]?.trim() || unknownOwner\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Avatar label={label} size=\"sm\" />\n <span className=\"text-foreground truncate\">{label}</span>\n </div>\n )\n },\n },\n {\n accessorKey: 'companies',\n header: t('customers.deals.list.columns.companies'),\n meta: {\n columnChooserGroup: 'Associations',\n filterable: false,\n filterGroup: 'CRM',\n filterIconName: 'building-2',\n maxWidth: '220px',\n tooltipContent: (row: DealRow) =>\n normalizeCollectionLabels(\n row.companies.map((entry) => (entry.label && entry.label.trim().length ? entry.label : t('customers.deals.list.unnamedCompany'))),\n ).join(', '),\n },\n cell: ({ row }) => {\n const companies = row.original.companies\n if (!companies.length) return noValue\n const first = companies[0]\n const firstLabel =\n first.label && first.label.trim().length ? first.label : t('customers.deals.list.unnamedCompany')\n const overflow = companies.length - 1\n return (\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <Tag variant=\"neutral\" className=\"max-w-36\">\n <span className=\"truncate\">{firstLabel}</span>\n </Tag>\n {overflow > 0 ? <Tag variant=\"neutral\">{`+${overflow}`}</Tag> : null}\n </div>\n )\n },\n },\n {\n accessorKey: 'people',\n header: t('customers.deals.list.columns.people'),\n meta: {\n columnChooserGroup: 'Associations',\n filterable: false,\n filterGroup: 'CRM',\n filterIconName: 'user-round',\n maxWidth: '220px',\n tooltipContent: (row: DealRow) =>\n normalizeCollectionLabels(\n row.people.map((entry) => (entry.label && entry.label.trim().length ? entry.label : t('customers.deals.list.unnamedPerson'))),\n ).join(', '),\n },\n cell: ({ row }) => {\n const people = row.original.people\n if (!people.length) return noValue\n const labels = normalizeCollectionLabels(\n people.map((person) =>\n person.label && person.label.trim().length ? person.label : t('customers.deals.list.unnamedPerson')),\n )\n const tooltip = labels.join(', ')\n return (\n <SimpleTooltip content={tooltip} side=\"top\">\n <span className=\"inline-flex\">\n <AvatarStack max={4} size=\"sm\">\n {people.map((person) => (\n <Avatar\n key={person.id}\n label={person.label || t('customers.deals.list.unnamedPerson')}\n size=\"sm\"\n />\n ))}\n </AvatarStack>\n </span>\n </SimpleTooltip>\n )\n },\n },\n {\n accessorKey: 'updatedAt',\n header: t('customers.deals.list.columns.updatedAt'),\n meta: {\n columnChooserGroup: 'Dates',\n filterKey: 'updated_at',\n filterGroup: 'Activity',\n filterIconName: 'calendar',\n },\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {formatDateValue(row.original.updatedAt ?? null, t('customers.deals.list.noValue'))}\n </span>\n ),\n },\n ...customColumns,\n ]\n }, [customFieldDefs, dictionaryMaps, dictionaryOptions, isDealOverdue, loadOwnerFilterOptions, locale, ownerNames, pipelineNames, resolvedOwnerFilterOptions, t])\n\n const { advancedFilterFields } = useAutoDiscoveredFields({ columns, customFieldDefs })\n\n // Sync auto-discovered fields into the `filterPanel` declared at the top of\n // the component. See the comment on the `panelFields` state for why this\n // late-binding is safe. Bail out by content (field-key list) \u2014 every render\n // of `useAutoDiscoveredFields` produces fresh `FilterFieldDef` object refs\n // even when the set of fields hasn't actually changed, so a naive reference\n // setState would loop (\"Maximum update depth exceeded\").\n React.useEffect(() => {\n setPanelFields((prev) => {\n if (prev === advancedFilterFields) return prev\n if (prev.length === advancedFilterFields.length) {\n let same = true\n for (let i = 0; i < prev.length; i++) {\n if (prev[i].key !== advancedFilterFields[i].key) { same = false; break }\n }\n if (same) return prev\n }\n return advancedFilterFields\n })\n }, [advancedFilterFields])\n\n const associationFilterFields = React.useMemo<FilterFieldDef[]>(() => {\n const personLabels = new Map<string, string>()\n const companyLabels = new Map<string, string>()\n for (const row of rows) {\n for (const person of row.people) {\n if (selectedPersonIds.includes(person.id) && person.label.trim().length > 0) {\n personLabels.set(person.id, person.label)\n }\n }\n for (const company of row.companies) {\n if (selectedCompanyIds.includes(company.id) && company.label.trim().length > 0) {\n companyLabels.set(company.id, company.label)\n }\n }\n }\n return [\n {\n key: 'people',\n label: t('customers.deals.list.columns.people', 'People'),\n type: 'select',\n options: selectedPersonIds.map((id) => ({ value: id, label: personLabels.get(id) ?? id })),\n },\n {\n key: 'companies',\n label: t('customers.deals.list.columns.companies', 'Companies'),\n type: 'select',\n options: selectedCompanyIds.map((id) => ({ value: id, label: companyLabels.get(id) ?? id })),\n },\n ]\n }, [rows, selectedCompanyIds, selectedPersonIds, t])\n const associationFilterTree = React.useMemo<AdvancedFilterTree>(() => {\n const rules: Array<{ field: string; operator: 'is_any_of'; value: string[] }> = []\n if (selectedPersonIds.length) rules.push({ field: 'people', operator: 'is_any_of', value: selectedPersonIds })\n if (selectedCompanyIds.length) rules.push({ field: 'companies', operator: 'is_any_of', value: selectedCompanyIds })\n return rules.length ? makeMultiRuleTree(rules) : createEmptyTree()\n }, [selectedCompanyIds, selectedPersonIds])\n const handleAssociationFilterRemove = React.useCallback((nodeId: string) => {\n const node = associationFilterTree.root.children.find((child) => child.id === nodeId)\n if (!node || node.type !== 'rule') return\n if (node.field === 'people') setSelectedPersonIds([])\n if (node.field === 'companies') setSelectedCompanyIds([])\n setPage(1)\n }, [associationFilterTree.root.children])\n\n const dealsPresets = React.useMemo<FilterPreset[]>(() => makeDealsPresets(), [])\n\n return (\n <Page>\n <PageBody>\n <DealsViewTabsRow active=\"list\" className=\"mb-4\" />\n <DealsKpiStrip\n ownerNames={ownerNames}\n stageDictionary={dictionaryMaps['pipeline-stages'] ?? {}}\n pipelineCount={Object.keys(pipelineNames).length}\n scopeVersion={scopeVersion}\n reloadToken={reloadToken}\n onNeedsAttentionClick={handleNeedsAttentionFilter}\n className=\"mb-4\"\n />\n <DataTable<DealRow>\n stickyFirstColumn\n stickyActionsColumn\n actionsColumnAlign=\"center\"\n title={t('customers.deals.list.title')}\n titleHeadingLevel={1}\n actions={(\n <Button asChild>\n <Link href=\"/backend/customers/deals/create\">\n {t('customers.deals.list.actions.new', 'New deal')}\n </Link>\n </Button>\n )}\n columns={columns}\n columnChooser={{ auto: true }}\n data={rows}\n onRowClick={(row) => {\n router.push(`/backend/customers/deals/${row.id}`)\n }}\n rowActions={(row) => {\n const isDeleting = pendingDeleteId === row.id\n return (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('customers.deals.list.actions.edit', 'Edit'),\n onSelect: () => { router.push(`/backend/customers/deals/${row.id}`) },\n },\n {\n id: 'open-new-tab',\n label: t('customers.deals.list.actions.openInNewTab', 'Open in new tab'),\n onSelect: () => {\n if (typeof window !== 'undefined') {\n window.open(`/backend/customers/deals/${row.id}`, '_blank', 'noopener')\n }\n },\n },\n {\n id: 'delete',\n label: isDeleting\n ? t('customers.deals.list.actions.deleting', 'Deleting\u2026')\n : t('customers.deals.list.actions.delete', 'Delete'),\n destructive: true,\n onSelect: () => handleDeleteDeal(row.id),\n },\n ]}\n />\n )\n }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n bulkActions={[\n {\n id: 'reassign-owner',\n label: t('customers.deals.list.actions.reassignOwner', 'Reassign owner'),\n icon: UserCircle2,\n onExecute: handleBulkReassignOwner,\n },\n {\n id: 'delete',\n label: t('customers.deals.list.actions.delete', 'Delete'),\n destructive: true,\n onExecute: handleBulkDelete,\n },\n ]}\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={t('customers.deals.list.searchPlaceholder')}\n pagination={{\n page,\n pageSize,\n total,\n totalPages,\n totalIsCapped,\n onPageChange: (nextPage) => setPage(nextPage),\n pageSizeOptions: [10, 25, 50, 100],\n onPageSizeChange: handlePageSizeChange,\n cacheStatus,\n }}\n isLoading={isLoading}\n refreshButton={{\n label: t('customers.deals.list.refresh'),\n onRefresh: handleRefresh,\n }}\n exporter={exportConfig}\n entityId={E.customers.customer_deal}\n perspective={{ tableId: extensionPoints.hosts.dealsTable.tableId }}\n advancedFilter={{\n auto: true,\n value: filterPanel.tree,\n onChange: filterPanel.setTree,\n onApply: () => filterPanel.flush(),\n onClear: handleAdvancedFilterClear,\n triggerRef: filtersTriggerRef,\n externalPopover: true,\n onTriggerClick: () => setFiltersOpen((prev) => !prev),\n onApplyTree: (tree) => {\n filterPanel.replaceTree(tree)\n setPage(1)\n },\n }}\n activeFilterChips={(\n <>\n {needsAttentionOnly ? (\n <div\n className=\"flex items-center gap-2 overflow-x-auto border-b border-border bg-background px-4 py-2\"\n data-testid=\"active-filter-chips\"\n >\n <div\n className=\"inline-flex items-center gap-1\"\n data-testid=\"active-filter-chip\"\n aria-label={t('customers.deals.list.filters.needsAttention')}\n >\n <Tag variant=\"warning\" dot>{t('customers.deals.list.filters.needsAttention')}</Tag>\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n aria-label={t('customers.deals.list.filters.needsAttentionRemove')}\n onClick={handleNeedsAttentionClear}\n >\n <X className=\"size-3\" />\n </IconButton>\n </div>\n </div>\n ) : null}\n <ActiveFilterChips\n tree={associationFilterTree}\n fields={associationFilterFields}\n popoverOpen={filtersOpen}\n onRemoveNode={handleAssociationFilterRemove}\n onOpen={() => setFiltersOpen(true)}\n />\n <ActiveFilterChips\n tree={filterPanel.appliedTree}\n fields={advancedFilterFields}\n popoverOpen={filtersOpen}\n onRemoveNode={(id) => filterPanel.dispatch({ type: 'removeNode', nodeId: id })}\n onOpen={() => setFiltersOpen(true)}\n />\n </>\n )}\n filterAwareEmptyState={{\n active: needsAttentionOnly || associationFilterTree.root.children.length > 0 || advancedFilterState.root.children.length > 0,\n entityNamePlural: t('customers.deals.entityPlural', 'deals'),\n canRemoveLast: needsAttentionOnly || associationFilterTree.root.children.length > 0 || filterPanel.tree.root.children.length > 0,\n onClearAll: () => {\n handleAdvancedFilterClear()\n setSelectedPersonIds([])\n setSelectedCompanyIds([])\n setNeedsAttentionOnly(false)\n },\n onRemoveLast: () => {\n if (needsAttentionOnly) {\n handleNeedsAttentionClear()\n return\n }\n if (selectedCompanyIds.length > 0) {\n setSelectedCompanyIds([])\n setPage(1)\n return\n }\n if (selectedPersonIds.length > 0) {\n setSelectedPersonIds([])\n setPage(1)\n return\n }\n filterPanel.dispatch({ type: 'removeLast' })\n },\n }}\n emptyState={(\n <ListEmptyState\n entityName={t('customers.deals.entityPlural', 'deals')}\n createHref=\"/backend/customers/deals/create\"\n createLabel={t('customers.deals.list.actions.new', 'New deal')}\n />\n )}\n virtualized\n />\n <AdvancedFilterPanel\n fields={advancedFilterFields}\n value={filterPanel.tree}\n onChange={filterPanel.setTree}\n onApply={filterPanel.flush}\n onClear={handleAdvancedFilterClear}\n onFlush={filterPanel.flush}\n pendingErrors={filterPanel.pendingErrors}\n userId={currentUserId}\n presets={dealsPresets}\n open={filtersOpen}\n onOpenChange={setFiltersOpen}\n triggerRef={filtersTriggerRef}\n savedFilterStorageKey=\"customers.deals.list\"\n />\n </PageBody>\n <ReassignOwnerDialog\n open={reassignOwnerOpen}\n selectedCount={reassignOwnerRows.length}\n isSubmitting={isReassigningOwner}\n onClose={handleReassignOwnerCancel}\n onConfirm={(userId) => { void handleReassignOwnerConfirm(userId) }}\n />\n {ConfirmDialogElement}\n </Page>\n )\n}\n\nfunction mapDeal(item: Record<string, unknown>): DealRow | null {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const title = typeof item.title === 'string' ? item.title : ''\n const status = typeof item.status === 'string' ? item.status : null\n const pipelineStage = typeof item.pipeline_stage === 'string' ? item.pipeline_stage : null\n const pipelineStageId = typeof item.pipeline_stage_id === 'string' ? item.pipeline_stage_id : null\n const pipelineId = typeof item.pipeline_id === 'string' ? item.pipeline_id : null\n const valueAmountRaw = item.value_amount\n const valueAmount =\n typeof valueAmountRaw === 'number'\n ? valueAmountRaw\n : typeof valueAmountRaw === 'string' && valueAmountRaw.trim()\n ? Number(valueAmountRaw)\n : null\n const valueCurrency =\n typeof item.value_currency === 'string' && item.value_currency.trim().length\n ? item.value_currency.trim().toUpperCase()\n : null\n const probabilityRaw = item.probability\n const probability =\n typeof probabilityRaw === 'number'\n ? probabilityRaw\n : typeof probabilityRaw === 'string' && probabilityRaw.trim().length\n ? Number(probabilityRaw)\n : null\n const expectedCloseAt = typeof item.expected_close_at === 'string' ? item.expected_close_at : null\n const updatedAt = typeof item.updated_at === 'string' ? item.updated_at : null\n const ownerUserId = typeof item.owner_user_id === 'string' ? item.owner_user_id : null\n const peopleRaw = Array.isArray(item.people) ? item.people : []\n const companiesRaw = Array.isArray(item.companies) ? item.companies : []\n const people = peopleRaw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const data = entry as Record<string, unknown>\n const pid = typeof data.id === 'string' ? data.id : null\n if (!pid) return null\n const label = typeof data.label === 'string' ? data.label : ''\n return { id: pid, label }\n })\n .filter((entry): entry is { id: string; label: string } => !!entry)\n const companies = companiesRaw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const data = entry as Record<string, unknown>\n const cid = typeof data.id === 'string' ? data.id : null\n if (!cid) return null\n const label = typeof data.label === 'string' ? data.label : ''\n return { id: cid, label }\n })\n .filter((entry): entry is { id: string; label: string } => !!entry)\n const customFields: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(item)) {\n if (key.startsWith('cf_')) customFields[key] = value\n }\n return withDataTableNamespaces({\n id,\n title,\n status,\n pipelineStage,\n pipelineStageId,\n pipelineId,\n valueAmount,\n valueCurrency,\n probability,\n expectedCloseAt,\n updatedAt,\n ownerUserId,\n people,\n companies,\n ...customFields,\n }, item)\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/customers/extension-points'\nimport Link from 'next/link'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport { useQueryClient } from '@tanstack/react-query'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable, type DataTableExportFormat, withDataTableNamespaces } from '@open-mercato/ui/backend/DataTable'\nimport type { AdvancedFilterTree } from '@open-mercato/shared/lib/query/advanced-filter-tree'\nimport { createEmptyTree, makeRuleTree, makeMultiRuleTree } from '@open-mercato/shared/lib/query/advanced-filter-tree'\nimport { deserializeTree, deserializeAdvancedFilter, flatToTree, mapDictionaryColorToTone, serializeTree, type FilterFieldDef, type FilterOption as AdvancedFilterOption } from '@open-mercato/shared/lib/query/advanced-filter'\nimport { useCurrentUserId } from '@open-mercato/ui/backend/utils/useCurrentUserId'\nimport { useCurrentOrganization } from '@open-mercato/ui/backend/BackendChromeProvider'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { buildCrudExportUrl, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { groupBulkDeleteFailures, runBulkDelete } from '@open-mercato/ui/backend/utils/bulkDelete'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { coalesceLastOperations } from '@open-mercato/ui/backend/operations/store'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { StatusBadge, type StatusBadgeVariant } from '@open-mercato/ui/primitives/status-badge'\nimport { Avatar, AvatarStack } from '@open-mercato/ui/primitives/avatar'\nimport { Tag } from '@open-mercato/ui/primitives/tag'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Briefcase, AlertTriangle, X } from 'lucide-react'\nimport { isLostDealStatus, isWonDealStatus } from '../../../lib/dealStatus'\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { useRegisteredComponent } from '@open-mercato/ui/backend/injection/useRegisteredComponent'\nimport {\n ViewTabsRow,\n VIEW_TABS_ROW_COMPONENT_ID,\n type ViewTabsRowProps,\n} from './pipeline/components/ViewTabsRow'\nimport { DealsKpiStrip } from '../../../components/DealsKpiStrip'\nimport { E } from '#generated/entities.ids.generated'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport {\n type CustomerDictionaryKind,\n type CustomerDictionaryMap,\n} from '../../../lib/dictionaries'\nimport {\n ensureCustomerDictionary,\n invalidateCustomerDictionary,\n} from '../../../components/detail/hooks/useCustomerDictionary'\nimport {\n useCustomFieldDefs,\n} from '@open-mercato/ui/backend/utils/customFieldDefs'\nimport {\n mapCustomFieldKindToFilterType,\n normalizeCustomFieldFilterOptions,\n supportsCustomFieldColumn,\n} from '@open-mercato/ui/backend/utils/customFieldColumns'\nimport { CollectionPreviewCell, normalizeCollectionLabels } from '../../../components/list/CollectionPreviewCell'\nimport { useAutoDiscoveredFields } from '@open-mercato/ui/backend/utils/useAutoDiscoveredFields'\nimport { useAdvancedFilterTree } from '@open-mercato/ui/backend/hooks/useAdvancedFilter'\nimport { AdvancedFilterPanel } from '@open-mercato/ui/backend/filters/AdvancedFilterPanel'\nimport { ActiveFilterChips } from '@open-mercato/ui/backend/filters/ActiveFilterChips'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport type { FilterPreset } from '@open-mercato/ui/backend/filters/QuickFilters'\nimport {\n ensureCurrentUserFilterOption,\n fetchCurrentUserName,\n fetchAssignableStaffMembers,\n mapAssignableStaffToFilterOptions,\n} from '../../../lib/assignableStaff'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { UserCircle2 } from 'lucide-react'\nimport { ReassignOwnerDialog } from './components/ReassignOwnerDialog'\nimport type { BulkActionExecuteResult } from '@open-mercato/ui/backend/DataTable'\nimport { requestBulkOwnerReassignment, buildReassignOwnerSuccess } from '../../../lib/reassignDealOwner'\n\nconst logger = createLogger('customers')\n\nfunction makeDealsPresets(): FilterPreset[] {\n return [\n {\n id: 'my-deals',\n labelKey: 'customers.deals.presets.myDeals',\n requiresUser: true,\n build: ({ userId }) => makeRuleTree({ field: 'owner_user_id', operator: 'is', value: userId }),\n },\n {\n id: 'closing-month',\n labelKey: 'customers.deals.presets.closingMonth',\n iconName: 'clock',\n build: ({ now }) => {\n const start = new Date(now.getFullYear(), now.getMonth(), 1).toISOString().slice(0, 10)\n const end = new Date(now.getFullYear(), now.getMonth() + 1, 0).toISOString().slice(0, 10)\n return makeRuleTree({ field: 'expected_close_at', operator: 'between', value: [start, end] })\n },\n },\n // The Deal entity has no dedicated \"at risk\" or health-score field \u2014 `customer_deals`\n // exposes only `status` (open/win/lost/closed/in_progress, dictionary-driven) and\n // `closure_outcome`. Rather than fabricate a mapping, the \"At risk\" preset is omitted\n // until the data model exposes a first-class signal.\n {\n id: 'won-quarter',\n labelKey: 'customers.deals.presets.wonQuarter',\n build: ({ now }) => {\n const quarter = Math.floor(now.getMonth() / 3)\n const start = new Date(now.getFullYear(), quarter * 3, 1).toISOString().slice(0, 10)\n return makeMultiRuleTree([\n { field: 'status', operator: 'is', value: 'win' },\n { field: 'expected_close_at', operator: 'is_after', value: start },\n ], 'and')\n },\n },\n ]\n}\n\ntype DealRow = {\n id: string\n title: string\n status?: string | null\n pipelineStage?: string | null\n pipelineStageId?: string | null\n pipelineId?: string | null\n valueAmount?: number | null\n valueCurrency?: string | null\n probability?: number | null\n expectedCloseAt?: string | null\n updatedAt?: string | null\n ownerUserId?: string | null\n companies: { id: string; label: string }[]\n people: { id: string; label: string }[]\n} & Record<string, unknown>\n\ntype DealsResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n totalPages?: number\n totalIsCapped?: boolean\n}\n\ntype FilterOption = { value: string; label: string }\ntype DictionaryOptionWithTone = AdvancedFilterOption & FilterOption\n\ntype DictionaryKey = Extract<CustomerDictionaryKind, 'deal-statuses' | 'pipeline-stages'>\n\nconst PAGE_SIZE = 20\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\nfunction isUuid(value: string | null | undefined): value is string {\n if (!value) return false\n return UUID_REGEX.test(value.trim())\n}\n\nfunction normalizeIdCandidates(raw: Array<string>): string[] {\n const set = new Set<string>()\n raw.forEach((candidate) => {\n candidate\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .forEach((part) => {\n if (isUuid(part)) set.add(part)\n })\n })\n return Array.from(set)\n}\n\nfunction extractIdsFromParams(params: URLSearchParams | null | undefined, key: string): string[] {\n if (!params) return []\n const values = params.getAll(key)\n return normalizeIdCandidates(values)\n}\n\nfunction formatDateValue(value: string | null | undefined, fallback: string): string {\n if (!value) return fallback\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return fallback\n return date.toLocaleDateString()\n}\n\nconst STATUS_BADGE_VARIANTS: ReadonlySet<StatusBadgeVariant> = new Set([\n 'success',\n 'warning',\n 'error',\n 'info',\n 'neutral',\n])\n\nfunction coerceStatusBadgeVariant(\n tone: ReturnType<typeof mapDictionaryColorToTone>,\n): StatusBadgeVariant {\n if (tone && STATUS_BADGE_VARIANTS.has(tone as StatusBadgeVariant)) {\n return tone as StatusBadgeVariant\n }\n return 'neutral'\n}\n\nconst groupedAmountFormatter = new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 })\n\nfunction formatGroupedAmount(amount: number | null | undefined): string | null {\n if (typeof amount !== 'number' || Number.isNaN(amount)) return null\n return groupedAmountFormatter.format(amount)\n}\n\nexport default function CustomersDealsPage() {\n const t = useT()\n // Resolved through the component registry so downstream apps can hide a view\n // (or replace the whole switcher) without forking this page.\n const DealsViewTabsRow = useRegisteredComponent<ViewTabsRowProps>(\n VIEW_TABS_ROW_COMPONENT_ID,\n ViewTabsRow,\n )\n const locale = useLocale()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const router = useRouter()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const scopeVersion = useOrganizationScopeVersion()\n const queryClient = useQueryClient()\n\n const [rows, setRows] = React.useState<DealRow[]>([])\n const [page, setPage] = React.useState(() => {\n const raw = Number(searchParams?.get('page') ?? '1')\n return Number.isFinite(raw) && raw > 0 ? raw : 1\n })\n const [pageSize, setPageSize] = React.useState(PAGE_SIZE)\n const [sorting, setSorting] = React.useState<import('@tanstack/react-table').SortingState>([])\n const [total, setTotal] = React.useState(0)\n const [totalPages, setTotalPages] = React.useState(1)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const [search, setSearch] = React.useState(() => searchParams?.get('search')?.trim() ?? '')\n const [isLoading, setIsLoading] = React.useState(false)\n const [reloadToken, setReloadToken] = React.useState(0)\n const [pendingDeleteId, setPendingDeleteId] = React.useState<string | null>(null)\n const [needsAttentionOnly, setNeedsAttentionOnly] = React.useState(() => searchParams?.get('needsAttention') === 'true')\n // One-shot URL hydration used as the hook's initial value. The hook is the\n // single source of truth from this point on \u2014 the page MUST NOT keep a\n // parallel `useState<AdvancedFilterTree>` (see spec \"Migration & Backward\n // Compatibility\" \u2192 state ownership).\n const initialFilterTree = React.useMemo<AdvancedFilterTree>(() => {\n if (!searchParams) return createEmptyTree()\n const record: Record<string, string> = {}\n searchParams.forEach((value, key) => {\n if (key.startsWith('filter[')) record[key] = value\n })\n const v2 = deserializeTree(record)\n if (v2) return v2\n const flat = deserializeAdvancedFilter(record)\n if (flat) return flatToTree(flat)\n return createEmptyTree()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n // `filterPanel` lives at the top of the component so derived state below\n // (URL params, data fetch, export config) can read `filterPanel.appliedTree`\n // directly. Real `FilterFieldDef[]` arrives later from `useAutoDiscoveredFields`\n // (it depends on columns) and is synced into the hook via a small effect at\n // the bottom of the component. The hook reads fields through a ref at\n // validation time only \u2014 first validation cannot fire before user input, by\n // which point fields have settled, so the empty initial value is safe.\n const [panelFields, setPanelFields] = React.useState<FilterFieldDef[]>([])\n const [filtersOpen, setFiltersOpen] = React.useState(false)\n const filtersTriggerRef = React.useRef<HTMLButtonElement | null>(null)\n const filterPanel = useAdvancedFilterTree({\n initial: initialFilterTree,\n fields: panelFields,\n onApply: () => setPage(1),\n })\n const advancedFilterState = filterPanel.appliedTree\n const handleAdvancedFilterClear = React.useCallback(() => {\n filterPanel.clear()\n setPage(1)\n }, [filterPanel])\n const [cacheStatus, setCacheStatus] = React.useState<'hit' | 'miss' | null>(null)\n\n const initialPersonIds = React.useMemo(\n () => extractIdsFromParams(searchParams, 'personId'),\n [searchParams],\n )\n const initialCompanyIds = React.useMemo(\n () => extractIdsFromParams(searchParams, 'companyId'),\n [searchParams],\n )\n\n const [selectedPersonIds, setSelectedPersonIds] = React.useState<string[]>(initialPersonIds)\n const [selectedCompanyIds, setSelectedCompanyIds] = React.useState<string[]>(initialCompanyIds)\n\n const [dictionaryMaps, setDictionaryMaps] = React.useState<Record<DictionaryKey, CustomerDictionaryMap>>({\n 'deal-statuses': {},\n 'pipeline-stages': {},\n })\n\n const [pipelineNames, setPipelineNames] = React.useState<Record<string, string>>({})\n\n const fetchDictionaryEntries = React.useCallback(\n async (kind: DictionaryKey) => {\n try {\n const data = await ensureCustomerDictionary(queryClient, kind, scopeVersion)\n setDictionaryMaps((prev) => ({ ...prev, [kind]: data.map }))\n } catch {\n setDictionaryMaps((prev) => ({ ...prev, [kind]: {} }))\n }\n },\n [queryClient, scopeVersion],\n )\n\n React.useEffect(() => {\n let cancelled = false\n async function loadDictionaries() {\n if (cancelled) return\n await Promise.all([fetchDictionaryEntries('deal-statuses'), fetchDictionaryEntries('pipeline-stages')])\n }\n loadDictionaries().catch(() => {})\n return () => { cancelled = true }\n }, [fetchDictionaryEntries, reloadToken])\n const dictionaryOptions = React.useMemo(() => {\n const toOptions = (map?: CustomerDictionaryMap | null): DictionaryOptionWithTone[] =>\n Object.values(map ?? {})\n .map((entry) => {\n const tone = mapDictionaryColorToTone(entry.color)\n const option: DictionaryOptionWithTone = { value: entry.value, label: entry.label }\n if (tone) option.tone = tone\n return option\n })\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n return {\n dealStatuses: toOptions(dictionaryMaps['deal-statuses']),\n pipelineStages: toOptions(dictionaryMaps['pipeline-stages']),\n }\n }, [dictionaryMaps])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadPipelines() {\n try {\n const call = await apiCall<{ items?: Array<{ id: string; name: string }> }>('/api/customers/pipelines')\n if (cancelled || !call.ok) return\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const map: Record<string, string> = {}\n items.forEach((p) => { if (p.id && p.name) map[p.id] = p.name })\n setPipelineNames(map)\n } catch (err) {\n logger.warn('failed to load pipelines', { component: 'deals.list', err })\n }\n }\n loadPipelines().catch((err) => {\n logger.warn('loadPipelines threw', { component: 'deals.list', err })\n })\n return () => { cancelled = true }\n }, [reloadToken, scopeVersion])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearch(value.trim())\n setPage(1)\n }, [])\n\n const queryParams = React.useMemo(() => {\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n if (sorting.length > 0) {\n params.set('sort', sorting[0].id)\n params.set('order', sorting[0].desc ? 'desc' : 'asc')\n }\n if (search.trim().length) params.set('search', search.trim())\n if (selectedPersonIds.length) params.set('personId', selectedPersonIds.join(','))\n if (selectedCompanyIds.length) params.set('companyId', selectedCompanyIds.join(','))\n if (needsAttentionOnly) params.set('needsAttention', 'true')\n const advancedParams = serializeTree(advancedFilterState)\n for (const [key, val] of Object.entries(advancedParams)) {\n params.set(key, val)\n }\n return params.toString()\n }, [advancedFilterState, needsAttentionOnly, page, pageSize, search, selectedCompanyIds, selectedPersonIds, sorting])\n\n const currentParams = React.useMemo(\n () => Object.fromEntries(new URLSearchParams(queryParams)),\n [queryParams],\n )\n\n const exportConfig = React.useMemo(() => ({\n view: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl('customers/deals', { ...currentParams, exportScope: 'view' }, format),\n },\n full: {\n getUrl: (format: DataTableExportFormat) =>\n buildCrudExportUrl('customers/deals', { ...currentParams, exportScope: 'full', all: 'true' }, format),\n },\n }), [currentParams])\n\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n setIsLoading(true)\n setCacheStatus(null)\n try {\n const fallback: DealsResponse = { items: [], total: 0, totalPages: 1 }\n const call = await apiCall<DealsResponse>(`/api/customers/deals?${queryParams}`, undefined, { fallback })\n if (!call.ok) {\n const message =\n typeof (call.result as { error?: string } | undefined)?.error === 'string'\n ? (call.result as { error?: string }).error!\n : t('customers.deals.list.error.load')\n flash(message, 'error')\n if (!cancelled) setCacheStatus(null)\n return\n }\n const payload = call.result ?? fallback\n if (cancelled) return\n setCacheStatus(call.cacheStatus ?? null)\n const items = Array.isArray(payload.items) ? payload.items : []\n const mapped = items\n .map((item) => mapDeal(item as Record<string, unknown>))\n .filter((row): row is DealRow => !!row)\n setRows(mapped)\n setTotal(typeof payload.total === 'number' ? payload.total : mapped.length)\n setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)\n setTotalIsCapped(payload.totalIsCapped === true)\n } catch (err) {\n if (!cancelled) {\n setCacheStatus(null)\n const message = err instanceof Error ? err.message : t('customers.deals.list.error.load')\n flash(message, 'error')\n }\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n load()\n return () => { cancelled = true }\n }, [queryParams, reloadToken, scopeVersion, t])\n\n React.useEffect(() => {\n // A capped totalPages is a floor \u2014 pages past it hold reachable rows, so\n // clamping would bounce a deep-linked user off data that exists.\n if (!totalIsCapped && totalPages > 0 && page > totalPages) {\n setPage(totalPages)\n }\n }, [page, totalPages, totalIsCapped])\n\n const queryRef = React.useRef(searchParams?.toString() ?? '')\n React.useEffect(() => {\n if (!pathname) return\n const params = new URLSearchParams()\n if (search.trim().length) params.set('search', search.trim())\n if (selectedPersonIds.length) selectedPersonIds.forEach((id) => params.append('personId', id))\n if (selectedCompanyIds.length) selectedCompanyIds.forEach((id) => params.append('companyId', id))\n if (needsAttentionOnly) params.set('needsAttention', 'true')\n if (page > 1) params.set('page', String(page))\n const advancedParams = serializeTree(advancedFilterState)\n for (const [key, val] of Object.entries(advancedParams)) {\n params.set(key, val)\n }\n const next = params.toString()\n if (queryRef.current === next) return\n queryRef.current = next\n router.replace(next ? `${pathname}?${next}` : pathname, { scroll: false })\n }, [pathname, router, page, search, selectedPersonIds, selectedCompanyIds, needsAttentionOnly, advancedFilterState])\n\n const handleRefresh = React.useCallback(() => {\n void Promise.all([\n invalidateCustomerDictionary(queryClient, 'deal-statuses'),\n invalidateCustomerDictionary(queryClient, 'pipeline-stages'),\n ])\n setReloadToken((token) => token + 1)\n }, [queryClient])\n\n const bulkMutationContextId = 'customers-deals-list:bulk-delete'\n const { runMutation: runBulkMutation, retryLastMutation: retryBulkMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: bulkMutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const singleMutationContextId = 'customers-deals-list:single-delete'\n const { runMutation: runSingleMutation, retryLastMutation: retrySingleMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: singleMutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n\n const handleDeleteDeal = React.useCallback(\n async (dealId: string) => {\n if (pendingDeleteId) return\n const confirmed = await confirm({\n title: t(\n 'customers.deals.list.deleteConfirm',\n 'Delete this deal? This action cannot be undone.',\n ),\n variant: 'destructive',\n })\n if (!confirmed) return\n const lockVersion = rows.find((row) => row.id === dealId)?.updatedAt ?? null\n setPendingDeleteId(dealId)\n try {\n await runSingleMutation({\n operation: async () => {\n await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(lockVersion),\n () => deleteCrud('customers/deals', {\n body: { id: dealId },\n errorMessage: t('customers.deals.list.deleteError', 'Failed to delete deal.'),\n }),\n )\n },\n context: {\n formId: singleMutationContextId,\n resourceKind: 'customers.deal',\n resourceId: dealId,\n retryLastMutation: retrySingleMutation,\n },\n })\n flash(t('customers.deals.list.deleteSuccess', 'Deal deleted.'), 'success')\n setRows((prev) => prev.filter((row) => row.id !== dealId))\n setTotal((prev) => Math.max(0, prev - 1))\n handleRefresh()\n } catch (err) {\n // A stale delete surfaces the unified conflict bar (via the guarded\n // mutation) \u2014 skip the generic error flash to avoid a double message (#2332).\n if (surfaceRecordConflict(err, t)) {\n handleRefresh()\n return\n }\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('customers.deals.list.deleteError', 'Failed to delete deal.')\n flash(message, 'error')\n } finally {\n setPendingDeleteId(null)\n }\n },\n [confirm, handleRefresh, pendingDeleteId, retrySingleMutation, rows, runSingleMutation, singleMutationContextId, t],\n )\n\n const handlePageSizeChange = React.useCallback((newSize: number) => {\n setPageSize(newSize)\n setPage(1)\n }, [])\n\n const handleNeedsAttentionFilter = React.useCallback(() => {\n setNeedsAttentionOnly(true)\n setPage(1)\n }, [])\n\n const handleNeedsAttentionClear = React.useCallback(() => {\n setNeedsAttentionOnly(false)\n setPage(1)\n }, [])\n\n // Bulk owner reassignment. The picker needs a user choice, so onExecute parks a resolver\n // and the dialog settles it: `false` on cancel keeps the selection, and the success shape\n // lets DataTable clear the selection and track the queued job in the top bar.\n const [reassignOwnerOpen, setReassignOwnerOpen] = React.useState(false)\n const [reassignOwnerRows, setReassignOwnerRows] = React.useState<DealRow[]>([])\n const [isReassigningOwner, setIsReassigningOwner] = React.useState(false)\n const reassignOwnerResolver = React.useRef<((result: BulkActionExecuteResult | false) => void) | null>(null)\n\n const settleReassignOwner = React.useCallback((result: BulkActionExecuteResult | false) => {\n const resolve = reassignOwnerResolver.current\n reassignOwnerResolver.current = null\n resolve?.(result)\n }, [])\n\n const handleBulkReassignOwner = React.useCallback(\n async (selectedRows: DealRow[]): Promise<BulkActionExecuteResult | false> => {\n if (!selectedRows.length) return false\n // A second invocation (double-click) would otherwise overwrite the parked resolver and\n // leave the first `onExecute` awaiting forever.\n settleReassignOwner(false)\n setReassignOwnerRows(selectedRows)\n setReassignOwnerOpen(true)\n return new Promise<BulkActionExecuteResult | false>((resolve) => {\n reassignOwnerResolver.current = resolve\n })\n },\n [settleReassignOwner],\n )\n\n const handleReassignOwnerCancel = React.useCallback(() => {\n setReassignOwnerOpen(false)\n settleReassignOwner(false)\n }, [settleReassignOwner])\n\n const handleReassignOwnerConfirm = React.useCallback(\n async (ownerUserId: string) => {\n const ids = reassignOwnerRows.map((row) => row.id)\n if (!ids.length) {\n setReassignOwnerOpen(false)\n settleReassignOwner(false)\n return\n }\n setIsReassigningOwner(true)\n let progressJobId: string | null = null\n try {\n await runBulkMutation({\n operation: async () => {\n const outcome = await requestBulkOwnerReassignment({\n ids,\n ownerUserId,\n errorMessage: t(\n 'customers.deals.list.bulkReassignOwner.error',\n 'Failed to start bulk owner update.',\n ),\n })\n progressJobId = outcome.progressJobId\n },\n context: {\n formId: bulkMutationContextId,\n resourceKind: 'customers.deals.bulk_owner',\n retryLastMutation: retryBulkMutation,\n },\n })\n } catch (error) {\n logger.error('customers.deals.list bulk owner update failed', { err: error })\n setIsReassigningOwner(false)\n setReassignOwnerOpen(false)\n // `runBulkMutation` already surfaced the failure. Returning a message here would make\n // DataTable flash a second error toast for the same event, so settle silently.\n settleReassignOwner({ ok: false })\n return\n }\n setIsReassigningOwner(false)\n setReassignOwnerOpen(false)\n // DataTable returns right after clearing the selection when a progressJobId is present,\n // so it never calls the refresh hook \u2014 reload the rows here instead.\n handleRefresh()\n settleReassignOwner(buildReassignOwnerSuccess({\n ids,\n progressJobId,\n message: t('customers.deals.list.bulkReassignOwner.queued', 'Bulk owner update started ({count} deals).', {\n count: ids.length,\n }),\n }))\n },\n [bulkMutationContextId, handleRefresh, reassignOwnerRows, retryBulkMutation, runBulkMutation, settleReassignOwner, t],\n )\n\n const handleBulkDelete = React.useCallback(async (selectedRows: DealRow[]) => {\n const confirmed = await confirm({\n title: t('customers.deals.list.bulkDelete.title', 'Delete {count} deals?', { count: selectedRows.length }),\n description: t('customers.deals.list.bulkDelete.description', 'This action cannot be undone.'),\n variant: 'destructive',\n })\n if (!confirmed) return false\n\n const { succeeded, failures } = await runBulkMutation({\n operation: async () =>\n runBulkDelete(\n selectedRows,\n async (row) => {\n await deleteCrud('customers/deals', {\n body: { id: row.id },\n errorMessage: t('customers.deals.list.deleteError', 'Failed to delete deal.'),\n })\n },\n {\n fallbackErrorMessage: t('customers.deals.list.deleteError', 'Failed to delete deal.'),\n logTag: 'customers.deals.list',\n progress: {\n jobType: 'customers.deals.bulk_delete',\n name: t('customers.deals.list.bulkDelete.progressName', 'Delete selected deals'),\n description: t(\n 'customers.deals.list.bulkDelete.progressDescription',\n '{count} deals selected for deletion',\n { count: selectedRows.length },\n ),\n meta: { source: 'customers.deals.list' },\n },\n },\n ),\n context: {\n formId: bulkMutationContextId,\n resourceKind: 'customers.deal',\n retryLastMutation: retryBulkMutation,\n },\n })\n\n if (succeeded.length > 0) {\n const succeededIds = new Set(succeeded.map((r) => r.id))\n setRows((prev) => prev.filter((r) => !succeededIds.has(r.id)))\n setTotal((prev) => Math.max(0, prev - succeeded.length))\n setReloadToken((prev) => prev + 1)\n if (succeeded.length > 1) {\n coalesceLastOperations(succeeded.length, {\n commandId: 'customers.deals.delete',\n actionLabel: t('customers.deals.list.bulkDelete.operationLabel', 'Delete {count} deals', { count: succeeded.length }),\n resourceKind: 'customers.deal',\n })\n }\n if (failures.length === 0) {\n flash(\n t('customers.deals.list.bulkDelete.success', '{count} deals deleted', { count: succeeded.length }),\n 'success',\n )\n } else {\n flash(\n t('customers.deals.list.bulkDelete.partial', '{deleted} of {total} deals deleted; {failed} failed', {\n deleted: succeeded.length,\n total: selectedRows.length,\n failed: failures.length,\n }),\n 'warning',\n )\n }\n }\n\n for (const group of groupBulkDeleteFailures(failures)) {\n const message = group.count === 1\n ? group.sampleMessage\n : t(\n 'customers.deals.list.bulkDelete.failedGroup',\n '{count} deals could not be deleted: {message}',\n { count: group.count, message: group.sampleMessage },\n )\n flash(message, 'error')\n }\n\n return succeeded.length > 0\n }, [bulkMutationContextId, confirm, retryBulkMutation, runBulkMutation, t])\n\n const { data: customFieldDefs = [] } = useCustomFieldDefs([E.customers.customer_deal], {\n keyExtras: [scopeVersion, reloadToken],\n })\n const currentUserId = useCurrentUserId()\n const activeOrgId = useCurrentOrganization()?.id ?? null\n const [ownerFilterOptions, setOwnerFilterOptions] = React.useState<AdvancedFilterOption[]>([])\n // Single staff load drives both the owner FILTER options and the owner-name\n // map shared with the OWNER cell + the KPI strip (userId \u2192 display name).\n // No per-row fetch \u2014 see spec audit \"Owner names\" resolution.\n const [ownerNames, setOwnerNames] = React.useState<Record<string, string>>({})\n React.useEffect(() => {\n const controller = new AbortController()\n let cancelled = false\n void fetchAssignableStaffMembers('', { pageSize: 100, activeOrgId, signal: controller.signal })\n .then((items) => {\n if (cancelled) return\n setOwnerFilterOptions(mapAssignableStaffToFilterOptions(items))\n const names: Record<string, string> = {}\n for (const item of items) {\n if (item.userId) names[item.userId] = item.displayName\n }\n setOwnerNames(names)\n })\n .catch(() => {\n if (cancelled) return\n setOwnerFilterOptions([])\n setOwnerNames({})\n })\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [activeOrgId, scopeVersion])\n React.useEffect(() => {\n if (!currentUserId || ownerNames[currentUserId]) return\n const controller = new AbortController()\n let cancelled = false\n void fetchCurrentUserName({ signal: controller.signal }).then((name) => {\n if (!cancelled && name) {\n setOwnerNames((current) => ({ [currentUserId]: name, ...current }))\n }\n })\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [currentUserId, ownerNames])\n const resolvedOwnerFilterOptions = React.useMemo(\n () => ensureCurrentUserFilterOption(\n ownerFilterOptions,\n currentUserId,\n t('customers.filters.currentUser', 'Current user'),\n ),\n [currentUserId, ownerFilterOptions, t],\n )\n const loadOwnerFilterOptions = React.useCallback(async (query?: string): Promise<AdvancedFilterOption[]> => {\n const items = await fetchAssignableStaffMembers(query ?? '', { pageSize: 100, activeOrgId })\n return mapAssignableStaffToFilterOptions(items)\n }, [activeOrgId])\n\n const startOfToday = React.useMemo(() => {\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n return today\n }, [])\n const isDealOverdue = React.useCallback(\n (row: DealRow): boolean =>\n !!row.expectedCloseAt && new Date(row.expectedCloseAt) < startOfToday && row.status === 'open',\n [startOfToday],\n )\n\n const columns = React.useMemo<ColumnDef<DealRow>[]>(() => {\n const noValue = <span className=\"text-muted-foreground text-sm\">{t('customers.deals.list.noValue')}</span>\n const unknownOwner = t('customers.deals.list.unknownOwner')\n\n const customColumns = customFieldDefs\n .filter((def) => supportsCustomFieldColumn(def))\n .map<ColumnDef<DealRow>>((def) => ({\n accessorKey: `cf_${def.key}`,\n header: def.label || def.key,\n meta: {\n columnChooserGroup: def.group?.title ?? t('ui.columnChooser.customFieldsGroup', 'Custom Fields'),\n filterGroup: def.group?.title ?? t('ui.columnChooser.customFieldsGroup', 'Custom Fields'),\n filterType: mapCustomFieldKindToFilterType(def.kind),\n filterOptions: normalizeCustomFieldFilterOptions(def.options),\n hidden: def.listVisible === false,\n maxWidth: '220px',\n },\n cell: ({ getValue }) => {\n const value = getValue()\n if (value == null) return noValue\n if (Array.isArray(value)) {\n const normalized = normalizeCollectionLabels(\n value\n .map((item) => {\n if (item == null) return ''\n if (typeof item === 'string') return item\n return String(item)\n }),\n )\n if (!normalized.length) return noValue\n return <CollectionPreviewCell labels={normalized} maxVisible={2} />\n }\n if (typeof value === 'boolean') {\n return (\n <span className=\"text-sm\">\n {value\n ? t('customers.deals.list.booleanYes', 'Yes')\n : t('customers.deals.list.booleanNo', 'No')}\n </span>\n )\n }\n const stringValue = typeof value === 'string' ? value.trim() : String(value)\n if (!stringValue) return noValue\n return <span className=\"text-sm\">{stringValue}</span>\n },\n }))\n\n return [\n {\n accessorKey: 'title',\n header: t('customers.deals.list.columns.title'),\n meta: {\n alwaysVisible: true,\n columnChooserGroup: t('customers.columnGroups.basicInfo', 'Basic Info'),\n filterKey: 'title',\n filterGroup: t('customers.columnGroups.deal', 'Deal'),\n maxWidth: '280px',\n },\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <Briefcase className=\"h-4 w-4\" />\n </span>\n <span className=\"font-medium text-foreground truncate\">{row.original.title}</span>\n {isDealOverdue(row.original) ? (\n <AlertTriangle\n className=\"h-4 w-4 shrink-0 text-status-warning-text\"\n aria-label={t('customers.deals.list.close.overdue')}\n />\n ) : null}\n </div>\n ),\n },\n {\n accessorKey: 'status',\n header: t('customers.deals.list.columns.status'),\n meta: {\n filterType: 'select' as const,\n filterOptions: dictionaryOptions.dealStatuses,\n columnChooserGroup: t('customers.columnGroups.basicInfo', 'Basic Info'),\n filterKey: 'status',\n filterGroup: t('customers.columnGroups.deal', 'Deal'),\n },\n cell: ({ row }) => {\n const status = row.original.status\n if (!status) return noValue\n const entry = dictionaryMaps['deal-statuses']?.[status]\n const label = entry?.label ?? status\n const variant = coerceStatusBadgeVariant(mapDictionaryColorToTone(entry?.color))\n return <StatusBadge variant={variant} dot>{label}</StatusBadge>\n },\n },\n {\n accessorKey: 'pipelineStage',\n header: t('customers.deals.list.columns.pipelineStage'),\n meta: {\n filterType: 'select' as const,\n filterOptions: dictionaryOptions.pipelineStages,\n columnChooserGroup: t('customers.columnGroups.pipeline', 'Pipeline'),\n filterKey: 'pipeline_stage',\n filterGroup: t('customers.columnGroups.deal', 'Deal'),\n },\n cell: ({ row }) => {\n const stage = row.original.pipelineStage\n if (!stage) return noValue\n const label = dictionaryMaps['pipeline-stages']?.[stage]?.label ?? stage\n return <span className=\"text-foreground\">{label}</span>\n },\n },\n {\n accessorKey: 'pipelineId',\n header: t('customers.deals.list.columns.pipeline', 'Pipeline'),\n meta: {\n columnChooserGroup: t('customers.columnGroups.pipeline', 'Pipeline'),\n filterKey: 'pipeline_id',\n filterGroup: t('customers.columnGroups.deal', 'Deal'),\n maxWidth: '220px',\n },\n cell: ({ row }) => {\n const name = row.original.pipelineId ? pipelineNames[row.original.pipelineId] : null\n return name ? <span className=\"text-sm\">{name}</span> : noValue\n },\n },\n {\n accessorKey: 'valueAmount',\n header: t('customers.deals.list.columns.value'),\n meta: {\n filterType: 'number' as const,\n columnChooserGroup: t('customers.columnGroups.financial', 'Financial'),\n filterKey: 'value_amount',\n filterGroup: t('customers.columnGroups.deal', 'Deal'),\n },\n cell: ({ row }) => {\n const amount = formatGroupedAmount(row.original.valueAmount ?? null)\n if (amount === null) return noValue\n const currency = row.original.valueCurrency\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-foreground\">{amount}</span>\n {currency ? <span className=\"text-xs text-muted-foreground\">{currency}</span> : null}\n </div>\n )\n },\n },\n {\n accessorKey: 'probability',\n header: t('customers.deals.list.columns.probability'),\n meta: {\n filterType: 'number' as const,\n columnChooserGroup: t('customers.columnGroups.financial', 'Financial'),\n filterKey: 'probability',\n filterGroup: t('customers.columnGroups.deal', 'Deal'),\n },\n cell: ({ row }) => {\n const value = row.original.probability\n if (typeof value === 'number' && Number.isFinite(value)) {\n return <span className=\"font-medium text-foreground\">{`${Math.min(Math.max(value, 0), 100)}%`}</span>\n }\n return noValue\n },\n },\n {\n accessorKey: 'expectedCloseAt',\n header: t('customers.deals.list.columns.expectedClose'),\n meta: {\n columnChooserGroup: t('customers.columnGroups.dates', 'Dates'),\n filterKey: 'expected_close_at',\n filterGroup: t('customers.columnGroups.activity', 'Activity'),\n filterIconName: 'calendar',\n },\n cell: ({ row }) => {\n const expectedCloseAt = row.original.expectedCloseAt\n if (!expectedCloseAt) return noValue\n let subtitle: React.ReactNode = null\n if (isDealOverdue(row.original)) {\n subtitle = (\n <span className=\"text-xs text-status-error-text\">{t('customers.deals.list.close.overdue')}</span>\n )\n } else if (isWonDealStatus(row.original.status)) {\n subtitle = (\n <span className=\"text-xs text-muted-foreground\">{t('customers.deals.list.close.won')}</span>\n )\n } else if (isLostDealStatus(row.original.status)) {\n subtitle = (\n <span className=\"text-xs text-muted-foreground\">{t('customers.deals.list.close.lost')}</span>\n )\n } else {\n const relative = formatRelativeTime(expectedCloseAt, { locale, translate: t })\n if (relative) {\n subtitle = <span className=\"text-xs text-muted-foreground\">{relative}</span>\n }\n }\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-foreground\">\n {formatDateValue(expectedCloseAt, t('customers.deals.list.noValue'))}\n </span>\n {subtitle}\n </div>\n )\n },\n },\n {\n accessorKey: 'ownerUserId',\n header: t('customers.deals.list.columns.owner', 'Owner'),\n meta: {\n columnChooserGroup: t('customers.columnGroups.crm', 'CRM'),\n filterType: 'select',\n filterOptions: resolvedOwnerFilterOptions,\n filterLoadOptions: loadOwnerFilterOptions,\n filterGroup: t('customers.columnGroups.crm', 'CRM'),\n filterIconName: 'user-round',\n filterKey: 'owner_user_id',\n },\n cell: ({ row }) => {\n const ownerUserId = row.original.ownerUserId\n if (!ownerUserId) return noValue\n const label = ownerNames[ownerUserId]?.trim() || unknownOwner\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Avatar label={label} size=\"sm\" />\n <span className=\"text-foreground truncate\">{label}</span>\n </div>\n )\n },\n },\n {\n accessorKey: 'companies',\n header: t('customers.deals.list.columns.companies'),\n meta: {\n columnChooserGroup: t('customers.columnGroups.associations', 'Associations'),\n filterable: false,\n filterGroup: t('customers.columnGroups.crm', 'CRM'),\n filterIconName: 'building-2',\n maxWidth: '220px',\n tooltipContent: (row: DealRow) =>\n normalizeCollectionLabels(\n row.companies.map((entry) => (entry.label && entry.label.trim().length ? entry.label : t('customers.deals.list.unnamedCompany'))),\n ).join(', '),\n },\n cell: ({ row }) => {\n const companies = row.original.companies\n if (!companies.length) return noValue\n const first = companies[0]\n const firstLabel =\n first.label && first.label.trim().length ? first.label : t('customers.deals.list.unnamedCompany')\n const overflow = companies.length - 1\n return (\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <Tag variant=\"neutral\" className=\"max-w-36\">\n <span className=\"truncate\">{firstLabel}</span>\n </Tag>\n {overflow > 0 ? <Tag variant=\"neutral\">{`+${overflow}`}</Tag> : null}\n </div>\n )\n },\n },\n {\n accessorKey: 'people',\n header: t('customers.deals.list.columns.people'),\n meta: {\n columnChooserGroup: t('customers.columnGroups.associations', 'Associations'),\n filterable: false,\n filterGroup: t('customers.columnGroups.crm', 'CRM'),\n filterIconName: 'user-round',\n maxWidth: '220px',\n tooltipContent: (row: DealRow) =>\n normalizeCollectionLabels(\n row.people.map((entry) => (entry.label && entry.label.trim().length ? entry.label : t('customers.deals.list.unnamedPerson'))),\n ).join(', '),\n },\n cell: ({ row }) => {\n const people = row.original.people\n if (!people.length) return noValue\n const labels = normalizeCollectionLabels(\n people.map((person) =>\n person.label && person.label.trim().length ? person.label : t('customers.deals.list.unnamedPerson')),\n )\n const tooltip = labels.join(', ')\n return (\n <SimpleTooltip content={tooltip} side=\"top\">\n <span className=\"inline-flex\">\n <AvatarStack max={4} size=\"sm\">\n {people.map((person) => (\n <Avatar\n key={person.id}\n label={person.label || t('customers.deals.list.unnamedPerson')}\n size=\"sm\"\n />\n ))}\n </AvatarStack>\n </span>\n </SimpleTooltip>\n )\n },\n },\n {\n accessorKey: 'updatedAt',\n header: t('customers.deals.list.columns.updatedAt'),\n meta: {\n columnChooserGroup: t('customers.columnGroups.dates', 'Dates'),\n filterKey: 'updated_at',\n filterGroup: t('customers.columnGroups.activity', 'Activity'),\n filterIconName: 'calendar',\n },\n cell: ({ row }) => (\n <span className=\"text-sm\">\n {formatDateValue(row.original.updatedAt ?? null, t('customers.deals.list.noValue'))}\n </span>\n ),\n },\n ...customColumns,\n ]\n }, [customFieldDefs, dictionaryMaps, dictionaryOptions, isDealOverdue, loadOwnerFilterOptions, locale, ownerNames, pipelineNames, resolvedOwnerFilterOptions, t])\n\n const { advancedFilterFields } = useAutoDiscoveredFields({ columns, customFieldDefs })\n\n // Sync auto-discovered fields into the `filterPanel` declared at the top of\n // the component. See the comment on the `panelFields` state for why this\n // late-binding is safe. Bail out by content (field-key list) \u2014 every render\n // of `useAutoDiscoveredFields` produces fresh `FilterFieldDef` object refs\n // even when the set of fields hasn't actually changed, so a naive reference\n // setState would loop (\"Maximum update depth exceeded\").\n React.useEffect(() => {\n setPanelFields((prev) => {\n if (prev === advancedFilterFields) return prev\n if (prev.length === advancedFilterFields.length) {\n let same = true\n for (let i = 0; i < prev.length; i++) {\n if (prev[i].key !== advancedFilterFields[i].key) { same = false; break }\n }\n if (same) return prev\n }\n return advancedFilterFields\n })\n }, [advancedFilterFields])\n\n const associationFilterFields = React.useMemo<FilterFieldDef[]>(() => {\n const personLabels = new Map<string, string>()\n const companyLabels = new Map<string, string>()\n for (const row of rows) {\n for (const person of row.people) {\n if (selectedPersonIds.includes(person.id) && person.label.trim().length > 0) {\n personLabels.set(person.id, person.label)\n }\n }\n for (const company of row.companies) {\n if (selectedCompanyIds.includes(company.id) && company.label.trim().length > 0) {\n companyLabels.set(company.id, company.label)\n }\n }\n }\n return [\n {\n key: 'people',\n label: t('customers.deals.list.columns.people', 'People'),\n type: 'select',\n options: selectedPersonIds.map((id) => ({ value: id, label: personLabels.get(id) ?? id })),\n },\n {\n key: 'companies',\n label: t('customers.deals.list.columns.companies', 'Companies'),\n type: 'select',\n options: selectedCompanyIds.map((id) => ({ value: id, label: companyLabels.get(id) ?? id })),\n },\n ]\n }, [rows, selectedCompanyIds, selectedPersonIds, t])\n const associationFilterTree = React.useMemo<AdvancedFilterTree>(() => {\n const rules: Array<{ field: string; operator: 'is_any_of'; value: string[] }> = []\n if (selectedPersonIds.length) rules.push({ field: 'people', operator: 'is_any_of', value: selectedPersonIds })\n if (selectedCompanyIds.length) rules.push({ field: 'companies', operator: 'is_any_of', value: selectedCompanyIds })\n return rules.length ? makeMultiRuleTree(rules) : createEmptyTree()\n }, [selectedCompanyIds, selectedPersonIds])\n const handleAssociationFilterRemove = React.useCallback((nodeId: string) => {\n const node = associationFilterTree.root.children.find((child) => child.id === nodeId)\n if (!node || node.type !== 'rule') return\n if (node.field === 'people') setSelectedPersonIds([])\n if (node.field === 'companies') setSelectedCompanyIds([])\n setPage(1)\n }, [associationFilterTree.root.children])\n\n const dealsPresets = React.useMemo<FilterPreset[]>(() => makeDealsPresets(), [])\n\n return (\n <Page>\n <PageBody>\n <DealsViewTabsRow active=\"list\" className=\"mb-4\" />\n <DealsKpiStrip\n ownerNames={ownerNames}\n stageDictionary={dictionaryMaps['pipeline-stages'] ?? {}}\n pipelineCount={Object.keys(pipelineNames).length}\n scopeVersion={scopeVersion}\n reloadToken={reloadToken}\n onNeedsAttentionClick={handleNeedsAttentionFilter}\n className=\"mb-4\"\n />\n <DataTable<DealRow>\n stickyFirstColumn\n stickyActionsColumn\n actionsColumnAlign=\"center\"\n title={t('customers.deals.list.title')}\n titleHeadingLevel={1}\n actions={(\n <Button asChild>\n <Link href=\"/backend/customers/deals/create\">\n {t('customers.deals.list.actions.new', 'New deal')}\n </Link>\n </Button>\n )}\n columns={columns}\n columnChooser={{ auto: true }}\n data={rows}\n onRowClick={(row) => {\n router.push(`/backend/customers/deals/${row.id}`)\n }}\n rowActions={(row) => {\n const isDeleting = pendingDeleteId === row.id\n return (\n <RowActions\n items={[\n {\n id: 'edit',\n label: t('customers.deals.list.actions.edit', 'Edit'),\n onSelect: () => { router.push(`/backend/customers/deals/${row.id}`) },\n },\n {\n id: 'open-new-tab',\n label: t('customers.deals.list.actions.openInNewTab', 'Open in new tab'),\n onSelect: () => {\n if (typeof window !== 'undefined') {\n window.open(`/backend/customers/deals/${row.id}`, '_blank', 'noopener')\n }\n },\n },\n {\n id: 'delete',\n label: isDeleting\n ? t('customers.deals.list.actions.deleting', 'Deleting\u2026')\n : t('customers.deals.list.actions.delete', 'Delete'),\n destructive: true,\n onSelect: () => handleDeleteDeal(row.id),\n },\n ]}\n />\n )\n }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n bulkActions={[\n {\n id: 'reassign-owner',\n label: t('customers.deals.list.actions.reassignOwner', 'Reassign owner'),\n icon: UserCircle2,\n onExecute: handleBulkReassignOwner,\n },\n {\n id: 'delete',\n label: t('customers.deals.list.actions.delete', 'Delete'),\n destructive: true,\n onExecute: handleBulkDelete,\n },\n ]}\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={t('customers.deals.list.searchPlaceholder')}\n pagination={{\n page,\n pageSize,\n total,\n totalPages,\n totalIsCapped,\n onPageChange: (nextPage) => setPage(nextPage),\n pageSizeOptions: [10, 25, 50, 100],\n onPageSizeChange: handlePageSizeChange,\n cacheStatus,\n }}\n isLoading={isLoading}\n refreshButton={{\n label: t('customers.deals.list.refresh'),\n onRefresh: handleRefresh,\n }}\n exporter={exportConfig}\n entityId={E.customers.customer_deal}\n perspective={{ tableId: extensionPoints.hosts.dealsTable.tableId }}\n advancedFilter={{\n auto: true,\n value: filterPanel.tree,\n onChange: filterPanel.setTree,\n onApply: () => filterPanel.flush(),\n onClear: handleAdvancedFilterClear,\n triggerRef: filtersTriggerRef,\n externalPopover: true,\n onTriggerClick: () => setFiltersOpen((prev) => !prev),\n onApplyTree: (tree) => {\n filterPanel.replaceTree(tree)\n setPage(1)\n },\n }}\n activeFilterChips={(\n <>\n {needsAttentionOnly ? (\n <div\n className=\"flex items-center gap-2 overflow-x-auto border-b border-border bg-background px-4 py-2\"\n data-testid=\"active-filter-chips\"\n >\n <div\n className=\"inline-flex items-center gap-1\"\n data-testid=\"active-filter-chip\"\n aria-label={t('customers.deals.list.filters.needsAttention')}\n >\n <Tag variant=\"warning\" dot>{t('customers.deals.list.filters.needsAttention')}</Tag>\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n aria-label={t('customers.deals.list.filters.needsAttentionRemove')}\n onClick={handleNeedsAttentionClear}\n >\n <X className=\"size-3\" />\n </IconButton>\n </div>\n </div>\n ) : null}\n <ActiveFilterChips\n tree={associationFilterTree}\n fields={associationFilterFields}\n popoverOpen={filtersOpen}\n onRemoveNode={handleAssociationFilterRemove}\n onOpen={() => setFiltersOpen(true)}\n />\n <ActiveFilterChips\n tree={filterPanel.appliedTree}\n fields={advancedFilterFields}\n popoverOpen={filtersOpen}\n onRemoveNode={(id) => filterPanel.dispatch({ type: 'removeNode', nodeId: id })}\n onOpen={() => setFiltersOpen(true)}\n />\n </>\n )}\n filterAwareEmptyState={{\n active: needsAttentionOnly || associationFilterTree.root.children.length > 0 || advancedFilterState.root.children.length > 0,\n entityNamePlural: t('customers.deals.entityPlural', 'deals'),\n canRemoveLast: needsAttentionOnly || associationFilterTree.root.children.length > 0 || filterPanel.tree.root.children.length > 0,\n onClearAll: () => {\n handleAdvancedFilterClear()\n setSelectedPersonIds([])\n setSelectedCompanyIds([])\n setNeedsAttentionOnly(false)\n },\n onRemoveLast: () => {\n if (needsAttentionOnly) {\n handleNeedsAttentionClear()\n return\n }\n if (selectedCompanyIds.length > 0) {\n setSelectedCompanyIds([])\n setPage(1)\n return\n }\n if (selectedPersonIds.length > 0) {\n setSelectedPersonIds([])\n setPage(1)\n return\n }\n filterPanel.dispatch({ type: 'removeLast' })\n },\n }}\n emptyState={(\n <ListEmptyState\n entityName={t('customers.deals.entityPlural', 'deals')}\n createHref=\"/backend/customers/deals/create\"\n createLabel={t('customers.deals.list.actions.new', 'New deal')}\n />\n )}\n virtualized\n />\n <AdvancedFilterPanel\n fields={advancedFilterFields}\n value={filterPanel.tree}\n onChange={filterPanel.setTree}\n onApply={filterPanel.flush}\n onClear={handleAdvancedFilterClear}\n onFlush={filterPanel.flush}\n pendingErrors={filterPanel.pendingErrors}\n userId={currentUserId}\n presets={dealsPresets}\n open={filtersOpen}\n onOpenChange={setFiltersOpen}\n triggerRef={filtersTriggerRef}\n savedFilterStorageKey=\"customers.deals.list\"\n />\n </PageBody>\n <ReassignOwnerDialog\n open={reassignOwnerOpen}\n selectedCount={reassignOwnerRows.length}\n isSubmitting={isReassigningOwner}\n onClose={handleReassignOwnerCancel}\n onConfirm={(userId) => { void handleReassignOwnerConfirm(userId) }}\n />\n {ConfirmDialogElement}\n </Page>\n )\n}\n\nfunction mapDeal(item: Record<string, unknown>): DealRow | null {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return null\n const title = typeof item.title === 'string' ? item.title : ''\n const status = typeof item.status === 'string' ? item.status : null\n const pipelineStage = typeof item.pipeline_stage === 'string' ? item.pipeline_stage : null\n const pipelineStageId = typeof item.pipeline_stage_id === 'string' ? item.pipeline_stage_id : null\n const pipelineId = typeof item.pipeline_id === 'string' ? item.pipeline_id : null\n const valueAmountRaw = item.value_amount\n const valueAmount =\n typeof valueAmountRaw === 'number'\n ? valueAmountRaw\n : typeof valueAmountRaw === 'string' && valueAmountRaw.trim()\n ? Number(valueAmountRaw)\n : null\n const valueCurrency =\n typeof item.value_currency === 'string' && item.value_currency.trim().length\n ? item.value_currency.trim().toUpperCase()\n : null\n const probabilityRaw = item.probability\n const probability =\n typeof probabilityRaw === 'number'\n ? probabilityRaw\n : typeof probabilityRaw === 'string' && probabilityRaw.trim().length\n ? Number(probabilityRaw)\n : null\n const expectedCloseAt = typeof item.expected_close_at === 'string' ? item.expected_close_at : null\n const updatedAt = typeof item.updated_at === 'string' ? item.updated_at : null\n const ownerUserId = typeof item.owner_user_id === 'string' ? item.owner_user_id : null\n const peopleRaw = Array.isArray(item.people) ? item.people : []\n const companiesRaw = Array.isArray(item.companies) ? item.companies : []\n const people = peopleRaw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const data = entry as Record<string, unknown>\n const pid = typeof data.id === 'string' ? data.id : null\n if (!pid) return null\n const label = typeof data.label === 'string' ? data.label : ''\n return { id: pid, label }\n })\n .filter((entry): entry is { id: string; label: string } => !!entry)\n const companies = companiesRaw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const data = entry as Record<string, unknown>\n const cid = typeof data.id === 'string' ? data.id : null\n if (!cid) return null\n const label = typeof data.label === 'string' ? data.label : ''\n return { id: cid, label }\n })\n .filter((entry): entry is { id: string; label: string } => !!entry)\n const customFields: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(item)) {\n if (key.startsWith('cf_')) customFields[key] = value\n }\n return withDataTableNamespaces({\n id,\n title,\n status,\n pipelineStage,\n pipelineStageId,\n pipelineId,\n valueAmount,\n valueCurrency,\n probability,\n expectedCloseAt,\n updatedAt,\n ownerUserId,\n people,\n companies,\n ...customFields,\n }, item)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|