strapi-plugin-bulk-updater 1.2.11 → 1.2.13
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/dist/_chunks/{BulkUpdater-DS6gm_qd.js → BulkUpdater-CWJYmuGU.js} +484 -10
- package/dist/_chunks/BulkUpdater-CWJYmuGU.js.map +1 -0
- package/dist/_chunks/{BulkUpdater-B_COVQmo.mjs → BulkUpdater-Cfig2f7d.mjs} +484 -10
- package/dist/_chunks/BulkUpdater-Cfig2f7d.mjs.map +1 -0
- package/dist/_chunks/{SettingsPage-BRGTrW9H.js → SettingsPage-BAvuOb7V.js} +2 -2
- package/dist/_chunks/{SettingsPage-BRGTrW9H.js.map → SettingsPage-BAvuOb7V.js.map} +1 -1
- package/dist/_chunks/{SettingsPage-ieu-Out8.mjs → SettingsPage-BWo4l6Gd.mjs} +2 -2
- package/dist/_chunks/{SettingsPage-ieu-Out8.mjs.map → SettingsPage-BWo4l6Gd.mjs.map} +1 -1
- package/dist/_chunks/{ValidationRulesTab-BoqhoTjo.js → ValidationRulesTab-BLZWPGrZ.js} +3 -2
- package/dist/_chunks/{ValidationRulesTab-BoqhoTjo.js.map → ValidationRulesTab-BLZWPGrZ.js.map} +1 -1
- package/dist/_chunks/{ValidationRulesTab-BGcqM9cN.mjs → ValidationRulesTab-Dt53h-Ke.mjs} +3 -2
- package/dist/_chunks/{ValidationRulesTab-BGcqM9cN.mjs.map → ValidationRulesTab-Dt53h-Ke.mjs.map} +1 -1
- package/dist/admin/index.js +2 -2
- package/dist/admin/index.mjs +2 -2
- package/dist/server/index.js +670 -81
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +670 -81
- package/dist/server/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/_chunks/BulkUpdater-B_COVQmo.mjs.map +0 -1
- package/dist/_chunks/BulkUpdater-DS6gm_qd.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkUpdater-Cfig2f7d.mjs","sources":["../../admin/src/pages/CsvManagerTab.tsx","../../admin/src/components/ProcessingDashboardModal.tsx","../../admin/src/components/BulkUpdatePreviewModal.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<'auto' | 'update' | 'create_or_override'>('auto');\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 safeContent = content.startsWith('\\uFEFF') ? content : '\\uFEFF' + content;\n const blob = new Blob([safeContent], { 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 const stats = res.data.stats;\n let notifMsg = `CSV Import complete: ${stats.created} created, ${stats.updated} updated.`;\n if (stats.newWithoutDocId && stats.newWithoutDocId > 0) {\n notifMsg += ` (${stats.newWithoutDocId} new entries created due to omitted documentId)`;\n }\n toggleNotification({\n type: 'success',\n message: notifMsg,\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 & 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 & 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 & 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} wrap=\"wrap\">\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name=\"importMode\"\n value=\"auto\"\n checked={importMode === 'auto'}\n onChange={() => setImportMode('auto')}\n />\n <Typography variant=\"omega\" fontWeight={importMode === 'auto' ? 'bold' : 'normal'}>\n Smart Auto-Detect (Auto-updates matching documentId, creates new if missing)\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=\"update\"\n checked={importMode === 'update'}\n onChange={() => setImportMode('update')}\n />\n <Typography variant=\"omega\" fontWeight={importMode === 'update' ? 'bold' : 'normal'}>\n Update Existing Only (Requires 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 const missingDocIdCount = parsedPreview.filter(\n (row) => !(row.documentId || row.id || '').trim()\n ).length;\n const headers = Object.keys(parsedPreview[0]);\n\n return (\n <Box marginTop={4} background=\"neutral0\" padding={4} hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral700\">\n FILE PREVIEW (FIRST {parsedPreview.length} ROWS)\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\">\n {parsedPreview.length} previewed row{parsedPreview.length > 1 ? 's' : ''} •{' '}\n {missingDocIdCount > 0\n ? `${missingDocIdCount} row${missingDocIdCount > 1 ? 's' : ''} missing documentId (will be created as new entries)`\n : 'All previewed rows contain document IDs'}\n </Typography>\n </Box>\n <Badge backgroundColor={missingDocIdCount > 0 ? 'warning100' : 'success100'} textColor={missingDocIdCount > 0 ? 'warning700' : 'success700'}>\n {missingDocIdCount > 0 ? `${missingDocIdCount} New (No ID)` : 'Ready to Import'}\n </Badge>\n </Flex>\n\n {missingDocIdCount > 0 && (\n <Box marginBottom={3}>\n <Alert\n variant={importMode === 'update' ? 'warning' : 'default'}\n title={importMode === 'update' ? 'Warning: Missing Document IDs' : 'Smart Auto-Detect Active'}\n >\n <Typography variant=\"omega\">\n {missingDocIdCount} row{missingDocIdCount > 1 ? 's have' : ' has'} no <code>documentId</code>.{' '}\n {importMode === 'auto'\n ? 'Because no documentId is provided, the engine will automatically treat them as new entries and generate new database IDs for them.'\n : importMode === 'update'\n ? 'In \"Update Existing Only\" mode, rows without a documentId will be skipped. Switch to \"Smart Auto-Detect\" to automatically create them as new entries.'\n : 'These will be created as new entries.'}\n </Typography>\n </Alert>\n </Box>\n )}\n\n <Table colCount={headers.length + 1} rowCount={parsedPreview.length + 1}>\n <Thead>\n <Tr>\n <Th style={{ width: 140 }}>\n <Typography variant=\"sigma\">Detected Action</Typography>\n </Th>\n {headers.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 const hasDocId = !!(row.documentId || row.id || '').trim();\n return (\n <Tr key={rIdx}>\n <Td>\n {hasDocId ? (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 🔄 Match / Update\n </Badge>\n ) : (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ➕ New Entry\n </Badge>\n )}\n </Td>\n {headers.map((h) => (\n <Td key={h}>\n {(h === 'documentId' || h === 'id') && !row[h]?.trim() ? (\n <Typography variant=\"pi\" textColor=\"warning700\" fontWeight=\"bold\">\n (Auto-generate ID)\n </Typography>\n ) : (\n <Typography variant=\"omega\">{row[h] || '-'}</Typography>\n )}\n </Td>\n ))}\n </Tr>\n );\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 === 'auto'\n ? 'Execute Smart Import (Auto-Detect)'\n : importMode === 'update'\n ? 'Execute Bulk Update'\n : 'Execute Add / Override'}\n </Button>\n </Flex>\n </Box>\n );\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 {importResult.stats.newWithoutDocId > 0 && (\n <span> ({importResult.stats.newWithoutDocId} created as new entries because documentId was omitted)</span>\n )}\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.newWithoutDocId > 0 && (\n <Box marginTop={2} padding={2} background=\"neutral100\" hasRadius>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n ℹ️ <strong>Note on new entries:</strong> {importResult.stats.newWithoutDocId} row{importResult.stats.newWithoutDocId > 1 ? 's' : ''} had no <code>documentId</code> specified in the CSV. The engine generated brand-new database entries with assigned document IDs. If you export this collection now, you will see their generated document IDs.\n </Typography>\n </Box>\n )}\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, { useState, useEffect, useMemo } from 'react';\nimport { useFetchClient, useNotification } from '@strapi/strapi/admin';\nimport {\n Box,\n Flex,\n Typography,\n Button,\n Badge,\n Alert,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n TextInput,\n Loader,\n} from '@strapi/design-system';\nimport { Check, Download, ArrowClockwise } from '@strapi/icons';\n\nexport interface BatchResultItem {\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 isLive?: boolean;\n message: string;\n}\n\nexport interface BatchJob {\n id: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n createdBy: { id?: string | number; email?: string; firstname?: string; lastname?: string; username?: string };\n status: 'pending_approval' | 'queued_offpeak' | 'processing' | 'successful' | 'partial_failure' | 'failed';\n executionMode: 'immediate' | 'maker_checker' | 'queue_offpeak';\n scheduledFor?: string;\n attribute: string;\n value: string;\n totalTargets: number;\n processedCount: number;\n updatedCount: number;\n skippedCount: number;\n failedCount: number;\n isLive: boolean;\n publishOnApproval: boolean;\n policyMessage?: string;\n makerNotes?: string;\n results: BatchResultItem[];\n error?: string;\n}\n\ninterface ProcessingDashboardModalProps {\n isOpen: boolean;\n onClose: () => void;\n batchId?: string;\n initialJob?: Partial<BatchJob> | null;\n isSubmitting?: boolean;\n}\n\nfunction formatVal(v: any): string {\n if (v === null || v === undefined) return '(empty)';\n if (typeof v === 'object') {\n if (v.display) return v.display;\n if (v.label) return v.label;\n return JSON.stringify(v);\n }\n return String(v);\n}\n\nfunction downloadFile(content: string, filename: string, mimeType: string = 'text/csv;charset=utf-8;') {\n const isCsv = mimeType.includes('csv') || filename.endsWith('.csv');\n const safeContent = isCsv && !content.startsWith('\\uFEFF') ? '\\uFEFF' + content : content;\n const blob = new Blob([safeContent], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\nexport default function ProcessingDashboardModal({\n isOpen,\n onClose,\n batchId,\n initialJob,\n isSubmitting = false,\n}: ProcessingDashboardModalProps) {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n const [job, setJob] = useState<BatchJob | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [filterStatus, setFilterStatus] = useState<'all' | 'updated' | 'skipped' | 'error'>('all');\n const [searchQuery, setSearchQuery] = useState<string>('');\n const [downloading, setDownloading] = useState<boolean>(false);\n const [copiedBatchId, setCopiedBatchId] = useState<boolean>(false);\n\n // Sync initialJob if passed directly from submission\n useEffect(() => {\n if (initialJob && initialJob.id) {\n setJob((prev) => ({\n id: initialJob.id!,\n createdAt: initialJob.createdAt || new Date().toISOString(),\n startedAt: initialJob.startedAt,\n completedAt: initialJob.completedAt,\n createdBy: initialJob.createdBy || { email: 'admin@system.local' },\n status: initialJob.status || (isSubmitting ? 'processing' : 'successful'),\n executionMode: initialJob.executionMode || 'immediate',\n scheduledFor: initialJob.scheduledFor,\n attribute: initialJob.attribute || '',\n value: initialJob.value || '',\n totalTargets: initialJob.totalTargets || 0,\n processedCount: initialJob.processedCount || 0,\n updatedCount: initialJob.updatedCount || 0,\n skippedCount: initialJob.skippedCount || 0,\n failedCount: initialJob.failedCount || 0,\n isLive: Boolean(initialJob.isLive),\n publishOnApproval: initialJob.publishOnApproval ?? true,\n policyMessage: initialJob.policyMessage,\n makerNotes: initialJob.makerNotes,\n results: initialJob.results || [],\n error: initialJob.error,\n }));\n }\n }, [initialJob, isSubmitting]);\n\n // Fetch status if batchId is provided\n const fetchStatus = async () => {\n const targetId = batchId || initialJob?.id;\n if (!targetId) return;\n\n try {\n setLoading(true);\n const res = await get(`/bulk-updater/batches/${targetId}/status`);\n if (res.data?.success && res.data.batch) {\n setJob(res.data.batch);\n }\n } catch (err: any) {\n // If still in-flight or not saved yet, don't crash\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (isOpen && (batchId || initialJob?.id)) {\n fetchStatus();\n // Poll every 2 seconds if processing or submitting\n if (isSubmitting || job?.status === 'processing') {\n const interval = setInterval(fetchStatus, 2000);\n return () => clearInterval(interval);\n }\n }\n }, [isOpen, batchId, initialJob?.id, isSubmitting, job?.status]);\n\n const handleCopyId = () => {\n const idToCopy = job?.id || batchId;\n if (idToCopy) {\n navigator.clipboard.writeText(idToCopy);\n setCopiedBatchId(true);\n setTimeout(() => setCopiedBatchId(false), 2000);\n }\n };\n\n const handleDownloadReport = async (format: 'csv' | 'json' = 'csv') => {\n const targetId = job?.id || batchId;\n if (!targetId) return;\n\n try {\n setDownloading(true);\n const res = await get(`/bulk-updater/batches/${targetId}/report?format=${format}`);\n if (res.data?.success) {\n if (format === 'csv' && res.data.csvContent) {\n downloadFile(res.data.csvContent, res.data.filename);\n } else if (format === 'json') {\n const jsonStr = JSON.stringify(res.data.batch || job, null, 2);\n downloadFile(jsonStr, `bulk_update_report_${targetId}.json`, 'application/json');\n }\n toggleNotification({\n type: 'success',\n message: `Execution report downloaded (${format.toUpperCase()})`,\n });\n } else {\n throw new Error(res.data?.error || 'Failed generating report');\n }\n } catch (err: any) {\n // Fallback: Client-side generation from job.results\n if (job && job.results) {\n const csvRows = [\n 'Batch ID,Collection Name,Document ID,Record Label,Attribute,Old Value,New Value,Status,Live On Site,Message',\n ...job.results.map((r) =>\n [\n job.id,\n `\"${r.collectionName}\"`,\n r.documentId,\n `\"${r.label.replace(/\"/g, '\"\"')}\"`,\n `\"${r.attribute}\"`,\n `\"${formatVal(r.oldValue).replace(/\"/g, '\"\"')}\"`,\n `\"${formatVal(r.newValue).replace(/\"/g, '\"\"')}\"`,\n r.status,\n r.isLive ? 'YES' : 'NO',\n `\"${r.message.replace(/\"/g, '\"\"')}\"`,\n ].join(',')\n ),\n ];\n downloadFile(csvRows.join('\\r\\n') + '\\r\\n', `bulk_update_report_${targetId}.csv`);\n toggleNotification({\n type: 'success',\n message: 'Execution report downloaded successfully',\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Error downloading execution report',\n });\n }\n } finally {\n setDownloading(false);\n }\n };\n\n const filteredResults = useMemo(() => {\n if (!job?.results) return [];\n return job.results.filter((item) => {\n if (filterStatus !== 'all' && item.status !== filterStatus) return false;\n if (searchQuery.trim() !== '') {\n const q = searchQuery.toLowerCase();\n const matchesCol = item.collectionName?.toLowerCase().includes(q);\n const matchesLabel = item.label?.toLowerCase().includes(q);\n const matchesId = item.documentId?.toLowerCase().includes(q);\n const matchesMsg = item.message?.toLowerCase().includes(q);\n if (!matchesCol && !matchesLabel && !matchesId && !matchesMsg) return false;\n }\n return true;\n });\n }, [job?.results, filterStatus, searchQuery]);\n\n if (!isOpen) return null;\n\n const currentStatus = isSubmitting ? 'processing' : job?.status || 'processing';\n const progressPercent =\n job && job.totalTargets > 0\n ? Math.min(Math.round(((job.updatedCount + job.skippedCount + job.failedCount) / job.totalTargets) * 100), 100)\n : isSubmitting\n ? 50\n : 100;\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(20, 20, 30, 0.75)',\n backdropFilter: 'blur(3px)',\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={onClose}\n >\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"popupShadow\"\n style={{\n maxWidth: 960,\n width: '100%',\n maxHeight: 'calc(100vh - 40px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative',\n boxShadow: '0 24px 48px rgba(0, 0, 0, 0.35)',\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* Header */}\n <Box\n padding={5}\n background=\"neutral100\"\n style={{ borderBottom: '1px solid #dcdce4', flexShrink: 0 }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box>\n <Flex alignItems=\"center\" gap={3}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Bulk Update Processing Dashboard\n </Typography>\n {currentStatus === 'processing' && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 🔄 PROCESSING\n </Badge>\n )}\n {currentStatus === 'successful' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n 🟢 CHANGES LIVE ({job?.updatedCount} UPDATED)\n </Badge>\n )}\n {currentStatus === 'partial_failure' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ⚠️ PARTIAL ({job?.updatedCount} LIVE, {job?.failedCount} FAILED)\n </Badge>\n )}\n {currentStatus === 'failed' && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n 🔴 FAILED\n </Badge>\n )}\n {currentStatus === 'pending_approval' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ⏳ PENDING CHECKER APPROVAL\n </Badge>\n )}\n {currentStatus === 'queued_offpeak' && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n 🕒 QUEUED FOR OFF-PEAK\n </Badge>\n )}\n </Flex>\n <Flex alignItems=\"center\" gap={2} marginTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Batch ID: <code style={{ fontWeight: 'bold' }}>{job?.id || batchId || 'Generating...'}</code>\n </Typography>\n <button\n type=\"button\"\n onClick={handleCopyId}\n style={{\n background: 'none',\n border: 'none',\n padding: '0 4px',\n cursor: 'pointer',\n fontSize: 12,\n color: '#4945ff',\n }}\n >\n {copiedBatchId ? '✓ Copied' : 'Copy ID'}\n </button>\n {job?.createdAt && (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n • Submitted at {new Date(job.createdAt).toLocaleTimeString()}\n </Typography>\n )}\n {job?.createdBy?.email && (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n • Operator: {job.createdBy.email}\n </Typography>\n )}\n </Flex>\n </Box>\n <Flex gap={2}>\n <Button variant=\"tertiary\" size=\"S\" startIcon={<ArrowClockwise />} onClick={fetchStatus} loading={loading}>\n Refresh\n </Button>\n <Button variant=\"secondary\" size=\"S\" onClick={onClose}>\n Close\n </Button>\n </Flex>\n </Flex>\n </Box>\n\n {/* Scrollable Body */}\n <Box padding={5} style={{ flex: '1 1 auto', overflowY: 'auto' }}>\n {/* Real-Time Stepper & Processing Bar */}\n <Box marginBottom={5} padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={2}>\n <Typography variant=\"sigma\" textColor=\"neutral700\">\n PROCESSING PIPELINE & VERIFICATION\n </Typography>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor={currentStatus === 'successful' ? 'success700' : 'primary700'}>\n {currentStatus === 'processing'\n ? `In Progress... (${progressPercent}%)`\n : currentStatus === 'successful'\n ? '100% Completed (Live on Server)'\n : currentStatus === 'pending_approval'\n ? 'Awaiting Checker Decision'\n : currentStatus === 'queued_offpeak'\n ? 'Scheduled for Off-Peak'\n : 'Completed'}\n </Typography>\n </Flex>\n\n {/* Progress Bar */}\n <div\n style={{\n width: '100%',\n height: 8,\n backgroundColor: '#dcdce4',\n borderRadius: 4,\n overflow: 'hidden',\n marginBottom: 16,\n }}\n >\n <div\n style={{\n height: '100%',\n width: `${progressPercent}%`,\n backgroundColor:\n currentStatus === 'failed'\n ? '#d02b20'\n : currentStatus === 'successful'\n ? '#2f6846'\n : '#4945ff',\n transition: 'width 0.4s ease',\n }}\n />\n </div>\n\n {/* Visual Stepper */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={2}>\n {/* Step 1 */}\n <Flex alignItems=\"center\" gap={2}>\n <div\n style={{\n width: 22,\n height: 22,\n borderRadius: '50%',\n backgroundColor: '#2f6846',\n color: '#fff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n fontWeight: 'bold',\n }}\n >\n ✓\n </div>\n <Typography variant=\"pi\" fontWeight=\"bold\">\n 1. Target Batch Queued\n </Typography>\n </Flex>\n\n {/* Step 2 */}\n <Flex alignItems=\"center\" gap={2}>\n <div\n style={{\n width: 22,\n height: 22,\n borderRadius: '50%',\n backgroundColor: currentStatus === 'failed' && !job?.updatedCount ? '#d02b20' : '#2f6846',\n color: '#fff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n fontWeight: 'bold',\n }}\n >\n ✓\n </div>\n <Typography variant=\"pi\" fontWeight=\"bold\">\n 2. Schema & Quotas Validated\n </Typography>\n </Flex>\n\n {/* Step 3 */}\n <Flex alignItems=\"center\" gap={2}>\n <div\n style={{\n width: 22,\n height: 22,\n borderRadius: '50%',\n backgroundColor:\n currentStatus === 'processing'\n ? '#4945ff'\n : currentStatus === 'failed' && !job?.updatedCount\n ? '#dcdce4'\n : '#2f6846',\n color: '#fff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n fontWeight: 'bold',\n }}\n >\n {currentStatus === 'processing' ? '•' : '✓'}\n </div>\n <Typography variant=\"pi\" fontWeight=\"bold\">\n 3. Applied to Database\n </Typography>\n </Flex>\n\n {/* Step 4 */}\n <Flex alignItems=\"center\" gap={2}>\n <div\n style={{\n width: 22,\n height: 22,\n borderRadius: '50%',\n backgroundColor:\n currentStatus === 'successful'\n ? '#2f6846'\n : currentStatus === 'pending_approval'\n ? '#f5c000'\n : currentStatus === 'queued_offpeak'\n ? '#666687'\n : currentStatus === 'processing'\n ? '#dcdce4'\n : '#d02b20',\n color: '#fff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n fontWeight: 'bold',\n }}\n >\n {currentStatus === 'successful' ? '✓' : currentStatus === 'pending_approval' ? '⏳' : '•'}\n </div>\n <Typography variant=\"pi\" fontWeight=\"bold\">\n 4. Live Verification & Audit\n </Typography>\n </Flex>\n </Flex>\n </Box>\n\n {/* Live Status Banner (\"Did changes go live?\") */}\n <Box marginBottom={5}>\n {currentStatus === 'processing' && (\n <Alert variant=\"default\" title=\"Bulk Update In Progress\">\n <Flex alignItems=\"center\" gap={3}>\n <Loader small />\n <Typography variant=\"omega\">\n The engine is updating records across selected collections. Do not refresh or navigate away.\n </Typography>\n </Flex>\n </Alert>\n )}\n\n {currentStatus === 'successful' && (\n <Alert variant=\"success\" title=\"🟢 CHANGES ARE CURRENTLY LIVE ON SERVER\">\n <Typography variant=\"omega\" display=\"block\">\n All <strong>{job?.updatedCount || 0}</strong> matching records were successfully updated in the database\n {job?.publishOnApproval ? ' and auto-published' : ''}.\n Your changes are now live and accessible in Strapi Content Manager and public APIs.\n </Typography>\n </Alert>\n )}\n\n {currentStatus === 'partial_failure' && (\n <Alert variant=\"warning\" title=\"⚠️ PARTIAL EXECUTION (SOME RECORDS ENCOUNTERED ERRORS)\">\n <Typography variant=\"omega\" display=\"block\">\n <strong>{job?.updatedCount || 0}</strong> records were updated and are currently live, but{' '}\n <strong>{job?.failedCount || 0}</strong> records failed. Inspect the itemized table below for exact error details.\n </Typography>\n </Alert>\n )}\n\n {currentStatus === 'failed' && (\n <Alert variant=\"danger\" title=\"🔴 EXECUTION FAILED (CHANGES NOT APPLIED)\">\n <Typography variant=\"omega\" display=\"block\">\n The bulk update failed: {job?.error || 'One or more database mutations failed. No records were published.'}\n </Typography>\n </Alert>\n )}\n\n {currentStatus === 'pending_approval' && (\n <Alert variant=\"warning\" title=\"⏳ PENDING CHECKER APPROVAL (CHANGES NOT LIVE YET)\">\n <Typography variant=\"omega\" display=\"block\">\n This batch was submitted under the <strong>4-Eyes Maker-Checker Policy</strong>.\n Changes will <strong>not</strong> go live until a Checker reviews and approves this batch in the{' '}\n <strong>Audit Trail & Approvals</strong> tab.\n </Typography>\n </Alert>\n )}\n\n {currentStatus === 'queued_offpeak' && (\n <Alert variant=\"default\" title={`🕒 SCHEDULED FOR OFF-PEAK WINDOW (${job?.scheduledFor || '18:00'})`}>\n <Typography variant=\"omega\" display=\"block\">\n This batch was scheduled to avoid peak database load during business hours.\n The scheduled background worker will automatically execute and publish these changes at{' '}\n <strong>{job?.scheduledFor || 'off-peak'}</strong>.\n </Typography>\n </Alert>\n )}\n </Box>\n\n {/* Metric Cards Grid */}\n <Box marginBottom={5}>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: 16,\n }}\n >\n {/* Card 1: Total Targets */}\n <Box padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" display=\"block\">\n TOTAL TARGETS\n </Typography>\n <Typography variant=\"alpha\" fontWeight=\"bold\" textColor=\"neutral800\" marginTop={1} display=\"block\">\n {job?.totalTargets || 0}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Targeted entities\n </Typography>\n </Box>\n\n {/* Card 2: Live / Updated */}\n <Box padding={4} background=\"success100\" hasRadius style={{ border: '1px solid #b7eb8f' }}>\n <Typography variant=\"sigma\" textColor=\"success700\" display=\"block\">\n LIVE / UPDATED\n </Typography>\n <Typography variant=\"alpha\" fontWeight=\"bold\" textColor=\"success700\" marginTop={1} display=\"block\">\n {job?.updatedCount || 0}\n </Typography>\n <Typography variant=\"pi\" textColor=\"success700\">\n {job?.isLive ? '✓ Active on site' : 'Pending live'}\n </Typography>\n </Box>\n\n {/* Card 3: Skipped */}\n <Box padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" display=\"block\">\n SKIPPED\n </Typography>\n <Typography variant=\"alpha\" fontWeight=\"bold\" textColor=\"neutral800\" marginTop={1} display=\"block\">\n {job?.skippedCount || 0}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Attribute not in schema\n </Typography>\n </Box>\n\n {/* Card 4: Failed */}\n <Box\n padding={4}\n background={(job?.failedCount || 0) > 0 ? 'danger100' : 'neutral100'}\n hasRadius\n style={{ border: (job?.failedCount || 0) > 0 ? '1px solid #ffa39e' : '1px solid #eaeaef' }}\n >\n <Typography variant=\"sigma\" textColor={(job?.failedCount || 0) > 0 ? 'danger700' : 'neutral600'} display=\"block\">\n FAILED / ERRORS\n </Typography>\n <Typography\n variant=\"alpha\"\n fontWeight=\"bold\"\n textColor={(job?.failedCount || 0) > 0 ? 'danger700' : 'neutral800'}\n marginTop={1}\n display=\"block\"\n >\n {job?.failedCount || 0}\n </Typography>\n <Typography variant=\"pi\" textColor={(job?.failedCount || 0) > 0 ? 'danger700' : 'neutral500'}>\n {(job?.failedCount || 0) > 0 ? 'Requires attention' : '0 errors'}\n </Typography>\n </Box>\n </div>\n </Box>\n\n {/* Action Bar with Download Report Button */}\n <Box marginBottom={4} padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\n <Box>\n <Typography variant=\"delta\" fontWeight=\"bold\" display=\"block\">\n Execution Report & Verification Audit\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Download an itemized verification report showing every record's old value, new value, and live deployment status.\n </Typography>\n </Box>\n <Flex gap={2}>\n <Button\n variant=\"default\"\n startIcon={<Download />}\n onClick={() => handleDownloadReport('csv')}\n loading={downloading}\n >\n Download Execution Report (.csv)\n </Button>\n <Button\n variant=\"secondary\"\n startIcon={<Download />}\n onClick={() => handleDownloadReport('json')}\n loading={downloading}\n >\n JSON Report\n </Button>\n </Flex>\n </Flex>\n </Box>\n\n {/* Itemized Results Breakdown */}\n {job && job.results && job.results.length > 0 && (\n <Box>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3} wrap=\"wrap\" gap={2}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Itemized Changes ({filteredResults.length} / {job.results.length})\n </Typography>\n <Flex gap={2}>\n <Button\n variant={filterStatus === 'all' ? 'secondary' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterStatus('all')}\n >\n All ({job.results.length})\n </Button>\n <Button\n variant={filterStatus === 'updated' ? 'secondary' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterStatus('updated')}\n >\n Live / Updated ({job.updatedCount})\n </Button>\n <Button\n variant={filterStatus === 'skipped' ? 'secondary' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterStatus('skipped')}\n >\n Skipped ({job.skippedCount})\n </Button>\n {job.failedCount > 0 && (\n <Button\n variant={filterStatus === 'error' ? 'secondary' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterStatus('error')}\n >\n Failed ({job.failedCount})\n </Button>\n )}\n </Flex>\n </Flex>\n\n <Box marginBottom={3}>\n <TextInput\n placeholder=\"Filter by collection name, title, or document ID...\"\n value={searchQuery}\n onChange={(e: any) => setSearchQuery(e.target.value)}\n size=\"S\"\n />\n </Box>\n\n <Table colCount={6} rowCount={filteredResults.length + 1}>\n <Thead>\n <Tr>\n <Th style={{ width: 140 }}>\n <Typography variant=\"sigma\">Status</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Collection</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Record / Document ID</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Previous Value</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">New Live Value</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Details</Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {filteredResults.map((item, idx) => (\n <Tr key={idx}>\n <Td>\n {item.status === 'updated' ? (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n 🟢 Live / Updated\n </Badge>\n ) : item.status === 'error' ? (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n ❌ Failed\n </Badge>\n ) : (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\">\n ⚠️ Skipped\n </Badge>\n )}\n </Td>\n <Td>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {item.collectionName}\n </Typography>\n </Td>\n <Td>\n <Box>\n <Typography variant=\"omega\" display=\"block\">\n {item.label}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n <code>{item.documentId}</code>\n </Typography>\n </Box>\n </Td>\n <Td>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {formatVal(item.oldValue)}\n </Typography>\n </Td>\n <Td>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"primary700\">\n {formatVal(item.newValue)}\n </Typography>\n </Td>\n <Td>\n <Typography variant=\"pi\" textColor={item.status === 'error' ? 'danger700' : 'neutral600'}>\n {item.message}\n </Typography>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n )}\n </Box>\n\n {/* Footer */}\n <Box padding={4} background=\"neutral100\" style={{ borderTop: '1px solid #dcdce4', flexShrink: 0 }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {job?.completedAt\n ? `Finished at ${new Date(job.completedAt).toLocaleTimeString()}`\n : isSubmitting\n ? 'Processing live batch...'\n : 'Status active'}\n </Typography>\n <Flex gap={3}>\n <Button\n variant=\"default\"\n size=\"M\"\n startIcon={<Download />}\n onClick={() => handleDownloadReport('csv')}\n loading={downloading}\n >\n Download Report (.csv)\n </Button>\n <Button variant=\"secondary\" size=\"M\" onClick={onClose}>\n Done\n </Button>\n </Flex>\n </Flex>\n </Box>\n </Box>\n </div>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport {\n Box,\n Flex,\n Typography,\n Button,\n TextInput,\n Badge,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Loader,\n} from '@strapi/design-system';\nimport { Check, ArrowRight } from '@strapi/icons';\n\nexport interface PreviewDiffItem {\n uid: string;\n collectionName: string;\n documentId: string;\n label: string;\n attribute: string;\n oldValue: any;\n newValue: any;\n oldDisplay: string;\n newDisplay: string;\n hasChange: boolean;\n status: 'will_update' | 'unchanged' | 'will_skip';\n message: string;\n}\n\nexport interface PreviewSummary {\n total: number;\n willUpdate: number;\n unchanged: number;\n skipped: number;\n}\n\ninterface BulkUpdatePreviewModalProps {\n isOpen: boolean;\n onClose: () => void;\n onProceed: () => void;\n loading: boolean;\n previewData: {\n summary: PreviewSummary;\n diffs: PreviewDiffItem[];\n } | null;\n attribute: string;\n targetValueDisplay: string;\n publishOnApproval?: boolean;\n}\n\nconst BulkUpdatePreviewModal: React.FC<BulkUpdatePreviewModalProps> = ({\n isOpen,\n onClose,\n onProceed,\n loading,\n previewData,\n attribute,\n targetValueDisplay,\n publishOnApproval = true,\n}) => {\n const [filterTab, setFilterTab] = useState<'all' | 'will_update' | 'unchanged' | 'will_skip'>('all');\n const [searchQuery, setSearchQuery] = useState<string>('');\n\n const filteredDiffs = useMemo(() => {\n if (!previewData || !previewData.diffs) return [];\n let items = previewData.diffs;\n\n if (filterTab !== 'all') {\n items = items.filter((d) => d.status === filterTab);\n }\n\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase().trim();\n items = items.filter(\n (d) =>\n d.label.toLowerCase().includes(q) ||\n d.documentId.toLowerCase().includes(q) ||\n d.collectionName.toLowerCase().includes(q) ||\n String(d.oldDisplay || '').toLowerCase().includes(q) ||\n String(d.newDisplay || '').toLowerCase().includes(q)\n );\n }\n\n return items;\n }, [previewData, filterTab, searchQuery]);\n\n if (!isOpen) return null;\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(20, 20, 30, 0.7)',\n backdropFilter: 'blur(3px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n padding: 16,\n boxSizing: 'border-box',\n }}\n onClick={onClose}\n >\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"popupShadow\"\n style={{\n maxWidth: 1040,\n width: '95%',\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.35), 0 0 1px rgba(0, 0, 0, 0.2)',\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* Modal Header */}\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\" wrap=\"wrap\" gap={3}>\n <Box>\n <Flex gap={2} alignItems=\"center\" marginBottom={1}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Pre-Update Change Preview\n </Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n Target: {attribute}\n </Badge>\n </Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Inspect exact before & after values across target records before applying changes to the database.\n </Typography>\n </Box>\n\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n New Value:\n </Typography>\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n {targetValueDisplay || '(empty)'}\n </Badge>\n <Badge\n backgroundColor={publishOnApproval !== false ? 'success100' : 'warning100'}\n textColor={publishOnApproval !== false ? 'success700' : 'warning700'}\n >\n {publishOnApproval !== false ? '✓ LIVE PUBLISH' : 'DRAFT ONLY'}\n </Badge>\n </Flex>\n </Flex>\n </Box>\n\n {/* Modal Body */}\n <Box\n padding={5}\n style={{\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n }}\n >\n {loading ? (\n <Box padding={8} style={{ textAlign: 'center' }}>\n <Flex direction=\"column\" alignItems=\"center\" gap={3}>\n <Loader>Inspecting target records from database...</Loader>\n <Typography variant=\"delta\" fontWeight=\"semiBold\">\n Inspecting Target Records...\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Computing proposed diffs and verifying against database schema.\n </Typography>\n </Flex>\n </Box>\n ) : !previewData ? (\n <Box padding={6} style={{ textAlign: 'center' }}>\n <Typography textColor=\"neutral600\">No preview data available.</Typography>\n </Box>\n ) : (\n <>\n {/* 4 Summary KPI Cards */}\n <Flex gap={3} marginBottom={4} wrap=\"wrap\">\n <Box\n padding={3}\n background=\"neutral100\"\n hasRadius\n style={{ flex: 1, minWidth: 140, border: '1px solid rgba(120, 120, 150, 0.15)' }}\n >\n <Typography variant=\"sigma\" textColor=\"neutral600\" display=\"block\">\n TOTAL TARGETS\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"neutral800\">\n {previewData.summary.total}\n </Typography>\n </Box>\n\n <Box\n padding={3}\n background=\"success100\"\n hasRadius\n style={{ flex: 1, minWidth: 140, border: '1px solid #b7eb8f' }}\n >\n <Typography variant=\"sigma\" textColor=\"success700\" display=\"block\">\n WILL UPDATE\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"success700\">\n {previewData.summary.willUpdate}\n </Typography>\n </Box>\n\n <Box\n padding={3}\n background=\"neutral100\"\n hasRadius\n style={{ flex: 1, minWidth: 140, border: '1px solid rgba(120, 120, 150, 0.15)' }}\n >\n <Typography variant=\"sigma\" textColor=\"neutral600\" display=\"block\">\n ALREADY UP-TO-DATE\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"neutral600\">\n {previewData.summary.unchanged}\n </Typography>\n </Box>\n\n <Box\n padding={3}\n background={previewData.summary.skipped > 0 ? 'warning100' : 'neutral100'}\n hasRadius\n style={{ flex: 1, minWidth: 140, border: '1px solid rgba(120, 120, 150, 0.15)' }}\n >\n <Typography\n variant=\"sigma\"\n textColor={previewData.summary.skipped > 0 ? 'warning700' : 'neutral600'}\n display=\"block\"\n >\n WILL SKIP (NO FIELD)\n </Typography>\n <Typography\n variant=\"beta\"\n fontWeight=\"bold\"\n textColor={previewData.summary.skipped > 0 ? 'warning700' : 'neutral600'}\n >\n {previewData.summary.skipped}\n </Typography>\n </Box>\n </Flex>\n\n {/* Filter Tabs & Search Bar */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3} wrap=\"wrap\" gap={3}>\n <Flex gap={2} wrap=\"wrap\">\n <Button\n variant={filterTab === 'all' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('all')}\n >\n All ({previewData.summary.total})\n </Button>\n <Button\n variant={filterTab === 'will_update' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('will_update')}\n >\n Will Update ({previewData.summary.willUpdate})\n </Button>\n <Button\n variant={filterTab === 'unchanged' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('unchanged')}\n >\n Unchanged ({previewData.summary.unchanged})\n </Button>\n {previewData.summary.skipped > 0 && (\n <Button\n variant={filterTab === 'will_skip' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('will_skip')}\n >\n Skipped ({previewData.summary.skipped})\n </Button>\n )}\n </Flex>\n\n <Box style={{ width: 260 }}>\n <TextInput\n placeholder=\"Search records or values...\"\n size=\"S\"\n value={searchQuery}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchQuery(e.target.value)}\n />\n </Box>\n </Flex>\n\n {/* Diffs Table */}\n <Box\n hasRadius\n style={{\n border: '1px solid #eaeaef',\n maxHeight: 380,\n overflowY: 'auto',\n overflowX: 'auto',\n }}\n >\n <Table colCount={5} rowCount={filteredDiffs.length + 1} style={{ width: '100%', minWidth: 780 }}>\n <Thead>\n <Tr>\n <Th style={{ width: 150 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n COLLECTION\n </Typography>\n </Th>\n <Th style={{ minWidth: 200 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n RECORD IDENTIFIER\n </Typography>\n </Th>\n <Th style={{ minWidth: 180 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n CURRENT VALUE (BEFORE)\n </Typography>\n </Th>\n <Th style={{ minWidth: 180 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n NEW VALUE (AFTER)\n </Typography>\n </Th>\n <Th style={{ width: 140, textAlign: 'right' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n IMPACT\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {filteredDiffs.length === 0 ? (\n <Tr>\n <Td colSpan={5} style={{ textAlign: 'center', padding: '24px' }}>\n <Typography textColor=\"neutral600\">\n No records match the current filter or search criteria.\n </Typography>\n </Td>\n </Tr>\n ) : (\n filteredDiffs.map((diff) => (\n <Tr key={`${diff.uid}-${diff.documentId}`}>\n <Td>\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\">\n {diff.collectionName}\n </Badge>\n </Td>\n <Td>\n <Box>\n <Typography fontWeight=\"bold\" display=\"block\">\n {diff.label}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n <code>{diff.documentId}</code>\n </Typography>\n </Box>\n </Td>\n <Td>\n <Typography\n variant=\"omega\"\n style={{\n color: diff.hasChange ? '#666687' : '#272635',\n textDecoration: diff.hasChange ? 'line-through' : 'none',\n wordBreak: 'break-all',\n }}\n >\n {diff.oldDisplay || '(empty)'}\n </Typography>\n </Td>\n <Td>\n {diff.status === 'will_skip' ? (\n <Typography variant=\"pi\" textColor=\"warning700\">\n — Skipped (field absent) —\n </Typography>\n ) : diff.hasChange ? (\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"success700\" style={{ wordBreak: 'break-all' }}>\n {diff.newDisplay || '(empty)'}\n </Typography>\n ) : (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {diff.newDisplay || '(already matching)'}\n </Typography>\n )}\n </Td>\n <Td style={{ textAlign: 'right' }}>\n {diff.status === 'will_update' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ Will Update\n </Badge>\n )}\n {diff.status === 'unchanged' && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n = Unchanged\n </Badge>\n )}\n {diff.status === 'will_skip' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ⚠ Will Skip\n </Badge>\n )}\n </Td>\n </Tr>\n ))\n )}\n </Tbody>\n </Table>\n </Box>\n </>\n )}\n </Box>\n\n {/* Modal Footer */}\n <Box\n padding={4}\n background=\"neutral100\"\n style={{\n borderTop: '1px solid rgba(120, 120, 150, 0.2)',\n flexShrink: 0,\n }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Button variant=\"tertiary\" size=\"M\" onClick={onClose}>\n Close Preview\n </Button>\n\n <Button\n variant=\"default\"\n size=\"M\"\n startIcon={<Check />}\n onClick={() => {\n onClose();\n onProceed();\n }}\n disabled={loading || !previewData || previewData.summary.total === 0}\n >\n Proceed to Execute ({previewData?.summary.willUpdate || 0} updates)\n </Button>\n </Flex>\n </Box>\n </Box>\n </div>\n );\n};\n\nexport default BulkUpdatePreviewModal;\n","import React, { useEffect, useState, useRef, useMemo } 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 Combobox,\n ComboboxOption,\n Field,\n Loader,\n} from '@strapi/design-system';\nimport { Play, ArrowClockwise, Check, Download, Eye } from '@strapi/icons';\nimport ValidationRulesTab from './ValidationRulesTab';\nimport CsvManagerTab from './CsvManagerTab';\nimport ProcessingDashboardModal from '../components/ProcessingDashboardModal';\nimport BulkUpdatePreviewModal from '../components/BulkUpdatePreviewModal';\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 draftAndPublish?: 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 // Processing Dashboard & Status Tracking State\n const [showProcessingDashboard, setShowProcessingDashboard] = useState<boolean>(false);\n const [dashboardBatchId, setDashboardBatchId] = useState<string>('');\n const [dashboardJob, setDashboardJob] = useState<any>(null);\n const [isSubmittingBatch, setIsSubmittingBatch] = useState<boolean>(false);\n\n // Preview Modal State\n const [showPreviewModal, setShowPreviewModal] = useState<boolean>(false);\n const [previewLoading, setPreviewLoading] = useState<boolean>(false);\n const [previewData, setPreviewData] = useState<any>(null);\n\n // Bulk Publish Modal State\n const [showPublishConfirmModal, setShowPublishConfirmModal] = useState<boolean>(false);\n const [publishing, setPublishing] = useState<boolean>(false);\n const [publishMakerNotesInput, setPublishMakerNotesInput] = useState<string>('');\n const [bulkExporting, setBulkExporting] = useState<boolean>(false);\n\n // Managed Cache Keys\n const MODELS_CACHE_KEY = 'strapi_bulk_updater_models_cache';\n const LAST_ATTR_KEY = 'strapi_bulk_updater_last_attr';\n\n // Selected state\n const getInitialAttribute = (): string => {\n try {\n const stored = localStorage.getItem(LAST_ATTR_KEY);\n if (stored) return stored;\n } catch {}\n return 'metaDescription';\n };\n const [selectedAttribute, setSelectedAttribute] = useState<string>(getInitialAttribute);\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 & search\n const [visibleTypeUids, setVisibleTypeUids] = useState<Record<string, boolean>>({});\n const [typeVisibilitySearch, setTypeVisibilitySearch] = useState<string>('');\n\n // Attribute Info breakdown state\n const [attributeInfoExpanded, setAttributeInfoExpanded] = useState<boolean>(false);\n const [attributeInfoSearch, setAttributeInfoSearch] = useState<string>('');\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 applyModelsData = (data: any) => {\n if (!data) return;\n const attrs: string[] = data.attributes || [];\n setAttributes(attrs);\n const cols: CollectionModel[] = data.collections || [];\n setCollections(cols);\n setAuditEnabled(Boolean(data.auditEnabled));\n if (data.executionWindow) {\n setExecutionWindow(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 (data.relationsMeta) {\n setRelationsMeta(data.relationsMeta);\n }\n\n let storedAttr: string | null = null;\n try {\n storedAttr = localStorage.getItem(LAST_ATTR_KEY);\n } catch {}\n\n const resolvedAttr =\n storedAttr && attrs.includes(storedAttr)\n ? storedAttr\n : (selectedAttribute && attrs.includes(selectedAttribute) ? selectedAttribute : '');\n\n setSelectedAttribute(resolvedAttr);\n if (resolvedAttr && data.relationsMeta && data.relationsMeta[resolvedAttr]) {\n fetchRelationOptions(data.relationsMeta[resolvedAttr].targetUid);\n }\n };\n\n const fetchModels = async () => {\n // 1. Instant hydration from session cache if available (0ms rendering)\n try {\n const cached = sessionStorage.getItem(MODELS_CACHE_KEY);\n if (cached) {\n const parsed = JSON.parse(cached);\n if (parsed && parsed.data) {\n applyModelsData(parsed.data);\n setLoading(false);\n }\n }\n } catch {}\n\n try {\n if (collections.length === 0) {\n setLoading(true);\n }\n const res = await get('/bulk-updater/models');\n if (res.data && res.data.success) {\n applyModelsData(res.data);\n try {\n sessionStorage.setItem(MODELS_CACHE_KEY, JSON.stringify({ timestamp: Date.now(), data: res.data }));\n } catch {}\n }\n } catch (err: any) {\n const isAborted =\n err?.name === 'AbortError' ||\n err?.name === 'CanceledError' ||\n err?.code === 'ERR_CANCELED' ||\n err?.message?.includes('aborted') ||\n err?.message?.includes('canceled');\n\n if (!isAborted) {\n toggleNotification({\n type: 'danger',\n message: err?.message || 'Failed to load collections data',\n });\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 const pageNum = res.data.pagination?.page ?? targetPage ?? 1;\n const pageSizeNum = res.data.pagination?.pageSize ?? size ?? defaultPageSize;\n const totalNum = res.data.pagination?.total !== undefined ? res.data.pagination.total : fetchedEntries.length;\n const pageCountNum = res.data.pagination?.pageCount ?? Math.max(1, Math.ceil(totalNum / pageSizeNum));\n\n setCollectionPages((prev) => ({\n ...prev,\n [colUid]: {\n page: pageNum,\n pageSize: pageSizeNum,\n total: totalNum,\n pageCount: pageCountNum,\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 const isAborted =\n err?.name === 'AbortError' ||\n err?.name === 'CanceledError' ||\n err?.code === 'ERR_CANCELED' ||\n err?.message?.includes('aborted') ||\n err?.message?.includes('canceled');\n\n if (!isAborted) {\n toggleNotification({\n type: 'danger',\n message: `Failed to load entries for ${colUid}: ${err?.message || 'Network error'}`,\n });\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 const isAborted =\n err?.name === 'AbortError' ||\n err?.name === 'CanceledError' ||\n err?.code === 'ERR_CANCELED' ||\n err?.message?.includes('aborted') ||\n err?.message?.includes('canceled');\n\n if (!isAborted) {\n toggleNotification({\n type: 'danger',\n message: err?.message || 'Failed to fetch audit history.',\n });\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 // Targeted Collection Querying: Only query visible collections possessing the attribute\n const targetCols = collections.filter((col) => {\n if (visibleTypeUids[col.uid] === false) return false;\n if (filterOperator !== 'none' && !col.attributes.includes(selectedAttribute)) return false;\n return true;\n });\n\n targetCols.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 try {\n if (newAttr) {\n localStorage.setItem(LAST_ATTR_KEY, newAttr);\n } else {\n localStorage.removeItem(LAST_ATTR_KEY);\n }\n } catch {}\n setSelectedEntries({});\n setFilterOperator('none');\n setFilterQuery('');\n setEntrySearch('');\n setSelectedRelationDocId('');\n setAttributeValue('');\n\n if (newAttr && relationsMeta[newAttr]) {\n fetchRelationOptions(relationsMeta[newAttr].targetUid);\n } else {\n setRelationOptions([]);\n }\n\n if (newAttr) {\n const collectionsToLoad = collections.filter(\n (col) =>\n visibleTypeUids[col.uid] !== false &&\n col.attributes.includes(newAttr) &&\n (!collectionPages[col.uid]?.entries || collectionPages[col.uid].entries.length === 0)\n );\n\n collectionsToLoad.forEach((col) => {\n loadCollectionPage(col.uid, 1);\n });\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 // Memoized collections classification for 100+ collection enterprise UX\n const supportedCollections = useMemo(() => {\n return collections.filter((c) => c.attributes.includes(selectedAttribute));\n }, [collections, selectedAttribute]);\n\n const unsupportedCollections = useMemo(() => {\n return collections.filter((c) => !c.attributes.includes(selectedAttribute));\n }, [collections, selectedAttribute]);\n\n // One-click helper: focus workspace visibility strictly on collections supporting the attribute\n const handleFocusOnlySupported = () => {\n const newVis: Record<string, boolean> = {};\n collections.forEach((c) => {\n newVis[c.uid] = c.attributes.includes(selectedAttribute);\n });\n setVisibleTypeUids(newVis);\n toggleNotification({\n type: 'info',\n message: `Workspace focused: Showing ${supportedCollections.length} of ${collections.length} collections supporting \"${selectedAttribute}\".`,\n });\n };\n\n const handleShowAllTypes = () => {\n const newVis: Record<string, boolean> = {};\n collections.forEach((c) => {\n newVis[c.uid] = true;\n });\n setVisibleTypeUids(newVis);\n };\n\n const handleHideAllTypes = () => {\n const newVis: Record<string, boolean> = {};\n collections.forEach((c) => {\n newVis[c.uid] = false;\n });\n setVisibleTypeUids(newVis);\n };\n\n const [attributeSearch, setAttributeSearch] = useState('');\n\n // Filtered attributes based on user search query (handles camelCase, dot-notation, relations)\n const filteredAttributes = useMemo(() => {\n if (!attributeSearch.trim()) {\n return attributes;\n }\n const q = attributeSearch.toLowerCase().trim();\n const cleanQ = q.replace(/[^a-z0-9]/g, '');\n\n return attributes.filter((attr) => {\n const lower = attr.toLowerCase();\n const cleanLower = lower.replace(/[^a-z0-9]/g, '');\n const rel = relationsMeta[attr];\n const relTarget = (rel?.targetDisplayName || '').toLowerCase();\n\n return (\n lower.includes(q) ||\n cleanLower.includes(cleanQ) ||\n relTarget.includes(q)\n );\n });\n }, [attributes, attributeSearch, relationsMeta]);\n\n // Memoized Combobox options to guarantee 60fps typing even with 1000+ attributes\n const memoizedComboboxOptions = useMemo(() => {\n if (filteredAttributes.length === 0) {\n return (\n <ComboboxOption value=\"__none__\" disabled textValue=\"No matching attributes found\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n No matching attributes found for \"{attributeSearch}\"\n </Typography>\n </ComboboxOption>\n );\n }\n\n return filteredAttributes.map((attr) => {\n const rel = relationsMeta[attr];\n return (\n <ComboboxOption key={attr} value={attr} textValue={attr}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\" gap={2}>\n <Typography variant=\"omega\" fontWeight={attr === selectedAttribute ? 'bold' : 'regular'}>\n {attr}\n </Typography>\n {rel ? (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\" size=\"S\">\n relation ➔ {rel.targetDisplayName}\n </Badge>\n ) : attr.includes('.') ? (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\" size=\"S\">\n component\n </Badge>\n ) : null}\n </Flex>\n </ComboboxOption>\n );\n });\n }, [filteredAttributes, relationsMeta, selectedAttribute, attributeSearch]);\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 // Open Preview Modal\n const handleOpenPreviewModal = async () => {\n if (!selectedAttribute) {\n toggleNotification({\n type: 'warning',\n message: 'Please select an attribute from the dropdown',\n });\n return;\n }\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 if (targets.length === 0) {\n toggleNotification({\n type: 'warning',\n message: 'Please select at least one collection type or entry to preview',\n });\n return;\n }\n\n setShowPreviewModal(true);\n setPreviewLoading(true);\n\n try {\n const res = await post('/bulk-updater/preview', {\n attribute: selectedAttribute,\n value: attributeValue,\n selectedEntries: targets,\n isRegex: useRegex,\n regexPattern,\n publishOnApproval,\n });\n\n if (res.data && res.data.success) {\n setPreviewData(res.data);\n } else {\n throw new Error(res.data?.error || 'Failed to generate preview');\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed to fetch preview diffs',\n });\n setShowPreviewModal(false);\n } finally {\n setPreviewLoading(false);\n }\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 setShowProcessingDashboard(true);\n setIsSubmittingBatch(true);\n setLastResults(null);\n\n // Initialize live dashboard job tracker\n const tempBatchId = `batch_${Date.now()}`;\n setDashboardBatchId(tempBatchId);\n setDashboardJob({\n id: tempBatchId,\n createdAt: new Date().toISOString(),\n status: 'processing',\n executionMode,\n attribute: selectedAttribute,\n value: attributeValue,\n totalTargets: targets.length,\n processedCount: 0,\n updatedCount: 0,\n skippedCount: 0,\n failedCount: 0,\n isLive: false,\n publishOnApproval,\n results: [],\n });\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 setIsSubmittingBatch(false);\n\n if (res.data && res.data.success) {\n setSelectedEntries({});\n const finalBatchId = res.data.batchId;\n setDashboardBatchId(finalBatchId);\n\n if (res.data.pending) {\n setDashboardJob({\n id: finalBatchId,\n createdAt: new Date().toISOString(),\n status: res.data.status || 'pending_approval',\n executionMode,\n scheduledFor: res.data.scheduledFor,\n attribute: selectedAttribute,\n value: attributeValue,\n totalTargets: targets.length,\n processedCount: 0,\n updatedCount: 0,\n skippedCount: 0,\n failedCount: 0,\n isLive: false,\n publishOnApproval,\n makerNotes: makerNotesInput,\n policyMessage: res.data.message,\n results: [],\n });\n\n toggleNotification({\n type: 'success',\n message: res.data.message || 'Batch submitted successfully.',\n });\n await fetchPendingBatches();\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 setDashboardJob({\n id: finalBatchId,\n createdAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n status: res.data.status || 'successful',\n executionMode: 'immediate',\n attribute: selectedAttribute,\n value: attributeValue,\n totalTargets: res.data.totalTargets || targets.length,\n processedCount: res.data.results?.length || targets.length,\n updatedCount: res.data.updatedCount || 0,\n skippedCount: res.data.skippedCount || 0,\n failedCount: res.data.failedCount || 0,\n isLive: res.data.isLive !== false && (res.data.updatedCount > 0),\n publishOnApproval,\n results: res.data.results || [],\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 setIsSubmittingBatch(false);\n setDashboardJob((prev: any) => ({\n ...prev,\n status: 'failed',\n error: res.data?.error || 'Batch update encountered an error',\n }));\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Batch update encountered an error',\n });\n }\n } catch (err: any) {\n setIsSubmittingBatch(false);\n const errMsg = err.response?.data?.error || err.message || 'Batch update failed';\n setDashboardJob((prev: any) => ({\n ...prev,\n status: 'failed',\n error: errMsg,\n }));\n toggleNotification({\n type: 'danger',\n message: errMsg,\n });\n } finally {\n setUpdating(false);\n setMakerNotesInput('');\n }\n };\n\n // Bulk Export Selected Entries across collections (Excel-compatible RFC-4180 CSV with UTF-8 BOM)\n const handleBulkExportSelected = async () => {\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 if (targets.length === 0) {\n toggleNotification({\n type: 'warning',\n message: 'Please select at least one entry to export',\n });\n return;\n }\n\n try {\n setBulkExporting(true);\n const res = await post('/bulk-updater/csv/export-bulk', { selectedEntries: targets });\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 selected entries',\n });\n return;\n }\n const safeContent = csvStr.startsWith('\\uFEFF') ? csvStr : '\\uFEFF' + csvStr;\n const blob = new Blob([safeContent], { 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', res.data?.filename || `bulk_export_selected_${targets.length}.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: `Successfully exported ${res.data?.count || targets.length} selected records to Excel CSV`,\n });\n } catch (e: any) {\n toggleNotification({\n type: 'danger',\n message: e.message || 'Failed exporting selected records to CSV',\n });\n } finally {\n setBulkExporting(false);\n }\n };\n\n // Open Bulk Publish Modal\n const handleOpenPublishModal = () => {\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 publish',\n });\n return;\n }\n setShowPublishConfirmModal(true);\n };\n\n // Perform bulk publish with chosen mode\n const executeBatchPublish = 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 setPublishing(true);\n setShowPublishConfirmModal(false);\n setShowProcessingDashboard(true);\n setIsSubmittingBatch(true);\n setLastResults(null);\n\n // Initialize live dashboard job tracker\n const tempBatchId = `batch_pub_${Date.now()}`;\n setDashboardBatchId(tempBatchId);\n setDashboardJob({\n id: tempBatchId,\n createdAt: new Date().toISOString(),\n status: 'processing',\n executionMode,\n attribute: '(publish)',\n value: 'published',\n totalTargets: targets.length,\n processedCount: 0,\n updatedCount: 0,\n skippedCount: 0,\n failedCount: 0,\n isLive: true,\n publishOnApproval: true,\n results: [],\n });\n\n const payload = {\n selectedEntries: targets,\n executionMode,\n makerNotes: publishMakerNotesInput,\n forceImmediate,\n };\n\n const res = await post('/bulk-updater/batch-publish', payload);\n\n setIsSubmittingBatch(false);\n\n if (res.data && res.data.success) {\n setSelectedEntries({});\n const finalBatchId = res.data.batchId;\n setDashboardBatchId(finalBatchId);\n\n if (res.data.pending) {\n setDashboardJob({\n id: finalBatchId,\n createdAt: new Date().toISOString(),\n status: res.data.status || 'pending_approval',\n executionMode,\n scheduledFor: res.data.scheduledFor,\n attribute: '(publish)',\n value: 'published',\n totalTargets: targets.length,\n processedCount: 0,\n updatedCount: 0,\n skippedCount: 0,\n failedCount: 0,\n isLive: true,\n publishOnApproval: true,\n makerNotes: publishMakerNotesInput,\n policyMessage: res.data.message,\n results: [],\n });\n\n toggleNotification({\n type: 'success',\n message: res.data.message || 'Publish batch submitted successfully.',\n });\n await fetchPendingBatches();\n } else {\n setLastResults(res.data.results || []);\n setUpdateSummary({\n updatedCount: res.data.publishedCount || 0,\n skippedCount: res.data.skippedCount || 0,\n batchId: res.data.batchId,\n });\n\n setDashboardJob({\n id: finalBatchId,\n createdAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n status: res.data.status || 'successful',\n executionMode: 'immediate',\n attribute: '(publish)',\n value: 'published',\n totalTargets: res.data.totalTargets || targets.length,\n processedCount: res.data.results?.length || targets.length,\n updatedCount: res.data.publishedCount || 0,\n skippedCount: res.data.skippedCount || 0,\n failedCount: res.data.failedCount || 0,\n isLive: true,\n publishOnApproval: true,\n results: res.data.results || [],\n });\n\n toggleNotification({\n type: 'success',\n message: `Bulk publish complete! Batch ID: ${res.data.batchId}. Published: ${res.data.publishedCount}, Skipped: ${res.data.skippedCount}`,\n });\n\n await fetchModels();\n await fetchAuditHistory();\n }\n } else {\n setIsSubmittingBatch(false);\n setDashboardJob((prev: any) => ({\n ...prev,\n status: 'failed',\n error: res.data?.error || 'Batch publish encountered an error',\n }));\n toggleNotification({\n type: 'danger',\n message: res.data?.error || 'Batch publish encountered an error',\n });\n }\n } catch (err: any) {\n setIsSubmittingBatch(false);\n const errMsg = err.response?.data?.error || err.message || 'Batch publish failed';\n setDashboardJob((prev: any) => ({\n ...prev,\n status: 'failed',\n error: errMsg,\n }));\n toggleNotification({\n type: 'danger',\n message: errMsg,\n });\n } finally {\n setPublishing(false);\n setPublishMakerNotesInput('');\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 setSelectedEntries({});\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 setSelectedEntries({});\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 & 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={<Download />}\n variant=\"secondary\"\n onClick={() => {\n setShowProcessingDashboard(true);\n }}\n >\n Processing Tracker & Reports\n </Button>\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 & 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 & Quota Rules\n </Button>\n <Button\n variant={activeTab === 'csv' ? 'default' : 'tertiary'}\n onClick={() => setActiveTab('csv')}\n size=\"M\"\n >\n CSV Import / Export & 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' && loading && collections.length === 0 ? (\n <Box\n padding={8}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n marginBottom={6}\n style={{ width: '100%', textAlign: 'center' }}\n >\n <Flex direction=\"column\" alignItems=\"center\" gap={3}>\n <Loader>Discovering schema attributes and collections...</Loader>\n <Typography variant=\"delta\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n Discovering Schema Attributes & Collections...\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Scanning collection types, components, and relations across your Strapi schema.\n </Typography>\n </Flex>\n </Box>\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 (Searchable Combobox) */}\n <Box style={{ minWidth: 280, flex: 1, maxWidth: 440 }}>\n <Field.Root>\n <Field.Label>Attribute to Update</Field.Label>\n <Combobox\n autocomplete=\"none\"\n placeholder=\"Search attribute by name or relation...\"\n value={selectedAttribute || undefined}\n clearLabel=\"Clear attribute selection\"\n onClear={() => {\n handleAttributeChange('');\n setAttributeSearch('');\n }}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setAttributeSearch(e.target.value);\n }}\n onOpenChange={(isOpen: boolean) => {\n if (!isOpen) {\n setAttributeSearch('');\n }\n }}\n loading={loading && attributes.length === 0}\n loadingMessage=\"Discovering schema attributes...\"\n onChange={(val: any) => {\n if (val && typeof val === 'string' && val !== '__none__') {\n handleAttributeChange(val);\n setAttributeSearch('');\n }\n }}\n >\n {memoizedComboboxOptions}\n </Combobox>\n </Field.Root>\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} → {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 <Field.Root>\n <Field.Label>{`Choose ${relationsMeta[selectedAttribute].targetDisplayName}`}</Field.Label>\n <Combobox\n autocomplete={{ type: 'list', filter: 'contains' }}\n placeholder={relationOptionsLoading ? 'Loading entities...' : `Search & pick ${relationsMeta[selectedAttribute].targetDisplayName}...`}\n value={selectedRelationDocId}\n onChange={(val: any) => {\n const docId = val ? 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 <ComboboxOption value=\"__clear__\" textValue=\"Clear / Unlink Relation\">\n -- Clear / Unlink Relation --\n </ComboboxOption>\n {relationOptions.map((opt) => (\n <ComboboxOption key={opt.documentId} value={opt.documentId} textValue={opt.label}>\n {opt.label}\n </ComboboxOption>\n ))}\n </Combobox>\n </Field.Root>\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 {/* Action Buttons: Preview, Update & Publish */}\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Button\n startIcon={<Eye />}\n variant=\"secondary\"\n size=\"L\"\n onClick={handleOpenPreviewModal}\n loading={previewLoading}\n disabled={loading || totalSelectedCount === 0 || !selectedAttribute}\n >\n Preview Changes ({totalSelectedCount})\n </Button>\n <Button\n startIcon={<Play />}\n variant=\"default\"\n size=\"L\"\n onClick={handleOpenConfirmModal}\n loading={updating}\n disabled={loading || totalSelectedCount === 0 || !selectedAttribute}\n >\n Update Selected ({totalSelectedCount})\n </Button>\n <Button\n startIcon={<Check />}\n variant=\"success-light\"\n size=\"L\"\n onClick={handleOpenPublishModal}\n loading={publishing}\n disabled={loading || totalSelectedCount === 0}\n title=\"Directly publish selected draft records across collections\"\n >\n Publish Selected ({totalSelectedCount})\n </Button>\n <Button\n startIcon={<Download />}\n variant=\"tertiary\"\n size=\"L\"\n onClick={handleBulkExportSelected}\n loading={bulkExporting}\n disabled={loading || totalSelectedCount === 0}\n title=\"Export selected entries to Excel-compatible CSV with full nested component support\"\n >\n Export Selected ({totalSelectedCount})\n </Button>\n </Flex>\n </Flex>\n\n {/* Auto-Publish upon Update Setting */}\n <Box marginTop={4} padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\n <Flex gap={2} alignItems=\"center\">\n <Checkbox\n checked={publishOnApproval}\n onCheckedChange={(checked: boolean) => setPublishOnApproval(Boolean(checked))}\n >\n <Typography fontWeight=\"bold\">Auto-Publish after Update</Typography>\n </Checkbox>\n <Badge\n backgroundColor={publishOnApproval ? 'success100' : 'warning100'}\n textColor={publishOnApproval ? 'success700' : 'warning700'}\n >\n {publishOnApproval ? '✓ LIVE PUBLISH' : 'DRAFT ONLY'}\n </Badge>\n </Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {publishOnApproval\n ? 'When enabled, entries will be published live immediately upon batch execution for draft-enabled content types.'\n : 'When disabled, entries will be saved as draft versions without publishing to live visitors.'}\n </Typography>\n </Flex>\n </Box>\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 & 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 & Schema Intelligence Dashboard */}\n {selectedAttribute && (\n <Box marginTop={4} padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\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><code>{selectedAttribute}</code></strong>\n </Typography>\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ Supported in {supportedCollections.length} of {collections.length} Collections\n </Badge>\n {unsupportedCollections.length > 0 && (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral700\">\n — Not in schema: {unsupportedCollections.length}\n </Badge>\n )}\n </Flex>\n\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"secondary\"\n size=\"S\"\n onClick={handleFocusOnlySupported}\n >\n Focus Workspace: Show Supported Only ({supportedCollections.length})\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={() => setAttributeInfoExpanded((prev) => !prev)}\n >\n {attributeInfoExpanded ? 'Hide Schema Breakdown ▲' : 'Inspect Breakdown ▼'}\n </Button>\n </Flex>\n </Flex>\n\n {attributeInfoExpanded && (\n <Box marginTop={3} paddingTop={3} style={{ borderTop: '1px solid #dcdce4' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3} wrap=\"wrap\" gap={2}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Showing collection types schema compatibility. Type to filter:\n </Typography>\n <Box style={{ width: 220 }}>\n <TextInput\n placeholder=\"Filter collection name...\"\n size=\"S\"\n value={attributeInfoSearch}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setAttributeInfoSearch(e.target.value)\n }\n />\n </Box>\n </Flex>\n <Flex wrap=\"wrap\" gap={2} alignItems=\"center\" style={{ maxHeight: 180, overflowY: 'auto' }}>\n {collections\n .filter(\n (c) =>\n !attributeInfoSearch.trim() ||\n c.displayName.toLowerCase().includes(attributeInfoSearch.toLowerCase().trim()) ||\n c.uid.toLowerCase().includes(attributeInfoSearch.toLowerCase().trim())\n )\n .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 size=\"S\"\n >\n {c.displayName}: {hasAttr ? '✓ Supported' : '— Not in schema'}\n </Badge>\n );\n })}\n </Flex>\n </Box>\n )}\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 & 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 & 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={selectedAttribute ? `Filter condition for \"${selectedAttribute}\"` : 'Filter condition'}\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={selectedAttribute ? `Value for \"${selectedAttribute}\"` : 'Value to match'}\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 - Enterprise High-Density UX */}\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', border: '1px solid #eaeaef' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3} marginBottom={3}>\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\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 <Badge backgroundColor=\"success100\" textColor=\"success700\">\n {supportedCollections.filter((c) => visibleTypeUids[c.uid] !== false).length} of {supportedCollections.length} supported visible\n </Badge>\n </Flex>\n\n {/* Inline Quick Search & Action Buttons */}\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Box style={{ width: 220 }}>\n <TextInput\n placeholder=\"Search types...\"\n size=\"S\"\n value={typeVisibilitySearch}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setTypeVisibilitySearch(e.target.value)\n }\n />\n </Box>\n <Button\n variant=\"secondary\"\n size=\"S\"\n onClick={handleFocusOnlySupported}\n >\n Show Supported Only ({supportedCollections.length})\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={handleShowAllTypes}\n >\n Show All\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n onClick={handleHideAllTypes}\n >\n Hide All\n </Button>\n </Flex>\n </Flex>\n\n {/* High-Density Scrollable Responsive Grid */}\n <Box\n style={{\n maxHeight: 220,\n overflowY: 'auto',\n padding: 8,\n background: '#ffffff',\n borderRadius: 4,\n border: '1px solid #dcdce4',\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))',\n gap: 8,\n }}\n >\n {collections\n .filter(\n (col) =>\n !typeVisibilitySearch.trim() ||\n col.displayName.toLowerCase().includes(typeVisibilitySearch.toLowerCase().trim()) ||\n col.uid.toLowerCase().includes(typeVisibilitySearch.toLowerCase().trim())\n )\n .map((col) => {\n const isVisible = visibleTypeUids[col.uid] !== false;\n const hasAttr = selectedAttribute ? col.attributes.includes(selectedAttribute) : false;\n return (\n <Box\n key={col.uid}\n padding={2}\n paddingLeft={3}\n paddingRight={3}\n background={isVisible ? '#f0f0ff' : '#f6f6f9'}\n hasRadius\n style={{\n border: isVisible ? '1px solid #4945ff' : '1px solid #eaeaef',\n transition: 'all 0.15s ease',\n }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Checkbox\n checked={isVisible}\n onCheckedChange={(checked: boolean) =>\n setVisibleTypeUids((prev) => ({ ...prev, [col.uid]: Boolean(checked) }))\n }\n >\n <Typography variant=\"pi\" fontWeight={isVisible ? 'bold' : 'regular'}>\n {col.displayName}\n </Typography>\n </Checkbox>\n <Flex gap={1} alignItems=\"center\">\n {col.isSingleType ? (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\" size=\"S\">\n Single\n </Badge>\n ) : null}\n {hasAttr ? (\n <Badge backgroundColor=\"success100\" textColor=\"success700\" size=\"S\">\n ✓ Supports\n </Badge>\n ) : (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\" size=\"S\">\n —\n </Badge>\n )}\n </Flex>\n </Flex>\n </Box>\n );\n })}\n </Box>\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 = selectedAttribute ? col.attributes.includes(selectedAttribute) : false;\n const visibleEntries = getVisibleEntries(col);\n const matchingColCount = selectedAttribute ? entries.filter((e) => entryMatchesFilter(e, selectedAttribute)).length : 0;\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 ) : selectedAttribute ? (\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 ) : null}\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 → Z)\n </SingleSelectOption>\n <SingleSelectOption value={`${selectedAttribute}:desc`}>\n {selectedAttribute} (Z → A)\n </SingleSelectOption>\n </>\n )}\n {col.attributes.includes('name') && (\n <>\n <SingleSelectOption value=\"name:asc\">Name (A → Z)</SingleSelectOption>\n <SingleSelectOption value=\"name:desc\">Name (Z → A)</SingleSelectOption>\n </>\n )}\n {col.attributes.includes('title') && (\n <>\n <SingleSelectOption value=\"title:asc\">Title (A → Z)</SingleSelectOption>\n <SingleSelectOption value=\"title:desc\">Title (Z → 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\n // If entries are checked in this collection, export only checked entries\n const colSelectedDocIds = col.entries\n .filter((e) => selectedEntries[`${col.uid}${KEY_SEP}${e.documentId}`])\n .map((e) => e.documentId);\n if (colSelectedDocIds.length > 0) {\n params.set('documentIds', colSelectedDocIds.join(','));\n }\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 safeContent = csvStr.startsWith('\\uFEFF') ? csvStr : '\\uFEFF' + csvStr;\n const blob = new Blob([safeContent], { 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 ${res.data?.count ?? (colSelectedDocIds.length || col.entries.length)} ${col.displayName} entries to Excel 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 ← 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 →\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 & 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 ) : null}\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 & 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 & 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 & 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 & 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 & 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 & 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> → “{formatDisplayValue(rec.value)}”\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=\"secondary\"\n size=\"S\"\n startIcon={<Download />}\n onClick={() => {\n setDashboardBatchId(rec.batchId);\n setShowProcessingDashboard(true);\n }}\n >\n Report\n </Button>\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 justifyContent=\"space-between\" alignItems=\"center\" marginTop={2} paddingTop={2} style={{ borderTop: '1px solid #eaeaef' }}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Need to inspect before & after values?\n </Typography>\n <Button\n variant=\"secondary\"\n size=\"S\"\n startIcon={<Eye />}\n onClick={() => {\n setShowConfirmModal(false);\n handleOpenPreviewModal();\n }}\n >\n Open Change Preview\n </Button>\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 & 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 & Execute Now\n </Button>\n )}\n </Flex>\n </Flex>\n </Box>\n </Box>\n </div>\n )}\n\n {/* Confirmation Modal for Direct Bulk Publish */}\n {showPublishConfirmModal && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 100,\n }}\n onClick={() => setShowPublishConfirmModal(false)}\n >\n <Box\n background=\"neutral0\"\n hasRadius\n style={{\n width: '90%',\n maxWidth: 620,\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 10px 40px rgba(0, 0, 0, 0.25)',\n overflow: 'hidden',\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* Modal Header */}\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=\"beta\" fontWeight=\"bold\">\n Confirm Bulk Publish\n </Typography>\n <Box marginTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Publish selected draft records live to visitors across content types\n </Typography>\n </Box>\n </Box>\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n {totalSelectedCount} Selected\n </Badge>\n </Flex>\n </Box>\n\n {/* Modal Scrollable Body */}\n <Box\n padding={5}\n style={{\n overflowY: 'auto',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n }}\n >\n <Box padding={4} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n Collection Breakdown:\n </Typography>\n <Box marginTop={2}>\n {collections\n .filter((col) =>\n col.entries.some((entry) => selectedEntries[`${col.uid}${KEY_SEP}${entry.documentId}`])\n )\n .map((col) => {\n const count = col.entries.filter(\n (entry) => selectedEntries[`${col.uid}${KEY_SEP}${entry.documentId}`]\n ).length;\n const hasDraftAndPublish = col.draftAndPublish !== false;\n\n return (\n <Flex\n key={col.uid}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n paddingTop={2}\n paddingBottom={2}\n style={{ borderBottom: '1px dashed #eaeaef' }}\n >\n <Typography variant=\"pi\">\n <strong>{col.displayName}</strong> ({col.uid})\n </Typography>\n <Flex gap={2} alignItems=\"center\">\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\">\n {count} {count === 1 ? 'entry' : 'entries'}\n </Badge>\n {hasDraftAndPublish ? (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ Draft & Publish Enabled\n </Badge>\n ) : (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ⚠️ Skipped (Drafts Disabled)\n </Badge>\n )}\n </Flex>\n </Flex>\n );\n })}\n </Box>\n </Box>\n\n {/* Business Hours Warning Banner */}\n {executionWindow?.isBusinessHours && (\n <Box\n padding={4}\n background=\"warning100\"\n hasRadius\n style={{ border: '1px solid #f5c0b8' }}\n >\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"warning700\">\n ⚠️ Business Hours Active:\n </Typography>\n <Typography variant=\"pi\" textColor=\"warning700\" style={{ display: 'block', marginTop: 4 }}>\n It is currently business peak hours ({executionWindow.currentTime}). To prevent API latency spikes, publish requests should be queued for off-peak hours ({executionWindow.offPeakStartTime}) or submitted for governance review.\n </Typography>\n </Box>\n )}\n\n {/* Maker-Checker Notes Input */}\n <Box>\n <Typography variant=\"pi\" fontWeight=\"bold\">\n Governance Notes / Reason (Optional):\n </Typography>\n <Box marginTop={1}>\n <TextInput\n name=\"publishMakerNotes\"\n placeholder=\"e.g. Publishing Q3 catalog release updates\"\n value={publishMakerNotesInput}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPublishMakerNotesInput(e.target.value)}\n />\n </Box>\n </Box>\n </Box>\n\n {/* Modal Footer */}\n <Box\n padding={4}\n background=\"neutral100\"\n style={{\n borderTop: '1px solid rgba(120, 120, 150, 0.2)',\n flexShrink: 0,\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={() => setShowPublishConfirmModal(false)}>\n Cancel\n </Button>\n <Flex gap={2} wrap=\"wrap\" justifyContent=\"flex-end\" alignItems=\"center\">\n <Button\n variant={executionWindow?.isBusinessHours ? 'default' : 'secondary'}\n size=\"M\"\n onClick={() => executeBatchPublish('maker_checker')}\n loading={publishing}\n >\n Submit for Checker Approval\n </Button>\n\n {executionWindow?.isBusinessHours ? (\n <>\n <Button\n variant=\"secondary\"\n size=\"M\"\n onClick={() => executeBatchPublish('queue_offpeak')}\n loading={publishing}\n >\n Queue for Off-Peak ({executionWindow?.offPeakStartTime || '18:00'})\n </Button>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => executeBatchPublish('immediate', true)}\n loading={publishing}\n >\n Force Publish Now\n </Button>\n </>\n ) : (\n <Button\n variant=\"default\"\n size=\"M\"\n onClick={() => executeBatchPublish('immediate')}\n loading={publishing}\n >\n Confirm & Publish Now\n </Button>\n )}\n </Flex>\n </Flex>\n </Box>\n </Box>\n </div>\n )}\n\n {/* Pre-Update Change Preview Modal */}\n <BulkUpdatePreviewModal\n isOpen={showPreviewModal}\n onClose={() => setShowPreviewModal(false)}\n onProceed={() => {\n setShowPreviewModal(false);\n handleOpenConfirmModal();\n }}\n loading={previewLoading}\n previewData={previewData}\n attribute={selectedAttribute}\n publishOnApproval={publishOnApproval}\n targetValueDisplay={\n relationsMeta[selectedAttribute]\n ? (selectedRelationDocId === '__clear__'\n ? 'Clear / Unlink Relation'\n : relationOptions.find((o) => o.documentId === selectedRelationDocId)?.label || selectedRelationDocId || '(none)')\n : useRegex\n ? `Replace /${regexPattern}/g with \"${attributeValue}\"`\n : attributeValue\n }\n />\n\n {/* Processing Dashboard & Status Tracker Modal */}\n <ProcessingDashboardModal\n isOpen={showProcessingDashboard}\n onClose={() => setShowProcessingDashboard(false)}\n batchId={dashboardBatchId}\n initialJob={dashboardJob}\n isSubmitting={isSubmittingBatch}\n />\n </Box>\n );\n};\n\nexport default BulkUpdater;\n"],"names":["React"],"mappings":"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"}
|