@inkindcards/semantic-layer 2.2.6 โ 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components.cjs +269 -133
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.cts +35 -4
- package/dist/components.d.ts +35 -4
- package/dist/components.js +268 -134
- package/dist/components.js.map +1 -1
- package/package.json +1 -1
package/dist/components.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx","../src/components/data-catalog.tsx","../src/components/admin-dashboard.tsx","../src/components/inspectable.tsx","../src/components/field-matcher.ts","../src/components/prompt-generator.ts","../src/components/data-inspector.tsx"],"names":["useMetrics","useState","useMemo","jsx","jsxs","useCallback","rootStyle","headingStyle","subStyle","tableStyle","thStyle","tdStyle","badgeStyle","emptyStyle","useAdminFields","useAdminRoles","useAdminUsers","useAuth","createContext","useContext","useId","useRef","useEffect","Fragment","createPortal","selectStyle"],"mappings":"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","file":"components.cjs","sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport type { SemanticField, FieldType } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface MetricPickerProps {\n onSelect: (field: SemanticField) => void;\n /** Filter to only show certain field types. Default: all. */\n fieldTypes?: FieldType[];\n /** Currently selected field IDs (for visual highlighting). */\n selectedIds?: string[];\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Custom class name for the root container. */\n className?: string;\n}\n\nconst containerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n maxHeight: \"400px\",\n display: \"flex\",\n flexDirection: \"column\",\n};\n\nconst searchStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n border: \"none\",\n borderBottom: \"1px solid #e5e7eb\",\n fontSize: \"14px\",\n outline: \"none\",\n width: \"100%\",\n boxSizing: \"border-box\",\n};\n\nconst listStyle: React.CSSProperties = {\n overflowY: \"auto\",\n flex: 1,\n};\n\nconst categoryHeaderStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n position: \"sticky\",\n top: 0,\n};\n\nconst itemStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n borderBottom: \"1px solid #f3f4f6\",\n};\n\nconst selectedItemStyle: React.CSSProperties = {\n ...itemStyle,\n backgroundColor: \"#eff6ff\",\n};\n\n/**\n * A searchable, categorized picker for metrics and dimensions.\n * Fetches the catalog from the gateway automatically.\n */\nexport function MetricPicker({\n onSelect,\n fieldTypes,\n selectedIds = [],\n searchPlaceholder = \"Search metrics and dimensions...\",\n className,\n}: MetricPickerProps) {\n const { fields, categories, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) {\n result = result.filter((f) => fieldTypes.includes(f.type));\n }\n if (search) {\n const q = search.toLowerCase();\n result = result.filter(\n (f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q),\n );\n }\n return result;\n }, [fields, fieldTypes, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const field of filtered) {\n const list = map.get(field.category) || [];\n list.push(field);\n map.set(field.category, list);\n }\n return map;\n }, [filtered]);\n\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n if (isLoading) {\n return <div style={{ padding: \"12px\", color: \"#6b7280\" }}>Loading catalog...</div>;\n }\n\n if (error) {\n return <div style={{ padding: \"12px\", color: \"#ef4444\" }}>{error}</div>;\n }\n\n return (\n <div style={containerStyle} className={className}>\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n style={searchStyle}\n />\n <div style={listStyle}>\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category}>\n <div style={categoryHeaderStyle}>{category}</div>\n {categoryFields.map((field) => (\n <div\n key={field.id}\n style={selectedSet.has(field.id) ? selectedItemStyle : itemStyle}\n onClick={() => onSelect(field)}\n >\n <span style={{ fontSize: \"14px\", fontWeight: 500, color: \"#111827\" }}>\n {field.displayName}\n </span>\n {field.description && (\n <span style={{ fontSize: \"12px\", color: \"#6b7280\" }}>\n {field.description}\n </span>\n )}\n </div>\n ))}\n </div>\n ))}\n {grouped.size === 0 && (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No fields found\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { QueryResult } from \"../types\";\n\nexport interface ResultsTableProps {\n data: QueryResult | null;\n /** Custom class name for the root container. */\n className?: string;\n /** Max rows to display. Default: 100. */\n maxRows?: number;\n /** Format numbers with locale string. Default: true. */\n formatNumbers?: boolean;\n}\n\nconst tableContainerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"auto\",\n maxHeight: \"500px\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"14px\",\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: \"12px\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n position: \"sticky\",\n top: 0,\n whiteSpace: \"nowrap\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n borderBottom: \"1px solid #f3f4f6\",\n color: \"#111827\",\n whiteSpace: \"nowrap\",\n};\n\nconst numberTdStyle: React.CSSProperties = {\n ...tdStyle,\n textAlign: \"right\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\nfunction formatValue(value: unknown, dataType: string, formatNumbers: boolean): string {\n if (value === null || value === undefined) return \"โ\";\n if (dataType === \"number\" && typeof value === \"number\" && formatNumbers) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return String(value);\n}\n\n/**\n * A simple data table that renders a QueryResult.\n * Handles formatting numbers, truncating rows, and sticky headers.\n */\nexport function ResultsTable({\n data,\n className,\n maxRows = 100,\n formatNumbers = true,\n}: ResultsTableProps) {\n if (!data || data.columns.length === 0) {\n return (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No data to display\n </div>\n );\n }\n\n const displayRows = data.rows.slice(0, maxRows);\n\n return (\n <div style={tableContainerStyle} className={className}>\n <table style={tableStyle}>\n <thead>\n <tr>\n {data.columns.map((col) => (\n <th key={col.key} style={thStyle}>\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {displayRows.map((row, i) => (\n <tr key={i}>\n {data.columns.map((col) => (\n <td\n key={col.key}\n style={col.dataType === \"number\" ? numberTdStyle : tdStyle}\n >\n {formatValue(row[col.key], col.dataType, formatNumbers)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {data.totalRows > maxRows && (\n <div style={{ padding: \"8px 12px\", fontSize: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n Showing {maxRows} of {data.totalRows} rows\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport { useMetrics } from \"../react/hooks\";\nimport type { SemanticField } from \"../types\";\n\nexport interface DataCatalogProps {\n className?: string;\n /** Show a \"copy name\" button for each field. Default: true. */\n showCopyButton?: boolean;\n /** Filter to only show certain field types. */\n fieldTypes?: Array<\"metric\" | \"dimension\" | \"time_dimension\">;\n}\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst searchBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 8, marginBottom: 20,\n};\n\nconst searchInput: React.CSSProperties = {\n flex: 1, padding: \"10px 14px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 8, outline: \"none\", boxSizing: \"border-box\",\n};\n\nconst filterBtn = (active: boolean): React.CSSProperties => ({\n padding: \"8px 14px\", fontSize: 13, fontWeight: 500, borderRadius: 6,\n border: \"1px solid \" + (active ? \"#3b82f6\" : \"#d1d5db\"),\n backgroundColor: active ? \"#eff6ff\" : \"#fff\",\n color: active ? \"#1d4ed8\" : \"#374151\",\n cursor: \"pointer\",\n});\n\nconst categoryStyle: React.CSSProperties = {\n marginBottom: 24,\n};\n\nconst categoryHeader: React.CSSProperties = {\n fontSize: 13, fontWeight: 600, textTransform: \"uppercase\", letterSpacing: \"0.05em\",\n color: \"#6b7280\", marginBottom: 8, paddingBottom: 6, borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst fieldCard: React.CSSProperties = {\n display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\",\n padding: \"10px 12px\", borderRadius: 6, marginBottom: 4,\n backgroundColor: \"#fafafa\", border: \"1px solid #f3f4f6\",\n};\n\nconst fieldNameStyle: React.CSSProperties = {\n fontSize: 15, fontWeight: 600, color: \"#111827\",\n};\n\nconst fieldDescStyle: React.CSSProperties = {\n fontSize: 13, color: \"#6b7280\", marginTop: 2,\n};\n\nconst codeName: React.CSSProperties = {\n fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\", marginTop: 2,\n};\n\nconst badgeStyle = (type: string): React.CSSProperties => ({\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, whiteSpace: \"nowrap\",\n backgroundColor: type === \"metric\" ? \"#eff6ff\" : type === \"time_dimension\" ? \"#f0fdf4\" : \"#f3f4f6\",\n color: type === \"metric\" ? \"#1d4ed8\" : type === \"time_dimension\" ? \"#15803d\" : \"#6b7280\",\n});\n\nconst copyBtn: React.CSSProperties = {\n padding: \"4px 8px\", fontSize: 11, fontWeight: 500, color: \"#6366f1\",\n backgroundColor: \"#eef2ff\", border: \"1px solid #c7d2fe\", borderRadius: 4,\n cursor: \"pointer\", whiteSpace: \"nowrap\",\n};\n\nconst statsBar: React.CSSProperties = {\n display: \"flex\", gap: 16, marginBottom: 16, fontSize: 14,\n};\n\nconst statItem: React.CSSProperties = {\n display: \"flex\", alignItems: \"center\", gap: 4, color: \"#6b7280\",\n};\n\nconst statNum: React.CSSProperties = { fontWeight: 700, color: \"#111827\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 40, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\ntype TypeFilter = \"all\" | \"metric\" | \"dimension\" | \"time_dimension\";\n\nexport function DataCatalog({ className, showCopyButton = true, fieldTypes }: DataCatalogProps) {\n const { fields, metrics, dimensions, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<TypeFilter>(\"all\");\n const [copiedField, setCopiedField] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) result = result.filter((f) => (fieldTypes as string[]).includes(f.type));\n if (typeFilter !== \"all\") result = result.filter((f) => f.type === typeFilter);\n if (search) {\n const q = search.toLowerCase();\n result = result.filter((f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.category.toLowerCase().includes(q)\n );\n }\n return result;\n }, [fields, fieldTypes, typeFilter, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const f of filtered) {\n const list = map.get(f.category) || [];\n list.push(f);\n map.set(f.category, list);\n }\n return map;\n }, [filtered]);\n\n const handleCopy = useCallback(async (name: string) => {\n try {\n await navigator.clipboard.writeText(name);\n setCopiedField(name);\n setTimeout(() => setCopiedField(null), 1500);\n } catch {\n // Clipboard API not available in some iframes\n }\n }, []);\n\n if (isLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading data catalog...</div>;\n if (error) return <div style={{ ...rootStyle, padding: 24, color: \"#ef4444\" }}>{error}</div>;\n\n const timeDims = fields.filter((f) => f.type === \"time_dimension\");\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Data Catalog</h1>\n <p style={subStyle}>Browse available metrics and dimensions from the semantic layer</p>\n\n <div style={statsBar}>\n <div style={statItem}><span style={statNum}>{metrics.length}</span> metrics</div>\n <div style={statItem}><span style={statNum}>{dimensions.length - timeDims.length}</span> dimensions</div>\n <div style={statItem}><span style={statNum}>{timeDims.length}</span> time dimensions</div>\n </div>\n\n <div style={searchBarStyle}>\n <input\n style={searchInput}\n placeholder=\"Search by name, description, or category...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <button style={filterBtn(typeFilter === \"all\")} onClick={() => setTypeFilter(\"all\")}>All</button>\n <button style={filterBtn(typeFilter === \"metric\")} onClick={() => setTypeFilter(\"metric\")}>Metrics</button>\n <button style={filterBtn(typeFilter === \"dimension\")} onClick={() => setTypeFilter(\"dimension\")}>Dimensions</button>\n <button style={filterBtn(typeFilter === \"time_dimension\")} onClick={() => setTypeFilter(\"time_dimension\")}>Time</button>\n </div>\n\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category} style={categoryStyle}>\n <div style={categoryHeader}>{category} ({categoryFields.length})</div>\n {categoryFields.map((f) => (\n <div key={f.id} style={fieldCard}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={fieldNameStyle}>{f.displayName}</span>\n <span style={badgeStyle(f.type)}>{f.type}</span>\n </div>\n {f.description && <div style={fieldDescStyle}>{f.description}</div>}\n <div style={codeName}>{f.name}</div>\n </div>\n {showCopyButton && (\n <button style={copyBtn} onClick={() => handleCopy(f.name)}>\n {copiedField === f.name ? \"Copied!\" : \"Copy name\"}\n </button>\n )}\n </div>\n ))}\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n {search ? \"No fields match your search.\" : \"No data available. The gateway may not be configured yet.\"}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport { useAdminFields, useAdminRoles, useAdminUsers } from \"../react/admin-hooks\";\nimport { useAuth } from \"../react/hooks\";\nimport type { CuratedField, AccessRole, UserRoleAssignment } from \"../types\";\n\nexport interface AdminDashboardProps {\n className?: string;\n}\n\n// โโโ Shared styles โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst tabBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 0, borderBottom: \"1px solid #e5e7eb\", marginBottom: 24,\n};\n\nconst tabBase: React.CSSProperties = {\n padding: \"10px 20px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\n background: \"none\", border: \"none\", borderBottom: \"2px solid transparent\",\n color: \"#6b7280\",\n};\n\nconst tabActive: React.CSSProperties = {\n ...tabBase, color: \"#111827\", borderBottomColor: \"#3b82f6\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\", borderCollapse: \"collapse\", fontSize: 14,\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\", textAlign: \"left\", fontWeight: 600, fontSize: 12,\n color: \"#6b7280\", backgroundColor: \"#f9fafb\", borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\", borderBottom: \"1px solid #f3f4f6\", color: \"#111827\",\n};\n\nconst btnPrimary: React.CSSProperties = {\n padding: \"8px 16px\", fontSize: 14, fontWeight: 500, color: \"#fff\",\n backgroundColor: \"#3b82f6\", border: \"none\", borderRadius: 6, cursor: \"pointer\",\n};\n\nconst btnDanger: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#ef4444\",\n};\n\nconst btnSecondary: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#fff\", color: \"#374151\",\n border: \"1px solid #d1d5db\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"6px 10px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 6, width: \"100%\", boxSizing: \"border-box\",\n};\n\nconst selectStyle: React.CSSProperties = { ...inputStyle, width: \"auto\" };\n\nconst cardStyle: React.CSSProperties = {\n border: \"1px solid #e5e7eb\", borderRadius: 8, padding: 16, marginBottom: 16,\n backgroundColor: \"#fff\",\n};\n\nconst errorBanner: React.CSSProperties = {\n padding: \"10px 14px\", backgroundColor: \"#fef2f2\", color: \"#b91c1c\",\n borderRadius: 6, fontSize: 14, marginBottom: 16,\n};\n\nconst badgeStyle: React.CSSProperties = {\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, backgroundColor: \"#eff6ff\", color: \"#1d4ed8\",\n};\n\nconst badgeGreen: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f0fdf4\", color: \"#15803d\" };\nconst badgeGray: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f3f4f6\", color: \"#6b7280\" };\n\nconst checkboxStyle: React.CSSProperties = { width: 16, height: 16, cursor: \"pointer\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 24, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\n// โโโ Fields Tab โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction FieldsTab() {\n const { fields, isLoading, error, createField, updateField, deleteField } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newType, setNewType] = useState<string>(\"metric\");\n const [newDisplay, setNewDisplay] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createField({\n field_name: newName.trim(),\n field_type: newType,\n display_name: newDisplay.trim() || undefined,\n description: newDesc.trim() || undefined,\n });\n setNewName(\"\"); setNewDisplay(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create field\");\n }\n }, [newName, newType, newDisplay, newDesc, createField]);\n\n const handleToggle = useCallback(async (f: CuratedField) => {\n try { await updateField({ id: f.id, is_active: !f.is_active }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [updateField]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this field? This also removes it from all roles.\")) return;\n try { await deleteField(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteField]);\n\n if (isLoading) return <div style={emptyStyle}>Loading fields...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{fields.length} curated field{fields.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add field\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr auto 1fr\", gap: 8, marginBottom: 8 }}>\n <input style={inputStyle} placeholder=\"field_name (from dbt)\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <select style={selectStyle} value={newType} onChange={(e) => setNewType(e.target.value)}>\n <option value=\"metric\">metric</option>\n <option value=\"dimension\">dimension</option>\n <option value=\"time_dimension\">time_dimension</option>\n </select>\n <input style={inputStyle} placeholder=\"Display name (optional)\" value={newDisplay} onChange={(e) => setNewDisplay(e.target.value)} />\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Field Name</th>\n <th style={thStyle}>Type</th>\n <th style={thStyle}>Display Name</th>\n <th style={thStyle}>Active</th>\n <th style={{ ...thStyle, textAlign: \"right\" }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {fields.map((f) => (\n <tr key={f.id}>\n <td style={tdStyle}><code style={{ fontSize: 13 }}>{f.field_name}</code></td>\n <td style={tdStyle}>\n <span style={f.field_type === \"metric\" ? badgeStyle : f.field_type === \"time_dimension\" ? badgeGreen : badgeGray}>\n {f.field_type}\n </span>\n </td>\n <td style={tdStyle}>{f.display_name || <span style={{ color: \"#9ca3af\" }}>โ</span>}</td>\n <td style={tdStyle}>\n <input type=\"checkbox\" checked={f.is_active} onChange={() => handleToggle(f)} style={checkboxStyle} />\n </td>\n <td style={{ ...tdStyle, textAlign: \"right\" }}>\n <button style={{ ...btnDanger, padding: \"4px 10px\", fontSize: 12 }} onClick={() => handleDelete(f.id)}>Delete</button>\n </td>\n </tr>\n ))}\n {fields.length === 0 && (\n <tr><td colSpan={5} style={emptyStyle}>No curated fields yet. Add fields to start restricting access.</td></tr>\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\n// โโโ Roles Tab โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction RolesTab() {\n const { roles, isLoading, error, createRole, deleteRole, setRoleFields } = useAdminRoles();\n const { fields } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [editingRole, setEditingRole] = useState<number | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createRole({ name: newName.trim(), description: newDesc.trim() || undefined });\n setNewName(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create role\");\n }\n }, [newName, newDesc, createRole]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this role? Users assigned to it will lose this role's access.\")) return;\n try { await deleteRole(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteRole]);\n\n const getFieldIds = (role: AccessRole): Set<number> =>\n new Set((role.role_field_access || []).map((rfa) => rfa.curated_field_id));\n\n const handleToggleField = useCallback(async (role: AccessRole, fieldId: number) => {\n const current = getFieldIds(role);\n if (current.has(fieldId)) current.delete(fieldId);\n else current.add(fieldId);\n setActionError(null);\n try { await setRoleFields(role.id, Array.from(current)); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [setRoleFields]);\n\n if (isLoading) return <div style={emptyStyle}>Loading roles...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{roles.length} role{roles.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add role\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Role name\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <input style={{ ...inputStyle, flex: 2 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n {roles.map((role) => {\n const assignedIds = getFieldIds(role);\n const isEditing = editingRole === role.id;\n\n return (\n <div key={role.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: isEditing ? 12 : 0 }}>\n <div>\n <strong style={{ fontSize: 16 }}>{role.name}</strong>\n {role.is_default && <span style={{ ...badgeGreen, marginLeft: 8 }}>default</span>}\n <span style={{ ...badgeGray, marginLeft: 8 }}>{assignedIds.size} field{assignedIds.size !== 1 ? \"s\" : \"\"}</span>\n {role.description && <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 2 }}>{role.description}</div>}\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button style={btnSecondary} onClick={() => setEditingRole(isEditing ? null : role.id)}>\n {isEditing ? \"Done\" : \"Edit fields\"}\n </button>\n {!role.is_default && (\n <button style={{ ...btnDanger, padding: \"6px 12px\", fontSize: 12 }} onClick={() => handleDelete(role.id)}>Delete</button>\n )}\n </div>\n </div>\n\n {isEditing && fields.length > 0 && (\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(240px, 1fr))\", gap: 4 }}>\n {fields.filter((f) => f.is_active).map((f) => (\n <label key={f.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"4px 0\", fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={assignedIds.has(f.id)} onChange={() => handleToggleField(role, f.id)} style={checkboxStyle} />\n <span>{f.display_name || f.field_name}</span>\n <span style={f.field_type === \"metric\" ? badgeStyle : badgeGray}>{f.field_type}</span>\n </label>\n ))}\n </div>\n )}\n\n {isEditing && fields.length === 0 && (\n <div style={emptyStyle}>No curated fields defined yet. Add fields in the Fields tab first.</div>\n )}\n </div>\n );\n })}\n\n {roles.length === 0 && <div style={emptyStyle}>No roles defined.</div>}\n </div>\n );\n}\n\n// โโโ Users Tab โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction UsersTab() {\n const { users, isLoading, error, assignUserRole, removeUserRole } = useAdminUsers();\n const { roles } = useAdminRoles();\n const [showAdd, setShowAdd] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [newRoleId, setNewRoleId] = useState<number>(0);\n const [newIsAdmin, setNewIsAdmin] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newEmail.trim() || !newRoleId) return;\n setActionError(null);\n try {\n await assignUserRole({ email: newEmail.trim().toLowerCase(), role_id: newRoleId, is_admin: newIsAdmin });\n setNewEmail(\"\"); setNewIsAdmin(false); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to assign role\");\n }\n }, [newEmail, newRoleId, newIsAdmin, assignUserRole]);\n\n const handleRemove = useCallback(async (u: UserRoleAssignment) => {\n if (!confirm(`Remove ${u.email} from this role?`)) return;\n try { await removeUserRole({ email: u.email, role_id: u.role_id }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to remove\"); }\n }, [removeUserRole]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, UserRoleAssignment[]>();\n for (const u of users) {\n const list = map.get(u.email) || [];\n list.push(u);\n map.set(u.email, list);\n }\n return map;\n }, [users]);\n\n if (isLoading) return <div style={emptyStyle}>Loading users...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{grouped.size} user{grouped.size !== 1 ? \"s\" : \"\"} with role assignments</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Assign user\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Email (e.g. name@inkind.com)\" value={newEmail} onChange={(e) => setNewEmail(e.target.value)} />\n <select style={selectStyle} value={newRoleId} onChange={(e) => setNewRoleId(Number(e.target.value))}>\n <option value={0}>Select role...</option>\n {roles.map((r) => <option key={r.id} value={r.id}>{r.name}</option>)}\n </select>\n </div>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={newIsAdmin} onChange={(e) => setNewIsAdmin(e.target.checked)} style={checkboxStyle} />\n Admin access\n </label>\n <div style={{ flex: 1 }} />\n <button style={btnPrimary} onClick={handleAdd}>Assign</button>\n </div>\n </div>\n )}\n\n {Array.from(grouped.entries()).map(([email, assignments]) => (\n <div key={email} style={cardStyle}>\n <div>\n <strong style={{ fontSize: 14 }}>{email}</strong>\n {assignments.some((a) => a.is_admin) && <span style={{ ...badgeGreen, marginLeft: 8 }}>admin</span>}\n </div>\n <div style={{ display: \"flex\", gap: 6, marginTop: 8, flexWrap: \"wrap\" }}>\n {assignments.map((a) => (\n <span key={a.id} style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4, ...badgeStyle }}>\n {a.access_roles?.name || `role #${a.role_id}`}\n <button\n onClick={() => handleRemove(a)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"#6b7280\", fontSize: 14, padding: 0, lineHeight: 1 }}\n title=\"Remove role\"\n >\n ร\n </button>\n </span>\n ))}\n </div>\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n No user role assignments yet. Users without an explicit role get the default role's access.\n </div>\n )}\n </div>\n );\n}\n\n// โโโ Main Dashboard โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\ntype Tab = \"fields\" | \"roles\" | \"users\";\n\nexport function AdminDashboard({ className }: AdminDashboardProps) {\n const { isAuthenticated, isLoading: authLoading } = useAuth();\n const [tab, setTab] = useState<Tab>(\"fields\");\n const [initError, setInitError] = useState<string | null>(null);\n\n if (authLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading...</div>;\n if (!isAuthenticated) return <div style={{ ...rootStyle, ...emptyStyle }}>Sign in to access the admin dashboard.</div>;\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Semantic Layer Admin</h1>\n <p style={subStyle}>Manage curated fields, roles, and user access</p>\n\n {initError && <div style={errorBanner}>{initError}</div>}\n\n <div style={tabBarStyle}>\n {([\"fields\", \"roles\", \"users\"] as Tab[]).map((t) => (\n <button key={t} style={tab === t ? tabActive : tabBase} onClick={() => { setTab(t); setInitError(null); }}>\n {t.charAt(0).toUpperCase() + t.slice(1)}\n </button>\n ))}\n </div>\n\n {tab === \"fields\" && <FieldsTab />}\n {tab === \"roles\" && <RolesTab />}\n {tab === \"users\" && <UsersTab />}\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useId, useRef, useState, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface InspectableEntry {\n id: string;\n label: string;\n currentSource: string;\n columns: string[];\n sampleValues: Record<string, unknown>[];\n element: HTMLElement | null;\n}\n\nexport interface InspectableRegistryValue {\n entries: Map<string, InspectableEntry>;\n register: (entry: InspectableEntry) => void;\n unregister: (id: string) => void;\n inspectActive: boolean;\n setInspectActive: (active: boolean) => void;\n selectedId: string | null;\n setSelectedId: (id: string | null) => void;\n}\n\nexport const InspectableRegistryContext = createContext<InspectableRegistryValue | null>(null);\n\nexport function InspectableRegistry({ children }: { children: React.ReactNode }) {\n const [entries, setEntries] = useState<Map<string, InspectableEntry>>(new Map());\n const [inspectActive, setInspectActive] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n const register = useCallback((entry: InspectableEntry) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.set(entry.id, entry);\n return next;\n });\n }, []);\n\n const unregister = useCallback((id: string) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n setSelectedId((prev) => (prev === id ? null : prev));\n }, []);\n\n const value: InspectableRegistryValue = {\n entries,\n register,\n unregister,\n inspectActive,\n setInspectActive,\n selectedId,\n setSelectedId,\n };\n\n return (\n <InspectableRegistryContext.Provider value={value}>\n {children}\n </InspectableRegistryContext.Provider>\n );\n}\n\n// โโโ Helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Computes the bounding rect of all child elements of a `display: contents`\n * wrapper (which has no box of its own).\n */\nfunction getChildrenBounds(el: HTMLElement): DOMRect | null {\n const children = el.children;\n if (children.length === 0) return null;\n let top = Infinity, left = Infinity, bottom = -Infinity, right = -Infinity;\n for (let i = 0; i < children.length; i++) {\n const r = children[i].getBoundingClientRect();\n if (r.width === 0 && r.height === 0) continue;\n top = Math.min(top, r.top);\n left = Math.min(left, r.left);\n bottom = Math.max(bottom, r.bottom);\n right = Math.max(right, r.right);\n }\n if (top === Infinity) return null;\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\n// โโโ Inspectable wrapper โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nexport interface InspectableProps {\n /** Human-readable label for this component (e.g., \"Revenue Chart\"). */\n label: string;\n /** Describes where data currently comes from (e.g., \"hardcoded array\", \"API /revenue\"). */\n currentSource?: string;\n /** The current data powering this component -- used to infer columns and sample values. */\n data?: Record<string, unknown>[];\n /** Explicit column names. If omitted, inferred from the first item in data. */\n columns?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Wraps a data-bound component and registers it with the DataInspector overlay.\n * Uses `display: contents` so the wrapper is invisible to CSS layout โ charts,\n * grids, and flex items render exactly as if Inspectable were not there.\n * The inspect-mode highlight is rendered via a React portal into document.body,\n * positioned with getBoundingClientRect().\n */\nexport function Inspectable({\n label,\n currentSource = \"unknown\",\n data,\n columns,\n children,\n}: InspectableProps) {\n const registry = useContext(InspectableRegistryContext);\n const id = useId();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n // Stable ref so the registration effect can call register/unregister\n // without depending on the (unstable) context value object.\n const registryRef = useRef(registry);\n registryRef.current = registry;\n\n const inferredColumns = columns ?? (data?.[0] ? Object.keys(data[0]) : []);\n const sampleValues = data?.slice(0, 3) ?? [];\n const columnsKey = inferredColumns.join(\",\");\n\n useEffect(() => {\n const reg = registryRef.current;\n if (!reg) return;\n\n reg.register({\n id,\n label,\n currentSource,\n columns: columnsKey.split(\",\").filter(Boolean),\n sampleValues,\n element: wrapperRef.current,\n });\n\n return () => reg.unregister(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, label, currentSource, columnsKey]);\n\n const inspectActive = registry?.inspectActive ?? false;\n\n // Continuously measure child bounds while inspect mode is active\n useEffect(() => {\n if (!inspectActive || !wrapperRef.current) {\n setRect(null);\n return;\n }\n\n const measure = () => {\n if (wrapperRef.current) {\n setRect(getChildrenBounds(wrapperRef.current));\n }\n };\n\n measure();\n window.addEventListener(\"scroll\", measure, true);\n window.addEventListener(\"resize\", measure);\n const interval = setInterval(measure, 300);\n\n return () => {\n window.removeEventListener(\"scroll\", measure, true);\n window.removeEventListener(\"resize\", measure);\n clearInterval(interval);\n };\n }, [inspectActive]);\n\n if (!registry) {\n console.warn(\n `[SemanticLayer] <Inspectable label=\"${label}\"> has no <DataInspector> ancestor. ` +\n `Make sure <DataInspector> wraps your app content, not self-closing: ` +\n `<DataInspector>{children}</DataInspector>`\n );\n return <>{children}</>;\n }\n\n const isSelected = registry.selectedId === id;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n registry.setSelectedId(isSelected ? null : id);\n };\n\n return (\n <div ref={wrapperRef} style={{ display: \"contents\" }}>\n {children}\n {registry.inspectActive && rect && createPortal(\n <div\n onClick={handleClick}\n style={{\n position: \"fixed\",\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 9999,\n cursor: \"pointer\",\n outline: isSelected\n ? \"2px solid #3b82f6\"\n : \"2px dashed #93c5fd\",\n outlineOffset: 2,\n borderRadius: 4,\n transition: \"outline 0.15s ease\",\n background: isSelected ? \"rgba(59,130,246,0.05)\" : \"transparent\",\n pointerEvents: \"auto\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: 4,\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#fff\",\n backgroundColor: isSelected ? \"#3b82f6\" : \"#93c5fd\",\n padding: \"1px 6px\",\n borderRadius: 3,\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { SemanticField } from \"../types\";\n\nexport type MatchConfidence = \"exact\" | \"fuzzy\" | \"manual\";\n\nexport interface FieldMatch {\n column: string;\n suggestedField: SemanticField | null;\n confidence: MatchConfidence;\n}\n\nconst AGG_PREFIXES = [\"total_\", \"sum_\", \"avg_\", \"count_\", \"min_\", \"max_\", \"num_\"];\nconst NOISE_SUFFIXES = [\"_name\", \"_id\", \"_value\", \"_val\", \"_amt\", \"_amount\"];\n\nfunction camelToSnake(s: string): string {\n return s.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nfunction normalize(s: string): string {\n let result = camelToSnake(s).toLowerCase().trim();\n for (const prefix of AGG_PREFIXES) {\n if (result.startsWith(prefix) && result.length > prefix.length) {\n result = result.slice(prefix.length);\n break;\n }\n }\n for (const suffix of NOISE_SUFFIXES) {\n if (result.endsWith(suffix) && result.length > suffix.length) {\n result = result.slice(0, -suffix.length);\n break;\n }\n }\n return result;\n}\n\nfunction matchExact(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = column.toLowerCase();\n return catalog.find((f) => f.name.toLowerCase() === lower) ?? null;\n}\n\nfunction matchNormalized(column: string, catalog: SemanticField[]): SemanticField | null {\n const norm = normalize(column);\n return catalog.find((f) => normalize(f.name) === norm) ?? null;\n}\n\nfunction matchDisplayName(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = normalize(column).replace(/_/g, \" \");\n if (lower.length < 3) return null;\n\n return (\n catalog.find((f) => f.displayName.toLowerCase().includes(lower)) ??\n catalog.find((f) => f.description.toLowerCase().includes(lower)) ??\n null\n );\n}\n\n/**\n * Match an array of column names against the semantic layer field catalog.\n * Uses three layers: exact name match, normalized match, then display name match.\n */\nexport function matchFields(columns: string[], catalog: SemanticField[]): FieldMatch[] {\n return columns.map((column) => {\n const exact = matchExact(column, catalog);\n if (exact) return { column, suggestedField: exact, confidence: \"exact\" as const };\n\n const normalized = matchNormalized(column, catalog);\n if (normalized) return { column, suggestedField: normalized, confidence: \"fuzzy\" as const };\n\n const display = matchDisplayName(column, catalog);\n if (display) return { column, suggestedField: display, confidence: \"fuzzy\" as const };\n\n return { column, suggestedField: null, confidence: \"manual\" as const };\n });\n}\n","import type { SemanticField } from \"../types\";\n\nexport interface FieldMapping {\n column: string;\n field: SemanticField | null;\n}\n\n/**\n * Generate a ready-to-paste Lovable prompt that tells the AI how to migrate\n * a component from its current data to a useSemanticQuery() call.\n */\nexport function generateMigrationPrompt(\n componentLabel: string,\n mappings: FieldMapping[],\n): string {\n const resolved = mappings.filter((m) => m.field !== null) as Array<{\n column: string;\n field: SemanticField;\n }>;\n\n if (resolved.length === 0) {\n return `Replace the sample/hardcoded data in the \"${componentLabel}\" component with live data from the semantic layer using useSemanticQuery. Use the DataCatalog to find the right field names.`;\n }\n\n const metrics = resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.field.name);\n\n const timeDims = resolved\n .filter((m) => m.field.type === \"time_dimension\")\n .map((m) => m.field.name);\n\n const dims = resolved\n .filter((m) => m.field.type === \"dimension\")\n .map((m) => m.field.name);\n\n const groupBy = [...timeDims, ...dims];\n\n const parts: string[] = [\n `Replace the sample/hardcoded data in the \"${componentLabel}\" component with a useSemanticQuery call using:`,\n ];\n\n if (metrics.length > 0) {\n parts.push(` metrics: [${metrics.map((n) => `'${n}'`).join(\", \")}]`);\n }\n\n if (groupBy.length > 0) {\n parts.push(` groupBy: [${groupBy.map((n) => `'${n}'`).join(\", \")}]`);\n }\n\n if (timeDims.length > 0) {\n parts.push(` grain: 'month'`);\n }\n\n parts.push(\"\");\n parts.push(\"Map the query result columns to the component's props:\");\n\n for (const m of resolved) {\n parts.push(` \"${m.column}\" โ data column \"${m.field.name}\"`);\n }\n\n parts.push(\"\");\n parts.push(\n \"Remove the old hardcoded/sample data and any fetch logic it used. \" +\n \"Use the data, isLoading, and error values from useSemanticQuery to render the component.\",\n );\n\n return parts.join(\"\\n\");\n}\n","import React, { useState, useMemo, useCallback, useEffect, useContext } from \"react\";\nimport { InspectableRegistry, InspectableRegistryContext } from \"./inspectable\";\nimport type { InspectableEntry } from \"./inspectable\";\nimport { matchFields } from \"./field-matcher\";\nimport type { FieldMatch } from \"./field-matcher\";\nimport { generateMigrationPrompt } from \"./prompt-generator\";\nimport type { FieldMapping } from \"./prompt-generator\";\nimport type { SemanticField } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface DataInspectorProps {\n children: React.ReactNode;\n}\n\n/**\n * Dev-mode overlay that wraps your app in an InspectableRegistry and provides\n * a floating toggle + inspector modal for data migration.\n * Renders the registry context so <Inspectable> children can register.\n */\nexport function DataInspector({ children }: DataInspectorProps) {\n return (\n <InspectableRegistry>\n <InspectorOverlay />\n {children}\n </InspectableRegistry>\n );\n}\n\n// โโโ Internal overlay โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction InspectorOverlay() {\n const registry = useContext(InspectableRegistryContext);\n if (!registry) return null;\n\n const { inspectActive, setInspectActive, selectedId, setSelectedId, entries } = registry;\n\n // Keyboard shortcut: Ctrl+Shift+I\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.ctrlKey && e.shiftKey && e.key === \"I\") {\n e.preventDefault();\n setInspectActive(!inspectActive);\n }\n }\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [inspectActive, setInspectActive]);\n\n const selectedEntry = selectedId ? entries.get(selectedId) ?? null : null;\n\n return (\n <>\n <ToggleButton\n active={inspectActive}\n count={entries.size}\n onToggle={() => {\n setInspectActive(!inspectActive);\n if (inspectActive) setSelectedId(null);\n }}\n />\n {selectedEntry && (\n <InspectorModal\n entry={selectedEntry}\n onClose={() => setSelectedId(null)}\n />\n )}\n </>\n );\n}\n\n// โโโ Toggle button โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction ToggleButton({\n active,\n count,\n onToggle,\n}: {\n active: boolean;\n count: number;\n onToggle: () => void;\n}) {\n return (\n <button\n onClick={onToggle}\n title={active ? \"Exit inspect mode (Ctrl+Shift+I)\" : \"Enter inspect mode (Ctrl+Shift+I)\"}\n style={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px\",\n fontSize: 13,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: active ? \"#fff\" : \"#374151\",\n backgroundColor: active ? \"#3b82f6\" : \"#fff\",\n border: `1px solid ${active ? \"#2563eb\" : \"#d1d5db\"}`,\n borderRadius: 999,\n cursor: \"pointer\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.12)\",\n transition: \"all 0.15s ease\",\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n {active ? \"Inspecting\" : \"Inspect Data\"}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 999,\n backgroundColor: active ? \"rgba(255,255,255,0.25)\" : \"#e5e7eb\",\n color: active ? \"#fff\" : \"#6b7280\",\n padding: \"0 5px\",\n }}\n >\n {count}\n </span>\n </button>\n );\n}\n\n// โโโ Inspector modal โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction InspectorModal({\n entry,\n onClose,\n}: {\n entry: InspectableEntry;\n onClose: () => void;\n}) {\n const { fields: catalog, error: catalogError, isLoading: catalogLoading } = useMetrics();\n\n const initialMatches = useMemo(\n () => matchFields(entry.columns, catalog),\n [entry.columns, catalog],\n );\n\n const [mappings, setMappings] = useState<Map<string, SemanticField | null>>(\n () => new Map(initialMatches.map((m) => [m.column, m.suggestedField])),\n );\n\n useEffect(() => {\n setMappings(new Map(initialMatches.map((m) => [m.column, m.suggestedField])));\n }, [initialMatches]);\n\n const [copied, setCopied] = useState(false);\n\n const handleFieldChange = useCallback((column: string, field: SemanticField | null) => {\n setMappings((prev) => {\n const next = new Map(prev);\n next.set(column, field);\n return next;\n });\n }, []);\n\n const handleGenerate = useCallback(async () => {\n const fieldMappings: FieldMapping[] = entry.columns.map((col) => ({\n column: col,\n field: mappings.get(col) ?? null,\n }));\n const prompt = generateMigrationPrompt(entry.label, fieldMappings);\n try {\n await navigator.clipboard.writeText(prompt);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback: select text in a textarea\n const ta = document.createElement(\"textarea\");\n ta.value = prompt;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [entry, mappings]);\n\n const confidenceMap = useMemo(() => {\n const map = new Map<string, FieldMatch[\"confidence\"]>();\n for (const m of initialMatches) map.set(m.column, m.confidence);\n return map;\n }, [initialMatches]);\n\n return (\n <>\n <div onClick={onClose} style={backdropStyle} />\n <div style={modalStyle}>\n <div style={modalHeaderStyle}>\n <div>\n <div style={{ fontSize: 16, fontWeight: 700, color: \"#111827\" }}>{entry.label}</div>\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>\n Source: {entry.currentSource}\n </div>\n </div>\n <button onClick={onClose} style={closeBtnStyle}>×</button>\n </div>\n\n {/* Sample data preview */}\n {entry.sampleValues.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Current Data Preview</div>\n <div style={{ overflow: \"auto\" }}>\n <table style={previewTableStyle}>\n <thead>\n <tr>\n {entry.columns.map((col) => (\n <th key={col} style={previewThStyle}>{col}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entry.sampleValues.map((row, i) => (\n <tr key={i}>\n {entry.columns.map((col) => (\n <td key={col} style={previewTdStyle}>\n {row[col] === null || row[col] === undefined ? \"โ\" : String(row[col])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* Field mapping table */}\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Field Mapping</div>\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: 13 }}>\n <thead>\n <tr>\n <th style={mappingThStyle}>Current Column</th>\n <th style={mappingThStyle}>Confidence</th>\n <th style={mappingThStyle}>Semantic Layer Field</th>\n </tr>\n </thead>\n <tbody>\n {entry.columns.map((col) => (\n <MappingRow\n key={col}\n column={col}\n confidence={confidenceMap.get(col) ?? \"manual\"}\n selectedField={mappings.get(col) ?? null}\n catalog={catalog}\n onChange={(field) => handleFieldChange(col, field)}\n />\n ))}\n </tbody>\n </table>\n {catalog.length === 0 && (\n <div style={{ fontSize: 12, color: \"#9ca3af\", marginTop: 8, textAlign: \"center\" }}>\n {catalogLoading\n ? \"Loading catalog...\"\n : catalogError\n ? `Error loading catalog: ${catalogError}`\n : \"No semantic layer catalog available. Connect to the gateway to enable smart matching.\"}\n </div>\n )}\n </div>\n\n {/* Generate button */}\n <div style={{ padding: \"12px 20px\", borderTop: \"1px solid #e5e7eb\" }}>\n <button onClick={handleGenerate} style={generateBtnStyle}>\n {copied ? \"Copied to clipboard!\" : \"Generate Migration Prompt\"}\n </button>\n </div>\n </div>\n </>\n );\n}\n\n// โโโ Mapping row โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction MappingRow({\n column,\n confidence,\n selectedField,\n catalog,\n onChange,\n}: {\n column: string;\n confidence: FieldMatch[\"confidence\"];\n selectedField: SemanticField | null;\n catalog: SemanticField[];\n onChange: (field: SemanticField | null) => void;\n}) {\n const badgeColors: Record<string, { bg: string; color: string }> = {\n exact: { bg: \"#dcfce7\", color: \"#15803d\" },\n fuzzy: { bg: \"#fef9c3\", color: \"#a16207\" },\n manual: { bg: \"#fee2e2\", color: \"#dc2626\" },\n };\n const badge = badgeColors[confidence] ?? badgeColors.manual;\n\n return (\n <tr>\n <td style={mappingTdStyle}>\n <code style={{ fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\" }}>{column}</code>\n </td>\n <td style={{ ...mappingTdStyle, textAlign: \"center\" }}>\n <span\n style={{\n display: \"inline-block\",\n padding: \"1px 6px\",\n fontSize: 10,\n fontWeight: 600,\n borderRadius: 4,\n backgroundColor: badge.bg,\n color: badge.color,\n }}\n >\n {confidence}\n </span>\n </td>\n <td style={mappingTdStyle}>\n {catalog.length > 0 ? (\n <select\n value={selectedField?.name ?? \"\"}\n onChange={(e) => {\n const field = catalog.find((f) => f.name === e.target.value) ?? null;\n onChange(field);\n }}\n style={selectStyle}\n >\n <option value=\"\">-- none --</option>\n {catalog.map((f) => (\n <option key={f.name} value={f.name}>\n {f.displayName} ({f.type}) โ {f.name}\n </option>\n ))}\n </select>\n ) : (\n <span style={{ fontSize: 12, color: \"#9ca3af\" }}>\n {selectedField ? selectedField.name : \"No catalog\"}\n </span>\n )}\n </td>\n </tr>\n );\n}\n\n// โโโ Styles โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nconst backdropStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.3)\",\n zIndex: 100000,\n};\n\nconst modalStyle: React.CSSProperties = {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 100001,\n width: \"min(640px, 90vw)\",\n maxHeight: \"80vh\",\n backgroundColor: \"#fff\",\n borderRadius: 12,\n boxShadow: \"0 8px 30px rgba(0,0,0,0.2)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst modalHeaderStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n padding: \"16px 20px\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst closeBtnStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n fontSize: 22,\n color: \"#6b7280\",\n cursor: \"pointer\",\n padding: \"0 4px\",\n lineHeight: 1,\n};\n\nconst sectionStyle: React.CSSProperties = {\n padding: \"12px 20px\",\n overflow: \"auto\",\n flex: 1,\n};\n\nconst sectionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n marginBottom: 8,\n};\n\nconst previewTableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: 12,\n};\n\nconst previewThStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n color: \"#374151\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n whiteSpace: \"nowrap\",\n};\n\nconst previewTdStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n color: \"#6b7280\",\n borderBottom: \"1px solid #f3f4f6\",\n whiteSpace: \"nowrap\",\n maxWidth: 150,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst mappingThStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst mappingTdStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n borderBottom: \"1px solid #f3f4f6\",\n verticalAlign: \"middle\",\n};\n\nconst selectStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"4px 6px\",\n fontSize: 12,\n border: \"1px solid #d1d5db\",\n borderRadius: 4,\n backgroundColor: \"#fff\",\n color: \"#111827\",\n};\n\nconst generateBtnStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"10px 16px\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: 8,\n cursor: \"pointer\",\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx","../src/components/data-catalog.tsx","../src/components/admin-dashboard.tsx","../src/components/inspectable.tsx","../src/components/field-matcher.ts","../src/components/prompt-generator.ts","../src/components/data-inspector.tsx"],"names":["useMetrics","useState","useMemo","jsx","jsxs","useCallback","rootStyle","headingStyle","subStyle","tableStyle","thStyle","tdStyle","badgeStyle","emptyStyle","useAdminFields","useAdminRoles","useAdminUsers","useAuth","createContext","useContext","useId","useRef","useEffect","Fragment","createPortal","selectStyle"],"mappings":"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","file":"components.cjs","sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport type { SemanticField, FieldType } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface MetricPickerProps {\n onSelect: (field: SemanticField) => void;\n /** Filter to only show certain field types. Default: all. */\n fieldTypes?: FieldType[];\n /** Currently selected field IDs (for visual highlighting). */\n selectedIds?: string[];\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Custom class name for the root container. */\n className?: string;\n}\n\nconst containerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n maxHeight: \"400px\",\n display: \"flex\",\n flexDirection: \"column\",\n};\n\nconst searchStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n border: \"none\",\n borderBottom: \"1px solid #e5e7eb\",\n fontSize: \"14px\",\n outline: \"none\",\n width: \"100%\",\n boxSizing: \"border-box\",\n};\n\nconst listStyle: React.CSSProperties = {\n overflowY: \"auto\",\n flex: 1,\n};\n\nconst categoryHeaderStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n position: \"sticky\",\n top: 0,\n};\n\nconst itemStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n cursor: \"pointer\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n borderBottom: \"1px solid #f3f4f6\",\n};\n\nconst selectedItemStyle: React.CSSProperties = {\n ...itemStyle,\n backgroundColor: \"#eff6ff\",\n};\n\n/**\n * A searchable, categorized picker for metrics and dimensions.\n * Fetches the catalog from the gateway automatically.\n */\nexport function MetricPicker({\n onSelect,\n fieldTypes,\n selectedIds = [],\n searchPlaceholder = \"Search metrics and dimensions...\",\n className,\n}: MetricPickerProps) {\n const { fields, categories, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) {\n result = result.filter((f) => fieldTypes.includes(f.type));\n }\n if (search) {\n const q = search.toLowerCase();\n result = result.filter(\n (f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q),\n );\n }\n return result;\n }, [fields, fieldTypes, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const field of filtered) {\n const list = map.get(field.category) || [];\n list.push(field);\n map.set(field.category, list);\n }\n return map;\n }, [filtered]);\n\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n if (isLoading) {\n return <div style={{ padding: \"12px\", color: \"#6b7280\" }}>Loading catalog...</div>;\n }\n\n if (error) {\n return <div style={{ padding: \"12px\", color: \"#ef4444\" }}>{error}</div>;\n }\n\n return (\n <div style={containerStyle} className={className}>\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n style={searchStyle}\n />\n <div style={listStyle}>\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category}>\n <div style={categoryHeaderStyle}>{category}</div>\n {categoryFields.map((field) => (\n <div\n key={field.id}\n style={selectedSet.has(field.id) ? selectedItemStyle : itemStyle}\n onClick={() => onSelect(field)}\n >\n <span style={{ fontSize: \"14px\", fontWeight: 500, color: \"#111827\" }}>\n {field.displayName}\n </span>\n {field.description && (\n <span style={{ fontSize: \"12px\", color: \"#6b7280\" }}>\n {field.description}\n </span>\n )}\n </div>\n ))}\n </div>\n ))}\n {grouped.size === 0 && (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No fields found\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport type { QueryResult } from \"../types\";\n\nexport interface ResultsTableProps {\n data: QueryResult | null;\n /** Custom class name for the root container. */\n className?: string;\n /** Max rows to display. Default: 100. */\n maxRows?: number;\n /** Format numbers with locale string. Default: true. */\n formatNumbers?: boolean;\n}\n\nconst tableContainerStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"8px\",\n overflow: \"auto\",\n maxHeight: \"500px\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"14px\",\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: \"12px\",\n color: \"#6b7280\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n position: \"sticky\",\n top: 0,\n whiteSpace: \"nowrap\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\",\n borderBottom: \"1px solid #f3f4f6\",\n color: \"#111827\",\n whiteSpace: \"nowrap\",\n};\n\nconst numberTdStyle: React.CSSProperties = {\n ...tdStyle,\n textAlign: \"right\",\n fontVariantNumeric: \"tabular-nums\",\n};\n\nfunction formatValue(value: unknown, dataType: string, formatNumbers: boolean): string {\n if (value === null || value === undefined) return \"โ\";\n if (dataType === \"number\" && typeof value === \"number\" && formatNumbers) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return String(value);\n}\n\n/**\n * A simple data table that renders a QueryResult.\n * Handles formatting numbers, truncating rows, and sticky headers.\n */\nexport function ResultsTable({\n data,\n className,\n maxRows = 100,\n formatNumbers = true,\n}: ResultsTableProps) {\n if (!data || data.columns.length === 0) {\n return (\n <div style={{ padding: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n No data to display\n </div>\n );\n }\n\n const displayRows = data.rows.slice(0, maxRows);\n\n return (\n <div style={tableContainerStyle} className={className}>\n <table style={tableStyle}>\n <thead>\n <tr>\n {data.columns.map((col) => (\n <th key={col.key} style={thStyle}>\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {displayRows.map((row, i) => (\n <tr key={i}>\n {data.columns.map((col) => (\n <td\n key={col.key}\n style={col.dataType === \"number\" ? numberTdStyle : tdStyle}\n >\n {formatValue(row[col.key], col.dataType, formatNumbers)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {data.totalRows > maxRows && (\n <div style={{ padding: \"8px 12px\", fontSize: \"12px\", color: \"#6b7280\", textAlign: \"center\" }}>\n Showing {maxRows} of {data.totalRows} rows\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport { useMetrics } from \"../react/hooks\";\nimport type { SemanticField } from \"../types\";\n\nexport interface DataCatalogProps {\n className?: string;\n /** Show a \"copy name\" button for each field. Default: true. */\n showCopyButton?: boolean;\n /** Filter to only show certain field types. */\n fieldTypes?: Array<\"metric\" | \"dimension\" | \"time_dimension\">;\n}\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst searchBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 8, marginBottom: 20,\n};\n\nconst searchInput: React.CSSProperties = {\n flex: 1, padding: \"10px 14px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 8, outline: \"none\", boxSizing: \"border-box\",\n};\n\nconst filterBtn = (active: boolean): React.CSSProperties => ({\n padding: \"8px 14px\", fontSize: 13, fontWeight: 500, borderRadius: 6,\n border: \"1px solid \" + (active ? \"#3b82f6\" : \"#d1d5db\"),\n backgroundColor: active ? \"#eff6ff\" : \"#fff\",\n color: active ? \"#1d4ed8\" : \"#374151\",\n cursor: \"pointer\",\n});\n\nconst categoryStyle: React.CSSProperties = {\n marginBottom: 24,\n};\n\nconst categoryHeader: React.CSSProperties = {\n fontSize: 13, fontWeight: 600, textTransform: \"uppercase\", letterSpacing: \"0.05em\",\n color: \"#6b7280\", marginBottom: 8, paddingBottom: 6, borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst fieldCard: React.CSSProperties = {\n display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\",\n padding: \"10px 12px\", borderRadius: 6, marginBottom: 4,\n backgroundColor: \"#fafafa\", border: \"1px solid #f3f4f6\",\n};\n\nconst fieldNameStyle: React.CSSProperties = {\n fontSize: 15, fontWeight: 600, color: \"#111827\",\n};\n\nconst fieldDescStyle: React.CSSProperties = {\n fontSize: 13, color: \"#6b7280\", marginTop: 2,\n};\n\nconst codeName: React.CSSProperties = {\n fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\", marginTop: 2,\n};\n\nconst badgeStyle = (type: string): React.CSSProperties => ({\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, whiteSpace: \"nowrap\",\n backgroundColor: type === \"metric\" ? \"#eff6ff\" : type === \"time_dimension\" ? \"#f0fdf4\" : \"#f3f4f6\",\n color: type === \"metric\" ? \"#1d4ed8\" : type === \"time_dimension\" ? \"#15803d\" : \"#6b7280\",\n});\n\nconst copyBtn: React.CSSProperties = {\n padding: \"4px 8px\", fontSize: 11, fontWeight: 500, color: \"#6366f1\",\n backgroundColor: \"#eef2ff\", border: \"1px solid #c7d2fe\", borderRadius: 4,\n cursor: \"pointer\", whiteSpace: \"nowrap\",\n};\n\nconst statsBar: React.CSSProperties = {\n display: \"flex\", gap: 16, marginBottom: 16, fontSize: 14,\n};\n\nconst statItem: React.CSSProperties = {\n display: \"flex\", alignItems: \"center\", gap: 4, color: \"#6b7280\",\n};\n\nconst statNum: React.CSSProperties = { fontWeight: 700, color: \"#111827\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 40, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\ntype TypeFilter = \"all\" | \"metric\" | \"dimension\" | \"time_dimension\";\n\nexport function DataCatalog({ className, showCopyButton = true, fieldTypes }: DataCatalogProps) {\n const { fields, metrics, dimensions, isLoading, error } = useMetrics();\n const [search, setSearch] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<TypeFilter>(\"all\");\n const [copiedField, setCopiedField] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = fields;\n if (fieldTypes) result = result.filter((f) => (fieldTypes as string[]).includes(f.type));\n if (typeFilter !== \"all\") result = result.filter((f) => f.type === typeFilter);\n if (search) {\n const q = search.toLowerCase();\n result = result.filter((f) =>\n f.displayName.toLowerCase().includes(q) ||\n f.name.toLowerCase().includes(q) ||\n f.description.toLowerCase().includes(q) ||\n f.category.toLowerCase().includes(q)\n );\n }\n return result;\n }, [fields, fieldTypes, typeFilter, search]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, SemanticField[]>();\n for (const f of filtered) {\n const list = map.get(f.category) || [];\n list.push(f);\n map.set(f.category, list);\n }\n return map;\n }, [filtered]);\n\n const handleCopy = useCallback(async (name: string) => {\n try {\n await navigator.clipboard.writeText(name);\n setCopiedField(name);\n setTimeout(() => setCopiedField(null), 1500);\n } catch {\n // Clipboard API not available in some iframes\n }\n }, []);\n\n if (isLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading data catalog...</div>;\n if (error) return <div style={{ ...rootStyle, padding: 24, color: \"#ef4444\" }}>{error}</div>;\n\n const timeDims = fields.filter((f) => f.type === \"time_dimension\");\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Data Catalog</h1>\n <p style={subStyle}>Browse available metrics and dimensions from the semantic layer</p>\n\n <div style={statsBar}>\n <div style={statItem}><span style={statNum}>{metrics.length}</span> metrics</div>\n <div style={statItem}><span style={statNum}>{dimensions.length - timeDims.length}</span> dimensions</div>\n <div style={statItem}><span style={statNum}>{timeDims.length}</span> time dimensions</div>\n </div>\n\n <div style={searchBarStyle}>\n <input\n style={searchInput}\n placeholder=\"Search by name, description, or category...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <button style={filterBtn(typeFilter === \"all\")} onClick={() => setTypeFilter(\"all\")}>All</button>\n <button style={filterBtn(typeFilter === \"metric\")} onClick={() => setTypeFilter(\"metric\")}>Metrics</button>\n <button style={filterBtn(typeFilter === \"dimension\")} onClick={() => setTypeFilter(\"dimension\")}>Dimensions</button>\n <button style={filterBtn(typeFilter === \"time_dimension\")} onClick={() => setTypeFilter(\"time_dimension\")}>Time</button>\n </div>\n\n {Array.from(grouped.entries()).map(([category, categoryFields]) => (\n <div key={category} style={categoryStyle}>\n <div style={categoryHeader}>{category} ({categoryFields.length})</div>\n {categoryFields.map((f) => (\n <div key={f.id} style={fieldCard}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={fieldNameStyle}>{f.displayName}</span>\n <span style={badgeStyle(f.type)}>{f.type}</span>\n </div>\n {f.description && <div style={fieldDescStyle}>{f.description}</div>}\n <div style={codeName}>{f.name}</div>\n </div>\n {showCopyButton && (\n <button style={copyBtn} onClick={() => handleCopy(f.name)}>\n {copiedField === f.name ? \"Copied!\" : \"Copy name\"}\n </button>\n )}\n </div>\n ))}\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n {search ? \"No fields match your search.\" : \"No data available. The gateway may not be configured yet.\"}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport { useAdminFields, useAdminRoles, useAdminUsers } from \"../react/admin-hooks\";\nimport { useAuth } from \"../react/hooks\";\nimport type { CuratedField, AccessRole, UserRoleAssignment } from \"../types\";\n\nexport interface AdminDashboardProps {\n className?: string;\n}\n\n// โโโ Shared styles โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nconst rootStyle: React.CSSProperties = {\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n maxWidth: 960,\n margin: \"0 auto\",\n padding: 24,\n};\n\nconst headingStyle: React.CSSProperties = {\n fontSize: 24, fontWeight: 700, color: \"#111827\", margin: \"0 0 4px\",\n};\n\nconst subStyle: React.CSSProperties = {\n fontSize: 14, color: \"#6b7280\", margin: \"0 0 20px\",\n};\n\nconst tabBarStyle: React.CSSProperties = {\n display: \"flex\", gap: 0, borderBottom: \"1px solid #e5e7eb\", marginBottom: 24,\n};\n\nconst tabBase: React.CSSProperties = {\n padding: \"10px 20px\", fontSize: 14, fontWeight: 500, cursor: \"pointer\",\n background: \"none\", border: \"none\", borderBottom: \"2px solid transparent\",\n color: \"#6b7280\",\n};\n\nconst tabActive: React.CSSProperties = {\n ...tabBase, color: \"#111827\", borderBottomColor: \"#3b82f6\",\n};\n\nconst tableStyle: React.CSSProperties = {\n width: \"100%\", borderCollapse: \"collapse\", fontSize: 14,\n};\n\nconst thStyle: React.CSSProperties = {\n padding: \"10px 12px\", textAlign: \"left\", fontWeight: 600, fontSize: 12,\n color: \"#6b7280\", backgroundColor: \"#f9fafb\", borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst tdStyle: React.CSSProperties = {\n padding: \"8px 12px\", borderBottom: \"1px solid #f3f4f6\", color: \"#111827\",\n};\n\nconst btnPrimary: React.CSSProperties = {\n padding: \"8px 16px\", fontSize: 14, fontWeight: 500, color: \"#fff\",\n backgroundColor: \"#3b82f6\", border: \"none\", borderRadius: 6, cursor: \"pointer\",\n};\n\nconst btnDanger: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#ef4444\",\n};\n\nconst btnSecondary: React.CSSProperties = {\n ...btnPrimary, backgroundColor: \"#fff\", color: \"#374151\",\n border: \"1px solid #d1d5db\",\n};\n\nconst inputStyle: React.CSSProperties = {\n padding: \"6px 10px\", fontSize: 14, border: \"1px solid #d1d5db\",\n borderRadius: 6, width: \"100%\", boxSizing: \"border-box\",\n};\n\nconst selectStyle: React.CSSProperties = { ...inputStyle, width: \"auto\" };\n\nconst cardStyle: React.CSSProperties = {\n border: \"1px solid #e5e7eb\", borderRadius: 8, padding: 16, marginBottom: 16,\n backgroundColor: \"#fff\",\n};\n\nconst errorBanner: React.CSSProperties = {\n padding: \"10px 14px\", backgroundColor: \"#fef2f2\", color: \"#b91c1c\",\n borderRadius: 6, fontSize: 14, marginBottom: 16,\n};\n\nconst badgeStyle: React.CSSProperties = {\n display: \"inline-block\", padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n borderRadius: 9999, backgroundColor: \"#eff6ff\", color: \"#1d4ed8\",\n};\n\nconst badgeGreen: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f0fdf4\", color: \"#15803d\" };\nconst badgeGray: React.CSSProperties = { ...badgeStyle, backgroundColor: \"#f3f4f6\", color: \"#6b7280\" };\n\nconst checkboxStyle: React.CSSProperties = { width: 16, height: 16, cursor: \"pointer\" };\n\nconst emptyStyle: React.CSSProperties = {\n padding: 24, textAlign: \"center\", color: \"#9ca3af\", fontSize: 14,\n};\n\n// โโโ Fields Tab โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction FieldsTab() {\n const { fields, isLoading, error, createField, updateField, deleteField } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newType, setNewType] = useState<string>(\"metric\");\n const [newDisplay, setNewDisplay] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createField({\n field_name: newName.trim(),\n field_type: newType,\n display_name: newDisplay.trim() || undefined,\n description: newDesc.trim() || undefined,\n });\n setNewName(\"\"); setNewDisplay(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create field\");\n }\n }, [newName, newType, newDisplay, newDesc, createField]);\n\n const handleToggle = useCallback(async (f: CuratedField) => {\n try { await updateField({ id: f.id, is_active: !f.is_active }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [updateField]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this field? This also removes it from all roles.\")) return;\n try { await deleteField(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteField]);\n\n if (isLoading) return <div style={emptyStyle}>Loading fields...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{fields.length} curated field{fields.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add field\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr auto 1fr\", gap: 8, marginBottom: 8 }}>\n <input style={inputStyle} placeholder=\"field_name (from dbt)\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <select style={selectStyle} value={newType} onChange={(e) => setNewType(e.target.value)}>\n <option value=\"metric\">metric</option>\n <option value=\"dimension\">dimension</option>\n <option value=\"time_dimension\">time_dimension</option>\n </select>\n <input style={inputStyle} placeholder=\"Display name (optional)\" value={newDisplay} onChange={(e) => setNewDisplay(e.target.value)} />\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n <table style={tableStyle}>\n <thead>\n <tr>\n <th style={thStyle}>Field Name</th>\n <th style={thStyle}>Type</th>\n <th style={thStyle}>Display Name</th>\n <th style={thStyle}>Active</th>\n <th style={{ ...thStyle, textAlign: \"right\" }}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {fields.map((f) => (\n <tr key={f.id}>\n <td style={tdStyle}><code style={{ fontSize: 13 }}>{f.field_name}</code></td>\n <td style={tdStyle}>\n <span style={f.field_type === \"metric\" ? badgeStyle : f.field_type === \"time_dimension\" ? badgeGreen : badgeGray}>\n {f.field_type}\n </span>\n </td>\n <td style={tdStyle}>{f.display_name || <span style={{ color: \"#9ca3af\" }}>โ</span>}</td>\n <td style={tdStyle}>\n <input type=\"checkbox\" checked={f.is_active} onChange={() => handleToggle(f)} style={checkboxStyle} />\n </td>\n <td style={{ ...tdStyle, textAlign: \"right\" }}>\n <button style={{ ...btnDanger, padding: \"4px 10px\", fontSize: 12 }} onClick={() => handleDelete(f.id)}>Delete</button>\n </td>\n </tr>\n ))}\n {fields.length === 0 && (\n <tr><td colSpan={5} style={emptyStyle}>No curated fields yet. Add fields to start restricting access.</td></tr>\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\n// โโโ Roles Tab โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction RolesTab() {\n const { roles, isLoading, error, createRole, deleteRole, setRoleFields } = useAdminRoles();\n const { fields } = useAdminFields();\n const [showAdd, setShowAdd] = useState(false);\n const [newName, setNewName] = useState(\"\");\n const [newDesc, setNewDesc] = useState(\"\");\n const [editingRole, setEditingRole] = useState<number | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newName.trim()) return;\n setActionError(null);\n try {\n await createRole({ name: newName.trim(), description: newDesc.trim() || undefined });\n setNewName(\"\"); setNewDesc(\"\"); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to create role\");\n }\n }, [newName, newDesc, createRole]);\n\n const handleDelete = useCallback(async (id: number) => {\n if (!confirm(\"Delete this role? Users assigned to it will lose this role's access.\")) return;\n try { await deleteRole(id); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to delete\"); }\n }, [deleteRole]);\n\n const getFieldIds = (role: AccessRole): Set<number> =>\n new Set((role.role_field_access || []).map((rfa) => rfa.curated_field_id));\n\n const handleToggleField = useCallback(async (role: AccessRole, fieldId: number) => {\n const current = getFieldIds(role);\n if (current.has(fieldId)) current.delete(fieldId);\n else current.add(fieldId);\n setActionError(null);\n try { await setRoleFields(role.id, Array.from(current)); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to update\"); }\n }, [setRoleFields]);\n\n if (isLoading) return <div style={emptyStyle}>Loading roles...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{roles.length} role{roles.length !== 1 ? \"s\" : \"\"}</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Add role\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Role name\" value={newName} onChange={(e) => setNewName(e.target.value)} />\n <input style={{ ...inputStyle, flex: 2 }} placeholder=\"Description (optional)\" value={newDesc} onChange={(e) => setNewDesc(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && handleAdd()} />\n <button style={btnPrimary} onClick={handleAdd}>Save</button>\n </div>\n </div>\n )}\n\n {roles.map((role) => {\n const assignedIds = getFieldIds(role);\n const isEditing = editingRole === role.id;\n\n return (\n <div key={role.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: isEditing ? 12 : 0 }}>\n <div>\n <strong style={{ fontSize: 16 }}>{role.name}</strong>\n {role.is_default && <span style={{ ...badgeGreen, marginLeft: 8 }}>default</span>}\n <span style={{ ...badgeGray, marginLeft: 8 }}>{assignedIds.size} field{assignedIds.size !== 1 ? \"s\" : \"\"}</span>\n {role.description && <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 2 }}>{role.description}</div>}\n </div>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button style={btnSecondary} onClick={() => setEditingRole(isEditing ? null : role.id)}>\n {isEditing ? \"Done\" : \"Edit fields\"}\n </button>\n {!role.is_default && (\n <button style={{ ...btnDanger, padding: \"6px 12px\", fontSize: 12 }} onClick={() => handleDelete(role.id)}>Delete</button>\n )}\n </div>\n </div>\n\n {isEditing && fields.length > 0 && (\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(240px, 1fr))\", gap: 4 }}>\n {fields.filter((f) => f.is_active).map((f) => (\n <label key={f.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"4px 0\", fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={assignedIds.has(f.id)} onChange={() => handleToggleField(role, f.id)} style={checkboxStyle} />\n <span>{f.display_name || f.field_name}</span>\n <span style={f.field_type === \"metric\" ? badgeStyle : badgeGray}>{f.field_type}</span>\n </label>\n ))}\n </div>\n )}\n\n {isEditing && fields.length === 0 && (\n <div style={emptyStyle}>No curated fields defined yet. Add fields in the Fields tab first.</div>\n )}\n </div>\n );\n })}\n\n {roles.length === 0 && <div style={emptyStyle}>No roles defined.</div>}\n </div>\n );\n}\n\n// โโโ Users Tab โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction UsersTab() {\n const { users, isLoading, error, assignUserRole, removeUserRole } = useAdminUsers();\n const { roles } = useAdminRoles();\n const [showAdd, setShowAdd] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [newRoleId, setNewRoleId] = useState<number>(0);\n const [newIsAdmin, setNewIsAdmin] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const handleAdd = useCallback(async () => {\n if (!newEmail.trim() || !newRoleId) return;\n setActionError(null);\n try {\n await assignUserRole({ email: newEmail.trim().toLowerCase(), role_id: newRoleId, is_admin: newIsAdmin });\n setNewEmail(\"\"); setNewIsAdmin(false); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to assign role\");\n }\n }, [newEmail, newRoleId, newIsAdmin, assignUserRole]);\n\n const handleRemove = useCallback(async (u: UserRoleAssignment) => {\n if (!confirm(`Remove ${u.email} from this role?`)) return;\n try { await removeUserRole({ email: u.email, role_id: u.role_id }); }\n catch (err) { setActionError(err instanceof Error ? err.message : \"Failed to remove\"); }\n }, [removeUserRole]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, UserRoleAssignment[]>();\n for (const u of users) {\n const list = map.get(u.email) || [];\n list.push(u);\n map.set(u.email, list);\n }\n return map;\n }, [users]);\n\n if (isLoading) return <div style={emptyStyle}>Loading users...</div>;\n if (error) return <div style={errorBanner}>{error}</div>;\n\n return (\n <div>\n {actionError && <div style={errorBanner}>{actionError}</div>}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <span style={{ fontSize: 14, color: \"#6b7280\" }}>{grouped.size} user{grouped.size !== 1 ? \"s\" : \"\"} with role assignments</span>\n <button style={btnPrimary} onClick={() => setShowAdd(!showAdd)}>\n {showAdd ? \"Cancel\" : \"+ Assign user\"}\n </button>\n </div>\n\n {showAdd && (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 8 }}>\n <input style={{ ...inputStyle, flex: 1 }} placeholder=\"Email (e.g. name@inkind.com)\" value={newEmail} onChange={(e) => setNewEmail(e.target.value)} />\n <select style={selectStyle} value={newRoleId} onChange={(e) => setNewRoleId(Number(e.target.value))}>\n <option value={0}>Select role...</option>\n {roles.map((r) => <option key={r.id} value={r.id}>{r.name}</option>)}\n </select>\n </div>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={newIsAdmin} onChange={(e) => setNewIsAdmin(e.target.checked)} style={checkboxStyle} />\n Admin access\n </label>\n <div style={{ flex: 1 }} />\n <button style={btnPrimary} onClick={handleAdd}>Assign</button>\n </div>\n </div>\n )}\n\n {Array.from(grouped.entries()).map(([email, assignments]) => (\n <div key={email} style={cardStyle}>\n <div>\n <strong style={{ fontSize: 14 }}>{email}</strong>\n {assignments.some((a) => a.is_admin) && <span style={{ ...badgeGreen, marginLeft: 8 }}>admin</span>}\n </div>\n <div style={{ display: \"flex\", gap: 6, marginTop: 8, flexWrap: \"wrap\" }}>\n {assignments.map((a) => (\n <span key={a.id} style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4, ...badgeStyle }}>\n {a.access_roles?.name || `role #${a.role_id}`}\n <button\n onClick={() => handleRemove(a)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"#6b7280\", fontSize: 14, padding: 0, lineHeight: 1 }}\n title=\"Remove role\"\n >\n ร\n </button>\n </span>\n ))}\n </div>\n </div>\n ))}\n\n {grouped.size === 0 && (\n <div style={emptyStyle}>\n No user role assignments yet. Users without an explicit role get the default role's access.\n </div>\n )}\n </div>\n );\n}\n\n// โโโ Main Dashboard โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\ntype Tab = \"fields\" | \"roles\" | \"users\";\n\nexport function AdminDashboard({ className }: AdminDashboardProps) {\n const { isAuthenticated, isLoading: authLoading } = useAuth();\n const [tab, setTab] = useState<Tab>(\"fields\");\n const [initError, setInitError] = useState<string | null>(null);\n\n if (authLoading) return <div style={{ ...rootStyle, ...emptyStyle }}>Loading...</div>;\n if (!isAuthenticated) return <div style={{ ...rootStyle, ...emptyStyle }}>Sign in to access the admin dashboard.</div>;\n\n return (\n <div style={rootStyle} className={className}>\n <h1 style={headingStyle}>Semantic Layer Admin</h1>\n <p style={subStyle}>Manage curated fields, roles, and user access</p>\n\n {initError && <div style={errorBanner}>{initError}</div>}\n\n <div style={tabBarStyle}>\n {([\"fields\", \"roles\", \"users\"] as Tab[]).map((t) => (\n <button key={t} style={tab === t ? tabActive : tabBase} onClick={() => { setTab(t); setInitError(null); }}>\n {t.charAt(0).toUpperCase() + t.slice(1)}\n </button>\n ))}\n </div>\n\n {tab === \"fields\" && <FieldsTab />}\n {tab === \"roles\" && <RolesTab />}\n {tab === \"users\" && <UsersTab />}\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useId, useRef, useState, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface InspectableEntry {\n id: string;\n label: string;\n currentSource: string;\n columns: string[];\n sampleValues: Record<string, unknown>[];\n element: HTMLElement | null;\n}\n\nexport interface InspectableRegistryValue {\n entries: Map<string, InspectableEntry>;\n register: (entry: InspectableEntry) => void;\n unregister: (id: string) => void;\n inspectActive: boolean;\n setInspectActive: (active: boolean) => void;\n selectedId: string | null;\n setSelectedId: (id: string | null) => void;\n}\n\nexport const InspectableRegistryContext = createContext<InspectableRegistryValue | null>(null);\n\nexport function InspectableRegistry({ children }: { children: React.ReactNode }) {\n const [entries, setEntries] = useState<Map<string, InspectableEntry>>(new Map());\n const [inspectActive, setInspectActive] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n const register = useCallback((entry: InspectableEntry) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.set(entry.id, entry);\n return next;\n });\n }, []);\n\n const unregister = useCallback((id: string) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n setSelectedId((prev) => (prev === id ? null : prev));\n }, []);\n\n const value: InspectableRegistryValue = {\n entries,\n register,\n unregister,\n inspectActive,\n setInspectActive,\n selectedId,\n setSelectedId,\n };\n\n return (\n <InspectableRegistryContext.Provider value={value}>\n {children}\n </InspectableRegistryContext.Provider>\n );\n}\n\n// โโโ Helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n/**\n * Computes the bounding rect of all child elements of a `display: contents`\n * wrapper (which has no box of its own).\n */\nfunction getChildrenBounds(el: HTMLElement): DOMRect | null {\n const children = el.children;\n if (children.length === 0) return null;\n let top = Infinity, left = Infinity, bottom = -Infinity, right = -Infinity;\n for (let i = 0; i < children.length; i++) {\n const r = children[i].getBoundingClientRect();\n if (r.width === 0 && r.height === 0) continue;\n top = Math.min(top, r.top);\n left = Math.min(left, r.left);\n bottom = Math.max(bottom, r.bottom);\n right = Math.max(right, r.right);\n }\n if (top === Infinity) return null;\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\n// โโโ Inspectable wrapper โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nexport interface InspectableProps {\n /** Human-readable label for this component (e.g., \"Revenue Chart\"). */\n label: string;\n /** Describes where data currently comes from (e.g., \"hardcoded array\", \"API /revenue\"). */\n currentSource?: string;\n /** The current data powering this component -- used to infer columns and sample values. */\n data?: Record<string, unknown>[];\n /** Explicit column names. If omitted, inferred from the first item in data. */\n columns?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Wraps a data-bound component and registers it with the DataInspector overlay.\n * Uses `display: contents` so the wrapper is invisible to CSS layout โ charts,\n * grids, and flex items render exactly as if Inspectable were not there.\n * The inspect-mode highlight is rendered via a React portal into document.body,\n * positioned with getBoundingClientRect().\n */\nexport function Inspectable({\n label,\n currentSource = \"unknown\",\n data,\n columns,\n children,\n}: InspectableProps) {\n const registry = useContext(InspectableRegistryContext);\n const id = useId();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n // Stable ref so the registration effect can call register/unregister\n // without depending on the (unstable) context value object.\n const registryRef = useRef(registry);\n registryRef.current = registry;\n\n const inferredColumns = columns ?? (data?.[0] ? Object.keys(data[0]) : []);\n const sampleValues = data?.slice(0, 3) ?? [];\n const columnsKey = inferredColumns.join(\",\");\n\n useEffect(() => {\n const reg = registryRef.current;\n if (!reg) return;\n\n reg.register({\n id,\n label,\n currentSource,\n columns: columnsKey.split(\",\").filter(Boolean),\n sampleValues,\n element: wrapperRef.current,\n });\n\n return () => reg.unregister(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, label, currentSource, columnsKey]);\n\n const inspectActive = registry?.inspectActive ?? false;\n\n // Continuously measure child bounds while inspect mode is active\n useEffect(() => {\n if (!inspectActive || !wrapperRef.current) {\n setRect(null);\n return;\n }\n\n const measure = () => {\n if (wrapperRef.current) {\n setRect(getChildrenBounds(wrapperRef.current));\n }\n };\n\n measure();\n window.addEventListener(\"scroll\", measure, true);\n window.addEventListener(\"resize\", measure);\n const interval = setInterval(measure, 300);\n\n return () => {\n window.removeEventListener(\"scroll\", measure, true);\n window.removeEventListener(\"resize\", measure);\n clearInterval(interval);\n };\n }, [inspectActive]);\n\n if (!registry) {\n console.warn(\n `[SemanticLayer] <Inspectable label=\"${label}\"> has no <DataInspector> ancestor. ` +\n `Make sure <DataInspector> wraps your app content, not self-closing: ` +\n `<DataInspector>{children}</DataInspector>`\n );\n return <>{children}</>;\n }\n\n const isSelected = registry.selectedId === id;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n registry.setSelectedId(isSelected ? null : id);\n };\n\n return (\n <div ref={wrapperRef} style={{ display: \"contents\" }}>\n {children}\n {registry.inspectActive && rect && createPortal(\n <div\n onClick={handleClick}\n style={{\n position: \"fixed\",\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 9999,\n cursor: \"pointer\",\n outline: isSelected\n ? \"2px solid #3b82f6\"\n : \"2px dashed #93c5fd\",\n outlineOffset: 2,\n borderRadius: 4,\n transition: \"outline 0.15s ease\",\n background: isSelected ? \"rgba(59,130,246,0.05)\" : \"transparent\",\n pointerEvents: \"auto\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: -10,\n left: 4,\n fontSize: 10,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"#fff\",\n backgroundColor: isSelected ? \"#3b82f6\" : \"#93c5fd\",\n padding: \"1px 6px\",\n borderRadius: 3,\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","import type { SemanticField } from \"../types\";\n\nexport type MatchConfidence = \"exact\" | \"fuzzy\" | \"manual\";\n\nexport interface FieldMatch {\n column: string;\n suggestedField: SemanticField | null;\n confidence: MatchConfidence;\n}\n\nexport interface ChartAnalysis {\n dimensionColumns: string[];\n metricColumns: string[];\n}\n\nconst AGG_PREFIXES = [\"total_\", \"sum_\", \"avg_\", \"count_\", \"min_\", \"max_\", \"num_\"];\nconst NOISE_SUFFIXES = [\"_name\", \"_id\", \"_value\", \"_val\", \"_amt\", \"_amount\"];\n\nfunction camelToSnake(s: string): string {\n return s.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nfunction normalize(s: string): string {\n let result = camelToSnake(s).toLowerCase().trim();\n for (const prefix of AGG_PREFIXES) {\n if (result.startsWith(prefix) && result.length > prefix.length) {\n result = result.slice(prefix.length);\n break;\n }\n }\n for (const suffix of NOISE_SUFFIXES) {\n if (result.endsWith(suffix) && result.length > suffix.length) {\n result = result.slice(0, -suffix.length);\n break;\n }\n }\n return result;\n}\n\nfunction matchExact(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = column.toLowerCase();\n return catalog.find((f) => f.name.toLowerCase() === lower) ?? null;\n}\n\nfunction matchNormalized(column: string, catalog: SemanticField[]): SemanticField | null {\n const norm = normalize(column);\n return catalog.find((f) => normalize(f.name) === norm) ?? null;\n}\n\nfunction matchDisplayName(column: string, catalog: SemanticField[]): SemanticField | null {\n const lower = normalize(column).replace(/_/g, \" \");\n if (lower.length < 3) return null;\n\n return (\n catalog.find((f) => f.displayName.toLowerCase().includes(lower)) ??\n catalog.find((f) => f.description.toLowerCase().includes(lower)) ??\n null\n );\n}\n\n/**\n * Best-effort match of a single column name against the catalog.\n */\nexport function matchField(column: string, catalog: SemanticField[]): { field: SemanticField | null; confidence: MatchConfidence } {\n const exact = matchExact(column, catalog);\n if (exact) return { field: exact, confidence: \"exact\" };\n\n const normalized = matchNormalized(column, catalog);\n if (normalized) return { field: normalized, confidence: \"fuzzy\" };\n\n const display = matchDisplayName(column, catalog);\n if (display) return { field: display, confidence: \"fuzzy\" };\n\n return { field: null, confidence: \"manual\" };\n}\n\n/**\n * Match an array of column names against the semantic layer field catalog.\n * Uses three layers: exact name match, normalized match, then display name match.\n */\nexport function matchFields(columns: string[], catalog: SemanticField[]): FieldMatch[] {\n return columns.map((column) => {\n const { field, confidence } = matchField(column, catalog);\n return { column, suggestedField: field, confidence };\n });\n}\n\n/**\n * Analyze chart data to classify columns as dimensions (string/date values)\n * or metrics (numeric values). Used by the inspector modal to build the\n * query builder UI instead of a flat column-to-field mapping.\n */\nexport function analyzeChartData(\n columns: string[],\n sampleValues: Record<string, unknown>[],\n): ChartAnalysis {\n const dimensionColumns: string[] = [];\n const metricColumns: string[] = [];\n\n for (const col of columns) {\n const values = sampleValues\n .map((row) => row[col])\n .filter((v) => v !== null && v !== undefined);\n\n if (values.length === 0) {\n dimensionColumns.push(col);\n continue;\n }\n\n const numericCount = values.filter((v) => typeof v === \"number\" || (typeof v === \"string\" && !isNaN(Number(v)) && v.trim() !== \"\")).length;\n const isNumeric = numericCount / values.length > 0.5;\n\n if (isNumeric) {\n metricColumns.push(col);\n } else {\n dimensionColumns.push(col);\n }\n }\n\n return { dimensionColumns, metricColumns };\n}\n","import type { SemanticField, TimeGrain } from \"../types\";\n\nexport interface FieldMapping {\n column: string;\n field: SemanticField | null;\n}\n\nexport interface DimensionMapping {\n column: string;\n field: SemanticField;\n}\n\nexport interface MigrationConfig {\n componentLabel: string;\n dimensions: DimensionMapping[];\n metrics: SemanticField[];\n grain: TimeGrain | null;\n originalMetricColumns: string[];\n}\n\n/**\n * Generate a ready-to-paste Lovable prompt that tells the AI how to migrate\n * a component from hardcoded data to a useSemanticQuery() call.\n *\n * Understands the distinction between dimensions (groupBy) and metrics (values),\n * and produces correct query config with data reshaping instructions.\n */\nexport function generateMigrationPrompt(config: MigrationConfig): string {\n const { componentLabel, dimensions, metrics, grain, originalMetricColumns } = config;\n\n if (dimensions.length === 0 && metrics.length === 0) {\n return `Replace the sample/hardcoded data in the \"${componentLabel}\" component with live data from the semantic layer using useSemanticQuery. Use the DataCatalog to find the right field names.`;\n }\n\n const parts: string[] = [\n `Replace the sample/hardcoded data in the \"${componentLabel}\" component with a useSemanticQuery call using:`,\n \"\",\n ];\n\n if (metrics.length > 0) {\n parts.push(` metrics: [${metrics.map((m) => `'${m.name}'`).join(\", \")}]`);\n }\n\n if (dimensions.length > 0) {\n const groupBy = dimensions.map((d) => d.field.name);\n parts.push(` groupBy: [${groupBy.map((n) => `'${n}'`).join(\", \")}]`);\n }\n\n if (grain) {\n parts.push(` grain: '${grain}'`);\n }\n\n parts.push(\"\");\n\n // Explain query result shape\n const sampleRow: string[] = [];\n for (const d of dimensions) {\n sampleRow.push(`${d.field.name}: \"...\"`);\n }\n for (const m of metrics) {\n sampleRow.push(`${m.name}: 1234`);\n }\n\n parts.push(\"The query returns rows like:\");\n parts.push(` { ${sampleRow.join(\", \")} }`);\n parts.push(\"\");\n\n // Explain how to map to the chart's expected format\n parts.push(\"Map to the chart's expected format:\");\n for (const d of dimensions) {\n parts.push(` X-axis / category: \"${d.field.name}\" (was \"${d.column}\" in the hardcoded data)`);\n }\n\n if (metrics.length > 0 && originalMetricColumns.length > 0) {\n parts.push(` Series / values: each metric (${metrics.map((m) => `\"${m.name}\"`).join(\", \")}) becomes a line/area/bar in the chart`);\n parts.push(` (replaces the old columns: ${originalMetricColumns.map((c) => `\"${c}\"`).join(\", \")})`);\n }\n\n parts.push(\"\");\n parts.push(\n \"Remove the old hardcoded/sample data and any fetch logic it used. \" +\n \"Use the data, isLoading, and error values from useSemanticQuery to render the component. \" +\n \"Show a loading spinner while isLoading is true. Show an error message if error is not null.\",\n );\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Legacy prompt generator for backwards compatibility.\n * Converts flat column-to-field mappings into the new MigrationConfig format.\n */\nexport function generateMigrationPromptLegacy(\n componentLabel: string,\n mappings: FieldMapping[],\n): string {\n const resolved = mappings.filter((m) => m.field !== null) as Array<{\n column: string;\n field: SemanticField;\n }>;\n\n const dimensions: DimensionMapping[] = resolved\n .filter((m) => m.field.type === \"dimension\" || m.field.type === \"time_dimension\")\n .map((m) => ({ column: m.column, field: m.field }));\n\n const metricFields = resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.field);\n\n const hasTime = dimensions.some((d) => d.field.type === \"time_dimension\");\n\n return generateMigrationPrompt({\n componentLabel,\n dimensions,\n metrics: metricFields,\n grain: hasTime ? \"month\" : null,\n originalMetricColumns: resolved\n .filter((m) => m.field.type === \"metric\")\n .map((m) => m.column),\n });\n}\n","import React, { useState, useMemo, useCallback, useEffect, useContext } from \"react\";\nimport { InspectableRegistry, InspectableRegistryContext } from \"./inspectable\";\nimport type { InspectableEntry } from \"./inspectable\";\nimport { analyzeChartData, matchField } from \"./field-matcher\";\nimport { generateMigrationPrompt } from \"./prompt-generator\";\nimport type { DimensionMapping, MigrationConfig } from \"./prompt-generator\";\nimport type { SemanticField, TimeGrain } from \"../types\";\nimport { useMetrics } from \"../react/hooks\";\n\nexport interface DataInspectorProps {\n children: React.ReactNode;\n}\n\n/**\n * Dev-mode overlay that wraps your app in an InspectableRegistry and provides\n * a floating toggle + inspector modal for data migration.\n * Renders the registry context so <Inspectable> children can register.\n */\nexport function DataInspector({ children }: DataInspectorProps) {\n return (\n <InspectableRegistry>\n <InspectorOverlay />\n {children}\n </InspectableRegistry>\n );\n}\n\n// โโโ Internal overlay โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction InspectorOverlay() {\n const registry = useContext(InspectableRegistryContext);\n if (!registry) return null;\n\n const { inspectActive, setInspectActive, selectedId, setSelectedId, entries } = registry;\n\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.ctrlKey && e.shiftKey && e.key === \"I\") {\n e.preventDefault();\n setInspectActive(!inspectActive);\n }\n }\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [inspectActive, setInspectActive]);\n\n const selectedEntry = selectedId ? entries.get(selectedId) ?? null : null;\n\n return (\n <>\n <ToggleButton\n active={inspectActive}\n count={entries.size}\n onToggle={() => {\n setInspectActive(!inspectActive);\n if (inspectActive) setSelectedId(null);\n }}\n />\n {selectedEntry && (\n <InspectorModal\n entry={selectedEntry}\n onClose={() => setSelectedId(null)}\n />\n )}\n </>\n );\n}\n\n// โโโ Toggle button โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction ToggleButton({\n active,\n count,\n onToggle,\n}: {\n active: boolean;\n count: number;\n onToggle: () => void;\n}) {\n return (\n <button\n onClick={onToggle}\n title={active ? \"Exit inspect mode (Ctrl+Shift+I)\" : \"Enter inspect mode (Ctrl+Shift+I)\"}\n style={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n zIndex: 99999,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px\",\n fontSize: 13,\n fontWeight: 600,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: active ? \"#fff\" : \"#374151\",\n backgroundColor: active ? \"#3b82f6\" : \"#fff\",\n border: `1px solid ${active ? \"#2563eb\" : \"#d1d5db\"}`,\n borderRadius: 999,\n cursor: \"pointer\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.12)\",\n transition: \"all 0.15s ease\",\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n {active ? \"Inspecting\" : \"Inspect Data\"}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 999,\n backgroundColor: active ? \"rgba(255,255,255,0.25)\" : \"#e5e7eb\",\n color: active ? \"#fff\" : \"#6b7280\",\n padding: \"0 5px\",\n }}\n >\n {count}\n </span>\n </button>\n );\n}\n\n// โโโ Inspector modal โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nfunction InspectorModal({\n entry,\n onClose,\n}: {\n entry: InspectableEntry;\n onClose: () => void;\n}) {\n const { fields: catalog, error: catalogError, isLoading: catalogLoading } = useMetrics();\n\n const analysis = useMemo(\n () => analyzeChartData(entry.columns, entry.sampleValues),\n [entry.columns, entry.sampleValues],\n );\n\n const dimensions = catalog.filter((f) => f.type === \"dimension\" || f.type === \"time_dimension\");\n const metrics = catalog.filter((f) => f.type === \"metric\");\n\n // Auto-match dimension columns to catalog fields\n const initialDimMappings = useMemo(() => {\n const map = new Map<string, SemanticField | null>();\n for (const col of analysis.dimensionColumns) {\n const { field } = matchField(col, dimensions);\n map.set(col, field);\n }\n return map;\n }, [analysis.dimensionColumns, dimensions]);\n\n const [dimMappings, setDimMappings] = useState<Map<string, SemanticField | null>>(initialDimMappings);\n useEffect(() => { setDimMappings(initialDimMappings); }, [initialDimMappings]);\n\n // Selected metrics (user picks from catalog)\n const [selectedMetrics, setSelectedMetrics] = useState<SemanticField[]>([]);\n\n // Grain\n const hasTimeDim = Array.from(dimMappings.values()).some((f) => f?.type === \"time_dimension\");\n const [grain, setGrain] = useState<TimeGrain | \"\">(\"month\");\n\n const [copied, setCopied] = useState(false);\n\n const handleDimChange = useCallback((col: string, field: SemanticField | null) => {\n setDimMappings((prev) => {\n const next = new Map(prev);\n next.set(col, field);\n return next;\n });\n }, []);\n\n const handleToggleMetric = useCallback((field: SemanticField) => {\n setSelectedMetrics((prev) =>\n prev.some((m) => m.name === field.name)\n ? prev.filter((m) => m.name !== field.name)\n : [...prev, field],\n );\n }, []);\n\n const handleGenerate = useCallback(async () => {\n const resolvedDims: DimensionMapping[] = [];\n for (const [col, field] of dimMappings) {\n if (field) resolvedDims.push({ column: col, field });\n }\n\n const migrationConfig: MigrationConfig = {\n componentLabel: entry.label,\n dimensions: resolvedDims,\n metrics: selectedMetrics,\n grain: hasTimeDim && grain ? (grain as TimeGrain) : null,\n originalMetricColumns: analysis.metricColumns,\n };\n\n const prompt = generateMigrationPrompt(migrationConfig);\n try {\n await navigator.clipboard.writeText(prompt);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n const ta = document.createElement(\"textarea\");\n ta.value = prompt;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n document.body.removeChild(ta);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [entry, dimMappings, selectedMetrics, grain, hasTimeDim, analysis.metricColumns]);\n\n const canGenerate = selectedMetrics.length > 0 || Array.from(dimMappings.values()).some(Boolean);\n\n return (\n <>\n <div onClick={onClose} style={backdropStyle} />\n <div style={modalStyle}>\n <div style={modalHeaderStyle}>\n <div>\n <div style={{ fontSize: 16, fontWeight: 700, color: \"#111827\" }}>{entry.label}</div>\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>\n Source: {entry.currentSource}\n </div>\n </div>\n <button onClick={onClose} style={closeBtnStyle}>×</button>\n </div>\n\n <div style={{ overflow: \"auto\", flex: 1 }}>\n {/* Data preview */}\n {entry.sampleValues.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Current Data Preview</div>\n <div style={{ overflow: \"auto\" }}>\n <table style={previewTableStyle}>\n <thead>\n <tr>\n {entry.columns.map((col) => (\n <th key={col} style={previewThStyle}>{col}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entry.sampleValues.map((row, i) => (\n <tr key={i}>\n {entry.columns.map((col) => (\n <td key={col} style={previewTdStyle}>\n {row[col] === null || row[col] === undefined ? \"โ\" : String(row[col])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Auto-detection summary */}\n <div style={{ marginTop: 8, fontSize: 11, color: \"#9ca3af\" }}>\n Detected: {analysis.dimensionColumns.length} dimension column{analysis.dimensionColumns.length !== 1 ? \"s\" : \"\"} ({analysis.dimensionColumns.join(\", \") || \"none\"})\n {\" ยท \"}{analysis.metricColumns.length} value column{analysis.metricColumns.length !== 1 ? \"s\" : \"\"} ({analysis.metricColumns.join(\", \") || \"none\"})\n </div>\n </div>\n )}\n\n {/* Catalog status */}\n {catalog.length === 0 && (\n <div style={{ ...sectionStyle, textAlign: \"center\" }}>\n <div style={{ fontSize: 12, color: \"#9ca3af\" }}>\n {catalogLoading\n ? \"Loading catalog...\"\n : catalogError\n ? `Error loading catalog: ${catalogError}`\n : \"No semantic layer catalog available. Connect to the gateway to enable smart matching.\"}\n </div>\n </div>\n )}\n\n {/* Dimensions (Group By) */}\n {catalog.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Dimensions (Group By)</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>\n What categories define the rows? (X-axis, grouping)\n </div>\n {analysis.dimensionColumns.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#9ca3af\", fontStyle: \"italic\" }}>\n No dimension columns detected in the data.\n </div>\n ) : (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: 13 }}>\n <thead>\n <tr>\n <th style={mappingThStyle}>Current Column</th>\n <th style={mappingThStyle}>Sample Values</th>\n <th style={mappingThStyle}>Semantic Layer Dimension</th>\n </tr>\n </thead>\n <tbody>\n {analysis.dimensionColumns.map((col) => {\n const sampleVals = entry.sampleValues\n .map((row) => row[col])\n .filter((v) => v !== null && v !== undefined)\n .slice(0, 4)\n .map(String);\n return (\n <tr key={col}>\n <td style={mappingTdStyle}>\n <code style={{ fontSize: 12, color: \"#6366f1\", fontFamily: \"monospace\" }}>{col}</code>\n </td>\n <td style={{ ...mappingTdStyle, fontSize: 11, color: \"#9ca3af\" }}>\n {sampleVals.join(\", \")}{sampleVals.length >= 4 ? \", ...\" : \"\"}\n </td>\n <td style={mappingTdStyle}>\n <select\n value={dimMappings.get(col)?.name ?? \"\"}\n onChange={(e) => {\n const field = dimensions.find((f) => f.name === e.target.value) ?? null;\n handleDimChange(col, field);\n }}\n style={selectStyle}\n >\n <option value=\"\">-- select dimension --</option>\n {dimensions.map((f) => (\n <option key={f.name} value={f.name}>\n {f.displayName} ({f.type}) โ {f.name}\n </option>\n ))}\n </select>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n )}\n\n {/* Grain picker */}\n {hasTimeDim && (\n <div style={{ marginTop: 10, display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <label style={{ fontSize: 12, fontWeight: 600, color: \"#374151\" }}>Time Grain:</label>\n <select\n value={grain}\n onChange={(e) => setGrain(e.target.value as TimeGrain | \"\")}\n style={{ ...selectStyle, width: \"auto\" }}\n >\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\">Month</option>\n <option value=\"quarter\">Quarter</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Metrics (Values) */}\n {catalog.length > 0 && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Metrics (Values)</div>\n <div style={{ fontSize: 11, color: \"#9ca3af\", marginBottom: 8 }}>\n Which metrics should be queried? These become the series/values in the chart.\n {analysis.metricColumns.length > 0 && (\n <span> (replaces: {analysis.metricColumns.join(\", \")})</span>\n )}\n </div>\n {metrics.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#9ca3af\", fontStyle: \"italic\" }}>\n No metrics available in the catalog.\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, maxHeight: 200, overflow: \"auto\" }}>\n {metrics.map((m) => {\n const isSelected = selectedMetrics.some((s) => s.name === m.name);\n return (\n <label\n key={m.name}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"4px 8px\",\n borderRadius: 4,\n cursor: \"pointer\",\n backgroundColor: isSelected ? \"#eff6ff\" : \"transparent\",\n border: isSelected ? \"1px solid #bfdbfe\" : \"1px solid transparent\",\n fontSize: 12,\n }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleToggleMetric(m)}\n style={{ margin: 0 }}\n />\n <span style={{ fontWeight: 500, color: \"#111827\" }}>{m.displayName}</span>\n <code style={{ fontSize: 10, color: \"#6366f1\", fontFamily: \"monospace\" }}>{m.name}</code>\n {m.category && (\n <span style={{ marginLeft: \"auto\", fontSize: 10, color: \"#9ca3af\" }}>{m.category}</span>\n )}\n </label>\n );\n })}\n </div>\n )}\n\n {selectedMetrics.length > 0 && (\n <div style={{ marginTop: 8, fontSize: 11, color: \"#6b7280\" }}>\n Selected: {selectedMetrics.map((m) => m.displayName).join(\", \")}\n </div>\n )}\n </div>\n )}\n\n {/* Preview of the query */}\n {canGenerate && (\n <div style={sectionStyle}>\n <div style={sectionTitleStyle}>Query Preview</div>\n <pre style={{\n fontSize: 11,\n fontFamily: \"monospace\",\n backgroundColor: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 6,\n padding: \"8px 12px\",\n whiteSpace: \"pre-wrap\",\n color: \"#374151\",\n margin: 0,\n }}>\n {`useSemanticQuery({${selectedMetrics.length > 0 ? `\\n metrics: [${selectedMetrics.map((m) => `'${m.name}'`).join(\", \")}],` : \"\"}${\n Array.from(dimMappings.values()).some(Boolean)\n ? `\\n groupBy: [${Array.from(dimMappings.values()).filter(Boolean).map((f) => `'${f!.name}'`).join(\", \")}],`\n : \"\"\n }${hasTimeDim && grain ? `\\n grain: '${grain}',` : \"\"}\n})`}\n </pre>\n </div>\n )}\n </div>\n\n {/* Generate button */}\n <div style={{ padding: \"12px 20px\", borderTop: \"1px solid #e5e7eb\" }}>\n <button\n onClick={handleGenerate}\n disabled={!canGenerate}\n style={{\n ...generateBtnStyle,\n opacity: canGenerate ? 1 : 0.5,\n cursor: canGenerate ? \"pointer\" : \"not-allowed\",\n }}\n >\n {copied ? \"Copied to clipboard!\" : \"Generate Migration Prompt\"}\n </button>\n </div>\n </div>\n </>\n );\n}\n\n// โโโ Styles โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n\nconst backdropStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.3)\",\n zIndex: 100000,\n};\n\nconst modalStyle: React.CSSProperties = {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 100001,\n width: \"min(700px, 90vw)\",\n maxHeight: \"85vh\",\n backgroundColor: \"#fff\",\n borderRadius: 12,\n boxShadow: \"0 8px 30px rgba(0,0,0,0.2)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n};\n\nconst modalHeaderStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n padding: \"16px 20px\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst closeBtnStyle: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n fontSize: 22,\n color: \"#6b7280\",\n cursor: \"pointer\",\n padding: \"0 4px\",\n lineHeight: 1,\n};\n\nconst sectionStyle: React.CSSProperties = {\n padding: \"12px 20px\",\n};\n\nconst sectionTitleStyle: React.CSSProperties = {\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"#6b7280\",\n marginBottom: 4,\n};\n\nconst previewTableStyle: React.CSSProperties = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: 12,\n};\n\nconst previewThStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n color: \"#374151\",\n backgroundColor: \"#f9fafb\",\n borderBottom: \"1px solid #e5e7eb\",\n whiteSpace: \"nowrap\",\n};\n\nconst previewTdStyle: React.CSSProperties = {\n padding: \"4px 8px\",\n color: \"#6b7280\",\n borderBottom: \"1px solid #f3f4f6\",\n whiteSpace: \"nowrap\",\n maxWidth: 150,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst mappingThStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n textAlign: \"left\",\n fontWeight: 600,\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid #e5e7eb\",\n};\n\nconst mappingTdStyle: React.CSSProperties = {\n padding: \"6px 8px\",\n borderBottom: \"1px solid #f3f4f6\",\n verticalAlign: \"middle\",\n};\n\nconst selectStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"4px 6px\",\n fontSize: 12,\n border: \"1px solid #d1d5db\",\n borderRadius: 4,\n backgroundColor: \"#fff\",\n color: \"#111827\",\n};\n\nconst generateBtnStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"10px 16px\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n backgroundColor: \"#3b82f6\",\n border: \"none\",\n borderRadius: 8,\n};\n"]}
|