@inkindcards/semantic-layer 0.1.4 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx"],"names":["useMetrics","useState","useMemo","jsx","jsxs"],"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"]}
1
+ {"version":3,"sources":["../src/components/metric-picker.tsx","../src/components/results-table.tsx","../src/components/data-catalog.tsx","../src/components/admin-dashboard.tsx"],"names":["useMetrics","useState","useMemo","jsx","jsxs","useCallback","rootStyle","headingStyle","subStyle","tableStyle","thStyle","tdStyle","badgeStyle","emptyStyle","useAdminFields","useAdminRoles","useAdminUsers","useAuth"],"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 [newUserId, setNewUserId] = useState(\"\");\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 (!newUserId.trim() || !newEmail.trim() || !newRoleId) return;\n setActionError(null);\n try {\n await assignUserRole({ user_id: newUserId.trim(), email: newEmail.trim(), role_id: newRoleId, is_admin: newIsAdmin });\n setNewUserId(\"\"); setNewEmail(\"\"); setNewIsAdmin(false); setShowAdd(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : \"Failed to assign role\");\n }\n }, [newUserId, 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({ user_id: u.user_id, 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: \"grid\", gridTemplateColumns: \"1fr 1fr auto\", gap: 8, marginBottom: 8 }}>\n <input style={inputStyle} placeholder=\"User UUID (from Supabase Auth)\" value={newUserId} onChange={(e) => setNewUserId(e.target.value)} />\n <input style={inputStyle} placeholder=\"Email\" 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 style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\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 <span style={{ fontSize: 12, color: \"#9ca3af\", fontFamily: \"monospace\" }}>{assignments[0].user_id.slice(0, 8)}...</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"]}
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { S as SemanticField, F as FieldType, Q as QueryResult } from './types-Ds_6aDEw.cjs';
2
+ import { S as SemanticField, F as FieldType, Q as QueryResult } from './types-Dc8Zdacw.cjs';
3
3
 
4
4
  interface MetricPickerProps {
5
5
  onSelect: (field: SemanticField) => void;
@@ -33,4 +33,18 @@ interface ResultsTableProps {
33
33
  */
34
34
  declare function ResultsTable({ data, className, maxRows, formatNumbers, }: ResultsTableProps): react_jsx_runtime.JSX.Element;
35
35
 
36
- export { MetricPicker, type MetricPickerProps, ResultsTable, type ResultsTableProps };
36
+ interface DataCatalogProps {
37
+ className?: string;
38
+ /** Show a "copy name" button for each field. Default: true. */
39
+ showCopyButton?: boolean;
40
+ /** Filter to only show certain field types. */
41
+ fieldTypes?: Array<"metric" | "dimension" | "time_dimension">;
42
+ }
43
+ declare function DataCatalog({ className, showCopyButton, fieldTypes }: DataCatalogProps): react_jsx_runtime.JSX.Element;
44
+
45
+ interface AdminDashboardProps {
46
+ className?: string;
47
+ }
48
+ declare function AdminDashboard({ className }: AdminDashboardProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { AdminDashboard, type AdminDashboardProps, DataCatalog, type DataCatalogProps, MetricPicker, type MetricPickerProps, ResultsTable, type ResultsTableProps };
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { S as SemanticField, F as FieldType, Q as QueryResult } from './types-Ds_6aDEw.js';
2
+ import { S as SemanticField, F as FieldType, Q as QueryResult } from './types-Dc8Zdacw.js';
3
3
 
4
4
  interface MetricPickerProps {
5
5
  onSelect: (field: SemanticField) => void;
@@ -33,4 +33,18 @@ interface ResultsTableProps {
33
33
  */
34
34
  declare function ResultsTable({ data, className, maxRows, formatNumbers, }: ResultsTableProps): react_jsx_runtime.JSX.Element;
35
35
 
36
- export { MetricPicker, type MetricPickerProps, ResultsTable, type ResultsTableProps };
36
+ interface DataCatalogProps {
37
+ className?: string;
38
+ /** Show a "copy name" button for each field. Default: true. */
39
+ showCopyButton?: boolean;
40
+ /** Filter to only show certain field types. */
41
+ fieldTypes?: Array<"metric" | "dimension" | "time_dimension">;
42
+ }
43
+ declare function DataCatalog({ className, showCopyButton, fieldTypes }: DataCatalogProps): react_jsx_runtime.JSX.Element;
44
+
45
+ interface AdminDashboardProps {
46
+ className?: string;
47
+ }
48
+ declare function AdminDashboard({ className }: AdminDashboardProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { AdminDashboard, type AdminDashboardProps, DataCatalog, type DataCatalogProps, MetricPicker, type MetricPickerProps, ResultsTable, type ResultsTableProps };