strapi-plugin-bulk-updater 1.2.0 → 1.2.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strapi-plugin-bulk-updater",
3
- "version": "1.2.0",
3
+ "version": "1.2.7",
4
4
  "description": "Bulk update attributes and relationships across multiple collection types in Strapi v5 with schema validation, CSV export/import & override, legacy violation scanning, maker-checker governance, off-peak scheduling, and 3-tier audit rollback.",
5
5
  "strapi": {
6
6
  "displayName": "Bulk Attribute & Relation Updater",
@@ -1 +0,0 @@
1
- {"version":3,"file":"BulkUpdater-BDszahRM.mjs","sources":["../../admin/src/pages/CsvManagerTab.tsx","../../admin/src/pages/BulkUpdater.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { useFetchClient, useNotification } from '@strapi/strapi/admin';\nimport {\n Box,\n Flex,\n Typography,\n Button,\n SingleSelect,\n SingleSelectOption,\n Badge,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Alert,\n Checkbox,\n} from '@strapi/design-system';\nimport { Download, Upload, ArrowClockwise, Check } from '@strapi/icons';\n\ninterface CollectionModel {\n uid: string;\n displayName: string;\n singularName: string;\n pluralName: string;\n attributes: string[];\n totalEntries?: number;\n}\n\nexport default function CsvManagerTab() {\n const { get, post } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n const [collections, setCollections] = useState<CollectionModel[]>([]);\n const [loadingCollections, setLoadingCollections] = useState<boolean>(true);\n const [selectedUid, setSelectedUid] = useState<string>('');\n\n // Export filters\n const [exportLimit, setExportLimit] = useState<number>(1000);\n const [exportOnlyViolations, setExportOnlyViolations] = useState<boolean>(false);\n const [rules, setRules] = useState<any[]>([]);\n const [selectedRuleId, setSelectedRuleId] = useState<string>('');\n\n // Import states\n const [importMode, setImportMode] = useState<'update' | 'create_or_override'>('update');\n const [publishOnImport, setPublishOnImport] = useState<boolean>(true);\n const [csvRawText, setCsvRawText] = useState<string>('');\n const [fileName, setFileName] = useState<string>('');\n const [parsedPreview, setParsedPreview] = useState<Array<Record<string, string>>>([]);\n const [importing, setImporting] = useState<boolean>(false);\n const [importResult, setImportResult] = useState<any>(null);\n\n useEffect(() => {\n fetchInitialData();\n }, []);\n\n const fetchInitialData = async () => {\n try {\n setLoadingCollections(true);\n const [modelsRes, rulesRes] = await Promise.all([\n get('/bulk-updater/models'),\n get('/bulk-updater/validation-rules'),\n ]);\n\n if (modelsRes.data?.collections) {\n setCollections(modelsRes.data.collections);\n if (modelsRes.data.collections.length > 0) {\n setSelectedUid(modelsRes.data.collections[0].uid);\n }\n }\n\n if (rulesRes.data?.rules) {\n setRules(rulesRes.data.rules);\n if (rulesRes.data.rules.length > 0) {\n setSelectedRuleId(rulesRes.data.rules[0].id);\n }\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed loading collections for CSV Manager',\n });\n } finally {\n setLoadingCollections(false);\n }\n };\n\n const handleDownloadTemplate = async () => {\n if (!selectedUid) return;\n try {\n const res = await get(`/bulk-updater/csv/template/${selectedUid}`);\n const csvStr = res.data?.csvContent || (typeof res.data === 'string' ? res.data : '');\n const filename = res.data?.filename || `${selectedUid.split('.').pop()}_template.csv`;\n downloadCsvFile(csvStr, filename);\n toggleNotification({\n type: 'success',\n message: 'CSV Template downloaded successfully',\n });\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed downloading CSV template',\n });\n }\n };\n\n const handleExportCollection = async () => {\n if (!selectedUid) return;\n try {\n const res = await get(`/bulk-updater/csv/export/${selectedUid}?limit=${exportLimit}`);\n const csvStr = res.data?.csvContent || (typeof res.data === 'string' ? res.data : '');\n const filename = res.data?.filename || `${selectedUid.split('.').pop()}_export.csv`;\n downloadCsvFile(csvStr, filename);\n toggleNotification({\n type: 'success',\n message: 'Collection exported to CSV successfully',\n });\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed exporting collection to CSV',\n });\n }\n };\n\n const handleExportViolations = async () => {\n if (!selectedRuleId) return;\n try {\n const res = await get(`/bulk-updater/csv/export-violations/${selectedRuleId}`);\n const csvStr = res.data?.csvContent || (typeof res.data === 'string' ? res.data : '');\n const filename = res.data?.filename || `violations_${selectedRuleId}.csv`;\n downloadCsvFile(csvStr, filename);\n toggleNotification({\n type: 'success',\n message: 'Rule violations exported to CSV successfully',\n });\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed exporting violations to CSV',\n });\n }\n };\n\n const downloadCsvFile = (content: string, fallbackName: string) => {\n if (!content) {\n toggleNotification({\n type: 'warning',\n message: 'No CSV content to download',\n });\n return;\n }\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', fallbackName);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n // Simple client-side preview parser\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n setFileName(file.name);\n setImportResult(null);\n\n const reader = new FileReader();\n reader.onload = (event) => {\n const text = event.target?.result as string;\n setCsvRawText(text);\n\n try {\n const lines = text.split(/\\r?\\n/).filter((l) => l.trim().length > 0);\n if (lines.length > 0) {\n const headers = lines[0].split(',').map((h) => h.replace(/^\"|\"$/g, '').trim());\n const previewRows: Array<Record<string, string>> = [];\n for (let i = 1; i < Math.min(lines.length, 6); i++) {\n const vals = lines[i].split(',').map((v) => v.replace(/^\"|\"$/g, '').trim());\n const row: Record<string, string> = {};\n headers.forEach((h, idx) => {\n row[h] = vals[idx] || '';\n });\n previewRows.push(row);\n }\n setParsedPreview(previewRows);\n }\n } catch (err) {\n setParsedPreview([]);\n }\n };\n reader.readAsText(file);\n };\n\n const handleExecuteImport = async () => {\n if (!selectedUid || !csvRawText) return;\n\n try {\n setImporting(true);\n setImportResult(null);\n\n const res = await post('/bulk-updater/csv/import', {\n uid: selectedUid,\n csvText: csvRawText,\n mode: importMode,\n publish: publishOnImport,\n });\n\n if (res.data && res.data.success) {\n setImportResult(res.data);\n toggleNotification({\n type: 'success',\n message: `CSV Import complete: ${res.data.stats.created} created, ${res.data.stats.updated} updated.`,\n });\n } else {\n throw new Error(res.data?.error || 'Import failed');\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Error processing CSV import',\n });\n } finally {\n setImporting(false);\n }\n };\n\n const selectedCol = collections.find((c) => c.uid === selectedUid);\n\n return (\n <Box padding={6} background=\"neutral0\" hasRadius shadow=\"filterShadow\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {/* Header */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box>\n <Typography variant=\"beta\" tag=\"h2\" fontWeight=\"bold\">\n CSV Export &amp; Import Center\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Export all records, filtered subsets, or rule violations into CSV. Correct or add records in spreadsheets and re-upload with full schema &amp; quota enforcement.\n </Typography>\n </Box>\n <Button variant=\"secondary\" startIcon={<ArrowClockwise />} onClick={fetchInitialData}>\n Refresh\n </Button>\n </Flex>\n\n {/* Target Collection Selector */}\n <Box padding={4} background=\"neutral100\" hasRadius>\n <Flex gap={4} alignItems=\"flex-end\">\n <Box style={{ flex: 1 }}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" marginBottom={2}>\n Target Collection Type\n </Typography>\n <SingleSelect\n value={selectedUid}\n onChange={(val: string) => {\n setSelectedUid(val);\n setImportResult(null);\n }}\n disabled={loadingCollections}\n placeholder=\"Select a collection...\"\n >\n {collections.map((col) => (\n <SingleSelectOption key={col.uid} value={col.uid}>\n {col.displayName} ({col.totalEntries ?? 0} records)\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n\n <Button\n variant=\"tertiary\"\n startIcon={<Download />}\n onClick={handleDownloadTemplate}\n disabled={!selectedUid}\n >\n Download Sample CSV Template\n </Button>\n </Flex>\n </Box>\n\n {/* Section 1: Export Hub */}\n <Box padding={5} background=\"neutral100\" hasRadius>\n <Typography variant=\"delta\" tag=\"h3\" fontWeight=\"bold\" marginBottom={2}>\n 1. Export Data to CSV\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" marginBottom={4}>\n Extract entire collections or pinpoint records violating validation quotas.\n </Typography>\n\n <Flex gap={4} wrap=\"wrap\" alignItems=\"center\" marginTop={3}>\n {/* Standard Collection Export */}\n <Button\n variant=\"default\"\n startIcon={<Download />}\n onClick={handleExportCollection}\n disabled={!selectedUid}\n >\n Export All {selectedCol?.displayName || 'Collection'} Records (.csv)\n </Button>\n\n {/* Violations Export */}\n {rules.length > 0 && (\n <Flex gap={2} alignItems=\"center\" style={{ marginLeft: 'auto' }}>\n <SingleSelect\n value={selectedRuleId}\n onChange={(val: string) => setSelectedRuleId(val)}\n placeholder=\"Select Quota Rule...\"\n >\n {rules.map((r) => (\n <SingleSelectOption key={r.id} value={r.id}>\n Rule: {r.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n\n <Button\n variant=\"danger-light\"\n startIcon={<Download />}\n onClick={handleExportViolations}\n disabled={!selectedRuleId}\n >\n Export Violators CSV\n </Button>\n </Flex>\n )}\n </Flex>\n </Box>\n\n {/* Section 2: Import & Override Hub */}\n <Box padding={5} background=\"neutral100\" hasRadius>\n <Typography variant=\"delta\" tag=\"h3\" fontWeight=\"bold\" marginBottom={2}>\n 2. Import &amp; Batch Override CSV\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" marginBottom={4}>\n Upload an updated CSV file to bulk update existing records or insert new records.\n </Typography>\n\n {/* Configuration Modes */}\n <Flex gap={6} marginBottom={4} wrap=\"wrap\">\n <Box>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" marginBottom={2}>\n Operation Mode\n </Typography>\n <Flex gap={4}>\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name=\"importMode\"\n value=\"update\"\n checked={importMode === 'update'}\n onChange={() => setImportMode('update')}\n />\n <Typography variant=\"omega\" fontWeight={importMode === 'update' ? 'bold' : 'normal'}>\n Update Existing (Matches by documentId)\n </Typography>\n </label>\n\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name=\"importMode\"\n value=\"create_or_override\"\n checked={importMode === 'create_or_override'}\n onChange={() => setImportMode('create_or_override')}\n />\n <Typography variant=\"omega\" fontWeight={importMode === 'create_or_override' ? 'bold' : 'normal'}>\n Add / Override (Inserts new or replaces existing)\n </Typography>\n </label>\n </Flex>\n </Box>\n\n <Box style={{ marginLeft: 'auto' }}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" marginBottom={2}>\n Publish Options\n </Typography>\n <Checkbox\n checked={publishOnImport}\n onValueChange={(val: boolean) => setPublishOnImport(val)}\n >\n Auto-publish on import\n </Checkbox>\n </Box>\n </Flex>\n\n {/* File Picker */}\n <Box\n padding={6}\n background=\"neutral0\"\n hasRadius\n style={{\n border: '2px dashed #dcdce4',\n textAlign: 'center',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"file\"\n accept=\".csv\"\n id=\"csv-file-input\"\n style={{ display: 'none' }}\n onChange={handleFileUpload}\n />\n <label htmlFor=\"csv-file-input\" style={{ cursor: 'pointer', display: 'block' }}>\n <Upload style={{ width: 32, height: 32, margin: '0 auto 8px', color: '#4945ff' }} />\n <Typography variant=\"delta\" fontWeight=\"bold\" display=\"block\">\n {fileName ? `Selected: ${fileName}` : 'Click here or drag a .csv file to upload'}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n UTF-8 encoded CSV matching collection schema headers\n </Typography>\n </label>\n </Box>\n\n {/* Parsed Preview Table */}\n {parsedPreview.length > 0 && (\n <Box marginTop={4} background=\"neutral0\" padding={4} hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <Typography variant=\"sigma\" textColor=\"neutral700\">\n FILE PREVIEW (FIRST {parsedPreview.length} ROWS)\n </Typography>\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral800\">\n Ready to Import\n </Badge>\n </Flex>\n\n <Table colCount={Object.keys(parsedPreview[0]).length} rowCount={parsedPreview.length + 1}>\n <Thead>\n <Tr>\n {Object.keys(parsedPreview[0]).map((h) => (\n <Th key={h}>\n <Typography variant=\"sigma\">{h}</Typography>\n </Th>\n ))}\n </Tr>\n </Thead>\n <Tbody>\n {parsedPreview.map((row, rIdx) => (\n <Tr key={rIdx}>\n {Object.keys(parsedPreview[0]).map((h) => (\n <Td key={h}>\n <Typography variant=\"omega\">{row[h] || '-'}</Typography>\n </Td>\n ))}\n </Tr>\n ))}\n </Tbody>\n </Table>\n\n <Flex justifyContent=\"flex-end\" marginTop={4}>\n <Button\n variant=\"default\"\n size=\"L\"\n startIcon={<Check />}\n onClick={handleExecuteImport}\n loading={importing}\n >\n {importMode === 'update' ? 'Execute Bulk Update' : 'Execute Add / Override'}\n </Button>\n </Flex>\n </Box>\n )}\n\n {/* Execution Result Banner */}\n {importResult && (\n <Box marginTop={4}>\n <Alert\n variant={importResult.stats.errors.length > 0 ? 'warning' : 'success'}\n title=\"CSV Import Results\"\n >\n <Typography variant=\"omega\" display=\"block\" marginBottom={1}>\n Successfully processed: <strong>{importResult.stats.created} created</strong>,{' '}\n <strong>{importResult.stats.updated} updated</strong>,{' '}\n <strong>{importResult.stats.skipped} skipped</strong> out of {importResult.stats.total} total rows.\n </Typography>\n {importResult.stats.errors.length > 0 && (\n <Box marginTop={2}>\n <Typography variant=\"pi\" textColor=\"danger700\" fontWeight=\"bold\">\n Errors encountered ({importResult.stats.errors.length}):\n </Typography>\n <ul style={{ margin: '4px 0 0 16px', padding: 0 }}>\n {importResult.stats.errors.slice(0, 5).map((err: any, idx: number) => (\n <li key={idx}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n Row {err.row}: {err.error}\n </Typography>\n </li>\n ))}\n </ul>\n </Box>\n )}\n </Alert>\n </Box>\n )}\n </Box>\n </Flex>\n </Box>\n );\n}\n","import React, { useEffect, useState, useRef } from 'react';\nimport { useFetchClient, useNotification } from '@strapi/strapi/admin';\nimport {\n Box,\n Flex,\n Typography,\n Button,\n TextInput,\n SingleSelect,\n SingleSelectOption,\n Checkbox,\n Badge,\n Alert,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n} from '@strapi/design-system';\nimport { Play, ArrowClockwise, Check, Download } from '@strapi/icons';\nimport ValidationRulesTab from './ValidationRulesTab';\nimport CsvManagerTab from './CsvManagerTab';\n\ninterface Entry {\n id: number | string;\n documentId: string;\n [key: string]: any;\n}\n\nexport interface RelationMeta {\n isRelation: boolean;\n relationType: string;\n targetUid: string;\n targetDisplayName: string;\n isMulti: boolean;\n}\n\ninterface CollectionModel {\n uid: string;\n kind?: string;\n isSingleType?: boolean;\n singularName: string;\n pluralName: string;\n displayName: string;\n attributes: string[];\n relations?: Record<string, RelationMeta>;\n totalEntries?: number;\n entries: Entry[];\n}\n\ninterface CollectionPageState {\n page: number;\n pageSize: number;\n total: number;\n pageCount: number;\n entries: Entry[];\n loading: boolean;\n}\n\ninterface UpdateResult {\n uid: string;\n collectionName: string;\n documentId: string;\n label: string;\n attribute: string;\n oldValue?: any;\n newValue?: any;\n status: 'updated' | 'skipped' | 'error';\n message: string;\n}\n\ninterface AuditRecord {\n id: number | string;\n documentId: string;\n batchId: string;\n attribute: string;\n value: string;\n userEmail: string;\n userName: string;\n updatedCount: number;\n skippedCount: number;\n totalTargets: number;\n diffs: UpdateResult[];\n isRolledBack: boolean;\n rolledBackAt: string | null;\n rolledBackBy: string | null;\n executedAt: string;\n}\n\ninterface ExecutionWindowInfo {\n enabled: boolean;\n timeZone: string;\n businessHours: {\n start: string;\n end: string;\n };\n offPeakStartTime: string;\n autoQueueDuringBusinessHours: boolean;\n isBusinessHours: boolean;\n currentServerTime: string;\n policyMessage: string;\n}\n\ninterface PendingBatch {\n id: string;\n createdAt: string;\n createdBy: { id?: string | number; email?: string; firstname?: string; lastname?: string; username?: string };\n payload: {\n attribute: string;\n value: string;\n selectedEntries?: Array<{ uid: string; documentId: string }>;\n selectedCollections?: string[];\n isRegex?: boolean;\n regexPattern?: string;\n publishOnApproval?: boolean;\n };\n summary: {\n attribute: string;\n value: string;\n totalTargets: number;\n collectionBreakdown: Record<string, number>;\n publishOnApproval?: boolean;\n };\n status: 'pending_approval' | 'queued_offpeak' | 'approved' | 'rejected' | 'executed';\n executionMode: 'maker_checker' | 'queue_offpeak' | 'immediate';\n scheduledFor?: string;\n makerNotes?: string;\n approval?: {\n checkerUser?: { id?: string | number; email?: string; firstname?: string; lastname?: string; username?: string };\n decisionDate?: string;\n rejectionReason?: string;\n };\n executionResult?: any;\n}\n\nexport interface ColumnDef {\n key: string;\n label: string;\n sortable?: boolean;\n isPermanent?: boolean;\n defaultVisible: boolean;\n}\n\n/**\n * Safely resolves a nested dot-notation property (e.g. \"defaultSeo.metaDescription\")\n */\nexport function getNestedValue(obj: any, path: string): any {\n if (!obj || !path) return undefined;\n if (!path.includes('.')) return obj[path];\n return path.split('.').reduce((acc, part) => (acc && typeof acc === 'object' ? acc[part] : undefined), obj);\n}\n\n/**\n * Flat helper: Generates the list of available columns for a given collection model.\n * Zero deep nesting: returns a flat array of ColumnDef.\n */\nexport function getAvailableColumnsForCollection(\n col: CollectionModel,\n selectedAttribute: string\n): ColumnDef[] {\n const cols: ColumnDef[] = [\n {\n key: 'select',\n label: 'Select',\n isPermanent: true,\n defaultVisible: true,\n },\n {\n key: 'identifier',\n label: 'Identifier',\n sortable: !col.isSingleType,\n defaultVisible: true,\n },\n ];\n\n // Schema-specific attributes\n const candidateAttrs = col.attributes || [];\n candidateAttrs.forEach((attr) => {\n if (attr === 'name' || attr === 'title' || attr === selectedAttribute) {\n return;\n }\n const formattedLabel = attr.includes('.')\n ? attr.split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ')\n : attr.charAt(0).toUpperCase() + attr.slice(1);\n cols.push({\n key: `attr_${attr}`,\n label: formattedLabel,\n sortable: !col.isSingleType,\n defaultVisible: ['department', 'email', 'location'].includes(attr),\n });\n });\n\n // Target attribute column\n cols.push({\n key: 'target_attr',\n label: `Current \"${selectedAttribute}\"`,\n sortable: !col.isSingleType && col.attributes.includes(selectedAttribute),\n defaultVisible: true,\n });\n\n // Status column\n cols.push({\n key: 'status',\n label: 'Status',\n sortable: false,\n defaultVisible: true,\n });\n\n return cols;\n}\n\n/**\n * Flat helper: Renders table header cell without nested JSX.\n */\nfunction renderHeaderCell(\n colDef: ColumnDef,\n col: CollectionModel,\n currentSort: { field: string; order: 'asc' | 'desc' },\n selectedAttribute: string,\n onSort: (colUid: string, field: string) => void\n) {\n if (colDef.key === 'select') {\n return (\n <Th key=\"select\" style={{ width: 48 }}>\n <Typography variant=\"sigma\">Select</Typography>\n </Th>\n );\n }\n\n const isCurrentSorted =\n (colDef.key === 'identifier' && (currentSort.field === 'name' || currentSort.field === 'title')) ||\n (colDef.key === 'target_attr' && currentSort.field === selectedAttribute) ||\n (colDef.key.startsWith('attr_') && currentSort.field === colDef.key.replace('attr_', ''));\n\n const sortArrow = isCurrentSorted ? (currentSort.order === 'asc' ? '▲' : '▼') : '⇅';\n\n const handleClick = () => {\n if (!colDef.sortable) return;\n if (colDef.key === 'identifier') {\n const field = col.attributes.includes('name') ? 'name' : col.attributes.includes('title') ? 'title' : 'createdAt';\n onSort(col.uid, field);\n } else if (colDef.key === 'target_attr') {\n onSort(col.uid, selectedAttribute);\n } else if (colDef.key.startsWith('attr_')) {\n onSort(col.uid, colDef.key.replace('attr_', ''));\n }\n };\n\n return (\n <Th\n key={colDef.key}\n style={{ cursor: colDef.sortable ? 'pointer' : 'default', userSelect: 'none' }}\n onClick={handleClick}\n >\n <Flex gap={1} alignItems=\"center\">\n <Typography variant=\"sigma\">{colDef.label}</Typography>\n {colDef.sortable && (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {sortArrow}\n </Typography>\n )}\n </Flex>\n </Th>\n );\n}\n\n/**\n * Flat helper: Formats attribute values, gracefully handling relation objects and arrays.\n */\nexport function formatDisplayValue(val: any): string {\n if (val === undefined || val === null || val === '') {\n return '(empty / not set)';\n }\n if (Array.isArray(val)) {\n if (val.length === 0) return '(empty / unlinked)';\n return val\n .map((item) =>\n typeof item === 'object' && item !== null\n ? item.name || item.title || item.email || item.username || item.documentId || item.id\n : String(item)\n )\n .join(', ');\n }\n if (typeof val === 'object' && val !== null) {\n if (val.isRelation && val.display) return val.display;\n return val.name || val.title || val.email || val.username || val.documentId || val.id || JSON.stringify(val);\n }\n return String(val);\n}\n\n/**\n * Flat helper: Renders a single cell content using clean early returns.\n * Zero deep nesting.\n */\nfunction renderCellContent(\n colDef: ColumnDef,\n entry: Entry,\n col: CollectionModel,\n selectedAttribute: string,\n isMatch: boolean,\n hasAttr: boolean,\n isSelected: boolean,\n onToggleSelect: () => void\n): React.ReactNode {\n switch (colDef.key) {\n case 'select':\n return (\n <Checkbox\n checked={isSelected}\n onCheckedChange={onToggleSelect}\n />\n );\n\n case 'identifier': {\n const mainText = entry.name || entry.title || `Entry #${entry.id || entry.documentId}`;\n return (\n <Box>\n <Typography fontWeight=\"semiBold\">{mainText}</Typography>\n {entry.email && (\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\">\n {entry.email}\n </Typography>\n )}\n </Box>\n );\n }\n\n case 'target_attr': {\n const val = getNestedValue(entry, selectedAttribute);\n const displayStr = formatDisplayValue(val);\n const isUnset = displayStr === '(empty / not set)' || displayStr === '(empty / unlinked)';\n return (\n <Typography\n textColor={isUnset ? 'neutral500' : 'neutral800'}\n style={{\n fontStyle: isUnset ? 'italic' : 'normal',\n display: 'inline-block',\n maxWidth: 260,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {displayStr}\n </Typography>\n );\n }\n\n case 'status': {\n if (!hasAttr) {\n return (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral600\">\n Ignored\n </Badge>\n );\n }\n return (\n <Flex gap={1} alignItems=\"center\">\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n Supported\n </Badge>\n {isMatch && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n Matches Filter\n </Badge>\n )}\n </Flex>\n );\n }\n\n default: {\n const attrName = colDef.key.replace('attr_', '');\n const rawVal = getNestedValue(entry, attrName);\n const displayStr = formatDisplayValue(rawVal);\n return (\n <Typography\n textColor=\"neutral700\"\n style={{ maxWidth: 200, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {displayStr === '(empty / not set)' ? '-' : displayStr}\n </Typography>\n );\n }\n }\n}\n\nconst BulkUpdater: React.FC = () => {\n const { get, post } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n // Active view tab: 'editor' | 'audit' | 'rules' | 'csv' (synced with ?tab= query param)\n const getInitialTab = (): 'editor' | 'audit' | 'rules' | 'csv' => {\n try {\n const params = new URLSearchParams(window.location.search);\n const t = params.get('tab');\n if (t === 'audit' || t === 'editor' || t === 'rules' || t === 'csv') return t as any;\n } catch {}\n return 'editor';\n };\n\n const [activeTab, setActiveTabState] = useState<'editor' | 'audit' | 'rules' | 'csv'>(getInitialTab);\n\n const setActiveTab = (tab: 'editor' | 'audit' | 'rules' | 'csv') => {\n setActiveTabState(tab);\n try {\n const url = new URL(window.location.href);\n url.searchParams.set('tab', tab);\n window.history.replaceState({}, '', url.toString());\n } catch {}\n };\n\n const [loading, setLoading] = useState<boolean>(true);\n const [updating, setUpdating] = useState<boolean>(false);\n const [attributes, setAttributes] = useState<string[]>([]);\n const [collections, setCollections] = useState<CollectionModel[]>([]);\n const [auditEnabled, setAuditEnabled] = useState<boolean>(false);\n\n // Execution Window & Maker-Checker State\n const [executionWindow, setExecutionWindow] = useState<ExecutionWindowInfo | null>(null);\n const [showConfirmModal, setShowConfirmModal] = useState<boolean>(false);\n const [pendingBatches, setPendingBatches] = useState<PendingBatch[]>([]);\n const [pendingBatchesLoading, setPendingBatchesLoading] = useState<boolean>(false);\n const [approvingBatchId, setApprovingBatchId] = useState<string | null>(null);\n const [rejectingBatchId, setRejectingBatchId] = useState<string | null>(null);\n const [executingNowBatchId, setExecutingNowBatchId] = useState<string | null>(null);\n const [makerNotesInput, setMakerNotesInput] = useState<string>('');\n const [publishOnApproval, setPublishOnApproval] = useState<boolean>(true);\n\n // Selected state\n const [selectedAttribute, setSelectedAttribute] = useState<string>('metaDescription');\n const [attributeValue, setAttributeValue] = useState<string>('');\n const [selectedEntries, setSelectedEntries] = useState<Record<string, boolean>>({});\n\n // Relation State\n const [relationsMeta, setRelationsMeta] = useState<Record<string, RelationMeta>>({});\n const [relationOptions, setRelationOptions] = useState<Array<{ documentId: string; label: string }>>([]);\n const [relationOptionsLoading, setRelationOptionsLoading] = useState<boolean>(false);\n const [selectedRelationDocId, setSelectedRelationDocId] = useState<string>('');\n const [relationMode, setRelationMode] = useState<'set' | 'connect' | 'disconnect' | 'clear'>('set');\n\n const fetchRelationOptions = async (targetUid: string) => {\n try {\n setRelationOptionsLoading(true);\n const res = await get(`/bulk-updater/relation-options?targetUid=${encodeURIComponent(targetUid)}`);\n if (res.data && res.data.success) {\n setRelationOptions(res.data.options || []);\n }\n } catch {\n setRelationOptions([]);\n } finally {\n setRelationOptionsLoading(false);\n }\n };\n\n // Pro feature: Regex\n const [useRegex, setUseRegex] = useState<boolean>(false);\n const [regexPattern, setRegexPattern] = useState<string>('');\n\n // Target Value Filter state (\"Find items with a certain value first\")\n type FilterOperator = 'none' | 'empty' | 'not_empty' | 'equals' | 'contains' | 'starts_with';\n const [filterOperator, setFilterOperator] = useState<FilterOperator>('none');\n const [filterQuery, setFilterQuery] = useState<string>('');\n const [entrySearch, setEntrySearch] = useState<string>('');\n\n const isFilterActive =\n (filterOperator !== 'none' &&\n (['empty', 'not_empty'].includes(filterOperator) || Boolean(filterQuery.trim()))) ||\n Boolean(entrySearch.trim());\n\n // Result state\n const [lastResults, setLastResults] = useState<UpdateResult[] | null>(null);\n const [updateSummary, setUpdateSummary] = useState<{\n updatedCount: number;\n skippedCount: number;\n batchId?: string;\n } | null>(null);\n\n const [collectionPages, setCollectionPages] = useState<Record<string, CollectionPageState>>({});\n const [collectionSearch, setCollectionSearch] = useState<string>('');\n\n // Content Type visibility filter\n const [visibleTypeUids, setVisibleTypeUids] = useState<Record<string, boolean>>({});\n\n // Pagination & Sorting state (capped at 100)\n const [defaultPageSize, setDefaultPageSize] = useState<number>(10);\n const [collectionSorts, setCollectionSorts] = useState<Record<string, { field: string; order: 'asc' | 'desc' }>>({});\n\n // Column Visibility per Collection Type (flat mapping: uid -> string[])\n const [collectionColumnVisibility, setCollectionColumnVisibility] = useState<Record<string, string[]>>({});\n const [openColumnPickerUid, setOpenColumnPickerUid] = useState<string | null>(null);\n\n const toggleColumn = (colUid: string, colKey: string, availableCols: ColumnDef[]) => {\n setCollectionColumnVisibility((prev) => {\n const current = prev[colUid] || availableCols.filter((c) => c.defaultVisible).map((c) => c.key);\n let next: string[];\n if (current.includes(colKey)) {\n const remaining = current.filter((k) => k !== colKey);\n if (remaining.filter((k) => k !== 'select').length === 0) {\n return prev;\n }\n next = remaining;\n } else {\n next = [...current, colKey];\n }\n return { ...prev, [colUid]: next };\n });\n };\n\n const showAllColumns = (colUid: string, availableCols: ColumnDef[]) => {\n setCollectionColumnVisibility((prev) => ({\n ...prev,\n [colUid]: availableCols.map((c) => c.key),\n }));\n };\n\n const resetDefaultColumns = (colUid: string, availableCols: ColumnDef[]) => {\n setCollectionColumnVisibility((prev) => ({\n ...prev,\n [colUid]: availableCols.filter((c) => c.defaultVisible).map((c) => c.key),\n }));\n };\n\n // Audit state\n const [auditHistory, setAuditHistory] = useState<AuditRecord[]>([]);\n const [auditLoading, setAuditLoading] = useState<boolean>(false);\n const [rollingBackBatchId, setRollingBackBatchId] = useState<string | null>(null);\n const [expandedDiffBatchId, setExpandedDiffBatchId] = useState<string | null>(null);\n const [auditNotice, setAuditNotice] = useState<string | null>(null);\n\n const latestActiveBatch = auditHistory.find((rec) => !rec.isRolledBack);\n\n const fetchModels = async () => {\n try {\n setLoading(true);\n const res = await get('/bulk-updater/models');\n if (res.data && res.data.success) {\n setAttributes(res.data.attributes || []);\n const cols: CollectionModel[] = res.data.collections || [];\n setCollections(cols);\n setAuditEnabled(Boolean(res.data.auditEnabled));\n if (res.data.executionWindow) {\n setExecutionWindow(res.data.executionWindow);\n }\n\n const pages: Record<string, CollectionPageState> = {};\n const initialVisibility: Record<string, boolean> = {};\n const initialSorts: Record<string, { field: string; order: 'asc' | 'desc' }> = {};\n cols.forEach((col: CollectionModel) => {\n const total = col.totalEntries !== undefined ? col.totalEntries : (col.entries ? col.entries.length : 0);\n const initialPageSize = col.isSingleType ? 1 : 10;\n pages[col.uid] = {\n page: 1,\n pageSize: initialPageSize,\n total,\n pageCount: col.isSingleType ? 1 : (Math.ceil(total / initialPageSize) || 1),\n entries: (col.entries || []).slice(0, initialPageSize),\n loading: false,\n };\n initialVisibility[col.uid] = true;\n initialSorts[col.uid] = { field: 'createdAt', order: 'desc' };\n });\n setCollectionPages(pages);\n setVisibleTypeUids(initialVisibility);\n setCollectionSorts(initialSorts);\n\n if (res.data.relationsMeta) {\n setRelationsMeta(res.data.relationsMeta);\n }\n\n const activeAttr = selectedAttribute || (res.data.attributes && res.data.attributes[0]);\n if (!selectedAttribute && activeAttr) {\n setSelectedAttribute(activeAttr);\n }\n if (activeAttr && res.data.relationsMeta && res.data.relationsMeta[activeAttr]) {\n fetchRelationOptions(res.data.relationsMeta[activeAttr].targetUid);\n }\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed to load collections data',\n });\n } finally {\n setLoading(false);\n }\n };\n\n const loadCollectionPage = async (\n colUid: string,\n targetPage: number,\n customPageSize?: number,\n customSortField?: string,\n customSortOrder?: 'asc' | 'desc',\n overrideFilterOp?: FilterOperator,\n overrideFilterQuery?: string,\n overrideEntrySearch?: string,\n autoSelectReturned = true\n ) => {\n const currentPageState = collectionPages[colUid];\n const size = customPageSize || currentPageState?.pageSize || defaultPageSize;\n const currentSort = collectionSorts[colUid] || { field: 'createdAt', order: 'desc' };\n const sortField = customSortField !== undefined ? customSortField : currentSort.field;\n const sortOrder = customSortOrder !== undefined ? customSortOrder : currentSort.order;\n\n const op = overrideFilterOp !== undefined ? overrideFilterOp : filterOperator;\n const q = overrideFilterQuery !== undefined ? overrideFilterQuery : filterQuery;\n const s = overrideEntrySearch !== undefined ? overrideEntrySearch : entrySearch;\n\n setCollectionPages((prev) => ({\n ...prev,\n [colUid]: {\n ...(prev[colUid] || { page: 1, pageSize: size, total: 0, pageCount: 1, entries: [] }),\n loading: true,\n },\n }));\n\n try {\n const params = new URLSearchParams({\n page: String(targetPage),\n pageSize: String(size),\n });\n if (selectedAttribute) params.set('attribute', selectedAttribute);\n if (op && op !== 'none') {\n params.set('filterOperator', op);\n if (q) params.set('filterQuery', q);\n }\n if (s && s.trim()) {\n params.set('search', s.trim());\n }\n if (sortField) {\n params.set('sortField', sortField);\n params.set('sortOrder', sortOrder);\n }\n\n const res = await get(`/bulk-updater/collections/${colUid}/entries?${params.toString()}`);\n if (res.data && (res.data.success || res.data.entries !== undefined)) {\n const fetchedEntries: Entry[] = res.data.entries || [];\n setCollectionPages((prev) => ({\n ...prev,\n [colUid]: {\n page: res.data.pagination.page,\n pageSize: res.data.pagination.pageSize,\n total: res.data.pagination.total,\n pageCount: res.data.pagination.pageCount,\n entries: fetchedEntries,\n loading: false,\n },\n }));\n\n // If a filter or search is active, pre-select all returned matching entries!\n const isFilterActiveNow =\n (op !== 'none' && (['empty', 'not_empty'].includes(op) || Boolean(q.trim()))) ||\n Boolean(s.trim());\n if (isFilterActiveNow && autoSelectReturned) {\n setSelectedEntries((prev) => {\n const next = { ...prev };\n fetchedEntries.forEach((e) => {\n next[`${colUid}${KEY_SEP}${e.documentId}`] = true;\n });\n return next;\n });\n }\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: `Failed to load entries for ${colUid}: ${err.message}`,\n });\n setCollectionPages((prev) => ({\n ...prev,\n [colUid]: {\n ...(prev[colUid] || {}),\n loading: false,\n },\n }));\n }\n };\n\n const fetchAuditHistory = async () => {\n try {\n setAuditLoading(true);\n const res = await get('/bulk-updater/audit/history');\n if (res.data) {\n if (res.data.enabled) {\n setAuditHistory(res.data.history || []);\n setAuditNotice(null);\n } else {\n setAuditHistory([]);\n setAuditNotice(res.data.message || 'Audit trail is not configured.');\n }\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed to fetch audit history.',\n });\n } finally {\n setAuditLoading(false);\n }\n };\n\n const fetchPendingBatches = async () => {\n try {\n setPendingBatchesLoading(true);\n const res = await get('/bulk-updater/pending-batches');\n if (res.data && res.data.success) {\n setPendingBatches(res.data.batches || []);\n if (res.data.executionWindow) {\n setExecutionWindow(res.data.executionWindow);\n }\n }\n } catch {\n // ignore\n } finally {\n setPendingBatchesLoading(false);\n }\n };\n\n useEffect(() => {\n fetchModels();\n fetchAuditHistory();\n fetchPendingBatches();\n }, []);\n\n useEffect(() => {\n if (activeTab === 'audit') {\n fetchAuditHistory();\n fetchPendingBatches();\n }\n }, [activeTab]);\n\n const isInitialFilterMount = useRef(true);\n useEffect(() => {\n if (isInitialFilterMount.current) {\n isInitialFilterMount.current = false;\n return;\n }\n\n const timer = setTimeout(() => {\n if (collections.length > 0) {\n const isFilterActiveNow =\n (filterOperator !== 'none' &&\n (['empty', 'not_empty'].includes(filterOperator) || Boolean(filterQuery.trim()))) ||\n Boolean(entrySearch.trim());\n\n if (isFilterActiveNow) {\n setSelectedEntries({});\n }\n\n collections.forEach((col) => {\n loadCollectionPage(\n col.uid,\n 1,\n undefined,\n undefined,\n undefined,\n filterOperator,\n filterQuery,\n entrySearch,\n true\n );\n });\n }\n }, 350);\n\n return () => clearTimeout(timer);\n }, [filterOperator, filterQuery, entrySearch]);\n\n const KEY_SEP = '@@@';\n\n // Handle attribute selection change: unchecks all existing selections if attribute changes\n const handleAttributeChange = (newAttr: string) => {\n if (newAttr !== selectedAttribute) {\n setSelectedAttribute(newAttr);\n setSelectedEntries({});\n setFilterOperator('none');\n setFilterQuery('');\n setEntrySearch('');\n setSelectedRelationDocId('');\n setAttributeValue('');\n\n if (relationsMeta[newAttr]) {\n fetchRelationOptions(relationsMeta[newAttr].targetUid);\n } else {\n setRelationOptions([]);\n }\n\n collections.forEach((col) => {\n loadCollectionPage(col.uid, 1);\n });\n }\n };\n\n const filteredCollections = collections.filter(\n (c) =>\n visibleTypeUids[c.uid] !== false &&\n (!collectionSearch.trim() ||\n c.displayName.toLowerCase().includes(collectionSearch.toLowerCase().trim()) ||\n c.uid.toLowerCase().includes(collectionSearch.toLowerCase().trim()))\n );\n\n const handleGlobalPageSizeChange = (newSize: number) => {\n const capped = Math.min(500, Math.max(1, newSize));\n setDefaultPageSize(capped);\n collections.forEach((col) => {\n if (!col.isSingleType) {\n loadCollectionPage(col.uid, 1, capped);\n }\n });\n };\n\n const handleCollectionPageSizeChange = (colUid: string, newSize: number) => {\n const capped = Math.min(500, Math.max(1, newSize));\n loadCollectionPage(colUid, 1, capped);\n };\n\n const handleCollectionSortChange = (colUid: string, field: string, order: 'asc' | 'desc') => {\n setCollectionSorts((prev) => ({\n ...prev,\n [colUid]: { field, order },\n }));\n loadCollectionPage(colUid, 1, undefined, field, order);\n };\n\n const handleHeaderSortClick = (colUid: string, field: string) => {\n const current = collectionSorts[colUid] || { field: 'createdAt', order: 'desc' };\n const nextOrder: 'asc' | 'desc' = current.field === field && current.order === 'asc' ? 'desc' : 'asc';\n handleCollectionSortChange(colUid, field, nextOrder);\n };\n\n // Toggle single entry\n const toggleEntry = (uid: string, documentId: string) => {\n const key = `${uid}${KEY_SEP}${documentId}`;\n setSelectedEntries((prev) => ({\n ...prev,\n [key]: !prev[key],\n }));\n };\n\n // Value filter evaluation\n const entryMatchesFilter = (entry: Entry, attr: string): boolean => {\n if (filterOperator === 'none') return true;\n const val = getNestedValue(entry, attr);\n const displayStr = formatDisplayValue(val);\n const isValEmpty =\n val === undefined ||\n val === null ||\n displayStr.trim() === '' ||\n displayStr.trim().toLowerCase() === '(not set)' ||\n displayStr.trim().toLowerCase() === '(empty / not set)' ||\n displayStr.trim().toLowerCase() === '(empty / unlinked)';\n\n switch (filterOperator) {\n case 'empty':\n return isValEmpty;\n case 'not_empty':\n return !isValEmpty;\n case 'equals':\n return !isValEmpty && displayStr.trim().toLowerCase() === filterQuery.trim().toLowerCase();\n case 'contains':\n return !isValEmpty && displayStr.toLowerCase().includes(filterQuery.trim().toLowerCase());\n case 'starts_with':\n return !isValEmpty && displayStr.trim().toLowerCase().startsWith(filterQuery.trim().toLowerCase());\n default:\n return true;\n }\n };\n\n const getVisibleEntries = (col: CollectionModel) => {\n const pageState = collectionPages[col.uid];\n return pageState ? pageState.entries : (col.entries || []);\n };\n\n const matchingEntriesCount = React.useMemo(() => {\n if (!isFilterActive) return 0;\n let count = 0;\n filteredCollections.forEach((col) => {\n const pageState = collectionPages[col.uid];\n if (pageState) {\n count += pageState.total;\n }\n });\n return count;\n }, [filteredCollections, collectionPages, isFilterActive]);\n\n const selectAllMatching = () => {\n const updated = { ...selectedEntries };\n filteredCollections.forEach((col) => {\n const pageState = collectionPages[col.uid];\n const entries = pageState ? pageState.entries : (col.entries || []);\n entries.forEach((e) => {\n updated[`${col.uid}${KEY_SEP}${e.documentId}`] = true;\n });\n });\n setSelectedEntries(updated);\n };\n\n const deselectAllMatching = () => {\n const updated = { ...selectedEntries };\n filteredCollections.forEach((col) => {\n const pageState = collectionPages[col.uid];\n const entries = pageState ? pageState.entries : (col.entries || []);\n entries.forEach((e) => {\n delete updated[`${col.uid}${KEY_SEP}${e.documentId}`];\n });\n });\n setSelectedEntries(updated);\n };\n\n const clearFilter = () => {\n setFilterOperator('none');\n setFilterQuery('');\n setEntrySearch('');\n setSelectedEntries({});\n collections.forEach((col) => {\n loadCollectionPage(col.uid, 1, undefined, undefined, undefined, 'none', '', '', false);\n });\n };\n\n const isCollectionFullySelected = (col: CollectionModel) => {\n const entries = getVisibleEntries(col);\n if (!entries.length) return false;\n return entries.every((e) => selectedEntries[`${col.uid}${KEY_SEP}${e.documentId}`]);\n };\n\n const isCollectionPartiallySelected = (col: CollectionModel) => {\n const entries = getVisibleEntries(col);\n if (!entries.length) return false;\n const selectedCount = entries.filter(\n (e) => selectedEntries[`${col.uid}${KEY_SEP}${e.documentId}`]\n ).length;\n return selectedCount > 0 && selectedCount < entries.length;\n };\n\n const toggleCollection = (col: CollectionModel) => {\n const entries = getVisibleEntries(col);\n const willSelectAll = !isCollectionFullySelected(col);\n const updated = { ...selectedEntries };\n entries.forEach((e) => {\n const key = `${col.uid}${KEY_SEP}${e.documentId}`;\n if (willSelectAll) {\n updated[key] = true;\n } else {\n delete updated[key];\n }\n });\n setSelectedEntries(updated);\n };\n\n const selectAll = () => {\n const updated = { ...selectedEntries };\n filteredCollections.forEach((col) => {\n const entries = getVisibleEntries(col);\n entries.forEach((e) => {\n updated[`${col.uid}${KEY_SEP}${e.documentId}`] = true;\n });\n });\n setSelectedEntries(updated);\n };\n\n const deselectAll = () => {\n setSelectedEntries({});\n };\n\n const getSelectedBreakdown = () => {\n const breakdown: Record<string, number> = {};\n Object.keys(selectedEntries).forEach((key) => {\n if (selectedEntries[key]) {\n const parts = key.split(KEY_SEP);\n if (parts.length === 2) {\n const uid = parts[0];\n const col = collections.find((c) => c.uid === uid);\n const name = col?.displayName || uid;\n breakdown[name] = (breakdown[name] || 0) + 1;\n }\n }\n });\n return breakdown;\n };\n\n // Open Confirmation Modal\n const handleOpenConfirmModal = () => {\n if (!selectedAttribute) {\n toggleNotification({\n type: 'warning',\n message: 'Please select an attribute from the dropdown',\n });\n return;\n }\n\n const totalSelected = Object.values(selectedEntries).filter(Boolean).length;\n if (totalSelected === 0) {\n toggleNotification({\n type: 'warning',\n message: 'Please select at least one collection type or entry to update',\n });\n return;\n }\n\n setShowConfirmModal(true);\n };\n\n // Perform bulk update with chosen mode\n const executeBatchWithMode = async (\n executionMode: 'immediate' | 'queue_offpeak' | 'maker_checker',\n forceImmediate = false\n ) => {\n const targets: Array<{ uid: string; documentId: string }> = [];\n Object.keys(selectedEntries).forEach((key) => {\n if (selectedEntries[key]) {\n const parts = key.split(KEY_SEP);\n if (parts.length === 2) {\n targets.push({ uid: parts[0], documentId: parts[1] });\n }\n }\n });\n\n try {\n setUpdating(true);\n setShowConfirmModal(false);\n setLastResults(null);\n\n const payload = {\n attribute: selectedAttribute,\n value: attributeValue,\n selectedEntries: targets,\n isRegex: useRegex,\n regexPattern: regexPattern,\n executionMode,\n makerNotes: makerNotesInput,\n forceImmediate,\n publishOnApproval,\n };\n\n const res = await post('/bulk-updater/batch-update', payload);\n\n if (res.data && res.data.success) {\n if (res.data.pending) {\n toggleNotification({\n type: 'success',\n message: res.data.message || 'Batch submitted successfully.',\n });\n await fetchPendingBatches();\n setActiveTab('audit');\n } else {\n setLastResults(res.data.results || []);\n setUpdateSummary({\n updatedCount: res.data.updatedCount || 0,\n skippedCount: res.data.skippedCount || 0,\n batchId: res.data.batchId,\n });\n\n toggleNotification({\n type: 'success',\n message: `Bulk update complete! Batch ID: ${res.data.batchId}. Updated: ${res.data.updatedCount}, Skipped: ${res.data.skippedCount}`,\n });\n\n await fetchModels();\n await fetchAuditHistory();\n }\n } else {\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Batch update encountered an error',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.response?.data?.error || err.message || 'Batch update failed',\n });\n } finally {\n setUpdating(false);\n setMakerNotesInput('');\n }\n };\n\n // Checker Approves Batch\n const handleApproveBatch = async (batchId: string) => {\n try {\n setApprovingBatchId(batchId);\n const res = await post(`/bulk-updater/batches/${batchId}/approve`, { executeImmediately: true });\n if (res.data && res.data.success) {\n toggleNotification({\n type: 'success',\n message: res.data.message || `Batch ${batchId} approved and executed successfully!`,\n });\n await fetchPendingBatches();\n await fetchAuditHistory();\n await fetchModels();\n } else {\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Failed to approve batch',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.response?.data?.error || err.message || 'Failed to approve batch',\n });\n } finally {\n setApprovingBatchId(null);\n }\n };\n\n // Checker Rejects Batch\n const handleRejectBatch = async (batchId: string) => {\n const reason = window.prompt('Enter reason for rejection:', 'Does not meet release criteria') || 'Rejected by Checker';\n try {\n setRejectingBatchId(batchId);\n const res = await post(`/bulk-updater/batches/${batchId}/reject`, { reason });\n if (res.data && res.data.success) {\n toggleNotification({\n type: 'info',\n message: `Batch ${batchId} rejected: ${reason}`,\n });\n await fetchPendingBatches();\n } else {\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Failed to reject batch',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.response?.data?.error || err.message || 'Failed to reject batch',\n });\n } finally {\n setRejectingBatchId(null);\n }\n };\n\n // Execute Queued Batch Immediately\n const handleExecuteNow = async (batchId: string) => {\n try {\n setExecutingNowBatchId(batchId);\n const res = await post(`/bulk-updater/batches/${batchId}/execute-now`);\n if (res.data && res.data.success) {\n toggleNotification({\n type: 'success',\n message: `Batch ${batchId} executed immediately!`,\n });\n await fetchPendingBatches();\n await fetchAuditHistory();\n await fetchModels();\n } else {\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Failed to execute batch',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.response?.data?.error || err.message || 'Failed to execute batch',\n });\n } finally {\n setExecutingNowBatchId(null);\n }\n };\n\n // Perform Rollback\n const handleRollback = async (batchId: string) => {\n if (!window.confirm(`Are you sure you want to roll back all changes made in batch \"${batchId}\"?`)) {\n return;\n }\n\n try {\n setRollingBackBatchId(batchId);\n const res = await post(`/bulk-updater/audit/${batchId}/rollback`);\n\n if (res.data && res.data.success) {\n toggleNotification({\n type: 'success',\n message: `Batch \"${batchId}\" rolled back successfully! Reverted ${res.data.revertedCount} entries.`,\n });\n await fetchAuditHistory();\n await fetchModels();\n } else {\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Rollback failed.',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.response?.data?.error || err.message || 'Rollback encountered an error.',\n });\n } finally {\n setRollingBackBatchId(null);\n }\n };\n\n const totalSelectedCount = Object.values(selectedEntries).filter(Boolean).length;\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (rootRef.current && rootRef.current.parentElement) {\n rootRef.current.parentElement.style.minWidth = '0';\n rootRef.current.parentElement.style.maxWidth = '100%';\n }\n }, []);\n\n return (\n <Box\n ref={rootRef}\n className=\"bulk-updater-root\"\n padding={8}\n background=\"neutral100\"\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, boxSizing: 'border-box' }}\n >\n <style>{`\n /* Prevent page-level horizontal overflow under any circumstance */\n html, body {\n overflow-x: hidden !important;\n max-width: 100vw !important;\n }\n div:has(> .bulk-updater-root) {\n min-width: 0 !important;\n max-width: 100% !important;\n width: 100% !important;\n flex: 1 1 0% !important;\n overflow-x: clip !important;\n }\n .bulk-updater-root {\n min-width: 0 !important;\n max-width: 100% !important;\n width: 100% !important;\n box-sizing: border-box !important;\n overflow-x: clip !important;\n }\n /* All tables stretch to take the full available container space */\n .bulk-updater-root table {\n width: 100% !important;\n min-width: 0 !important;\n }\n .bulk-updater-root div:has(> table) {\n width: 100% !important;\n max-width: 100% !important;\n min-width: 0 !important;\n }\n /* Table scroll container keeps horizontal scroll strictly at the table level */\n .bulk-updater-table-container {\n width: 100% !important;\n max-width: 100% !important;\n min-width: 0 !important;\n overflow-x: auto !important;\n -webkit-overflow-scrolling: touch;\n }\n .bulk-updater-table-container::-webkit-scrollbar {\n height: 8px;\n }\n .bulk-updater-table-container::-webkit-scrollbar-track {\n background: rgba(120, 120, 150, 0.1);\n border-radius: 4px;\n }\n .bulk-updater-table-container::-webkit-scrollbar-thumb {\n background: rgba(120, 120, 150, 0.4);\n border-radius: 4px;\n }\n .bulk-updater-table-container::-webkit-scrollbar-thumb:hover {\n background: rgba(120, 120, 150, 0.7);\n }\n `}</style>\n {/* Page Header */}\n <Flex direction=\"column\" alignItems=\"flex-start\" gap={2} marginBottom={6}>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Box>\n <Flex gap={3} alignItems=\"center\">\n <Typography variant=\"alpha\" tag=\"h1\" fontWeight=\"bold\">\n Bulk Attribute Updater\n </Typography>\n {auditEnabled && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n AUDIT &amp; ROLLBACK ACTIVE\n </Badge>\n )}\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n Cross-collection batch attribute management with declarative audit trail and one-click rollback.\n </Typography>\n </Box>\n <Flex gap={2}>\n <Button\n startIcon={<ArrowClockwise />}\n variant=\"tertiary\"\n onClick={activeTab === 'editor' ? fetchModels : fetchAuditHistory}\n loading={loading || auditLoading}\n >\n Refresh\n </Button>\n </Flex>\n </Flex>\n </Flex>\n\n {/* Tab Navigation */}\n <Flex gap={2} marginBottom={4} wrap=\"wrap\" justifyContent=\"space-between\" alignItems=\"center\">\n <Flex gap={2}>\n <Button\n variant={activeTab === 'editor' ? 'default' : 'tertiary'}\n onClick={() => setActiveTab('editor')}\n size=\"M\"\n >\n Bulk Updater Workspace\n </Button>\n <Button\n variant={activeTab === 'audit' ? 'default' : 'tertiary'}\n onClick={() => setActiveTab('audit')}\n size=\"M\"\n >\n Audit Trail &amp; Approvals\n {pendingBatches.filter((b) => b.status === 'pending_approval' || b.status === 'queued_offpeak').length > 0 ? (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\" style={{ marginLeft: 8 }}>\n {pendingBatches.filter((b) => b.status === 'pending_approval' || b.status === 'queued_offpeak').length} PENDING\n </Badge>\n ) : auditHistory.length > 0 ? (\n ` (${auditHistory.length})`\n ) : (\n ''\n )}\n </Button>\n <Button\n variant={activeTab === 'rules' ? 'default' : 'tertiary'}\n onClick={() => setActiveTab('rules')}\n size=\"M\"\n >\n Validation &amp; Quota Rules\n </Button>\n <Button\n variant={activeTab === 'csv' ? 'default' : 'tertiary'}\n onClick={() => setActiveTab('csv')}\n size=\"M\"\n >\n CSV Import / Export &amp; Override\n </Button>\n </Flex>\n\n {/* Server Policy Indicator */}\n {executionWindow && (\n <Flex gap={2} alignItems=\"center\">\n <Badge\n backgroundColor={executionWindow.isBusinessHours ? 'warning100' : 'success100'}\n textColor={executionWindow.isBusinessHours ? 'warning700' : 'success700'}\n >\n {executionWindow.isBusinessHours\n ? `PEAK HOURS (${executionWindow.businessHours?.start} - ${executionWindow.businessHours?.end} ${executionWindow.timeZone || ''}) • OFF-PEAK QUEUE ACTIVE`\n : `OFF-PEAK WINDOW ACTIVE (${executionWindow.timeZone || ''}) • DIRECT EXECUTION PERMITTED`}\n </Badge>\n </Flex>\n )}\n </Flex>\n\n {/* Quick Rollback Banner for Workspace */}\n {activeTab === 'editor' && latestActiveBatch && !updateSummary && (\n <Box\n padding={3}\n paddingLeft={4}\n paddingRight={4}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n marginBottom={4}\n style={{ borderLeft: '4px solid #4945ff' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={2}>\n <Flex gap={2} alignItems=\"center\">\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n ACTIVE BATCH\n </Badge>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n <code>{latestActiveBatch.batchId}</code> ({latestActiveBatch.updatedCount} entries updated by {latestActiveBatch.userEmail})\n </Typography>\n </Flex>\n <Flex gap={2}>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n startIcon={<ArrowClockwise />}\n onClick={() => handleRollback(latestActiveBatch.batchId)}\n loading={rollingBackBatchId === latestActiveBatch.batchId}\n >\n Rollback This Batch\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => setActiveTab('audit')}\n >\n View Rollback History →\n </Button>\n </Flex>\n </Flex>\n </Box>\n )}\n\n {/* ======================================================== */}\n {/* TAB 1: BULK UPDATER EDITOR */}\n {/* ======================================================== */}\n {activeTab === 'editor' && (\n <>\n {/* Main Control Panel: Attribute Dropdown + Value Input + Action Button */}\n <Box\n padding={6}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n marginBottom={6}\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, boxSizing: 'border-box' }}\n >\n <Typography variant=\"delta\" tag=\"h2\" marginBottom={4} fontWeight=\"semiBold\">\n 1. Configure Attribute Update\n </Typography>\n\n <Flex gap={4} alignItems=\"flex-end\" wrap=\"wrap\">\n {/* Attribute Dropdown */}\n <Box style={{ minWidth: 260 }}>\n <SingleSelect\n label=\"Attribute to Update\"\n placeholder=\"Select an attribute...\"\n value={selectedAttribute}\n onChange={(val) => handleAttributeChange(String(val))}\n >\n {attributes.map((attr) => {\n const rel = relationsMeta[attr];\n return (\n <SingleSelectOption key={attr} value={attr}>\n {attr} {rel ? `(relation ➔ ${rel.targetDisplayName})` : ''}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n\n {/* New Value Input or Relation Target Selector */}\n <Box style={{ flex: 1, minWidth: 340 }}>\n {relationsMeta[selectedAttribute] ? (\n <Flex direction=\"column\" gap={1} style={{ width: '100%' }}>\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral700\">\n Target {relationsMeta[selectedAttribute].targetDisplayName} Relation:\n </Typography>\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n {relationsMeta[selectedAttribute].relationType} &rarr; {relationsMeta[selectedAttribute].targetDisplayName}\n </Badge>\n {relationsMeta[selectedAttribute].isMulti && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n Multi-Relation\n </Badge>\n )}\n </Flex>\n <Flex gap={2} alignItems=\"center\" style={{ width: '100%' }}>\n <Box style={{ flex: 1, minWidth: 200 }}>\n <SingleSelect\n label={`Choose ${relationsMeta[selectedAttribute].targetDisplayName}`}\n placeholder={relationOptionsLoading ? 'Loading entities...' : `Pick a ${relationsMeta[selectedAttribute].targetDisplayName}...`}\n value={selectedRelationDocId}\n onChange={(val) => {\n const docId = String(val);\n setSelectedRelationDocId(docId);\n if (docId === '__clear__') {\n setAttributeValue(JSON.stringify({ mode: 'clear', label: '(clear relation)' }));\n } else {\n const opt = relationOptions.find((o) => o.documentId === docId);\n setAttributeValue(JSON.stringify({ mode: relationMode, documentIds: [docId], label: opt?.label || docId }));\n }\n }}\n >\n <SingleSelectOption value=\"__clear__\">-- Clear / Unlink Relation --</SingleSelectOption>\n {relationOptions.map((opt) => (\n <SingleSelectOption key={opt.documentId} value={opt.documentId}>\n {opt.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n {relationsMeta[selectedAttribute].isMulti && (\n <Box style={{ width: 170 }}>\n <SingleSelect\n label=\"Action Mode\"\n value={relationMode}\n onChange={(val) => {\n const m = String(val) as 'set' | 'connect' | 'disconnect' | 'clear';\n setRelationMode(m);\n if (selectedRelationDocId) {\n if (selectedRelationDocId === '__clear__' || m === 'clear') {\n setAttributeValue(JSON.stringify({ mode: 'clear', label: '(clear relation)' }));\n } else {\n const opt = relationOptions.find((o) => o.documentId === selectedRelationDocId);\n setAttributeValue(JSON.stringify({ mode: m, documentIds: [selectedRelationDocId], label: opt?.label || selectedRelationDocId }));\n }\n }\n }}\n >\n <SingleSelectOption value=\"set\">Set / Overwrite</SingleSelectOption>\n <SingleSelectOption value=\"connect\">Add / Connect</SingleSelectOption>\n <SingleSelectOption value=\"disconnect\">Remove / Disconnect</SingleSelectOption>\n <SingleSelectOption value=\"clear\">Clear All</SingleSelectOption>\n </SingleSelect>\n </Box>\n )}\n </Flex>\n </Flex>\n ) : (\n <TextInput\n label={useRegex ? 'Replacement Value' : 'New Attribute Value'}\n name=\"attributeValue\"\n placeholder={useRegex ? 'Replace matched pattern with...' : 'Enter the value to apply...'}\n value={attributeValue}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setAttributeValue(e.target.value)\n }\n />\n )}\n </Box>\n\n {/* Update Action Button */}\n <Box>\n <Button\n startIcon={<Play />}\n variant=\"default\"\n size=\"L\"\n onClick={handleOpenConfirmModal}\n loading={updating}\n disabled={loading || totalSelectedCount === 0}\n >\n Update Selected ({totalSelectedCount})\n </Button>\n </Box>\n </Flex>\n\n {/* Pro Feature: Regex Search & Replace */}\n <Box marginTop={4} padding={4} background=\"neutral100\" hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\n <Flex gap={2} alignItems=\"center\">\n <Checkbox\n checked={useRegex}\n onCheckedChange={(checked: boolean) => setUseRegex(Boolean(checked))}\n >\n <Typography fontWeight=\"bold\">Enable Regex Find &amp; Replace</Typography>\n </Checkbox>\n </Flex>\n {useRegex && (\n <Box style={{ flex: 1, minWidth: 240 }}>\n <TextInput\n placeholder=\"Regex pattern (e.g. \\b(OldName)\\b)...\"\n value={regexPattern}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setRegexPattern(e.target.value)\n }\n />\n </Box>\n )}\n </Flex>\n </Box>\n\n {/* Selected Attribute Context Hint */}\n {selectedAttribute && (\n <Box marginTop={4} padding={3} background=\"neutral100\" hasRadius>\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Typography variant=\"pi\" fontWeight=\"bold\">\n Attribute Info:\n </Typography>\n <Typography variant=\"pi\">\n Targeting attribute <strong>{selectedAttribute}</strong>.\n </Typography>\n {collections.map((c) => {\n const hasAttr = c.attributes.includes(selectedAttribute);\n return (\n <Badge\n key={c.uid}\n backgroundColor={hasAttr ? 'success100' : 'neutral200'}\n textColor={hasAttr ? 'success700' : 'neutral600'}\n >\n {c.displayName}: {hasAttr ? 'Attribute exists' : 'Not in schema'}\n </Badge>\n );\n })}\n </Flex>\n </Box>\n )}\n </Box>\n\n {/* Target Selection: Collections & Entries */}\n <Box\n padding={6}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n marginBottom={6}\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, boxSizing: 'border-box' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={4} wrap=\"wrap\" gap={3}>\n <Box>\n <Typography variant=\"delta\" tag=\"h2\" fontWeight=\"semiBold\">\n 2. Select Targets\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Pick entire collection types or individual entries to apply the update to.\n </Typography>\n </Box>\n <Flex gap={2}>\n <Button variant=\"secondary\" size=\"S\" onClick={selectAll}>\n Select All\n </Button>\n <Button variant=\"tertiary\" size=\"S\" onClick={deselectAll}>\n Deselect All\n </Button>\n </Flex>\n </Flex>\n\n {/* Target Value Filter & Search Bar */}\n <Box\n padding={4}\n background=\"neutral100\"\n hasRadius\n marginBottom={5}\n style={{ width: '100%', maxWidth: '100%', boxSizing: 'border-box' }}\n >\n <Flex direction=\"column\" gap={3}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={2}>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n Search &amp; Filter Targets:\n </Typography>\n {isFilterActive && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n {matchingEntriesCount} matching {matchingEntriesCount === 1 ? 'entry' : 'entries'} found in database\n </Badge>\n )}\n </Flex>\n {isFilterActive && (\n <Button variant=\"ghost\" size=\"S\" onClick={clearFilter}>\n Clear Search &amp; Filter\n </Button>\n )}\n </Flex>\n\n <Flex gap={3} alignItems=\"flex-end\" wrap=\"wrap\">\n {/* Operator Select */}\n <Box style={{ width: 220, minWidth: 180 }}>\n <SingleSelect\n label={`Filter condition for \"${selectedAttribute}\"`}\n value={filterOperator}\n onChange={(val) => setFilterOperator(String(val) as FilterOperator)}\n >\n <SingleSelectOption value=\"none\">Show All (No Attribute Filter)</SingleSelectOption>\n <SingleSelectOption value=\"empty\">Is Empty or Null</SingleSelectOption>\n <SingleSelectOption value=\"not_empty\">Is Not Empty</SingleSelectOption>\n <SingleSelectOption value=\"equals\">Equals Exact Text</SingleSelectOption>\n <SingleSelectOption value=\"contains\">Contains Substring</SingleSelectOption>\n <SingleSelectOption value=\"starts_with\">Starts With</SingleSelectOption>\n </SingleSelect>\n </Box>\n\n {/* Value query input if needed */}\n {(filterOperator === 'equals' || filterOperator === 'contains' || filterOperator === 'starts_with') && (\n <Box style={{ flex: 1, minWidth: 200 }}>\n <TextInput\n label={`Value for \"${selectedAttribute}\"`}\n placeholder=\"Type value to match...\"\n value={filterQuery}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFilterQuery(e.target.value)}\n />\n </Box>\n )}\n\n {/* Full-text search across entries */}\n <Box style={{ flex: 1, minWidth: 200 }}>\n <TextInput\n label=\"Full-text Entry Search\"\n placeholder=\"Search title, name, or text across records...\"\n value={entrySearch}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEntrySearch(e.target.value)}\n />\n </Box>\n\n {/* Quick Action Buttons when filter is active */}\n {isFilterActive && (\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"default\"\n size=\"S\"\n onClick={selectAllMatching}\n disabled={matchingEntriesCount === 0}\n >\n Select All Loaded\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={deselectAllMatching}\n disabled={matchingEntriesCount === 0}\n >\n Deselect All Loaded\n </Button>\n </Flex>\n )}\n </Flex>\n\n {isFilterActive && (\n <Flex gap={2} alignItems=\"center\" marginTop={1}>\n <Badge backgroundColor=\"success100\" textColor=\"success700\" size=\"S\">\n ✓ Filter active: Showing only matching entries. All returned matching records are pre-selected.\n </Badge>\n </Flex>\n )}\n </Flex>\n </Box>\n\n {/* Advanced Content Type Visibility Filter */}\n {collections.length > 0 && (\n <Box\n padding={4}\n background=\"neutral100\"\n hasRadius\n marginBottom={4}\n style={{ width: '100%', maxWidth: '100%', boxSizing: 'border-box' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={2} marginBottom={3}>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n Filter Visible Content Types:\n </Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n {filteredCollections.length} of {collections.length} visible\n </Badge>\n </Flex>\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => {\n const allVis: Record<string, boolean> = {};\n collections.forEach((c) => (allVis[c.uid] = true));\n setVisibleTypeUids(allVis);\n }}\n >\n Show All Types\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => {\n const allVis: Record<string, boolean> = {};\n collections.forEach((c) => (allVis[c.uid] = false));\n setVisibleTypeUids(allVis);\n }}\n >\n Hide All Types\n </Button>\n </Flex>\n </Flex>\n\n <Flex wrap=\"wrap\" gap={2} alignItems=\"center\">\n {collections.map((col) => {\n const isVisible = visibleTypeUids[col.uid] !== false;\n return (\n <Box\n key={col.uid}\n padding={2}\n paddingLeft={3}\n paddingRight={3}\n background={isVisible ? 'neutral0' : 'neutral200'}\n hasRadius\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderColor={isVisible ? 'primary200' : 'neutral300'}\n >\n <Flex gap={2} alignItems=\"center\">\n <Checkbox\n checked={isVisible}\n onCheckedChange={(checked: boolean) =>\n setVisibleTypeUids((prev) => ({ ...prev, [col.uid]: Boolean(checked) }))\n }\n >\n <Typography fontWeight={isVisible ? 'semiBold' : 'regular'}>\n {col.displayName}\n </Typography>\n </Checkbox>\n {col.isSingleType ? (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\" size=\"S\">\n Single Type\n </Badge>\n ) : (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\" size=\"S\">\n Collection\n </Badge>\n )}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n </Box>\n )}\n\n {/* Filter Search & Global Page Size Controls */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={4} wrap=\"wrap\" gap={3}>\n {collections.length > 1 && (\n <Box style={{ flex: 1, maxWidth: 360, minWidth: 220 }}>\n <TextInput\n label=\"Search Content Types\"\n placeholder=\"Search by name or UID...\"\n value={collectionSearch}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setCollectionSearch(e.target.value)\n }\n />\n </Box>\n )}\n <Flex gap={2} alignItems=\"center\" style={{ marginLeft: 'auto' }}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Default page size (max 500):\n </Typography>\n <Box style={{ width: 130 }}>\n <SingleSelect\n size=\"S\"\n value={String(defaultPageSize)}\n onChange={(val) => handleGlobalPageSizeChange(Number(val))}\n >\n <SingleSelectOption value=\"5\">5 / page</SingleSelectOption>\n <SingleSelectOption value=\"10\">10 / page</SingleSelectOption>\n <SingleSelectOption value=\"25\">25 / page</SingleSelectOption>\n <SingleSelectOption value=\"50\">50 / page</SingleSelectOption>\n <SingleSelectOption value=\"100\">100 / page</SingleSelectOption>\n <SingleSelectOption value=\"250\">250 / page</SingleSelectOption>\n <SingleSelectOption value=\"500\">500 / page</SingleSelectOption>\n </SingleSelect>\n </Box>\n </Flex>\n </Flex>\n\n {filteredCollections.length === 0 ? (\n <Box padding={6} background=\"neutral100\" hasRadius style={{ textAlign: 'center' }}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n No content types match the visibility or search filters.\n </Typography>\n </Box>\n ) : (\n filteredCollections.map((col) => {\n const pageState = collectionPages[col.uid];\n const entries = pageState ? pageState.entries : (col.entries || []);\n const totalEntries = pageState ? pageState.total : (col.totalEntries !== undefined ? col.totalEntries : entries.length);\n const page = pageState ? pageState.page : 1;\n const pageCount = pageState ? pageState.pageCount : 1;\n const pageSize = pageState ? pageState.pageSize : defaultPageSize;\n const hasAttr = col.attributes.includes(selectedAttribute);\n const visibleEntries = getVisibleEntries(col);\n const matchingColCount = entries.filter((e) => entryMatchesFilter(e, selectedAttribute)).length;\n const isFullySelected = isCollectionFullySelected(col);\n const isPartiallySelected = isCollectionPartiallySelected(col);\n const currentSort = collectionSorts[col.uid] || { field: 'createdAt', order: 'desc' };\n const availableColumns = getAvailableColumnsForCollection(col, selectedAttribute);\n const savedColKeys = collectionColumnVisibility[col.uid];\n const activeColumns = savedColKeys\n ? availableColumns.filter((c) => c.isPermanent || savedColKeys.includes(c.key))\n : availableColumns.filter((c) => c.defaultVisible);\n\n return (\n <Box\n key={col.uid}\n marginBottom={5}\n padding={4}\n hasRadius\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderColor=\"neutral200\"\n background=\"neutral0\"\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, boxSizing: 'border-box' }}\n >\n {/* Collection Header */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3} wrap=\"wrap\" gap={2}>\n <Flex gap={3} alignItems=\"center\" wrap=\"wrap\">\n <Checkbox\n checked={isFullySelected}\n indeterminate={isPartiallySelected ? true : undefined}\n onCheckedChange={() => toggleCollection(col)}\n >\n <Typography variant=\"beta\" fontWeight=\"bold\">\n {col.displayName} {col.isSingleType ? '(Single Type)' : 'Collection'}\n </Typography>\n </Checkbox>\n {col.isSingleType ? (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n Single Type\n </Badge>\n ) : (\n <Badge\n backgroundColor={hasAttr ? 'success100' : 'warning100'}\n textColor={hasAttr ? 'success700' : 'warning700'}\n >\n {hasAttr\n ? `Schema has \"${selectedAttribute}\"`\n : `Schema lacks \"${selectedAttribute}\" (will skip)`}\n </Badge>\n )}\n </Flex>\n\n <Flex gap={3} alignItems=\"center\" wrap=\"wrap\">\n {!col.isSingleType && (\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Sort:\n </Typography>\n <Box style={{ width: 190 }}>\n <SingleSelect\n size=\"S\"\n value={`${currentSort.field}:${currentSort.order}`}\n onChange={(val) => {\n const [f, o] = String(val).split(':');\n handleCollectionSortChange(col.uid, f, o as 'asc' | 'desc');\n }}\n >\n <SingleSelectOption value=\"createdAt:desc\">Created: Newest</SingleSelectOption>\n <SingleSelectOption value=\"createdAt:asc\">Created: Oldest</SingleSelectOption>\n {hasAttr && (\n <>\n <SingleSelectOption value={`${selectedAttribute}:asc`}>\n {selectedAttribute} (A &rarr; Z)\n </SingleSelectOption>\n <SingleSelectOption value={`${selectedAttribute}:desc`}>\n {selectedAttribute} (Z &rarr; A)\n </SingleSelectOption>\n </>\n )}\n {col.attributes.includes('name') && (\n <>\n <SingleSelectOption value=\"name:asc\">Name (A &rarr; Z)</SingleSelectOption>\n <SingleSelectOption value=\"name:desc\">Name (Z &rarr; A)</SingleSelectOption>\n </>\n )}\n {col.attributes.includes('title') && (\n <>\n <SingleSelectOption value=\"title:asc\">Title (A &rarr; Z)</SingleSelectOption>\n <SingleSelectOption value=\"title:desc\">Title (Z &rarr; A)</SingleSelectOption>\n </>\n )}\n </SingleSelect>\n </Box>\n </Flex>\n )}\n\n <Button\n variant={openColumnPickerUid === col.uid ? 'secondary' : 'tertiary'}\n size=\"S\"\n onClick={() => setOpenColumnPickerUid(openColumnPickerUid === col.uid ? null : col.uid)}\n >\n Columns ({activeColumns.filter((c) => !c.isPermanent).length}/{availableColumns.filter((c) => !c.isPermanent).length})\n </Button>\n\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Download />}\n onClick={async () => {\n try {\n const params = new URLSearchParams();\n if (selectedAttribute) params.set('attribute', selectedAttribute);\n if (filterOperator && filterOperator !== 'none') {\n params.set('filterOperator', filterOperator);\n if (filterQuery) params.set('filterQuery', filterQuery);\n }\n if (entrySearch && entrySearch.trim()) {\n params.set('search', entrySearch.trim());\n }\n const res = await get(`/bulk-updater/csv/export/${col.uid}?${params.toString()}`);\n const csvStr = res.data?.csvContent || (typeof res.data === 'string' ? res.data : '');\n if (!csvStr) {\n toggleNotification({\n type: 'warning',\n message: 'No CSV content returned for this collection',\n });\n return;\n }\n const blob = new Blob([csvStr], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `${col.singularName || 'export'}_entries.csv`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n toggleNotification({\n type: 'success',\n message: `Exported ${col.displayName} entries to CSV`,\n });\n } catch (e: any) {\n toggleNotification({\n type: 'danger',\n message: e.message || 'Failed exporting CSV',\n });\n }\n }}\n >\n Export CSV\n </Button>\n\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {col.isSingleType\n ? '1 single entry'\n : isFilterActive\n ? `${totalEntries} matching entries in DB`\n : `${totalEntries} entries`}\n </Typography>\n </Flex>\n </Flex>\n\n {/* Column Visibility Selector Panel */}\n {openColumnPickerUid === col.uid && (\n <Box\n padding={3}\n marginBottom={3}\n background=\"neutral100\"\n hasRadius\n borderColor=\"neutral200\"\n style={{ border: '1px solid #dcdce4' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\n <Flex gap={3} alignItems=\"center\" wrap=\"wrap\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral700\">\n Columns for {col.displayName}:\n </Typography>\n {availableColumns\n .filter((c) => !c.isPermanent)\n .map((c) => {\n const isChecked = activeColumns.some((ac) => ac.key === c.key);\n return (\n <Box key={c.key}>\n <Checkbox\n checked={isChecked}\n onCheckedChange={() => toggleColumn(col.uid, c.key, availableColumns)}\n >\n <Typography variant=\"pi\">{c.label}</Typography>\n </Checkbox>\n </Box>\n );\n })}\n </Flex>\n <Flex gap={2}>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => showAllColumns(col.uid, availableColumns)}\n >\n Show All\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => resetDefaultColumns(col.uid, availableColumns)}\n >\n Reset\n </Button>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => setOpenColumnPickerUid(null)}\n >\n Close\n </Button>\n </Flex>\n </Flex>\n </Box>\n )}\n\n {/* Entries Table */}\n <Box className=\"bulk-updater-table-container\" style={{ width: '100%', maxWidth: '100%', minWidth: 0, overflowX: 'auto' }}>\n <Table colCount={activeColumns.length} rowCount={visibleEntries.length + 1} style={{ width: '100%' }}>\n <Thead>\n <Tr>\n {activeColumns.map((colDef) =>\n renderHeaderCell(colDef, col, currentSort, selectedAttribute, handleHeaderSortClick)\n )}\n </Tr>\n </Thead>\n <Tbody>\n {visibleEntries.length === 0 ? (\n <Tr>\n <Td colSpan={activeColumns.length}>\n <Box padding={4} style={{ textAlign: 'center' }}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No entries in this content type match the active filter criteria.\n </Typography>\n </Box>\n </Td>\n </Tr>\n ) : (\n visibleEntries.map((entry) => {\n const key = `${col.uid}${KEY_SEP}${entry.documentId}`;\n const isSelected = Boolean(selectedEntries[key]);\n const isMatch = isFilterActive;\n\n return (\n <Tr\n key={key}\n style={{\n backgroundColor: isSelected\n ? 'rgba(73, 69, 255, 0.14)'\n : isMatch\n ? 'rgba(46, 213, 115, 0.08)'\n : undefined,\n boxShadow: isSelected\n ? 'inset 3px 0 0 0 #4945ff'\n : isMatch\n ? 'inset 3px 0 0 0 #2ed573'\n : undefined,\n }}\n >\n {activeColumns.map((colDef) => (\n <Td key={colDef.key}>\n {renderCellContent(\n colDef,\n entry,\n col,\n selectedAttribute,\n isMatch,\n hasAttr,\n isSelected,\n () => toggleEntry(col.uid, entry.documentId)\n )}\n </Td>\n ))}\n </Tr>\n );\n })\n )}\n </Tbody>\n </Table>\n </Box>\n\n {/* Server-Side Pagination & Page Size Controls */}\n {!col.isSingleType && (\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginTop={4} wrap=\"wrap\" gap={3}>\n <Flex gap={3} alignItems=\"center\" wrap=\"wrap\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Showing {totalEntries === 0 ? 0 : Math.min((page - 1) * pageSize + 1, totalEntries)} to {Math.min(page * pageSize, totalEntries)} of {totalEntries} {isFilterActive ? 'matching entries' : 'entries'}\n </Typography>\n <Flex gap={1} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">Show:</Typography>\n <Box style={{ width: 85 }}>\n <SingleSelect\n size=\"S\"\n value={String(pageSize)}\n onChange={(val) => handleCollectionPageSizeChange(col.uid, Number(val))}\n >\n <SingleSelectOption value=\"5\">5</SingleSelectOption>\n <SingleSelectOption value=\"10\">10</SingleSelectOption>\n <SingleSelectOption value=\"25\">25</SingleSelectOption>\n <SingleSelectOption value=\"50\">50</SingleSelectOption>\n <SingleSelectOption value=\"100\">100</SingleSelectOption>\n <SingleSelectOption value=\"250\">250</SingleSelectOption>\n <SingleSelectOption value=\"500\">500</SingleSelectOption>\n </SingleSelect>\n </Box>\n <Typography variant=\"pi\" textColor=\"neutral500\">per page</Typography>\n </Flex>\n {totalEntries > visibleEntries.length && (\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => handleCollectionPageSizeChange(col.uid, Math.min(totalEntries, 500))}\n >\n Load all {totalEntries} entries\n </Button>\n )}\n </Flex>\n\n {pageCount > 1 && (\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"tertiary\"\n size=\"S\"\n disabled={page <= 1 || pageState?.loading}\n onClick={() => loadCollectionPage(col.uid, page - 1)}\n >\n &larr; Previous\n </Button>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\">\n Page {page} of {pageCount}\n </Typography>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n disabled={page >= pageCount || pageState?.loading}\n onClick={() => loadCollectionPage(col.uid, page + 1)}\n >\n Next &rarr;\n </Button>\n </Flex>\n )}\n </Flex>\n )}\n </Box>\n );\n })\n )}\n </Box>\n\n {/* Execution Results Feedback */}\n {updateSummary && (\n <Box\n padding={6}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n marginBottom={6}\n >\n <Typography variant=\"delta\" tag=\"h2\" fontWeight=\"semiBold\" marginBottom={3}>\n 3. Execution Results\n </Typography>\n\n <Alert\n title=\"Batch Update Completed\"\n variant={updateSummary.updatedCount > 0 ? 'success' : 'default'}\n closeLabel=\"Close\"\n onClose={() => setUpdateSummary(null)}\n marginBottom={4}\n >\n <Flex direction=\"column\" alignItems=\"flex-start\" gap={3} width=\"100%\">\n <Typography variant=\"omega\">\n Successfully updated <strong>{updateSummary.updatedCount}</strong> records.\n Skipped <strong>{updateSummary.skippedCount}</strong> records.\n {updateSummary.batchId && (\n <span>\n {' '}Transaction Batch ID: <code>{updateSummary.batchId}</code> (logged to audit trail).\n </span>\n )}\n </Typography>\n {updateSummary.batchId && (\n <Flex gap={2} marginTop={1}>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n startIcon={<ArrowClockwise />}\n onClick={() => handleRollback(updateSummary.batchId!)}\n loading={rollingBackBatchId === updateSummary.batchId}\n >\n Rollback This Batch\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => setActiveTab('audit')}\n >\n View in Audit Trail &amp; Rollback History →\n </Button>\n </Flex>\n )}\n </Flex>\n </Alert>\n\n {lastResults && lastResults.length > 0 && (\n <Table colCount={4} rowCount={lastResults.length + 1}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">Collection</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Entry</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Status</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Details</Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {lastResults.map((res, idx) => (\n <Tr key={idx}>\n <Td>\n <Typography fontWeight=\"bold\">{res.collectionName}</Typography>\n </Td>\n <Td>\n <Typography>{res.label}</Typography>\n </Td>\n <Td>\n {res.status === 'updated' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n Updated\n </Badge>\n )}\n {res.status === 'skipped' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n Skipped\n </Badge>\n )}\n {res.status === 'error' && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n Error\n </Badge>\n )}\n </Td>\n <Td>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n {res.message}\n </Typography>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n )}\n </Box>\n )}\n </>\n )}\n\n {/* ======================================================== */}\n {/* TAB 2: AUDIT TRAIL & ROLLBACK HISTORY */}\n {/* ======================================================== */}\n {activeTab === 'audit' && (\n <Box\n padding={6}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, boxSizing: 'border-box' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={4}>\n <Box>\n <Typography variant=\"delta\" tag=\"h2\" fontWeight=\"semiBold\">\n Audit Trail &amp; Version History\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Deterministic record of all batch updates, timestamps, admin authorship, and one-click rollback.\n </Typography>\n </Box>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<ArrowClockwise />}\n onClick={() => {\n fetchAuditHistory();\n fetchPendingBatches();\n }}\n loading={auditLoading || pendingBatchesLoading}\n >\n Refresh History\n </Button>\n </Flex>\n\n {/* Pending Approvals & Queued Batches Section */}\n <Box marginBottom={6} padding={5} background=\"neutral100\" hasRadius style={{ border: '1px solid #e6e6ef' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <Box>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"epsilon\" fontWeight=\"bold\">\n Pending Approvals &amp; Queued Batches\n </Typography>\n {pendingBatches.filter((b) => b.status === 'pending_approval' || b.status === 'queued_offpeak').length > 0 && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n {pendingBatches.filter((b) => b.status === 'pending_approval' || b.status === 'queued_offpeak').length} Action Required\n </Badge>\n )}\n </Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Four-Eyes Maker-Checker authorization queue and off-peak scheduled maintenance batches.\n </Typography>\n </Box>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<ArrowClockwise />}\n onClick={fetchPendingBatches}\n loading={pendingBatchesLoading}\n >\n Refresh Queue\n </Button>\n </Flex>\n\n {pendingBatches.length === 0 ? (\n <Box padding={4} background=\"neutral0\" hasRadius style={{ textAlign: 'center' }}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n No batches pending approval or queued for off-peak execution.\n </Typography>\n </Box>\n ) : (\n <Box className=\"bulk-updater-table-container\" style={{ width: '100%', maxWidth: '100%', minWidth: 0, overflowX: 'auto' }}>\n <Table colCount={6} rowCount={pendingBatches.length + 1} style={{ width: '100%' }}>\n <Thead>\n <Tr>\n <Th style={{ minWidth: 160 }}><Typography variant=\"sigma\">Batch ID &amp; Created</Typography></Th>\n <Th style={{ minWidth: 130 }}><Typography variant=\"sigma\">Maker</Typography></Th>\n <Th style={{ minWidth: 200 }}><Typography variant=\"sigma\">Target Details</Typography></Th>\n <Th style={{ minWidth: 150 }}><Typography variant=\"sigma\">Status</Typography></Th>\n <Th style={{ minWidth: 180 }}><Typography variant=\"sigma\">Notes</Typography></Th>\n <Th style={{ minWidth: 180, textAlign: 'right' }}><Typography variant=\"sigma\">Actions</Typography></Th>\n </Tr>\n </Thead>\n <Tbody>\n {pendingBatches.map((batch) => (\n <Tr key={batch.id}>\n <Td>\n <Typography fontWeight=\"bold\">{batch.id}</Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" display=\"block\">\n {new Date(batch.createdAt).toLocaleString()}\n </Typography>\n </Td>\n <Td>\n <Typography variant=\"omega\">{batch.createdBy?.email || 'admin'}</Typography>\n </Td>\n <Td>\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n {batch.summary.attribute}: \"{formatDisplayValue(batch.summary.value)}\"\n </Typography>\n <Flex gap={1} alignItems=\"center\" marginTop={1}>\n <Badge\n backgroundColor={batch.summary.publishOnApproval === false ? 'warning100' : 'success100'}\n textColor={batch.summary.publishOnApproval === false ? 'warning700' : 'success700'}\n >\n {batch.summary.publishOnApproval === false ? 'DRAFT ONLY' : 'AUTO-PUBLISH'}\n </Badge>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n • {batch.summary.totalTargets} records across {Object.keys(batch.summary.collectionBreakdown || {}).length} collections\n </Typography>\n </Flex>\n </Td>\n <Td>\n {batch.status === 'pending_approval' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n PENDING CHECKER APPROVAL\n </Badge>\n )}\n {batch.status === 'queued_offpeak' && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n QUEUED OFF-PEAK ({batch.scheduledFor || '18:00'})\n </Badge>\n )}\n {batch.status === 'approved' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n APPROVED\n </Badge>\n )}\n {batch.status === 'rejected' && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n REJECTED\n </Badge>\n )}\n {batch.status === 'executed' && (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral700\">\n EXECUTED\n </Badge>\n )}\n </Td>\n <Td>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n {batch.makerNotes || '—'}\n {batch.approval?.rejectionReason && (\n <span style={{ color: '#d9534f', display: 'block' }}>\n Rejection Reason: {batch.approval.rejectionReason}\n </span>\n )}\n </Typography>\n </Td>\n <Td style={{ textAlign: 'right' }}>\n <Flex gap={2} justifyContent=\"flex-end\">\n {batch.status === 'pending_approval' && (\n <>\n <Button\n size=\"S\"\n variant=\"success-light\"\n onClick={() => handleApproveBatch(batch.id)}\n loading={approvingBatchId === batch.id}\n >\n Approve &amp; Execute\n </Button>\n <Button\n size=\"S\"\n variant=\"danger-light\"\n onClick={() => handleRejectBatch(batch.id)}\n loading={rejectingBatchId === batch.id}\n >\n Reject\n </Button>\n </>\n )}\n {batch.status === 'queued_offpeak' && (\n <Button\n size=\"S\"\n variant=\"default\"\n onClick={() => handleExecuteNow(batch.id)}\n loading={executingNowBatchId === batch.id}\n >\n Run Now\n </Button>\n )}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n )}\n </Box>\n\n {auditNotice && (\n <Alert variant=\"warning\" title=\"Audit Configuration Status\" marginBottom={4}>\n {auditNotice}\n </Alert>\n )}\n\n {auditHistory.length === 0 && !auditLoading && (\n <Box padding={8} background=\"neutral100\" hasRadius style={{ textAlign: 'center' }}>\n <Typography variant=\"beta\" textColor=\"neutral600\">\n No batch operations recorded in the audit trail yet.\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\" marginTop={2}>\n When you execute a bulk update in the editor, its transactional diff will be logged here.\n </Typography>\n </Box>\n )}\n\n {auditHistory.length > 0 && (\n <Box className=\"bulk-updater-table-container\" style={{ width: '100%', maxWidth: '100%', minWidth: 0, overflowX: 'auto' }}>\n <Table colCount={6} rowCount={auditHistory.length + 1} style={{ width: '100%' }}>\n <Thead>\n <Tr>\n <Th style={{ minWidth: 140 }}>\n <Typography variant=\"sigma\">Date &amp; Time</Typography>\n </Th>\n <Th style={{ minWidth: 130 }}>\n <Typography variant=\"sigma\">Performed By</Typography>\n </Th>\n <Th style={{ minWidth: 160 }}>\n <Typography variant=\"sigma\">Attribute &amp; Value</Typography>\n </Th>\n <Th style={{ minWidth: 90 }}>\n <Typography variant=\"sigma\">Impact</Typography>\n </Th>\n <Th style={{ minWidth: 120 }}>\n <Typography variant=\"sigma\">Status</Typography>\n </Th>\n <Th style={{ minWidth: 160, textAlign: 'right' }}>\n <Typography variant=\"sigma\">Actions</Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {auditHistory.map((rec) => {\n const isExpanded = expandedDiffBatchId === rec.batchId;\n const dateStr = new Date(rec.executedAt).toLocaleString();\n\n return (\n <React.Fragment key={rec.batchId}>\n <Tr\n style={{\n backgroundColor: rec.isRolledBack ? 'rgba(255, 255, 255, 0.04)' : undefined,\n opacity: rec.isRolledBack ? 0.85 : 1,\n }}\n >\n <Td style={{ minWidth: 140 }}>\n <Typography fontWeight=\"semiBold\">{dateStr}</Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\" style={{ wordBreak: 'break-all' }}>\n Batch ID: {rec.batchId}\n </Typography>\n </Td>\n <Td style={{ minWidth: 130 }}>\n <Typography fontWeight=\"semiBold\">{rec.userName}</Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\" style={{ wordBreak: 'break-all' }}>\n {rec.userEmail}\n </Typography>\n </Td>\n <Td style={{ minWidth: 160 }}>\n <Typography\n style={{\n display: 'inline-block',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={`${rec.attribute} → \"${formatDisplayValue(rec.value)}\"`}\n >\n <strong>{rec.attribute}</strong> &rarr; &ldquo;{formatDisplayValue(rec.value)}&rdquo;\n </Typography>\n </Td>\n <Td style={{ minWidth: 90, whiteSpace: 'nowrap' }}>\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n {rec.updatedCount} updated\n </Badge>\n {rec.skippedCount > 0 && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\" style={{ marginLeft: 6 }}>\n {rec.skippedCount} skipped\n </Badge>\n )}\n </Td>\n <Td style={{ minWidth: 120 }}>\n {rec.isRolledBack ? (\n <Box>\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral700\">\n ROLLED BACK\n </Badge>\n {rec.rolledBackAt && (\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\" style={{ wordBreak: 'break-word', marginTop: 2 }}>\n {new Date(rec.rolledBackAt).toLocaleTimeString()} by {rec.rolledBackBy || 'Admin'}\n </Typography>\n )}\n </Box>\n ) : (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ACTIVE (APPLIED)\n </Badge>\n )}\n </Td>\n <Td style={{ minWidth: 160, textAlign: 'right', whiteSpace: 'nowrap' }}>\n <Flex gap={2} justifyContent=\"flex-end\">\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() =>\n setExpandedDiffBatchId(isExpanded ? null : rec.batchId)\n }\n >\n {isExpanded ? 'Hide Diffs' : 'View Diffs'}\n </Button>\n {!rec.isRolledBack && (\n <Button\n variant=\"danger\"\n size=\"S\"\n loading={rollingBackBatchId === rec.batchId}\n onClick={() => handleRollback(rec.batchId)}\n >\n Rollback\n </Button>\n )}\n </Flex>\n </Td>\n </Tr>\n\n {/* Expandable Diffs Breakdown */}\n {isExpanded && (\n <Tr>\n <Td colSpan={6} style={{ background: 'rgba(0, 0, 0, 0.06)', padding: 16 }}>\n <Box\n className=\"bulk-updater-table-container\"\n padding={3}\n background=\"neutral0\"\n hasRadius\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderColor=\"neutral200\"\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, overflowX: 'auto' }}\n >\n <Typography variant=\"delta\" fontWeight=\"bold\" marginBottom={2}>\n Detailed Before/After Snapshots for Batch {rec.batchId}:\n </Typography>\n <Table colCount={4} rowCount={rec.diffs.length + 1}>\n <Thead>\n <Tr>\n <Th><Typography variant=\"sigma\">Collection</Typography></Th>\n <Th><Typography variant=\"sigma\">Document / Entry</Typography></Th>\n <Th><Typography variant=\"sigma\">Previous Value</Typography></Th>\n <Th><Typography variant=\"sigma\">Applied Value</Typography></Th>\n </Tr>\n </Thead>\n <Tbody>\n {rec.diffs.map((d, dIdx) => (\n <Tr key={dIdx}>\n <Td><Typography fontWeight=\"semiBold\">{d.collectionName}</Typography></Td>\n <Td><Typography>{d.label}</Typography></Td>\n <Td><Typography textColor=\"danger600\">{formatDisplayValue(d.oldValue)}</Typography></Td>\n <Td><Typography textColor=\"success600\">{formatDisplayValue(d.newValue)}</Typography></Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </Td>\n </Tr>\n )}\n </React.Fragment>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n )}\n </Box>\n )}\n\n {/* Tab 3: Validation & Quota Rules */}\n {activeTab === 'rules' && (\n <ValidationRulesTab />\n )}\n\n {/* Tab 4: CSV Import / Export & Override */}\n {activeTab === 'csv' && (\n <CsvManagerTab />\n )}\n\n {/* Confirmation Modal */}\n {showConfirmModal && (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(20, 20, 30, 0.65)',\n backdropFilter: 'blur(2px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n padding: 16,\n boxSizing: 'border-box',\n overflowY: 'auto',\n }}\n onClick={() => setShowConfirmModal(false)}\n >\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"popupShadow\"\n style={{\n maxWidth: 680,\n width: '100%',\n maxHeight: 'calc(100vh - 48px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative',\n boxShadow: '0 24px 48px rgba(0, 0, 0, 0.32), 0 0 1px rgba(0, 0, 0, 0.2)',\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* Modal Header - Fixed Top */}\n <Box\n padding={5}\n background=\"neutral100\"\n style={{\n borderBottom: '1px solid rgba(120, 120, 150, 0.2)',\n flexShrink: 0,\n }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Confirm Bulk Update\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" display=\"block\">\n Review target attributes, affected counts, and server execution policy before proceeding.\n </Typography>\n </Box>\n </Flex>\n </Box>\n\n {/* Modal Body - Smooth Scrollable Middle */}\n <Box\n padding={5}\n style={{\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n }}\n >\n {/* Target Summary */}\n <Box padding={4} background=\"neutral100\" hasRadius marginBottom={4}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={2} display=\"block\">\n UPDATE DETAILS\n </Typography>\n <Flex direction=\"column\" gap={2}>\n <Flex justifyContent=\"space-between\">\n <Typography fontWeight=\"semiBold\">Target Attribute:</Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n {selectedAttribute}\n </Badge>\n </Flex>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Target Value:</Typography>\n <Typography variant=\"omega\" style={{ wordBreak: 'break-all', maxWidth: 360 }}>\n {relationsMeta[selectedAttribute] ? (\n <span>\n {selectedRelationDocId === '__clear__' ? (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">Clear / Unlink Relation</Badge>\n ) : (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n {relationsMeta[selectedAttribute].isMulti ? `[${relationMode.toUpperCase()}] ` : ''}\n {relationOptions.find((o) => o.documentId === selectedRelationDocId)?.label || selectedRelationDocId || '(none selected)'}\n </Badge>\n )}\n </span>\n ) : useRegex ? (\n <span>\n Replace <code>/{regexPattern}/g</code> with <strong>\"{attributeValue}\"</strong>\n </span>\n ) : (\n <strong>\"{attributeValue || '(empty string)'}\"</strong>\n )}\n </Typography>\n </Flex>\n <Flex justifyContent=\"space-between\">\n <Typography fontWeight=\"semiBold\">Total Selected Records:</Typography>\n <Typography fontWeight=\"bold\" textColor=\"primary600\">\n {totalSelectedCount} records\n </Typography>\n </Flex>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Publishing Mode:</Typography>\n <Badge\n backgroundColor={publishOnApproval ? 'success100' : 'warning100'}\n textColor={publishOnApproval ? 'success700' : 'warning700'}\n >\n {publishOnApproval ? 'Publish Immediately' : 'Keep as Draft'}\n </Badge>\n </Flex>\n </Flex>\n </Box>\n\n {/* Collections Breakdown */}\n <Box marginBottom={4}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={2} display=\"block\">\n COLLECTION BREAKDOWN\n </Typography>\n <Flex direction=\"column\" gap={1}>\n {Object.entries(getSelectedBreakdown()).map(([name, count]) => (\n <Flex\n key={name}\n justifyContent=\"space-between\"\n padding={2}\n background=\"neutral100\"\n hasRadius\n style={{ border: '1px solid rgba(120, 120, 150, 0.15)' }}\n >\n <Typography variant=\"omega\">{name}</Typography>\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral800\">\n {count} {count === 1 ? 'record' : 'records'}\n </Badge>\n </Flex>\n ))}\n </Flex>\n </Box>\n\n {/* Developer Server Execution Window Policy */}\n <Box padding={4} hasRadius marginBottom={4} background={executionWindow?.isBusinessHours ? 'warning100' : 'success100'}>\n <Flex direction=\"column\" gap={1}>\n <Flex gap={2} alignItems=\"center\">\n <Typography fontWeight=\"bold\" textColor={executionWindow?.isBusinessHours ? 'warning700' : 'success700'}>\n {executionWindow?.isBusinessHours ? '⏰ Peak Business Hours Restriction Active' : '✅ Server Off-Peak Window Active'}\n </Typography>\n </Flex>\n <Typography variant=\"pi\" textColor={executionWindow?.isBusinessHours ? 'warning700' : 'success700'}>\n {executionWindow?.policyMessage || (executionWindow?.isBusinessHours\n ? 'Server policy restricts bulk updates during peak business hours (09:00 - 18:00). Direct execution is paused to preserve API throughput.'\n : 'Currently outside peak business hours. Direct execution is permitted.')}\n </Typography>\n </Flex>\n </Box>\n\n {/* Publish Immediately vs Keep as Draft Option */}\n <Box\n padding={4}\n background=\"neutral100\"\n hasRadius\n marginBottom={4}\n style={{ border: '1px solid rgba(120, 120, 150, 0.15)' }}\n >\n <Flex gap={3} alignItems=\"flex-start\">\n <Checkbox\n name=\"publishOnApproval\"\n checked={publishOnApproval}\n onCheckedChange={(checked: boolean) => setPublishOnApproval(Boolean(checked))}\n />\n <Box style={{ cursor: 'pointer' }} onClick={() => setPublishOnApproval(!publishOnApproval)}>\n <Typography fontWeight=\"bold\" display=\"block\">\n Publish immediately upon checker approval / execution\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n When checked (default), content types with Draft &amp; Publish enabled will have their updated documents published immediately upon execution. When unchecked, changes remain in Draft for further editorial review.\n </Typography>\n </Box>\n </Flex>\n </Box>\n\n {/* Notes / Release Ticket (Maker Notes) */}\n <Box marginBottom={2}>\n <TextInput\n label=\"Change Request / Release Notes (Optional)\"\n name=\"makerNotes\"\n placeholder=\"e.g. REL-4021: Updating summer pricing & promo attributes\"\n value={makerNotesInput}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setMakerNotesInput(e.target.value)}\n />\n </Box>\n </Box>\n\n {/* Modal Footer - Fixed Sticky Bottom CTAs */}\n <Box\n padding={4}\n background=\"neutral100\"\n style={{\n borderTop: '1px solid rgba(120, 120, 150, 0.2)',\n flexShrink: 0,\n position: 'sticky',\n bottom: 0,\n zIndex: 20,\n boxShadow: '0 -4px 16px rgba(0, 0, 0, 0.08)',\n }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={3} style={{ width: '100%' }}>\n <Button variant=\"tertiary\" size=\"M\" onClick={() => setShowConfirmModal(false)}>\n Cancel\n </Button>\n <Flex gap={2} wrap=\"wrap\" justifyContent=\"flex-end\" alignItems=\"center\">\n {/* Maker-Checker Button */}\n <Button\n variant={executionWindow?.isBusinessHours ? 'default' : 'secondary'}\n size=\"M\"\n onClick={() => executeBatchWithMode('maker_checker')}\n loading={updating}\n >\n Submit for Checker Approval\n </Button>\n\n {/* Scheduled Off-Peak Queue or Immediate Button */}\n {executionWindow?.isBusinessHours ? (\n <>\n <Button\n variant=\"secondary\"\n size=\"M\"\n onClick={() => executeBatchWithMode('queue_offpeak')}\n loading={updating}\n >\n Queue for Off-Peak ({executionWindow?.offPeakStartTime || '18:00'})\n </Button>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => executeBatchWithMode('immediate', true)}\n loading={updating}\n >\n Force Run Now\n </Button>\n </>\n ) : (\n <Button\n variant=\"default\"\n size=\"M\"\n onClick={() => executeBatchWithMode('immediate')}\n loading={updating}\n >\n Confirm &amp; Execute Now\n </Button>\n )}\n </Flex>\n </Flex>\n </Box>\n </Box>\n </div>\n )}\n </Box>\n );\n};\n\nexport default BulkUpdater;\n"],"names":["React"],"mappings":"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"}