react-auto-smart-table 1.0.0 → 1.0.3
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/LICENSE +21 -0
- package/README.md +68 -92
- package/dist/index.css +4 -2
- package/dist/index.css.map +1 -1
- package/dist/index.js +90 -68
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +95 -73
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/analyzer/detectTypes.ts","../src/analyzer/sampleDataset.ts","../src/analyzer/computeStats.ts","../src/schema/buildSchema.ts","../src/hooks/useSorting.ts","../src/hooks/useFilters.ts","../src/hooks/usePagination.ts","../src/insights/aggregationEngine.ts","../src/insights/chartDetector.ts","../src/utils/stringUtils.ts","../src/insights/insightBuilder.ts","../src/components/SmartTable.tsx","../src/components/TableHeader.tsx","../src/components/TableBody.tsx","../src/renderers/numberRenderer.tsx","../src/renderers/emailRenderer.tsx","../src/renderers/urlRenderer.tsx","../src/renderers/imageRenderer.tsx","../src/renderers/percentageRenderer.tsx","../src/renderers/dateRenderer.tsx","../src/renderers/booleanRenderer.tsx","../src/renderers/defaultRenderer.tsx","../src/plugins/currencyPlugin.tsx","../src/plugins/percentagePlugin.tsx","../src/renderers/cellRendererFactory.ts","../src/components/FilterPanel.tsx","../src/components/InsightsPanel.tsx","../src/plugins/pluginRegistry.ts"],"sourcesContent":["import { ColumnType } from '../schema/schemaTypes';\n\nconst EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i;\n// simple URL regex\nconst URL_REGEX = /^(https?:\\/\\/)?([\\w.-]+)\\.([a-z]{2,6}\\.?)(\\/[\\w.-]*)*\\/?$/i;\nconst IMAGE_REGEX = /\\.(jpeg|jpg|gif|png|webp|svg|bmp)(\\?.*)?$/i;\n\nexport const isEmail = (value: string): boolean => EMAIL_REGEX.test(value);\n\nexport const isImage = (value: string): boolean => {\n return URL_REGEX.test(value) && IMAGE_REGEX.test(value);\n};\n\nexport const isUrl = (value: string): boolean => {\n if (isImage(value)) return false; // Give priority to image\n return URL_REGEX.test(value);\n};\n\nexport const isDate = (value: any): boolean => {\n if (value instanceof Date) return !isNaN(value.getTime());\n if (typeof value === 'string' || typeof value === 'number') {\n // Prevent isolated raw numbers from being miscast to dates\n if (typeof value === 'number') return false;\n \n // Prevent purely numeric strings from being detected as dates\n if (typeof value === 'string' && value.trim() !== '' && !isNaN(Number(value))) return false;\n \n // Strict regex check for common date formats to avoid false positives for \"ORD-1001\" etc.\n // Matches YYYY-MM-DD, DD-MM-YYYY, MM/DD/YYYY, and ISO strings\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z?)?$|^\\d{1,2}[-/]\\d{1,2}[-/]\\d{2,4}$/;\n if (typeof value === 'string' && !datePattern.test(value.trim())) {\n // If it doesn't match a standard pattern, be very conservative\n // new Date(\"ORD-1001\") incorrectly results in a valid year 1001 in some environments\n return false;\n }\n\n const d = new Date(value);\n return !isNaN(d.getTime()) && String(d) !== 'Invalid Date';\n }\n return false;\n};\n\nexport const isCurrency = (value: string): boolean => {\n return typeof value === 'string' && /^[£$€¥]?\\s*-?\\d+(?:,\\d{3})*(?:\\.\\d+)?\\s*[£$€¥]?$/.test(value) && /[£$€¥]/.test(value);\n};\n\nexport const isPercentage = (value: string): boolean => {\n return typeof value === 'string' && /^-?\\d+(?:\\.\\d+)?%$/.test(value);\n};\n\nexport const isNumber = (value: any): boolean => {\n if (typeof value === 'number') return true;\n if (typeof value === 'string') {\n return value.trim() !== '' && !isNaN(Number(value));\n }\n return false;\n};\n\nexport const isBoolean = (value: any): boolean => {\n if (typeof value === 'boolean') return true;\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n return lower === 'true' || lower === 'false' || lower === 'yes' || lower === 'no';\n }\n return false;\n};\n\n/**\n * Priority: 1 email 2 url 3 image 4 date 5 currency 6 percentage 7 number 8 boolean 9 string\n */\nexport const detectValueType = (value: any): ColumnType => {\n if (value === null || value === undefined || value === '') return 'string';\n \n const strVal = String(value);\n\n if (isEmail(strVal)) return 'email';\n if (isUrl(strVal)) return 'url';\n if (isImage(strVal)) return 'image';\n if (isDate(value)) return 'date';\n if (isCurrency(strVal)) return 'currency';\n if (isPercentage(strVal)) return 'percentage';\n if (isNumber(value)) return 'number';\n if (isBoolean(value)) return 'boolean';\n\n return 'string';\n};\n","import { Dataset } from '../schema/schemaTypes';\n\n/**\n * Samples up to maxSampleSize rows from the dataset without scanning the whole array\n * sampleSize = min(200, dataset.length)\n */\nexport function sampleDataset(dataset: Dataset, maxSampleSize: number = 200): Dataset {\n if (!dataset || !dataset.length) return [];\n if (dataset.length <= maxSampleSize) return [...dataset];\n\n const sample: Dataset = [];\n const indices = new Set<number>();\n \n while (sample.length < maxSampleSize) {\n const idx = Math.floor(Math.random() * dataset.length);\n if (!indices.has(idx)) {\n indices.add(idx);\n sample.push(dataset[idx]);\n }\n }\n \n return sample;\n}\n","import { Dataset, ColumnType } from '../schema/schemaTypes';\n\nexport interface ColumnStats {\n uniqueValues?: number;\n min?: number;\n max?: number;\n}\n\nexport const computeColumnStats = (columnKey: string, dataset: Dataset, type: ColumnType): ColumnStats => {\n const stats: ColumnStats = {};\n \n const uniqueVals = new Set<any>();\n let min: number | undefined = undefined;\n let max: number | undefined = undefined;\n\n for (const row of dataset) {\n const val = row[columnKey];\n if (val !== null && val !== undefined && val !== '') {\n uniqueVals.add(val);\n\n if (type === 'number' || type === 'currency' || type === 'percentage') {\n let numVal = NaN;\n if (type === 'number') numVal = Number(val);\n else if (type === 'currency' || type === 'percentage') {\n const clean = String(val).replace(/[^0-9.-]/g, '');\n numVal = Number(clean);\n }\n\n if (!isNaN(numVal)) {\n if (min === undefined || numVal < min) min = numVal;\n if (max === undefined || numVal > max) max = numVal;\n }\n } else if (type === 'date') {\n const d = new Date(val).getTime();\n if (!isNaN(d)) {\n if (min === undefined || d < min) min = d;\n if (max === undefined || d > max) max = d;\n }\n }\n }\n }\n\n stats.uniqueValues = uniqueVals.size;\n if (min !== undefined) stats.min = min;\n if (max !== undefined) stats.max = max;\n\n return stats;\n};\n","import { Dataset, TableSchema, ColumnSchema, ColumnType } from './schemaTypes';\nimport { sampleDataset } from '../analyzer/sampleDataset';\nimport { detectValueType } from '../analyzer/detectTypes';\nimport { computeColumnStats } from '../analyzer/computeStats';\nimport { PluginRegistry } from '../plugins/pluginRegistry';\n\nexport const buildSchema = (dataset: Dataset, registry?: PluginRegistry): TableSchema => {\n if (!dataset || dataset.length === 0) return {};\n\n const sample = sampleDataset(dataset, 200);\n const sampleSize = sample.length;\n \n // Get all keys\n const keys = new Set<string>();\n for (const row of sample) {\n for (const key of Object.keys(row)) {\n keys.add(key);\n }\n }\n\n const schema: TableSchema = {};\n\n for (const key of keys) {\n const values = sample.map(row => row[key]);\n \n // 1. Ask plugins if they want to override the detection explicitly\n let detectedTypeStr = null;\n \n if (registry) {\n detectedTypeStr = registry.runDetectors(key, values);\n }\n\n if (detectedTypeStr) {\n const isNull = values.some(v => v === null || v === undefined);\n schema[key] = {\n key,\n type: detectedTypeStr as any,\n nullable: isNull\n };\n \n const stats = computeColumnStats(key, sample, detectedTypeStr as any);\n schema[key].uniqueValues = stats.uniqueValues;\n if (stats.min !== undefined) schema[key].min = stats.min;\n if (stats.max !== undefined) schema[key].max = stats.max;\n \n continue; \n }\n\n // 2. Standard detection logic fallback\n let nullCount = 0;\n const typeCounts: Record<string, number> = {};\n\n for (const row of sample) {\n const val = row[key];\n if (val === null || val === undefined || val === '') {\n nullCount++;\n } else {\n const detectedType = detectValueType(val);\n typeCounts[detectedType] = (typeCounts[detectedType] || 0) + 1;\n }\n }\n\n const validValuesCount = sampleSize - nullCount;\n let dominantType: ColumnType = 'string';\n\n if (validValuesCount > 0) {\n let maxCount = 0;\n let topType = 'string';\n\n for (const [type, count] of Object.entries(typeCounts)) {\n if (count > maxCount) {\n maxCount = count;\n topType = type;\n }\n }\n\n // accept if confidence > 0.7 otherwise fallback to string\n const confidence = maxCount / validValuesCount;\n dominantType = confidence > 0.7 ? (topType as ColumnType) : 'string';\n }\n\n const stats = computeColumnStats(key, sample, dominantType);\n\n const columnSchema: ColumnSchema = {\n key,\n type: dominantType,\n nullable: nullCount > 0,\n uniqueValues: stats.uniqueValues,\n };\n\n if (stats.min !== undefined) columnSchema.min = stats.min;\n if (stats.max !== undefined) columnSchema.max = stats.max;\n\n schema[key] = columnSchema;\n }\n\n return schema;\n};\n","import { useState, useMemo } from 'react';\nimport { Dataset, TableSchema } from '../schema/schemaTypes';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface UseSortingResult {\n sortedData: Dataset;\n sortColumn: string | null;\n sortDirection: SortDirection;\n handleSort: (columnKey: string) => void;\n}\n\nexport const useSorting = (\n data: Dataset,\n schema: TableSchema,\n initialSortColumn: string | null = null,\n initialSortDirection: SortDirection = 'asc'\n): UseSortingResult => {\n const [sortColumn, setSortColumn] = useState<string | null>(initialSortColumn);\n const [sortDirection, setSortDirection] = useState<SortDirection>(initialSortDirection);\n\n const handleSort = (columnKey: string) => {\n if (sortColumn === columnKey) {\n if (sortDirection === 'asc') {\n setSortDirection('desc');\n } else {\n // Toggle off sorting if clicking desc again (optional behavior, here we just toggle between asc/desc/off)\n setSortColumn(null);\n setSortDirection('asc');\n }\n } else {\n setSortColumn(columnKey);\n setSortDirection('asc');\n }\n };\n\n const sortedData = useMemo(() => {\n if (!sortColumn || !data || data.length === 0) return data;\n\n const columnType = schema[sortColumn]?.type || 'string';\n\n return [...data].sort((a, b) => {\n let valA = a[sortColumn];\n let valB = b[sortColumn];\n\n if (valA === valB) return 0;\n if (valA === null || valA === undefined) return sortDirection === 'asc' ? 1 : -1;\n if (valB === null || valB === undefined) return sortDirection === 'asc' ? -1 : 1;\n\n let comparison = 0;\n\n switch (columnType) {\n case 'number':\n case 'currency':\n case 'percentage':\n const numA = typeof valA === 'number' ? valA : Number(String(valA).replace(/[^0-9.-]/g, ''));\n const numB = typeof valB === 'number' ? valB : Number(String(valB).replace(/[^0-9.-]/g, ''));\n comparison = (isNaN(numA) ? 0 : numA) - (isNaN(numB) ? 0 : numB);\n break;\n case 'date':\n const dateA = new Date(valA).getTime();\n const dateB = new Date(valB).getTime();\n comparison = (isNaN(dateA) ? 0 : dateA) - (isNaN(dateB) ? 0 : dateB);\n break;\n case 'boolean':\n const boolA = valA === true || String(valA).toLowerCase() === 'true' || String(valA).toLowerCase() === 'yes' ? 1 : 0;\n const boolB = valB === true || String(valB).toLowerCase() === 'true' || String(valB).toLowerCase() === 'yes' ? 1 : 0;\n comparison = boolA - boolB;\n break;\n default:\n comparison = String(valA).localeCompare(String(valB));\n break;\n }\n\n return sortDirection === 'asc' ? comparison : -comparison;\n });\n }, [data, schema, sortColumn, sortDirection]);\n\n return { sortedData, sortColumn, sortDirection, handleSort };\n};\n","import { useState, useMemo } from 'react';\nimport { Dataset, TableSchema } from '../schema/schemaTypes';\n\nexport type FilterStateValue = string | { min?: number; max?: number } | { start?: string; end?: string } | boolean | null;\n\nexport interface FilterState {\n [key: string]: FilterStateValue;\n}\n\nexport interface UseFiltersResult {\n filteredData: Dataset;\n filters: FilterState;\n setFilter: (columnKey: string, value: FilterStateValue) => void;\n clearFilters: () => void;\n}\n\nexport const useFilters = (data: Dataset, schema: TableSchema): UseFiltersResult => {\n const [filters, setFilters] = useState<FilterState>({});\n\n const setFilter = (columnKey: string, value: FilterStateValue) => {\n setFilters(prev => {\n const next = { ...prev };\n if (value === null || value === undefined || value === '') {\n delete next[columnKey];\n } else {\n next[columnKey] = value;\n }\n return next;\n });\n };\n\n const clearFilters = () => setFilters({});\n\n const filteredData = useMemo(() => {\n if (!filters || Object.keys(filters).length === 0 || !data || data.length === 0) {\n return data;\n }\n\n return data.filter(row => {\n for (const [key, filterValue] of Object.entries(filters)) {\n const rowValue = row[key];\n const type = schema[key]?.type || 'string';\n\n if (rowValue === null || rowValue === undefined) {\n // If filtering is active but the value is absent, we usually reject\n if (filterValue !== null && filterValue !== '') return false;\n continue;\n }\n\n switch (type) {\n case 'string':\n case 'email':\n case 'url':\n if (typeof filterValue === 'string') {\n if (!String(rowValue).toLowerCase().includes(filterValue.toLowerCase())) return false;\n }\n break;\n \n case 'number':\n case 'currency':\n case 'percentage':\n if (typeof filterValue === 'object' && filterValue !== null) {\n const numVal = typeof rowValue === 'number' ? rowValue : Number(String(rowValue).replace(/[^0-9.-]/g, ''));\n if (isNaN(numVal)) return false;\n \n const { min, max } = filterValue as { min?: number; max?: number };\n if (min !== undefined && numVal < min) return false;\n if (max !== undefined && numVal > max) return false;\n }\n break;\n \n case 'date':\n if (typeof filterValue === 'object' && filterValue !== null) {\n const dateVal = new Date(rowValue).getTime();\n if (isNaN(dateVal)) return false;\n\n const { start, end } = filterValue as { start?: string; end?: string };\n if (start && dateVal < new Date(start).getTime()) return false;\n if (end && dateVal > new Date(end).getTime()) return false;\n }\n break;\n\n case 'boolean':\n if (typeof filterValue === 'boolean') {\n const boolVal = rowValue === true || String(rowValue).toLowerCase() === 'true' || String(rowValue).toLowerCase() === 'yes';\n if (boolVal !== filterValue) return false;\n }\n break;\n }\n }\n return true;\n });\n }, [data, schema, filters]);\n\n return { filteredData, filters, setFilter, clearFilters };\n};\n","import { useState, useMemo } from 'react';\nimport { Dataset } from '../schema/schemaTypes';\n\nexport interface UsePaginationResult {\n paginatedData: Dataset;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n}\n\nexport const usePagination = (\n data: Dataset,\n initialPageSize: number = 10\n): UsePaginationResult => {\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize, setPageSize] = useState(initialPageSize);\n\n const totalPages = Math.max(1, Math.ceil(data.length / pageSize));\n\n // Ensure current page is valid when data shrinks (e.g., from filtering)\n const safeCurrentPage = Math.min(currentPage, totalPages);\n\n const paginatedData = useMemo(() => {\n const startIndex = (safeCurrentPage - 1) * pageSize;\n return data.slice(startIndex, startIndex + pageSize);\n }, [data, safeCurrentPage, pageSize]);\n\n return {\n paginatedData,\n currentPage: safeCurrentPage,\n pageSize,\n totalPages,\n setPage: setCurrentPage,\n setPageSize\n };\n};\n","import { Dataset } from '../schema/schemaTypes';\n\nexport interface AggregatedDataPoint {\n [key: string]: any; // Dimension name -> value, Metric name -> value\n}\n\n/**\n * Groups dataset by a specific dimension and sums the metrics\n */\nexport const aggregateData = (\n dataset: Dataset,\n dimension: string,\n metrics: string[]\n): AggregatedDataPoint[] => {\n if (!dataset || dataset.length === 0) return [];\n if (!dimension) return [];\n\n const groups = new Map<any, AggregatedDataPoint>();\n\n for (const row of dataset) {\n let dimValue = row[dimension];\n \n // Normalize dimension values for grouping\n if (dimValue === null || dimValue === undefined) {\n dimValue = 'Unknown';\n } else if (typeof dimValue === 'boolean') {\n dimValue = dimValue ? 'Yes' : 'No';\n }\n\n if (!groups.has(dimValue)) {\n const initPoint: AggregatedDataPoint = { [dimension]: dimValue };\n for (const m of metrics) {\n initPoint[m] = 0;\n }\n groups.set(dimValue, initPoint);\n }\n\n const group = groups.get(dimValue)!;\n\n for (const m of metrics) {\n const val = row[m];\n let numVal = 0;\n if (typeof val === 'number') {\n numVal = val;\n } else if (typeof val === 'string') {\n numVal = Number(val.replace(/[^0-9.-]/g, ''));\n }\n \n if (!isNaN(numVal)) {\n group[m] += numVal;\n }\n }\n }\n\n return Array.from(groups.values());\n};\n\n/**\n * Groups dataset by a dimension and simply counts occurrences \n * (useful when there are no metrics)\n */\nexport const aggregateDataByCount = (\n dataset: Dataset,\n dimension: string\n): AggregatedDataPoint[] => {\n if (!dataset || dataset.length === 0) return [];\n\n const groups = new Map<any, number>();\n\n for (const row of dataset) {\n let dimValue = row[dimension];\n if (dimValue === null || dimValue === undefined) {\n dimValue = 'Unknown';\n } else if (typeof dimValue === 'boolean') {\n dimValue = dimValue ? 'Yes' : 'No';\n }\n\n groups.set(dimValue, (groups.get(dimValue) || 0) + 1);\n }\n\n return Array.from(groups.entries()).map(([dim, count]) => ({\n [dimension]: dim,\n count: count\n }));\n};\n","import { TableSchema, ColumnType, Dataset } from '../schema/schemaTypes';\n\nexport type FieldRole = 'dimension' | 'metric' | 'discard';\n\nexport interface ChartDetectionResult {\n dimensions: string[];\n metrics: string[];\n}\n\n/**\n * Analyzes the schema to categorize fields into dimensions (x-axis/groups) and metrics (y-axis/values)\n */\nexport const detectChartFields = (schema: TableSchema): ChartDetectionResult => {\n const dimensions: string[] = [];\n const metrics: string[] = [];\n\n for (const [key, col] of Object.entries(schema)) {\n // Ignore ID fields - they make meaningless charts\n const lowerKey = key.toLowerCase();\n const isIdField = \n lowerKey === 'id' || \n lowerKey === '_id' || \n lowerKey === 'uuid' || \n lowerKey === 'guid' || \n lowerKey.endsWith('id') || \n lowerKey.endsWith('_id') ||\n lowerKey.endsWith('uuid');\n\n if (isIdField) {\n continue;\n }\n\n const role = determineFieldRole(col.type, col.uniqueValues);\n if (role === 'dimension') {\n dimensions.push(key);\n } else if (role === 'metric') {\n metrics.push(key);\n }\n }\n\n return { dimensions, metrics };\n};\n\nconst determineFieldRole = (type: ColumnType, uniqueValues?: number): FieldRole => {\n switch (type) {\n case 'boolean':\n return 'dimension';\n case 'string':\n // Strings with low-to-medium cardinality are good for dimensions (countries, roles, etc.)\n if (uniqueValues !== undefined && uniqueValues > 1 && uniqueValues <= 20) {\n return 'dimension';\n }\n return 'discard';\n case 'date':\n return 'dimension';\n case 'number':\n case 'currency':\n case 'percentage':\n return 'metric';\n default:\n return 'discard';\n }\n};\n","/**\n * Converts a string to Title Case.\n * Example: 'hello_world' -> 'Hello World', 'name' -> 'Name'\n */\nconst ACRONYMS = ['ID', 'URL', 'API', 'JSON', 'UUID', 'SKU', 'IP', 'VAT', 'GST'];\n\nexport const toTitleCase = (str: string): string => {\n if (!str) return '';\n \n // Replace underscores or camelCase with spaces\n const spaced = str\n .replace(/([A-Z])/g, ' $1')\n .replace(/[_-]/g, ' ')\n .trim();\n\n return spaced\n .split(' ')\n .filter(Boolean)\n .map(word => {\n const upper = word.toUpperCase();\n // If it's a known acronym, return it as upper case\n if (ACRONYMS.includes(upper)) {\n return upper;\n }\n // Otherwise capitalize first char\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n};\n","import { Dataset, TableSchema } from '../schema/schemaTypes';\nimport { detectChartFields } from './chartDetector';\nimport { aggregateData, aggregateDataByCount, AggregatedDataPoint } from './aggregationEngine';\nimport { toTitleCase } from '../utils/stringUtils';\n\nexport type ChartType = 'bar' | 'pie' | 'line'; // Keeping it simple for generation\n\nexport interface InsightWidget {\n id: string;\n title: string;\n type: ChartType;\n data: AggregatedDataPoint[];\n xAxisKey: string;\n yAxisKeys: string[]; // Can support stacked/multi bar if multiple metrics\n}\n\n/**\n * Generates an array of insightful charts based on the dataset and its schema.\n */\nexport const generateInsights = (dataset: Dataset, schema: TableSchema): InsightWidget[] => {\n if (!dataset || dataset.length === 0 || !schema) return [];\n\n const { dimensions, metrics } = detectChartFields(schema);\n const widgets: InsightWidget[] = [];\n\n // Generate at most 4 high-quality charts\n const maxCharts = 4;\n\n // 1. Dimensions + Metrics (The most powerful insights)\n if (dimensions.length > 0 && metrics.length > 0) {\n for (const dim of dimensions) {\n if (widgets.length >= maxCharts) break;\n \n const dimInfo = schema[dim];\n const targetMetrics = metrics.slice(0, 2); // Show top 1-2 metrics\n \n const aggregated = aggregateData(dataset, dim, targetMetrics);\n \n // Sort: Dates ASC, others Descending by primary metric\n if (dimInfo.type === 'date') {\n aggregated.sort((a, b) => new Date(a[dim]).getTime() - new Date(b[dim]).getTime());\n } else {\n const primaryMetric = targetMetrics[0];\n aggregated.sort((a, b) => (b[primaryMetric] || 0) - (a[primaryMetric] || 0));\n }\n\n const isLine = dimInfo.type === 'date';\n const isPie = !isLine && aggregated.length > 0 && aggregated.length <= 5 && targetMetrics.length === 1;\n\n widgets.push({\n id: `chart-${dim}-metrics`,\n title: `${targetMetrics.map(toTitleCase).join(' & ')} by ${toTitleCase(dim)}`,\n type: isPie ? 'pie' : isLine ? 'line' : 'bar',\n data: aggregated,\n xAxisKey: dim,\n yAxisKeys: targetMetrics\n });\n }\n }\n\n // 2. Counts (Distributions) - Only if we have space left\n if (dimensions.length > 0 && widgets.length < maxCharts) {\n for (const dim of dimensions) {\n if (widgets.length >= maxCharts) break;\n if (widgets.some(w => w.id.includes(dim))) continue; // Avoid duplicate dimensions\n\n const dimInfo = schema[dim];\n const aggregated = aggregateDataByCount(dataset, dim);\n \n if (dimInfo.type === 'date') {\n aggregated.sort((a, b) => new Date(a[dim]).getTime() - new Date(b[dim]).getTime());\n } else {\n aggregated.sort((a, b) => b.count - a.count);\n }\n\n const isLine = dimInfo.type === 'date';\n\n widgets.push({\n id: `chart-${dim}-count`,\n title: `Distribution of ${toTitleCase(dim)}`,\n type: isLine ? 'line' : (aggregated.length <= 6 ? 'pie' : 'bar'),\n data: aggregated,\n xAxisKey: dim,\n yAxisKeys: ['count']\n });\n }\n }\n\n return widgets;\n};\n","import React, { useMemo } from 'react';\nimport { Dataset } from '../schema/schemaTypes';\nimport { buildSchema } from '../schema/buildSchema';\nimport { TableHeader } from './TableHeader';\nimport { TableBody } from './TableBody';\nimport { FilterPanel } from './FilterPanel';\nimport { InsightsPanel } from './InsightsPanel';\nimport { useSorting } from '../hooks/useSorting';\nimport { useFilters } from '../hooks/useFilters';\nimport { usePagination } from '../hooks/usePagination';\nimport { SmartTablePlugin } from '../schema/schemaTypes';\nimport { PluginRegistry } from '../plugins/pluginRegistry';\n\nexport interface SmartTableProps {\n data: Dataset;\n sortable?: boolean;\n filterable?: boolean;\n pagination?: boolean;\n insights?: boolean;\n plugins?: SmartTablePlugin[];\n}\n\nexport const SmartTable: React.FC<SmartTableProps> = ({ \n data,\n sortable = false,\n filterable = false,\n pagination = false,\n insights = false,\n plugins = []\n}) => {\n // Setup plugins\n const registry = useMemo(() => {\n const reg = new PluginRegistry();\n if (plugins && plugins.length > 0) {\n reg.register(plugins);\n }\n return reg;\n }, [plugins]);\n\n // Memoize schema so it's only rebuilt when data changes structurally\n const schema = useMemo(() => {\n return buildSchema(data, registry);\n }, [data, registry]);\n\n // Hooks (conditionally applying logic internally, but we always call them per React rules)\n // Flow: Raw Data -> Filtered Data -> Sorted Data -> Paginated Data\n \n const { filteredData, filters, setFilter, clearFilters } = useFilters(data, schema);\n const dataToFilter = filterable ? filteredData : data;\n\n const { sortedData, sortColumn, sortDirection, handleSort } = useSorting(dataToFilter, schema);\n const dataToRenderOrPaginate = sortable ? sortedData : dataToFilter;\n\n const { paginatedData, currentPage, totalPages, setPage } = usePagination(dataToRenderOrPaginate, 10);\n const finalData = pagination ? paginatedData : dataToRenderOrPaginate;\n\n const [showFilters, setShowFilters] = React.useState(true);\n\n if (!data || data.length === 0) {\n return (\n <div className=\"rst-container\">\n <div className=\"rst-empty\">No data to display.</div>\n </div>\n );\n }\n\n const summaryStats = (\n <div className=\"rst-summary-strip\">\n <span>{data.length} Records</span>\n <span className=\"rst-dot\">•</span>\n <span>{Object.keys(schema).length} Columns</span>\n <span className=\"rst-dot\">•</span>\n <span>Types: {Array.from(new Set(Object.values(schema).map(c => c.type))).join(', ')}</span>\n </div>\n );\n\n return (\n <div className=\"rst-container\">\n <header className=\"rst-main-header\">\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end' }}>\n <div>\n <h2>Smart Table</h2>\n <p>Auto-generated insights, filters, and records</p>\n </div>\n {filterable && (\n <button \n className=\"rst-toggle-filters-btn\"\n onClick={() => setShowFilters(!showFilters)}\n >\n Filters {showFilters ? '▲' : '▼'}\n </button>\n )}\n </div>\n </header>\n \n {insights && (\n <InsightsPanel data={dataToRenderOrPaginate} schema={schema} />\n )}\n\n {summaryStats}\n\n {filterable && showFilters && (\n <section className=\"rst-card\">\n <FilterPanel \n schema={schema} \n filters={filters} \n onFilterChange={setFilter} \n onClear={clearFilters} \n />\n </section>\n )}\n\n {data.length > 0 && finalData.length === 0 && (\n <div className=\"rst-empty-results-card\">\n <div className=\"rst-empty-icon\">🔍</div>\n <h3>No results found</h3>\n <p>Try adjusting your filters to find what you're looking for.</p>\n <button className=\"btn btn-primary\" onClick={clearFilters}>Clear All Filters</button>\n </div>\n )}\n\n {data.length > 0 && finalData.length > 0 && (\n <section className=\"rst-card\">\n <div className=\"rst-table-container\">\n <table className=\"rst-table\">\n <TableHeader \n schema={schema} \n sortable={sortable}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n onSort={handleSort}\n />\n <TableBody data={finalData} schema={schema} registry={registry} />\n </table>\n </div>\n\n {pagination && (\n <div className=\"rst-pagination\">\n <button \n disabled={currentPage === 1}\n onClick={() => setPage(currentPage - 1)}\n >\n Previous\n </button>\n <span>Page {currentPage} of {totalPages}</span>\n <button \n disabled={currentPage === totalPages}\n onClick={() => setPage(currentPage + 1)}\n >\n Next\n </button>\n </div>\n )}\n </section>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { TableSchema } from '../schema/schemaTypes';\nimport { SortController } from './SortController';\nimport { SortDirection } from '../hooks/useSorting';\nimport { toTitleCase } from '../utils/stringUtils';\n\nexport interface TableHeaderProps {\n schema: TableSchema;\n sortable?: boolean;\n sortColumn?: string | null;\n sortDirection?: SortDirection;\n onSort?: (columnKey: string) => void;\n}\n\nexport const getColumnWidthClass = (key: string, type: string): string => {\n const lowerKey = key.toLowerCase();\n if (lowerKey === 'id' || lowerKey === '_id' || type === 'boolean') return 'rst-col-xs';\n if (type === 'date' || type === 'number' || lowerKey.includes('status')) return 'rst-col-sm';\n if (lowerKey.includes('role') || lowerKey.includes('country') || lowerKey.includes('category')) return 'rst-col-md';\n if (lowerKey.includes('name') || lowerKey.includes('email') || lowerKey.includes('url') || lowerKey.includes('description')) return 'rst-col-flex';\n return 'rst-col-md';\n};\n\nexport const TableHeader: React.FC<TableHeaderProps> = ({ \n schema, \n sortable = false, \n sortColumn = null, \n sortDirection = 'asc', \n onSort \n}) => {\n const columns = Object.keys(schema);\n\n return (\n <thead className=\"rst-header\">\n <tr className=\"rst-header-row\">\n {columns.map(colKey => {\n const colInfo = schema[colKey];\n const widthClass = getColumnWidthClass(colKey, colInfo.type);\n\n return (\n <th \n key={colKey}\n className={`rst-th rst-th-col-${colKey} rst-th-type-${colInfo.type} ${widthClass} ${sortable && onSort ? 'rst-sortable' : ''} ${sortColumn === colKey ? 'rst-sort-active' : ''}`}\n onClick={() => {\n if (sortable && onSort) onSort(colKey);\n }}\n >\n <div className=\"rst-header-content\">\n <span>{toTitleCase(colKey)}</span>\n {sortable && onSort && (\n <span className=\"rst-sort-icon\">\n {sortColumn === colKey ? (sortDirection === 'asc' ? '↑' : '↓') : '⇅'}\n </span>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n};\n","import React, { useRef } from 'react';\nimport { Dataset, TableSchema } from '../schema/schemaTypes';\nimport { getCellRenderer } from '../renderers/cellRendererFactory';\nimport { useVirtual } from 'react-virtual';\nimport { getColumnWidthClass } from './TableHeader';\n\nimport { PluginRegistry } from '../plugins/pluginRegistry';\n\nexport interface TableBodyProps {\n data: Dataset;\n schema: TableSchema;\n registry?: PluginRegistry;\n}\n\nexport const TableBody: React.FC<TableBodyProps> = ({ data, schema, registry }) => {\n const columns = Object.keys(schema);\n const parentRef = useRef<HTMLTableSectionElement>(null);\n\n const rowVirtualizer = useVirtual({\n size: data.length,\n parentRef,\n estimateSize: React.useCallback(() => 45, []),\n overscan: 5,\n });\n\n const isVirtualized = data.length > 20;\n\n if (!isVirtualized) {\n return (\n <tbody className=\"rst-body\">\n {data.map((row, index) => (\n <tr key={index} className=\"rst-row\">\n {columns.map(colKey => {\n const colInfo = schema[colKey];\n const Renderer = getCellRenderer(colInfo.type, registry);\n const widthClass = getColumnWidthClass(colKey, colInfo.type);\n const val = row[colKey];\n\n return (\n <td \n key={colKey}\n className={`rst-td rst-td-col-${colKey} rst-td-type-${colInfo.type} ${widthClass}`}\n >\n {colInfo.type === 'boolean' ? (\n <span className={`rst-badge ${val ? 'rst-badge-yes' : 'rst-badge-no'}`}>\n {val ? 'Yes' : 'No'}\n </span>\n ) : (\n <Renderer value={val} />\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n );\n }\n\n return (\n <tbody \n className=\"rst-body\" \n ref={parentRef}\n style={{\n height: `${rowVirtualizer.totalSize}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n {rowVirtualizer.virtualItems.map((virtualRow) => {\n const row = data[virtualRow.index];\n return (\n <tr \n key={virtualRow.index} \n className=\"rst-row\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {columns.map(colKey => {\n const val = row[colKey];\n const colInfo = schema[colKey];\n const Renderer = getCellRenderer(colInfo.type, registry);\n const widthClass = getColumnWidthClass(colKey, colInfo.type);\n\n return (\n <td \n key={colKey}\n className={`rst-td rst-td-col-${colKey} rst-td-type-${colInfo.type} ${widthClass}`}\n >\n {colInfo.type === 'boolean' ? (\n <span className={`rst-badge ${val ? 'rst-badge-yes' : 'rst-badge-no'}`}>\n {val ? 'Yes' : 'No'}\n </span>\n ) : (\n <Renderer value={val} />\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n );\n};\n","import React from 'react';\n\nexport const NumberRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n \n // Try to parse and format nicely (e.g., 10000 -> 10,000)\n const num = Number(value);\n if (!isNaN(num)) {\n return <span className=\"rst-cell-number\">{new Intl.NumberFormat().format(num)}</span>;\n }\n \n return <span className=\"rst-cell-number\">{String(value)}</span>;\n};\n","import React from 'react';\n\nexport const EmailRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n const email = String(value);\n return (\n <a href={`mailto:${email}`} className=\"rst-cell-email\" onClick={(e) => e.stopPropagation()}>\n {email}\n </a>\n );\n};\n","import React from 'react';\n\nexport const UrlRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n const url = String(value);\n \n // Ensure we have a protocol for the href\n const href = /^https?:\\/\\//i.test(url) ? url : `https://${url}`;\n \n return (\n <a \n href={href} \n target=\"_blank\" \n rel=\"noopener noreferrer\" \n className=\"rst-cell-url\"\n onClick={(e) => e.stopPropagation()}\n >\n {url}\n </a>\n );\n};\n","import React from 'react';\n\nexport const ImageRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n const src = String(value);\n \n return (\n <img \n src={src} \n alt=\"cell content\" \n className=\"rst-cell-image\" \n style={{ maxWidth: '50px', maxHeight: '50px', objectFit: 'contain', borderRadius: '4px' }}\n loading=\"lazy\"\n />\n );\n};\n","import React from 'react';\n\nexport const PercentageRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n \n const str = String(value);\n // If it already contains %, just return it\n if (str.includes('%')) {\n return <span className=\"rst-cell-percentage\">{str}</span>;\n }\n \n // If it's a raw number float, multiply and add % - not strictly required here based on our detector logic,\n // but good for safety matching if someone passes a float instead of stringified percent.\n const num = Number(value);\n if (!isNaN(num)) {\n return <span className=\"rst-cell-percentage\">{(num * 100).toFixed(2)}%</span>;\n }\n\n return <span className=\"rst-cell-percentage\">{str}</span>;\n};\n","import React from 'react';\n\nexport const DateRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n \n const d = new Date(value);\n if (isNaN(d.getTime())) {\n return <span className=\"rst-cell-date\">{String(value)}</span>;\n }\n \n // Format based on local standard\n return (\n <span className=\"rst-cell-date\" title={d.toISOString()}>\n {d.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })}\n </span>\n );\n};\n","import React from 'react';\n\nexport const BooleanRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n\n let isTrue = false;\n if (typeof value === 'boolean') {\n isTrue = value;\n } else if (typeof value === 'string') {\n const lower = value.toLowerCase();\n isTrue = lower === 'true' || lower === 'yes';\n } else if (typeof value === 'number') {\n isTrue = value > 0;\n }\n\n return (\n <span \n className={`rst-cell-boolean rst-cell-boolean-${isTrue ? 'true' : 'false'}`}\n style={{\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '12px',\n fontSize: '0.85em',\n fontWeight: 'bold',\n backgroundColor: isTrue ? '#e6f4ea' : '#fce8e6',\n color: isTrue ? '#137333' : '#c5221f'\n }}\n >\n {isTrue ? 'Yes' : 'No'}\n </span>\n );\n};\n","import React from 'react';\n\nexport const DefaultRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n \n // Render objects as stringified JSON if needed (though schema shouldn't emit complex objects as strings natively unless unstructured)\n if (typeof value === 'object') {\n return <span className=\"rst-cell-default\">{JSON.stringify(value)}</span>;\n }\n \n return <span className=\"rst-cell-default\">{String(value)}</span>;\n};\n","import React from 'react';\nimport { SmartTablePlugin } from '../schema/schemaTypes';\n\nexport const currencyPlugin: SmartTablePlugin = {\n detect: (columnKey: string, sample: any[]) => {\n const lowerKey = columnKey.toLowerCase();\n if (lowerKey.includes('amount') || lowerKey.includes('price') || lowerKey.includes('revenue')) {\n return 'currency';\n }\n return null;\n },\n \n render: ({ value }: { value: any }) => {\n if (value === null || value === undefined) return null;\n \n let num = NaN;\n if (typeof value === 'number') num = value;\n else if (typeof value === 'string') num = Number(value.replace(/[^0-9.-]/g, ''));\n \n if (isNaN(num)) return <span>{String(value)}</span>;\n\n const formatted = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n }).format(num);\n\n return (\n <span style={{ color: num < 0 ? '#d32f2f' : '#388e3c', fontWeight: 'bold' }}>\n {formatted}\n </span>\n );\n }\n};\n","import React from 'react';\nimport { SmartTablePlugin } from '../schema/schemaTypes';\n\nexport const percentagePlugin: SmartTablePlugin = {\n detect: (columnKey: string, sample: any[]) => {\n const lowerKey = columnKey.toLowerCase();\n if (lowerKey.includes('percent') || lowerKey.includes('rate')) {\n return 'percentage';\n }\n return null;\n },\n \n render: ({ value }: { value: any }) => {\n if (value === null || value === undefined) return null;\n \n let str = String(value);\n let num = Number(value);\n \n if (!str.includes('%') && !isNaN(num)) {\n return (\n <span style={{ \n backgroundColor: '#e3f2fd', \n padding: '2px 6px', \n borderRadius: '4px',\n color: '#1565c0',\n fontSize: '0.9em',\n fontWeight: 600\n }}>\n {(num * 100).toFixed(1)}%\n </span>\n );\n }\n\n return (\n <span style={{ \n backgroundColor: '#e3f2fd', \n padding: '2px 6px', \n borderRadius: '4px',\n color: '#1565c0',\n fontSize: '0.9em',\n fontWeight: 600\n }}>\n {str}\n </span>\n );\n }\n};\n","import React from 'react';\nimport { ColumnType } from '../schema/schemaTypes';\nimport { NumberRenderer } from './numberRenderer';\nimport { EmailRenderer } from './emailRenderer';\nimport { UrlRenderer } from './urlRenderer';\nimport { ImageRenderer } from './imageRenderer';\nimport { PercentageRenderer } from './percentageRenderer';\nimport { DateRenderer } from './dateRenderer';\nimport { BooleanRenderer } from './booleanRenderer';\nimport { DefaultRenderer } from './defaultRenderer';\nimport { PluginRegistry } from '../plugins/pluginRegistry';\nimport { currencyPlugin } from '../plugins/currencyPlugin';\nimport { percentagePlugin } from '../plugins/percentagePlugin';\n\nexport const getCellRenderer = (type: ColumnType | string, registry?: PluginRegistry): React.FC<{ value: any }> => {\n \n // Phase 5: Plugin Renderer resolution\n if (registry) {\n for (const plugin of registry.getPlugins()) {\n if (type === 'currency' && plugin.render && (plugin === currencyPlugin || plugin.detect?.('amount', []) === 'currency')) {\n return plugin.render as React.FC<any>;\n }\n if (type === 'percentage' && plugin.render && (plugin === percentagePlugin || plugin.detect?.('percentage', []) === 'percentage')) {\n return plugin.render as React.FC<any>;\n }\n }\n }\n\n // Backwards compat if passed old pluginRenderers record directly (optional cleanup)\n // Fallthrough to defaults\n\n\n // Currency can use number formatting or custom, let's just use number for now if simple, or default\n switch (type) {\n case 'number':\n case 'currency': // Currency might need specific mapping later if we don't render string currency correctly\n return NumberRenderer;\n case 'email':\n return EmailRenderer;\n case 'url':\n return UrlRenderer;\n case 'image':\n return ImageRenderer;\n case 'percentage':\n return PercentageRenderer;\n case 'date':\n return DateRenderer;\n case 'boolean':\n return BooleanRenderer;\n case 'string':\n default:\n return DefaultRenderer;\n }\n};\n","import React from 'react';\nimport { TableSchema } from '../schema/schemaTypes';\nimport { FilterState, FilterStateValue } from '../hooks/useFilters';\n\nimport { toTitleCase } from '../utils/stringUtils';\n\nexport interface FilterPanelProps {\n schema: TableSchema;\n filters: FilterState;\n onFilterChange: (columnKey: string, value: FilterStateValue) => void;\n onClear: () => void;\n}\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ schema, filters, onFilterChange, onClear }) => {\n const handleStringChange = (key: string, e: React.ChangeEvent<HTMLInputElement>) => {\n onFilterChange(key, e.target.value || null);\n };\n\n const handleNumberChange = (key: string, field: 'min' | 'max', value: string) => {\n const current = (filters[key] as { min?: number; max?: number }) || {};\n const num = parseFloat(value);\n \n const next = { ...current };\n if (isNaN(num)) {\n delete next[field];\n } else {\n next[field] = num;\n }\n\n if (Object.keys(next).length === 0) {\n onFilterChange(key, null);\n } else {\n onFilterChange(key, next);\n }\n };\n\n const handleDateChange = (key: string, field: 'start' | 'end', value: string) => {\n const current = (filters[key] as { start?: string; end?: string }) || {};\n const next = { ...current };\n \n if (!value) {\n delete next[field];\n } else {\n next[field] = value;\n }\n\n if (Object.keys(next).length === 0) {\n onFilterChange(key, null);\n } else {\n onFilterChange(key, next);\n }\n };\n\n const handleBooleanToggle = (key: string) => {\n const current = filters[key];\n if (current === true) {\n onFilterChange(key, false);\n } else if (current === false) {\n onFilterChange(key, null); // Tri-state: true -> false -> null(all)\n } else {\n onFilterChange(key, true);\n }\n };\n\n return (\n <div className=\"rst-filter-panel\">\n {Object.entries(schema).map(([key, colInfo]) => {\n const type = colInfo.type;\n const currentFilter = filters[key];\n\n return (\n <div key={key} className={`rst-filter-group rst-filter-type-${type}`}>\n <label>\n {toTitleCase(key)} Filter\n </label>\n\n {(type === 'string' || type === 'email' || type === 'url') && (\n <input \n type=\"text\" \n placeholder={`Search ${toTitleCase(key)}...`} \n value={(currentFilter as string) || ''}\n onChange={(e) => handleStringChange(key, e)}\n />\n )}\n\n {(type === 'number' || type === 'currency' || type === 'percentage') && (\n <div className=\"rst-filter-range\">\n <input \n type=\"number\" \n placeholder=\"Min\" \n value={(currentFilter as any)?.min ?? ''}\n onChange={(e) => handleNumberChange(key, 'min', e.target.value)}\n />\n <input \n type=\"number\" \n placeholder=\"Max\" \n value={(currentFilter as any)?.max ?? ''}\n onChange={(e) => handleNumberChange(key, 'max', e.target.value)}\n />\n </div>\n )}\n\n {type === 'date' && (\n <div className=\"rst-filter-range\">\n <input \n type=\"date\" \n title=\"Start Date\"\n value={(currentFilter as any)?.start || ''}\n onChange={(e) => handleDateChange(key, 'start', e.target.value)}\n />\n <input \n type=\"date\" \n title=\"End Date\"\n value={(currentFilter as any)?.end || ''}\n onChange={(e) => handleDateChange(key, 'end', e.target.value)}\n />\n </div>\n )}\n\n {type === 'boolean' && (\n <button \n className=\"rst-filter-toggle\"\n onClick={() => handleBooleanToggle(key)}\n style={{ \n backgroundColor: currentFilter === true ? '#e6f4ea' : currentFilter === false ? '#fce8e6' : '#fff',\n }}\n >\n {currentFilter === true ? 'Only Yes' : currentFilter === false ? 'Only No' : 'All'}\n </button>\n )}\n </div>\n );\n })}\n \n {Object.keys(filters).length > 0 && (\n <button \n className=\"rst-filter-clear-btn\"\n onClick={onClear}\n >\n Clear All Filters\n </button>\n )}\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { TableSchema, Dataset } from '../schema/schemaTypes';\nimport { generateInsights } from '../insights/insightBuilder';\nimport { \n BarChart, Bar, \n LineChart, Line, \n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer \n} from 'recharts';\n\nexport interface InsightsPanelProps {\n data: Dataset;\n schema: TableSchema;\n}\n\nconst COLORS = ['#8884d8', '#82ca9d', '#ffc658', '#ff8042', '#a4de6c', '#d0ed57'];\n\nexport const InsightsPanel: React.FC<InsightsPanelProps> = ({ data, schema }) => {\n const insights = useMemo(() => {\n return generateInsights(data, schema);\n }, [data, schema]);\n\n if (!insights || insights.length === 0) {\n return null;\n }\n\n return (\n <div className=\"rst-insights-panel\">\n <h3>AI Generated Insights</h3>\n <div className=\"rst-insights-grid\">\n {insights.map(widget => (\n <div key={widget.id} className=\"rst-insight-card\">\n <h4 className=\"rst-insight-title\">{widget.title}</h4>\n \n <div className=\"rst-insight-chart-wrapper\" style={{ height: '240px' }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {widget.type === 'bar' ? (\n <BarChart data={widget.data} margin={{ top: 5, right: 10, left: 0, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis dataKey={widget.xAxisKey} tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <YAxis tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <Tooltip \n contentStyle={{ borderRadius: '8px', border: 'none', boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)' }} \n cursor={{fill: '#f1f5f9'}}\n />\n <Legend wrapperStyle={{ fontSize: '11px', paddingTop: '10px' }} iconType=\"circle\" />\n {widget.yAxisKeys.map((yKey, index) => (\n <Bar key={yKey} dataKey={yKey} fill={COLORS[index % COLORS.length]} radius={[4, 4, 0, 0]} barSize={32} />\n ))}\n </BarChart>\n ) : widget.type === 'line' ? (\n <LineChart data={widget.data} margin={{ top: 5, right: 10, left: 0, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis dataKey={widget.xAxisKey} tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <YAxis tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <Tooltip contentStyle={{ borderRadius: '8px', border: 'none', boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)' }} />\n <Legend wrapperStyle={{ fontSize: '11px', paddingTop: '10px' }} iconType=\"circle\" />\n {widget.yAxisKeys.map((yKey, index) => (\n <Line key={yKey} type=\"monotone\" dataKey={yKey} stroke={COLORS[index % COLORS.length]} strokeWidth={2.5} dot={{ r: 4, strokeWidth: 2, fill: '#fff' }} activeDot={{ r: 6, strokeWidth: 0 }} />\n ))}\n </LineChart>\n ) : (\n <PieChart>\n <Tooltip contentStyle={{ borderRadius: '8px', border: 'none', boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)' }} />\n <Legend wrapperStyle={{ fontSize: '11px' }} iconType=\"circle\" />\n <Pie\n data={widget.data}\n cx=\"50%\"\n cy=\"45%\"\n innerRadius={60}\n outerRadius={80}\n fill=\"#8884d8\"\n paddingAngle={5}\n dataKey={widget.yAxisKeys[0]}\n nameKey={widget.xAxisKey}\n label={false}\n >\n {widget.data.map((entry: any, index: number) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Pie>\n </PieChart>\n )}\n </ResponsiveContainer>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import { SmartTablePlugin, ColumnType } from '../schema/schemaTypes';\n\nclass PluginRegistry {\n private plugins: SmartTablePlugin[] = [];\n\n register(pluginOrPlugins: SmartTablePlugin | SmartTablePlugin[]) {\n if (Array.isArray(pluginOrPlugins)) {\n this.plugins.push(...pluginOrPlugins);\n } else {\n this.plugins.push(pluginOrPlugins);\n }\n }\n\n clear() {\n this.plugins = [];\n }\n\n runDetectors(columnKey: string, sample: any[]): ColumnType | null {\n for (const plugin of this.plugins) {\n if (plugin.detect) {\n const detectedType = plugin.detect(columnKey, sample);\n if (detectedType) {\n return detectedType;\n }\n }\n }\n return null;\n }\n\n getRenderers(): Record<string, React.FC<{ value: any }>> {\n const renderers: Record<string, React.FC<{ value: any }>> = {};\n for (const plugin of this.plugins) {\n // If a plugin provides a detect, it can implicitly define a completely new string type.\n // E.g., if a plugin returns 'my_custom_type' from detect() we need to map that type to its renderer().\n // For simplicity in this architecture, we expect the plugin to either state what type it renders \n // or we map it generically if it provided a single render override.\n // But based on the interface `render(value) => ReactNode` it doesn't give a key.\n // Let's enhance it slightly internally or expect the plugin author to provide a mapping if needed.\n // Actually, per docs: { detect(column, sample), render(cell), insights(dataset) }\n // This implies 1 plugin handles 1 type override.\n \n // We will look at sample dataset during buildSchema. Let's provide a way for the factory to get it.\n // We'll leave this empty for now if we can't map strict strings, but we will pass the whole registry\n // down to the cell factory.\n }\n return renderers;\n }\n \n getPlugins() {\n return this.plugins;\n }\n}\n\n// Export a singleton instance for global scope if needed, though instance scoped to SmartTable is better\nexport const globalPluginRegistry = new PluginRegistry();\n\n// Export the class so SmartTable can instantiate its own safely\nexport { PluginRegistry };\n"],"mappings":"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","names":["stats","useState","useMemo","useState","useMemo","React","useMemo","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsx","jsxs","useMemo","jsx","jsxs","useMemo","jsx","jsxs","useMemo","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/analyzer/detectTypes.ts","../src/analyzer/sampleDataset.ts","../src/analyzer/computeStats.ts","../src/schema/buildSchema.ts","../src/hooks/useSorting.ts","../src/hooks/useFilters.ts","../src/hooks/usePagination.ts","../src/insights/aggregationEngine.ts","../src/insights/chartDetector.ts","../src/utils/stringUtils.ts","../src/insights/insightBuilder.ts","../src/components/SmartTable.tsx","../src/components/TableHeader.tsx","../src/components/TableBody.tsx","../src/renderers/numberRenderer.tsx","../src/renderers/emailRenderer.tsx","../src/renderers/urlRenderer.tsx","../src/renderers/imageRenderer.tsx","../src/renderers/percentageRenderer.tsx","../src/renderers/dateRenderer.tsx","../src/renderers/booleanRenderer.tsx","../src/renderers/defaultRenderer.tsx","../src/plugins/currencyPlugin.tsx","../src/plugins/percentagePlugin.tsx","../src/renderers/cellRendererFactory.ts","../src/components/FilterPanel.tsx","../src/components/InsightsPanel.tsx","../src/plugins/pluginRegistry.ts"],"sourcesContent":["import { ColumnType } from '../schema/schemaTypes';\n\nconst EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i;\n// simple URL regex\nconst URL_REGEX = /^(https?:\\/\\/)?([\\w.-]+)\\.([a-z]{2,6}\\.?)(\\/[\\w.-]*)*\\/?$/i;\nconst IMAGE_REGEX = /\\.(jpeg|jpg|gif|png|webp|svg|bmp)(\\?.*)?$/i;\n\nexport const isEmail = (value: string): boolean => EMAIL_REGEX.test(value);\n\nexport const isImage = (value: string): boolean => {\n return URL_REGEX.test(value) && IMAGE_REGEX.test(value);\n};\n\nexport const isUrl = (value: string): boolean => {\n if (isImage(value)) return false; // Give priority to image\n return URL_REGEX.test(value);\n};\n\nexport const isDate = (value: any): boolean => {\n if (value instanceof Date) return !isNaN(value.getTime());\n if (typeof value === 'string' || typeof value === 'number') {\n // Prevent isolated raw numbers from being miscast to dates\n if (typeof value === 'number') return false;\n \n // Prevent purely numeric strings from being detected as dates\n if (typeof value === 'string' && value.trim() !== '' && !isNaN(Number(value))) return false;\n \n // Strict regex check for common date formats to avoid false positives for \"ORD-1001\" etc.\n // Matches YYYY-MM-DD, DD-MM-YYYY, MM/DD/YYYY, and ISO strings\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z?)?$|^\\d{1,2}[-/]\\d{1,2}[-/]\\d{2,4}$/;\n if (typeof value === 'string' && !datePattern.test(value.trim())) {\n // If it doesn't match a standard pattern, be very conservative\n // new Date(\"ORD-1001\") incorrectly results in a valid year 1001 in some environments\n return false;\n }\n\n const d = new Date(value);\n return !isNaN(d.getTime()) && String(d) !== 'Invalid Date';\n }\n return false;\n};\n\nexport const isCurrency = (value: string): boolean => {\n return typeof value === 'string' && /^[£$€¥]?\\s*-?\\d+(?:,\\d{3})*(?:\\.\\d+)?\\s*[£$€¥]?$/.test(value) && /[£$€¥]/.test(value);\n};\n\nexport const isPercentage = (value: string): boolean => {\n return typeof value === 'string' && /^-?\\d+(?:\\.\\d+)?%$/.test(value);\n};\n\nexport const isNumber = (value: any): boolean => {\n if (typeof value === 'number') return true;\n if (typeof value === 'string') {\n return value.trim() !== '' && !isNaN(Number(value));\n }\n return false;\n};\n\nexport const isBoolean = (value: any): boolean => {\n if (typeof value === 'boolean') return true;\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n return lower === 'true' || lower === 'false' || lower === 'yes' || lower === 'no';\n }\n return false;\n};\n\n/**\n * Priority: 1 email 2 url 3 image 4 date 5 currency 6 percentage 7 number 8 boolean 9 string\n */\nexport const detectValueType = (value: any): ColumnType => {\n if (value === null || value === undefined || value === '') return 'string';\n \n const strVal = String(value);\n\n if (isEmail(strVal)) return 'email';\n if (isUrl(strVal)) return 'url';\n if (isImage(strVal)) return 'image';\n if (isDate(value)) return 'date';\n if (isCurrency(strVal)) return 'currency';\n if (isPercentage(strVal)) return 'percentage';\n if (isNumber(value)) return 'number';\n if (isBoolean(value)) return 'boolean';\n\n return 'string';\n};\n","import { Dataset } from '../schema/schemaTypes';\n\n/**\n * Samples up to maxSampleSize rows from the dataset without scanning the whole array\n * sampleSize = min(200, dataset.length)\n */\nexport function sampleDataset(dataset: Dataset, maxSampleSize: number = 200): Dataset {\n if (!dataset || !dataset.length) return [];\n if (dataset.length <= maxSampleSize) return [...dataset];\n\n const sample: Dataset = [];\n const indices = new Set<number>();\n \n while (sample.length < maxSampleSize) {\n const idx = Math.floor(Math.random() * dataset.length);\n if (!indices.has(idx)) {\n indices.add(idx);\n sample.push(dataset[idx]);\n }\n }\n \n return sample;\n}\n","import { Dataset, ColumnType } from '../schema/schemaTypes';\n\nexport interface ColumnStats {\n uniqueValues?: number;\n min?: number;\n max?: number;\n}\n\nexport const computeColumnStats = (columnKey: string, dataset: Dataset, type: ColumnType): ColumnStats => {\n const stats: ColumnStats = {};\n \n const uniqueVals = new Set<any>();\n let min: number | undefined = undefined;\n let max: number | undefined = undefined;\n\n for (const row of dataset) {\n const val = row[columnKey];\n if (val !== null && val !== undefined && val !== '') {\n uniqueVals.add(val);\n\n if (type === 'number' || type === 'currency' || type === 'percentage') {\n let numVal = NaN;\n if (type === 'number') numVal = Number(val);\n else if (type === 'currency' || type === 'percentage') {\n const clean = String(val).replace(/[^0-9.-]/g, '');\n numVal = Number(clean);\n }\n\n if (!isNaN(numVal)) {\n if (min === undefined || numVal < min) min = numVal;\n if (max === undefined || numVal > max) max = numVal;\n }\n } else if (type === 'date') {\n const d = new Date(val).getTime();\n if (!isNaN(d)) {\n if (min === undefined || d < min) min = d;\n if (max === undefined || d > max) max = d;\n }\n }\n }\n }\n\n stats.uniqueValues = uniqueVals.size;\n if (min !== undefined) stats.min = min;\n if (max !== undefined) stats.max = max;\n\n return stats;\n};\n","import { Dataset, TableSchema, ColumnSchema, ColumnType } from './schemaTypes';\nimport { sampleDataset } from '../analyzer/sampleDataset';\nimport { detectValueType } from '../analyzer/detectTypes';\nimport { computeColumnStats } from '../analyzer/computeStats';\nimport { PluginRegistry } from '../plugins/pluginRegistry';\n\nexport const buildSchema = (dataset: Dataset, registry?: PluginRegistry): TableSchema => {\n if (!dataset || dataset.length === 0) return {};\n\n const sample = sampleDataset(dataset, 200);\n const sampleSize = sample.length;\n \n // Get all keys\n const keys = new Set<string>();\n for (const row of sample) {\n for (const key of Object.keys(row)) {\n keys.add(key);\n }\n }\n\n const schema: TableSchema = {};\n\n for (const key of keys) {\n const values = sample.map(row => row[key]);\n \n // 1. Ask plugins if they want to override the detection explicitly\n let detectedTypeStr = null;\n \n if (registry) {\n detectedTypeStr = registry.runDetectors(key, values);\n }\n\n if (detectedTypeStr) {\n const isNull = values.some(v => v === null || v === undefined);\n schema[key] = {\n key,\n type: detectedTypeStr as any,\n nullable: isNull\n };\n \n const stats = computeColumnStats(key, sample, detectedTypeStr as any);\n schema[key].uniqueValues = stats.uniqueValues;\n if (stats.min !== undefined) schema[key].min = stats.min;\n if (stats.max !== undefined) schema[key].max = stats.max;\n \n continue; \n }\n\n // 2. Standard detection logic fallback\n let nullCount = 0;\n const typeCounts: Record<string, number> = {};\n\n for (const row of sample) {\n const val = row[key];\n if (val === null || val === undefined || val === '') {\n nullCount++;\n } else {\n const detectedType = detectValueType(val);\n typeCounts[detectedType] = (typeCounts[detectedType] || 0) + 1;\n }\n }\n\n const validValuesCount = sampleSize - nullCount;\n let dominantType: ColumnType = 'string';\n\n if (validValuesCount > 0) {\n let maxCount = 0;\n let topType = 'string';\n\n for (const [type, count] of Object.entries(typeCounts)) {\n if (count > maxCount) {\n maxCount = count;\n topType = type;\n }\n }\n\n // accept if confidence > 0.7 otherwise fallback to string\n const confidence = maxCount / validValuesCount;\n dominantType = confidence > 0.7 ? (topType as ColumnType) : 'string';\n }\n\n const stats = computeColumnStats(key, sample, dominantType);\n\n const columnSchema: ColumnSchema = {\n key,\n type: dominantType,\n nullable: nullCount > 0,\n uniqueValues: stats.uniqueValues,\n };\n\n if (stats.min !== undefined) columnSchema.min = stats.min;\n if (stats.max !== undefined) columnSchema.max = stats.max;\n\n schema[key] = columnSchema;\n }\n\n return schema;\n};\n","import { useState, useMemo } from 'react';\nimport { Dataset, TableSchema } from '../schema/schemaTypes';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface UseSortingResult {\n sortedData: Dataset;\n sortColumn: string | null;\n sortDirection: SortDirection;\n handleSort: (columnKey: string) => void;\n}\n\nexport const useSorting = (\n data: Dataset,\n schema: TableSchema,\n initialSortColumn: string | null = null,\n initialSortDirection: SortDirection = 'asc'\n): UseSortingResult => {\n const [sortColumn, setSortColumn] = useState<string | null>(initialSortColumn);\n const [sortDirection, setSortDirection] = useState<SortDirection>(initialSortDirection);\n\n const handleSort = (columnKey: string) => {\n if (sortColumn === columnKey) {\n if (sortDirection === 'asc') {\n setSortDirection('desc');\n } else {\n // Toggle off sorting if clicking desc again (optional behavior, here we just toggle between asc/desc/off)\n setSortColumn(null);\n setSortDirection('asc');\n }\n } else {\n setSortColumn(columnKey);\n setSortDirection('asc');\n }\n };\n\n const sortedData = useMemo(() => {\n if (!sortColumn || !data || data.length === 0) return data;\n\n const columnType = schema[sortColumn]?.type || 'string';\n\n return [...data].sort((a, b) => {\n let valA = a[sortColumn];\n let valB = b[sortColumn];\n\n if (valA === valB) return 0;\n if (valA === null || valA === undefined) return sortDirection === 'asc' ? 1 : -1;\n if (valB === null || valB === undefined) return sortDirection === 'asc' ? -1 : 1;\n\n let comparison = 0;\n\n switch (columnType) {\n case 'number':\n case 'currency':\n case 'percentage':\n const numA = typeof valA === 'number' ? valA : Number(String(valA).replace(/[^0-9.-]/g, ''));\n const numB = typeof valB === 'number' ? valB : Number(String(valB).replace(/[^0-9.-]/g, ''));\n comparison = (isNaN(numA) ? 0 : numA) - (isNaN(numB) ? 0 : numB);\n break;\n case 'date':\n const dateA = new Date(valA).getTime();\n const dateB = new Date(valB).getTime();\n comparison = (isNaN(dateA) ? 0 : dateA) - (isNaN(dateB) ? 0 : dateB);\n break;\n case 'boolean':\n const boolA = valA === true || String(valA).toLowerCase() === 'true' || String(valA).toLowerCase() === 'yes' ? 1 : 0;\n const boolB = valB === true || String(valB).toLowerCase() === 'true' || String(valB).toLowerCase() === 'yes' ? 1 : 0;\n comparison = boolA - boolB;\n break;\n default:\n comparison = String(valA).localeCompare(String(valB));\n break;\n }\n\n return sortDirection === 'asc' ? comparison : -comparison;\n });\n }, [data, schema, sortColumn, sortDirection]);\n\n return { sortedData, sortColumn, sortDirection, handleSort };\n};\n","import { useState, useMemo } from 'react';\nimport { Dataset, TableSchema } from '../schema/schemaTypes';\n\nexport type FilterStateValue = string | { min?: number; max?: number } | { start?: string; end?: string } | boolean | null;\n\nexport interface FilterState {\n [key: string]: FilterStateValue;\n}\n\nexport interface UseFiltersResult {\n filteredData: Dataset;\n filters: FilterState;\n setFilter: (columnKey: string, value: FilterStateValue) => void;\n clearFilters: () => void;\n}\n\nexport const useFilters = (data: Dataset, schema: TableSchema): UseFiltersResult => {\n const [filters, setFilters] = useState<FilterState>({});\n\n const setFilter = (columnKey: string, value: FilterStateValue) => {\n setFilters(prev => {\n const next = { ...prev };\n if (value === null || value === undefined || value === '') {\n delete next[columnKey];\n } else {\n next[columnKey] = value;\n }\n return next;\n });\n };\n\n const clearFilters = () => setFilters({});\n\n const filteredData = useMemo(() => {\n if (!filters || Object.keys(filters).length === 0 || !data || data.length === 0) {\n return data;\n }\n\n return data.filter(row => {\n for (const [key, filterValue] of Object.entries(filters)) {\n const rowValue = row[key];\n const type = schema[key]?.type || 'string';\n\n if (rowValue === null || rowValue === undefined) {\n // If filtering is active but the value is absent, we usually reject\n if (filterValue !== null && filterValue !== '') return false;\n continue;\n }\n\n switch (type) {\n case 'string':\n case 'email':\n case 'url':\n if (typeof filterValue === 'string') {\n if (!String(rowValue).toLowerCase().includes(filterValue.toLowerCase())) return false;\n }\n break;\n \n case 'number':\n case 'currency':\n case 'percentage':\n if (typeof filterValue === 'object' && filterValue !== null) {\n const numVal = typeof rowValue === 'number' ? rowValue : Number(String(rowValue).replace(/[^0-9.-]/g, ''));\n if (isNaN(numVal)) return false;\n \n const { min, max } = filterValue as { min?: number; max?: number };\n if (min !== undefined && numVal < min) return false;\n if (max !== undefined && numVal > max) return false;\n }\n break;\n \n case 'date':\n if (typeof filterValue === 'object' && filterValue !== null) {\n const dateVal = new Date(rowValue).getTime();\n if (isNaN(dateVal)) return false;\n\n const { start, end } = filterValue as { start?: string; end?: string };\n if (start && dateVal < new Date(start).getTime()) return false;\n if (end && dateVal > new Date(end).getTime()) return false;\n }\n break;\n\n case 'boolean':\n if (typeof filterValue === 'boolean') {\n const boolVal = rowValue === true || String(rowValue).toLowerCase() === 'true' || String(rowValue).toLowerCase() === 'yes';\n if (boolVal !== filterValue) return false;\n }\n break;\n }\n }\n return true;\n });\n }, [data, schema, filters]);\n\n return { filteredData, filters, setFilter, clearFilters };\n};\n","import { useState, useMemo } from 'react';\nimport { Dataset } from '../schema/schemaTypes';\n\nexport interface UsePaginationResult {\n paginatedData: Dataset;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n}\n\nexport const usePagination = (\n data: Dataset,\n initialPageSize: number = 10\n): UsePaginationResult => {\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize, setPageSize] = useState(initialPageSize);\n\n const totalPages = Math.max(1, Math.ceil(data.length / pageSize));\n\n // Ensure current page is valid when data shrinks (e.g., from filtering)\n const safeCurrentPage = Math.min(currentPage, totalPages);\n\n const paginatedData = useMemo(() => {\n const startIndex = (safeCurrentPage - 1) * pageSize;\n return data.slice(startIndex, startIndex + pageSize);\n }, [data, safeCurrentPage, pageSize]);\n\n return {\n paginatedData,\n currentPage: safeCurrentPage,\n pageSize,\n totalPages,\n setPage: setCurrentPage,\n setPageSize\n };\n};\n","import { Dataset } from '../schema/schemaTypes';\n\nexport interface AggregatedDataPoint {\n [key: string]: any; // Dimension name -> value, Metric name -> value\n}\n\n/**\n * Groups dataset by a specific dimension and sums the metrics\n */\nexport const aggregateData = (\n dataset: Dataset,\n dimension: string,\n metrics: string[]\n): AggregatedDataPoint[] => {\n if (!dataset || dataset.length === 0) return [];\n if (!dimension) return [];\n\n const groups = new Map<any, AggregatedDataPoint>();\n\n for (const row of dataset) {\n let dimValue = row[dimension];\n \n // Normalize dimension values for grouping\n if (dimValue === null || dimValue === undefined) {\n dimValue = 'Unknown';\n } else if (typeof dimValue === 'boolean') {\n dimValue = dimValue ? 'Yes' : 'No';\n }\n\n if (!groups.has(dimValue)) {\n const initPoint: AggregatedDataPoint = { [dimension]: dimValue };\n for (const m of metrics) {\n initPoint[m] = 0;\n }\n groups.set(dimValue, initPoint);\n }\n\n const group = groups.get(dimValue)!;\n\n for (const m of metrics) {\n const val = row[m];\n let numVal = 0;\n if (typeof val === 'number') {\n numVal = val;\n } else if (typeof val === 'string') {\n numVal = Number(val.replace(/[^0-9.-]/g, ''));\n }\n \n if (!isNaN(numVal)) {\n group[m] += numVal;\n }\n }\n }\n\n return Array.from(groups.values());\n};\n\n/**\n * Groups dataset by a dimension and simply counts occurrences \n * (useful when there are no metrics)\n */\nexport const aggregateDataByCount = (\n dataset: Dataset,\n dimension: string\n): AggregatedDataPoint[] => {\n if (!dataset || dataset.length === 0) return [];\n\n const groups = new Map<any, number>();\n\n for (const row of dataset) {\n let dimValue = row[dimension];\n if (dimValue === null || dimValue === undefined) {\n dimValue = 'Unknown';\n } else if (typeof dimValue === 'boolean') {\n dimValue = dimValue ? 'Yes' : 'No';\n }\n\n groups.set(dimValue, (groups.get(dimValue) || 0) + 1);\n }\n\n return Array.from(groups.entries()).map(([dim, count]) => ({\n [dimension]: dim,\n count: count\n }));\n};\n","import { TableSchema, ColumnType } from '../schema/schemaTypes';\n\nexport type FieldRole = 'dimension' | 'metric' | 'discard';\n\nexport interface ChartDetectionResult {\n dimensions: string[];\n metrics: string[];\n}\n\n/**\n * Analyzes the schema to categorize fields into dimensions (x-axis/groups) and metrics (y-axis/values)\n */\nexport const detectChartFields = (schema: TableSchema): ChartDetectionResult => {\n const dimensions: string[] = [];\n const metrics: string[] = [];\n\n for (const [key, col] of Object.entries(schema)) {\n // Ignore ID fields - they make meaningless charts\n const lowerKey = key.toLowerCase();\n const isIdField = \n lowerKey === 'id' || \n lowerKey === '_id' || \n lowerKey === 'uuid' || \n lowerKey === 'guid' || \n lowerKey.endsWith('id') || \n lowerKey.endsWith('_id') ||\n lowerKey.endsWith('uuid');\n\n if (isIdField) {\n continue;\n }\n\n const role = determineFieldRole(col.type, col.uniqueValues);\n if (role === 'dimension') {\n dimensions.push(key);\n } else if (role === 'metric') {\n metrics.push(key);\n }\n }\n\n return { dimensions, metrics };\n};\n\nconst determineFieldRole = (type: ColumnType, uniqueValues?: number): FieldRole => {\n switch (type) {\n case 'boolean':\n return 'dimension';\n case 'string':\n // Strings with low-to-medium cardinality are good for dimensions (countries, roles, etc.)\n if (uniqueValues !== undefined && uniqueValues > 1 && uniqueValues <= 20) {\n return 'dimension';\n }\n return 'discard';\n case 'date':\n return 'dimension';\n case 'number':\n case 'currency':\n case 'percentage':\n return 'metric';\n default:\n return 'discard';\n }\n};\n","/**\n * Converts a string to Title Case.\n * Example: 'hello_world' -> 'Hello World', 'name' -> 'Name'\n */\nconst ACRONYMS = ['ID', 'URL', 'API', 'JSON', 'UUID', 'SKU', 'IP', 'VAT', 'GST'];\n\nexport const toTitleCase = (str: string): string => {\n if (!str) return '';\n \n // Replace underscores or camelCase with spaces\n const spaced = str\n .replace(/([A-Z])/g, ' $1')\n .replace(/[_-]/g, ' ')\n .trim();\n\n return spaced\n .split(' ')\n .filter(Boolean)\n .map(word => {\n const upper = word.toUpperCase();\n // If it's a known acronym, return it as upper case\n if (ACRONYMS.includes(upper)) {\n return upper;\n }\n // Otherwise capitalize first char\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n};\n","import { Dataset, TableSchema } from '../schema/schemaTypes';\nimport { detectChartFields } from './chartDetector';\nimport { aggregateData, aggregateDataByCount, AggregatedDataPoint } from './aggregationEngine';\nimport { toTitleCase } from '../utils/stringUtils';\n\nexport type ChartType = 'bar' | 'pie' | 'line'; // Keeping it simple for generation\n\nexport interface InsightWidget {\n id: string;\n title: string;\n type: ChartType;\n data: AggregatedDataPoint[];\n xAxisKey: string;\n yAxisKeys: string[]; // Can support stacked/multi bar if multiple metrics\n}\n\n/**\n * Generates an array of insightful charts based on the dataset and its schema.\n */\nexport const generateInsights = (dataset: Dataset, schema: TableSchema): InsightWidget[] => {\n if (!dataset || dataset.length === 0 || !schema) return [];\n\n const { dimensions, metrics } = detectChartFields(schema);\n const widgets: InsightWidget[] = [];\n\n // Generate at most 4 high-quality charts\n const maxCharts = 4;\n\n // 1. Dimensions + Metrics (The most powerful insights)\n if (dimensions.length > 0 && metrics.length > 0) {\n for (const dim of dimensions) {\n if (widgets.length >= maxCharts) break;\n \n const dimInfo = schema[dim];\n const targetMetrics = metrics.slice(0, 2); // Show top 1-2 metrics\n \n const aggregated = aggregateData(dataset, dim, targetMetrics);\n \n // Sort: Dates ASC, others Descending by primary metric\n if (dimInfo.type === 'date') {\n aggregated.sort((a, b) => new Date(a[dim]).getTime() - new Date(b[dim]).getTime());\n } else {\n const primaryMetric = targetMetrics[0];\n aggregated.sort((a, b) => (b[primaryMetric] || 0) - (a[primaryMetric] || 0));\n }\n\n const isLine = dimInfo.type === 'date';\n const isPie = !isLine && aggregated.length > 0 && aggregated.length <= 5 && targetMetrics.length === 1;\n\n widgets.push({\n id: `chart-${dim}-metrics`,\n title: `${targetMetrics.map(toTitleCase).join(' & ')} by ${toTitleCase(dim)}`,\n type: isPie ? 'pie' : isLine ? 'line' : 'bar',\n data: aggregated,\n xAxisKey: dim,\n yAxisKeys: targetMetrics\n });\n }\n }\n\n // 2. Counts (Distributions) - Only if we have space left\n if (dimensions.length > 0 && widgets.length < maxCharts) {\n for (const dim of dimensions) {\n if (widgets.length >= maxCharts) break;\n if (widgets.some(w => w.id.includes(dim))) continue; // Avoid duplicate dimensions\n\n const dimInfo = schema[dim];\n const aggregated = aggregateDataByCount(dataset, dim);\n \n if (dimInfo.type === 'date') {\n aggregated.sort((a, b) => new Date(a[dim]).getTime() - new Date(b[dim]).getTime());\n } else {\n aggregated.sort((a, b) => b.count - a.count);\n }\n\n const isLine = dimInfo.type === 'date';\n\n widgets.push({\n id: `chart-${dim}-count`,\n title: `Distribution of ${toTitleCase(dim)}`,\n type: isLine ? 'line' : (aggregated.length <= 6 ? 'pie' : 'bar'),\n data: aggregated,\n xAxisKey: dim,\n yAxisKeys: ['count']\n });\n }\n }\n\n return widgets;\n};\n","import React, { useMemo } from 'react';\nimport { Dataset } from '../schema/schemaTypes';\nimport { buildSchema } from '../schema/buildSchema';\nimport { TableHeader } from './TableHeader';\nimport { TableBody } from './TableBody';\nimport { FilterPanel } from './FilterPanel';\nimport { InsightsPanel } from './InsightsPanel';\nimport { useSorting } from '../hooks/useSorting';\nimport { useFilters } from '../hooks/useFilters';\nimport { usePagination } from '../hooks/usePagination';\nimport { SmartTablePlugin } from '../schema/schemaTypes';\nimport { PluginRegistry } from '../plugins/pluginRegistry';\n\nexport interface SmartTableProps {\n data: Dataset;\n sortable?: boolean;\n filterable?: boolean;\n pagination?: boolean;\n insights?: boolean;\n plugins?: SmartTablePlugin[];\n}\n\nexport const SmartTable: React.FC<SmartTableProps> = ({ \n data,\n sortable = false,\n filterable = false,\n pagination = false,\n insights = false,\n plugins = []\n}) => {\n // Setup plugins\n const registry = useMemo(() => {\n const reg = new PluginRegistry();\n if (plugins && plugins.length > 0) {\n reg.register(plugins);\n }\n return reg;\n }, [plugins]);\n\n // Memoize schema so it's only rebuilt when data changes structurally\n const schema = useMemo(() => {\n return buildSchema(data, registry);\n }, [data, registry]);\n\n // Hooks (conditionally applying logic internally, but we always call them per React rules)\n // Flow: Raw Data -> Filtered Data -> Sorted Data -> Paginated Data\n \n const { filteredData, filters, setFilter, clearFilters } = useFilters(data, schema);\n const dataToFilter = filterable ? filteredData : data;\n\n const { sortedData, sortColumn, sortDirection, handleSort } = useSorting(dataToFilter, schema);\n const dataToRenderOrPaginate = sortable ? sortedData : dataToFilter;\n\n const { paginatedData, currentPage, totalPages, setPage } = usePagination(dataToRenderOrPaginate, 10);\n const finalData = pagination ? paginatedData : dataToRenderOrPaginate;\n\n const [showFilters, setShowFilters] = React.useState(true);\n const scrollRef = React.useRef<HTMLDivElement>(null);\n\n if (!data || data.length === 0) {\n return (\n <div className=\"rst-container\">\n <div className=\"rst-empty\">No data to display.</div>\n </div>\n );\n }\n\n const summaryStats = (\n <div className=\"rst-summary-strip\">\n <span>{data.length} Records</span>\n <span className=\"rst-dot\">•</span>\n <span>{Object.keys(schema).length} Columns</span>\n <span className=\"rst-dot\">•</span>\n <span>Types: {Array.from(new Set(Object.values(schema).map(c => c.type))).join(', ')}</span>\n </div>\n );\n\n return (\n <div className=\"rst-container\">\n <header className=\"rst-main-header\">\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end' }}>\n <div>\n <h2>Smart Table</h2>\n <p>Auto-generated insights, filters, and records</p>\n </div>\n {filterable && (\n <button \n className=\"rst-toggle-filters-btn\"\n onClick={() => setShowFilters(!showFilters)}\n >\n Filters {showFilters ? '▲' : '▼'}\n </button>\n )}\n </div>\n </header>\n \n {insights && (\n <InsightsPanel data={dataToRenderOrPaginate} schema={schema} />\n )}\n\n {summaryStats}\n\n {filterable && showFilters && (\n <section className=\"rst-card\">\n <FilterPanel \n schema={schema} \n filters={filters} \n onFilterChange={setFilter} \n onClear={clearFilters} \n />\n </section>\n )}\n\n {data.length > 0 && finalData.length === 0 && (\n <div className=\"rst-empty-results-card\">\n <div className=\"rst-empty-icon\">🔍</div>\n <h3>No results found</h3>\n <p>Try adjusting your filters to find what you're looking for.</p>\n <button className=\"btn btn-primary\" onClick={clearFilters}>Clear All Filters</button>\n </div>\n )}\n\n {data.length > 0 && finalData.length > 0 && (\n <section className=\"rst-card\">\n <div className=\"rst-table-container\" ref={scrollRef}>\n <table className=\"rst-table\">\n <TableHeader \n schema={schema} \n sortable={sortable}\n sortColumn={sortColumn}\n sortDirection={sortDirection}\n onSort={handleSort}\n />\n <TableBody \n data={finalData} \n schema={schema} \n registry={registry} \n scrollRef={scrollRef}\n />\n </table>\n </div>\n\n {pagination && (\n <div className=\"rst-pagination\">\n <button \n disabled={currentPage === 1}\n onClick={() => setPage(currentPage - 1)}\n >\n Previous\n </button>\n <span>Page {currentPage} of {totalPages}</span>\n <button \n disabled={currentPage === totalPages}\n onClick={() => setPage(currentPage + 1)}\n >\n Next\n </button>\n </div>\n )}\n </section>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { TableSchema } from '../schema/schemaTypes';\nimport { SortDirection } from '../hooks/useSorting';\nimport { toTitleCase } from '../utils/stringUtils';\n\nexport interface TableHeaderProps {\n schema: TableSchema;\n sortable?: boolean;\n sortColumn?: string | null;\n sortDirection?: SortDirection;\n onSort?: (columnKey: string) => void;\n}\n\nexport const getColumnWidthClass = (key: string, type: string): string => {\n const lowerKey = key.toLowerCase();\n if (lowerKey === 'id' || lowerKey === '_id' || type === 'boolean') return 'rst-col-xs';\n if (type === 'date' || type === 'number' || lowerKey.includes('status')) return 'rst-col-sm';\n if (lowerKey.includes('role') || lowerKey.includes('country') || lowerKey.includes('category')) return 'rst-col-md';\n if (lowerKey.includes('name') || lowerKey.includes('email') || lowerKey.includes('url') || lowerKey.includes('description')) return 'rst-col-flex';\n return 'rst-col-md';\n};\n\nexport const TableHeader: React.FC<TableHeaderProps> = ({ \n schema, \n sortable = false, \n sortColumn = null, \n sortDirection = 'asc', \n onSort \n}) => {\n const columns = Object.keys(schema);\n\n return (\n <thead className=\"rst-header\">\n <tr className=\"rst-header-row\">\n {columns.map(colKey => {\n const colInfo = schema[colKey];\n const widthClass = getColumnWidthClass(colKey, colInfo.type);\n\n return (\n <th \n key={colKey}\n className={`rst-th rst-th-col-${colKey} rst-th-type-${colInfo.type} ${widthClass} ${sortable && onSort ? 'rst-sortable' : ''} ${sortColumn === colKey ? 'rst-sort-active' : ''}`}\n onClick={() => {\n if (sortable && onSort) onSort(colKey);\n }}\n >\n <div className=\"rst-header-content\">\n <span>{toTitleCase(colKey)}</span>\n {sortable && onSort && (\n <span className=\"rst-sort-icon\">\n {sortColumn === colKey ? (sortDirection === 'asc' ? '↑' : '↓') : '⇅'}\n </span>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n );\n};\n","import React, { useRef, useMemo, useCallback } from \"react\";\nimport { Dataset, TableSchema } from \"../schema/schemaTypes\";\nimport { getCellRenderer } from \"../renderers/cellRendererFactory\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { getColumnWidthClass } from \"./TableHeader\";\nimport { PluginRegistry } from \"../plugins/pluginRegistry\";\n\n/**\n * Props for the TableBody component\n */\nexport interface TableBodyProps {\n data: Dataset;\n schema: TableSchema;\n registry?: PluginRegistry;\n /**\n * Ref to the scrollable container. \n * Required for correct virtualization positioning.\n */\n scrollRef?: React.RefObject<HTMLDivElement>;\n}\n\n/**\n * Helper component for rendering a single table row.\n * Shared between virtualized and non-virtualized rendering.\n */\nconst TableRow: React.FC<{\n row: any;\n index: number;\n columns: string[];\n schema: TableSchema;\n registry?: PluginRegistry;\n style?: React.CSSProperties;\n}> = ({ row, index, columns, schema, registry, style }) => {\n return (\n <tr className=\"rst-row\" style={style}>\n {columns.map((colKey) => {\n const colInfo = schema[colKey];\n const Renderer = getCellRenderer(colInfo.type, registry);\n const widthClass = getColumnWidthClass(colKey, colInfo.type);\n const val = row[colKey];\n\n return (\n <td\n key={colKey}\n className={`rst-td rst-td-col-${colKey} rst-td-type-${colInfo.type} ${widthClass}`}\n >\n {colInfo.type === \"boolean\" ? (\n <span\n className={`rst-badge ${val ? \"rst-badge-yes\" : \"rst-badge-no\"}`}\n >\n {val ? \"Yes\" : \"No\"}\n </span>\n ) : (\n <Renderer value={val} />\n )}\n </td>\n );\n })}\n </tr>\n );\n};\n\nexport const TableBody: React.FC<TableBodyProps> = ({\n data,\n schema,\n registry,\n scrollRef,\n}) => {\n const columns = useMemo(() => Object.keys(schema), [schema]);\n \n // Virtualization threshold (can be made configurable if needed)\n const isVirtualized = data.length > 20;\n\n // Row virtualizer setup using TanStack Virtual v3 API\n const rowVirtualizer = useVirtualizer({\n count: data.length,\n getScrollElement: () => scrollRef?.current || null,\n estimateSize: useCallback(() => 45, []),\n overscan: 5,\n enabled: isVirtualized,\n });\n\n // Small dataset: Standard non-virtual rendering\n if (!isVirtualized || !scrollRef) {\n return (\n <tbody className=\"rst-body\">\n {data.map((row, index) => (\n <TableRow\n key={index}\n row={row}\n index={index}\n columns={columns}\n schema={schema}\n registry={registry}\n />\n ))}\n </tbody>\n );\n }\n\n // Large dataset: Virtualized rendering\n const virtualRows = rowVirtualizer.getVirtualItems();\n const totalSize = rowVirtualizer.getTotalSize();\n\n return (\n <tbody\n className=\"rst-body rst-body-virtualized\"\n style={{\n height: `${totalSize}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {virtualRows.length > 0 ? (\n virtualRows.map((virtualRow) => (\n <TableRow\n key={virtualRow.key}\n row={data[virtualRow.index]}\n index={virtualRow.index}\n columns={columns}\n schema={schema}\n registry={registry}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n />\n ))\n ) : (\n // Fallback for edge cases where virtualizer might be settling\n <tr style={{ height: `${totalSize}px` }}>\n <td colSpan={columns.length} />\n </tr>\n )}\n </tbody>\n );\n};\n","import React from 'react';\n\nexport const NumberRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n \n // Try to parse and format nicely (e.g., 10000 -> 10,000)\n const num = Number(value);\n if (!isNaN(num)) {\n return <span className=\"rst-cell-number\">{new Intl.NumberFormat().format(num)}</span>;\n }\n \n return <span className=\"rst-cell-number\">{String(value)}</span>;\n};\n","import React from 'react';\n\nexport const EmailRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n const email = String(value);\n return (\n <a href={`mailto:${email}`} className=\"rst-cell-email\" onClick={(e) => e.stopPropagation()}>\n {email}\n </a>\n );\n};\n","import React from 'react';\n\nexport const UrlRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n const url = String(value);\n \n // Ensure we have a protocol for the href\n const href = /^https?:\\/\\//i.test(url) ? url : `https://${url}`;\n \n return (\n <a \n href={href} \n target=\"_blank\" \n rel=\"noopener noreferrer\" \n className=\"rst-cell-url\"\n onClick={(e) => e.stopPropagation()}\n >\n {url}\n </a>\n );\n};\n","import React from 'react';\n\nexport const ImageRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n const src = String(value);\n \n return (\n <img \n src={src} \n alt=\"cell content\" \n className=\"rst-cell-image\" \n style={{ maxWidth: '50px', maxHeight: '50px', objectFit: 'contain', borderRadius: '4px' }}\n loading=\"lazy\"\n />\n );\n};\n","import React from 'react';\n\nexport const PercentageRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n \n const str = String(value);\n // If it already contains %, just return it\n if (str.includes('%')) {\n return <span className=\"rst-cell-percentage\">{str}</span>;\n }\n \n // If it's a raw number float, multiply and add % - not strictly required here based on our detector logic,\n // but good for safety matching if someone passes a float instead of stringified percent.\n const num = Number(value);\n if (!isNaN(num)) {\n return <span className=\"rst-cell-percentage\">{(num * 100).toFixed(2)}%</span>;\n }\n\n return <span className=\"rst-cell-percentage\">{str}</span>;\n};\n","import React from 'react';\n\nexport const DateRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (!value) return null;\n \n const d = new Date(value);\n if (isNaN(d.getTime())) {\n return <span className=\"rst-cell-date\">{String(value)}</span>;\n }\n \n // Format based on local standard\n return (\n <span className=\"rst-cell-date\" title={d.toISOString()}>\n {d.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })}\n </span>\n );\n};\n","import React from 'react';\n\nexport const BooleanRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n\n let isTrue = false;\n if (typeof value === 'boolean') {\n isTrue = value;\n } else if (typeof value === 'string') {\n const lower = value.toLowerCase();\n isTrue = lower === 'true' || lower === 'yes';\n } else if (typeof value === 'number') {\n isTrue = value > 0;\n }\n\n return (\n <span \n className={`rst-cell-boolean rst-cell-boolean-${isTrue ? 'true' : 'false'}`}\n style={{\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: '12px',\n fontSize: '0.85em',\n fontWeight: 'bold',\n backgroundColor: isTrue ? '#e6f4ea' : '#fce8e6',\n color: isTrue ? '#137333' : '#c5221f'\n }}\n >\n {isTrue ? 'Yes' : 'No'}\n </span>\n );\n};\n","import React from 'react';\n\nexport const DefaultRenderer: React.FC<{ value: any }> = ({ value }) => {\n if (value === null || value === undefined) return null;\n \n // Render objects as stringified JSON if needed (though schema shouldn't emit complex objects as strings natively unless unstructured)\n if (typeof value === 'object') {\n return <span className=\"rst-cell-default\">{JSON.stringify(value)}</span>;\n }\n \n return <span className=\"rst-cell-default\">{String(value)}</span>;\n};\n","import { SmartTablePlugin } from '../schema/schemaTypes';\n\nexport const currencyPlugin: SmartTablePlugin = {\n detect: (columnKey: string, _sample: any[]) => {\n const lowerKey = columnKey.toLowerCase();\n if (lowerKey.includes('amount') || lowerKey.includes('price') || lowerKey.includes('revenue')) {\n return 'currency';\n }\n return null;\n },\n \n render: ({ value }: { value: any }) => {\n if (value === null || value === undefined) return null;\n \n let num = NaN;\n if (typeof value === 'number') num = value;\n else if (typeof value === 'string') num = Number(value.replace(/[^0-9.-]/g, ''));\n \n if (isNaN(num)) return <span>{String(value)}</span>;\n\n const formatted = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n }).format(num);\n\n return (\n <span style={{ color: num < 0 ? '#d32f2f' : '#388e3c', fontWeight: 'bold' }}>\n {formatted}\n </span>\n );\n }\n};\n","import { SmartTablePlugin } from '../schema/schemaTypes';\n\nexport const percentagePlugin: SmartTablePlugin = {\n detect: (columnKey: string, _sample: any[]) => {\n const lowerKey = columnKey.toLowerCase();\n if (lowerKey.includes('percent') || lowerKey.includes('rate')) {\n return 'percentage';\n }\n return null;\n },\n \n render: ({ value }: { value: any }) => {\n if (value === null || value === undefined) return null;\n \n let str = String(value);\n let num = Number(value);\n \n if (!str.includes('%') && !isNaN(num)) {\n return (\n <span style={{ \n backgroundColor: '#e3f2fd', \n padding: '2px 6px', \n borderRadius: '4px',\n color: '#1565c0',\n fontSize: '0.9em',\n fontWeight: 600\n }}>\n {(num * 100).toFixed(1)}%\n </span>\n );\n }\n\n return (\n <span style={{ \n backgroundColor: '#e3f2fd', \n padding: '2px 6px', \n borderRadius: '4px',\n color: '#1565c0',\n fontSize: '0.9em',\n fontWeight: 600\n }}>\n {str}\n </span>\n );\n }\n};\n","import React from 'react';\nimport { ColumnType } from '../schema/schemaTypes';\nimport { NumberRenderer } from './numberRenderer';\nimport { EmailRenderer } from './emailRenderer';\nimport { UrlRenderer } from './urlRenderer';\nimport { ImageRenderer } from './imageRenderer';\nimport { PercentageRenderer } from './percentageRenderer';\nimport { DateRenderer } from './dateRenderer';\nimport { BooleanRenderer } from './booleanRenderer';\nimport { DefaultRenderer } from './defaultRenderer';\nimport { PluginRegistry } from '../plugins/pluginRegistry';\nimport { currencyPlugin } from '../plugins/currencyPlugin';\nimport { percentagePlugin } from '../plugins/percentagePlugin';\n\nexport const getCellRenderer = (type: ColumnType | string, registry?: PluginRegistry): React.FC<{ value: any }> => {\n \n // Phase 5: Plugin Renderer resolution\n if (registry) {\n for (const plugin of registry.getPlugins()) {\n if (type === 'currency' && plugin.render && (plugin === currencyPlugin || plugin.detect?.('amount', []) === 'currency')) {\n return plugin.render as React.FC<any>;\n }\n if (type === 'percentage' && plugin.render && (plugin === percentagePlugin || plugin.detect?.('percentage', []) === 'percentage')) {\n return plugin.render as React.FC<any>;\n }\n }\n }\n\n // Backwards compat if passed old pluginRenderers record directly (optional cleanup)\n // Fallthrough to defaults\n\n\n // Currency can use number formatting or custom, let's just use number for now if simple, or default\n switch (type) {\n case 'number':\n case 'currency': // Currency might need specific mapping later if we don't render string currency correctly\n return NumberRenderer;\n case 'email':\n return EmailRenderer;\n case 'url':\n return UrlRenderer;\n case 'image':\n return ImageRenderer;\n case 'percentage':\n return PercentageRenderer;\n case 'date':\n return DateRenderer;\n case 'boolean':\n return BooleanRenderer;\n case 'string':\n default:\n return DefaultRenderer;\n }\n};\n","import React from 'react';\nimport { TableSchema } from '../schema/schemaTypes';\nimport { FilterState, FilterStateValue } from '../hooks/useFilters';\n\nimport { toTitleCase } from '../utils/stringUtils';\n\nexport interface FilterPanelProps {\n schema: TableSchema;\n filters: FilterState;\n onFilterChange: (columnKey: string, value: FilterStateValue) => void;\n onClear: () => void;\n}\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ schema, filters, onFilterChange, onClear }) => {\n const handleStringChange = (key: string, e: React.ChangeEvent<HTMLInputElement>) => {\n onFilterChange(key, e.target.value || null);\n };\n\n const handleNumberChange = (key: string, field: 'min' | 'max', value: string) => {\n const current = (filters[key] as { min?: number; max?: number }) || {};\n const num = parseFloat(value);\n \n const next = { ...current };\n if (isNaN(num)) {\n delete next[field];\n } else {\n next[field] = num;\n }\n\n if (Object.keys(next).length === 0) {\n onFilterChange(key, null);\n } else {\n onFilterChange(key, next);\n }\n };\n\n const handleDateChange = (key: string, field: 'start' | 'end', value: string) => {\n const current = (filters[key] as { start?: string; end?: string }) || {};\n const next = { ...current };\n \n if (!value) {\n delete next[field];\n } else {\n next[field] = value;\n }\n\n if (Object.keys(next).length === 0) {\n onFilterChange(key, null);\n } else {\n onFilterChange(key, next);\n }\n };\n\n const handleBooleanToggle = (key: string) => {\n const current = filters[key];\n if (current === true) {\n onFilterChange(key, false);\n } else if (current === false) {\n onFilterChange(key, null); // Tri-state: true -> false -> null(all)\n } else {\n onFilterChange(key, true);\n }\n };\n\n return (\n <div className=\"rst-filter-panel\">\n {Object.entries(schema).map(([key, colInfo]) => {\n const type = colInfo.type;\n const currentFilter = filters[key];\n\n return (\n <div key={key} className={`rst-filter-group rst-filter-type-${type}`}>\n <label>\n {toTitleCase(key)} Filter\n </label>\n\n {(type === 'string' || type === 'email' || type === 'url') && (\n <input \n type=\"text\" \n placeholder={`Search ${toTitleCase(key)}...`} \n value={(currentFilter as string) || ''}\n onChange={(e) => handleStringChange(key, e)}\n />\n )}\n\n {(type === 'number' || type === 'currency' || type === 'percentage') && (\n <div className=\"rst-filter-range\">\n <input \n type=\"number\" \n placeholder=\"Min\" \n value={(currentFilter as any)?.min ?? ''}\n onChange={(e) => handleNumberChange(key, 'min', e.target.value)}\n />\n <input \n type=\"number\" \n placeholder=\"Max\" \n value={(currentFilter as any)?.max ?? ''}\n onChange={(e) => handleNumberChange(key, 'max', e.target.value)}\n />\n </div>\n )}\n\n {type === 'date' && (\n <div className=\"rst-filter-range\">\n <input \n type=\"date\" \n title=\"Start Date\"\n value={(currentFilter as any)?.start || ''}\n onChange={(e) => handleDateChange(key, 'start', e.target.value)}\n />\n <input \n type=\"date\" \n title=\"End Date\"\n value={(currentFilter as any)?.end || ''}\n onChange={(e) => handleDateChange(key, 'end', e.target.value)}\n />\n </div>\n )}\n\n {type === 'boolean' && (\n <button \n className=\"rst-filter-toggle\"\n onClick={() => handleBooleanToggle(key)}\n style={{ \n backgroundColor: currentFilter === true ? '#e6f4ea' : currentFilter === false ? '#fce8e6' : '#fff',\n }}\n >\n {currentFilter === true ? 'Only Yes' : currentFilter === false ? 'Only No' : 'All'}\n </button>\n )}\n </div>\n );\n })}\n \n {Object.keys(filters).length > 0 && (\n <button \n className=\"rst-filter-clear-btn\"\n onClick={onClear}\n >\n Clear All Filters\n </button>\n )}\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { TableSchema, Dataset } from '../schema/schemaTypes';\nimport { generateInsights } from '../insights/insightBuilder';\nimport { \n BarChart, Bar, \n LineChart, Line, \n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer \n} from 'recharts';\n\nexport interface InsightsPanelProps {\n data: Dataset;\n schema: TableSchema;\n}\n\nconst COLORS = ['#8884d8', '#82ca9d', '#ffc658', '#ff8042', '#a4de6c', '#d0ed57'];\n\nexport const InsightsPanel: React.FC<InsightsPanelProps> = ({ data, schema }) => {\n const insights = useMemo(() => {\n return generateInsights(data, schema);\n }, [data, schema]);\n\n if (!insights || insights.length === 0) {\n return null;\n }\n\n return (\n <div className=\"rst-insights-panel\">\n <h3>AI Generated Insights</h3>\n <div className=\"rst-insights-grid\">\n {insights.map(widget => (\n <div key={widget.id} className=\"rst-insight-card\">\n <h4 className=\"rst-insight-title\">{widget.title}</h4>\n \n <div className=\"rst-insight-chart-wrapper\" style={{ height: '240px' }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {widget.type === 'bar' ? (\n <BarChart data={widget.data} margin={{ top: 5, right: 10, left: 0, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis dataKey={widget.xAxisKey} tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <YAxis tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <Tooltip \n contentStyle={{ borderRadius: '8px', border: 'none', boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)' }} \n cursor={{fill: '#f1f5f9'}}\n />\n <Legend wrapperStyle={{ fontSize: '11px', paddingTop: '10px' }} iconType=\"circle\" />\n {widget.yAxisKeys.map((yKey, index) => (\n <Bar key={yKey} dataKey={yKey} fill={COLORS[index % COLORS.length]} radius={[4, 4, 0, 0]} barSize={32} />\n ))}\n </BarChart>\n ) : widget.type === 'line' ? (\n <LineChart data={widget.data} margin={{ top: 5, right: 10, left: 0, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" vertical={false} stroke=\"#e2e8f0\" />\n <XAxis dataKey={widget.xAxisKey} tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <YAxis tick={{fontSize: 11, fill: '#64748b'}} axisLine={{stroke: '#e2e8f0'}} tickLine={false} />\n <Tooltip contentStyle={{ borderRadius: '8px', border: 'none', boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)' }} />\n <Legend wrapperStyle={{ fontSize: '11px', paddingTop: '10px' }} iconType=\"circle\" />\n {widget.yAxisKeys.map((yKey, index) => (\n <Line key={yKey} type=\"monotone\" dataKey={yKey} stroke={COLORS[index % COLORS.length]} strokeWidth={2.5} dot={{ r: 4, strokeWidth: 2, fill: '#fff' }} activeDot={{ r: 6, strokeWidth: 0 }} />\n ))}\n </LineChart>\n ) : (\n <PieChart>\n <Tooltip contentStyle={{ borderRadius: '8px', border: 'none', boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)' }} />\n <Legend wrapperStyle={{ fontSize: '11px' }} iconType=\"circle\" />\n <Pie\n data={widget.data}\n cx=\"50%\"\n cy=\"45%\"\n innerRadius={60}\n outerRadius={80}\n fill=\"#8884d8\"\n paddingAngle={5}\n dataKey={widget.yAxisKeys[0]}\n nameKey={widget.xAxisKey}\n label={false}\n >\n {widget.data.map((_entry: any, index: number) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Pie>\n </PieChart>\n )}\n </ResponsiveContainer>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import { SmartTablePlugin, ColumnType } from '../schema/schemaTypes';\n\nclass PluginRegistry {\n private plugins: SmartTablePlugin[] = [];\n\n register(pluginOrPlugins: SmartTablePlugin | SmartTablePlugin[]) {\n if (Array.isArray(pluginOrPlugins)) {\n this.plugins.push(...pluginOrPlugins);\n } else {\n this.plugins.push(pluginOrPlugins);\n }\n }\n\n clear() {\n this.plugins = [];\n }\n\n runDetectors(columnKey: string, sample: any[]): ColumnType | null {\n for (const plugin of this.plugins) {\n if (plugin.detect) {\n const detectedType = plugin.detect(columnKey, sample);\n if (detectedType) {\n return detectedType;\n }\n }\n }\n return null;\n }\n\n getRenderers(): Record<string, React.FC<{ value: any }>> {\n const renderers: Record<string, React.FC<{ value: any }>> = {};\n // Future: Iterate through plugins and map their custom types to their renderers\n return renderers;\n }\n \n getPlugins() {\n return this.plugins;\n }\n}\n\n// Export a singleton instance for global scope if needed, though instance scoped to SmartTable is better\nexport const globalPluginRegistry = new PluginRegistry();\n\n// Export the class so SmartTable can instantiate its own safely\nexport { PluginRegistry };\n"],"mappings":"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","names":["stats","useState","useMemo","useState","useMemo","React","useMemo","useMemo","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","useMemo","jsx","jsxs","useMemo","jsx","jsxs","useMemo","jsx","jsxs","useMemo","React"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-auto-smart-table",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "A zero-configuration intelligent data table for React",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
],
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
|
23
|
-
"url": "git
|
|
23
|
+
"url": "git@github.com:Sunildass/react-auto-smart-table.git"
|
|
24
24
|
},
|
|
25
|
-
"homepage": "https://github.com/
|
|
25
|
+
"homepage": "https://github.com/Sunildass/react-auto-smart-table#readme",
|
|
26
26
|
"bugs": {
|
|
27
|
-
"url": "https://github.com/
|
|
27
|
+
"url": "https://github.com/Sunildass/react-auto-smart-table/issues"
|
|
28
28
|
},
|
|
29
29
|
"keywords": [
|
|
30
30
|
"react",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"react-dom": ">=16.8.0"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"react-virtual": "^
|
|
47
|
+
"@tanstack/react-virtual": "^3.13.12",
|
|
48
48
|
"recharts": "^2.12.7"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|