@sqlrooms/cells 0.29.0-rc.1
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.md +9 -0
- package/README.md +32 -0
- package/dist/cellsSlice.d.ts +3 -0
- package/dist/cellsSlice.d.ts.map +1 -0
- package/dist/cellsSlice.js +602 -0
- package/dist/cellsSlice.js.map +1 -0
- package/dist/components/DeleteSheetModal.d.ts +9 -0
- package/dist/components/DeleteSheetModal.d.ts.map +1 -0
- package/dist/components/DeleteSheetModal.js +6 -0
- package/dist/components/DeleteSheetModal.js.map +1 -0
- package/dist/components/Input/ConfigPanel/DropdownConfig.d.ts +2 -0
- package/dist/components/Input/ConfigPanel/DropdownConfig.d.ts.map +1 -0
- package/dist/components/Input/ConfigPanel/DropdownConfig.js +44 -0
- package/dist/components/Input/ConfigPanel/DropdownConfig.js.map +1 -0
- package/dist/components/Input/ConfigPanel/InputConfigPanel.d.ts +11 -0
- package/dist/components/Input/ConfigPanel/InputConfigPanel.d.ts.map +1 -0
- package/dist/components/Input/ConfigPanel/InputConfigPanel.js +65 -0
- package/dist/components/Input/ConfigPanel/InputConfigPanel.js.map +1 -0
- package/dist/components/Input/ConfigPanel/SliderConfig.d.ts +2 -0
- package/dist/components/Input/ConfigPanel/SliderConfig.d.ts.map +1 -0
- package/dist/components/Input/ConfigPanel/SliderConfig.js +19 -0
- package/dist/components/Input/ConfigPanel/SliderConfig.js.map +1 -0
- package/dist/components/Input/ConfigPanel/TextConfig.d.ts +2 -0
- package/dist/components/Input/ConfigPanel/TextConfig.d.ts.map +1 -0
- package/dist/components/Input/ConfigPanel/TextConfig.js +8 -0
- package/dist/components/Input/ConfigPanel/TextConfig.js.map +1 -0
- package/dist/components/Input/helpers.d.ts +3 -0
- package/dist/components/Input/helpers.d.ts.map +1 -0
- package/dist/components/Input/helpers.js +28 -0
- package/dist/components/Input/helpers.js.map +1 -0
- package/dist/components/InputCellContent.d.ts +9 -0
- package/dist/components/InputCellContent.d.ts.map +1 -0
- package/dist/components/InputCellContent.js +38 -0
- package/dist/components/InputCellContent.js.map +1 -0
- package/dist/components/SheetsTabBar.d.ts +6 -0
- package/dist/components/SheetsTabBar.d.ts.map +1 -0
- package/dist/components/SheetsTabBar.js +57 -0
- package/dist/components/SheetsTabBar.js.map +1 -0
- package/dist/components/SqlCellContent.d.ts +9 -0
- package/dist/components/SqlCellContent.d.ts.map +1 -0
- package/dist/components/SqlCellContent.js +222 -0
- package/dist/components/SqlCellContent.js.map +1 -0
- package/dist/components/SqlCellRunButton.d.ts +17 -0
- package/dist/components/SqlCellRunButton.d.ts.map +1 -0
- package/dist/components/SqlCellRunButton.js +11 -0
- package/dist/components/SqlCellRunButton.js.map +1 -0
- package/dist/components/TextCellContent.d.ts +9 -0
- package/dist/components/TextCellContent.d.ts.map +1 -0
- package/dist/components/TextCellContent.js +27 -0
- package/dist/components/TextCellContent.js.map +1 -0
- package/dist/components/VegaCellContent.d.ts +9 -0
- package/dist/components/VegaCellContent.d.ts.map +1 -0
- package/dist/components/VegaCellContent.js +66 -0
- package/dist/components/VegaCellContent.js.map +1 -0
- package/dist/components/VegaConfigPanel.d.ts +8 -0
- package/dist/components/VegaConfigPanel.d.ts.map +1 -0
- package/dist/components/VegaConfigPanel.js +72 -0
- package/dist/components/VegaConfigPanel.js.map +1 -0
- package/dist/dagUtils.d.ts +20 -0
- package/dist/dagUtils.d.ts.map +1 -0
- package/dist/dagUtils.js +233 -0
- package/dist/dagUtils.js.map +1 -0
- package/dist/defaultCellRegistry.d.ts +3 -0
- package/dist/defaultCellRegistry.d.ts.map +1 -0
- package/dist/defaultCellRegistry.js +177 -0
- package/dist/defaultCellRegistry.js.map +1 -0
- package/dist/execution.d.ts +9 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +195 -0
- package/dist/execution.js.map +1 -0
- package/dist/helpers.d.ts +45 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +124 -0
- package/dist/helpers.js.map +1 -0
- package/dist/hooks.d.ts +11 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +9 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/resultRelationPolicy.d.ts +74 -0
- package/dist/resultRelationPolicy.d.ts.map +1 -0
- package/dist/resultRelationPolicy.js +74 -0
- package/dist/resultRelationPolicy.js.map +1 -0
- package/dist/sqlHelpers.d.ts +41 -0
- package/dist/sqlHelpers.d.ts.map +1 -0
- package/dist/sqlHelpers.js +190 -0
- package/dist/sqlHelpers.js.map +1 -0
- package/dist/types.d.ts +501 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +144 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +35 -0
- package/dist/utils.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cellsSlice.js","sourceRoot":"","sources":["../src/cellsSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {makePagedQuery} from '@sqlrooms/data-table';\nimport {sanitizeQuery} from '@sqlrooms/duckdb';\nimport {createSlice} from '@sqlrooms/room-store';\nimport {generateUniqueName} from '@sqlrooms/utils';\nimport {produce} from 'immer';\nimport {\n buildGraphCacheFromEdges,\n buildDependencyGraph,\n buildDependencyGraphAsync,\n collectReachable,\n ensureGraphCache,\n removeCellFromCache,\n replaceCellDependenciesInCache,\n topologicalOrder,\n} from './dagUtils';\nimport {\n findSheetIdForCell,\n getRequiredSqlSelectToJson,\n normalizeCellsConfigStructure,\n resolveDependencies,\n} from './helpers';\nimport {dropResultRelation} from './resultRelationPolicy';\nimport type {\n Cell,\n CellResultData,\n CellsRootState,\n CellsSliceConfig,\n CellsSliceOptions,\n CellsSliceState,\n Edge,\n SheetType,\n} from './types';\nimport {isInputCell, isSqlCell} from './types';\nimport {getSheetSchemaName, isDefined} from './utils';\n\nfunction createDefaultCellsConfig(\n config: Partial<CellsSliceConfig> | undefined,\n): CellsSliceConfig {\n const sheetId = createId();\n const defaultConfig: CellsSliceConfig = {\n data: {},\n sheets: {\n [sheetId]: {\n id: sheetId,\n type: 'notebook',\n title: 'Sheet',\n schemaName: getSheetSchemaName(sheetId),\n cellIds: [],\n edges: [],\n graphCache: {\n dependencies: {},\n dependents: {},\n contentHashByCell: {},\n },\n },\n },\n sheetOrder: [sheetId],\n currentSheetId: sheetId,\n };\n\n if (!config) {\n return defaultConfig;\n }\n const {sheets, sheetOrder, currentSheetId} = normalizeCellsConfigStructure(\n config,\n defaultConfig,\n );\n\n return {\n ...defaultConfig,\n ...config,\n sheets,\n sheetOrder,\n currentSheetId,\n };\n}\n\n// --- Slice Implementation ---\n\nexport function createCellsSlice(props: CellsSliceOptions) {\n const {cellRegistry, supportedSheetTypes = ['notebook', 'canvas']} = props;\n const initialConfig = createDefaultCellsConfig(props?.config);\n // Keep result data outside Immer drafts, but scoped per slice instance.\n const cellResultCache = new Map<string, CellResultData>();\n return createSlice<CellsSliceState, CellsRootState>((set, get, store) => {\n const dropSqlResultRelation = async (resultName?: string) => {\n try {\n const connector = await get().db.getConnector();\n await dropResultRelation({connector, relationName: resultName});\n } catch {\n // Best-effort cleanup: relation might already be gone or connector\n // might be unavailable during teardown.\n }\n };\n\n return {\n cells: {\n cellRegistry,\n supportedSheetTypes,\n config: initialConfig,\n status: {},\n activeAbortControllers: {},\n resultVersion: {},\n pageVersion: {},\n\n addCell: async (sheetId: string, cell: Cell, index?: number) => {\n // Pre-compute dependencies outside produce() to support async\n const sqlSelectToJson = getRequiredSqlSelectToJson(get());\n const targetSheet = get().cells.config.sheets[sheetId];\n const scopedCells = Object.fromEntries(\n (targetSheet?.cellIds ?? [])\n .map((id) => get().cells.config.data[id])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n scopedCells[cell.id] = cell;\n const deps = await resolveDependencies(\n cell,\n scopedCells,\n sheetId,\n cellRegistry,\n sqlSelectToJson,\n );\n\n set((state) =>\n produce(state, (draft) => {\n draft.cells.config.data[cell.id] = cell;\n if (cell.type === 'sql') {\n draft.cells.status[cell.id] = {\n type: 'sql',\n status: 'idle',\n referencedTables: [],\n };\n } else {\n draft.cells.status[cell.id] = {type: 'other'};\n }\n\n // Single-owner invariant: a cell can belong to one sheet only.\n for (const [existingSheetId, existingSheet] of Object.entries(\n draft.cells.config.sheets,\n )) {\n if (existingSheetId === sheetId) continue;\n existingSheet.cellIds = existingSheet.cellIds.filter(\n (cid) => cid !== cell.id,\n );\n existingSheet.edges = existingSheet.edges.filter(\n (e) => e.source !== cell.id && e.target !== cell.id,\n );\n removeCellFromCache(existingSheet, cell.id);\n }\n\n let sheet = draft.cells.config.sheets[sheetId];\n if (!sheet) {\n sheet = {\n id: sheetId,\n type: 'notebook',\n title: 'Sheet',\n schemaName: getSheetSchemaName(sheetId),\n cellIds: [],\n edges: [],\n graphCache: {\n dependencies: {},\n dependents: {},\n contentHashByCell: {},\n },\n };\n draft.cells.config.sheets[sheetId] = sheet;\n if (!draft.cells.config.sheetOrder.includes(sheetId)) {\n draft.cells.config.sheetOrder.push(sheetId);\n }\n if (!draft.cells.config.currentSheetId) {\n draft.cells.config.currentSheetId = sheetId;\n }\n }\n\n const newIndex =\n index !== undefined ? index : sheet.cellIds.length;\n sheet.cellIds = sheet.cellIds.filter((cid) => cid !== cell.id);\n sheet.cellIds.splice(newIndex, 0, cell.id);\n\n // Add edges from pre-computed dependencies\n sheet.edges = sheet.edges.filter(\n (edge) =>\n edge.target !== cell.id &&\n edge.id !== `${edge.source}-${cell.id}`,\n );\n const localCellIds = new Set(sheet.cellIds);\n for (const depId of deps) {\n if (!localCellIds.has(depId) || depId === cell.id) continue;\n sheet.edges.push({\n id: `${depId}-${cell.id}`,\n source: depId,\n target: cell.id,\n });\n }\n replaceCellDependenciesInCache(\n sheet,\n cell.id,\n deps.filter((depId) => localCellIds.has(depId)),\n );\n }),\n );\n },\n\n removeCell: (id: string) => {\n const previousStatus = get().cells.status[id];\n cellResultCache.delete(id);\n set((state) =>\n produce(state, (draft) => {\n delete draft.cells.config.data[id];\n delete draft.cells.status[id];\n delete draft.cells.resultVersion[id];\n delete draft.cells.pageVersion[id];\n const controller = draft.cells.activeAbortControllers[id];\n if (controller) {\n controller.abort();\n delete draft.cells.activeAbortControllers[id];\n }\n\n // Remove from all sheets\n for (const sheet of Object.values(draft.cells.config.sheets)) {\n sheet.cellIds = sheet.cellIds.filter((cid) => cid !== id);\n sheet.edges = sheet.edges.filter(\n (e) => e.source !== id && e.target !== id,\n );\n removeCellFromCache(sheet, id);\n }\n }),\n );\n if (previousStatus?.type === 'sql') {\n void dropSqlResultRelation(previousStatus.resultView);\n }\n },\n\n updateCell: async (\n id: string,\n updater: (cell: Cell) => Cell,\n opts?: {cascade?: boolean},\n ) => {\n const cell = get().cells.config.data[id];\n if (!cell) return;\n const ownerSheetId = findSheetIdForCell(get(), id);\n const scopedCells = Object.fromEntries(\n (\n (ownerSheetId &&\n get().cells.config.sheets[ownerSheetId]?.cellIds) ||\n []\n )\n .map((cellId) => get().cells.config.data[cellId])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n\n const updatedCell = updater(cell);\n scopedCells[id] = updatedCell;\n\n // Check if resultName changed for SQL cells with successful execution\n const resultNameChanged =\n isSqlCell(cell) &&\n isSqlCell(updatedCell) &&\n cell.data.resultName !== updatedCell.data.resultName;\n\n const existingStatus = get().cells.status[id];\n const hasExistingView =\n resultNameChanged &&\n existingStatus?.type === 'sql' &&\n existingStatus.status === 'success' &&\n existingStatus.resultView;\n\n const semanticInputChanged =\n isInputCell(cell) &&\n isInputCell(updatedCell) &&\n (cell.data.input.varName !== updatedCell.data.input.varName ||\n cell.data.input.value !== updatedCell.data.input.value);\n const semanticSqlChanged =\n isSqlCell(cell) &&\n isSqlCell(updatedCell) &&\n cell.data.sql !== updatedCell.data.sql;\n\n // Apply cell data to the store immediately so that other\n // actions (e.g. runCell triggered via Cmd+Enter) always see\n // the latest value. Edge/dependency updates follow\n // asynchronously below.\n set((state) =>\n produce(state, (draft) => {\n draft.cells.config.data[id] = updatedCell;\n }),\n );\n\n // Avoid expensive dependency graph recomputation on each SQL keystroke.\n // We recompute immediately for non-SQL edits, or when callers explicitly\n // request cascading behavior.\n const shouldRecomputeDependencies =\n !semanticSqlChanged || opts?.cascade === true;\n if (shouldRecomputeDependencies) {\n // Pre-compute dependencies outside produce() to support async\n const sqlSelectToJson = getRequiredSqlSelectToJson(get());\n const newDeps = await resolveDependencies(\n updatedCell,\n scopedCells,\n ownerSheetId || '',\n cellRegistry,\n sqlSelectToJson,\n );\n\n set((state) =>\n produce(state, (draft) => {\n const ownerSheet = Object.values(\n draft.cells.config.sheets,\n ).find((sheet) => sheet.cellIds.includes(id));\n if (ownerSheet) {\n const localCellIds = new Set(ownerSheet.cellIds);\n ownerSheet.edges = ownerSheet.edges.filter(\n (e) => e.target !== id,\n );\n for (const depId of newDeps) {\n if (!localCellIds.has(depId) || depId === id) continue;\n ownerSheet.edges.push({\n id: `${depId}-${id}`,\n source: depId,\n target: id,\n });\n }\n replaceCellDependenciesInCache(\n ownerSheet,\n id,\n newDeps.filter((depId) => localCellIds.has(depId)),\n );\n }\n }),\n );\n }\n\n // If we have an existing view, rename it instead of invalidating\n if (hasExistingView && existingStatus?.resultView) {\n const registryItem = cellRegistry[cell.type];\n if (registryItem?.renameResult) {\n void registryItem.renameResult({\n id,\n oldResultView: existingStatus.resultView,\n get,\n set,\n });\n }\n }\n\n // After update, trigger cascade only if explicitly requested\n // or if semantic execution inputs changed.\n const shouldCascade =\n opts?.cascade || resultNameChanged || semanticInputChanged;\n if (shouldCascade) {\n if (ownerSheetId) {\n void get().cells.runDownstreamCascade(ownerSheetId, id);\n }\n }\n },\n\n addSheet: (title?: string, type: SheetType = 'notebook') => {\n const id = createId();\n set((state) =>\n produce(state, (draft) => {\n const typeLabel = type.charAt(0).toUpperCase() + type.slice(1);\n const existingTitles = Object.values(\n draft.cells.config.sheets,\n ).map((s) => s.title);\n const defaultTitle = generateUniqueName(\n `${typeLabel} 1`,\n existingTitles,\n ' ',\n );\n\n draft.cells.config.sheets[id] = {\n id,\n type,\n title: title || defaultTitle,\n schemaName: getSheetSchemaName(id),\n cellIds: [],\n edges: [],\n graphCache: {\n dependencies: {},\n dependents: {},\n contentHashByCell: {},\n },\n };\n draft.cells.config.sheetOrder.push(id);\n draft.cells.config.currentSheetId = id;\n }),\n );\n return id;\n },\n\n removeSheet: (sheetId: string) => {\n const sheet = get().cells.config.sheets[sheetId];\n if (!sheet) return;\n const ownedCellIds = [...sheet.cellIds];\n const relationNamesToDrop = ownedCellIds.flatMap((cellId) => {\n const status = get().cells.status[cellId];\n return status?.type === 'sql' && status.resultView\n ? [status.resultView]\n : [];\n });\n set((state) =>\n produce(state, (draft) => {\n for (const cellId of ownedCellIds) {\n cellResultCache.delete(cellId);\n delete draft.cells.config.data[cellId];\n delete draft.cells.status[cellId];\n delete draft.cells.resultVersion[cellId];\n delete draft.cells.pageVersion[cellId];\n const controller = draft.cells.activeAbortControllers[cellId];\n if (controller) {\n controller.abort();\n }\n delete draft.cells.activeAbortControllers[cellId];\n }\n\n for (const existingSheet of Object.values(\n draft.cells.config.sheets,\n )) {\n existingSheet.cellIds = existingSheet.cellIds.filter(\n (cid) => !ownedCellIds.includes(cid),\n );\n existingSheet.edges = existingSheet.edges.filter(\n (e) =>\n !ownedCellIds.includes(e.source) &&\n !ownedCellIds.includes(e.target),\n );\n for (const cellId of ownedCellIds) {\n removeCellFromCache(existingSheet, cellId);\n }\n }\n\n delete draft.cells.config.sheets[sheetId];\n draft.cells.config.sheetOrder =\n draft.cells.config.sheetOrder.filter((id) => id !== sheetId);\n if (draft.cells.config.currentSheetId === sheetId) {\n draft.cells.config.currentSheetId =\n draft.cells.config.sheetOrder[0];\n }\n }),\n );\n for (const relationName of relationNamesToDrop) {\n void dropSqlResultRelation(relationName);\n }\n },\n\n closeSheet: (sheetId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.cells.config.sheetOrder =\n draft.cells.config.sheetOrder.filter((id) => id !== sheetId);\n if (draft.cells.config.currentSheetId === sheetId) {\n draft.cells.config.currentSheetId =\n draft.cells.config.sheetOrder[0];\n }\n }),\n );\n },\n\n openSheet: (sheetId: string) => {\n set((state) =>\n produce(state, (draft) => {\n if (!draft.cells.config.sheetOrder.includes(sheetId)) {\n draft.cells.config.sheetOrder.push(sheetId);\n }\n draft.cells.config.currentSheetId = sheetId;\n }),\n );\n },\n\n setSheetOrder: (sheetOrder: string[]) => {\n set((state) =>\n produce(state, (draft) => {\n draft.cells.config.sheetOrder = sheetOrder;\n }),\n );\n },\n\n renameSheet: (sheetId: string, title: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sheet = draft.cells.config.sheets[sheetId];\n if (sheet) {\n // We could add validation here, but usually UI handles it.\n // For now, we'll just allow it as the primary logic is in view slices.\n sheet.title = title;\n }\n }),\n );\n },\n\n setCurrentSheet: (sheetId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.cells.config.currentSheetId = sheetId;\n }),\n );\n },\n\n addEdge: (sheetId: string, edge: Omit<Edge, 'id'>) => {\n set((state) =>\n produce(state, (draft) => {\n let sheet = draft.cells.config.sheets[sheetId];\n if (!sheet) {\n sheet = {\n id: sheetId,\n type: 'notebook',\n title: 'Sheet',\n schemaName: getSheetSchemaName(sheetId),\n cellIds: [],\n edges: [],\n graphCache: {\n dependencies: {},\n dependents: {},\n contentHashByCell: {},\n },\n };\n draft.cells.config.sheets[sheetId] = sheet;\n if (!draft.cells.config.sheetOrder.includes(sheetId)) {\n draft.cells.config.sheetOrder.push(sheetId);\n }\n if (!draft.cells.config.currentSheetId) {\n draft.cells.config.currentSheetId = sheetId;\n }\n }\n if (\n !sheet.cellIds.includes(edge.source) ||\n !sheet.cellIds.includes(edge.target)\n ) {\n return;\n }\n const id = `${edge.source}-${edge.target}`;\n if (!sheet.edges.find((e) => e.id === id)) {\n sheet.edges.push({...edge, id});\n ensureGraphCache(sheet);\n const deps = sheet.graphCache?.dependencies[edge.target] || [];\n replaceCellDependenciesInCache(sheet, edge.target, [\n ...deps,\n edge.source,\n ]);\n }\n }),\n );\n },\n\n removeEdge: (sheetId: string, edgeId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sheet = draft.cells.config.sheets[sheetId];\n if (sheet) {\n sheet.edges = sheet.edges.filter((e) => e.id !== edgeId);\n delete sheet.graphCache;\n }\n }),\n );\n },\n\n updateEdgesFromSql: async (sheetId: string, cellId: string) => {\n const cell = get().cells.config.data[cellId];\n const sheet = get().cells.config.sheets[sheetId];\n if (!cell || !sheet) return;\n\n // Pre-compute dependencies outside produce() to support async\n const sqlSelectToJson = getRequiredSqlSelectToJson(get());\n const scopedCells = Object.fromEntries(\n sheet.cellIds\n .map((id) => get().cells.config.data[id])\n .filter(isDefined)\n .map((candidate) => [candidate.id, candidate]),\n ) as Record<string, Cell>;\n const deps = await resolveDependencies(\n cell,\n scopedCells,\n sheetId,\n cellRegistry,\n sqlSelectToJson,\n );\n\n set((state) =>\n produce(state, (draft) => {\n const draftSheet = draft.cells.config.sheets[sheetId];\n if (draftSheet) {\n draftSheet.edges = draftSheet.edges.filter(\n (e) => e.target !== cellId,\n );\n const localCellIds = new Set(draftSheet.cellIds);\n for (const depId of deps) {\n if (!localCellIds.has(depId) || depId === cellId) continue;\n draftSheet.edges.push({\n id: `${depId}-${cellId}`,\n source: depId,\n target: cellId,\n });\n }\n replaceCellDependenciesInCache(\n draftSheet,\n cellId,\n deps.filter((depId) => localCellIds.has(depId)),\n );\n }\n }),\n );\n },\n\n runCell: async (\n id: string,\n opts?: {cascade?: boolean; schemaName?: string},\n ) => {\n const state = get();\n const cell = state.cells.config.data[id];\n if (!cell) return;\n\n const registryItem = cellRegistry[cell.type];\n if (!registryItem) return;\n\n if (registryItem.runCell) {\n // Pass get/set to registry's runCell\n await registryItem.runCell({id, opts, get, set});\n return;\n }\n\n // No default behavior - each cell type must define runCell if needed\n },\n cancelCell: (id: string) => {\n const state = get();\n const controller = state.cells.activeAbortControllers[id];\n if (controller) {\n controller.abort();\n }\n },\n invalidateCellStatus: (id: string) => {\n set((state) =>\n produce(state, (draft) => {\n const status = draft.cells.status[id];\n if (status?.type === 'sql') {\n // Reset to idle, clearing the result so user knows to re-run\n draft.cells.status[id] = {\n type: 'sql',\n status: 'idle',\n referencedTables: status.referencedTables || [],\n };\n }\n }),\n );\n },\n\n // Cell result cache actions\n setCellResult: (id: string, data: CellResultData) => {\n cellResultCache.set(id, data);\n set((state) =>\n produce(state, (draft) => {\n draft.cells.resultVersion[id] =\n (draft.cells.resultVersion[id] ?? 0) + 1;\n }),\n );\n },\n\n setCellResultPage: (id: string, data: CellResultData) => {\n cellResultCache.set(id, data);\n set((state) =>\n produce(state, (draft) => {\n draft.cells.pageVersion[id] =\n (draft.cells.pageVersion[id] ?? 0) + 1;\n }),\n );\n },\n\n getCellResult: (id: string) => {\n return cellResultCache.get(id);\n },\n\n clearCellResult: (id: string) => {\n cellResultCache.delete(id);\n set((state) =>\n produce(state, (draft) => {\n delete draft.cells.resultVersion[id];\n delete draft.cells.pageVersion[id];\n }),\n );\n },\n\n fetchCellResultPage: async (\n id: string,\n pagination: {pageIndex: number; pageSize: number},\n sorting?: {id: string; desc: boolean}[],\n ) => {\n const state = get();\n const status = state.cells.status[id];\n if (status?.type !== 'sql' || !status.resultView) return;\n\n const connector = await state.db.getConnector();\n const baseQuery = sanitizeQuery(`SELECT * FROM ${status.resultView}`);\n const pagedQuery = makePagedQuery(\n baseQuery,\n sorting ?? [],\n pagination,\n );\n\n const arrowTable = await connector.query(pagedQuery);\n const countResult = await connector.query(\n `SELECT COUNT(*)::int AS count FROM ${status.resultView}`,\n );\n const totalRows = countResult.toArray()[0]?.count ?? 0;\n\n get().cells.setCellResultPage(id, {arrowTable, totalRows});\n },\n\n // DAG methods (sync versions for UI usage)\n getRootCells: (sheetId: string) => {\n const {dependencies} = buildDependencyGraph(sheetId, get());\n const ids = Object.keys(dependencies);\n return ids.filter((id) => (dependencies[id]?.length ?? 0) === 0);\n },\n getDownstream: (sheetId: string, sourceCellId: string) => {\n const {dependencies, dependents} = buildDependencyGraph(\n sheetId,\n get(),\n );\n const reachable = collectReachable(sourceCellId, dependents);\n if (!reachable.size) return [];\n reachable.delete(sourceCellId);\n const rootsWithinScope = Array.from(reachable).filter((id) => {\n const deps = dependencies[id] || [];\n return deps.filter((d) => reachable.has(d)).length === 0;\n });\n return topologicalOrder(\n rootsWithinScope,\n dependencies,\n dependents,\n reachable,\n );\n },\n // Async cascade execution using AST-based dependency resolution\n runAllCellsCascade: async (sheetId: string) => {\n const cached = buildDependencyGraph(sheetId, get());\n const hasCachedNodes = Object.keys(cached.dependencies).length > 0;\n if (!hasCachedNodes) {\n set((state) =>\n produce(state, (draft) => {\n const sheet = draft.cells.config.sheets[sheetId];\n if (sheet) {\n sheet.graphCache = buildGraphCacheFromEdges(sheet);\n }\n }),\n );\n }\n const sqlSelectToJson = getRequiredSqlSelectToJson(get());\n const {dependencies, dependents} = await buildDependencyGraphAsync(\n sheetId,\n get(),\n sqlSelectToJson,\n );\n const roots = Object.keys(dependencies).filter(\n (id) => (dependencies[id]?.length ?? 0) === 0,\n );\n const order = topologicalOrder(roots, dependencies, dependents);\n for (const cellId of order) {\n try {\n await get().cells.runCell(cellId, {cascade: false});\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n set((state) =>\n produce(state, (draft) => {\n const status = draft.cells.status[cellId];\n if (status?.type === 'sql') {\n status.status = 'error';\n status.lastError = message;\n }\n }),\n );\n }\n }\n },\n runDownstreamCascade: async (sheetId: string, sourceCellId: string) => {\n const cached = buildDependencyGraph(sheetId, get());\n const hasCachedNodes = Object.keys(cached.dependencies).length > 0;\n if (!hasCachedNodes) {\n set((state) =>\n produce(state, (draft) => {\n const sheet = draft.cells.config.sheets[sheetId];\n if (sheet) {\n sheet.graphCache = buildGraphCacheFromEdges(sheet);\n }\n }),\n );\n }\n const sqlSelectToJson = getRequiredSqlSelectToJson(get());\n const {dependencies, dependents} = await buildDependencyGraphAsync(\n sheetId,\n get(),\n sqlSelectToJson,\n );\n const reachable = collectReachable(sourceCellId, dependents);\n if (!reachable.size) return;\n reachable.delete(sourceCellId);\n const rootsWithinScope = Array.from(reachable).filter((id) => {\n const deps = dependencies[id] || [];\n return deps.filter((d) => reachable.has(d)).length === 0;\n });\n const order = topologicalOrder(\n rootsWithinScope,\n dependencies,\n dependents,\n reachable,\n );\n for (const cellId of order) {\n try {\n await get().cells.runCell(cellId, {cascade: false});\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n set((state) =>\n produce(state, (draft) => {\n const status = draft.cells.status[cellId];\n if (status?.type === 'sql') {\n status.status = 'error';\n status.lastError = message;\n }\n }),\n );\n }\n }\n },\n },\n } as CellsSliceState;\n });\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type DeleteSheetModalProps = {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onConfirm: () => void;
|
|
6
|
+
sheetTitle?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const DeleteSheetModal: React.FC<DeleteSheetModalProps>;
|
|
9
|
+
//# sourceMappingURL=DeleteSheetModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteSheetModal.d.ts","sourceRoot":"","sources":["../../src/components/DeleteSheetModal.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA2B5D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Button, } from '@sqlrooms/ui';
|
|
3
|
+
export const DeleteSheetModal = ({ isOpen, onClose, onConfirm, sheetTitle, }) => {
|
|
4
|
+
return (_jsx(Dialog, { open: isOpen, onOpenChange: (open) => !open && onClose(), children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsxs(DialogTitle, { children: ["Delete ", sheetTitle || 'Sheet'] }), _jsx(DialogDescription, { children: "Are you sure you want to delete this sheet? This action cannot be undone." })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Cancel" }), _jsx(Button, { variant: "destructive", onClick: onConfirm, children: "Delete" })] })] }) }));
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=DeleteSheetModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteSheetModal.js","sourceRoot":"","sources":["../../src/components/DeleteSheetModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,MAAM,GACP,MAAM,cAAc,CAAC;AAUtB,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAChE,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,GACX,EAAE,EAAE;IACH,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,YAC9D,MAAC,aAAa,eACZ,MAAC,YAAY,eACX,MAAC,WAAW,0BAAS,UAAU,IAAI,OAAO,IAAe,EACzD,KAAC,iBAAiB,4FAGE,IACP,EACf,MAAC,YAAY,eACX,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,OAAO,uBAEjC,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,aAAa,EAAC,OAAO,EAAE,SAAS,uBAEvC,IACI,IACD,GACT,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Button,\n} from '@sqlrooms/ui';\nimport React from 'react';\n\nexport type DeleteSheetModalProps = {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n sheetTitle?: string;\n};\n\nexport const DeleteSheetModal: React.FC<DeleteSheetModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n sheetTitle,\n}) => {\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete {sheetTitle || 'Sheet'}</DialogTitle>\n <DialogDescription>\n Are you sure you want to delete this sheet? This action cannot be\n undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={onConfirm}>\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownConfig.d.ts","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/DropdownConfig.tsx"],"names":[],"mappings":"AAcA,eAAO,MAAM,cAAc,+CA0H1B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Button, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@sqlrooms/ui';
|
|
4
|
+
import { OctagonAlertIcon, XIcon } from 'lucide-react';
|
|
5
|
+
import { useFormContext, useFieldArray } from 'react-hook-form';
|
|
6
|
+
export const DropdownConfig = () => {
|
|
7
|
+
const { control, setValue, watch, setError, clearErrors, formState: { errors }, } = useFormContext();
|
|
8
|
+
const options = watch('options') || [];
|
|
9
|
+
const dropdownValue = watch('value') || '';
|
|
10
|
+
const [option, setOption] = useState('');
|
|
11
|
+
const { remove, append } = useFieldArray({ control, name: 'options' });
|
|
12
|
+
const handleAddOption = () => {
|
|
13
|
+
const trimmedOption = option.trim();
|
|
14
|
+
if (!trimmedOption)
|
|
15
|
+
return;
|
|
16
|
+
if (options.includes(trimmedOption)) {
|
|
17
|
+
setError('options', {
|
|
18
|
+
type: 'manual',
|
|
19
|
+
message: 'This value already exists',
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
append(trimmedOption);
|
|
24
|
+
setOption('');
|
|
25
|
+
if (errors.options) {
|
|
26
|
+
clearErrors('options');
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const handleRemoveOption = (index) => {
|
|
30
|
+
remove(index);
|
|
31
|
+
};
|
|
32
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs(Label, { children: ["Values ", _jsx("span", { className: "text-gray-500", children: "(strings)" })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "flex max-h-32 flex-wrap gap-1 overflow-auto text-xs", children: options.map((value, index) => (_jsxs("span", { className: "bg-secondary flex items-center gap-1 rounded-md px-2 py-1", children: [value, _jsx(Button, { type: "button", variant: "ghost", size: "xs", className: "h-4 w-4 p-0", onClick: () => handleRemoveOption(index), children: _jsx(XIcon, { size: 12, strokeWidth: 1.5 }) })] }, index))) }), _jsxs("div", { className: "flex gap-1", children: [_jsx(Input, { className: "h-8 text-sm", value: option, onChange: (e) => {
|
|
33
|
+
setOption(e.target.value);
|
|
34
|
+
if (errors.options) {
|
|
35
|
+
clearErrors('options');
|
|
36
|
+
}
|
|
37
|
+
}, onKeyDown: (e) => {
|
|
38
|
+
if (e.key === 'Enter') {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
handleAddOption();
|
|
41
|
+
}
|
|
42
|
+
} }), _jsx(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddOption, children: "Add" })] }), errors.options && (_jsxs("div", { className: "flex items-center gap-1 text-xs text-red-500", children: [_jsx(OctagonAlertIcon, { size: 16, strokeWidth: 1.5 }), errors.options.message] }))] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Value" }), _jsxs(Select, { value: dropdownValue, onValueChange: (v) => setValue('value', v), children: [_jsx(SelectTrigger, { className: "h-8 shadow-none", children: _jsx(SelectValue, { placeholder: "Select a default value" }) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: options.map((option) => (_jsx(SelectItem, { className: "text-xs", value: option, children: option }, option))) })] })] })] }));
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=DropdownConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownConfig.js","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/DropdownConfig.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useState} from 'react';\nimport {\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@sqlrooms/ui';\nimport {OctagonAlertIcon, XIcon} from 'lucide-react';\nimport {useFormContext, useFieldArray} from 'react-hook-form';\n\nexport const DropdownConfig = () => {\n const {\n control,\n setValue,\n watch,\n setError,\n clearErrors,\n formState: {errors},\n } = useFormContext();\n const options = (watch('options') as string[]) || [];\n const dropdownValue = (watch('value') as string) || '';\n\n const [option, setOption] = useState('');\n\n const {remove, append} = useFieldArray({control, name: 'options'});\n\n const handleAddOption = () => {\n const trimmedOption = option.trim();\n if (!trimmedOption) return;\n\n if (options.includes(trimmedOption)) {\n setError('options', {\n type: 'manual',\n message: 'This value already exists',\n });\n return;\n }\n\n append(trimmedOption);\n setOption('');\n if (errors.options) {\n clearErrors('options');\n }\n };\n\n const handleRemoveOption = (index: number) => {\n remove(index);\n };\n\n return (\n <>\n <div className=\"flex flex-col gap-2\">\n <Label>\n Values <span className=\"text-gray-500\">(strings)</span>\n </Label>\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex max-h-32 flex-wrap gap-1 overflow-auto text-xs\">\n {options.map((value: string, index: number) => (\n <span\n className=\"bg-secondary flex items-center gap-1 rounded-md px-2 py-1\"\n key={index}\n >\n {value}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n className=\"h-4 w-4 p-0\"\n onClick={() => handleRemoveOption(index)}\n >\n <XIcon size={12} strokeWidth={1.5} />\n </Button>\n </span>\n ))}\n </div>\n\n <div className=\"flex gap-1\">\n <Input\n className=\"h-8 text-sm\"\n value={option}\n onChange={(e) => {\n setOption(e.target.value);\n if (errors.options) {\n clearErrors('options');\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddOption();\n }\n }}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n onClick={handleAddOption}\n >\n Add\n </Button>\n </div>\n\n {errors.options && (\n <div className=\"flex items-center gap-1 text-xs text-red-500\">\n <OctagonAlertIcon size={16} strokeWidth={1.5} />\n {errors.options.message as string}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <Label>Value</Label>\n <Select\n value={dropdownValue}\n onValueChange={(v) => setValue('value', v)}\n >\n <SelectTrigger className=\"h-8 shadow-none\">\n <SelectValue placeholder=\"Select a default value\" />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {options.map((option: string) => (\n <SelectItem className=\"text-xs\" key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </>\n );\n};\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { InputUnion } from '../../../types';
|
|
3
|
+
type Props = {
|
|
4
|
+
className?: string;
|
|
5
|
+
input: InputUnion;
|
|
6
|
+
updateInput: (patch: InputUnion) => void;
|
|
7
|
+
onRemove?: () => void;
|
|
8
|
+
};
|
|
9
|
+
export declare const InputConfigPanel: FC<Props>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=InputConfigPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputConfigPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/InputConfigPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAY,MAAM,OAAO,CAAC;AAsBpC,OAAO,EAAa,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAGtD,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,KAAK,CA2FtC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
4
|
+
import { Button, cn, Input, Label, Popover, PopoverContent, PopoverTrigger, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Spinner, } from '@sqlrooms/ui';
|
|
5
|
+
import { SettingsIcon } from 'lucide-react';
|
|
6
|
+
import { TextConfig } from './TextConfig';
|
|
7
|
+
import { DropdownConfig } from './DropdownConfig';
|
|
8
|
+
import { initializeInput } from '../helpers';
|
|
9
|
+
import { InputTypes } from '../../../types';
|
|
10
|
+
import { SliderConfig } from './SliderConfig';
|
|
11
|
+
export const InputConfigPanel = ({ className, input, updateInput, onRemove, }) => {
|
|
12
|
+
const methods = useForm({
|
|
13
|
+
defaultValues: input,
|
|
14
|
+
mode: 'onChange',
|
|
15
|
+
reValidateMode: 'onChange',
|
|
16
|
+
});
|
|
17
|
+
const { handleSubmit, reset, formState: { isSubmitting, errors }, } = methods;
|
|
18
|
+
// Keep form in sync when `input` prop changes externally
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
reset(input);
|
|
21
|
+
}, [input, reset]);
|
|
22
|
+
const onSubmit = (data) => {
|
|
23
|
+
if (data.kind === 'dropdown' && !data.value && data.options.length > 0) {
|
|
24
|
+
const newValue = data.options[0] ?? '';
|
|
25
|
+
updateInput({ ...data, value: newValue });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
else if (data.kind === 'slider') {
|
|
29
|
+
const clampedValue = Math.min(Math.max(data.value, data.min), data.max);
|
|
30
|
+
updateInput({ ...data, value: clampedValue });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
updateInput(data);
|
|
34
|
+
};
|
|
35
|
+
const onInteractOutside = (e) => {
|
|
36
|
+
if (Object.keys(errors).length > 0) {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
handleSubmit(onSubmit)();
|
|
41
|
+
};
|
|
42
|
+
return (_jsx("div", { className: cn(className), children: _jsx(FormProvider, { ...methods, children: _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: isSubmitting ? (_jsx(Spinner, {})) : (_jsx(SettingsIcon, { size: 18, strokeWidth: 1.5, className: "cursor-pointer" })) }), _jsxs(PopoverContent, { className: "flex flex-col gap-5", onInteractOutside: onInteractOutside, children: [_jsxs("form", { className: "flex flex-col gap-5", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Name" }), _jsx(Input, { className: "h-8 text-sm", ...methods.register('varName') })] }), _jsx(InputTypeDropdown, { methods: methods }), _jsx(InputConfig, { methods: methods })] }), _jsx(Button, { type: "button", variant: "outline", size: "xs", className: "w-full border-red-500 text-red-500 hover:bg-red-500/10 hover:text-red-600", onClick: onRemove, children: "Remove input" })] })] }) }) }));
|
|
43
|
+
};
|
|
44
|
+
const InputConfig = ({ methods }) => {
|
|
45
|
+
const draftInput = methods.watch();
|
|
46
|
+
switch (draftInput.kind) {
|
|
47
|
+
case 'text':
|
|
48
|
+
return _jsx(TextConfig, {});
|
|
49
|
+
case 'slider':
|
|
50
|
+
return _jsx(SliderConfig, {});
|
|
51
|
+
case 'dropdown':
|
|
52
|
+
return _jsx(DropdownConfig, {});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const InputTypeDropdown = ({ methods, }) => {
|
|
56
|
+
const { watch, reset, getValues, trigger } = methods;
|
|
57
|
+
const kind = watch('kind');
|
|
58
|
+
const onTypeChange = (kind) => {
|
|
59
|
+
const newInput = initializeInput(kind, getValues());
|
|
60
|
+
reset(newInput, { keepErrors: false });
|
|
61
|
+
trigger();
|
|
62
|
+
};
|
|
63
|
+
return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Type" }), _jsxs(Select, { value: kind, onValueChange: onTypeChange, children: [_jsx(SelectTrigger, { className: "h-8 shadow-none", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: InputTypes.options.map((option) => (_jsx(SelectItem, { className: "text-xs", value: option, children: option }, option))) })] })] }));
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=InputConfigPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputConfigPanel.js","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/InputConfigPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import {FC, useEffect} from 'react';\nimport {FormProvider, useForm, UseFormReturn} from 'react-hook-form';\nimport {\n Button,\n cn,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Spinner,\n} from '@sqlrooms/ui';\nimport {SettingsIcon} from 'lucide-react';\n\nimport {TextConfig} from './TextConfig';\nimport {DropdownConfig} from './DropdownConfig';\nimport {initializeInput} from '../helpers';\nimport {InputTypes, InputUnion} from '../../../types';\nimport {SliderConfig} from './SliderConfig';\n\ntype Props = {\n className?: string;\n input: InputUnion;\n updateInput: (patch: InputUnion) => void;\n onRemove?: () => void;\n};\n\nexport const InputConfigPanel: FC<Props> = ({\n className,\n input,\n updateInput,\n onRemove,\n}) => {\n const methods = useForm<InputUnion>({\n defaultValues: input,\n mode: 'onChange',\n reValidateMode: 'onChange',\n });\n\n const {\n handleSubmit,\n reset,\n formState: {isSubmitting, errors},\n } = methods;\n\n // Keep form in sync when `input` prop changes externally\n useEffect(() => {\n reset(input);\n }, [input, reset]);\n\n const onSubmit = (data: InputUnion) => {\n if (data.kind === 'dropdown' && !data.value && data.options.length > 0) {\n const newValue = data.options[0] ?? '';\n updateInput({...data, value: newValue});\n return;\n } else if (data.kind === 'slider') {\n const clampedValue = Math.min(Math.max(data.value, data.min), data.max);\n updateInput({...data, value: clampedValue});\n return;\n }\n\n updateInput(data);\n };\n\n const onInteractOutside = (e: {preventDefault: () => void}) => {\n if (Object.keys(errors).length > 0) {\n e.preventDefault();\n return;\n }\n handleSubmit(onSubmit)();\n };\n\n return (\n <div className={cn(className)}>\n <FormProvider {...methods}>\n <Popover>\n <PopoverTrigger asChild>\n {isSubmitting ? (\n <Spinner />\n ) : (\n <SettingsIcon\n size={18}\n strokeWidth={1.5}\n className=\"cursor-pointer\"\n />\n )}\n </PopoverTrigger>\n <PopoverContent\n className=\"flex flex-col gap-5\"\n onInteractOutside={onInteractOutside}\n >\n <form className=\"flex flex-col gap-5\">\n <div className=\"flex flex-col gap-2\">\n <Label>Name</Label>\n <Input\n className=\"h-8 text-sm\"\n {...methods.register('varName')}\n />\n </div>\n\n <InputTypeDropdown methods={methods} />\n\n <InputConfig methods={methods} />\n </form>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n className=\"w-full border-red-500 text-red-500 hover:bg-red-500/10 hover:text-red-600\"\n onClick={onRemove}\n >\n Remove input\n </Button>\n </PopoverContent>\n </Popover>\n </FormProvider>\n </div>\n );\n};\n\nconst InputConfig: FC<{methods: UseFormReturn<InputUnion>}> = ({methods}) => {\n const draftInput = methods.watch();\n switch (draftInput.kind) {\n case 'text':\n return <TextConfig />;\n case 'slider':\n return <SliderConfig />;\n case 'dropdown':\n return <DropdownConfig />;\n }\n};\n\nconst InputTypeDropdown: FC<{methods: UseFormReturn<InputUnion>}> = ({\n methods,\n}) => {\n const {watch, reset, getValues, trigger} = methods;\n const kind = watch('kind');\n\n const onTypeChange = (kind: InputTypes) => {\n const newInput = initializeInput(kind, getValues());\n reset(newInput, {keepErrors: false});\n trigger();\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <Label>Type</Label>\n <Select value={kind} onValueChange={onTypeChange}>\n <SelectTrigger className=\"h-8 shadow-none\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {InputTypes.options.map((option) => (\n <SelectItem className=\"text-xs\" key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SliderConfig.d.ts","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/SliderConfig.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,+CAoExB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Input, Label } from '@sqlrooms/ui';
|
|
3
|
+
import { OctagonAlertIcon } from 'lucide-react';
|
|
4
|
+
import { useFormContext } from 'react-hook-form';
|
|
5
|
+
export const SliderConfig = () => {
|
|
6
|
+
const { register, formState: { errors }, } = useFormContext();
|
|
7
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(Label, { children: "Min" }), _jsx(Label, { children: "Max" }), _jsx(Input, { type: "number", className: "h-8 text-sm", ...register('min', {
|
|
8
|
+
valueAsNumber: true,
|
|
9
|
+
validate: (v, formValues) => v <= formValues.max || 'Min should not exceed Max',
|
|
10
|
+
}) }), _jsx(Input, { type: "number", className: "h-8 text-sm", ...register('max', {
|
|
11
|
+
valueAsNumber: true,
|
|
12
|
+
validate: (v, formValues) => v >= formValues.min ||
|
|
13
|
+
'Max should not be less than Min',
|
|
14
|
+
}) })] }), errors.min && (_jsxs("span", { className: "flex items-center gap-1 text-xs text-red-500", children: [_jsx(OctagonAlertIcon, { size: 16, strokeWidth: 1.5 }), String(errors.min.message)] })), errors.max && (_jsxs("span", { className: "flex items-center gap-1 text-xs text-red-500", children: [_jsx(OctagonAlertIcon, { size: 16, strokeWidth: 1.5 }), String(errors.max.message)] }))] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Step" }), _jsx(Input, { type: "number", className: "h-8 text-sm", min: 0, ...register('step', {
|
|
15
|
+
valueAsNumber: true,
|
|
16
|
+
validate: (v) => v > 0 || 'Step must be greater than 0',
|
|
17
|
+
}) }), errors.step && (_jsxs("span", { className: "flex items-center gap-1 text-xs text-red-500", children: [_jsx(OctagonAlertIcon, { size: 16, strokeWidth: 1.5 }), String(errors.step.message)] }))] })] }));
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=SliderConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SliderConfig.js","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/SliderConfig.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,EACJ,QAAQ,EACR,SAAS,EAAE,EAAC,MAAM,EAAC,GACpB,GAAG,cAAc,EAAE,CAAC;IAErB,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,qBAAqB,aAClC,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,KAAK,sBAAY,EAClB,KAAC,KAAK,sBAAY,EAElB,KAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,aAAa,KACnB,QAAQ,CAAC,KAAK,EAAE;oCAClB,aAAa,EAAE,IAAI;oCACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAC1B,CAAC,IAAK,UAAkB,CAAC,GAAG,IAAI,2BAA2B;iCAC9D,CAAC,GACF,EAEF,KAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,aAAa,KACnB,QAAQ,CAAC,KAAK,EAAE;oCAClB,aAAa,EAAE,IAAI;oCACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAC1B,CAAC,IAAK,UAAkB,CAAC,GAAG;wCAC5B,iCAAiC;iCACpC,CAAC,GACF,IACE,EACL,MAAM,CAAC,GAAG,IAAI,CACb,gBAAM,SAAS,EAAC,8CAA8C,aAC5D,KAAC,gBAAgB,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,EAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IACtB,CACR,EACA,MAAM,CAAC,GAAG,IAAI,CACb,gBAAM,SAAS,EAAC,8CAA8C,aAC5D,KAAC,gBAAgB,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,EAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IACtB,CACR,IACG,EAEN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,uBAAa,EACnB,KAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,aAAa,EACvB,GAAG,EAAE,CAAC,KACF,QAAQ,CAAC,MAAM,EAAE;4BACnB,aAAa,EAAE,IAAI;4BACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,6BAA6B;yBACxD,CAAC,GACF,EACD,MAAM,CAAC,IAAI,IAAI,CACd,gBAAM,SAAS,EAAC,8CAA8C,aAC5D,KAAC,gBAAgB,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,EAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IACvB,CACR,IACG,IACL,CACJ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Input, Label} from '@sqlrooms/ui';\nimport {OctagonAlertIcon} from 'lucide-react';\nimport {useFormContext} from 'react-hook-form';\n\nexport const SliderConfig = () => {\n const {\n register,\n formState: {errors},\n } = useFormContext();\n\n return (\n <>\n <div className=\"flex flex-col gap-2\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Label>Min</Label>\n <Label>Max</Label>\n\n <Input\n type=\"number\"\n className=\"h-8 text-sm\"\n {...register('min', {\n valueAsNumber: true,\n validate: (v, formValues) =>\n v <= (formValues as any).max || 'Min should not exceed Max',\n })}\n />\n\n <Input\n type=\"number\"\n className=\"h-8 text-sm\"\n {...register('max', {\n valueAsNumber: true,\n validate: (v, formValues) =>\n v >= (formValues as any).min ||\n 'Max should not be less than Min',\n })}\n />\n </div>\n {errors.min && (\n <span className=\"flex items-center gap-1 text-xs text-red-500\">\n <OctagonAlertIcon size={16} strokeWidth={1.5} />\n {String(errors.min.message)}\n </span>\n )}\n {errors.max && (\n <span className=\"flex items-center gap-1 text-xs text-red-500\">\n <OctagonAlertIcon size={16} strokeWidth={1.5} />\n {String(errors.max.message)}\n </span>\n )}\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <Label>Step</Label>\n <Input\n type=\"number\"\n className=\"h-8 text-sm\"\n min={0}\n {...register('step', {\n valueAsNumber: true,\n validate: (v) => v > 0 || 'Step must be greater than 0',\n })}\n />\n {errors.step && (\n <span className=\"flex items-center gap-1 text-xs text-red-500\">\n <OctagonAlertIcon size={16} strokeWidth={1.5} />\n {String(errors.step.message)}\n </span>\n )}\n </div>\n </>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextConfig.d.ts","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/TextConfig.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,+CAStB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Input, Label } from '@sqlrooms/ui';
|
|
3
|
+
import { useFormContext } from 'react-hook-form';
|
|
4
|
+
export const TextConfig = () => {
|
|
5
|
+
const { register } = useFormContext();
|
|
6
|
+
return (_jsxs(_Fragment, { children: [_jsx(Label, { children: "Value" }), _jsx(Input, { className: "h-8 text-sm", ...register('value') })] }));
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=TextConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextConfig.js","sourceRoot":"","sources":["../../../../src/components/Input/ConfigPanel/TextConfig.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,EAAC,QAAQ,EAAC,GAAG,cAAc,EAAE,CAAC;IAEpC,OAAO,CACL,8BACE,KAAC,KAAK,wBAAc,EACpB,KAAC,KAAK,IAAC,SAAS,EAAC,aAAa,KAAK,QAAQ,CAAC,OAAO,CAAC,GAAI,IACvD,CACJ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Input, Label} from '@sqlrooms/ui';\nimport {useFormContext} from 'react-hook-form';\n\nexport const TextConfig = () => {\n const {register} = useFormContext();\n\n return (\n <>\n <Label>Value</Label>\n <Input className=\"h-8 text-sm\" {...register('value')} />\n </>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/Input/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,eAAe,GAC1B,MAAM,UAAU,EAChB,UAAU,UAAU,KACnB,UA0BF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const initializeInput = (type, oldInput) => {
|
|
2
|
+
const name = oldInput.varName;
|
|
3
|
+
switch (type) {
|
|
4
|
+
case 'text':
|
|
5
|
+
return {
|
|
6
|
+
kind: 'text',
|
|
7
|
+
varName: name,
|
|
8
|
+
value: '',
|
|
9
|
+
};
|
|
10
|
+
case 'slider':
|
|
11
|
+
return {
|
|
12
|
+
kind: 'slider',
|
|
13
|
+
varName: name,
|
|
14
|
+
min: 0,
|
|
15
|
+
max: 100,
|
|
16
|
+
step: 1,
|
|
17
|
+
value: 0,
|
|
18
|
+
};
|
|
19
|
+
case 'dropdown':
|
|
20
|
+
return {
|
|
21
|
+
kind: 'dropdown',
|
|
22
|
+
varName: name,
|
|
23
|
+
options: [],
|
|
24
|
+
value: '',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/components/Input/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAgB,EAChB,QAAoB,EACR,EAAE;IACd,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC9B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,EAAE;aACV,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,GAAG;gBACR,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;aACT,CAAC;QACJ,KAAK,UAAU;YACb,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,EAAE;aACV,CAAC;IACN,CAAC;AACH,CAAC,CAAC","sourcesContent":["import type {InputTypes, InputUnion} from '../../types';\n\nexport const initializeInput = (\n type: InputTypes,\n oldInput: InputUnion,\n): InputUnion => {\n const name = oldInput.varName;\n switch (type) {\n case 'text':\n return {\n kind: 'text',\n varName: name,\n value: '',\n };\n case 'slider':\n return {\n kind: 'slider',\n varName: name,\n min: 0,\n max: 100,\n step: 1,\n value: 0,\n };\n case 'dropdown':\n return {\n kind: 'dropdown',\n varName: name,\n options: [],\n value: '',\n };\n }\n};\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CellContainerProps, InputCell } from '../types';
|
|
3
|
+
export type InputCellContentProps = {
|
|
4
|
+
id: string;
|
|
5
|
+
cell: InputCell;
|
|
6
|
+
renderContainer: (props: CellContainerProps) => React.ReactElement;
|
|
7
|
+
};
|
|
8
|
+
export declare const InputCellContent: React.FC<InputCellContentProps>;
|
|
9
|
+
//# sourceMappingURL=InputCellContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputCellContent.d.ts","sourceRoot":"","sources":["../../src/components/InputCellContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAYzC,OAAO,KAAK,EAAC,kBAAkB,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AAI9E,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,KAAK,CAAC,YAAY,CAAC;CACpE,CAAC;AAqDF,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAwD5D,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { EditableText, Input, Slider, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@sqlrooms/ui';
|
|
4
|
+
import { useCellsStore } from '../hooks';
|
|
5
|
+
import { InputConfigPanel } from './Input/ConfigPanel/InputConfigPanel';
|
|
6
|
+
import { produce } from 'immer';
|
|
7
|
+
const RenderInput = ({ input, updateInput }) => {
|
|
8
|
+
switch (input.kind) {
|
|
9
|
+
case 'text':
|
|
10
|
+
return (_jsx(Input, { className: "h-8 w-full rounded border px-2 py-1 text-sm", value: input.value, onChange: (e) => updateInput({ value: e.target.value }) }));
|
|
11
|
+
case 'slider':
|
|
12
|
+
return (_jsxs("div", { className: "flex h-8 items-center space-x-1", children: [_jsx(Slider, { min: input.min, max: input.max, step: input.step, value: [input.value], onValueChange: (value) => updateInput({ value: Number(value) }) }), _jsx("span", { className: "min-w-[3ch] text-right text-sm font-medium", children: input.value })] }));
|
|
13
|
+
case 'dropdown':
|
|
14
|
+
return (_jsxs(Select, { value: input.value, onValueChange: (value) => updateInput({ value }), children: [_jsx(SelectTrigger, { className: "h-8 text-xs shadow-none", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: input.options.map((option) => (_jsx(SelectItem, { className: "text-xs", value: option, children: option }, option))) })] }));
|
|
15
|
+
default:
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const InputCellContent = ({ id, cell, renderContainer, }) => {
|
|
20
|
+
const updateCell = useCellsStore((s) => s.cells.updateCell);
|
|
21
|
+
const removeCell = useCellsStore((s) => s.cells.removeCell);
|
|
22
|
+
const input = cell.data.input;
|
|
23
|
+
const updateInput = useCallback((patch) => {
|
|
24
|
+
const isValueChange = 'value' in patch;
|
|
25
|
+
updateCell(id, (c) => produce(c, (draft) => {
|
|
26
|
+
if (draft.type === 'input') {
|
|
27
|
+
draft.data.input = { ...draft.data.input, ...patch };
|
|
28
|
+
}
|
|
29
|
+
}), isValueChange ? { cascade: true } : undefined);
|
|
30
|
+
}, [id, updateCell]);
|
|
31
|
+
const header = (_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(EditableText, { value: input.varName, onChange: (varName) => updateInput({ varName }), className: "h-6 text-xs font-semibold shadow-none outline-none ring-0" }), _jsx("span", { className: "text-[10px] font-bold uppercase text-gray-400", children: "Input" })] }), _jsx(InputConfigPanel, { input: input, updateInput: updateInput, onRemove: () => removeCell(id) })] }));
|
|
32
|
+
const content = (_jsx("div", { className: "p-2", children: _jsx(RenderInput, { input: input, updateInput: updateInput }) }));
|
|
33
|
+
return renderContainer({
|
|
34
|
+
header,
|
|
35
|
+
content,
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=InputCellContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputCellContent.js","sourceRoot":"","sources":["../../src/components/InputCellContent.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useCallback} from 'react';\nimport {\n EditableText,\n Input,\n Slider,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@sqlrooms/ui';\nimport {useCellsStore, type CellsStoreState} from '../hooks';\nimport type {CellContainerProps, InputCell, InputUnion, Cell} from '../types';\nimport {InputConfigPanel} from './Input/ConfigPanel/InputConfigPanel';\nimport {produce} from 'immer';\n\nexport type InputCellContentProps = {\n id: string;\n cell: InputCell;\n renderContainer: (props: CellContainerProps) => React.ReactElement;\n};\n\nconst RenderInput: React.FC<{\n input: InputUnion;\n updateInput: (patch: Partial<InputUnion>) => void;\n}> = ({input, updateInput}) => {\n switch (input.kind) {\n case 'text':\n return (\n <Input\n className=\"h-8 w-full rounded border px-2 py-1 text-sm\"\n value={input.value}\n onChange={(e) => updateInput({value: e.target.value})}\n />\n );\n case 'slider':\n return (\n <div className=\"flex h-8 items-center space-x-1\">\n <Slider\n min={input.min}\n max={input.max}\n step={input.step}\n value={[input.value as number]}\n onValueChange={(value) => updateInput({value: Number(value)})}\n />\n <span className=\"min-w-[3ch] text-right text-sm font-medium\">\n {input.value}\n </span>\n </div>\n );\n case 'dropdown':\n return (\n <Select\n value={input.value as string}\n onValueChange={(value) => updateInput({value})}\n >\n <SelectTrigger className=\"h-8 text-xs shadow-none\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent onCloseAutoFocus={(e) => e.preventDefault()}>\n {(input.options as string[]).map((option: string) => (\n <SelectItem className=\"text-xs\" key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n default:\n return null;\n }\n};\n\nexport const InputCellContent: React.FC<InputCellContentProps> = ({\n id,\n cell,\n renderContainer,\n}) => {\n const updateCell = useCellsStore((s: CellsStoreState) => s.cells.updateCell);\n const removeCell = useCellsStore((s: CellsStoreState) => s.cells.removeCell);\n const input = cell.data.input;\n\n const updateInput = useCallback(\n (patch: Partial<InputUnion>) => {\n const isValueChange = 'value' in patch;\n updateCell(\n id,\n (c: Cell) =>\n produce(c, (draft) => {\n if (draft.type === 'input') {\n draft.data.input = {...draft.data.input, ...patch} as any;\n }\n }),\n isValueChange ? {cascade: true} : undefined,\n );\n },\n [id, updateCell],\n );\n\n const header = (\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <EditableText\n value={input.varName}\n onChange={(varName) => updateInput({varName})}\n className=\"h-6 text-xs font-semibold shadow-none outline-none ring-0\"\n />\n <span className=\"text-[10px] font-bold uppercase text-gray-400\">\n Input\n </span>\n </div>\n <InputConfigPanel\n input={input}\n updateInput={updateInput}\n onRemove={() => removeCell(id)}\n />\n </div>\n );\n\n const content = (\n <div className=\"p-2\">\n <RenderInput input={input} updateInput={updateInput} />\n </div>\n );\n\n return renderContainer({\n header,\n content,\n });\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SheetsTabBar.d.ts","sourceRoot":"","sources":["../../src/components/SheetsTabBar.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAK5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAQF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAmIpD,CAAC"}
|