{"version":3,"file":"PreAggDetailsPanel-DbHqhxEA.cjs","sources":["../node_modules/react-syntax-highlighter/dist/esm/styles/hljs/atom-one-light.js","../src/app/pages/QueryPlannerPage/PreAggDetailsPanel.jsx"],"sourcesContent":["export default {\n  \"hljs\": {\n    \"display\": \"block\",\n    \"overflowX\": \"auto\",\n    \"padding\": \"0.5em\",\n    \"color\": \"#383a42\",\n    \"background\": \"#fafafa\"\n  },\n  \"hljs-comment\": {\n    \"color\": \"#a0a1a7\",\n    \"fontStyle\": \"italic\"\n  },\n  \"hljs-quote\": {\n    \"color\": \"#a0a1a7\",\n    \"fontStyle\": \"italic\"\n  },\n  \"hljs-doctag\": {\n    \"color\": \"#a626a4\"\n  },\n  \"hljs-keyword\": {\n    \"color\": \"#a626a4\"\n  },\n  \"hljs-formula\": {\n    \"color\": \"#a626a4\"\n  },\n  \"hljs-section\": {\n    \"color\": \"#e45649\"\n  },\n  \"hljs-name\": {\n    \"color\": \"#e45649\"\n  },\n  \"hljs-selector-tag\": {\n    \"color\": \"#e45649\"\n  },\n  \"hljs-deletion\": {\n    \"color\": \"#e45649\"\n  },\n  \"hljs-subst\": {\n    \"color\": \"#e45649\"\n  },\n  \"hljs-literal\": {\n    \"color\": \"#0184bb\"\n  },\n  \"hljs-string\": {\n    \"color\": \"#50a14f\"\n  },\n  \"hljs-regexp\": {\n    \"color\": \"#50a14f\"\n  },\n  \"hljs-addition\": {\n    \"color\": \"#50a14f\"\n  },\n  \"hljs-attribute\": {\n    \"color\": \"#50a14f\"\n  },\n  \"hljs-meta-string\": {\n    \"color\": \"#50a14f\"\n  },\n  \"hljs-built_in\": {\n    \"color\": \"#c18401\"\n  },\n  \"hljs-class .hljs-title\": {\n    \"color\": \"#c18401\"\n  },\n  \"hljs-attr\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-variable\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-template-variable\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-type\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-selector-class\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-selector-attr\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-selector-pseudo\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-number\": {\n    \"color\": \"#986801\"\n  },\n  \"hljs-symbol\": {\n    \"color\": \"#4078f2\"\n  },\n  \"hljs-bullet\": {\n    \"color\": \"#4078f2\"\n  },\n  \"hljs-link\": {\n    \"color\": \"#4078f2\",\n    \"textDecoration\": \"underline\"\n  },\n  \"hljs-meta\": {\n    \"color\": \"#4078f2\"\n  },\n  \"hljs-selector-id\": {\n    \"color\": \"#4078f2\"\n  },\n  \"hljs-title\": {\n    \"color\": \"#4078f2\"\n  },\n  \"hljs-emphasis\": {\n    \"fontStyle\": \"italic\"\n  },\n  \"hljs-strong\": {\n    \"fontWeight\": \"bold\"\n  }\n};","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Light as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport atomOneLight from 'react-syntax-highlighter/dist/esm/styles/hljs/atom-one-light';\nimport {\n  SCAN_WARNING_THRESHOLD,\n  SCAN_CRITICAL_THRESHOLD,\n} from '../../constants';\n\n/**\n * Helper to extract dimension node name from a dimension path\n * e.g., \"v3.customer.name\" -> \"v3.customer\"\n * e.g., \"v3.date.month[order]\" -> \"v3.date\"\n */\nfunction getDimensionNodeName(dimPath) {\n  // Remove role suffix if present (e.g., \"[order]\")\n  const pathWithoutRole = dimPath.split('[')[0];\n  // Split by dot and remove the last segment (column name)\n  const parts = pathWithoutRole.split('.');\n  if (parts.length > 1) {\n    return parts.slice(0, -1).join('.');\n  }\n  return pathWithoutRole;\n}\n\n/**\n * Helper to normalize grain columns to short names for lookup key\n */\nfunction normalizeGrain(grainCols) {\n  return (grainCols || [])\n    .map(col => col.split('.').pop())\n    .sort()\n    .join(',');\n}\n\n/**\n * Helper to get a human-readable schedule summary from cron expression\n */\nfunction getScheduleSummary(schedule) {\n  if (!schedule) return null;\n\n  // Basic cron parsing for common patterns\n  const parts = schedule.split(' ');\n  if (parts.length < 5) return schedule;\n\n  const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;\n\n  // Daily at specific hour\n  if (dayOfMonth === '*' && month === '*' && dayOfWeek === '*') {\n    const hourNum = parseInt(hour, 10);\n    const minuteNum = parseInt(minute, 10);\n    if (!isNaN(hourNum) && !isNaN(minuteNum)) {\n      const period = hourNum >= 12 ? 'pm' : 'am';\n      const displayHour = hourNum > 12 ? hourNum - 12 : hourNum || 12;\n      const displayMinute = minuteNum.toString().padStart(2, '0');\n      return `Daily @ ${displayHour}:${displayMinute}${period}`;\n    }\n  }\n\n  // Weekly\n  if (dayOfMonth === '*' && month === '*' && dayOfWeek !== '*') {\n    const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n    const dayNum = parseInt(dayOfWeek, 10);\n    if (!isNaN(dayNum) && dayNum >= 0 && dayNum <= 6) {\n      return `Weekly on ${days[dayNum]}`;\n    }\n  }\n\n  return schedule;\n}\n\n/**\n * Helper to get status display info\n */\nfunction getStatusInfo(preagg) {\n  if (!preagg || preagg.workflow_urls?.length === 0) {\n    return {\n      icon: '○',\n      text: 'Not planned',\n      className: 'status-not-planned',\n      color: '#94a3b8',\n    };\n  }\n\n  // Check if this is a compatible (superset) pre-agg, not exact match\n  if (preagg._isCompatible) {\n    // Show that this grain is covered by an existing pre-agg with more dimensions\n    const preaggGrain = preagg.grain_columns\n      ?.map(g => g.split('.').pop())\n      .join(', ');\n\n    // Check if that compatible pre-agg has data\n    if (preagg.availability || preagg.status === 'active') {\n      return {\n        icon: '✓',\n        text: `Covered (${preaggGrain})`,\n        className: 'status-compatible-materialized',\n        color: '#059669',\n        isCompatible: true,\n      };\n    }\n    return {\n      icon: '◐',\n      text: `Covered (${preaggGrain})`,\n      className: 'status-compatible',\n      color: '#d97706',\n      isCompatible: true,\n    };\n  }\n\n  // Check for running status (job is in progress)\n  if (preagg.status === 'running') {\n    return {\n      icon: '◉',\n      text: 'Running',\n      className: 'status-running',\n      color: '#2563eb',\n    };\n  }\n\n  // Check availability for materialization status (active = has data)\n  if (preagg.availability || preagg.status === 'active') {\n    return {\n      icon: '●',\n      text: 'Materialized',\n      className: 'status-materialized',\n      color: '#059669',\n    };\n  }\n\n  // Check if workflow is active\n  if (preagg.workflow_status === 'active') {\n    return {\n      icon: '◐',\n      text: 'Workflow Active',\n      className: 'status-workflow-active',\n      color: '#2563eb',\n    };\n  }\n\n  // Check if workflow is paused\n  if (preagg.workflow_status === 'paused') {\n    return {\n      icon: '◐',\n      text: 'Workflow Paused',\n      className: 'status-workflow-paused',\n      color: '#94a3b8',\n    };\n  }\n\n  // Check if workflow is being configured (has URLs but not yet active)\n  // Only show \"Pending\" if workflows exist but aren't active yet\n  if (preagg.workflow_urls?.length > 0) {\n    return {\n      icon: '◐',\n      text: 'Pending',\n      className: 'status-pending',\n      color: '#d97706',\n    };\n  }\n\n  // No workflow configured - show \"Not planned\"\n  return {\n    icon: '○',\n    text: 'Not planned',\n    className: 'status-not-planned',\n    color: '#94a3b8',\n  };\n}\n\n/**\n * QueryOverviewPanel - Default view showing metrics SQL and pre-agg summary\n *\n * Shown when no node is selected in the graph\n */\n/**\n * Get recommended schedule based on granularity\n */\nfunction getRecommendedSchedule(granularity) {\n  switch (granularity?.toUpperCase()) {\n    case 'HOUR':\n      return { cron: '0 * * * *', label: 'Hourly' };\n    case 'DAY':\n    default:\n      return { cron: '0 6 * * *', label: 'Daily at 6:00 AM' };\n  }\n}\n\n/**\n * Get granularity hint from grain columns\n */\nfunction inferGranularity(grainGroups) {\n  for (const gg of grainGroups || []) {\n    for (const col of gg.grain || []) {\n      const colName = col.split('.').pop().toLowerCase();\n      if (colName.includes('hour')) return 'HOUR';\n    }\n  }\n  return 'DAY'; // Default\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes) {\n  if (!bytes || bytes === 0) return '0 B';\n  const k = 1024;\n  const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Get warning level for scan size\n */\nfunction getScanWarningLevel(bytes) {\n  if (bytes > SCAN_CRITICAL_THRESHOLD) return 'critical';\n  if (bytes > SCAN_WARNING_THRESHOLD) return 'warning';\n  return 'ok';\n}\n\n/**\n * Format scan estimate for display\n */\nfunction formatScanEstimate(scanEstimate) {\n  if (\n    !scanEstimate ||\n    !scanEstimate.sources ||\n    scanEstimate.sources.length === 0\n  ) {\n    return null;\n  }\n\n  // Check if any sources are missing size data\n  const hasMissingData = scanEstimate.sources.some(\n    s => s.total_bytes === null || s.total_bytes === undefined,\n  );\n\n  // Determine warning level based on total_bytes (if available)\n  let level = 'unknown';\n  let icon = 'ℹ️';\n  if (\n    scanEstimate.total_bytes !== null &&\n    scanEstimate.total_bytes !== undefined\n  ) {\n    level = getScanWarningLevel(scanEstimate.total_bytes);\n    icon = level === 'critical' ? '⚠️' : level === 'warning' ? '⚡' : '✓';\n  }\n\n  return {\n    icon,\n    level,\n    totalBytes: scanEstimate.total_bytes,\n    sources: scanEstimate.sources || [],\n    hasMissingData,\n  };\n}\n\n/**\n * CubeBackfillModal - Simple modal to collect start/end dates for backfill\n */\nfunction CubeBackfillModal({ onClose, onSubmit, loading }) {\n  // Default to last 7 days\n  const today = new Date().toISOString().split('T')[0];\n  const weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)\n    .toISOString()\n    .split('T')[0];\n\n  const [startDate, setStartDate] = useState(weekAgo);\n  const [endDate, setEndDate] = useState(today);\n\n  return (\n    <div className=\"backfill-modal-overlay\" onClick={onClose}>\n      <div className=\"backfill-modal\" onClick={e => e.stopPropagation()}>\n        <div className=\"backfill-modal-header\">\n          <h3>Run Cube Backfill</h3>\n          <button className=\"modal-close\" onClick={onClose}>\n            ×\n          </button>\n        </div>\n        <div className=\"backfill-modal-body\">\n          <p className=\"backfill-description\">\n            Run a backfill for the specified date range:\n          </p>\n          <div className=\"backfill-date-inputs\">\n            <div className=\"date-input-group\">\n              <label htmlFor=\"backfill-start\">Start Date</label>\n              <input\n                id=\"backfill-start\"\n                type=\"date\"\n                value={startDate}\n                onChange={e => setStartDate(e.target.value)}\n                disabled={loading}\n              />\n            </div>\n            <div className=\"date-input-group\">\n              <label htmlFor=\"backfill-end\">End Date</label>\n              <input\n                id=\"backfill-end\"\n                type=\"date\"\n                value={endDate}\n                onChange={e => setEndDate(e.target.value)}\n                disabled={loading}\n              />\n            </div>\n          </div>\n        </div>\n        <div className=\"backfill-modal-actions\">\n          <button\n            className=\"action-btn action-btn-secondary\"\n            onClick={onClose}\n            disabled={loading}\n          >\n            Cancel\n          </button>\n          <button\n            className=\"action-btn action-btn-primary\"\n            disabled={loading || !startDate}\n            onClick={() => onSubmit(startDate, endDate || null)}\n          >\n            {loading ? (\n              <>\n                <span className=\"spinner\" /> Starting...\n              </>\n            ) : (\n              'Start Backfill'\n            )}\n          </button>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport function QueryOverviewPanel({\n  measuresResult,\n  metricsResult,\n  selectedMetrics,\n  selectedDimensions,\n  plannedPreaggs = {},\n  onPlanMaterialization,\n  onUpdateConfig,\n  onCreateWorkflow,\n  onRunBackfill,\n  onRunAdhoc,\n  onFetchRawSql,\n  onSetPartition,\n  onRefreshMeasures,\n  onFetchNodePartitions,\n  materializationError,\n  onClearError,\n  workflowUrls = [],\n  onClearWorkflowUrls,\n  loadedCubeName = null, // Existing cube name if loaded from preset\n  cubeMaterialization = null, // Full cube materialization info {schedule, strategy, lookbackWindow, ...}\n  onUpdateCubeConfig,\n  onRefreshCubeWorkflow,\n  onRunCubeBackfill,\n  onDeactivatePreaggWorkflow,\n  onDeactivateCubeWorkflow,\n}) {\n  // Extract default namespace from the first selected metric (e.g., \"v3.total_revenue\" -> \"v3\")\n  const getDefaultNamespace = useCallback(() => {\n    if (selectedMetrics && selectedMetrics.length > 0) {\n      const firstMetric = selectedMetrics[0];\n      const parts = firstMetric.split('.');\n      // Take all parts except the last one (the metric name)\n      if (parts.length > 1) {\n        return parts.slice(0, -1).join('.');\n      }\n    }\n    return 'default';\n  }, [selectedMetrics]);\n\n  const [expandedCards, setExpandedCards] = useState({});\n  const [configuringCard, setConfiguringCard] = useState(null); // '__all__' for section-level\n  const [editingCard, setEditingCard] = useState(null); // grainKey of existing card being edited\n  const [editingCube, setEditingCube] = useState(false); // Whether cube config form is open\n  const [cubeBackfillModal, setCubeBackfillModal] = useState(false); // Cube backfill modal state\n  const [cubeConfigForm, setCubeConfigForm] = useState({\n    strategy: 'incremental_time',\n    schedule: '0 6 * * *',\n    lookbackWindow: '1 DAY',\n  });\n  const [isSavingCube, setIsSavingCube] = useState(false);\n\n  // Partition setup form state (for setting up temporal partition inline)\n  // Map of nodeName -> { column, granularity, format }\n  const [showPartitionSetup, setShowPartitionSetup] = useState(false);\n  const [partitionForms, setPartitionForms] = useState({});\n  const [settingPartitionFor, setSettingPartitionFor] = useState(null); // nodeName being set\n  const [partitionErrors, setPartitionErrors] = useState({}); // nodeName -> error\n\n  // Actual temporal partitions from source nodes (fetched via API)\n  // Map of nodeName -> { columns, temporalPartitions }\n  const [allNodePartitions, setAllNodePartitions] = useState({});\n  const [partitionsLoading, setPartitionsLoading] = useState(false);\n\n  // Enhanced config form state\n  const [configForm, setConfigForm] = useState({\n    strategy: 'incremental_time',\n    backfillFrom: '',\n    backfillTo: 'today', // 'today' or specific date\n    backfillToDate: '',\n    continueAfterBackfill: true,\n    schedule: '',\n    scheduleType: 'auto', // 'auto' or 'custom'\n    lookbackWindow: '1 day',\n    // Druid cube materialization settings\n    enableDruidCube: true,\n    druidCubeNamespace: '', // Will be initialized with user's namespace\n    druidCubeName: '', // Short name without namespace\n  });\n  const [isSaving, setIsSaving] = useState(false);\n  const [loadingAction, setLoadingAction] = useState(null); // Track which action is loading: 'workflow', 'backfill', 'trigger'\n\n  // Backfill modal state (for existing pre-aggs)\n  const [backfillModal, setBackfillModal] = useState(null);\n\n  // Toast state for job URLs\n  const [toastMessage, setToastMessage] = useState(null);\n\n  // SQL view toggle state: 'optimized' (uses pre-aggs) or 'raw' (from source tables)\n  const [sqlViewMode, setSqlViewMode] = useState('optimized');\n  const [rawResult, setRawResult] = useState(null);\n  const [loadingRawSql, setLoadingRawSql] = useState(false);\n\n  // Handle SQL view toggle\n  const handleSqlViewToggle = async mode => {\n    setSqlViewMode(mode);\n    // Fetch raw SQL lazily when switching to raw mode\n    if (mode === 'raw' && !rawResult && onFetchRawSql) {\n      setLoadingRawSql(true);\n      const result = await onFetchRawSql();\n      setRawResult(result);\n      setLoadingRawSql(false);\n    }\n  };\n\n  // Get unique parent nodes from grain groups\n  const getUniqueParentNodes = useCallback(() => {\n    const grainGroups = measuresResult?.grain_groups || [];\n    const uniqueNodes = new Set();\n    grainGroups.forEach(gg => {\n      if (gg.parent_name) uniqueNodes.add(gg.parent_name);\n    });\n    return Array.from(uniqueNodes);\n  }, [measuresResult?.grain_groups]);\n\n  // Fetch actual partition info for ALL source nodes when config form opens\n  // Returns a map of nodeName -> { columns, temporalPartitions }\n  const fetchAllNodePartitions = useCallback(async () => {\n    const parentNodes = getUniqueParentNodes();\n    if (parentNodes.length === 0 || !onFetchNodePartitions) {\n      setAllNodePartitions({});\n      return {};\n    }\n\n    setPartitionsLoading(true);\n    try {\n      const results = {};\n      // Fetch partitions for all nodes in parallel\n      const promises = parentNodes.map(async nodeName => {\n        try {\n          const result = await onFetchNodePartitions(nodeName);\n          results[nodeName] = result;\n        } catch (err) {\n          console.error(`Failed to fetch partitions for ${nodeName}:`, err);\n          results[nodeName] = { columns: [], temporalPartitions: [] };\n        }\n      });\n      await Promise.all(promises);\n      console.log('[fetchAllNodePartitions] results:', results);\n      setAllNodePartitions(results);\n      return results;\n    } catch (err) {\n      console.error('Failed to fetch node partitions:', err);\n      setAllNodePartitions({});\n      return {};\n    } finally {\n      setPartitionsLoading(false);\n    }\n  }, [getUniqueParentNodes, onFetchNodePartitions]);\n\n  // Check if ALL parent nodes have temporal partitions\n  const hasActualTemporalPartitions = useCallback(() => {\n    const parentNodes = getUniqueParentNodes();\n    if (parentNodes.length === 0) return false;\n\n    // All nodes must have temporal partitions\n    const allHaveTemporal = parentNodes.every(nodeName => {\n      const nodePartitions = allNodePartitions[nodeName];\n      return nodePartitions?.temporalPartitions?.length > 0;\n    });\n\n    console.log('[hasActualTemporalPartitions]', {\n      parentNodes,\n      allNodePartitions,\n      allHaveTemporal,\n    });\n    return allHaveTemporal;\n  }, [getUniqueParentNodes, allNodePartitions]);\n\n  // Get nodes that are missing temporal partitions\n  const getNodesMissingPartitions = useCallback(() => {\n    const parentNodes = getUniqueParentNodes();\n    return parentNodes.filter(nodeName => {\n      const nodePartitions = allNodePartitions[nodeName];\n      return !nodePartitions?.temporalPartitions?.length;\n    });\n  }, [getUniqueParentNodes, allNodePartitions]);\n\n  // Initialize config form with smart defaults when opening\n  const openConfigForm = async () => {\n    const grainGroups = measuresResult?.grain_groups || [];\n    const granularity = inferGranularity(grainGroups);\n    const recommended = getRecommendedSchedule(granularity);\n\n    // Default backfill start to 30 days ago\n    const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)\n      .toISOString()\n      .split('T')[0];\n\n    // Fetch actual partition info for ALL source nodes\n    const partitionResults = await fetchAllNodePartitions();\n\n    // Check if ALL nodes have temporal partitions\n    const parentNodes = getUniqueParentNodes();\n    const allHaveTemporal = parentNodes.every(\n      nodeName => partitionResults[nodeName]?.temporalPartitions?.length > 0,\n    );\n    console.log(\n      '[openConfigForm] allHaveTemporal:',\n      allHaveTemporal,\n      'partitionResults:',\n      partitionResults,\n    );\n\n    // Initialize partition forms for nodes missing partitions\n    const datePattern =\n      /date|time|day|month|year|hour|ds|dt|dateint|timestamp/i;\n    const initialForms = {};\n    parentNodes.forEach(nodeName => {\n      const nodePartitions = partitionResults[nodeName];\n      if (!nodePartitions?.temporalPartitions?.length) {\n        // Find best default column (date-like, unpartitioned)\n        const cols = (nodePartitions?.columns || []).filter(c => !c.partition);\n        const sortedCols = [...cols].sort((a, b) => {\n          const aIsDate = datePattern.test(a.name);\n          const bIsDate = datePattern.test(b.name);\n          if (aIsDate && !bIsDate) return -1;\n          if (!aIsDate && bIsDate) return 1;\n          return a.name.localeCompare(b.name);\n        });\n        initialForms[nodeName] = {\n          column: sortedCols[0]?.name || '',\n          granularity: 'day',\n          format: 'yyyyMMdd',\n        };\n      }\n    });\n    setPartitionForms(initialForms);\n    setPartitionErrors({});\n\n    setConfigForm({\n      strategy: allHaveTemporal ? 'incremental_time' : 'full',\n      runBackfill: true, // Option to skip backfill\n      backfillFrom: thirtyDaysAgo,\n      backfillTo: 'today',\n      backfillToDate: '',\n      continueAfterBackfill: true,\n      schedule: recommended.cron,\n      scheduleType: 'auto',\n      lookbackWindow: '1 day',\n      _recommendedSchedule: recommended, // Store for display\n      _granularity: granularity,\n      // Druid cube settings\n      enableDruidCube: true,\n      druidCubeNamespace: getDefaultNamespace(), // Default to first metric's namespace\n      druidCubeName: '', // Short name without namespace\n    });\n    setConfiguringCard('__all__');\n  };\n\n  // Helper to start editing an existing pre-agg's config\n  const startEditingConfig = (grainKey, existingPreagg) => {\n    setConfigForm({\n      strategy: existingPreagg.strategy || 'incremental_time',\n      backfillFrom: '',\n      backfillTo: 'today',\n      backfillToDate: '',\n      continueAfterBackfill: true,\n      schedule: existingPreagg.schedule || '',\n      scheduleType: existingPreagg.schedule ? 'custom' : 'auto',\n      lookbackWindow: existingPreagg.lookback_window || '',\n    });\n    setEditingCard(grainKey);\n  };\n\n  const copyToClipboard = text => {\n    navigator.clipboard.writeText(text);\n  };\n\n  const toggleCardExpanded = cardKey => {\n    setExpandedCards(prev => ({\n      ...prev,\n      [cardKey]: !prev[cardKey],\n    }));\n  };\n\n  // No selection yet\n  if (!selectedMetrics?.length || !selectedDimensions?.length) {\n    return (\n      <div className=\"details-panel details-panel-empty\">\n        <div className=\"empty-hint\">\n          <div className=\"empty-icon\">⊞</div>\n          <h4>Query Planner</h4>\n          <p>\n            Select metrics and dimensions from the left panel to see the\n            generated SQL and pre-aggregation plan\n          </p>\n        </div>\n      </div>\n    );\n  }\n\n  // Loading or no results yet\n  if (!measuresResult || !metricsResult) {\n    return (\n      <div className=\"details-panel details-panel-empty\">\n        <div className=\"empty-hint\">\n          <div className=\"loading-spinner\" />\n          <p>Building query plan...</p>\n        </div>\n      </div>\n    );\n  }\n\n  const grainGroups = measuresResult.grain_groups || [];\n  const metricFormulas = measuresResult.metric_formulas || [];\n  const sql = metricsResult.sql || '';\n\n  // Determine if materialization is already configured (has active workflows)\n  const isMaterialized =\n    workflowUrls.length > 0 ||\n    Object.values(plannedPreaggs).some(p => p?.workflow_urls?.length > 0);\n\n  // Get materialization summary for collapsed state\n  const getMaterializationSummary = () => {\n    const hasCube = workflowUrls.length > 0;\n    const preaggCount = Object.values(plannedPreaggs).filter(\n      p => p?.workflow_urls?.length > 0,\n    ).length;\n    const strategy =\n      Object.values(plannedPreaggs).find(p => p?.strategy)?.strategy ||\n      'incremental_time';\n    const schedule =\n      Object.values(plannedPreaggs).find(p => p?.schedule)?.schedule ||\n      '0 6 * * *';\n    return {\n      hasCube,\n      preaggCount,\n      strategy: strategy === 'incremental_time' ? 'Incremental' : 'Full',\n      schedule: getScheduleSummary(schedule),\n    };\n  };\n\n  return (\n    <div className=\"details-panel\">\n      {/* Header */}\n      <div className=\"details-header\">\n        <h2 className=\"details-title\">Query Plan</h2>\n        <p className=\"details-full-name\">\n          {selectedMetrics.length} metric\n          {selectedMetrics.length !== 1 ? 's' : ''} ×{' '}\n          {selectedDimensions.length} dimension\n          {selectedDimensions.length !== 1 ? 's' : ''}\n        </p>\n      </div>\n\n      {/* Global Materialization Error Banner - always visible when there's an error */}\n      {materializationError && (\n        <div className=\"materialization-error global-error\">\n          <div className=\"error-content\">\n            <span className=\"error-icon\">⚠</span>\n            <span className=\"error-message\">{materializationError}</span>\n          </div>\n          <button\n            className=\"error-dismiss\"\n            onClick={onClearError}\n            aria-label=\"Dismiss error\"\n          >\n            ×\n          </button>\n        </div>\n      )}\n\n      {/* Materialization Config Section - Only show when there's content */}\n      {grainGroups.length > 0 &&\n        onPlanMaterialization &&\n        (!isMaterialized || configuringCard === '__all__') && (\n          <div className=\"details-section\">\n            {/* State A: Not materialized - show CTA */}\n            {!isMaterialized && configuringCard !== '__all__' && (\n              <div className=\"plan-materialization-cta\">\n                <div className=\"cta-content\">\n                  <div className=\"cta-icon\">⚡</div>\n                  <div className=\"cta-text\">\n                    <strong>Ready to materialize?</strong>\n                    <span>\n                      Configure scheduled materialization for faster queries\n                    </span>\n                  </div>\n                </div>\n                <button\n                  className=\"action-btn action-btn-primary\"\n                  type=\"button\"\n                  onClick={openConfigForm}\n                >\n                  Configure\n                </button>\n              </div>\n            )}\n\n            {/* Section-level Configuration Form - Enhanced */}\n            {configuringCard === '__all__' && (\n              <div className=\"materialization-config-form section-level-config\">\n                <div className=\"config-form-header\">\n                  <span>Configure Materialization</span>\n                  <button\n                    className=\"config-close-btn\"\n                    type=\"button\"\n                    onClick={() => setConfiguringCard(null)}\n                  >\n                    ×\n                  </button>\n                </div>\n                <div className=\"config-form-body\">\n                  {/* Strategy */}\n                  <div className=\"config-form-row\">\n                    <label className=\"config-form-label\">Strategy</label>\n                    <div className=\"config-form-options\">\n                      <label className=\"radio-option\">\n                        <input\n                          type=\"radio\"\n                          name=\"strategy-all\"\n                          value=\"full\"\n                          checked={configForm.strategy === 'full'}\n                          onChange={e =>\n                            setConfigForm(prev => ({\n                              ...prev,\n                              strategy: e.target.value,\n                            }))\n                          }\n                        />\n                        <span>Full</span>\n                      </label>\n                      <label className=\"radio-option\">\n                        <input\n                          type=\"radio\"\n                          name=\"strategy-all\"\n                          value=\"incremental_time\"\n                          checked={configForm.strategy === 'incremental_time'}\n                          onChange={e => {\n                            setConfigForm(prev => ({\n                              ...prev,\n                              strategy: e.target.value,\n                            }));\n                            // Auto-show partition setup if any node is missing temporal partition\n                            if (\n                              !hasActualTemporalPartitions() &&\n                              !partitionsLoading\n                            ) {\n                              setShowPartitionSetup(true);\n                            }\n                          }}\n                        />\n                        <span>Incremental</span>\n                        {configForm.strategy === 'incremental_time' &&\n                          (partitionsLoading ? (\n                            <span className=\"option-hint\">(checking...)</span>\n                          ) : hasActualTemporalPartitions() ? (\n                            <span className=\"partition-badge\">\n                              {getUniqueParentNodes()\n                                .map(\n                                  nodeName =>\n                                    allNodePartitions[nodeName]\n                                      ?.temporalPartitions?.[0]?.name,\n                                )\n                                .filter(Boolean)\n                                .join(', ')}\n                            </span>\n                          ) : null)}\n                      </label>\n                    </div>\n                  </div>\n\n                  {/* Inline Partition Setup Form - Per Node */}\n                  {showPartitionSetup &&\n                    configForm.strategy === 'incremental_time' &&\n                    !hasActualTemporalPartitions() && (\n                      <div className=\"partition-setup-form\">\n                        <div className=\"partition-setup-header\">\n                          <span className=\"partition-setup-icon\">⚠️</span>\n                          <span>\n                            Set up temporal partitions for incremental builds\n                          </span>\n                        </div>\n\n                        <div className=\"partition-setup-body\">\n                          {getUniqueParentNodes().map(nodeName => {\n                            const nodePartitions = allNodePartitions[nodeName];\n                            const hasTemporal =\n                              nodePartitions?.temporalPartitions?.length > 0;\n                            const form = partitionForms[nodeName] || {\n                              column: '',\n                              granularity: 'day',\n                              format: 'yyyyMMdd',\n                            };\n                            const error = partitionErrors[nodeName];\n                            const isSettingThis =\n                              settingPartitionFor === nodeName;\n                            const shortName = nodeName.split('.').pop();\n\n                            // If this node already has temporal partitions, show success\n                            if (hasTemporal) {\n                              return (\n                                <div\n                                  key={nodeName}\n                                  className=\"partition-node-section partition-node-done\"\n                                >\n                                  <div className=\"partition-node-header\">\n                                    <span className=\"partition-node-name\">\n                                      <span className=\"partition-node-icon\">\n                                        ✓\n                                      </span>\n                                      {shortName}\n                                    </span>\n                                  </div>\n                                  <div className=\"partition-node-status\">\n                                    <span className=\"partition-badge\">\n                                      {\n                                        nodePartitions.temporalPartitions[0]\n                                          ?.name\n                                      }\n                                    </span>\n                                  </div>\n                                </div>\n                              );\n                            }\n\n                            // Show setup form for this node\n                            return (\n                              <div\n                                key={nodeName}\n                                className=\"partition-node-section\"\n                              >\n                                <div className=\"partition-node-header\">\n                                  <span className=\"partition-node-name\">\n                                    <span className=\"partition-node-icon\">\n                                      📦\n                                    </span>\n                                    {shortName}\n                                  </span>\n                                </div>\n\n                                {error && (\n                                  <div className=\"partition-setup-error\">\n                                    {error}\n                                  </div>\n                                )}\n\n                                <div className=\"partition-node-form\">\n                                  <div className=\"partition-field\">\n                                    <label>Column</label>\n                                    <select\n                                      value={form.column}\n                                      onChange={e =>\n                                        setPartitionForms(prev => ({\n                                          ...prev,\n                                          [nodeName]: {\n                                            ...form,\n                                            column: e.target.value,\n                                          },\n                                        }))\n                                      }\n                                    >\n                                      <option value=\"\">Select...</option>\n                                      {(() => {\n                                        const datePattern =\n                                          /date|time|day|month|year|hour|ds|dt|dateint|timestamp/i;\n                                        return (nodePartitions?.columns || [])\n                                          .filter(col => !col.partition)\n                                          .map(col => ({\n                                            ...col,\n                                            isDateLike: datePattern.test(\n                                              col.name,\n                                            ),\n                                          }))\n                                          .sort((a, b) => {\n                                            if (a.isDateLike && !b.isDateLike)\n                                              return -1;\n                                            if (!a.isDateLike && b.isDateLike)\n                                              return 1;\n                                            return a.name.localeCompare(b.name);\n                                          })\n                                          .map(col => (\n                                            <option\n                                              key={col.name}\n                                              value={col.name}\n                                            >\n                                              {col.name}\n                                              {col.isDateLike ? ' ★' : ''}\n                                            </option>\n                                          ));\n                                      })()}\n                                    </select>\n                                  </div>\n                                  <div className=\"partition-field partition-field-small\">\n                                    <label>Granularity</label>\n                                    <select\n                                      value={form.granularity}\n                                      onChange={e =>\n                                        setPartitionForms(prev => ({\n                                          ...prev,\n                                          [nodeName]: {\n                                            ...form,\n                                            granularity: e.target.value,\n                                          },\n                                        }))\n                                      }\n                                    >\n                                      <option value=\"day\">Day</option>\n                                      <option value=\"hour\">Hour</option>\n                                      <option value=\"month\">Month</option>\n                                    </select>\n                                  </div>\n                                  <div className=\"partition-field partition-field-small\">\n                                    <label>Format</label>\n                                    <input\n                                      type=\"text\"\n                                      placeholder=\"yyyyMMdd\"\n                                      value={form.format}\n                                      onChange={e =>\n                                        setPartitionForms(prev => ({\n                                          ...prev,\n                                          [nodeName]: {\n                                            ...form,\n                                            format: e.target.value,\n                                          },\n                                        }))\n                                      }\n                                    />\n                                  </div>\n                                  <button\n                                    type=\"button\"\n                                    className=\"partition-set-btn\"\n                                    disabled={!form.column || isSettingThis}\n                                    onClick={async () => {\n                                      if (!form.column) return;\n\n                                      setSettingPartitionFor(nodeName);\n                                      setPartitionErrors(prev => ({\n                                        ...prev,\n                                        [nodeName]: null,\n                                      }));\n\n                                      try {\n                                        const result = await onSetPartition(\n                                          nodeName,\n                                          form.column,\n                                          'temporal',\n                                          form.format || 'yyyyMMdd',\n                                          form.granularity,\n                                        );\n\n                                        if (result?.status >= 400) {\n                                          throw new Error(\n                                            result.json?.message ||\n                                              'Failed to set partition',\n                                          );\n                                        }\n\n                                        // Refresh partitions to pick up the new one\n                                        await fetchAllNodePartitions();\n\n                                        // Check if all nodes now have partitions\n                                        if (hasActualTemporalPartitions()) {\n                                          setShowPartitionSetup(false);\n                                        }\n                                      } catch (err) {\n                                        setPartitionErrors(prev => ({\n                                          ...prev,\n                                          [nodeName]:\n                                            err.message ||\n                                            'Failed to set partition',\n                                        }));\n                                      } finally {\n                                        setSettingPartitionFor(null);\n                                      }\n                                    }}\n                                  >\n                                    {isSettingThis ? '...' : 'Set'}\n                                  </button>\n                                </div>\n                              </div>\n                            );\n                          })}\n                        </div>\n                      </div>\n                    )}\n\n                  {/* Run Backfill Option (only for incremental) */}\n                  {configForm.strategy === 'incremental_time' && (\n                    <div className=\"config-form-row\">\n                      <label className=\"checkbox-option\">\n                        <input\n                          type=\"checkbox\"\n                          checked={configForm.runBackfill}\n                          onChange={e =>\n                            setConfigForm(prev => ({\n                              ...prev,\n                              runBackfill: e.target.checked,\n                            }))\n                          }\n                        />\n                        <span>Run initial backfill</span>\n                      </label>\n                      <span className=\"config-form-hint\">\n                        Populate historical data. Uncheck to only set up ongoing\n                        materialization.\n                      </span>\n                    </div>\n                  )}\n\n                  {/* Backfill Date Range (only if runBackfill is checked) */}\n                  {configForm.strategy === 'incremental_time' &&\n                    configForm.runBackfill && (\n                      <div className=\"config-form-section\">\n                        <label className=\"config-form-section-label\">\n                          Backfill Date Range\n                        </label>\n                        <div className=\"backfill-range\">\n                          <div className=\"backfill-field\">\n                            <label>From</label>\n                            <input\n                              type=\"date\"\n                              value={configForm.backfillFrom}\n                              onChange={e =>\n                                setConfigForm(prev => ({\n                                  ...prev,\n                                  backfillFrom: e.target.value,\n                                }))\n                              }\n                            />\n                          </div>\n                          <div className=\"backfill-field\">\n                            <label>To</label>\n                            <select\n                              value={configForm.backfillTo}\n                              onChange={e =>\n                                setConfigForm(prev => ({\n                                  ...prev,\n                                  backfillTo: e.target.value,\n                                }))\n                              }\n                            >\n                              <option value=\"today\">Today</option>\n                              <option value=\"specific\">Specific date</option>\n                            </select>\n                            {configForm.backfillTo === 'specific' && (\n                              <input\n                                type=\"date\"\n                                value={configForm.backfillToDate}\n                                onChange={e =>\n                                  setConfigForm(prev => ({\n                                    ...prev,\n                                    backfillToDate: e.target.value,\n                                  }))\n                                }\n                                style={{ marginTop: '6px' }}\n                              />\n                            )}\n                          </div>\n                        </div>\n                      </div>\n                    )}\n\n                  {/* Schedule - always shown since we always create workflows */}\n                  <div className=\"config-form-row\">\n                    <label className=\"config-form-label\">Schedule</label>\n                    <select\n                      className=\"config-form-select\"\n                      value={configForm.scheduleType}\n                      onChange={e => {\n                        const type = e.target.value;\n                        setConfigForm(prev => ({\n                          ...prev,\n                          scheduleType: type,\n                          schedule:\n                            type === 'auto'\n                              ? prev._recommendedSchedule?.cron || '0 6 * * *'\n                              : prev.schedule,\n                        }));\n                      }}\n                    >\n                      <option value=\"auto\">\n                        {configForm._recommendedSchedule?.label ||\n                          'Daily at 6:00 AM'}{' '}\n                        (recommended)\n                      </option>\n                      <option value=\"hourly\">Hourly</option>\n                      <option value=\"custom\">Custom cron...</option>\n                    </select>\n                    {configForm.scheduleType === 'custom' && (\n                      <input\n                        type=\"text\"\n                        className=\"config-form-input\"\n                        placeholder=\"0 6 * * *\"\n                        value={configForm.schedule}\n                        onChange={e =>\n                          setConfigForm(prev => ({\n                            ...prev,\n                            schedule: e.target.value,\n                          }))\n                        }\n                        style={{ marginTop: '6px' }}\n                      />\n                    )}\n                    {configForm.scheduleType === 'auto' && (\n                      <span className=\"config-form-hint\">\n                        Based on{' '}\n                        {configForm._granularity?.toLowerCase() || 'daily'}{' '}\n                        partition granularity\n                      </span>\n                    )}\n                  </div>\n\n                  {/* Lookback Window (only for incremental) */}\n                  {configForm.strategy === 'incremental_time' && (\n                    <div className=\"config-form-row\">\n                      <label className=\"config-form-label\">\n                        Lookback Window\n                      </label>\n                      <input\n                        type=\"text\"\n                        className=\"config-form-input\"\n                        placeholder=\"1 day\"\n                        value={configForm.lookbackWindow}\n                        onChange={e =>\n                          setConfigForm(prev => ({\n                            ...prev,\n                            lookbackWindow: e.target.value,\n                          }))\n                        }\n                      />\n                      <span className=\"config-form-hint\">\n                        For late-arriving data (e.g., \"1 day\", \"3 days\")\n                      </span>\n                    </div>\n                  )}\n\n                  {/* Druid Cube Materialization Section */}\n                  <div className=\"config-form-divider\">\n                    <span>Cube Materialization (Druid)</span>\n                  </div>\n\n                  <div className=\"config-form-row\">\n                    <label className=\"checkbox-option\">\n                      <input\n                        type=\"checkbox\"\n                        checked={configForm.enableDruidCube}\n                        onChange={e =>\n                          setConfigForm(prev => ({\n                            ...prev,\n                            enableDruidCube: e.target.checked,\n                          }))\n                        }\n                      />\n                      Enable Druid cube materialization\n                    </label>\n                    <span className=\"config-form-hint\">\n                      Combines pre-aggs into a single Druid datasource for fast\n                      interactive queries\n                    </span>\n                  </div>\n\n                  {/* Druid cube config (shown when enabled and there is no associated cube) */}\n                  {configForm.enableDruidCube && !loadedCubeName && (\n                    <div className=\"config-form-section druid-cube-config\">\n                      {/* Show existing cube or prompt for new name */}\n                      {loadedCubeName ? (\n                        <div className=\"config-form-row\">\n                          <label className=\"config-form-label\">\n                            Using Cube\n                          </label>\n                          <div className=\"existing-cube-name\">\n                            <span className=\"cube-badge\">📦</span>\n                            <code>{loadedCubeName}</code>\n                          </div>\n                          <span className=\"config-form-hint\">\n                            Materialization will be added to this existing cube\n                          </span>\n                        </div>\n                      ) : (\n                        <div className=\"config-form-row\">\n                          <label className=\"config-form-label\">Cube Name</label>\n                          <div className=\"cube-name-input-group\">\n                            <input\n                              type=\"text\"\n                              className=\"config-form-input namespace-input\"\n                              placeholder=\"users.myname\"\n                              value={configForm.druidCubeNamespace}\n                              onChange={e =>\n                                setConfigForm(prev => ({\n                                  ...prev,\n                                  druidCubeNamespace: e.target.value,\n                                }))\n                              }\n                            />\n                            <span className=\"namespace-separator\">.</span>\n                            <input\n                              type=\"text\"\n                              className=\"config-form-input name-input\"\n                              placeholder=\"my_cube\"\n                              value={configForm.druidCubeName}\n                              onChange={e =>\n                                setConfigForm(prev => ({\n                                  ...prev,\n                                  druidCubeName: e.target.value,\n                                }))\n                              }\n                            />\n                          </div>\n                          <span className=\"config-form-hint\">\n                            Full name:{' '}\n                            <code>\n                              {configForm.druidCubeNamespace}.\n                              {configForm.druidCubeName || 'my_cube'}\n                            </code>\n                          </span>\n                        </div>\n                      )}\n\n                      {/* Preview of what will be combined */}\n                      <div className=\"druid-cube-preview\">\n                        <div className=\"preview-label\">\n                          Pre-aggregations to combine:\n                        </div>\n                        <div className=\"preview-list\">\n                          {(measuresResult?.grain_groups || []).map((gg, i) => (\n                            <div key={i} className=\"preview-item\">\n                              <span className=\"preview-source\">\n                                {gg.parent_name?.split('.').pop()}\n                              </span>\n                              <span className=\"preview-grain\">\n                                (\n                                {(gg.grain || [])\n                                  .map(g => g.split('.').pop())\n                                  .join(', ')}\n                                )\n                              </span>\n                            </div>\n                          ))}\n                        </div>\n                        <div className=\"preview-info\">\n                          <span className=\"info-icon\">ℹ️</span>\n                          Pre-aggs will be combined with FULL OUTER JOIN on\n                          shared dimensions and ingested to Druid\n                        </div>\n                      </div>\n                    </div>\n                  )}\n                </div>\n                <div className=\"config-form-actions\">\n                  <button\n                    className=\"action-btn action-btn-secondary\"\n                    type=\"button\"\n                    onClick={() => setConfiguringCard(null)}\n                  >\n                    Cancel\n                  </button>\n                  <button\n                    className=\"action-btn action-btn-primary\"\n                    type=\"button\"\n                    disabled={isSaving}\n                    onClick={async () => {\n                      setIsSaving(true);\n                      try {\n                        // Compute the actual schedule value\n                        let finalSchedule = configForm.schedule;\n                        if (configForm.scheduleType === 'auto') {\n                          finalSchedule =\n                            configForm._recommendedSchedule?.cron ||\n                            '0 6 * * *';\n                        } else if (configForm.scheduleType === 'hourly') {\n                          finalSchedule = '0 * * * *';\n                        }\n\n                        // Compute backfill end date\n                        let backfillEndDate = null;\n                        if (configForm.strategy === 'incremental_time') {\n                          backfillEndDate =\n                            configForm.backfillTo === 'today'\n                              ? new Date().toISOString().split('T')[0]\n                              : configForm.backfillToDate;\n                        }\n\n                        // Build the config object for the API\n                        const apiConfig = {\n                          strategy: configForm.strategy,\n                          schedule: finalSchedule, // Always set - we always create workflows\n                          lookbackWindow:\n                            configForm.strategy === 'incremental_time'\n                              ? configForm.lookbackWindow\n                              : null,\n                          // Backfill info (only for incremental + runBackfill checked)\n                          runBackfill: configForm.runBackfill,\n                          backfillFrom:\n                            configForm.strategy === 'incremental_time' &&\n                            configForm.runBackfill\n                              ? configForm.backfillFrom\n                              : null,\n                          backfillTo:\n                            configForm.strategy === 'incremental_time' &&\n                            configForm.runBackfill\n                              ? backfillEndDate\n                              : null,\n                          // Druid cube config\n                          enableDruidCube: configForm.enableDruidCube,\n                          // Only send cube name if creating a new cube (no existing cube loaded)\n                          // Combine namespace and name: \"users.myname.my_cube\"\n                          druidCubeName:\n                            configForm.enableDruidCube &&\n                            configForm.druidCubeName\n                              ? `${configForm.druidCubeNamespace}.${configForm.druidCubeName}`\n                              : null,\n                        };\n\n                        await onPlanMaterialization(null, apiConfig);\n                        setConfiguringCard(null);\n                        // Reset form to defaults\n                        setConfigForm({\n                          strategy: 'incremental_time',\n                          runBackfill: true,\n                          backfillFrom: '',\n                          backfillTo: 'today',\n                          backfillToDate: '',\n                          continueAfterBackfill: true,\n                          schedule: '',\n                          scheduleType: 'auto',\n                          lookbackWindow: '1 day',\n                          enableDruidCube: true,\n                          druidCubeNamespace: getDefaultNamespace(),\n                          druidCubeName: '',\n                        });\n                      } catch (err) {\n                        console.error('Failed to plan:', err);\n                      }\n                      setIsSaving(false);\n                    }}\n                  >\n                    {isSaving ? (\n                      <>\n                        <span className=\"spinner\" /> Creating...\n                      </>\n                    ) : configForm.enableDruidCube ? (\n                      'Create Pre-Agg Workflows & Schedule Cube'\n                    ) : configForm.strategy === 'incremental_time' &&\n                      configForm.runBackfill ? (\n                      'Create Workflow & Start Backfill'\n                    ) : (\n                      'Create Workflow'\n                    )}\n                  </button>\n                </div>\n              </div>\n            )}\n          </div>\n        )}\n\n      {/* Druid Cube Section - shown when cube is scheduled */}\n      {workflowUrls.length > 0 && (\n        <div className=\"details-section\">\n          <div className=\"section-header-row\">\n            <h3 className=\"section-title\">\n              <span className=\"section-icon cube-icon\">◆</span>\n              Druid Cube\n            </h3>\n          </div>\n\n          <div className=\"preagg-summary-card cube-card\">\n            {editingCube ? (\n              /* Edit Cube Config Form - matches pre-agg edit form exactly */\n              <div className=\"materialization-config-form\">\n                <div className=\"config-form-header\">\n                  <span>Edit Materialization Config</span>\n                  <button\n                    className=\"config-close-btn\"\n                    type=\"button\"\n                    onClick={() => setEditingCube(false)}\n                  >\n                    ×\n                  </button>\n                </div>\n                <div className=\"config-form-body\">\n                  <div className=\"config-form-row\">\n                    <label className=\"config-form-label\">Strategy</label>\n                    <div className=\"config-form-options\">\n                      <label className=\"radio-option\">\n                        <input\n                          type=\"radio\"\n                          name=\"cube-strategy\"\n                          value=\"full\"\n                          checked={cubeConfigForm.strategy === 'full'}\n                          onChange={e =>\n                            setCubeConfigForm(prev => ({\n                              ...prev,\n                              strategy: e.target.value,\n                            }))\n                          }\n                        />\n                        <span>Full</span>\n                      </label>\n                      <label className=\"radio-option\">\n                        <input\n                          type=\"radio\"\n                          name=\"cube-strategy\"\n                          value=\"incremental_time\"\n                          checked={\n                            cubeConfigForm.strategy === 'incremental_time'\n                          }\n                          onChange={e =>\n                            setCubeConfigForm(prev => ({\n                              ...prev,\n                              strategy: e.target.value,\n                            }))\n                          }\n                        />\n                        <span>Incremental (Time)</span>\n                      </label>\n                    </div>\n                  </div>\n                  <div className=\"config-form-row\">\n                    <label className=\"config-form-label\">Schedule (cron)</label>\n                    <input\n                      type=\"text\"\n                      className=\"config-form-input\"\n                      placeholder=\"0 6 * * * (daily at 6am)\"\n                      value={cubeConfigForm.schedule}\n                      onChange={e =>\n                        setCubeConfigForm(prev => ({\n                          ...prev,\n                          schedule: e.target.value,\n                        }))\n                      }\n                    />\n                  </div>\n                  {cubeConfigForm.strategy === 'incremental_time' && (\n                    <div className=\"config-form-row\">\n                      <label className=\"config-form-label\">\n                        Lookback Window\n                      </label>\n                      <input\n                        type=\"text\"\n                        className=\"config-form-input\"\n                        placeholder=\"3 days\"\n                        value={cubeConfigForm.lookbackWindow}\n                        onChange={e =>\n                          setCubeConfigForm(prev => ({\n                            ...prev,\n                            lookbackWindow: e.target.value,\n                          }))\n                        }\n                      />\n                    </div>\n                  )}\n                </div>\n                <div className=\"config-form-actions\">\n                  <button\n                    className=\"action-btn action-btn-secondary\"\n                    type=\"button\"\n                    onClick={() => setEditingCube(false)}\n                  >\n                    Cancel\n                  </button>\n                  <button\n                    className=\"action-btn action-btn-primary\"\n                    type=\"button\"\n                    disabled={isSavingCube}\n                    onClick={async () => {\n                      setIsSavingCube(true);\n                      try {\n                        if (onUpdateCubeConfig) {\n                          await onUpdateCubeConfig(cubeConfigForm);\n                        }\n                        setEditingCube(false);\n                      } catch (err) {\n                        console.error('Failed to save cube config:', err);\n                      }\n                      setIsSavingCube(false);\n                    }}\n                  >\n                    {isSavingCube ? (\n                      <>\n                        <span className=\"spinner\" /> Saving...\n                      </>\n                    ) : (\n                      'Save'\n                    )}\n                  </button>\n                </div>\n              </div>\n            ) : (\n              /* Cube Summary View - matches pre-agg expandable pattern */\n              <>\n                {/* Card header with name */}\n                <div className=\"preagg-summary-header\">\n                  <span className=\"preagg-summary-name cube-name\">\n                    {cubeMaterialization?.druidDatasource ||\n                      (loadedCubeName\n                        ? `dj__${loadedCubeName.replace(/\\./g, '_')}`\n                        : 'dj__cube')}\n                  </span>\n                  <span className=\"status-pill status-active\">● Active</span>\n                </div>\n\n                {/* Clickable workflow status bar */}\n                <div\n                  className=\"materialization-header clickable\"\n                  onClick={() =>\n                    setExpandedCards(prev => ({ ...prev, cube: !prev.cube }))\n                  }\n                >\n                  <div className=\"materialization-status\">\n                    <span\n                      className=\"status-indicator status-materialized\"\n                      style={{ color: '#059669' }}\n                    >\n                      ●\n                    </span>\n                    <span className=\"status-text\">Workflow active</span>\n                    {cubeMaterialization?.schedule && (\n                      <>\n                        <span className=\"status-separator\">|</span>\n                        <span className=\"schedule-summary\">\n                          {getScheduleSummary(cubeMaterialization.schedule)}\n                        </span>\n                      </>\n                    )}\n                  </div>\n                  <button\n                    className=\"expand-toggle\"\n                    type=\"button\"\n                    aria-label={expandedCards.cube ? 'Collapse' : 'Expand'}\n                  >\n                    {expandedCards.cube ? '▲' : '▼'}\n                  </button>\n                </div>\n\n                {/* Expandable Details */}\n                {expandedCards.cube && (\n                  <div className=\"materialization-details\">\n                    <div className=\"materialization-config\">\n                      <div className=\"config-row\">\n                        <span className=\"config-label\">Strategy:</span>\n                        <span className=\"config-value\">\n                          {cubeMaterialization?.strategy === 'incremental_time'\n                            ? 'Incremental (Time-based)'\n                            : cubeMaterialization?.strategy === 'full'\n                            ? 'Full'\n                            : cubeMaterialization?.strategy || 'Not set'}\n                        </span>\n                      </div>\n                      {cubeMaterialization?.schedule && (\n                        <div className=\"config-row\">\n                          <span className=\"config-label\">Schedule:</span>\n                          <span className=\"config-value config-mono\">\n                            {cubeMaterialization.schedule}\n                          </span>\n                        </div>\n                      )}\n                      {cubeMaterialization?.lookbackWindow && (\n                        <div className=\"config-row\">\n                          <span className=\"config-label\">Lookback:</span>\n                          <span className=\"config-value\">\n                            {cubeMaterialization.lookbackWindow}\n                          </span>\n                        </div>\n                      )}\n                      <div className=\"config-row\">\n                        <span className=\"config-label\">Dependencies:</span>\n                        <span className=\"config-value\">\n                          {cubeMaterialization?.preaggTables?.length ||\n                            Object.keys(plannedPreaggs).length ||\n                            grainGroups.length}{' '}\n                          pre-agg(s)\n                        </span>\n                      </div>\n                      {/* Workflow URLs */}\n                      {workflowUrls.length > 0 && (\n                        <div className=\"config-row\">\n                          <span className=\"config-label\">Workflows:</span>\n                          <div className=\"workflow-links\">\n                            {workflowUrls.map((wf, idx) => {\n                              // Support both {label, url} objects and plain strings\n                              const url = typeof wf === 'string' ? wf : wf.url;\n                              const label =\n                                typeof wf === 'string'\n                                  ? wf.includes('adhoc') ||\n                                    wf.includes('backfill')\n                                    ? 'Backfill'\n                                    : 'Scheduled'\n                                  : wf.label || 'Workflow';\n                              return (\n                                <a\n                                  key={idx}\n                                  href={url}\n                                  target=\"_blank\"\n                                  rel=\"noopener noreferrer\"\n                                  className=\"action-btn action-btn-secondary\"\n                                >\n                                  {label === 'backfill'\n                                    ? 'Backfill'\n                                    : label === 'scheduled'\n                                    ? 'Scheduled'\n                                    : label}\n                                </a>\n                              );\n                            })}\n                          </div>\n                        </div>\n                      )}\n                    </div>\n                    {/* Action Buttons */}\n                    <div className=\"materialization-actions\">\n                      {onUpdateCubeConfig && (\n                        <button\n                          className=\"action-btn action-btn-secondary\"\n                          type=\"button\"\n                          onClick={e => {\n                            e.stopPropagation();\n                            setCubeConfigForm({\n                              strategy:\n                                cubeMaterialization?.strategy ||\n                                'incremental_time',\n                              schedule:\n                                cubeMaterialization?.schedule || '0 6 * * *',\n                              lookbackWindow:\n                                cubeMaterialization?.lookbackWindow || '1 DAY',\n                            });\n                            setEditingCube(true);\n                          }}\n                        >\n                          Edit Config\n                        </button>\n                      )}\n\n                      {onRefreshCubeWorkflow && (\n                        <button\n                          className=\"action-btn action-btn-secondary\"\n                          type=\"button\"\n                          title=\"Refresh workflow (re-push to scheduler)\"\n                          onClick={async e => {\n                            e.stopPropagation();\n                            setLoadingAction('refresh-cube');\n                            try {\n                              await onRefreshCubeWorkflow();\n                            } finally {\n                              setLoadingAction(null);\n                            }\n                          }}\n                          disabled={loadingAction === 'refresh-cube'}\n                        >\n                          {loadingAction === 'refresh-cube' ? (\n                            <>\n                              <span className=\"spinner\" /> Refreshing...\n                            </>\n                          ) : (\n                            '↻ Refresh'\n                          )}\n                        </button>\n                      )}\n\n                      {onRunCubeBackfill && (\n                        <button\n                          className=\"action-btn action-btn-secondary\"\n                          type=\"button\"\n                          onClick={e => {\n                            e.stopPropagation();\n                            setCubeBackfillModal(true);\n                          }}\n                        >\n                          Run Backfill\n                        </button>\n                      )}\n\n                      {onDeactivateCubeWorkflow && (\n                        <button\n                          className=\"action-btn action-btn-danger\"\n                          type=\"button\"\n                          title=\"Deactivate this cube materialization\"\n                          onClick={async e => {\n                            e.stopPropagation();\n                            if (\n                              window.confirm(\n                                'Are you sure you want to deactivate this cube materialization? The workflow will be stopped.',\n                              )\n                            ) {\n                              setLoadingAction('deactivate-cube');\n                              try {\n                                await onDeactivateCubeWorkflow();\n                              } finally {\n                                setLoadingAction(null);\n                              }\n                            }\n                          }}\n                          disabled={loadingAction === 'deactivate-cube'}\n                        >\n                          {loadingAction === 'deactivate-cube' ? (\n                            <>\n                              <span className=\"spinner\" /> Deactivating...\n                            </>\n                          ) : (\n                            '⏹ Deactivate'\n                          )}\n                        </button>\n                      )}\n                    </div>\n                  </div>\n                )}\n              </>\n            )}\n          </div>\n        </div>\n      )}\n\n      {/* Pre-Aggregations Section */}\n      <div className=\"details-section\">\n        <div className=\"section-header-row\">\n          <h3 className=\"section-title\">\n            <span className=\"section-icon\">◫</span>\n            Pre-Aggregations ({grainGroups.length})\n          </h3>\n        </div>\n\n        <div className=\"preagg-summary-list\">\n          {grainGroups.map((gg, i) => {\n            const shortName = gg.parent_name?.split('.').pop() || 'Unknown';\n            const relatedMetrics = metricFormulas.filter(m =>\n              m.components?.some(comp =>\n                gg.components?.some(pc => pc.name === comp),\n              ),\n            );\n\n            // Look up existing pre-agg by normalized grain key\n            const grainKey = `${gg.parent_name}|${normalizeGrain(gg.grain)}`;\n            const existingPreagg = plannedPreaggs[grainKey];\n            const statusInfo = getStatusInfo(existingPreagg);\n            const isExpanded = expandedCards[grainKey] || false;\n            const scheduleSummary = existingPreagg?.schedule\n              ? getScheduleSummary(existingPreagg.schedule)\n              : null;\n\n            // Determine status badge\n            const isActive =\n              existingPreagg?.strategy && existingPreagg?.schedule;\n            const statusPillClass = isActive\n              ? 'status-active'\n              : 'status-not-set';\n            const statusPillText = isActive ? '● Active' : '○ Not Set';\n\n            return (\n              <div key={i} className=\"preagg-summary-card\">\n                <div className=\"preagg-summary-header\">\n                  <span className=\"preagg-summary-name\">{shortName}</span>\n                  <span className={`status-pill ${statusPillClass}`}>\n                    {statusPillText}\n                  </span>\n                </div>\n                <div className=\"preagg-summary-details\">\n                  <div className=\"preagg-summary-row\">\n                    <span className=\"label\">Grain:</span>\n                    <span className=\"value\">\n                      {gg.grain?.join(', ') || 'None'}\n                    </span>\n                  </div>\n                  {isActive && scheduleSummary && (\n                    <div className=\"preagg-summary-row\">\n                      <span className=\"label\">Schedule:</span>\n                      <span className=\"value\">{scheduleSummary}</span>\n                    </div>\n                  )}\n                </div>\n\n                {/* Materialization Status Header */}\n                {editingCard === grainKey ? (\n                  /* Edit Config Form (only for existing pre-aggs) */\n                  <div className=\"materialization-config-form\">\n                    <div className=\"config-form-header\">\n                      <span>Edit Materialization Config</span>\n                      <button\n                        className=\"config-close-btn\"\n                        type=\"button\"\n                        onClick={() => {\n                          setEditingCard(null);\n                        }}\n                      >\n                        ×\n                      </button>\n                    </div>\n                    <div className=\"config-form-body\">\n                      <div className=\"config-form-row\">\n                        <label className=\"config-form-label\">Strategy</label>\n                        <div className=\"config-form-options\">\n                          <label className=\"radio-option\">\n                            <input\n                              type=\"radio\"\n                              name={`strategy-${i}`}\n                              value=\"full\"\n                              checked={configForm.strategy === 'full'}\n                              onChange={e =>\n                                setConfigForm(prev => ({\n                                  ...prev,\n                                  strategy: e.target.value,\n                                }))\n                              }\n                            />\n                            <span>Full</span>\n                          </label>\n                          <label className=\"radio-option\">\n                            <input\n                              type=\"radio\"\n                              name={`strategy-${i}`}\n                              value=\"incremental_time\"\n                              checked={\n                                configForm.strategy === 'incremental_time'\n                              }\n                              onChange={e =>\n                                setConfigForm(prev => ({\n                                  ...prev,\n                                  strategy: e.target.value,\n                                }))\n                              }\n                            />\n                            <span>Incremental (Time)</span>\n                          </label>\n                        </div>\n                      </div>\n                      <div className=\"config-form-row\">\n                        <label className=\"config-form-label\">\n                          Schedule (cron)\n                        </label>\n                        <input\n                          type=\"text\"\n                          className=\"config-form-input\"\n                          placeholder=\"0 6 * * * (daily at 6am)\"\n                          value={configForm.schedule}\n                          onChange={e =>\n                            setConfigForm(prev => ({\n                              ...prev,\n                              schedule: e.target.value,\n                            }))\n                          }\n                        />\n                      </div>\n                      {configForm.strategy === 'incremental_time' && (\n                        <div className=\"config-form-row\">\n                          <label className=\"config-form-label\">\n                            Lookback Window\n                          </label>\n                          <input\n                            type=\"text\"\n                            className=\"config-form-input\"\n                            placeholder=\"3 days\"\n                            value={configForm.lookbackWindow}\n                            onChange={e =>\n                              setConfigForm(prev => ({\n                                ...prev,\n                                lookbackWindow: e.target.value,\n                              }))\n                            }\n                          />\n                        </div>\n                      )}\n                    </div>\n                    <div className=\"config-form-actions\">\n                      <button\n                        className=\"action-btn action-btn-secondary\"\n                        type=\"button\"\n                        onClick={() => setEditingCard(null)}\n                      >\n                        Cancel\n                      </button>\n                      <button\n                        className=\"action-btn action-btn-primary\"\n                        type=\"button\"\n                        disabled={isSaving}\n                        onClick={async () => {\n                          setIsSaving(true);\n                          try {\n                            if (onUpdateConfig && existingPreagg?.id) {\n                              await onUpdateConfig(\n                                existingPreagg.id,\n                                configForm,\n                              );\n                            }\n                            setEditingCard(null);\n                            setConfigForm({\n                              strategy: 'full',\n                              schedule: '',\n                              lookbackWindow: '',\n                            });\n                          } catch (err) {\n                            console.error('Failed to save:', err);\n                          }\n                          setIsSaving(false);\n                        }}\n                      >\n                        {isSaving ? (\n                          <>\n                            <span className=\"spinner\" /> Saving...\n                          </>\n                        ) : (\n                          'Save'\n                        )}\n                      </button>\n                    </div>\n                  </div>\n                ) : existingPreagg ? (\n                  /* Existing Pre-agg Status Header */\n                  <>\n                    <div\n                      className=\"materialization-header clickable\"\n                      onClick={() => toggleCardExpanded(grainKey)}\n                    >\n                      <div className=\"materialization-status\">\n                        <span\n                          className={`status-indicator ${statusInfo.className}`}\n                          style={{ color: statusInfo.color }}\n                        >\n                          {statusInfo.icon}\n                        </span>\n                        <span className=\"status-text\">{statusInfo.text}</span>\n                        {scheduleSummary && (\n                          <>\n                            <span className=\"status-separator\">|</span>\n                            <span className=\"schedule-summary\">\n                              {scheduleSummary}\n                            </span>\n                          </>\n                        )}\n                      </div>\n                      <button\n                        className=\"expand-toggle\"\n                        type=\"button\"\n                        aria-label={isExpanded ? 'Collapse' : 'Expand'}\n                      >\n                        {isExpanded ? '▲' : '▼'}\n                      </button>\n                    </div>\n\n                    {/* Expandable Materialization Details */}\n                    {isExpanded && (\n                      <div className=\"materialization-details\">\n                        {/* Note for compatible (superset) pre-aggs */}\n                        {existingPreagg._isCompatible && (\n                          <div className=\"compatible-preagg-note\">\n                            <span className=\"note-icon\">ℹ️</span>\n                            <span>\n                              This query can use an existing pre-agg with finer\n                              grain:\n                              <strong>\n                                {' '}\n                                {existingPreagg.grain_columns\n                                  ?.map(g => g.split('.').pop())\n                                  .join(', ')}\n                              </strong>\n                            </span>\n                          </div>\n                        )}\n                        <div className=\"materialization-config\">\n                          <div className=\"config-row\">\n                            <span className=\"config-label\">Strategy:</span>\n                            <span className=\"config-value\">\n                              {existingPreagg.strategy === 'incremental_time'\n                                ? 'Incremental (Time-based)'\n                                : existingPreagg.strategy === 'full'\n                                ? 'Full'\n                                : existingPreagg.strategy || 'Not set'}\n                            </span>\n                          </div>\n                          {existingPreagg.schedule && (\n                            <div className=\"config-row\">\n                              <span className=\"config-label\">Schedule:</span>\n                              <span className=\"config-value config-mono\">\n                                {existingPreagg.schedule}\n                              </span>\n                            </div>\n                          )}\n                          {existingPreagg.lookback_window && (\n                            <div className=\"config-row\">\n                              <span className=\"config-label\">Lookback:</span>\n                              <span className=\"config-value\">\n                                {existingPreagg.lookback_window}\n                              </span>\n                            </div>\n                          )}\n                          {existingPreagg.availability?.updated_at && (\n                            <div className=\"config-row\">\n                              <span className=\"config-label\">Last Run:</span>\n                              <span className=\"config-value\">\n                                {new Date(\n                                  existingPreagg.availability.updated_at,\n                                ).toLocaleString()}{' '}\n                                <span className=\"run-status success\">✓</span>\n                              </span>\n                            </div>\n                          )}\n                          {/* Workflow URLs (shown when job is running or has been triggered) */}\n                          {existingPreagg.workflow_urls?.length > 0 && (\n                            <div className=\"config-row\">\n                              <span className=\"config-label\">Workflows:</span>\n                              <div className=\"workflow-links\">\n                                {existingPreagg.workflow_urls.map((wf, idx) => {\n                                  // Support both {label, url} objects and plain strings\n                                  const url =\n                                    typeof wf === 'string' ? wf : wf.url;\n                                  const label =\n                                    typeof wf === 'string'\n                                      ? wf.includes('backfill') ||\n                                        wf.includes('adhoc')\n                                        ? 'backfill'\n                                        : 'scheduled'\n                                      : wf.label || 'workflow';\n                                  return (\n                                    <a\n                                      key={idx}\n                                      href={url}\n                                      target=\"_blank\"\n                                      rel=\"noopener noreferrer\"\n                                      className=\"action-btn action-btn-secondary\"\n                                    >\n                                      {label === 'scheduled'\n                                        ? 'Scheduled'\n                                        : label === 'backfill'\n                                        ? 'Backfill'\n                                        : label}\n                                    </a>\n                                  );\n                                })}\n                              </div>\n                            </div>\n                          )}\n                        </div>\n                        <div className=\"materialization-actions\">\n                          {onUpdateConfig && existingPreagg.id && (\n                            <button\n                              className=\"action-btn action-btn-secondary\"\n                              type=\"button\"\n                              onClick={e => {\n                                e.stopPropagation();\n                                startEditingConfig(grainKey, existingPreagg);\n                              }}\n                            >\n                              Edit Config\n                            </button>\n                          )}\n\n                          {/* Workflow actions */}\n                          {existingPreagg.strategy && existingPreagg.schedule && (\n                            <>\n                              {(!existingPreagg.workflow_urls ||\n                                existingPreagg.workflow_urls.length === 0) &&\n                                onCreateWorkflow && (\n                                  <button\n                                    className=\"action-btn action-btn-secondary\"\n                                    type=\"button\"\n                                    disabled={\n                                      loadingAction ===\n                                      `workflow-${existingPreagg.id}`\n                                    }\n                                    onClick={async e => {\n                                      e.stopPropagation();\n                                      setLoadingAction(\n                                        `workflow-${existingPreagg.id}`,\n                                      );\n                                      try {\n                                        const result = await onCreateWorkflow(\n                                          existingPreagg.id,\n                                        );\n                                        if (result?.workflow_urls?.length > 0) {\n                                          const firstUrl =\n                                            typeof result.workflow_urls[0] ===\n                                            'string'\n                                              ? result.workflow_urls[0]\n                                              : result.workflow_urls[0].url;\n                                          setToastMessage(\n                                            `Workflow created: ${firstUrl}`,\n                                          );\n                                          setTimeout(\n                                            () => setToastMessage(null),\n                                            5000,\n                                          );\n                                        }\n                                      } finally {\n                                        setLoadingAction(null);\n                                      }\n                                    }}\n                                  >\n                                    {loadingAction ===\n                                    `workflow-${existingPreagg.id}` ? (\n                                      <>\n                                        <span className=\"spinner\" /> Creating...\n                                      </>\n                                    ) : (\n                                      'Create Workflow'\n                                    )}\n                                  </button>\n                                )}\n                              {existingPreagg.workflow_urls?.length > 0 && (\n                                <>\n                                  <button\n                                    className=\"action-btn action-btn-secondary\"\n                                    type=\"button\"\n                                    title=\"Refresh workflow (re-push to scheduler)\"\n                                    disabled={\n                                      loadingAction ===\n                                      `refresh-${existingPreagg.id}`\n                                    }\n                                    onClick={async e => {\n                                      e.stopPropagation();\n                                      setLoadingAction(\n                                        `refresh-${existingPreagg.id}`,\n                                      );\n                                      try {\n                                        // Re-push the workflow\n                                        await onCreateWorkflow(\n                                          existingPreagg.id,\n                                          true,\n                                        );\n                                      } finally {\n                                        setLoadingAction(null);\n                                      }\n                                    }}\n                                  >\n                                    {loadingAction ===\n                                    `refresh-${existingPreagg.id}` ? (\n                                      <>\n                                        <span className=\"spinner\" />{' '}\n                                        Refreshing...\n                                      </>\n                                    ) : (\n                                      '↻ Refresh'\n                                    )}\n                                  </button>\n                                </>\n                              )}\n                            </>\n                          )}\n\n                          {/* Backfill button */}\n                          {existingPreagg.strategy && onRunBackfill && (\n                            <button\n                              className=\"action-btn action-btn-secondary\"\n                              type=\"button\"\n                              onClick={e => {\n                                e.stopPropagation();\n                                // Open backfill modal\n                                const today = new Date()\n                                  .toISOString()\n                                  .split('T')[0];\n                                const weekAgo = new Date(\n                                  Date.now() - 7 * 24 * 60 * 60 * 1000,\n                                )\n                                  .toISOString()\n                                  .split('T')[0];\n                                setBackfillModal({\n                                  preaggId: existingPreagg.id,\n                                  startDate: weekAgo,\n                                  endDate: today,\n                                });\n                              }}\n                            >\n                              Run Backfill\n                            </button>\n                          )}\n\n                          {/* Deactivate button */}\n                          {existingPreagg.workflow_urls?.length > 0 &&\n                            onDeactivatePreaggWorkflow && (\n                              <button\n                                className=\"action-btn action-btn-danger\"\n                                type=\"button\"\n                                title=\"Deactivate (pause) this workflow\"\n                                onClick={async e => {\n                                  e.stopPropagation();\n                                  if (\n                                    window.confirm(\n                                      'Are you sure you want to deactivate this workflow? It will be paused and can be re-activated later.',\n                                    )\n                                  ) {\n                                    setLoadingAction(\n                                      `deactivate-${existingPreagg.id}`,\n                                    );\n                                    try {\n                                      await onDeactivatePreaggWorkflow(\n                                        existingPreagg.id,\n                                      );\n                                    } finally {\n                                      setLoadingAction(null);\n                                    }\n                                  }\n                                }}\n                                disabled={\n                                  loadingAction ===\n                                  `deactivate-${existingPreagg.id}`\n                                }\n                              >\n                                {loadingAction ===\n                                `deactivate-${existingPreagg.id}` ? (\n                                  <>\n                                    <span className=\"spinner\" /> Deactivating...\n                                  </>\n                                ) : (\n                                  '⏹ Deactivate'\n                                )}\n                              </button>\n                            )}\n                        </div>\n                      </div>\n                    )}\n                  </>\n                ) : (\n                  /* Not Planned - Show status only (use section-level button to plan) */\n                  <div className=\"materialization-header\">\n                    <div className=\"materialization-status\">\n                      <span\n                        className={`status-indicator ${statusInfo.className}`}\n                        style={{ color: statusInfo.color }}\n                      >\n                        {statusInfo.icon}\n                      </span>\n                      <span className=\"status-text\">{statusInfo.text}</span>\n                    </div>\n                  </div>\n                )}\n              </div>\n            );\n          })}\n        </div>\n      </div>\n\n      {/* SQL Section */}\n      {sql && (\n        <div className=\"details-section details-section-full details-sql-section\">\n          <div className=\"section-header-row\">\n            <h3 className=\"section-title\">\n              <span className=\"section-icon\">⌘</span>\n              Generated SQL\n            </h3>\n            <div className=\"sql-view-toggle\">\n              <button\n                className={`sql-toggle-btn ${\n                  sqlViewMode === 'optimized' ? 'active' : ''\n                }`}\n                onClick={() => handleSqlViewToggle('optimized')}\n                type=\"button\"\n                title=\"SQL using pre-aggregations (when available)\"\n              >\n                Optimized\n              </button>\n              <button\n                className={`sql-toggle-btn ${\n                  sqlViewMode === 'raw' ? 'active' : ''\n                }`}\n                onClick={() => handleSqlViewToggle('raw')}\n                type=\"button\"\n                title=\"SQL computed directly from source tables\"\n                disabled={loadingRawSql}\n              >\n                {loadingRawSql ? '...' : 'Raw'}\n              </button>\n            </div>\n          </div>\n\n          {/* Scan Estimate Info */}\n          {(() => {\n            const currentScanEstimate =\n              sqlViewMode === 'raw'\n                ? rawResult?.scan_estimate\n                : metricsResult?.scan_estimate;\n            const scanInfo = formatScanEstimate(currentScanEstimate);\n\n            if (scanInfo) {\n              return (\n                <div\n                  className={`scan-estimate-banner scan-estimate-${scanInfo.level}`}\n                >\n                  <span className=\"scan-estimate-icon\">{scanInfo.icon}</span>\n                  <div className=\"scan-estimate-content\">\n                    <div className=\"scan-estimate-header\">\n                      <strong>Scan Cost:</strong>{' '}\n                      {scanInfo.totalBytes !== null &&\n                      scanInfo.totalBytes !== undefined\n                        ? (scanInfo.hasMissingData ? '≥ ' : '') +\n                          formatBytes(scanInfo.totalBytes)\n                        : 'Unknown'}\n                    </div>\n                    <div className=\"scan-estimate-sources\">\n                      {scanInfo.sources.map((source, idx) => {\n                        // Prefer schema.table display, fall back to node name\n                        let displayName = source.source_name;\n                        if (source.schema_ && source.table) {\n                          displayName = `${source.schema_}.${source.table}`;\n                        } else if (source.table) {\n                          displayName = source.table;\n                        }\n\n                        return (\n                          <div key={idx} className=\"scan-source-item\">\n                            <span\n                              className=\"scan-source-name\"\n                              title={source.source_name}\n                            >\n                              {displayName}\n                            </span>\n                            <span className=\"scan-source-size\">\n                              {source.total_bytes !== null &&\n                              source.total_bytes !== undefined\n                                ? formatBytes(source.total_bytes)\n                                : 'no size data'}\n                            </span>\n                          </div>\n                        );\n                      })}\n                    </div>\n                  </div>\n                </div>\n              );\n            }\n            return null;\n          })()}\n\n          <div className=\"sql-code-wrapper\">\n            <SyntaxHighlighter\n              language=\"sql\"\n              style={atomOneLight}\n              customStyle={{\n                margin: 0,\n                borderRadius: '6px',\n                fontSize: '11px',\n                background: '#f8fafc',\n                border: '1px solid #e2e8f0',\n              }}\n            >\n              {sqlViewMode === 'raw' ? rawResult?.sql || 'Loading...' : sql}\n            </SyntaxHighlighter>\n          </div>\n        </div>\n      )}\n\n      {/* Metrics & Dimensions Summary - Two columns */}\n      <div className=\"details-section\">\n        <div className=\"section-header-row\">\n          <h3 className=\"section-title\">\n            <span className=\"section-icon\">◈</span>\n            Selection Summary\n          </h3>\n        </div>\n        <div className=\"selection-summary-grid\">\n          {/* Metrics Column */}\n          <div className=\"selection-summary-column\">\n            <div className=\"selection-summary-label\">\n              Metrics ({metricFormulas.length})\n            </div>\n            <div className=\"selection-summary-list\">\n              {metricFormulas.map((m, i) => (\n                <Link\n                  key={i}\n                  to={`/nodes/${m.name}`}\n                  className=\"selection-summary-item metric clickable\"\n                >\n                  <span className=\"selection-summary-name\">{m.short_name}</span>\n                  {m.is_derived && (\n                    <span className=\"compact-node-badge\">Derived</span>\n                  )}\n                </Link>\n              ))}\n            </div>\n          </div>\n\n          {/* Dimensions Column */}\n          <div className=\"selection-summary-column\">\n            <div className=\"selection-summary-label\">\n              Dimensions ({selectedDimensions.length})\n            </div>\n            <div className=\"selection-summary-list\">\n              {selectedDimensions.map((dim, i) => {\n                const shortName = dim.split('.').pop().split('[')[0]; // Remove role suffix too\n                const nodeName = getDimensionNodeName(dim);\n                return (\n                  <Link\n                    key={i}\n                    to={`/nodes/${nodeName}`}\n                    className=\"selection-summary-item dimension clickable\"\n                  >\n                    <span className=\"selection-summary-name\">{shortName}</span>\n                  </Link>\n                );\n              })}\n            </div>\n          </div>\n        </div>\n      </div>\n\n      {/* Backfill Modal */}\n      {backfillModal && (\n        <div\n          className=\"backfill-modal-overlay\"\n          onClick={() => setBackfillModal(null)}\n        >\n          <div className=\"backfill-modal\" onClick={e => e.stopPropagation()}>\n            <div className=\"backfill-modal-header\">\n              <h3>Run Backfill</h3>\n              <button\n                className=\"modal-close\"\n                onClick={() => setBackfillModal(null)}\n              >\n                ×\n              </button>\n            </div>\n            <div className=\"backfill-modal-body\">\n              <div className=\"backfill-form-row\">\n                <label>Start Date</label>\n                <input\n                  type=\"date\"\n                  value={backfillModal.startDate}\n                  onChange={e =>\n                    setBackfillModal(prev => ({\n                      ...prev,\n                      startDate: e.target.value,\n                    }))\n                  }\n                />\n              </div>\n              <div className=\"backfill-form-row\">\n                <label>End Date</label>\n                <input\n                  type=\"date\"\n                  value={backfillModal.endDate}\n                  onChange={e =>\n                    setBackfillModal(prev => ({\n                      ...prev,\n                      endDate: e.target.value,\n                    }))\n                  }\n                />\n              </div>\n            </div>\n            <div className=\"backfill-modal-actions\">\n              <button\n                className=\"action-btn action-btn-secondary\"\n                onClick={() => setBackfillModal(null)}\n                disabled={loadingAction === 'backfill-modal'}\n              >\n                Cancel\n              </button>\n              <button\n                className=\"action-btn action-btn-primary\"\n                disabled={loadingAction === 'backfill-modal'}\n                onClick={async () => {\n                  setLoadingAction('backfill-modal');\n                  try {\n                    const result = await onRunBackfill(\n                      backfillModal.preaggId,\n                      backfillModal.startDate,\n                      backfillModal.endDate,\n                    );\n                    setBackfillModal(null);\n                    if (result?.job_url) {\n                      setToastMessage(\n                        <span>\n                          Backfill started:{' '}\n                          <a\n                            href={result.job_url}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                          >\n                            View Job ↗\n                          </a>\n                        </span>,\n                      );\n                      setTimeout(() => setToastMessage(null), 10000);\n                    }\n                  } finally {\n                    setLoadingAction(null);\n                  }\n                }}\n              >\n                {loadingAction === 'backfill-modal' ? (\n                  <>\n                    <span className=\"spinner\" /> Starting...\n                  </>\n                ) : (\n                  'Start Backfill'\n                )}\n              </button>\n            </div>\n          </div>\n        </div>\n      )}\n\n      {/* Cube Backfill Modal */}\n      {cubeBackfillModal && (\n        <CubeBackfillModal\n          onClose={() => setCubeBackfillModal(false)}\n          onSubmit={async (startDate, endDate) => {\n            setLoadingAction('cube-backfill');\n            try {\n              const result = await onRunCubeBackfill(startDate, endDate);\n              setCubeBackfillModal(false);\n              if (result?.job_url) {\n                setToastMessage(\n                  <span>\n                    Backfill started:{' '}\n                    <a\n                      href={result.job_url}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                    >\n                      View Job ↗\n                    </a>\n                  </span>,\n                );\n                setTimeout(() => setToastMessage(null), 10000);\n              }\n            } finally {\n              setLoadingAction(null);\n            }\n          }}\n          loading={loadingAction === 'cube-backfill'}\n        />\n      )}\n\n      {/* Toast Message */}\n      {toastMessage && (\n        <div className=\"toast-message\">\n          {toastMessage}\n          <button className=\"toast-close\" onClick={() => setToastMessage(null)}>\n            ×\n          </button>\n        </div>\n      )}\n    </div>\n  );\n}\n\n/**\n * PreAggDetailsPanel - Detailed view of a selected pre-aggregation\n *\n * Shows comprehensive info when a preagg node is selected in the graph\n */\nexport function PreAggDetailsPanel({\n  preAgg,\n  metricFormulas,\n  onClose,\n  highlightedComponent,\n}) {\n  const componentsSectionRef = useRef(null);\n\n  // Scroll to and highlight component when highlightedComponent changes\n  useEffect(() => {\n    if (highlightedComponent && componentsSectionRef.current) {\n      // Scroll the components section into view\n      componentsSectionRef.current.scrollIntoView({\n        behavior: 'smooth',\n        block: 'start',\n      });\n    }\n  }, [highlightedComponent]);\n\n  if (!preAgg) {\n    return null;\n  }\n\n  // Get friendly names\n  const sourceName = preAgg.parent_name || 'Pre-aggregation';\n  const shortName = sourceName.split('.').pop();\n\n  // Find metrics that use this preagg's components\n  const relatedMetrics =\n    metricFormulas?.filter(m =>\n      m.components?.some(comp =>\n        preAgg.components?.some(pc => pc.name === comp),\n      ),\n    ) || [];\n\n  const copyToClipboard = text => {\n    navigator.clipboard.writeText(text);\n  };\n\n  return (\n    <div className=\"details-panel\">\n      {/* Header */}\n      <div className=\"details-header\">\n        <div className=\"details-title-row\">\n          <div className=\"details-type-badge preagg\">Pre-aggregation</div>\n          <button\n            className=\"details-close\"\n            onClick={onClose}\n            title=\"Close panel\"\n          >\n            ×\n          </button>\n        </div>\n        <h2 className=\"details-title\">{shortName}</h2>\n        <p className=\"details-full-name\">{sourceName}</p>\n      </div>\n\n      {/* Grain Section */}\n      <div className=\"details-section\">\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">⊞</span>\n          Grain (GROUP BY)\n        </h3>\n        <div className=\"grain-pills\">\n          {preAgg.grain?.length > 0 ? (\n            preAgg.grain.map(g => (\n              <code key={g} className=\"grain-pill\">\n                {g}\n              </code>\n            ))\n          ) : (\n            <span className=\"empty-text\">No grain columns</span>\n          )}\n        </div>\n      </div>\n\n      {/* Components Table */}\n      <div\n        className=\"details-section details-section-full\"\n        ref={componentsSectionRef}\n      >\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">⚙</span>\n          Components ({preAgg.components?.length || 0})\n        </h3>\n        <div className=\"components-table-wrapper\">\n          <table className=\"details-table\">\n            <thead>\n              <tr>\n                <th>Name</th>\n                <th>Expression</th>\n                <th>Agg</th>\n                <th>Re-agg</th>\n              </tr>\n            </thead>\n            <tbody>\n              {preAgg.components?.map((comp, i) => (\n                <tr\n                  key={comp.name || i}\n                  className={\n                    highlightedComponent === comp.name\n                      ? 'component-row-highlighted'\n                      : ''\n                  }\n                >\n                  <td className=\"comp-name-cell\">\n                    <code>{comp.name}</code>\n                  </td>\n                  <td className=\"comp-expr-cell\">\n                    <code>{comp.expression}</code>\n                  </td>\n                  <td className=\"comp-agg-cell\">\n                    <span className=\"agg-func\">{comp.aggregation || '—'}</span>\n                  </td>\n                  <td className=\"comp-merge-cell\">\n                    <span className=\"merge-func\">{comp.merge || '—'}</span>\n                  </td>\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        </div>\n      </div>\n\n      {/* Metrics Using This */}\n      <div className=\"details-section\">\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">◈</span>\n          Metrics Using This\n        </h3>\n        <div className=\"metrics-list\">\n          {relatedMetrics.length > 0 ? (\n            relatedMetrics.map((m, i) => (\n              <div key={i} className=\"related-metric\">\n                <span className=\"metric-name\">{m.short_name}</span>\n                {m.is_derived && <span className=\"derived-badge\">Derived</span>}\n              </div>\n            ))\n          ) : (\n            <span className=\"empty-text\">No metrics found</span>\n          )}\n        </div>\n      </div>\n\n      {/* SQL Section */}\n      {preAgg.sql && (\n        <div className=\"details-section details-section-full details-sql-section\">\n          <div className=\"section-header-row\">\n            <h3 className=\"section-title\">\n              <span className=\"section-icon\">⌘</span>\n              Pre-Aggregation SQL\n            </h3>\n            <button\n              className=\"copy-sql-btn\"\n              onClick={() => copyToClipboard(preAgg.sql)}\n              type=\"button\"\n            >\n              Copy SQL\n            </button>\n          </div>\n          <div className=\"sql-code-wrapper\">\n            <SyntaxHighlighter\n              language=\"sql\"\n              style={atomOneLight}\n              customStyle={{\n                margin: 0,\n                borderRadius: '6px',\n                fontSize: '11px',\n                background: '#f8fafc',\n                border: '1px solid #e2e8f0',\n              }}\n            >\n              {preAgg.sql}\n            </SyntaxHighlighter>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\n/**\n * MetricDetailsPanel - Detailed view of a selected metric\n */\nexport function MetricDetailsPanel({ metric, grainGroups, onClose }) {\n  if (!metric) return null;\n\n  // Find preaggs that this metric depends on\n  const relatedPreaggs =\n    grainGroups?.filter(gg =>\n      metric.components?.some(comp =>\n        gg.components?.some(pc => pc.name === comp),\n      ),\n    ) || [];\n\n  return (\n    <div className=\"details-panel\">\n      {/* Header */}\n      <div className=\"details-header\">\n        <div className=\"details-title-row\">\n          <div\n            className={`details-type-badge ${\n              metric.is_derived ? 'derived' : 'metric'\n            }`}\n          >\n            {metric.is_derived ? 'Derived Metric' : 'Metric'}\n          </div>\n          <button\n            className=\"details-close\"\n            onClick={onClose}\n            title=\"Close panel\"\n          >\n            ×\n          </button>\n        </div>\n        <h2 className=\"details-title\">{metric.short_name}</h2>\n        <p className=\"details-full-name\">{metric.name}</p>\n      </div>\n\n      {/* Definition */}\n      <div className=\"details-section\">\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">⌘</span>\n          Definition\n        </h3>\n        <div className=\"formula-display\">\n          <code>{metric.query}</code>\n        </div>\n      </div>\n\n      {/* Formula */}\n      <div className=\"details-section\">\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">∑</span>\n          Combiner Formula\n        </h3>\n        <div className=\"formula-display\">\n          <code>{metric.combiner}</code>\n        </div>\n      </div>\n\n      {/* Components Used */}\n      <div className=\"details-section\">\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">⚙</span>\n          Components Used\n        </h3>\n        <div className=\"component-tags\">\n          {metric.components?.map((comp, i) => (\n            <span key={i} className=\"component-tag\">\n              {comp}\n            </span>\n          ))}\n        </div>\n      </div>\n\n      {/* Source Pre-aggregations */}\n      <div className=\"details-section\">\n        <h3 className=\"section-title\">\n          <span className=\"section-icon\">◫</span>\n          Source Pre-aggregations\n        </h3>\n        <div className=\"preagg-sources\">\n          {relatedPreaggs.length > 0 ? (\n            relatedPreaggs.map((gg, i) => (\n              <div key={i} className=\"preagg-source-item\">\n                <span className=\"preagg-source-name\">\n                  {gg.parent_name?.split('.').pop()}\n                </span>\n                <span className=\"preagg-source-full\">{gg.parent_name}</span>\n              </div>\n            ))\n          ) : (\n            <span className=\"empty-text\">No source found</span>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n\n// Export helper functions for testing\nexport {\n  getDimensionNodeName,\n  normalizeGrain,\n  getScheduleSummary,\n  getStatusInfo,\n  inferGranularity,\n  formatBytes,\n  getScanWarningLevel,\n  formatScanEstimate,\n};\n\nexport default PreAggDetailsPanel;\n"],"names":["atomOneLight","getDimensionNodeName","dimPath","pathWithoutRole","parts","normalizeGrain","grainCols","col","getScheduleSummary","schedule","minute","hour","dayOfMonth","month","dayOfWeek","hourNum","minuteNum","period","displayHour","displayMinute","days","dayNum","getStatusInfo","preagg","_a","preaggGrain","_b","g","_c","getRecommendedSchedule","granularity","inferGranularity","grainGroups","gg","formatBytes","bytes","k","sizes","i","getScanWarningLevel","SCAN_CRITICAL_THRESHOLD","SCAN_WARNING_THRESHOLD","formatScanEstimate","scanEstimate","hasMissingData","s","level","icon","CubeBackfillModal","onClose","onSubmit","loading","today","weekAgo","startDate","setStartDate","useState","endDate","setEndDate","jsx","jsxs","e","Fragment","QueryOverviewPanel","measuresResult","metricsResult","selectedMetrics","selectedDimensions","plannedPreaggs","onPlanMaterialization","onUpdateConfig","onCreateWorkflow","onRunBackfill","onRunAdhoc","onFetchRawSql","onSetPartition","onRefreshMeasures","onFetchNodePartitions","materializationError","onClearError","workflowUrls","onClearWorkflowUrls","loadedCubeName","cubeMaterialization","onUpdateCubeConfig","onRefreshCubeWorkflow","onRunCubeBackfill","onDeactivatePreaggWorkflow","onDeactivateCubeWorkflow","getDefaultNamespace","useCallback","expandedCards","setExpandedCards","configuringCard","setConfiguringCard","editingCard","setEditingCard","editingCube","setEditingCube","cubeBackfillModal","setCubeBackfillModal","cubeConfigForm","setCubeConfigForm","isSavingCube","setIsSavingCube","showPartitionSetup","setShowPartitionSetup","partitionForms","setPartitionForms","settingPartitionFor","setSettingPartitionFor","partitionErrors","setPartitionErrors","allNodePartitions","setAllNodePartitions","partitionsLoading","setPartitionsLoading","configForm","setConfigForm","isSaving","setIsSaving","loadingAction","setLoadingAction","backfillModal","setBackfillModal","toastMessage","setToastMessage","sqlViewMode","setSqlViewMode","rawResult","setRawResult","loadingRawSql","setLoadingRawSql","handleSqlViewToggle","mode","result","getUniqueParentNodes","uniqueNodes","fetchAllNodePartitions","parentNodes","results","promises","nodeName","err","hasActualTemporalPartitions","allHaveTemporal","nodePartitions","openConfigForm","recommended","thirtyDaysAgo","partitionResults","datePattern","initialForms","sortedCols","c","a","b","aIsDate","bIsDate","startEditingConfig","grainKey","existingPreagg","toggleCardExpanded","cardKey","prev","metricFormulas","sql","isMaterialized","p","hasTemporal","form","error","isSettingThis","shortName","type","finalSchedule","backfillEndDate","apiConfig","wf","idx","url","label","pc","comp","statusInfo","isExpanded","scheduleSummary","isActive","statusPillClass","statusPillText","_d","_e","firstUrl","_f","_g","currentScanEstimate","scanInfo","source","displayName","SyntaxHighlighter","m","Link","dim","PreAggDetailsPanel","preAgg","highlightedComponent","componentsSectionRef","useRef","useEffect","sourceName","relatedMetrics","copyToClipboard","text","MetricDetailsPanel","metric","relatedPreaggs"],"mappings":"uIAAAA,GAAe,CACb,KAAQ,CACN,QAAW,QACX,UAAa,OACb,QAAW,QACX,MAAS,UACT,WAAc,SAClB,EACE,eAAgB,CACd,MAAS,UACT,UAAa,QACjB,EACE,aAAc,CACZ,MAAS,UACT,UAAa,QACjB,EACE,cAAe,CACb,MAAS,SACb,EACE,eAAgB,CACd,MAAS,SACb,EACE,eAAgB,CACd,MAAS,SACb,EACE,eAAgB,CACd,MAAS,SACb,EACE,YAAa,CACX,MAAS,SACb,EACE,oBAAqB,CACnB,MAAS,SACb,EACE,gBAAiB,CACf,MAAS,SACb,EACE,aAAc,CACZ,MAAS,SACb,EACE,eAAgB,CACd,MAAS,SACb,EACE,cAAe,CACb,MAAS,SACb,EACE,cAAe,CACb,MAAS,SACb,EACE,gBAAiB,CACf,MAAS,SACb,EACE,iBAAkB,CAChB,MAAS,SACb,EACE,mBAAoB,CAClB,MAAS,SACb,EACE,gBAAiB,CACf,MAAS,SACb,EACE,yBAA0B,CACxB,MAAS,SACb,EACE,YAAa,CACX,MAAS,SACb,EACE,gBAAiB,CACf,MAAS,SACb,EACE,yBAA0B,CACxB,MAAS,SACb,EACE,YAAa,CACX,MAAS,SACb,EACE,sBAAuB,CACrB,MAAS,SACb,EACE,qBAAsB,CACpB,MAAS,SACb,EACE,uBAAwB,CACtB,MAAS,SACb,EACE,cAAe,CACb,MAAS,SACb,EACE,cAAe,CACb,MAAS,SACb,EACE,cAAe,CACb,MAAS,SACb,EACE,YAAa,CACX,MAAS,UACT,eAAkB,WACtB,EACE,YAAa,CACX,MAAS,SACb,EACE,mBAAoB,CAClB,MAAS,SACb,EACE,aAAc,CACZ,MAAS,SACb,EACE,gBAAiB,CACf,UAAa,QACjB,EACE,cAAe,CACb,WAAc,MAClB,CACA,ECnGA,SAASC,GAAqBC,EAAS,CAErC,MAAMC,EAAkBD,EAAQ,MAAM,GAAG,EAAE,CAAC,EAEtCE,EAAQD,EAAgB,MAAM,GAAG,EACvC,OAAIC,EAAM,OAAS,EACVA,EAAM,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAE7BD,CACT,CAKA,SAASE,GAAeC,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","x_google_ignoreList":[0]}