strapi-plugin-bulk-updater 1.5.3 → 1.5.4
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-DUfv52ng.mjs → BulkUpdater-7YA96VJT.mjs} +1 -2
- package/dist/_chunks/BulkUpdater-7YA96VJT.mjs.map +1 -0
- package/dist/_chunks/{BulkUpdater-DMkx6dLf.js → BulkUpdater-BTWJq8UX.js} +1 -2
- package/dist/_chunks/BulkUpdater-BTWJq8UX.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/_chunks/BulkUpdater-DMkx6dLf.js.map +0 -1
- package/dist/_chunks/BulkUpdater-DUfv52ng.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkUpdater-7YA96VJT.mjs","sources":["../../admin/src/utils/csvParser.ts","../../admin/src/pages/CsvManagerTab.tsx","../../admin/src/components/ProcessingDashboardModal.tsx","../../admin/src/components/BulkUpdatePreviewModal.tsx","../../admin/src/components/CheckerReviewModal.tsx","../../admin/src/utils/lifecycleStatus.ts","../../admin/src/pages/BulkUpdater.tsx"],"sourcesContent":["/**\n * Robust RFC-4180 compliant CSV parser for Strapi Bulk Updater.\n *\n * Guarantees correct parsing for:\n * 1. Multiline strings & HTML content with embedded line breaks (\\n, \\r\\n, \\r) inside quotes.\n * 2. Commas embedded inside double-quoted cells without shifting subsequent columns.\n * 3. Escaped double quotes (\"\" -> \").\n * 4. Leading/trailing whitespace outside quotes.\n * 5. UTF-8 Byte Order Mark (BOM).\n * 6. Excel formula injection unescaping ('=, '+, '-, '@).\n */\n\nexport function parseCsvRows(csvText: string): string[][] {\n if (!csvText) return [];\n\n // Strip UTF-8 BOM if present\n let text = csvText;\n if (text.charCodeAt(0) === 0xfeff) {\n text = text.slice(1);\n }\n\n const rows: string[][] = [];\n let currentRow: string[] = [];\n let currentCell = '';\n let inQuotes = false;\n let cellIsQuoted = false;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n const nextChar = text[i + 1];\n\n if (inQuotes) {\n if (char === '\"') {\n if (nextChar === '\"') {\n // Escaped quote: \"\" -> \"\n currentCell += '\"';\n i++; // skip second quote\n } else {\n // Closing quote\n inQuotes = false;\n }\n } else {\n // Any character inside quotes (including \\r, \\n, commas, HTML tags) is preserved verbatim\n currentCell += char;\n }\n } else {\n if (char === '\"' && !cellIsQuoted && currentCell.trim() === '') {\n // Opening quote (discards leading whitespace before opening quote)\n inQuotes = true;\n cellIsQuoted = true;\n currentCell = '';\n } else if (char === ',') {\n currentRow.push(cellIsQuoted ? currentCell : currentCell.trim());\n currentCell = '';\n cellIsQuoted = false;\n } else if (char === '\\r') {\n if (nextChar === '\\n') {\n i++; // Skip \\n in \\r\\n sequence\n }\n currentRow.push(cellIsQuoted ? currentCell : currentCell.trim());\n if (currentRow.length > 1 || (currentRow.length === 1 && currentRow[0] !== '')) {\n rows.push(currentRow);\n }\n currentRow = [];\n currentCell = '';\n cellIsQuoted = false;\n } else if (char === '\\n') {\n currentRow.push(cellIsQuoted ? currentCell : currentCell.trim());\n if (currentRow.length > 1 || (currentRow.length === 1 && currentRow[0] !== '')) {\n rows.push(currentRow);\n }\n currentRow = [];\n currentCell = '';\n cellIsQuoted = false;\n } else {\n // If cell was already quoted and closed, ignore trailing whitespace between closing quote and comma\n if (!(cellIsQuoted && !inQuotes && (char === ' ' || char === '\\t'))) {\n currentCell += char;\n }\n }\n }\n }\n\n if (currentCell !== '' || cellIsQuoted || currentRow.length > 0) {\n currentRow.push(cellIsQuoted ? currentCell : currentCell.trim());\n if (currentRow.length > 1 || (currentRow.length === 1 && currentRow[0] !== '')) {\n rows.push(currentRow);\n }\n }\n\n return rows;\n}\n\nexport function parseCsv(csvText: string): Array<Record<string, string>> {\n const rows = parseCsvRows(csvText);\n if (rows.length < 2) return [];\n\n const headers = rows[0].map((h) => h.trim());\n const records: Array<Record<string, string>> = [];\n\n for (let i = 1; i < rows.length; i++) {\n const row = rows[i];\n const record: Record<string, string> = {};\n headers.forEach((h, idx) => {\n let val = row[idx] !== undefined ? row[idx] : '';\n // Unescape leading single quote if added for Excel formula safety ('=, '+, '-, '@)\n if (typeof val === 'string' && /^'[=+@-]/.test(val)) {\n val = val.substring(1);\n }\n record[h] = val;\n });\n records.push(record);\n }\n\n return records;\n}\n\nconst LIFECYCLE_STATUS_WORDS = new Set([\n 'pending review',\n 'pending_review',\n 'pending approval',\n 'pending_approval',\n 'approved',\n 'rejected',\n 'draft',\n 'published',\n 'modified',\n 'supported',\n 'ignored',\n]);\n\nexport function isValidDocId(val: any): boolean {\n if (!val || typeof val !== 'string') return false;\n const trimmed = val.trim();\n if (!trimmed) return false;\n if (LIFECYCLE_STATUS_WORDS.has(trimmed.toLowerCase())) return false;\n if (/\\s/.test(trimmed)) return false;\n return /^[a-zA-Z0-9_-]+$/.test(trimmed);\n}\n\nexport function extractDocId(row: Record<string, any>): string {\n if (!row || typeof row !== 'object') return '';\n const candidates = [\n row.documentId,\n row.document_id,\n row['Document ID'],\n row['Document Id'],\n row['document_id'],\n row.docId,\n row['docId'],\n row.id,\n row.ID,\n row.Id,\n ];\n for (const c of candidates) {\n if (c !== undefined && c !== null) {\n const str = String(c).trim();\n if (isValidDocId(str)) {\n return str;\n }\n }\n }\n return '';\n}\n\n","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 TextInput,\n Combobox,\n ComboboxOption,\n} from '@strapi/design-system';\nimport { Download, Upload, ArrowClockwise, Check, ChevronLeft, ChevronRight, Eye } from '@strapi/icons';\nimport { parseCsv, extractDocId } from '../utils/csvParser';\nimport { isAbortError } from '../utils/isAbortError';\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 (0 = Unlimited / All records)\n const [exportLimit, setExportLimit] = useState<number>(0);\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 [allParsedRecords, setAllParsedRecords] = useState<Array<Record<string, string>>>([]);\n const [previewPage, setPreviewPage] = useState<number>(1);\n const [previewPageSize, setPreviewPageSize] = useState<number>(10);\n const [importing, setImporting] = useState<boolean>(false);\n const [importProgress, setImportProgress] = useState<{\n currentChunk: number;\n totalChunks: number;\n percent: number;\n processedRows: number;\n totalRows: number;\n liveCreated: number;\n liveUpdated: number;\n liveSkipped: number;\n liveErrors: number;\n } | null>(null);\n const [importResult, setImportResult] = useState<any>(null);\n\n // Enterprise Guardrail State (Execution Windows, Business Hours, Maker-Checker 4-Eyes, Pre-Flight Dry Run)\n const [executionWindow, setExecutionWindow] = useState<{\n enabled: boolean;\n timeZone: string;\n isBusinessHours: boolean;\n policyMessage: string;\n offPeakStartTime: string;\n currentServerTime: string;\n } | null>(null);\n\n const [preflightLoading, setPreflightLoading] = useState<boolean>(false);\n const [preflightReport, setPreflightReport] = useState<{\n totalRows: number;\n validRows: number;\n estimatedUpdates: number;\n estimatedCreates: number;\n lifecycleStats?: {\n isDraftAndPublish: boolean;\n totalChecked: number;\n published: number;\n modified: number;\n draft: number;\n unreviewedCount: number;\n };\n hasErrors: boolean;\n hasWarnings: boolean;\n errors: Array<{ row: number; documentId?: string; error: string }>;\n warnings: Array<{ row: number; documentId?: string; warning: string }>;\n totalErrorCount: number;\n totalWarningCount: number;\n } | null>(null);\n\n const [showConfirmModal, setShowConfirmModal] = useState<boolean>(false);\n const [makerNotesInput, setMakerNotesInput] = useState<string>('');\n const [submittingBatch, setSubmittingBatch] = useState<boolean>(false);\n const [publishStrategy, setPublishStrategy] = useState<'safe' | 'all'>('all');\n const [unreviewedConsent, setUnreviewedConsent] = useState<boolean>(true);\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?.executionWindow) {\n setExecutionWindow(modelsRes.data.executionWindow);\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 if (isAbortError(err)) return;\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 if (isAbortError(err)) return;\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 successfully (${res.data?.count ?? 0} records)`,\n });\n } catch (err: any) {\n if (isAbortError(err)) return;\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 if (isAbortError(err)) return;\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 // RFC-4180 client-side file upload & 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 setImportProgress(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 records = parseCsv(text);\n setAllParsedRecords(records);\n setPreviewPage(1);\n } catch (err) {\n setAllParsedRecords([]);\n }\n };\n reader.readAsText(file);\n };\n\n // Chunked batch import engine (batches of 100 rows prevent HTTP 413 \"Request entity too large\")\n const handleExecuteImport = async () => {\n if (!selectedUid || allParsedRecords.length === 0) return;\n\n const totalRows = allParsedRecords.length;\n const CHUNK_SIZE = 100;\n const totalChunks = Math.ceil(totalRows / CHUNK_SIZE);\n const batchId = `csv_batch_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`;\n\n try {\n setImporting(true);\n setImportResult(null);\n\n let liveCreated = 0;\n let liveUpdated = 0;\n let liveSkipped = 0;\n let liveErrors = 0;\n let finalResultData: any = null;\n\n setImportProgress({\n currentChunk: 0,\n totalChunks,\n percent: 0,\n processedRows: 0,\n totalRows,\n liveCreated: 0,\n liveUpdated: 0,\n liveSkipped: 0,\n liveErrors: 0,\n });\n\n for (let chunkIdx = 0; chunkIdx < totalChunks; chunkIdx++) {\n const startIdx = chunkIdx * CHUNK_SIZE;\n const endIdx = Math.min(startIdx + CHUNK_SIZE, totalRows);\n const chunkRows = allParsedRecords.slice(startIdx, endIdx);\n const isFirst = chunkIdx === 0;\n const isLast = chunkIdx === totalChunks - 1;\n const startRowNumber = startIdx + 2;\n\n const res = await post('/bulk-updater/csv/import-chunk', {\n uid: selectedUid,\n rows: chunkRows,\n batchId,\n isFirstChunk: isFirst,\n isLastChunk: isLast,\n startRowNumber,\n mode: importMode,\n publish: publishOnImport,\n publishStrategy,\n unreviewedConsent,\n });\n\n if (!res.data || !res.data.success) {\n throw new Error(res.data?.error || `Chunk ${chunkIdx + 1} failed to process`);\n }\n\n const chunkStats = res.data.chunkStats;\n if (chunkStats) {\n liveCreated += chunkStats.created || 0;\n liveUpdated += chunkStats.updated || 0;\n liveSkipped += chunkStats.skipped || 0;\n liveErrors += chunkStats.errors?.length || 0;\n }\n\n const currentProgressPercent = Math.round(((chunkIdx + 1) / totalChunks) * 100);\n\n setImportProgress({\n currentChunk: chunkIdx + 1,\n totalChunks,\n percent: currentProgressPercent,\n processedRows: endIdx,\n totalRows,\n liveCreated,\n liveUpdated,\n liveSkipped,\n liveErrors,\n });\n\n if (isLast) {\n finalResultData = res.data;\n }\n }\n\n if (finalResultData && finalResultData.stats) {\n setImportResult(finalResultData);\n const stats = finalResultData.stats;\n let notifMsg = `CSV Import complete: ${stats.created} created, ${stats.updated} updated across ${stats.total} records.`;\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 }\n } catch (err: any) {\n if (isAbortError(err)) return;\n toggleNotification({\n type: 'danger',\n message: err.message || 'Error processing CSV import batch',\n });\n } finally {\n setImporting(false);\n }\n };\n\n // Pre-Flight Dry-Run: Non-destructive validation check before import execution\n const handleRunPreflight = async () => {\n if (!selectedUid || allParsedRecords.length === 0) return;\n try {\n setPreflightLoading(true);\n const res = await post('/bulk-updater/csv/validate-preflight', {\n uid: selectedUid,\n rows: allParsedRecords,\n mode: importMode,\n });\n if (res.data && res.data.success) {\n setPreflightReport(res.data);\n if (res.data.hasErrors) {\n toggleNotification({\n type: 'warning',\n message: `Pre-flight validation: ${res.data.totalErrorCount} error(s) and ${res.data.totalWarningCount} warning(s) detected.`,\n });\n } else if (res.data.hasWarnings) {\n toggleNotification({\n type: 'warning',\n message: `Pre-flight validation passed with ${res.data.totalWarningCount} warning(s).`,\n });\n } else {\n toggleNotification({\n type: 'success',\n message: `Pre-flight validation passed! All ${res.data.validRows} rows are ready for import.`,\n });\n }\n }\n } catch (err: any) {\n if (isAbortError(err)) return;\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed running pre-flight validation',\n });\n } finally {\n setPreflightLoading(false);\n }\n };\n\n // Submit CSV Batch with Chosen Execution Mode (Maker-Checker 4-Eyes, Off-Peak Scheduling, Immediate)\n const submitBatchWithMode = async (\n executionMode: 'immediate' | 'queue_offpeak' | 'maker_checker',\n forceImmediate = false\n ) => {\n if (!selectedUid || allParsedRecords.length === 0) return;\n\n if (executionMode === 'immediate') {\n setShowConfirmModal(false);\n await handleExecuteImport();\n return;\n }\n\n try {\n setSubmittingBatch(true);\n const res = await post('/bulk-updater/csv/submit-batch', {\n uid: selectedUid,\n rows: allParsedRecords,\n executionMode,\n makerNotes: makerNotesInput,\n forceImmediate,\n mode: importMode,\n publish: publishOnImport,\n publishStrategy,\n unreviewedConsent,\n unreviewedCount: preflightReport?.lifecycleStats?.unreviewedCount || 0,\n });\n\n setShowConfirmModal(false);\n\n if (res.data && res.data.pending) {\n setMakerNotesInput('');\n toggleNotification({\n type: 'success',\n message: res.data.message || 'CSV batch submitted for Checker authorization.',\n });\n } else if (res.data && res.data.executeNow) {\n await handleExecuteImport();\n }\n } catch (err: any) {\n if (isAbortError(err)) return;\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed submitting CSV batch',\n });\n } finally {\n setSubmittingBatch(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 (including 10,000+ datasets), filtered subsets, or rule violations into CSV. Correct or add records in spreadsheets and re-upload with high-performance chunked batch processing.\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 <Combobox\n key={`csv-col-${selectedUid}`}\n value={selectedUid || undefined}\n autocomplete={{ type: 'list', filter: 'contains' }}\n placeholder=\"Search & select a collection...\"\n disabled={loadingCollections}\n clearLabel=\"Clear collection selection\"\n onClear={() => {\n setSelectedUid('');\n setImportResult(null);\n setImportProgress(null);\n }}\n onFocus={(e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }}\n onChange={(val: any) => {\n if (val && typeof val === 'string') {\n setSelectedUid(val);\n setImportResult(null);\n setImportProgress(null);\n }\n }}\n >\n {collections.map((col) => (\n <ComboboxOption key={col.uid} value={col.uid} textValue={`${col.displayName} (${col.uid})`}>\n {col.displayName} ({col.totalEntries ?? 0} records)\n </ComboboxOption>\n ))}\n </Combobox>\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 without artificial limits (streams 10,000+ records in paged chunks) or pinpoint records violating validation quotas.\n </Typography>\n\n <Flex gap={4} wrap=\"wrap\" alignItems=\"center\" marginTop={3}>\n {/* Export Limit Selector */}\n <Box style={{ width: 220 }}>\n <SingleSelect\n value={String(exportLimit)}\n onChange={(val: string) => setExportLimit(Number(val))}\n placeholder=\"Export Limit\"\n >\n <SingleSelectOption value=\"0\">All Records (No Limit)</SingleSelectOption>\n <SingleSelectOption value=\"10000\">Up to 10,000 Records</SingleSelectOption>\n <SingleSelectOption value=\"5000\">Up to 5,000 Records</SingleSelectOption>\n <SingleSelectOption value=\"1000\">Up to 1,000 Records</SingleSelectOption>\n </SingleSelect>\n </Box>\n\n {/* Standard Collection Export */}\n <Button\n variant=\"default\"\n startIcon={<Download />}\n onClick={handleExportCollection}\n disabled={!selectedUid}\n >\n Export {exportLimit === 0 ? 'All' : `${exportLimit}`} {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 (supports 10,000+ records via chunked streaming) to bulk update existing records or insert new records.\n </Typography>\n\n {/* Configuration Modes */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={4} wrap=\"wrap\" gap={4}>\n <Box>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" marginBottom={1} display=\"block\">\n Operation Mode\n </Typography>\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n ⚡ Smart Auto-Detect\n </Badge>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Automatically updates matching records by <code>documentId</code> and creates new entries when ID is omitted.\n </Typography>\n </Flex>\n </Box>\n\n <Box>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" marginBottom={1} display=\"block\">\n Publish Options\n </Typography>\n <Checkbox\n checked={publishOnImport}\n onValueChange={(val: boolean) => {\n setPublishOnImport(val);\n if (val) {\n setPublishStrategy('all');\n setUnreviewedConsent(true);\n }\n }}\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 with Full-Dataset Inspection & Pagination */}\n {allParsedRecords.length > 0 && (() => {\n const totalRows = allParsedRecords.length;\n const missingDocIdCount = allParsedRecords.filter((row) => !extractDocId(row)).length;\n const updateCount = totalRows - missingDocIdCount;\n const headers = Object.keys(allParsedRecords[0]);\n\n const totalPages = Math.ceil(totalRows / previewPageSize) || 1;\n const safePage = Math.min(Math.max(1, previewPage), totalPages);\n const startIndex = (safePage - 1) * previewPageSize;\n const endIndex = Math.min(startIndex + previewPageSize, totalRows);\n const displayedRows = allParsedRecords.slice(startIndex, endIndex);\n\n return (\n <Box marginTop={4} background=\"neutral0\" padding={4} hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3} wrap=\"wrap\" gap={2}>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral700\">\n FILE PREVIEW — {totalRows.toLocaleString()} RECORDS DETECTED IN CSV\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\">\n {totalRows.toLocaleString()} total row{totalRows > 1 ? 's' : ''} •{' '}\n {updateCount > 0 ? `${updateCount.toLocaleString()} updates` : ''}\n {updateCount > 0 && missingDocIdCount > 0 ? ', ' : ''}\n {missingDocIdCount > 0\n ? `${missingDocIdCount.toLocaleString()} new entries (missing documentId)`\n : ''}\n </Typography>\n </Box>\n <Flex gap={2}>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 🔄 {updateCount.toLocaleString()} Updates\n </Badge>\n {missingDocIdCount > 0 && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ➕ {missingDocIdCount.toLocaleString()} New (No ID)\n </Badge>\n )}\n </Flex>\n </Flex>\n\n {/* Pre-Flight Inspection Card */}\n {preflightReport && (\n <Box\n marginBottom={3}\n padding={4}\n background={preflightReport.hasErrors ? 'danger100' : preflightReport.hasWarnings ? 'warning100' : 'success100'}\n hasRadius\n style={{ border: `1px solid ${preflightReport.hasErrors ? '#d9534f' : preflightReport.hasWarnings ? '#f0ad4e' : '#5cb85c'}` }}\n >\n <Flex direction=\"column\" gap={2}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={2}>\n <Typography fontWeight=\"bold\" textColor={preflightReport.hasErrors ? 'danger700' : preflightReport.hasWarnings ? 'warning700' : 'success700'}>\n {preflightReport.hasErrors\n ? `⚠️ Pre-Flight Check: ${preflightReport.totalErrorCount} error(s) detected`\n : preflightReport.hasWarnings\n ? `⚡ Pre-Flight Check: ${preflightReport.validRows} valid rows with ${preflightReport.totalWarningCount} warning(s)`\n : `✅ Pre-Flight Check Passed: All ${preflightReport.validRows} rows are ready for import`}\n </Typography>\n <Flex gap={2}>\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ {preflightReport.validRows} Valid Rows\n </Badge>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 🔄 {preflightReport.estimatedUpdates} Updates\n </Badge>\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ➕ {preflightReport.estimatedCreates} New\n </Badge>\n </Flex>\n </Flex>\n\n {preflightReport.hasErrors && (\n <Box marginTop={2} background=\"neutral0\" padding={3} hasRadius style={{ maxHeight: 160, overflowY: 'auto' }}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger700\" display=\"block\" marginBottom={1}>\n Validation Errors ({preflightReport.totalErrorCount}):\n </Typography>\n {preflightReport.errors.map((e: any, idx: number) => (\n <Typography key={idx} variant=\"pi\" textColor=\"danger700\" display=\"block\">\n • Row {e.row}: {e.error}\n </Typography>\n ))}\n </Box>\n )}\n\n {preflightReport.hasWarnings && (\n <Box marginTop={2} background=\"neutral0\" padding={3} hasRadius style={{ maxHeight: 140, overflowY: 'auto' }}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"warning700\" display=\"block\" marginBottom={1}>\n Warnings ({preflightReport.totalWarningCount}):\n </Typography>\n {preflightReport.warnings.map((w: any, idx: number) => (\n <Typography key={idx} variant=\"pi\" textColor=\"warning700\" display=\"block\">\n • Row {w.row}: {w.warning}\n </Typography>\n ))}\n </Box>\n )}\n </Flex>\n </Box>\n )}\n\n {missingDocIdCount > 0 && (\n <Box marginBottom={3}>\n <Alert variant=\"default\" title=\"Smart Auto-Detect Active\">\n <Typography variant=\"omega\">\n {missingDocIdCount.toLocaleString()} row{missingDocIdCount > 1 ? 's have' : ' has'} no <code>documentId</code>.{' '}\n Because no documentId is provided, the engine will automatically treat them as new entries and generate new database IDs for them.\n </Typography>\n </Alert>\n </Box>\n )}\n\n {/* Table */}\n <Box style={{ overflowX: 'auto', maxWidth: '100%', border: '1px solid #e0e0e0', borderRadius: 4 }}>\n <Table colCount={headers.length + 1} rowCount={displayedRows.length + 1}>\n <Thead>\n <Tr>\n <Th style={{ width: 150, minWidth: 150 }}>\n <Typography variant=\"sigma\">Detected Action</Typography>\n </Th>\n {headers.map((h) => (\n <Th key={h} style={{ minWidth: 160 }}>\n <Typography variant=\"sigma\">{h}</Typography>\n </Th>\n ))}\n </Tr>\n </Thead>\n <Tbody>\n {displayedRows.map((row, rIdx) => {\n const hasDocId = !!extractDocId(row);\n const actualRowIndex = startIndex + rIdx + 1;\n return (\n <Tr key={rIdx}>\n <Td>\n <Flex direction=\"column\" gap={1}>\n {hasDocId ? (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 🔄 Update\n </Badge>\n ) : (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ➕ New Entry\n </Badge>\n )}\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Row #{actualRowIndex}\n </Typography>\n </Flex>\n </Td>\n {headers.map((h) => (\n <Td key={h} style={{ verticalAlign: 'top', maxWidth: 300 }}>\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\n variant=\"omega\"\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n maxHeight: 65,\n }}\n title={row[h] || ''}\n >\n {row[h] || '-'}\n </Typography>\n )}\n </Td>\n ))}\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n\n {/* Pagination Controls */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginTop={3} wrap=\"wrap\" gap={3}>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Rows per page:\n </Typography>\n <Box style={{ width: 80 }}>\n <SingleSelect\n value={String(previewPageSize)}\n onChange={(val: string) => {\n setPreviewPageSize(Number(val));\n setPreviewPage(1);\n }}\n >\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 </SingleSelect>\n </Box>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Showing {startIndex + 1}–{endIndex} of {totalRows.toLocaleString()} rows\n </Typography>\n </Flex>\n\n <Flex gap={2} alignItems=\"center\">\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<ChevronLeft />}\n disabled={safePage <= 1 || importing}\n onClick={() => setPreviewPage((p) => Math.max(1, p - 1))}\n >\n Prev\n </Button>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral700\">\n Page {safePage} of {totalPages}\n </Typography>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n endIcon={<ChevronRight />}\n disabled={safePage >= totalPages || importing}\n onClick={() => setPreviewPage((p) => Math.min(totalPages, p + 1))}\n >\n Next\n </Button>\n </Flex>\n </Flex>\n\n {/* Pre-Flight and Import Action CTAs */}\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginTop={4} wrap=\"wrap\" gap={3}>\n <Button\n variant=\"secondary\"\n size=\"L\"\n startIcon={<Eye />}\n onClick={handleRunPreflight}\n loading={preflightLoading}\n disabled={importing}\n >\n Run Pre-Flight Dry Run\n </Button>\n\n <Button\n variant=\"default\"\n size=\"L\"\n startIcon={<Check />}\n onClick={() => {\n if (publishOnImport) {\n setPublishStrategy('all');\n setUnreviewedConsent(true);\n } else {\n setPublishStrategy('safe');\n setUnreviewedConsent(false);\n }\n setShowConfirmModal(true);\n }}\n loading={importing || submittingBatch}\n >\n Review & Import ({totalRows.toLocaleString()} Records)...\n </Button>\n </Flex>\n </Box>\n );\n })()}\n\n {/* Real-time Chunked Import Progress Card */}\n {importProgress && (\n <Box marginTop={4} padding={4} background=\"neutral0\" hasRadius style={{ border: '1px solid #4945ff' }}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={2}>\n <Typography variant=\"delta\" fontWeight=\"bold\" textColor=\"primary700\">\n {importing ? `Processing Batch Chunk ${importProgress.currentChunk} of ${importProgress.totalChunks} (${importProgress.percent}%)` : 'Batch Import Complete'}\n </Typography>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral700\">\n {importProgress.processedRows.toLocaleString()} / {importProgress.totalRows.toLocaleString()} rows processed\n </Typography>\n </Flex>\n\n {/* Visual Progress Bar */}\n <Box style={{ width: '100%', height: 10, background: '#e0e0e0', borderRadius: 5, overflow: 'hidden', marginBottom: 12 }}>\n <Box\n style={{\n width: `${importProgress.percent}%`,\n height: '100%',\n background: importProgress.percent === 100 ? '#2f6846' : '#4945ff',\n transition: 'width 0.2s ease-in-out',\n }}\n />\n </Box>\n\n <Flex gap={3} wrap=\"wrap\" alignItems=\"center\">\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n Created: {importProgress.liveCreated.toLocaleString()}\n </Badge>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n Updated: {importProgress.liveUpdated.toLocaleString()}\n </Badge>\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\">\n Skipped: {importProgress.liveSkipped.toLocaleString()}\n </Badge>\n {importProgress.liveErrors > 0 && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger700\">\n Errors: {importProgress.liveErrors.toLocaleString()}\n </Badge>\n )}\n </Flex>\n </Box>\n )}\n\n {/* Execution Result Banner */}\n {importResult && (\n <Box marginTop={4}>\n <Alert\n variant={importResult.stats.errors.length > 0 ? 'warning' : 'success'}\n title=\"CSV Import Results\"\n >\n <Typography variant=\"omega\" display=\"block\" marginBottom={1}>\n Successfully processed: <strong>{importResult.stats.created.toLocaleString()} created</strong>\n {importResult.stats.newWithoutDocId > 0 && (\n <span> ({importResult.stats.newWithoutDocId.toLocaleString()} created as new entries because documentId was omitted)</span>\n )}\n , <strong>{importResult.stats.updated.toLocaleString()} updated</strong>,{' '}\n <strong>{importResult.stats.skipped.toLocaleString()} skipped</strong> out of {importResult.stats.total.toLocaleString()} 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, 10).map((err: any, idx: number) => (\n <li key={idx} style={{ marginBottom: '2px' }}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n Row {err.row}: {err.error}\n </Typography>\n </li>\n ))}\n </ul>\n {importResult.stats.errors.length > 10 && (\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ display: 'block', marginTop: 4, fontStyle: 'italic' }}>\n ...and {importResult.stats.errors.length - 10} more error{importResult.stats.errors.length - 10 > 1 ? 's' : ''}\n </Typography>\n )}\n </Box>\n )}\n\n {importResult.stats.diffs && importResult.stats.diffs.length > 0 && (\n <Box marginTop={3} padding={3} background=\"neutral0\" hasRadius style={{ border: '1px solid #dcdce4' }}>\n <Typography variant=\"sigma\" textColor=\"neutral800\" fontWeight=\"bold\" display=\"block\" marginBottom={2}>\n CHANGES APPLIED ({importResult.stats.diffs.length.toLocaleString()}):\n </Typography>\n <Box style={{ overflowX: 'auto' }}>\n <Table colCount={4} rowCount={importResult.stats.diffs.length + 1}>\n <Thead>\n <Tr>\n <Th><Typography variant=\"sigma\">Entry / Document</Typography></Th>\n <Th><Typography variant=\"sigma\">Attribute</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 {importResult.stats.diffs.slice(0, 10).map((d: any, idx: number) => {\n const oldDisplay = d.oldValue !== null && d.oldValue !== undefined\n ? (typeof d.oldValue === 'object' ? JSON.stringify(d.oldValue) : String(d.oldValue))\n : '(empty)';\n const newDisplay = d.newValue !== null && d.newValue !== undefined\n ? (typeof d.newValue === 'object' ? JSON.stringify(d.newValue) : String(d.newValue))\n : '(empty)';\n\n return (\n <Tr key={idx}>\n <Td>\n <Typography fontWeight=\"semiBold\">{d.label || d.documentId}</Typography>\n {d.documentId && (\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\">\n {d.documentId}\n </Typography>\n )}\n </Td>\n <Td>\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n {d.attribute || 'field'}\n </Badge>\n </Td>\n <Td>\n <Typography textColor=\"danger600\">{oldDisplay}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"success600\" fontWeight=\"semiBold\">{newDisplay}</Typography>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n {importResult.stats.diffs.length > 10 && (\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ display: 'block', marginTop: 6, fontStyle: 'italic' }}>\n ...and {importResult.stats.diffs.length - 10} more change{importResult.stats.diffs.length - 10 > 1 ? 's' : ''} recorded in Audit Trail & Version History.\n </Typography>\n )}\n </Box>\n )}\n </Alert>\n </Box>\n )}\n </Box>\n </Flex>\n\n {/* Confirmation Modal with Enterprise Guardrails (Maker-Checker, Execution Windows, Off-Peak Scheduling) */}\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 */}\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 CSV Bulk Import\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\" display=\"block\">\n Review import target, record actions, publishing mode, and execution window policies before proceeding.\n </Typography>\n </Box>\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 {/* Target Summary */}\n <Box padding={4} background=\"neutral100\" hasRadius marginBottom={4}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={2} display=\"block\">\n IMPORT DETAILS\n </Typography>\n <Flex direction=\"column\" gap={2}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Target Collection:</Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n {selectedCol?.displayName || selectedUid}\n </Badge>\n </Flex>\n\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Total Detected Records:</Typography>\n <Typography fontWeight=\"bold\" textColor=\"primary600\">\n {allParsedRecords.length.toLocaleString()} records\n </Typography>\n </Flex>\n\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Action Breakdown:</Typography>\n <Flex gap={2}>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 🔄 {allParsedRecords.filter((r) => !!extractDocId(r)).length.toLocaleString()} Updates\n </Badge>\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ➕ {allParsedRecords.filter((r) => !extractDocId(r)).length.toLocaleString()} New (No ID)\n </Badge>\n </Flex>\n </Flex>\n\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Import Mode:</Typography>\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral800\">\n {importMode === 'update'\n ? 'Update Only (Exact Document IDs)'\n : importMode === 'create_or_override'\n ? 'Create or Override'\n : 'Smart Auto-Detect'}\n </Badge>\n </Flex>\n\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography fontWeight=\"semiBold\">Publishing Mode:</Typography>\n <Badge\n backgroundColor={publishOnImport ? 'success100' : 'warning100'}\n textColor={publishOnImport ? 'success700' : 'warning700'}\n >\n {publishOnImport ? 'Publish Immediately' : 'Keep as Draft'}\n </Badge>\n </Flex>\n\n {preflightReport && (\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginTop={2} paddingTop={2} style={{ borderTop: '1px solid #eaeaef' }}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Pre-Flight Status:\n </Typography>\n <Typography\n variant=\"pi\"\n fontWeight=\"bold\"\n textColor={preflightReport.hasErrors ? 'danger700' : preflightReport.hasWarnings ? 'warning700' : 'success700'}\n >\n {preflightReport.hasErrors\n ? `⚠️ ${preflightReport.totalErrorCount} errors found`\n : preflightReport.hasWarnings\n ? `⚡ Passed with ${preflightReport.totalWarningCount} warnings`\n : '✅ 100% Passed'}\n </Typography>\n </Flex>\n )}\n </Flex>\n </Box>\n\n {/* Lifecycle Status Breakdown */}\n {preflightReport?.lifecycleStats && preflightReport.lifecycleStats.isDraftAndPublish && (\n <Box marginBottom={4} padding={3} background=\"neutral100\" hasRadius style={{ border: '1px solid rgba(120, 120, 150, 0.15)' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={2} display=\"block\">\n LIFECYCLE STATUS BREAKDOWN ({preflightReport.lifecycleStats.totalChecked} Existing Records)\n </Typography>\n <Flex gap={2} wrap=\"wrap\">\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ Published / Approved: {preflightReport.lifecycleStats.published}\n </Badge>\n {preflightReport.lifecycleStats.modified > 0 && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 📝 Modified (Unreviewed Revisions): {preflightReport.lifecycleStats.modified}\n </Badge>\n )}\n {preflightReport.lifecycleStats.draft > 0 && (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral800\">\n 📄 Draft (Never Published): {preflightReport.lifecycleStats.draft}\n </Badge>\n )}\n </Flex>\n </Box>\n )}\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 operations 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 checked={publishOnImport}\n onValueChange={(val: boolean) => setPublishOnImport(Boolean(val))}\n />\n <Box style={{ cursor: 'pointer' }} onClick={() => setPublishOnImport(!publishOnImport)}>\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 {/* Publishing Strategy Selection when Auto-Publish is Enabled */}\n {publishOnImport && (\n <Box\n padding={4}\n background=\"neutral100\"\n hasRadius\n marginBottom={4}\n style={{ border: '1px solid #d9d8ff' }}\n >\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={3} display=\"block\">\n PUBLISHING STRATEGY & GOVERNANCE\n </Typography>\n <Flex direction=\"column\" gap={3}>\n {/* Strategy 1: Publish All (Default for Auto-Publish) */}\n <Box\n padding={3}\n hasRadius\n style={{\n border: publishStrategy === 'all' ? '2px solid #4945ff' : '1px solid #eaeaef',\n backgroundColor: publishStrategy === 'all' ? '#f0f0ff' : '#ffffff',\n cursor: 'pointer',\n }}\n onClick={() => {\n setPublishStrategy('all');\n setUnreviewedConsent(true);\n }}\n >\n <Flex gap={2} alignItems=\"flex-start\">\n <input\n type=\"radio\"\n id=\"csv-strategy-all\"\n name=\"csvPublishStrategy\"\n checked={publishStrategy === 'all'}\n onChange={() => {\n setPublishStrategy('all');\n setUnreviewedConsent(true);\n }}\n style={{ marginTop: 3 }}\n />\n <Box>\n <Typography fontWeight=\"bold\" textColor=\"primary700\" display=\"block\">\n 🚀 Publish All Imported Records Live (Immediate)\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Publish all affected records live to production immediately upon import execution.\n </Typography>\n </Box>\n </Flex>\n </Box>\n\n {/* Strategy 2: Safe Publishing */}\n <Box\n padding={3}\n hasRadius\n style={{\n border: publishStrategy === 'safe' ? '2px solid #4945ff' : '1px solid #eaeaef',\n backgroundColor: publishStrategy === 'safe' ? '#f0f0ff' : '#ffffff',\n cursor: 'pointer',\n }}\n onClick={() => {\n setPublishStrategy('safe');\n setUnreviewedConsent(false);\n }}\n >\n <Flex gap={2} alignItems=\"flex-start\">\n <input\n type=\"radio\"\n id=\"csv-strategy-safe\"\n name=\"csvPublishStrategy\"\n checked={publishStrategy === 'safe'}\n onChange={() => {\n setPublishStrategy('safe');\n setUnreviewedConsent(false);\n }}\n style={{ marginTop: 3 }}\n />\n <Box>\n <Typography fontWeight=\"bold\" display=\"block\">\n 🛡️ Safe Publishing (Only Publish Pre-Approved Live Records)\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Only publish records that are already approved & live. Any unreviewed or draft records will receive the CSV update in Draft mode without publishing to visitors.\n </Typography>\n </Box>\n </Flex>\n </Box>\n </Flex>\n </Box>\n )}\n\n {/* Change Request / Release Notes */}\n <Box marginBottom={2}>\n <TextInput\n label=\"Change Request / Release Notes (Optional)\"\n name=\"makerNotes\"\n placeholder=\"e.g. REL-5040: Bulk updating catalog attributes via CSV\"\n value={makerNotesInput}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setMakerNotesInput(e.target.value)}\n />\n </Box>\n </Box>\n\n {/* Modal Footer */}\n {(() => {\n const isConsentRequired = publishOnImport && (preflightReport?.lifecycleStats?.unreviewedCount ?? 0) > 0 && publishStrategy === 'all' && !unreviewedConsent;\n return (\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={() => submitBatchWithMode('maker_checker')}\n loading={submittingBatch}\n disabled={isConsentRequired}\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={() => submitBatchWithMode('queue_offpeak')}\n loading={submittingBatch}\n disabled={isConsentRequired}\n >\n Queue for Off-Peak ({executionWindow?.offPeakStartTime || '18:00'})\n </Button>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => submitBatchWithMode('immediate', true)}\n loading={importing}\n disabled={isConsentRequired}\n >\n Force Run Now\n </Button>\n </>\n ) : (\n <Button\n variant=\"default\"\n size=\"M\"\n onClick={() => submitBatchWithMode('immediate')}\n loading={importing}\n disabled={isConsentRequired}\n >\n Confirm & Execute Now\n </Button>\n )}\n </Flex>\n </Flex>\n </Box>\n );\n })()}\n </Box>\n </div>\n )}\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 lifecycleStats?: {\n published: number;\n modified: number;\n draft: number;\n pendingReview: number;\n unreviewedCount: number;\n };\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 lifecycleStats,\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 {/* Unreviewed Content Notice */}\n {publishOnApproval && lifecycleStats && lifecycleStats.unreviewedCount > 0 && (\n <Box marginBottom={4} padding={3} background=\"warning100\" hasRadius style={{ border: '1px solid #f5c0b8' }}>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"warning700\">\n ⚠️ Safe Publishing Active:\n </Typography>\n <Typography variant=\"pi\" textColor=\"warning700\">\n {lifecycleStats.unreviewedCount} target record(s) contain unreviewed draft changes ({lifecycleStats.draft} Draft, {lifecycleStats.modified} Modified).\n By default, these will be updated as drafts without publishing unreviewed revisions to production visitors.\n </Typography>\n </Flex>\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, { useState, useEffect, useMemo } from 'react';\nimport { useFetchClient, useNotification } from '@strapi/strapi/admin';\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, Download, ArrowClockwise } from '@strapi/icons';\n\nexport interface DiffItem {\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' | 'will_create' | 'unchanged' | 'will_skip';\n action?: 'update' | 'create' | 'publish' | 'skip';\n message: string;\n}\n\nexport interface DiffSummary {\n total: number;\n willUpdate: number;\n willCreate?: number;\n unchanged: number;\n skipped: number;\n}\n\ninterface CheckerReviewModalProps {\n isOpen: boolean;\n onClose: () => void;\n batch: any | null;\n onApprove: (batchId: string) => Promise<void>;\n onReject: (batchId: string, reason: string) => Promise<void>;\n approving: boolean;\n rejecting: boolean;\n}\n\nconst CheckerReviewModal: React.FC<CheckerReviewModalProps> = ({\n isOpen,\n onClose,\n batch,\n onApprove,\n onReject,\n approving,\n rejecting,\n}) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [diffs, setDiffs] = useState<DiffItem[]>([]);\n const [summary, setSummary] = useState<DiffSummary>({\n total: 0,\n willUpdate: 0,\n willCreate: 0,\n unchanged: 0,\n skipped: 0,\n });\n const [filterTab, setFilterTab] = useState<'all' | 'changes' | 'will_update' | 'will_create' | 'unchanged' | 'will_skip'>('all');\n const [searchQuery, setSearchQuery] = useState<string>('');\n const [isExporting, setIsExporting] = useState<boolean>(false);\n const [showRejectInput, setShowRejectInput] = useState<boolean>(false);\n const [rejectionReason, setRejectionReason] = useState<string>('');\n\n const fetchBatchDiffs = async () => {\n if (!batch || !batch.id) return;\n try {\n setLoading(true);\n setError(null);\n const res = await get(`/bulk-updater/batches/${batch.id}/diffs`);\n if (res.data && res.data.success) {\n setDiffs(res.data.diffs || []);\n setSummary({\n total: res.data.summary?.total ?? res.data.diffs?.length ?? 0,\n willUpdate: res.data.summary?.willUpdate ?? 0,\n willCreate: res.data.summary?.willCreate ?? 0,\n unchanged: res.data.summary?.unchanged ?? 0,\n skipped: res.data.summary?.skipped ?? 0,\n });\n } else {\n setError(res.data?.error || 'Failed to inspect pending batch changes.');\n }\n } catch (err: any) {\n setError(err.message || 'An error occurred while fetching batch diffs.');\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (isOpen && batch) {\n setShowRejectInput(false);\n setRejectionReason('');\n setFilterTab('all');\n setSearchQuery('');\n fetchBatchDiffs();\n }\n }, [isOpen, batch?.id]);\n\n const handleExportCsv = async () => {\n if (!batch || !batch.id) return;\n try {\n setIsExporting(true);\n const res = await get(`/bulk-updater/batches/${batch.id}/diffs/export`);\n if (res.data && res.data.success && res.data.csvContent) {\n const safeContent = res.data.csvContent.startsWith('\\uFEFF')\n ? res.data.csvContent\n : '\\uFEFF' + res.data.csvContent;\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 || `batch_${batch.id}_review.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 || diffs.length} batch changes to audit CSV.`,\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: 'Failed to generate review CSV export.',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Error downloading review CSV.',\n });\n } finally {\n setIsExporting(false);\n }\n };\n\n const filteredDiffs = useMemo(() => {\n let items = diffs;\n\n if (filterTab === 'changes') {\n items = items.filter((d) => d.hasChange || d.status === 'will_create');\n } else if (filterTab === 'will_update') {\n items = items.filter((d) => d.status === 'will_update');\n } else if (filterTab === 'will_create') {\n items = items.filter((d) => d.status === 'will_create');\n } else if (filterTab === 'unchanged') {\n items = items.filter((d) => d.status === 'unchanged');\n } else if (filterTab === 'will_skip') {\n items = items.filter((d) => d.status === 'will_skip');\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 d.attribute?.toLowerCase().includes(q) ||\n String(d.oldDisplay || '').toLowerCase().includes(q) ||\n String(d.newDisplay || '').toLowerCase().includes(q)\n );\n }\n\n return items;\n }, [diffs, filterTab, searchQuery]);\n\n if (!isOpen || !batch) return null;\n\n const totalChanges = (summary.willUpdate || 0) + (summary.willCreate || 0);\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(20, 20, 30, 0.75)',\n backdropFilter: 'blur(4px)',\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: 1160,\n width: '96%',\n maxHeight: 'calc(100vh - 40px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative',\n boxShadow: '0 24px 50px rgba(0, 0, 0, 0.4), 0 0 1px rgba(0, 0, 0, 0.25)',\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* 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=\"flex-start\" wrap=\"wrap\" gap={3}>\n <Box>\n <Flex gap={2} alignItems=\"center\" marginBottom={1}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Checker Approval: Bulk Change Inspection\n </Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n {batch.id}\n </Badge>\n {(batch.payload?.action === 'csv_import' || batch.id?.startsWith('csv_')) && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n 📊 CSV IMPORT\n </Badge>\n )}\n {batch.payload?.action === 'publish' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n 🚀 BULK PUBLISH\n </Badge>\n )}\n </Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Submitted by <strong>{batch.createdBy?.email || 'admin'}</strong> on {new Date(batch.createdAt).toLocaleString()}\n </Typography>\n {batch.makerNotes && (\n <Box marginTop={2} padding={2} background=\"neutral150\" hasRadius style={{ borderLeft: '3px solid #4945ff' }}>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n <strong>Maker Notes:</strong> {batch.makerNotes}\n </Typography>\n </Box>\n )}\n </Box>\n\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Download />}\n onClick={handleExportCsv}\n loading={isExporting}\n >\n Export Audit CSV\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<ArrowClockwise />}\n onClick={fetchBatchDiffs}\n loading={loading}\n >\n Refresh\n </Button>\n </Flex>\n </Flex>\n </Box>\n\n {/* 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 Generating Itemized Diffs...\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Comparing proposed values against current database records.\n </Typography>\n </Flex>\n </Box>\n ) : error ? (\n <Box padding={6} style={{ textAlign: 'center' }}>\n <Typography variant=\"delta\" textColor=\"danger700\" fontWeight=\"bold\">\n Failed to load change diffs\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral700\" display=\"block\" marginTop={1}>\n {error}\n </Typography>\n </Box>\n ) : (\n <>\n {/* 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: 130, 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 {summary.total}\n </Typography>\n </Box>\n\n <Box\n padding={3}\n background=\"warning100\"\n hasRadius\n style={{ flex: 1, minWidth: 130, border: '1px solid #ffd591' }}\n >\n <Typography variant=\"sigma\" textColor=\"warning700\" display=\"block\">\n WILL UPDATE\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"warning700\">\n {summary.willUpdate}\n </Typography>\n </Box>\n\n {(summary.willCreate ?? 0) > 0 && (\n <Box\n padding={3}\n background=\"success100\"\n hasRadius\n style={{ flex: 1, minWidth: 130, border: '1px solid #b7eb8f' }}\n >\n <Typography variant=\"sigma\" textColor=\"success700\" display=\"block\">\n WILL CREATE (NEW)\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"success700\">\n {summary.willCreate}\n </Typography>\n </Box>\n )}\n\n <Box\n padding={3}\n background=\"neutral100\"\n hasRadius\n style={{ flex: 1, minWidth: 130, border: '1px solid rgba(120, 120, 150, 0.15)' }}\n >\n <Typography variant=\"sigma\" textColor=\"neutral600\" display=\"block\">\n UNCHANGED\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"neutral600\">\n {summary.unchanged}\n </Typography>\n </Box>\n\n {summary.skipped > 0 && (\n <Box\n padding={3}\n background=\"danger100\"\n hasRadius\n style={{ flex: 1, minWidth: 130, border: '1px solid #ffa39e' }}\n >\n <Typography variant=\"sigma\" textColor=\"danger700\" display=\"block\">\n SKIPPED / ERRORS\n </Typography>\n <Typography variant=\"beta\" fontWeight=\"bold\" textColor=\"danger700\">\n {summary.skipped}\n </Typography>\n </Box>\n )}\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 Items ({diffs.length})\n </Button>\n <Button\n variant={filterTab === 'changes' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('changes')}\n >\n Changes Only ({totalChanges})\n </Button>\n <Button\n variant={filterTab === 'will_update' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('will_update')}\n >\n Updates ({summary.willUpdate})\n </Button>\n {(summary.willCreate ?? 0) > 0 && (\n <Button\n variant={filterTab === 'will_create' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('will_create')}\n >\n Creates ({summary.willCreate})\n </Button>\n )}\n <Button\n variant={filterTab === 'unchanged' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('unchanged')}\n >\n Unchanged ({summary.unchanged})\n </Button>\n {summary.skipped > 0 && (\n <Button\n variant={filterTab === 'will_skip' ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => setFilterTab('will_skip')}\n >\n Skipped ({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={6} rowCount={filteredDiffs.length + 1} style={{ width: '100%', minWidth: 880 }}>\n <Thead>\n <Tr>\n <Th style={{ width: 140 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">COLLECTION</Typography>\n </Th>\n <Th style={{ minWidth: 180 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">RECORD IDENTIFIER</Typography>\n </Th>\n <Th style={{ minWidth: 140 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">ATTRIBUTE</Typography>\n </Th>\n <Th style={{ minWidth: 180 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">CURRENT VALUE (BEFORE)</Typography>\n </Th>\n <Th style={{ minWidth: 180 }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">PROPOSED VALUE (AFTER)</Typography>\n </Th>\n <Th style={{ width: 130, textAlign: 'right' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">IMPACT</Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {filteredDiffs.length === 0 ? (\n <Tr>\n <Td colSpan={6} 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, idx) => (\n <Tr key={`${diff.uid}-${diff.documentId}-${diff.attribute}-${idx}`}>\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 variant=\"omega\" fontWeight=\"semiBold\">\n {diff.attribute}\n </Typography>\n </Td>\n <Td>\n <Typography\n variant=\"omega\"\n style={{\n color: diff.hasChange ? '#9254de' : '#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_create' ? (\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"success700\" style={{ wordBreak: 'break-all' }}>\n {diff.newDisplay || '(new value)'}\n </Typography>\n ) : diff.status === 'will_skip' ? (\n <Typography variant=\"pi\" textColor=\"warning700\">\n — Skipped —\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 || '(matching)'}\n </Typography>\n )}\n </Td>\n <Td style={{ textAlign: 'right' }}>\n {diff.status === 'will_create' && (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n + Will Create\n </Badge>\n )}\n {diff.status === 'will_update' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\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=\"danger100\" textColor=\"danger700\">\n ⚠ Will Skip\n </Badge>\n )}\n </Td>\n </Tr>\n ))\n )}\n </Tbody>\n </Table>\n </Box>\n </>\n )}\n\n {/* Rejection input popover / drawer */}\n {showRejectInput && (\n <Box marginTop={4} padding={4} background=\"danger100\" hasRadius style={{ border: '1px solid #ffa39e' }}>\n <Typography variant=\"delta\" fontWeight=\"bold\" textColor=\"danger700\" marginBottom={2}>\n Reject Batch\n </Typography>\n <Typography variant=\"pi\" textColor=\"danger700\" marginBottom={2} display=\"block\">\n Please provide a rejection note explaining why this batch was declined. The Maker will see this message.\n </Typography>\n <TextInput\n placeholder=\"Reason for rejection (e.g., incorrect localized prices in CSV rows 4-8)...\"\n value={rejectionReason}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setRejectionReason(e.target.value)}\n style={{ marginBottom: 12 }}\n />\n <Flex gap={2} justifyContent=\"flex-end\">\n <Button variant=\"tertiary\" size=\"S\" onClick={() => setShowRejectInput(false)}>\n Cancel\n </Button>\n <Button\n variant=\"danger\"\n size=\"S\"\n loading={rejecting}\n onClick={() => onReject(batch.id, rejectionReason || 'Declined by Checker')}\n >\n Confirm Rejection\n </Button>\n </Flex>\n </Box>\n )}\n </Box>\n\n {/* 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\" wrap=\"wrap\" gap={3}>\n <Button variant=\"tertiary\" onClick={onClose} disabled={approving || rejecting}>\n Close Preview\n </Button>\n\n <Flex gap={3}>\n {!showRejectInput && (\n <Button\n variant=\"danger-light\"\n onClick={() => setShowRejectInput(true)}\n disabled={approving || rejecting}\n >\n Reject Batch\n </Button>\n )}\n <Button\n variant=\"success\"\n startIcon={<Check />}\n onClick={() => onApprove(batch.id)}\n loading={approving}\n disabled={rejecting}\n >\n Approve & Execute Batch\n </Button>\n </Flex>\n </Flex>\n </Box>\n </Box>\n </div>\n );\n};\n\nexport default CheckerReviewModal;\n","export interface Entry {\n id?: number | string;\n documentId?: string;\n slug?: string;\n status?: string;\n publishedAt?: string | null;\n published_at?: string | null;\n updatedAt?: string | null;\n updated_at?: string | null;\n [key: string]: any;\n}\n\nexport interface CollectionModel {\n uid: string;\n draftAndPublish?: boolean;\n [key: string]: any;\n}\n\nexport interface PendingBatch {\n status: string;\n payload?: {\n selectedEntries?: Array<{ documentId?: string; id?: string | number; [key: string]: any }>;\n [key: string]: any;\n };\n [key: string]: any;\n}\n\nexport interface LifecycleStatusResult {\n status: 'pending_review' | 'modified' | 'published' | 'draft' | 'unknown';\n label: string;\n badgeColor: string;\n textColor: string;\n}\n\n/**\n * Determines the real lifecycle status of an entry (Pending Review, Modified, Published, Draft, Unknown).\n */\nexport function getEntryLifecycleStatus(\n entry: Entry,\n col: CollectionModel | null,\n pendingBatches: PendingBatch[] = []\n): LifecycleStatusResult {\n // 1. Check if this entry is pending review in any pending_approval batch\n const isPendingApproval = pendingBatches.some((b) => {\n if (b.status !== 'pending_approval') return false;\n const targets = b.payload?.selectedEntries || [];\n return targets.some((t) => (entry.documentId && t.documentId === entry.documentId) || String(t.documentId) === String(entry.id));\n });\n\n if (isPendingApproval) {\n return {\n status: 'pending_review',\n label: 'Pending Review',\n badgeColor: 'warning100',\n textColor: 'warning700',\n };\n }\n\n // 2. Collections without draft/publish support are always Published\n if (col && col.draftAndPublish === false) {\n return {\n status: 'published',\n label: 'Published',\n badgeColor: 'success100',\n textColor: 'success700',\n };\n }\n\n // 3. Check explicit status property (populated by backend or metadata)\n if (entry.status === 'modified') {\n return {\n status: 'modified',\n label: 'Modified',\n badgeColor: 'primary100',\n textColor: 'primary700',\n };\n }\n\n if (entry.status === 'draft') {\n return {\n status: 'draft',\n label: 'Draft',\n badgeColor: 'neutral150',\n textColor: 'neutral700',\n };\n }\n\n if (entry.status === 'published') {\n return {\n status: 'published',\n label: 'Published',\n badgeColor: 'success100',\n textColor: 'success700',\n };\n }\n\n if (entry.status === 'unknown') {\n return {\n status: 'unknown',\n label: 'Unknown',\n badgeColor: 'neutral200',\n textColor: 'neutral600',\n };\n }\n\n // 4. Missing required identifiers -> cannot be resolved safely\n if (!entry.documentId && !entry.id && !entry.slug) {\n return {\n status: 'unknown',\n label: 'Unknown',\n badgeColor: 'neutral200',\n textColor: 'neutral600',\n };\n }\n\n // 5. Fallback: check publication timestamps\n if (entry.publishedAt) {\n if (entry.updatedAt && new Date(entry.updatedAt).getTime() > new Date(entry.publishedAt).getTime()) {\n return {\n status: 'modified',\n label: 'Modified',\n badgeColor: 'primary100',\n textColor: 'primary700',\n };\n }\n return {\n status: 'published',\n label: 'Published',\n badgeColor: 'success100',\n textColor: 'success700',\n };\n }\n\n return {\n status: 'draft',\n label: 'Draft',\n badgeColor: 'neutral150',\n textColor: 'neutral700',\n };\n}\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, Cog } from '@strapi/icons';\nimport ValidationRulesTab from './ValidationRulesTab';\nimport CsvManagerTab from './CsvManagerTab';\nimport ProcessingDashboardModal from '../components/ProcessingDashboardModal';\nimport BulkUpdatePreviewModal from '../components/BulkUpdatePreviewModal';\nimport CheckerReviewModal from '../components/CheckerReviewModal';\nimport { isAbortError } from '../utils/isAbortError';\nimport { getEntryLifecycleStatus } from '../utils/lifecycleStatus';\nexport { getEntryLifecycleStatus } from '../utils/lifecycleStatus';\n\ninterface Entry {\n id: number | string;\n documentId: string;\n status?: 'draft' | 'published' | 'modified' | 'unknown' | 'pending_review' | string;\n publishedAt?: string | null;\n updatedAt?: string | null;\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 attributesMeta?: Record<string, { depth: number; type: string; component?: string; isRelation?: boolean }>;\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 publishOnApproval?: boolean;\n publishStrategy?: 'safe' | 'all';\n unreviewedConsent?: boolean;\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 action?: string;\n attribute: string;\n value: string;\n selectedEntries?: Array<{ uid: string; documentId: string; dynamicZoneIndexes?: number[] }>;\n selectedCollections?: string[];\n isRegex?: boolean;\n regexPattern?: string;\n publishOnApproval?: boolean;\n publishStrategy?: 'safe' | 'all';\n unreviewedConsent?: boolean;\n unreviewedCount?: number;\n rows?: any[];\n uid?: string;\n options?: any;\n };\n summary: {\n attribute: string;\n value: string;\n totalTargets: number;\n collectionBreakdown: Record<string, number>;\n publishOnApproval?: boolean;\n publishStrategy?: 'safe' | 'all';\n unreviewedConsent?: boolean;\n unreviewedCount?: number;\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 * Parses dynamic zone dot or bracket notation paths:\n * e.g. \"blocks.title\", \"blocks[shared.heading].title\", or \"blocks[0].title\"\n */\nexport function parseDynamicZonePath(path: string): {\n cleanPath: string;\n rootKey: string;\n subPath: string;\n targetComponentUid?: string;\n targetIndex?: number;\n} {\n if (!path) return { cleanPath: '', rootKey: '', subPath: '' };\n const bracketMatch = path.match(/^([^.[]+)\\[([^\\]]+)\\]\\.(.+)$/);\n if (bracketMatch) {\n const rootKey = bracketMatch[1];\n const selector = bracketMatch[2];\n const subPath = bracketMatch[3];\n const cleanPath = `${rootKey}.${subPath}`;\n if (/^\\d+$/.test(selector)) {\n return { cleanPath, rootKey, subPath, targetIndex: parseInt(selector, 10) };\n }\n return { cleanPath, rootKey, subPath, targetComponentUid: selector };\n }\n\n const parts = path.split('.');\n return {\n cleanPath: path,\n rootKey: parts[0] || '',\n subPath: parts.slice(1).join('.'),\n };\n}\n\n/**\n * Formats a component UID into a friendly readable label (e.g. \"shared.featured-section\" -> \"Featured Section\")\n */\nexport function formatComponentName(compUid?: string): string {\n if (!compUid) return 'Component';\n const name = compUid.includes('.') ? compUid.split('.')[1] : compUid;\n return name\n .split(/[-_]/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nexport interface DynamicZoneItemMatch {\n index: number;\n componentUid?: string;\n componentName?: string;\n value: any;\n path: string;\n}\n\n/**\n * Extracts all matching instances of a nested property across dynamic zone components or repeatable arrays.\n */\nexport function getAllNestedValues(\n obj: any,\n path: string,\n availableAttributes?: string[]\n): DynamicZoneItemMatch[] {\n if (!obj || !path) return [];\n const parsed = parseDynamicZonePath(path);\n const parts = parsed.cleanPath.split('.');\n const [head, ...tail] = parts;\n\n const rootTarget = getPropertyValue(obj, head);\n\n // If rootTarget is an Array (Dynamic Zone or Repeatable Component)\n if (Array.isArray(rootTarget)) {\n const results: DynamicZoneItemMatch[] = [];\n rootTarget.forEach((item, idx) => {\n if (!item || typeof item !== 'object') return;\n if (parsed.targetIndex !== undefined && idx !== parsed.targetIndex) return;\n if (parsed.targetComponentUid && item.__component !== parsed.targetComponentUid) return;\n\n const subPath = tail.join('.');\n const scopedPath = item.__component ? `${head}[${item.__component}].${subPath}` : '';\n const isSupported = availableAttributes ? availableAttributes.includes(scopedPath) : false;\n\n const subVal = tail.length > 0 ? getNestedValue(item, subPath) : item;\n if (subVal !== undefined || isSupported) {\n results.push({\n index: idx,\n componentUid: item.__component,\n componentName: formatComponentName(item.__component),\n value: subVal !== undefined ? subVal : null,\n path: `${head}[#${idx}${item.__component ? ` ${formatComponentName(item.__component)}` : ''}].${subPath}`,\n });\n }\n });\n return results;\n }\n\n // Not an array, standard object resolution\n const singleVal = getNestedValue(obj, parsed.cleanPath);\n if (singleVal !== undefined) {\n return [\n {\n index: 0,\n value: singleVal,\n path: parsed.cleanPath,\n },\n ];\n }\n\n return [];\n}\n\n/**\n * Robust property value resolver:\n * Matches direct key, snake_case <-> camelCase aliases (e.g. updated_at <-> updatedAt, created_at <-> createdAt),\n * and case-insensitive fallback.\n */\nexport function getPropertyValue(target: any, key: string): any {\n if (!target || typeof target !== 'object' || !key) return undefined;\n\n // 1. Direct match\n if (target[key] !== undefined && target[key] !== null) return target[key];\n\n // 2. snake_case -> camelCase (e.g. updated_at -> updatedAt, created_at -> createdAt)\n const camelKey = key.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());\n if (target[camelKey] !== undefined && target[camelKey] !== null) return target[camelKey];\n\n // 3. camelCase -> snake_case (e.g. updatedAt -> updated_at, createdAt -> created_at)\n const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();\n if (target[snakeKey] !== undefined && target[snakeKey] !== null) return target[snakeKey];\n\n // 4. Case-insensitive / underscore-insensitive match\n const lowerKey = key.toLowerCase();\n const lowerNoUnderscore = lowerKey.replace(/_/g, '');\n const matchedKey = Object.keys(target).find((k) => {\n const kLower = k.toLowerCase();\n return kLower === lowerKey || kLower.replace(/_/g, '') === lowerNoUnderscore;\n });\n if (matchedKey && target[matchedKey] !== undefined && target[matchedKey] !== null) {\n return target[matchedKey];\n }\n\n // 5. Fallback: check key presence\n if (key in target) return target[key];\n if (camelKey in target) return target[camelKey];\n if (snakeKey in target) return target[snakeKey];\n\n return undefined;\n}\n\n/**\n * Safely resolves a nested dot-notation property across objects and dynamic zone / repeatable component arrays.\n */\nexport function getNestedValue(obj: any, path: string): any {\n if (!obj || !path) return undefined;\n const parsed = parseDynamicZonePath(path);\n const parts = parsed.cleanPath.split('.');\n\n function extract(current: any, remainingParts: string[]): any {\n if (current === undefined || current === null) return undefined;\n if (remainingParts.length === 0) return current;\n\n const [head, ...tail] = remainingParts;\n\n if (Array.isArray(current)) {\n if (/^\\d+$/.test(head)) {\n return extract(current[parseInt(head, 10)], tail);\n }\n for (let idx = 0; idx < current.length; idx++) {\n const item = current[idx];\n if (parsed.targetIndex !== undefined && idx !== parsed.targetIndex) continue;\n if (parsed.targetComponentUid && item?.__component !== parsed.targetComponentUid) continue;\n const found = extract(getPropertyValue(item, head), tail);\n if (found !== undefined && found !== null) return found;\n }\n return undefined;\n }\n\n return extract(getPropertyValue(current, head), tail);\n }\n\n return extract(obj, parts);\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 searchAttribute?: 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 || (searchAttribute && attr === searchAttribute)) {\n return;\n }\n let formattedLabel = attr;\n if (attr === 'updated_at' || attr === 'updatedAt') {\n formattedLabel = 'Updated At';\n } else if (attr === 'created_at' || attr === 'createdAt') {\n formattedLabel = 'Created At';\n } else if (attr === 'published_at' || attr === 'publishedAt') {\n formattedLabel = 'Published At';\n } else {\n const bracketMatch = attr.match(/^([^.[]+)\\[([^\\]]+)\\]\\.(.+)$/);\n if (bracketMatch) {\n const root = bracketMatch[1].charAt(0).toUpperCase() + bracketMatch[1].slice(1);\n const comp = formatComponentName(bracketMatch[2]);\n const sub = bracketMatch[3].split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n formattedLabel = `${root} [${comp}] > ${sub}`;\n } else if (attr.includes('.')) {\n formattedLabel = attr.split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n } else {\n formattedLabel = attr.replace(/_/g, ' ').replace(/\\b\\w/g, (l) => l.toUpperCase());\n }\n }\n\n cols.push({\n key: `attr_${attr}`,\n label: formattedLabel,\n sortable: !col.isSingleType,\n defaultVisible: ['department', 'email', 'location', 'updated_at', 'updatedAt'].includes(attr),\n });\n });\n\n // Ensure system timestamp columns are available to show/hide in the column picker if not already present\n const hasUpdatedAt = candidateAttrs.some((a) => a === 'updatedAt' || a === 'updated_at');\n const hasCreatedAt = candidateAttrs.some((a) => a === 'createdAt' || a === 'created_at');\n const hasPublishedAt = candidateAttrs.some((a) => a === 'publishedAt' || a === 'published_at');\n\n if (!hasUpdatedAt) {\n cols.push({\n key: 'attr_updatedAt',\n label: 'Updated At',\n sortable: !col.isSingleType,\n defaultVisible: false,\n });\n }\n if (!hasCreatedAt) {\n cols.push({\n key: 'attr_createdAt',\n label: 'Created At',\n sortable: !col.isSingleType,\n defaultVisible: false,\n });\n }\n if (!hasPublishedAt && col.draftAndPublish) {\n cols.push({\n key: 'attr_publishedAt',\n label: 'Published At',\n sortable: !col.isSingleType,\n defaultVisible: false,\n });\n }\n\n // Dedicated search attribute column if searchAttribute differs from selectedAttribute\n if (searchAttribute && searchAttribute !== selectedAttribute) {\n let formattedSearchLabel = searchAttribute;\n const bracketMatch = searchAttribute.match(/^([^.[]+)\\[([^\\]]+)\\]\\.(.+)$/);\n if (bracketMatch) {\n const root = bracketMatch[1].charAt(0).toUpperCase() + bracketMatch[1].slice(1);\n const comp = formatComponentName(bracketMatch[2]);\n const sub = bracketMatch[3].split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n formattedSearchLabel = `${root} [${comp}] > ${sub}`;\n } else if (searchAttribute.includes('.')) {\n formattedSearchLabel = searchAttribute.split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n }\n\n cols.push({\n key: 'search_attr',\n label: `Search: \"${formattedSearchLabel}\"`,\n sortable: !col.isSingleType && col.attributes.includes(searchAttribute),\n defaultVisible: true,\n });\n }\n\n // Target attribute column (only if an update attribute has been selected)\n if (selectedAttribute && selectedAttribute.trim()) {\n let formattedTargetLabel = selectedAttribute;\n const bracketMatch = selectedAttribute.match(/^([^.[]+)\\[([^\\]]+)\\]\\.(.+)$/);\n if (bracketMatch) {\n const root = bracketMatch[1].charAt(0).toUpperCase() + bracketMatch[1].slice(1);\n const comp = formatComponentName(bracketMatch[2]);\n const sub = bracketMatch[3].split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n formattedTargetLabel = `${root} [${comp}] > ${sub}`;\n } else if (selectedAttribute.includes('.')) {\n formattedTargetLabel = selectedAttribute.split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n }\n\n const targetLabel = searchAttribute && searchAttribute !== selectedAttribute\n ? `Update Target: \"${formattedTargetLabel}\"`\n : `Current \"${formattedTargetLabel}\"`;\n\n cols.push({\n key: 'target_attr',\n label: targetLabel,\n sortable: !col.isSingleType && col.attributes.includes(selectedAttribute),\n defaultVisible: true,\n });\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\nexport interface SortOptionItem {\n field: string;\n order: 'asc' | 'desc';\n label: string;\n columnLabel: string;\n group: 'timestamps' | 'system' | 'attributes';\n}\n\n/**\n * Returns a human-friendly display label of the active sort state.\n */\nexport function getActiveSortLabel(\n currentSort: { field: string; order: 'asc' | 'desc' },\n col: CollectionModel\n): string {\n const f = currentSort.field;\n const o = currentSort.order;\n const dir = o === 'asc' ? '▲' : '▼';\n if (f === 'updatedAt' || f === 'updated_at') {\n return `Updated: ${o === 'desc' ? 'Newest' : 'Oldest'} ${dir}`;\n }\n if (f === 'createdAt' || f === 'created_at') {\n return `Created: ${o === 'desc' ? 'Newest' : 'Oldest'} ${dir}`;\n }\n if (f === 'publishedAt' || f === 'published_at') {\n return `Published: ${o === 'desc' ? 'Newest' : 'Oldest'} ${dir}`;\n }\n if (f === 'id') {\n return `ID: ${o === 'desc' ? 'Highest' : 'Lowest'} ${dir}`;\n }\n let attrLabel = f;\n if (f.includes('.')) {\n attrLabel = f.split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n } else {\n attrLabel = f.replace(/_/g, ' ').replace(/\\b\\w/g, (l) => l.toUpperCase());\n }\n return `${attrLabel} (${o === 'asc' ? 'A → Z' : 'Z → A'} ${dir})`;\n}\n\n/**\n * Generates a complete, searchable list of all sortable columns and directions for a collection.\n */\nexport function getSortOptionsForCollection(\n col: CollectionModel,\n selectedAttribute: string,\n searchAttribute?: string\n): SortOptionItem[] {\n const options: SortOptionItem[] = [];\n\n // 1. Timestamps (Newest / Oldest)\n const hasCustomUpdatedAt = col.attributes?.includes('updated_at');\n const updatedField = hasCustomUpdatedAt ? 'updated_at' : 'updatedAt';\n options.push({\n field: updatedField,\n order: 'desc',\n label: 'Updated At (Newest First ↓)',\n columnLabel: 'Updated At',\n group: 'timestamps',\n });\n options.push({\n field: updatedField,\n order: 'asc',\n label: 'Updated At (Oldest First ↑)',\n columnLabel: 'Updated At',\n group: 'timestamps',\n });\n\n const hasCustomCreatedAt = col.attributes?.includes('created_at');\n const createdField = hasCustomCreatedAt ? 'created_at' : 'createdAt';\n options.push({\n field: createdField,\n order: 'desc',\n label: 'Created At (Newest First ↓)',\n columnLabel: 'Created At',\n group: 'timestamps',\n });\n options.push({\n field: createdField,\n order: 'asc',\n label: 'Created At (Oldest First ↑)',\n columnLabel: 'Created At',\n group: 'timestamps',\n });\n\n if (col.draftAndPublish) {\n const hasCustomPublishedAt = col.attributes?.includes('published_at');\n const publishedField = hasCustomPublishedAt ? 'published_at' : 'publishedAt';\n options.push({\n field: publishedField,\n order: 'desc',\n label: 'Published At (Newest First ↓)',\n columnLabel: 'Published At',\n group: 'timestamps',\n });\n options.push({\n field: publishedField,\n order: 'asc',\n label: 'Published At (Oldest First ↑)',\n columnLabel: 'Published At',\n group: 'timestamps',\n });\n }\n\n // 2. System Identifiers\n options.push({\n field: 'id',\n order: 'desc',\n label: 'Entry ID (Highest First ↓)',\n columnLabel: 'ID',\n group: 'system',\n });\n options.push({\n field: 'id',\n order: 'asc',\n label: 'Entry ID (Lowest First ↑)',\n columnLabel: 'ID',\n group: 'system',\n });\n\n // 3. Collection Attributes\n const systemKeywords = [\n 'createdat',\n 'created_at',\n 'updatedat',\n 'updated_at',\n 'publishedat',\n 'published_at',\n 'id',\n 'documentid',\n ];\n const attrs = (col.attributes || []).filter((a) => !systemKeywords.includes(a.toLowerCase()));\n\n attrs.forEach((attr) => {\n let formattedLabel = attr;\n if (attr.includes('.')) {\n formattedLabel = attr.split('.').map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(' > ');\n } else {\n formattedLabel = attr.replace(/_/g, ' ').replace(/\\b\\w/g, (l) => l.toUpperCase());\n }\n\n options.push({\n field: attr,\n order: 'asc',\n label: `${formattedLabel} (A → Z / Lowest ↑)`,\n columnLabel: formattedLabel,\n group: 'attributes',\n });\n options.push({\n field: attr,\n order: 'desc',\n label: `${formattedLabel} (Z → A / Highest ↓)`,\n columnLabel: formattedLabel,\n group: 'attributes',\n });\n });\n\n return options;\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 searchAttribute: 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' || currentSort.field === 'id')) ||\n (colDef.key === 'search_attr' && currentSort.field === searchAttribute) ||\n (colDef.key === 'target_attr' && currentSort.field === selectedAttribute) ||\n (colDef.key.startsWith('attr_') && (\n currentSort.field === colDef.key.replace('attr_', '') ||\n (currentSort.field === 'updatedAt' && colDef.key === 'attr_updated_at') ||\n (currentSort.field === 'updated_at' && colDef.key === 'attr_updatedAt') ||\n (currentSort.field === 'createdAt' && colDef.key === 'attr_created_at') ||\n (currentSort.field === 'created_at' && colDef.key === 'attr_createdAt') ||\n (currentSort.field === 'publishedAt' && colDef.key === 'attr_published_at') ||\n (currentSort.field === 'published_at' && colDef.key === 'attr_publishedAt')\n ));\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 === 'search_attr') {\n onSort(col.uid, searchAttribute);\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 timestamps, 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 (val instanceof Date) {\n return isNaN(val.getTime()) ? '(invalid date)' : val.toLocaleString();\n }\n if (typeof val === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(val)) {\n const d = new Date(val);\n if (!isNaN(d.getTime())) {\n return d.toLocaleString();\n }\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 searchAttribute: string,\n isMatch: boolean,\n hasAttr: boolean,\n isSelected: boolean,\n onToggleSelect: () => void,\n pendingBatches: PendingBatch[] = [],\n isDzExpanded = false,\n onToggleExpandDz?: () => void,\n filterQuery = ''\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 const dzField = Object.keys(entry).find(\n (k) => Array.isArray(entry[k]) && entry[k].length > 0 && entry[k].some((item: any) => item && item.__component)\n );\n const dzItemsCount = dzField ? entry[dzField].length : 0;\n\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 {dzItemsCount > 0 && (\n <Box marginTop={1}>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={onToggleExpandDz}\n style={{\n padding: '2px 6px',\n height: 'auto',\n fontSize: '0.72rem',\n color: isDzExpanded ? '#4945ff' : '#666687',\n backgroundColor: isDzExpanded ? 'rgba(73, 69, 255, 0.08)' : 'rgba(0, 0, 0, 0.04)',\n borderRadius: 4,\n }}\n >\n {isDzExpanded\n ? `▲ Hide ${dzField} (${dzItemsCount} blocks)`\n : `▼ View ${dzField} (${dzItemsCount} blocks)`}\n </Button>\n </Box>\n )}\n </Box>\n );\n }\n\n case 'search_attr': {\n const matches = getAllNestedValues(entry, searchAttribute, col?.attributes);\n if (matches.length === 0) {\n return (\n <Typography textColor=\"neutral500\" style={{ fontStyle: 'italic' }}>\n (empty / not set)\n </Typography>\n );\n }\n if (matches.length === 1 && !matches[0].componentUid) {\n const displayStr = formatDisplayValue(matches[0].value);\n const isUnset = displayStr === '(empty / not set)' || displayStr === '(empty / unlinked)';\n return (\n <Typography\n textColor={isUnset ? 'neutral500' : 'primary700'}\n fontWeight=\"semiBold\"\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 const qLower = (filterQuery || '').trim().toLowerCase();\n return (\n <Flex direction=\"column\" gap={1} alignItems=\"flex-start\" style={{ maxWidth: 320 }}>\n {matches.map((m) => {\n const displayStr = formatDisplayValue(m.value);\n const isMatchItem = qLower && displayStr.toLowerCase().includes(qLower);\n return (\n <Flex\n key={m.index}\n gap={1}\n alignItems=\"center\"\n style={{\n backgroundColor: isMatchItem ? 'rgba(46, 213, 115, 0.15)' : 'rgba(0, 0, 0, 0.03)',\n padding: '2px 6px',\n borderRadius: 4,\n border: isMatchItem ? '1px solid #2ed573' : '1px solid transparent',\n }}\n >\n <Badge size=\"S\" backgroundColor={isMatchItem ? 'success100' : 'primary100'} textColor={isMatchItem ? 'success700' : 'primary700'}>\n #{m.index} {m.componentName}\n </Badge>\n <Typography\n variant=\"pi\"\n fontWeight={isMatchItem ? 'bold' : 'normal'}\n textColor={isMatchItem ? 'success700' : 'neutral800'}\n style={{\n maxWidth: 200,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {displayStr}\n </Typography>\n </Flex>\n );\n })}\n </Flex>\n );\n }\n\n case 'target_attr': {\n const matches = getAllNestedValues(entry, selectedAttribute, col?.attributes);\n if (matches.length === 0) {\n return (\n <Typography textColor=\"neutral500\" style={{ fontStyle: 'italic' }}>\n (empty / not set)\n </Typography>\n );\n }\n if (matches.length === 1 && !matches[0].componentUid) {\n const displayStr = formatDisplayValue(matches[0].value);\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 return (\n <Flex direction=\"column\" gap={1} alignItems=\"flex-start\" style={{ maxWidth: 320 }}>\n {matches.map((m) => {\n const displayStr = formatDisplayValue(m.value);\n return (\n <Flex\n key={m.index}\n gap={1}\n alignItems=\"center\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.03)',\n padding: '2px 6px',\n borderRadius: 4,\n }}\n >\n <Badge size=\"S\" backgroundColor=\"neutral200\" textColor=\"neutral800\">\n #{m.index} {m.componentName}\n </Badge>\n <Typography\n variant=\"pi\"\n textColor=\"neutral800\"\n style={{\n maxWidth: 200,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {displayStr}\n </Typography>\n </Flex>\n );\n })}\n </Flex>\n );\n }\n\n case 'status': {\n if (selectedAttribute && !hasAttr) {\n return (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral600\">\n Ignored\n </Badge>\n );\n }\n const lifecycle = getEntryLifecycleStatus(entry, col, pendingBatches);\n return (\n <Flex gap={1} alignItems=\"center\">\n <Badge backgroundColor={lifecycle.badgeColor} textColor={lifecycle.textColor}>\n {lifecycle.label}\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 [inspectingPendingBatch, setInspectingPendingBatch] = useState<PendingBatch | null>(null);\n const [exportingPendingBatchId, setExportingPendingBatchId] = useState<string | null>(null);\n const [makerNotesInput, setMakerNotesInput] = useState<string>('');\n const [publishOnApproval, setPublishOnApproval] = useState<boolean>(true);\n const [publishStrategy, setPublishStrategy] = useState<'safe' | 'all'>('safe');\n const [unreviewedConsent, setUnreviewedConsent] = useState<boolean>(false);\n const [publishConsent, setPublishConsent] = useState<boolean>(false);\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 const LAST_COLLECTION_KEY = 'strapi_bulk_updater_last_collection';\n\n const getInitialCollectionUid = (): string => {\n try {\n const stored = localStorage.getItem(LAST_COLLECTION_KEY);\n if (stored) return stored;\n } catch {}\n return '';\n };\n const [selectedCollectionUid, setSelectedCollectionUid] = useState<string>(getInitialCollectionUid);\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 '';\n };\n const [selectedAttribute, setSelectedAttribute] = useState<string>(getInitialAttribute);\n const [attributeValue, setAttributeValue] = useState<string>('');\n const [selectedEntries, setSelectedEntries] = useState<Record<string, boolean>>({});\n const [expandedDzEntries, setExpandedDzEntries] = useState<Record<string, boolean>>({});\n const [selectedDzBlocks, setSelectedDzBlocks] = useState<Record<string, number[]>>({});\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 // Component Nesting Depth Config (User Configurable, 1 to 5)\n const DEPTH_STORAGE_KEY = 'strapi_bulk_updater_component_depth';\n const [componentDepth, setComponentDepth] = useState<number>(() => {\n try {\n const stored = localStorage.getItem(DEPTH_STORAGE_KEY);\n if (stored) {\n const val = Number(stored);\n if (val >= 1 && val <= 5) return val;\n }\n } catch {}\n return 3;\n });\n\n const handleComponentDepthChange = (depth: number) => {\n const capped = Math.min(5, Math.max(1, depth));\n setComponentDepth(capped);\n try {\n localStorage.setItem(DEPTH_STORAGE_KEY, String(capped));\n } catch {}\n };\n\n const [searchRelationOptions, setSearchRelationOptions] = useState<Array<{ documentId: string; label: string }>>([]);\n const [searchRelationOptionsLoading, setSearchRelationOptionsLoading] = useState<boolean>(false);\n\n const fetchSearchRelationOptions = async (targetUid: string) => {\n try {\n setSearchRelationOptionsLoading(true);\n const res = await get(`/bulk-updater/relation-options?targetUid=${encodeURIComponent(targetUid)}`);\n if (res.data && res.data.success) {\n setSearchRelationOptions(res.data.options || []);\n }\n } catch {\n setSearchRelationOptions([]);\n } finally {\n setSearchRelationOptionsLoading(false);\n }\n };\n\n // Search Attribute (separate from update attribute)\n const [searchAttribute, setSearchAttribute] = useState<string>('');\n const [searchAttributeInput, setSearchAttributeInput] = useState<string>('');\n const [attributesMeta, setAttributesMeta] = useState<Record<string, { depth: number; type: string; component?: string; isRelation?: boolean }>>({});\n\n const effectiveSearchAttribute = searchAttribute || selectedAttribute;\n\n useEffect(() => {\n if (effectiveSearchAttribute && relationsMeta[effectiveSearchAttribute]) {\n fetchSearchRelationOptions(relationsMeta[effectiveSearchAttribute].targetUid);\n } else {\n setSearchRelationOptions([]);\n }\n }, [effectiveSearchAttribute, relationsMeta]);\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 type StatusFilter = 'all' | 'pending_review' | 'draft' | 'published' | 'modified' | 'unknown';\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\n\n const isFilterActive =\n Boolean(searchAttribute && searchAttribute !== selectedAttribute) ||\n (filterOperator !== 'none' &&\n (['empty', 'not_empty'].includes(filterOperator) || Boolean(filterQuery.trim()))) ||\n Boolean(entrySearch.trim()) ||\n Boolean(statusFilter !== 'all') ||\n Boolean(useRegex && regexPattern.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 const [columnSearchTerm, setColumnSearchTerm] = useState<string>('');\n const [openSortPickerUid, setOpenSortPickerUid] = useState<string | null>(null);\n const [sortSearchTerm, setSortSearchTerm] = useState<string>('');\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 const previewSlice = (col.entries || []).slice(0, initialPageSize).map((entry: Entry) => {\n if (!entry.status) {\n const lifecycle = getEntryLifecycleStatus(entry, col, pendingBatches);\n return {\n ...entry,\n status: lifecycle.status,\n publishedAt: entry.publishedAt ?? (lifecycle.status === 'published' ? (entry.updatedAt || null) : null),\n };\n }\n return entry;\n });\n pages[col.uid] = {\n page: 1,\n pageSize: initialPageSize,\n total,\n pageCount: col.isSingleType ? 1 : (Math.ceil(total / initialPageSize) || 1),\n entries: previewSlice,\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 if (data.attributesMeta) {\n setAttributesMeta(data.attributesMeta);\n }\n\n let resolvedColUid = selectedCollectionUid;\n let storedCol: string | null = null;\n try {\n storedCol = localStorage.getItem(LAST_COLLECTION_KEY);\n } catch {}\n\n if (!resolvedColUid || !cols.some((c) => c.uid === resolvedColUid)) {\n resolvedColUid = (storedCol && cols.some((c) => c.uid === storedCol)) ? storedCol : (cols[0]?.uid || '');\n }\n setSelectedCollectionUid(resolvedColUid);\n try {\n if (resolvedColUid) localStorage.setItem(LAST_COLLECTION_KEY, resolvedColUid);\n } catch {}\n\n const activeCol = cols.find((c) => c.uid === resolvedColUid) || cols[0];\n const activeAttrs = activeCol?.attributes || [];\n setAttributes(activeAttrs);\n\n let storedAttr: string | null = null;\n try {\n storedAttr = localStorage.getItem(LAST_ATTR_KEY);\n } catch {}\n\n const resolvedAttr =\n storedAttr && activeAttrs.includes(storedAttr)\n ? storedAttr\n : (selectedAttribute && activeAttrs.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 if (!isAbortError(err)) {\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 overrideSearchAttr?: string\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 const searchAttr = overrideSearchAttr !== undefined ? overrideSearchAttr : searchAttribute;\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 (searchAttr && searchAttr !== selectedAttribute) {\n params.set('searchAttribute', searchAttr);\n }\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 // Ensure every entry has a guaranteed lifecycle status field attached\n const col = collections.find((c) => c.uid === colUid) || null;\n const enrichedEntries: Entry[] = fetchedEntries.map((entry) => {\n if (!entry.status) {\n const lifecycle = getEntryLifecycleStatus(entry, col, pendingBatches);\n return {\n ...entry,\n status: lifecycle.status,\n publishedAt: entry.publishedAt ?? (lifecycle.status === 'published' ? (entry.updatedAt || null) : null),\n };\n }\n return entry;\n });\n\n setCollectionPages((prev) => ({\n ...prev,\n [colUid]: {\n page: pageNum,\n pageSize: pageSizeNum,\n total: totalNum,\n pageCount: pageCountNum,\n entries: enrichedEntries,\n loading: false,\n },\n }));\n\n // If a filter or search is active, pre-select all returned matching entries!\n const isFilterActiveNow =\n Boolean(searchAttr && searchAttr !== selectedAttribute) ||\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 if (!isAbortError(err)) {\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 if (!isAbortError(err)) {\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 (selectedCollectionUid) {\n const isFilterActiveNow =\n Boolean(searchAttribute && searchAttribute !== selectedAttribute) ||\n (filterOperator !== 'none' &&\n (['empty', 'not_empty'].includes(filterOperator) || Boolean(filterQuery.trim()))) ||\n Boolean(entrySearch.trim()) ||\n Boolean(useRegex && regexPattern.trim());\n\n if (isFilterActiveNow) {\n setSelectedEntries({});\n }\n\n loadCollectionPage(\n selectedCollectionUid,\n 1,\n undefined,\n undefined,\n undefined,\n filterOperator,\n filterQuery,\n entrySearch,\n true,\n searchAttribute\n );\n }\n }, 350);\n\n return () => clearTimeout(timer);\n }, [selectedCollectionUid, searchAttribute, filterOperator, filterQuery, entrySearch, useRegex, regexPattern]);\n\n const KEY_SEP = '@@@';\n\n const selectedCol = useMemo(() => {\n if (!collections.length) return null;\n return collections.find((c) => c.uid === selectedCollectionUid) || collections[0] || null;\n }, [collections, selectedCollectionUid]);\n\n const handleCollectionChange = (newUid: string) => {\n if (newUid === selectedCollectionUid) return;\n setSelectedCollectionUid(newUid);\n try {\n localStorage.setItem(LAST_COLLECTION_KEY, newUid);\n } catch {}\n\n setSelectedEntries({});\n setSearchAttribute('');\n\n const targetCol = collections.find((c) => c.uid === newUid);\n const colAttrs = targetCol?.attributes || [];\n setAttributes(colAttrs);\n\n if (selectedAttribute && !colAttrs.includes(selectedAttribute)) {\n setSelectedAttribute('');\n try {\n localStorage.removeItem(LAST_ATTR_KEY);\n } catch {}\n setSelectedRelationDocId('');\n setAttributeValue('');\n }\n\n loadCollectionPage(newUid, 1, undefined, undefined, undefined, filterOperator, filterQuery, entrySearch, true, '');\n };\n\n // Handle attribute selection change: updates selectedAttribute without clearing search/filters/selected entries\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 // Keep searchAttribute, selectedEntries, filterOperator, filterQuery, and entrySearch intact\n setSelectedRelationDocId('');\n setAttributeValue('');\n\n if (newAttr && relationsMeta[newAttr]) {\n fetchRelationOptions(relationsMeta[newAttr].targetUid);\n } else {\n setRelationOptions([]);\n }\n }\n };\n\n const filteredCollections = useMemo(() => {\n return selectedCol ? [selectedCol] : [];\n }, [selectedCol]);\n\n const getAttrDepth = (attr: string): number =>\n attributesMeta[attr]?.depth ?? (attr.includes('.') ? attr.split('.').length - 1 : 0);\n\n const availableColAttributes = useMemo(() => {\n return selectedCol?.attributes || attributes || [];\n }, [selectedCol, attributes]);\n\n // Depth-filtered attributes based on user-configured componentDepth (1 to 5)\n const depthFilteredAttributes = useMemo(() => {\n return availableColAttributes.filter((attr) => getAttrDepth(attr) <= componentDepth);\n }, [availableColAttributes, componentDepth, attributesMeta]);\n\n // Memoized Combobox options for Update Attribute\n const memoizedComboboxOptions = useMemo(() => {\n if (depthFilteredAttributes.length === 0) {\n return (\n <ComboboxOption value=\"__none__\" disabled textValue=\"No attributes available\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n No attributes available for this collection type (Depth L{componentDepth})\n </Typography>\n </ComboboxOption>\n );\n }\n\n return depthFilteredAttributes.map((attr) => {\n const rel = relationsMeta[attr];\n const depth = getAttrDepth(attr);\n const badgeText = rel ? `relation ${rel.targetDisplayName}` : depth > 0 ? `L${depth} component` : '';\n const textValue = badgeText ? `${attr} ${badgeText}` : attr;\n return (\n <ComboboxOption key={attr} value={attr} textValue={textValue}>\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 ) : depth > 0 ? (\n <Badge backgroundColor={depth === 1 ? 'neutral150' : depth === 2 ? 'primary100' : 'secondary100'} textColor={depth === 1 ? 'neutral700' : depth === 2 ? 'primary700' : 'secondary700'} size=\"S\">\n L{depth} component\n </Badge>\n ) : null}\n </Flex>\n </ComboboxOption>\n );\n });\n }, [depthFilteredAttributes, relationsMeta, selectedAttribute, componentDepth, attributesMeta]);\n\n // Memoized Combobox options for Search Attribute (in Section 2)\n const memoizedSearchComboboxOptions = useMemo(() => {\n return (\n <>\n <ComboboxOption\n value=\"__default__\"\n textValue={`Same as Update Attribute (${selectedAttribute || 'None'}) default`}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\" gap={2}>\n <Typography variant=\"omega\" fontStyle=\"italic\" textColor=\"neutral600\">\n -- Same as Update Attribute ({selectedAttribute || 'None'}) --\n </Typography>\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\" size=\"S\">\n Default\n </Badge>\n </Flex>\n </ComboboxOption>\n {depthFilteredAttributes.map((attr) => {\n const rel = relationsMeta[attr];\n const depth = getAttrDepth(attr);\n const badgeText = rel ? `relation ${rel.targetDisplayName}` : depth > 0 ? `L${depth} component` : '';\n const textValue = badgeText ? `${attr} ${badgeText}` : attr;\n return (\n <ComboboxOption key={`search_${attr}`} value={attr} textValue={textValue}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\" gap={2}>\n <Typography variant=\"omega\" fontWeight={attr === searchAttribute ? 'bold' : 'regular'}>\n {attr}\n </Typography>\n {rel ? (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\" size=\"S\">\n relation ➔ {rel.targetDisplayName}\n </Badge>\n ) : depth > 0 ? (\n <Badge backgroundColor={depth === 1 ? 'neutral150' : depth === 2 ? 'primary100' : 'secondary100'} textColor={depth === 1 ? 'neutral700' : depth === 2 ? 'primary700' : 'secondary700'} size=\"S\">\n L{depth} component\n </Badge>\n ) : null}\n </Flex>\n </ComboboxOption>\n );\n })}\n </>\n );\n }, [depthFilteredAttributes, relationsMeta, searchAttribute, selectedAttribute, componentDepth, attributesMeta]);\n\n const handleSearchAttributeChange = (newAttr: string) => {\n const finalAttr = newAttr === '__default__' ? '' : newAttr;\n setSearchAttribute(finalAttr);\n if (collections.length > 0) {\n collections.forEach((col) => {\n loadCollectionPage(\n col.uid,\n 1,\n undefined,\n undefined,\n undefined,\n filterOperator,\n filterQuery,\n entrySearch,\n true,\n finalAttr\n );\n });\n }\n };\n\n const handleGlobalPageSizeChange = (newSize: number) => {\n const capped = Math.min(500, Math.max(1, newSize));\n setDefaultPageSize(capped);\n collections.forEach((col) => {\n if (!col.isSingleType) {\n loadCollectionPage(col.uid, 1, capped);\n }\n });\n };\n\n const handleCollectionPageSizeChange = (colUid: string, newSize: number) => {\n const capped = Math.min(500, Math.max(1, newSize));\n loadCollectionPage(colUid, 1, capped);\n };\n\n const handleCollectionSortChange = (colUid: string, field: string, order: 'asc' | 'desc') => {\n setCollectionSorts((prev) => ({\n ...prev,\n [colUid]: { field, order },\n }));\n loadCollectionPage(colUid, 1, undefined, field, order);\n };\n\n const handleHeaderSortClick = (colUid: string, field: string) => {\n const current = collectionSorts[colUid] || { field: 'createdAt', order: 'desc' };\n const nextOrder: 'asc' | 'desc' = current.field === field && current.order === 'asc' ? 'desc' : 'asc';\n handleCollectionSortChange(colUid, field, nextOrder);\n };\n\n // Toggle single entry\n const toggleEntry = (uid: string, documentId: string) => {\n const key = `${uid}${KEY_SEP}${documentId}`;\n const nextVal = !selectedEntries[key];\n setSelectedEntries((prev) => ({\n ...prev,\n [key]: nextVal,\n }));\n if (!nextVal) {\n setSelectedDzBlocks((prev) => {\n const copy = { ...prev };\n delete copy[key];\n return copy;\n });\n }\n };\n\n // Toggle individual dynamic zone block selection for an entry\n const toggleDzBlock = (uid: string, documentId: string, blockIndex: number, allApplicableIndexes: number[]) => {\n const key = `${uid}${KEY_SEP}${documentId}`;\n setSelectedDzBlocks((prev) => {\n const currentSelected = prev[key] !== undefined ? prev[key] : [...allApplicableIndexes];\n let nextSelected: number[];\n if (currentSelected.includes(blockIndex)) {\n nextSelected = currentSelected.filter((idx) => idx !== blockIndex);\n } else {\n nextSelected = [...currentSelected, blockIndex];\n }\n\n if (nextSelected.length > 0) {\n setSelectedEntries((e) => ({ ...e, [key]: true }));\n } else {\n setSelectedEntries((e) => ({ ...e, [key]: false }));\n }\n\n return {\n ...prev,\n [key]: nextSelected,\n };\n });\n };\n\n // Value filter evaluation across all dynamic zone / component matches\n const entryMatchesFilter = (entry: Entry, attr: string): boolean => {\n const matches = getAllNestedValues(entry, attr);\n\n // If regex search pattern is provided, verify against the search attribute values\n if (useRegex && regexPattern.trim()) {\n try {\n const regex = new RegExp(regexPattern, 'i');\n const anyRegexMatch = matches.some((m) => regex.test(formatDisplayValue(m.value)));\n if (!anyRegexMatch) {\n return false;\n }\n } catch {\n // Keep unhindered while typing regex\n }\n }\n\n if (filterOperator === 'none') return true;\n\n if (matches.length === 0) {\n return filterOperator === 'empty';\n }\n\n const checkMatch = (val: any) => {\n const displayStr = formatDisplayValue(val);\n const isValEmpty =\n val === undefined ||\n val === null ||\n (Array.isArray(val) && val.length === 0) ||\n displayStr.trim() === '' ||\n displayStr.trim().toLowerCase() === '(not set)' ||\n displayStr.trim().toLowerCase() === '(empty / not set)' ||\n displayStr.trim().toLowerCase() === '(empty / unlinked)';\n\n if (filterOperator === 'empty') return isValEmpty;\n if (filterOperator === 'not_empty') return !isValEmpty;\n if (isValEmpty) return false;\n\n const q = filterQuery.trim().toLowerCase();\n if (!q) return true;\n\n const testString = (str: any): boolean => {\n if (str === undefined || str === null) return false;\n const s = String(str).trim().toLowerCase();\n switch (filterOperator) {\n case 'equals':\n return s === q;\n case 'contains':\n return s.includes(q);\n case 'starts_with':\n return s.startsWith(q);\n default:\n return true;\n }\n };\n\n const testEntityObject = (obj: any): boolean => {\n if (!obj || typeof obj !== 'object') return false;\n if (testString(obj.name)) return true;\n if (testString(obj.title)) return true;\n if (testString(obj.email)) return true;\n if (testString(obj.username)) return true;\n if (testString(obj.documentId)) return true;\n if (testString(String(obj.id))) return true;\n if (testString(obj.slug)) return true;\n if (testString(formatDisplayValue(obj))) return true;\n return false;\n };\n\n if (Array.isArray(val)) {\n return val.some((item) => (typeof item === 'object' ? testEntityObject(item) : testString(item)));\n }\n\n if (typeof val === 'object' && val !== null) {\n return testEntityObject(val);\n }\n\n return testString(displayStr);\n };\n\n if (filterOperator === 'empty') {\n return matches.every((m) => checkMatch(m.value));\n }\n return matches.some((m) => checkMatch(m.value));\n };\n\n const getVisibleEntries = (col: CollectionModel) => {\n const pageState = collectionPages[col.uid];\n const raw = pageState ? pageState.entries : (col.entries || []);\n if (statusFilter === 'all') return raw;\n return raw.filter((entry) => {\n const lifecycle = getEntryLifecycleStatus(entry, col, pendingBatches);\n return lifecycle.status === statusFilter;\n });\n };\n\n const matchingEntriesCount = React.useMemo(() => {\n if (!isFilterActive) return 0;\n let count = 0;\n filteredCollections.forEach((col) => {\n count += getVisibleEntries(col).length;\n });\n return count;\n }, [filteredCollections, collectionPages, isFilterActive, statusFilter, pendingBatches]);\n\n const selectAllMatching = () => {\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 deselectAllMatching = () => {\n const updated = { ...selectedEntries };\n filteredCollections.forEach((col) => {\n const entries = getVisibleEntries(col);\n entries.forEach((e) => {\n delete updated[`${col.uid}${KEY_SEP}${e.documentId}`];\n });\n });\n setSelectedEntries(updated);\n };\n\n const clearFilter = () => {\n setSearchAttribute('');\n setFilterOperator('none');\n setFilterQuery('');\n setEntrySearch('');\n setStatusFilter('all');\n setRegexPattern('');\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 // Lifecycle status breakdown across selected entries\n const selectedLifecycleStats = useMemo(() => {\n let published = 0;\n let modified = 0;\n let draft = 0;\n let pendingReview = 0;\n let unknown = 0;\n\n Object.keys(selectedEntries).forEach((key) => {\n if (!selectedEntries[key]) return;\n const parts = key.split(KEY_SEP);\n if (parts.length !== 2) return;\n const [uid, docId] = parts;\n const col = collections.find((c) => c.uid === uid) || null;\n const entry =\n collectionPages[uid]?.entries?.find((e: Entry) => e.documentId === docId || String(e.id) === docId) ||\n col?.entries?.find((e: Entry) => e.documentId === docId || String(e.id) === docId);\n\n if (col && col.draftAndPublish === false) {\n published++;\n } else if (entry) {\n const { status } = getEntryLifecycleStatus(entry, col, pendingBatches);\n if (status === 'published') published++;\n else if (status === 'modified') modified++;\n else if (status === 'draft') draft++;\n else if (status === 'pending_review') pendingReview++;\n else unknown++;\n } else {\n draft++;\n }\n });\n\n const unreviewedCount = draft + modified + pendingReview + unknown;\n return {\n published,\n modified,\n draft,\n pendingReview,\n unknown,\n unreviewedCount,\n total: published + modified + draft + pendingReview + unknown,\n };\n }, [selectedEntries, collections, collectionPages, pendingBatches]);\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 setPublishStrategy('safe');\n setUnreviewedConsent(false);\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; dynamicZoneIndexes?: 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 targetObj: any = { uid: parts[0], documentId: parts[1] };\n if (selectedDzBlocks[key] && selectedDzBlocks[key].length > 0) {\n targetObj.dynamicZoneIndexes = selectedDzBlocks[key];\n }\n targets.push(targetObj);\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 if (!isAbortError(err)) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Failed to fetch preview diffs',\n });\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; dynamicZoneIndexes?: 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 targetObj: any = { uid: parts[0], documentId: parts[1] };\n if (selectedDzBlocks[key] && selectedDzBlocks[key].length > 0) {\n targetObj.dynamicZoneIndexes = selectedDzBlocks[key];\n }\n targets.push(targetObj);\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 publishStrategy,\n unreviewedConsent,\n unreviewedCount: selectedLifecycleStats.unreviewedCount,\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 publishStrategy,\n unreviewedConsent,\n unreviewedCount: selectedLifecycleStats.unreviewedCount,\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 setSelectedDzBlocks({});\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 if (selectedCollectionUid) {\n loadCollectionPage(\n selectedCollectionUid,\n collectionPages[selectedCollectionUid]?.page || 1,\n undefined,\n undefined,\n undefined,\n filterOperator,\n filterQuery,\n entrySearch,\n false,\n searchAttribute\n );\n }\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 setPublishConsent(false);\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 unreviewedConsent: publishConsent,\n unreviewedCount: selectedLifecycleStats.unreviewedCount,\n results: [],\n });\n\n const payload = {\n selectedEntries: targets,\n executionMode,\n makerNotes: publishMakerNotesInput,\n forceImmediate,\n unreviewedConsent: publishConsent,\n unreviewedCount: selectedLifecycleStats.unreviewedCount,\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 setInspectingPendingBatch(null);\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, customReason?: string) => {\n const reason =\n customReason ||\n window.prompt('Enter reason for rejection:', 'Does not meet release criteria') ||\n '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 setInspectingPendingBatch(null);\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 // Export Pending Batch Diffs to CSV\n const handleExportPendingBatch = async (batchId: string) => {\n try {\n setExportingPendingBatchId(batchId);\n const res = await get(`/bulk-updater/batches/${batchId}/diffs/export`);\n if (res.data && res.data.success && res.data.csvContent) {\n const safeContent = res.data.csvContent.startsWith('\\uFEFF')\n ? res.data.csvContent\n : '\\uFEFF' + res.data.csvContent;\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 || `batch_${batchId}_review.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 || ''} batch diffs to CSV.`,\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: 'Failed to export batch diffs to CSV.',\n });\n }\n } catch (err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || 'Error exporting batch diffs.',\n });\n } finally {\n setExportingPendingBatchId(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 {/* Top Collection Type Selector & Component Depth Bar */}\n <Box\n padding={4}\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n marginBottom={5}\n style={{ width: '100%', maxWidth: '100%', minWidth: 0, boxSizing: 'border-box' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" wrap=\"wrap\" gap={3}>\n <Flex gap={3} alignItems=\"center\" wrap=\"wrap\" style={{ flex: 1, minWidth: 280 }}>\n <Box style={{ width: 340, minWidth: 260 }}>\n <Field.Root>\n <Field.Label>Target Collection Type</Field.Label>\n <Combobox\n key={`top-col-${selectedCollectionUid}`}\n autocomplete={{ type: 'list', filter: 'contains' }}\n placeholder=\"Search Collection Type...\"\n value={selectedCollectionUid || undefined}\n clearLabel=\"Clear collection selection\"\n onClear={() => handleCollectionChange('')}\n onFocus={(e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }}\n onChange={(val: any) => {\n if (val && typeof val === 'string') {\n handleCollectionChange(val);\n }\n }}\n >\n {collections.map((col) => (\n <ComboboxOption key={col.uid} value={col.uid} textValue={`${col.displayName} (${col.uid})`}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" style={{ width: '100%' }}>\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {col.displayName}\n </Typography>\n <Flex gap={1} alignItems=\"center\">\n {col.isSingleType ? (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\" size=\"S\">\n Single\n </Badge>\n ) : (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\" size=\"S\">\n {col.totalEntries !== undefined ? `${col.totalEntries} entries` : ''}\n </Badge>\n )}\n </Flex>\n </Flex>\n </ComboboxOption>\n ))}\n </Combobox>\n </Field.Root>\n </Box>\n\n {selectedCol && (\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\" style={{ paddingTop: 20 }}>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n {selectedCol.isSingleType ? 'SINGLE TYPE' : 'COLLECTION'}\n </Badge>\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\">\n {selectedCol.isSingleType\n ? '1 single entry'\n : `${collectionPages[selectedCol.uid]?.total ?? selectedCol.totalEntries ?? selectedCol.entries?.length ?? 0} records`}\n </Badge>\n </Flex>\n )}\n </Flex>\n\n {/* Component Nesting Depth Config */}\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n <Typography variant=\"pi\" textColor=\"neutral700\" fontWeight=\"bold\">\n Component Nesting Depth:\n </Typography>\n {[1, 2, 3, 4, 5].map((lvl) => (\n <Button\n key={`depth_cfg_${lvl}`}\n variant={componentDepth === lvl ? 'default' : 'tertiary'}\n size=\"S\"\n onClick={() => handleComponentDepthChange(lvl)}\n title={`Discover nested component attributes up to Level ${lvl}`}\n >\n Level {lvl}\n </Button>\n ))}\n </Flex>\n </Flex>\n </Box>\n\n {/* 1. Search & Filter Targets */}\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 1. Search & Filter Targets\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Search, filter, and select entries within {selectedCol ? selectedCol.displayName : 'the selected collection'} before updating.\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\" wrap=\"wrap\">\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 {searchAttribute && searchAttribute !== selectedAttribute && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n Searching by: {searchAttribute} → Target to update: {selectedAttribute}\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 {/* Search Attribute Combobox */}\n <Box style={{ width: 280, minWidth: 230 }}>\n <Field.Root>\n <Field.Label>Search Attribute</Field.Label>\n <Combobox\n key={`search-attr-${selectedCollectionUid}`}\n autocomplete={{ type: 'list', filter: 'contains' }}\n placeholder={searchAttribute || `Same as Update (${selectedAttribute || 'None'})`}\n value={searchAttribute || '__default__'}\n clearLabel=\"Reset search attribute\"\n onClear={() => handleSearchAttributeChange('')}\n onFocus={(e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }}\n onChange={(val: any) => {\n if (val && typeof val === 'string' && val !== '__none__') {\n handleSearchAttributeChange(val);\n }\n }}\n >\n {memoizedSearchComboboxOptions}\n </Combobox>\n </Field.Root>\n </Box>\n\n {/* Operator Select */}\n <Box style={{ width: 200, minWidth: 170 }}>\n <SingleSelect\n label={effectiveSearchAttribute ? `Condition for \"${effectiveSearchAttribute}\"` : 'Filter condition'}\n value={filterOperator}\n onChange={(val) => setFilterOperator(String(val) as FilterOperator)}\n >\n <SingleSelectOption value=\"none\">Show All (No Value 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 {effectiveSearchAttribute && relationsMeta[effectiveSearchAttribute] ? (\n <Field.Root>\n <Field.Label>{`Target ${relationsMeta[effectiveSearchAttribute].targetDisplayName} Relation`}</Field.Label>\n <Combobox\n autocomplete={{ type: 'list', filter: 'contains' }}\n placeholder={\n searchRelationOptionsLoading\n ? 'Loading entities...'\n : `Search & pick ${relationsMeta[effectiveSearchAttribute].targetDisplayName} or type text...`\n }\n value={filterQuery}\n onClear={() => setFilterQuery('')}\n onChange={(val: any) => {\n if (typeof val === 'string') {\n setFilterQuery(val);\n }\n }}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setFilterQuery(e.target.value);\n }}\n >\n {searchRelationOptions.map((opt) => (\n <ComboboxOption key={opt.documentId} value={opt.label} textValue={opt.label}>\n {opt.label}\n </ComboboxOption>\n ))}\n </Combobox>\n </Field.Root>\n ) : (\n <TextInput\n label={effectiveSearchAttribute ? `Value for \"${effectiveSearchAttribute}\"` : 'Value to match'}\n placeholder=\"Type value to match...\"\n value={filterQuery}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFilterQuery(e.target.value)}\n />\n )}\n </Box>\n )}\n\n {/* Full-text search across entries */}\n <Box style={{ flex: 1, minWidth: 180 }}>\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 {/* Lifecycle Status Filter */}\n <Box style={{ width: 190, minWidth: 160 }}>\n <SingleSelect\n label=\"Lifecycle Status\"\n value={statusFilter}\n onChange={(val) => setStatusFilter(String(val) as any)}\n >\n <SingleSelectOption value=\"all\">All Statuses</SingleSelectOption>\n <SingleSelectOption value=\"pending_review\">Pending Review (Due)</SingleSelectOption>\n <SingleSelectOption value=\"draft\">Draft</SingleSelectOption>\n <SingleSelectOption value=\"published\">Published</SingleSelectOption>\n <SingleSelectOption value=\"modified\">Modified</SingleSelectOption>\n <SingleSelectOption value=\"unknown\">Unknown</SingleSelectOption>\n </SingleSelect>\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 {/* Pro Feature: Regex Search & Pattern Subsection */}\n <Box marginTop={3} paddingTop={3} style={{ borderTop: '1px solid #dcdce4' }}>\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 Search & Replace</Typography>\n </Checkbox>\n <Badge\n backgroundColor={useRegex ? 'secondary100' : 'neutral200'}\n textColor={useRegex ? 'secondary700' : 'neutral600'}\n size=\"S\"\n >\n {useRegex ? 'REGEX SEARCH ACTIVE' : 'REGEX OFF'}\n </Badge>\n </Flex>\n {useRegex && (\n <Box style={{ flex: 1, minWidth: 260 }}>\n <TextInput\n placeholder={`Regex pattern to search in \"${effectiveSearchAttribute || 'target'}\" (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 {useRegex && (\n <Typography variant=\"pi\" textColor=\"neutral600\" marginTop={1}>\n Searches {effectiveSearchAttribute ? <strong>{effectiveSearchAttribute}</strong> : 'target entries'} for text matching this regular expression pattern. Matches will be substituted with the Replacement Value configured in Section 1.\n </Typography>\n )}\n </Box>\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 {!selectedCol ? (\n <Box padding={6} background=\"neutral100\" hasRadius style={{ textAlign: 'center' }}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Please select a collection type above to display entries.\n </Typography>\n </Box>\n ) : (() => {\n const col = selectedCol;\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, effectiveSearchAttribute)).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, searchAttribute);\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 <Box style={{ position: 'relative', display: 'inline-block' }}>\n <Button\n variant={openSortPickerUid === col.uid ? 'secondary' : 'tertiary'}\n size=\"S\"\n onClick={() => {\n setOpenSortPickerUid(openSortPickerUid === col.uid ? null : col.uid);\n setSortSearchTerm('');\n if (openColumnPickerUid === col.uid) setOpenColumnPickerUid(null);\n }}\n >\n <Flex gap={1} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\" fontWeight=\"bold\">\n Sort:\n </Typography>\n <Typography variant=\"pi\" fontWeight=\"semiBold\">\n {getActiveSortLabel(currentSort, col)}\n </Typography>\n </Flex>\n </Button>\n\n {openSortPickerUid === col.uid && (\n <Box\n style={{\n position: 'absolute',\n top: 'calc(100% + 6px)',\n left: 0,\n zIndex: 220,\n width: 330,\n maxHeight: 440,\n background: '#ffffff',\n borderRadius: 8,\n boxShadow: '0 10px 25px rgba(33, 33, 52, 0.18)',\n border: '1px solid #dcdce4',\n padding: 12,\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"pi\" fontWeight=\"bold\">\n Sort by Column\n </Typography>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => setOpenSortPickerUid(null)}\n style={{ padding: '2px 6px', height: 'auto', minWidth: 'unset' }}\n >\n ✕\n </Button>\n </Flex>\n\n <TextInput\n size=\"S\"\n placeholder=\"Search columns to sort...\"\n value={sortSearchTerm}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSortSearchTerm(e.target.value)}\n />\n\n <Box\n style={{\n maxHeight: 320,\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n }}\n >\n {getSortOptionsForCollection(col, selectedAttribute, searchAttribute)\n .filter((opt) => {\n if (!sortSearchTerm.trim()) return true;\n const term = sortSearchTerm.toLowerCase().trim();\n return opt.label.toLowerCase().includes(term) || opt.field.toLowerCase().includes(term);\n })\n .map((opt) => {\n const isSelected =\n (currentSort.field === opt.field ||\n (currentSort.field === 'updatedAt' && opt.field === 'updated_at') ||\n (currentSort.field === 'updated_at' && opt.field === 'updatedAt') ||\n (currentSort.field === 'createdAt' && opt.field === 'created_at') ||\n (currentSort.field === 'created_at' && opt.field === 'createdAt')\n ) && currentSort.order === opt.order;\n\n return (\n <Box\n key={`${opt.field}:${opt.order}`}\n onClick={() => {\n handleCollectionSortChange(col.uid, opt.field, opt.order);\n setOpenSortPickerUid(null);\n setSortSearchTerm('');\n }}\n style={{\n padding: '6px 10px',\n borderRadius: 6,\n cursor: 'pointer',\n background: isSelected ? 'rgba(73, 69, 255, 0.12)' : 'transparent',\n border: isSelected ? '1px solid #4945ff' : '1px solid transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background 0.15s ease',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) e.currentTarget.style.background = '#f6f6f9';\n }}\n onMouseLeave={(e) => {\n if (!isSelected) e.currentTarget.style.background = 'transparent';\n }}\n >\n <Typography\n variant=\"omega\"\n fontWeight={isSelected ? 'bold' : 'normal'}\n textColor={isSelected ? 'primary700' : 'neutral800'}\n >\n {opt.label}\n </Typography>\n {isSelected && (\n <Badge size=\"S\" backgroundColor=\"primary100\" textColor=\"primary700\">\n Active\n </Badge>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </Box>\n )}\n\n {/* Searchable Columns Dropdown Popover */}\n <Box style={{ position: 'relative', display: 'inline-block' }}>\n <Button\n variant={openColumnPickerUid === col.uid ? 'secondary' : 'tertiary'}\n size=\"S\"\n startIcon={<Cog />}\n onClick={() => {\n setOpenColumnPickerUid(openColumnPickerUid === col.uid ? null : col.uid);\n setColumnSearchTerm('');\n if (openSortPickerUid === col.uid) setOpenSortPickerUid(null);\n }}\n >\n Columns ({activeColumns.filter((c) => !c.isPermanent).length}/{availableColumns.filter((c) => !c.isPermanent).length})\n </Button>\n\n {openColumnPickerUid === col.uid && (\n <Box\n style={{\n position: 'absolute',\n top: 'calc(100% + 6px)',\n right: 0,\n zIndex: 200,\n width: 320,\n maxHeight: 420,\n background: '#ffffff',\n borderRadius: 8,\n boxShadow: '0 10px 25px rgba(33, 33, 52, 0.18)',\n border: '1px solid #dcdce4',\n padding: 12,\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"pi\" fontWeight=\"bold\">\n Configure Columns\n </Typography>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => setOpenColumnPickerUid(null)}\n style={{ padding: '2px 6px', height: 'auto', minWidth: 'unset' }}\n >\n ✕\n </Button>\n </Flex>\n\n <TextInput\n size=\"S\"\n placeholder=\"Search columns...\"\n value={columnSearchTerm}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setColumnSearchTerm(e.target.value)}\n />\n\n <Flex justifyContent=\"space-between\" alignItems=\"center\" style={{ borderBottom: '1px solid #f0f0f5', paddingBottom: 6 }}>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => showAllColumns(col.uid, availableColumns)}\n style={{ fontSize: 11, padding: 0 }}\n >\n Show All\n </Button>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => {\n setCollectionColumnVisibility((prev) => ({\n ...prev,\n [col.uid]: [],\n }));\n }}\n style={{ fontSize: 11, padding: 0 }}\n >\n Hide All\n </Button>\n <Button\n variant=\"ghost\"\n size=\"S\"\n onClick={() => resetDefaultColumns(col.uid, availableColumns)}\n style={{ fontSize: 11, padding: 0 }}\n >\n Reset\n </Button>\n </Flex>\n\n <Box\n style={{\n maxHeight: 250,\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n }}\n >\n {availableColumns\n .filter((c) => {\n if (!columnSearchTerm.trim()) return true;\n const term = columnSearchTerm.toLowerCase().trim();\n return c.label.toLowerCase().includes(term) || c.key.toLowerCase().includes(term);\n })\n .map((c) => {\n const isChecked = activeColumns.some((ac) => ac.key === c.key);\n const isNested = c.key.includes('.');\n const depth = isNested ? c.key.split('.').length - 1 : 0;\n return (\n <Flex\n key={c.key}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n style={{\n padding: '4px 6px',\n borderRadius: 4,\n background: isChecked ? '#f0f0ff' : 'transparent',\n }}\n >\n <Box style={{ minWidth: 0, flex: 1, overflow: 'hidden' }}>\n <Checkbox\n checked={isChecked}\n disabled={c.isPermanent}\n onCheckedChange={() => {\n if (!c.isPermanent) {\n toggleColumn(col.uid, c.key, availableColumns);\n }\n }}\n >\n <Typography\n variant=\"pi\"\n ellipsis\n style={{\n color: c.isPermanent ? '#8e8ea9' : '#272833',\n fontWeight: isChecked ? 600 : 400,\n }}\n title={c.key}\n >\n {c.label}\n </Typography>\n </Checkbox>\n </Box>\n {c.isPermanent ? (\n <Badge size=\"S\" backgroundColor=\"neutral150\" textColor=\"neutral700\">\n Fixed\n </Badge>\n ) : depth > 0 ? (\n <Badge size=\"S\" backgroundColor=\"secondary100\" textColor=\"secondary700\">\n L{depth}\n </Badge>\n ) : null}\n </Flex>\n );\n })}\n </Box>\n </Box>\n )}\n </Box>\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 {/* 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, searchAttribute, 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 const isDzExpanded = Boolean(expandedDzEntries[key]);\n const onToggleExpandDz = () =>\n setExpandedDzEntries((prev) => ({\n ...prev,\n [key]: !prev[key],\n }));\n\n const dzFields = Object.keys(entry).filter(\n (k) => Array.isArray(entry[k]) && entry[k].length > 0 && entry[k].some((item: any) => item && item.__component)\n );\n\n return (\n <React.Fragment key={key}>\n <Tr\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 searchAttribute,\n isMatch,\n hasAttr,\n isSelected,\n () => toggleEntry(col.uid, entry.documentId),\n pendingBatches,\n isDzExpanded,\n onToggleExpandDz,\n filterQuery\n )}\n </Td>\n ))}\n </Tr>\n\n {/* Dynamic Zone Expandable Drawer Sub-Table */}\n {isDzExpanded && dzFields.map((dzKey) => {\n const blocks = entry[dzKey] || [];\n const targetParsed = parseDynamicZonePath(selectedAttribute);\n const isBlockApplicable = (blockItem: any) => {\n if (!targetParsed.subPath) return true;\n const scopedPath = `${dzKey}[${blockItem?.__component}].${targetParsed.subPath}`;\n const componentSupports = (col?.attributes || attributes || []).includes(scopedPath);\n return componentSupports || getNestedValue(blockItem, targetParsed.subPath) !== undefined;\n };\n const allApplicableIndexes = blocks\n .map((_: any, i: number) => i)\n .filter((i: number) => isBlockApplicable(blocks[i]));\n\n return (\n <Tr key={`${key}-dz-${dzKey}`}>\n <Td colSpan={activeColumns.length} style={{ padding: '12px 16px', backgroundColor: 'rgba(73, 69, 255, 0.02)', borderBottom: '2px solid rgba(73, 69, 255, 0.15)' }}>\n <Box\n padding={3}\n background=\"neutral0\"\n hasRadius\n style={{ border: '1px solid rgba(73, 69, 255, 0.25)', boxShadow: '0 2px 8px rgba(0,0,0,0.05)' }}\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={2}>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"sigma\" textColor=\"primary700\">\n DYNAMIC ZONE: "{dzKey}" ({blocks.length} blocks)\n </Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n Selective Block Targeting\n </Badge>\n </Flex>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Selectively choose which blocks to update for this entry\n </Typography>\n </Flex>\n\n <Table colCount={5} rowCount={blocks.length + 1} style={{ width: '100%', background: '#fff' }}>\n <Thead>\n <Tr>\n <Th style={{ width: 64 }}><Typography variant=\"sigma\">Update?</Typography></Th>\n <Th style={{ width: 60 }}><Typography variant=\"sigma\">Pos</Typography></Th>\n <Th style={{ width: 220 }}><Typography variant=\"sigma\">Component</Typography></Th>\n <Th><Typography variant=\"sigma\">Target Field Value ({selectedAttribute || 'selected'})</Typography></Th>\n <Th><Typography variant=\"sigma\">Block Summary</Typography></Th>\n </Tr>\n </Thead>\n <Tbody>\n {blocks.map((block: any, bIdx: number) => {\n const compUid = block.__component;\n const compLabel = formatComponentName(compUid);\n const scopedPath = `${dzKey}[${compUid}].${targetParsed.subPath}`;\n const componentSupports = (col?.attributes || attributes || []).includes(scopedPath);\n const blockVal = targetParsed.subPath ? getNestedValue(block, targetParsed.subPath) : undefined;\n const hasTargetAttr = componentSupports || blockVal !== undefined;\n\n const isBlockChecked = hasTargetAttr && isSelected && (selectedDzBlocks[key] !== undefined ? selectedDzBlocks[key].includes(bIdx) : true);\n\n return (\n <Tr\n key={bIdx}\n style={{\n backgroundColor: isBlockChecked ? 'rgba(73, 69, 255, 0.08)' : undefined,\n }}\n >\n <Td>\n <Checkbox\n checked={isBlockChecked}\n disabled={!hasTargetAttr}\n onCheckedChange={() => {\n toggleDzBlock(col.uid, entry.documentId, bIdx, allApplicableIndexes);\n }}\n />\n </Td>\n <Td>\n <Typography variant=\"pi\" fontWeight=\"bold\">#{bIdx}</Typography>\n </Td>\n <Td>\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral800\">\n {compLabel}\n </Badge>\n <Typography variant=\"pi\" textColor=\"neutral500\" display=\"block\" style={{ fontSize: '0.68rem', marginTop: 2 }}>\n {compUid}\n </Typography>\n </Td>\n <Td>\n {hasTargetAttr ? (\n <Typography variant=\"omega\" fontWeight=\"semiBold\" textColor=\"primary700\">\n {formatDisplayValue(blockVal)}\n </Typography>\n ) : (\n <Badge backgroundColor=\"neutral100\" textColor=\"neutral500\">\n Does not contain attribute\n </Badge>\n )}\n </Td>\n <Td>\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ maxWidth: 300, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {block.title || block.name || block.heading || block.body || Object.keys(block).filter((k: string) => !k.startsWith('_') && k !== 'id').slice(0, 3).map((k: string) => `${k}: ${formatDisplayValue(block[k])}`).join(', ') || '-'}\n </Typography>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n </Td>\n </Tr>\n );\n })}\n </React.Fragment>\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 </Box>\n\n {/* 2. Configure Attribute Update & Execution */}\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. Configure Attribute Update\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Select the target attribute to update and configure the replacement value for your selected entries.\n </Typography>\n </Box>\n </Flex>\n\n <Flex gap={3} alignItems=\"flex-end\" wrap=\"wrap\">\n {/* Attribute Dropdown (Searchable Combobox) */}\n <Box style={{ width: 280, minWidth: 230 }}>\n <Field.Root>\n <Field.Label>Attribute to Update</Field.Label>\n <Combobox\n key={`update-attr-${selectedCollectionUid}`}\n autocomplete={{ type: 'list', filter: 'contains' }}\n placeholder=\"Search attribute by name or relation...\"\n value={selectedAttribute || undefined}\n clearLabel=\"Clear attribute selection\"\n onClear={() => handleAttributeChange('')}\n onFocus={(e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\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 }\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 || !selectedAttribute.trim()}\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 || !selectedAttribute.trim()}\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\n {/* Selection Alert: Unreviewed Content Warning Banner */}\n {publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && (\n <Box marginTop={3} padding={3} background=\"warning100\" hasRadius style={{ border: '1px solid #f5c0b8' }}>\n <Flex gap={2} alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"warning700\">\n ⚠️ Unreviewed Content Alert:\n </Typography>\n <Typography variant=\"pi\" textColor=\"warning700\">\n {selectedLifecycleStats.unreviewedCount} of {totalSelectedCount} selected record(s) contain unreviewed draft changes ({selectedLifecycleStats.draft} Draft, {selectedLifecycleStats.modified} Modified).\n Publishing them live will push all unreviewed draft content across all fields to live visitors. You can select safe publishing (recommended) or provide explicit consent at review time.\n </Typography>\n </Flex>\n </Box>\n )}\n </Box>\n\n {/* Selected Attribute & Collection Context */}\n {selectedCol && selectedAttribute && (\n <Box marginTop={4} padding={3} 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 Target Selection:\n </Typography>\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n Collection: {selectedCol.displayName}\n </Badge>\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n Attribute: {selectedAttribute} {attributesMeta[selectedAttribute]?.type ? `(${attributesMeta[selectedAttribute].type})` : ''}\n </Badge>\n {attributesMeta[selectedAttribute]?.depth ? (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral700\">\n Nesting Level: L{attributesMeta[selectedAttribute].depth}\n </Badge>\n ) : null}\n {selectedCol.draftAndPublish ? (\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n Draft & Publish Enabled\n </Badge>\n ) : (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n Direct Publish Only\n </Badge>\n )}\n </Flex>\n </Flex>\n </Box>\n )}\n </Box>\n\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 {(batch.payload?.action === 'csv_import' || batch.id?.startsWith('csv_')) && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n 📊 CSV IMPORT\n </Badge>\n )}\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 {batch.summary.publishStrategy === 'safe' && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n SAFE PUBLISH\n </Badge>\n )}\n {batch.summary.publishStrategy === 'all' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n PUBLISH ALL (CONSENTED)\n </Badge>\n )}\n {Boolean(batch.summary.unreviewedCount) && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral700\">\n Unreviewed: {batch.summary.unreviewedCount}\n </Badge>\n )}\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 <Button\n size=\"S\"\n variant=\"secondary\"\n startIcon={<Eye />}\n onClick={() => setInspectingPendingBatch(batch)}\n >\n Review Changes\n </Button>\n <Button\n size=\"S\"\n variant=\"tertiary\"\n startIcon={<Download />}\n onClick={() => handleExportPendingBatch(batch.id)}\n loading={exportingPendingBatchId === batch.id}\n >\n Export CSV\n </Button>\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: 200 }}>\n {(() => {\n const isCsv = rec.attribute === 'CSV_IMPORT' || rec.attribute?.startsWith('CSV');\n let attrText = rec.attribute;\n let valText = formatDisplayValue(rec.value);\n\n if (rec.attribute === 'CSV_IMPORT' && rec.diffs && rec.diffs.length > 0) {\n const colName = rec.diffs[0]?.collectionName || 'Collection';\n const attrs = Array.from(new Set(rec.diffs.map((d: any) => d.attribute).filter(Boolean))).join(', ');\n attrText = `CSV [${colName}]: ${attrs || 'fields'}`;\n\n if (rec.value.startsWith('Mode:') && rec.diffs.length === 1) {\n const d = rec.diffs[0];\n valText = `\"${d.label || d.documentId}\": ${d.attribute || 'field'} → \"${formatDisplayValue(d.newValue)}\"`;\n } else if (rec.value.startsWith('Mode:')) {\n valText = `${rec.diffs.length} attribute${rec.diffs.length > 1 ? 's' : ''} updated in ${colName}`;\n }\n }\n\n return (\n <Flex gap={2} alignItems=\"center\" wrap=\"wrap\">\n {isCsv && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n CSV IMPORT\n </Badge>\n )}\n <Typography\n style={{\n display: 'inline-block',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={`${attrText} → \"${valText}\"`}\n >\n <strong>{attrText.replace(/^CSV\\s*\\[?([^\\]]+)\\]?:\\s*/, '$1: ')}</strong> → “{valText}”\n </Typography>\n </Flex>\n );\n })()}\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 {rec.publishStrategy === 'safe' && (\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\" style={{ marginLeft: 6 }}>\n Safe Publish\n </Badge>\n )}\n {rec.publishStrategy === 'all' && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\" style={{ marginLeft: 6 }}>\n Publish All (Consented)\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={5} 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\">Attribute</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>\n <Badge backgroundColor=\"secondary100\" textColor=\"secondary700\">\n {d.attribute || 'field'}\n </Badge>\n </Td>\n <Td><Typography textColor=\"danger600\">{formatDisplayValue(d.oldValue)}</Typography></Td>\n <Td><Typography textColor=\"success600\" fontWeight=\"semiBold\">{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 {/* Lifecycle Status Breakdown */}\n <Box marginBottom={4} padding={3} background=\"neutral100\" hasRadius style={{ border: '1px solid rgba(120, 120, 150, 0.15)' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={2} display=\"block\">\n LIFECYCLE STATUS BREAKDOWN ({totalSelectedCount} Selected)\n </Typography>\n <Flex gap={2} wrap=\"wrap\">\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ Published / Approved: {selectedLifecycleStats.published}\n </Badge>\n {selectedLifecycleStats.modified > 0 && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 📝 Modified (Unreviewed Revisions): {selectedLifecycleStats.modified}\n </Badge>\n )}\n {selectedLifecycleStats.draft > 0 && (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral800\">\n 📄 Draft (Never Published): {selectedLifecycleStats.draft}\n </Badge>\n )}\n {selectedLifecycleStats.pendingReview > 0 && (\n <Badge backgroundColor=\"warning100\" textColor=\"warning700\">\n ⏳ Pending Review: {selectedLifecycleStats.pendingReview}\n </Badge>\n )}\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 {/* Publishing Strategy Selection when Unreviewed Records are Selected */}\n {publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && (\n <Box\n padding={4}\n background=\"neutral100\"\n hasRadius\n marginBottom={4}\n style={{ border: '1px solid #d9d8ff' }}\n >\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={3} display=\"block\">\n PUBLISHING STRATEGY & GOVERNANCE CONSENT\n </Typography>\n <Flex direction=\"column\" gap={3}>\n {/* Strategy 1: Safe Publishing (Recommended) */}\n <Box\n padding={3}\n hasRadius\n style={{\n border: publishStrategy === 'safe' ? '2px solid #4945ff' : '1px solid #eaeaef',\n backgroundColor: publishStrategy === 'safe' ? '#f0f0ff' : '#ffffff',\n cursor: 'pointer',\n }}\n onClick={() => {\n setPublishStrategy('safe');\n setUnreviewedConsent(false);\n }}\n >\n <Flex gap={2} alignItems=\"flex-start\">\n <input\n type=\"radio\"\n id=\"strategy-safe\"\n name=\"publishStrategy\"\n checked={publishStrategy === 'safe'}\n onChange={() => {\n setPublishStrategy('safe');\n setUnreviewedConsent(false);\n }}\n style={{ marginTop: 3 }}\n />\n <Box>\n <Typography fontWeight=\"bold\" display=\"block\">\n 🛡️ Safe Publishing (Recommended)\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Only publish records that are already approved & live ({selectedLifecycleStats.published} record{selectedLifecycleStats.published === 1 ? '' : 's'}). The {selectedLifecycleStats.unreviewedCount} unreviewed or draft record(s) will receive the bulk update in Draft mode without publishing unreviewed draft revisions to visitors.\n </Typography>\n </Box>\n </Flex>\n </Box>\n\n {/* Strategy 2: Publish All Selected */}\n <Box\n padding={3}\n hasRadius\n style={{\n border: publishStrategy === 'all' ? '2px solid #d02b20' : '1px solid #eaeaef',\n backgroundColor: publishStrategy === 'all' ? '#fff5f5' : '#ffffff',\n cursor: 'pointer',\n }}\n onClick={() => setPublishStrategy('all')}\n >\n <Flex gap={2} alignItems=\"flex-start\">\n <input\n type=\"radio\"\n id=\"strategy-all\"\n name=\"publishStrategy\"\n checked={publishStrategy === 'all'}\n onChange={() => setPublishStrategy('all')}\n style={{ marginTop: 3 }}\n />\n <Box>\n <Typography fontWeight=\"bold\" textColor=\"danger700\" display=\"block\">\n ⚠️ Publish All Selected Records (Includes Unreviewed Drafts)\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Publish all {totalSelectedCount} records live to production immediately, pushing all pending unreviewed draft edits in the {selectedLifecycleStats.unreviewedCount} draft/modified record(s) live.\n </Typography>\n </Box>\n </Flex>\n </Box>\n\n {/* Mandatory Consent Checkbox for Force Publish All */}\n {publishStrategy === 'all' && (\n <Box\n padding={3}\n background=\"danger100\"\n hasRadius\n style={{ border: '1px solid #f5c0b8' }}\n >\n <Flex gap={3} alignItems=\"flex-start\">\n <Checkbox\n name=\"unreviewedConsent\"\n checked={unreviewedConsent}\n onCheckedChange={(checked: boolean) => setUnreviewedConsent(Boolean(checked))}\n />\n <Box style={{ cursor: 'pointer' }} onClick={() => setUnreviewedConsent(!unreviewedConsent)}>\n <Typography fontWeight=\"bold\" textColor=\"danger700\" display=\"block\">\n Mandatory Risk Consent Required\n </Typography>\n <Typography variant=\"pi\" textColor=\"danger700\">\n I understand and explicitly consent that {selectedLifecycleStats.unreviewedCount} record(s) with unreviewed draft revisions or saved draft states will be published live to production visitors.\n </Typography>\n </Box>\n </Flex>\n </Box>\n )}\n </Flex>\n </Box>\n )}\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 direction=\"column\" gap={2} style={{ width: '100%' }}>\n {publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && publishStrategy === 'all' && !unreviewedConsent && (\n <Typography variant=\"pi\" textColor=\"danger700\" fontWeight=\"bold\">\n ⚠️ Explicit consent is required before publishing records with unreviewed draft revisions.\n </Typography>\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 disabled={updating || (publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && publishStrategy === 'all' && !unreviewedConsent)}\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 disabled={updating || (publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && publishStrategy === 'all' && !unreviewedConsent)}\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 disabled={updating || (publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && publishStrategy === 'all' && !unreviewedConsent)}\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 disabled={updating || (publishOnApproval && selectedLifecycleStats.unreviewedCount > 0 && publishStrategy === 'all' && !unreviewedConsent)}\n >\n Confirm & Execute Now\n </Button>\n )}\n </Flex>\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 {/* Lifecycle Status Breakdown */}\n <Box padding={3} background=\"neutral100\" hasRadius style={{ border: '1px solid #eaeaef' }}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" marginBottom={2} display=\"block\">\n LIFECYCLE STATUS BREAKDOWN ({totalSelectedCount} Selected)\n </Typography>\n <Flex gap={2} wrap=\"wrap\">\n <Badge backgroundColor=\"success100\" textColor=\"success700\">\n ✓ Published: {selectedLifecycleStats.published}\n </Badge>\n {selectedLifecycleStats.modified > 0 && (\n <Badge backgroundColor=\"primary100\" textColor=\"primary700\">\n 📝 Modified (Unreviewed Revisions): {selectedLifecycleStats.modified}\n </Badge>\n )}\n {selectedLifecycleStats.draft > 0 && (\n <Badge backgroundColor=\"neutral200\" textColor=\"neutral800\">\n 📄 Draft (Never Published): {selectedLifecycleStats.draft}\n </Badge>\n )}\n </Flex>\n </Box>\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 {/* Explicit Consent Checkbox for Unreviewed Records */}\n {selectedLifecycleStats.unreviewedCount > 0 && (\n <Box\n padding={4}\n background=\"danger100\"\n hasRadius\n style={{ border: '1px solid #f5c0b8' }}\n >\n <Flex gap={3} alignItems=\"flex-start\">\n <Checkbox\n name=\"publishConsent\"\n checked={publishConsent}\n onCheckedChange={(checked: boolean) => setPublishConsent(Boolean(checked))}\n />\n <Box style={{ cursor: 'pointer' }} onClick={() => setPublishConsent(!publishConsent)}>\n <Typography fontWeight=\"bold\" textColor=\"danger700\" display=\"block\">\n Mandatory Risk Consent Required\n </Typography>\n <Typography variant=\"pi\" textColor=\"danger700\">\n I understand and explicitly consent that {selectedLifecycleStats.unreviewedCount} record(s) contain unreviewed draft changes ({selectedLifecycleStats.draft} Draft, {selectedLifecycleStats.modified} Modified) and will be published live to production visitors.\n </Typography>\n </Box>\n </Flex>\n </Box>\n )}\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 direction=\"column\" gap={2} style={{ width: '100%' }}>\n {selectedLifecycleStats.unreviewedCount > 0 && !publishConsent && (\n <Typography variant=\"pi\" textColor=\"danger700\" fontWeight=\"bold\">\n ⚠️ Please check the mandatory consent box above to confirm publishing unreviewed draft records.\n </Typography>\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 disabled={publishing || (selectedLifecycleStats.unreviewedCount > 0 && !publishConsent)}\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 disabled={publishing || (selectedLifecycleStats.unreviewedCount > 0 && !publishConsent)}\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 disabled={publishing || (selectedLifecycleStats.unreviewedCount > 0 && !publishConsent)}\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 disabled={publishing || (selectedLifecycleStats.unreviewedCount > 0 && !publishConsent)}\n >\n Confirm & Publish Now\n </Button>\n )}\n </Flex>\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 lifecycleStats={selectedLifecycleStats}\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\n {/* Checker 4-Eyes Review Modal */}\n <CheckerReviewModal\n isOpen={Boolean(inspectingPendingBatch)}\n onClose={() => setInspectingPendingBatch(null)}\n batch={inspectingPendingBatch}\n onApprove={handleApproveBatch}\n onReject={handleRejectBatch}\n approving={Boolean(inspectingPendingBatch && approvingBatchId === inspectingPendingBatch.id)}\n rejecting={Boolean(inspectingPendingBatch && rejectingBatchId === inspectingPendingBatch.id)}\n />\n </Box>\n );\n};\n\nexport default BulkUpdater;\n"],"names":["React"],"mappings":"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"}
|