@sqlrooms/sql-editor 0.29.0-rc.1 → 0.29.0-rc.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/README.md +13 -3
- package/dist/SqlCodeMirrorEditor.d.ts +29 -0
- package/dist/SqlCodeMirrorEditor.d.ts.map +1 -0
- package/dist/SqlCodeMirrorEditor.js +54 -0
- package/dist/SqlCodeMirrorEditor.js.map +1 -0
- package/dist/SqlEditor.js +1 -1
- package/dist/SqlEditor.js.map +1 -1
- package/dist/SqlMonacoEditor.d.ts +10 -4
- package/dist/SqlMonacoEditor.d.ts.map +1 -1
- package/dist/SqlMonacoEditor.js +51 -11
- package/dist/SqlMonacoEditor.js.map +1 -1
- package/dist/codemirror/extensions/completion.d.ts +12 -0
- package/dist/codemirror/extensions/completion.d.ts.map +1 -0
- package/dist/codemirror/extensions/completion.js +60 -0
- package/dist/codemirror/extensions/completion.js.map +1 -0
- package/dist/codemirror/extensions/create-sql-extension.d.ts +17 -0
- package/dist/codemirror/extensions/create-sql-extension.d.ts.map +1 -0
- package/dist/codemirror/extensions/create-sql-extension.js +20 -0
- package/dist/codemirror/extensions/create-sql-extension.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duck-db.d.ts +9 -0
- package/dist/codemirror/extensions/duck-db/duck-db.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duck-db.js +27 -0
- package/dist/codemirror/extensions/duck-db/duck-db.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.d.ts +2 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.js +487 -0
- package/dist/codemirror/extensions/duck-db/duckdb-keywords.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.d.ts +5 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.js +36 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql-extension.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.d.ts +5 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.js +11 -0
- package/dist/codemirror/extensions/duck-db/duckdb-sql.js.map +1 -0
- package/dist/codemirror/extensions/duck-db/index.d.ts +2 -0
- package/dist/codemirror/extensions/duck-db/index.d.ts.map +1 -0
- package/dist/codemirror/extensions/duck-db/index.js +2 -0
- package/dist/codemirror/extensions/duck-db/index.js.map +1 -0
- package/dist/codemirror/extensions/hover.d.ts +11 -0
- package/dist/codemirror/extensions/hover.d.ts.map +1 -0
- package/dist/codemirror/extensions/hover.js +55 -0
- package/dist/codemirror/extensions/hover.js.map +1 -0
- package/dist/codemirror/extensions/sql-keymap.d.ts +4 -0
- package/dist/codemirror/extensions/sql-keymap.d.ts.map +1 -0
- package/dist/codemirror/extensions/sql-keymap.js +25 -0
- package/dist/codemirror/extensions/sql-keymap.js.map +1 -0
- package/dist/codemirror/themes/sql-theme.d.ts +7 -0
- package/dist/codemirror/themes/sql-theme.d.ts.map +1 -0
- package/dist/codemirror/themes/sql-theme.js +55 -0
- package/dist/codemirror/themes/sql-theme.js.map +1 -0
- package/dist/codemirror/themes/sql-tooltip-theme.d.ts +7 -0
- package/dist/codemirror/themes/sql-tooltip-theme.d.ts.map +1 -0
- package/dist/codemirror/themes/sql-tooltip-theme.js +21 -0
- package/dist/codemirror/themes/sql-tooltip-theme.js.map +1 -0
- package/dist/codemirror/utils/schema-converter.d.ts +5 -0
- package/dist/codemirror/utils/schema-converter.d.ts.map +1 -0
- package/dist/codemirror/utils/schema-converter.js +9 -0
- package/dist/codemirror/utils/schema-converter.js.map +1 -0
- package/dist/components/CreateTableModal.d.ts.map +1 -1
- package/dist/components/CreateTableModal.js +5 -11
- package/dist/components/CreateTableModal.js.map +1 -1
- package/dist/components/FunctionDocumentation.d.ts +7 -0
- package/dist/components/FunctionDocumentation.d.ts.map +1 -0
- package/dist/components/FunctionDocumentation.js +44 -0
- package/dist/components/FunctionDocumentation.js.map +1 -0
- package/dist/components/QueryEditorPanelActions.d.ts.map +1 -1
- package/dist/components/QueryEditorPanelActions.js +3 -37
- package/dist/components/QueryEditorPanelActions.js.map +1 -1
- package/dist/components/QueryEditorPanelEditor.d.ts.map +1 -1
- package/dist/components/QueryEditorPanelEditor.js +11 -34
- package/dist/components/QueryEditorPanelEditor.js.map +1 -1
- package/dist/components/SchemaExplorer.d.ts +25 -0
- package/dist/components/SchemaExplorer.d.ts.map +1 -0
- package/dist/components/SchemaExplorer.js +20 -0
- package/dist/components/SchemaExplorer.js.map +1 -0
- package/dist/components/SqlColumnTooltip.d.ts +12 -0
- package/dist/components/SqlColumnTooltip.d.ts.map +1 -0
- package/dist/components/SqlColumnTooltip.js +15 -0
- package/dist/components/SqlColumnTooltip.js.map +1 -0
- package/dist/components/SqlColumnsTable.d.ts +10 -0
- package/dist/components/SqlColumnsTable.d.ts.map +1 -0
- package/dist/components/SqlColumnsTable.js +10 -0
- package/dist/components/SqlColumnsTable.js.map +1 -0
- package/dist/components/SqlTableTooltip.d.ts +9 -0
- package/dist/components/SqlTableTooltip.d.ts.map +1 -0
- package/dist/components/SqlTableTooltip.js +13 -0
- package/dist/components/SqlTableTooltip.js.map +1 -0
- package/dist/components/TableStructurePanel.d.ts +6 -3
- package/dist/components/TableStructurePanel.d.ts.map +1 -1
- package/dist/components/TableStructurePanel.js +8 -7
- package/dist/components/TableStructurePanel.js.map +1 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/qualified-name-parser.d.ts +41 -0
- package/dist/utils/qualified-name-parser.d.ts.map +1 -0
- package/dist/utils/qualified-name-parser.js +126 -0
- package/dist/utils/qualified-name-parser.js.map +1 -0
- package/package.json +23 -11
- package/dist/constants/functionSuggestions.d.ts +0 -6
- package/dist/constants/functionSuggestions.d.ts.map +0 -1
- package/dist/constants/functionSuggestions.js +0 -107
- package/dist/constants/functionSuggestions.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { hoverTooltip } from '@codemirror/view';
|
|
2
|
+
import { syntaxTree } from '@codemirror/language';
|
|
3
|
+
import { completionStatus } from '@codemirror/autocomplete';
|
|
4
|
+
import { FunctionDocumentation } from '../../components/FunctionDocumentation';
|
|
5
|
+
import { renderComponentToDomElement } from '@sqlrooms/utils';
|
|
6
|
+
/**
|
|
7
|
+
* Creates a hover tooltip extension for SQL functions.
|
|
8
|
+
* Shows function signatures, descriptions, and examples on hover.
|
|
9
|
+
*/
|
|
10
|
+
export function createHover({ getFunctionDocumentation, }) {
|
|
11
|
+
return hoverTooltip(async (view, pos, side) => {
|
|
12
|
+
if (!getFunctionDocumentation) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
// Don't show hover tooltip if autocomplete is active
|
|
16
|
+
if (completionStatus(view.state) !== null) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// Get the syntax node at cursor position
|
|
20
|
+
const tree = syntaxTree(view.state);
|
|
21
|
+
const node = tree.resolveInner(pos, side);
|
|
22
|
+
// Check if we're hovering over a function call, identifier, or keyword
|
|
23
|
+
// Some SQL functions are keywords (CAST, EXTRACT, etc.)
|
|
24
|
+
if (!node || (node.name !== 'Identifier' && node.name !== 'Keyword')) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Get the word at the cursor position
|
|
28
|
+
const word = view.state.doc.sliceString(node.from, node.to);
|
|
29
|
+
if (!word || word.length === 0) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
// Fetch exact function documentation
|
|
34
|
+
const functionGroup = await getFunctionDocumentation(word);
|
|
35
|
+
if (!functionGroup) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
// Create tooltip DOM element with cleanup callback
|
|
39
|
+
const { dom, destroy } = renderComponentToDomElement(FunctionDocumentation, {
|
|
40
|
+
functions: functionGroup.overloads,
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
pos: node.from,
|
|
44
|
+
end: node.to,
|
|
45
|
+
above: true,
|
|
46
|
+
create: () => ({ dom, destroy }),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Error fetching function hover info:', error);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=hover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../src/codemirror/extensions/hover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAC,qBAAqB,EAAC,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAC,2BAA2B,EAAC,MAAM,iBAAiB,CAAC;AAS5D;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,wBAAwB,GACX;IACb,OAAO,YAAY,CAAC,KAAK,EAAE,IAAgB,EAAE,GAAW,EAAE,IAAI,EAAE,EAAE;QAChE,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qDAAqD;QACrD,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yCAAyC;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE1C,uEAAuE;QACvE,wDAAwD;QACxD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sCAAsC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,mDAAmD;YACnD,MAAM,EAAC,GAAG,EAAE,OAAO,EAAC,GAAG,2BAA2B,CAChD,qBAAqB,EACrB;gBACE,SAAS,EAAE,aAAa,CAAC,SAAS;aACnC,CACF,CAAC;YAEF,OAAO;gBACL,GAAG,EAAE,IAAI,CAAC,IAAI;gBACd,GAAG,EAAE,IAAI,CAAC,EAAE;gBACZ,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAC,GAAG,EAAE,OAAO,EAAC,CAAC;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {hoverTooltip} from '@codemirror/view';\nimport type {EditorView} from '@codemirror/view';\nimport type {Extension} from '@codemirror/state';\nimport {syntaxTree} from '@codemirror/language';\nimport {completionStatus} from '@codemirror/autocomplete';\nimport {FunctionDocumentation} from '../../components/FunctionDocumentation';\nimport {renderComponentToDomElement} from '@sqlrooms/utils';\nimport type {GroupedFunctionSuggestion} from '@sqlrooms/db';\n\nexport interface HoverContext {\n getFunctionDocumentation?: (\n functionName: string,\n ) => Promise<GroupedFunctionSuggestion | null>;\n}\n\n/**\n * Creates a hover tooltip extension for SQL functions.\n * Shows function signatures, descriptions, and examples on hover.\n */\nexport function createHover({\n getFunctionDocumentation,\n}: HoverContext): Extension {\n return hoverTooltip(async (view: EditorView, pos: number, side) => {\n if (!getFunctionDocumentation) {\n return null;\n }\n\n // Don't show hover tooltip if autocomplete is active\n if (completionStatus(view.state) !== null) {\n return null;\n }\n\n // Get the syntax node at cursor position\n const tree = syntaxTree(view.state);\n const node = tree.resolveInner(pos, side);\n\n // Check if we're hovering over a function call, identifier, or keyword\n // Some SQL functions are keywords (CAST, EXTRACT, etc.)\n if (!node || (node.name !== 'Identifier' && node.name !== 'Keyword')) {\n return null;\n }\n\n // Get the word at the cursor position\n const word = view.state.doc.sliceString(node.from, node.to);\n if (!word || word.length === 0) {\n return null;\n }\n\n try {\n // Fetch exact function documentation\n const functionGroup = await getFunctionDocumentation(word);\n\n if (!functionGroup) {\n return null;\n }\n\n // Create tooltip DOM element with cleanup callback\n const {dom, destroy} = renderComponentToDomElement(\n FunctionDocumentation,\n {\n functions: functionGroup.overloads,\n },\n );\n\n return {\n pos: node.from,\n end: node.to,\n above: true,\n create: () => ({dom, destroy}),\n };\n } catch (error) {\n console.error('Error fetching function hover info:', error);\n return null;\n }\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-keymap.d.ts","sourceRoot":"","sources":["../../../src/codemirror/extensions/sql-keymap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAGjD,2DAA2D;AAC3D,wBAAgB,eAAe,CAC7B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GACnC,SAAS,CAyBX"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { keymap } from '@codemirror/view';
|
|
2
|
+
import { Prec } from '@codemirror/state';
|
|
3
|
+
/** Creates keymap extension with Cmd+Enter to run query */
|
|
4
|
+
export function createSqlKeymap(onRunQuery) {
|
|
5
|
+
if (!onRunQuery) {
|
|
6
|
+
// No keyboard shortcut if callback not provided
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
return Prec.high(keymap.of([
|
|
10
|
+
{
|
|
11
|
+
key: 'Mod-Enter', // Cmd on Mac, Ctrl on Windows/Linux
|
|
12
|
+
run: (view) => {
|
|
13
|
+
const { state } = view;
|
|
14
|
+
const selection = state.selection.main;
|
|
15
|
+
// Get selected text or full document
|
|
16
|
+
const query = selection.empty
|
|
17
|
+
? state.doc.toString()
|
|
18
|
+
: state.sliceDoc(selection.from, selection.to);
|
|
19
|
+
onRunQuery(query);
|
|
20
|
+
return true; // Prevent default behavior
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
]));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=sql-keymap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-keymap.js","sourceRoot":"","sources":["../../../src/codemirror/extensions/sql-keymap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAC,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAIvC,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAC7B,UAAoC;IAEpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,gDAAgD;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CACd,MAAM,CAAC,EAAE,CAAC;QACR;YACE,GAAG,EAAE,WAAW,EAAE,oCAAoC;YACtD,GAAG,EAAE,CAAC,IAAgB,EAAE,EAAE;gBACxB,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;gBACrB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;gBAEvC,qCAAqC;gBACrC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK;oBAC3B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACtB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;gBAEjD,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO,IAAI,CAAC,CAAC,2BAA2B;YAC1C,CAAC;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC","sourcesContent":["import {keymap} from '@codemirror/view';\nimport {Prec} from '@codemirror/state';\nimport type {Extension} from '@codemirror/state';\nimport type {EditorView} from '@codemirror/view';\n\n/** Creates keymap extension with Cmd+Enter to run query */\nexport function createSqlKeymap(\n onRunQuery?: (query: string) => void,\n): Extension {\n if (!onRunQuery) {\n // No keyboard shortcut if callback not provided\n return [];\n }\n\n return Prec.high(\n keymap.of([\n {\n key: 'Mod-Enter', // Cmd on Mac, Ctrl on Windows/Linux\n run: (view: EditorView) => {\n const {state} = view;\n const selection = state.selection.main;\n\n // Get selected text or full document\n const query = selection.empty\n ? state.doc.toString()\n : state.sliceDoc(selection.from, selection.to);\n\n onRunQuery(query);\n return true; // Prevent default behavior\n },\n },\n ]),\n );\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Extension } from '@codemirror/state';
|
|
2
|
+
import { type BaseThemeOptions } from '@sqlrooms/codemirror';
|
|
3
|
+
import { createSqlTooltipTheme } from './sql-tooltip-theme';
|
|
4
|
+
export type { BaseThemeOptions };
|
|
5
|
+
export { createSqlTooltipTheme };
|
|
6
|
+
export declare function createSqlTheme(options?: BaseThemeOptions): Extension;
|
|
7
|
+
//# sourceMappingURL=sql-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-theme.d.ts","sourceRoot":"","sources":["../../../src/codemirror/themes/sql-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAkB,KAAK,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAE1D,YAAY,EAAC,gBAAgB,EAAC,CAAC;AAC/B,OAAO,EAAC,qBAAqB,EAAC,CAAC;AAE/B,wBAAgB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAkDxE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
|
2
|
+
import { tags as t } from '@lezer/highlight';
|
|
3
|
+
import { createBaseTheme } from '@sqlrooms/codemirror';
|
|
4
|
+
import { createSqlTooltipTheme } from './sql-tooltip-theme';
|
|
5
|
+
export { createSqlTooltipTheme };
|
|
6
|
+
export function createSqlTheme(options = {}) {
|
|
7
|
+
const baseTheme = createBaseTheme(options);
|
|
8
|
+
const tooltipTheme = createSqlTooltipTheme();
|
|
9
|
+
const highlightStyle = HighlightStyle.define([
|
|
10
|
+
// SQL keywords (SELECT, FROM, WHERE, JOIN, etc.)
|
|
11
|
+
{
|
|
12
|
+
tag: [t.keyword, t.operatorKeyword, t.modifier],
|
|
13
|
+
color: 'var(--color-editor-keyword)',
|
|
14
|
+
},
|
|
15
|
+
// String literals
|
|
16
|
+
{ tag: [t.string, t.special(t.string)], color: 'var(--color-editor-string)' },
|
|
17
|
+
// Numbers
|
|
18
|
+
{ tag: [t.number, t.integer, t.float], color: 'var(--color-editor-number)' },
|
|
19
|
+
// Comments
|
|
20
|
+
{
|
|
21
|
+
tag: [t.lineComment, t.blockComment, t.comment],
|
|
22
|
+
color: 'var(--color-editor-comment)',
|
|
23
|
+
},
|
|
24
|
+
// Operators (+, -, *, /, =, etc.)
|
|
25
|
+
{
|
|
26
|
+
tag: [t.operator, t.compareOperator],
|
|
27
|
+
color: 'var(--color-editor-operator)',
|
|
28
|
+
},
|
|
29
|
+
// Punctuation (commas, semicolons, parentheses)
|
|
30
|
+
{
|
|
31
|
+
tag: [t.punctuation, t.separator, t.bracket],
|
|
32
|
+
color: 'var(--color-editor-punctuation)',
|
|
33
|
+
},
|
|
34
|
+
// Table names (use type color)
|
|
35
|
+
{ tag: [t.typeName], color: 'var(--color-editor-type)' },
|
|
36
|
+
// Column names (use property color)
|
|
37
|
+
{
|
|
38
|
+
tag: [t.variableName, t.propertyName, t.attributeName],
|
|
39
|
+
color: 'var(--color-editor-property)',
|
|
40
|
+
},
|
|
41
|
+
// Function names
|
|
42
|
+
{
|
|
43
|
+
tag: [t.function(t.variableName), t.function(t.propertyName)],
|
|
44
|
+
color: 'var(--color-editor-function)',
|
|
45
|
+
},
|
|
46
|
+
// Boolean literals (TRUE, FALSE)
|
|
47
|
+
{ tag: [t.bool], color: 'var(--color-editor-keyword)' },
|
|
48
|
+
// NULL keyword
|
|
49
|
+
{ tag: [t.null], color: 'var(--color-editor-keyword)' },
|
|
50
|
+
// Invalid syntax
|
|
51
|
+
{ tag: [t.invalid], color: 'var(--color-editor-invalid)' },
|
|
52
|
+
]);
|
|
53
|
+
return [baseTheme, tooltipTheme, syntaxHighlighting(highlightStyle)];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=sql-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-theme.js","sourceRoot":"","sources":["../../../src/codemirror/themes/sql-theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,cAAc,EAAE,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAC,IAAI,IAAI,CAAC,EAAC,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAC,eAAe,EAAwB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAC,qBAAqB,EAAC,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,UAA4B,EAAE;IAC3D,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;IAE7C,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;QAC3C,iDAAiD;QACjD;YACE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC;YAC/C,KAAK,EAAE,6BAA6B;SACrC;QACD,kBAAkB;QAClB,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAC;QAC3E,UAAU;QACV,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAC;QAC1E,WAAW;QACX;YACE,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC;YAC/C,KAAK,EAAE,6BAA6B;SACrC;QACD,kCAAkC;QAClC;YACE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC;YACpC,KAAK,EAAE,8BAA8B;SACtC;QACD,gDAAgD;QAChD;YACE,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE,iCAAiC;SACzC;QACD,+BAA+B;QAC/B,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAC;QACtD,oCAAoC;QACpC;YACE,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,aAAa,CAAC;YACtD,KAAK,EAAE,8BAA8B;SACtC;QACD,iBAAiB;QACjB;YACE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC7D,KAAK,EAAE,8BAA8B;SACtC;QACD,iCAAiC;QACjC,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAC;QACrD,eAAe;QACf,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAC;QACrD,iBAAiB;QACjB,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAC;KACzD,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import {Extension} from '@codemirror/state';\nimport {HighlightStyle, syntaxHighlighting} from '@codemirror/language';\nimport {tags as t} from '@lezer/highlight';\nimport {createBaseTheme, type BaseThemeOptions} from '@sqlrooms/codemirror';\nimport {createSqlTooltipTheme} from './sql-tooltip-theme';\n\nexport type {BaseThemeOptions};\nexport {createSqlTooltipTheme};\n\nexport function createSqlTheme(options: BaseThemeOptions = {}): Extension {\n const baseTheme = createBaseTheme(options);\n const tooltipTheme = createSqlTooltipTheme();\n\n const highlightStyle = HighlightStyle.define([\n // SQL keywords (SELECT, FROM, WHERE, JOIN, etc.)\n {\n tag: [t.keyword, t.operatorKeyword, t.modifier],\n color: 'var(--color-editor-keyword)',\n },\n // String literals\n {tag: [t.string, t.special(t.string)], color: 'var(--color-editor-string)'},\n // Numbers\n {tag: [t.number, t.integer, t.float], color: 'var(--color-editor-number)'},\n // Comments\n {\n tag: [t.lineComment, t.blockComment, t.comment],\n color: 'var(--color-editor-comment)',\n },\n // Operators (+, -, *, /, =, etc.)\n {\n tag: [t.operator, t.compareOperator],\n color: 'var(--color-editor-operator)',\n },\n // Punctuation (commas, semicolons, parentheses)\n {\n tag: [t.punctuation, t.separator, t.bracket],\n color: 'var(--color-editor-punctuation)',\n },\n // Table names (use type color)\n {tag: [t.typeName], color: 'var(--color-editor-type)'},\n // Column names (use property color)\n {\n tag: [t.variableName, t.propertyName, t.attributeName],\n color: 'var(--color-editor-property)',\n },\n // Function names\n {\n tag: [t.function(t.variableName), t.function(t.propertyName)],\n color: 'var(--color-editor-function)',\n },\n // Boolean literals (TRUE, FALSE)\n {tag: [t.bool], color: 'var(--color-editor-keyword)'},\n // NULL keyword\n {tag: [t.null], color: 'var(--color-editor-keyword)'},\n // Invalid syntax\n {tag: [t.invalid], color: 'var(--color-editor-invalid)'},\n ]);\n\n return [baseTheme, tooltipTheme, syntaxHighlighting(highlightStyle)];\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Extension } from '@codemirror/state';
|
|
2
|
+
/**
|
|
3
|
+
* Creates theme styles specifically for SQL hover tooltips.
|
|
4
|
+
* Only handles the base tooltip container - components use Tailwind classes for styling.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createSqlTooltipTheme(): Extension;
|
|
7
|
+
//# sourceMappingURL=sql-tooltip-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-tooltip-theme.d.ts","sourceRoot":"","sources":["../../../src/codemirror/themes/sql-tooltip-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAI5C;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,CAiBjD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { EditorView } from '@codemirror/view';
|
|
2
|
+
import { getTheme } from '@sqlrooms/ui';
|
|
3
|
+
/**
|
|
4
|
+
* Creates theme styles specifically for SQL hover tooltips.
|
|
5
|
+
* Only handles the base tooltip container - components use Tailwind classes for styling.
|
|
6
|
+
*/
|
|
7
|
+
export function createSqlTooltipTheme() {
|
|
8
|
+
const theme = getTheme();
|
|
9
|
+
return EditorView.theme({
|
|
10
|
+
'.cm-tooltip-hover .cm-sql-hover-tooltip': {
|
|
11
|
+
backgroundColor: 'var(--color-popover)',
|
|
12
|
+
color: 'var(--color-popover-foreground)',
|
|
13
|
+
border: '0',
|
|
14
|
+
boxShadow: 'none',
|
|
15
|
+
padding: '0',
|
|
16
|
+
fontSize: 'inherit',
|
|
17
|
+
lineHeight: 'inherit',
|
|
18
|
+
},
|
|
19
|
+
}, { dark: theme === 'dark' });
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=sql-tooltip-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-tooltip-theme.js","sourceRoot":"","sources":["../../../src/codemirror/themes/sql-tooltip-theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,OAAO,UAAU,CAAC,KAAK,CACrB;QACE,yCAAyC,EAAE;YACzC,eAAe,EAAE,sBAAsB;YACvC,KAAK,EAAE,iCAAiC;YACxC,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,SAAS;YACnB,UAAU,EAAE,SAAS;SACtB;KACF,EACD,EAAC,IAAI,EAAE,KAAK,KAAK,MAAM,EAAC,CACzB,CAAC;AACJ,CAAC","sourcesContent":["import {Extension} from '@codemirror/state';\nimport {EditorView} from '@codemirror/view';\nimport {getTheme} from '@sqlrooms/ui';\n\n/**\n * Creates theme styles specifically for SQL hover tooltips.\n * Only handles the base tooltip container - components use Tailwind classes for styling.\n */\nexport function createSqlTooltipTheme(): Extension {\n const theme = getTheme();\n\n return EditorView.theme(\n {\n '.cm-tooltip-hover .cm-sql-hover-tooltip': {\n backgroundColor: 'var(--color-popover)',\n color: 'var(--color-popover-foreground)',\n border: '0',\n boxShadow: 'none',\n padding: '0',\n fontSize: 'inherit',\n lineHeight: 'inherit',\n },\n },\n {dark: theme === 'dark'},\n );\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SQLNamespace } from '@codemirror/lang-sql';
|
|
2
|
+
import type { DataTable } from '@sqlrooms/duckdb';
|
|
3
|
+
/** Converts SQLRooms DataTable[] to CodeMirror SQLNamespace format for autocompletion */
|
|
4
|
+
export declare function convertToSQLNamespace(tables: DataTable[]): SQLNamespace;
|
|
5
|
+
//# sourceMappingURL=schema-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../../src/codemirror/utils/schema-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAEhD,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAQvE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Converts SQLRooms DataTable[] to CodeMirror SQLNamespace format for autocompletion */
|
|
2
|
+
export function convertToSQLNamespace(tables) {
|
|
3
|
+
const namespace = {};
|
|
4
|
+
for (const table of tables) {
|
|
5
|
+
namespace[table.table.table] = table.columns.map((col) => col.name);
|
|
6
|
+
}
|
|
7
|
+
return namespace;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=schema-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../../src/codemirror/utils/schema-converter.ts"],"names":[],"mappings":"AAGA,yFAAyF;AACzF,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,MAAM,SAAS,GAAiB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import type {SQLNamespace} from '@codemirror/lang-sql';\nimport type {DataTable} from '@sqlrooms/duckdb';\n\n/** Converts SQLRooms DataTable[] to CodeMirror SQLNamespace format for autocompletion */\nexport function convertToSQLNamespace(tables: DataTable[]): SQLNamespace {\n const namespace: SQLNamespace = {};\n\n for (const table of tables) {\n namespace[table.table.table] = table.columns.map((col) => col.name);\n }\n\n return namespace;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateTableModal.d.ts","sourceRoot":"","sources":["../../src/components/CreateTableModal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAqCxD,OAAO,EAAC,EAAE,EAAoD,MAAM,OAAO,CAAC;AA0B5E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAAC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,WAAW,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C,CAAC;
|
|
1
|
+
{"version":3,"file":"CreateTableModal.d.ts","sourceRoot":"","sources":["../../src/components/CreateTableModal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAqCxD,OAAO,EAAC,EAAE,EAAoD,MAAM,OAAO,CAAC;AA0B5E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAAC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,WAAW,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C,CAAC;AAweF,QAAA,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA4F/C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
|
7
7
|
import { useForm } from 'react-hook-form';
|
|
8
8
|
import * as z from 'zod';
|
|
9
9
|
import { useStoreWithSqlEditor } from '../SqlEditorSlice';
|
|
10
|
-
import {
|
|
10
|
+
import { SqlCodeMirrorEditor } from '../SqlCodeMirrorEditor';
|
|
11
11
|
const VALID_TABLE_OR_COLUMN_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;
|
|
12
12
|
const formSchema = z.object({
|
|
13
13
|
tableName: z
|
|
@@ -162,16 +162,10 @@ const CreateTableForm = ({ query, onClose, onRequestClose, editDataSource, allow
|
|
|
162
162
|
? 'Create view from query'
|
|
163
163
|
: 'Create table from query' }), !editDataSource && (_jsx(DialogDescription, { children: watchView
|
|
164
164
|
? 'Create a new view from an SQL query.'
|
|
165
|
-
: 'Create a new table from the results of an SQL query.' }))] }), form.formState.errors.root && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { className: "font-mono text-xs whitespace-pre-wrap", children: form.formState.errors.root.message }) })), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(FormField, { control: form.control, name: "tableName", render: ({ field }) => (_jsxs(FormItem, { className: "min-w-0 flex-2", children: [_jsx(FormLabel, { className: "text-xs", children: watchView ? 'View name' : 'Table name' }), _jsx(FormControl, { children: _jsx(Input, { ...field, className: "h-9 font-mono text-xs", autoFocus: true, disabled: isSubmitting }) }), _jsx(FormMessage, { className: "text-xs" })] })) }), showSchemaSelection && (_jsxs(_Fragment, { children: [_jsx(FormField, { control: form.control, name: "schema", render: ({ field }) => (_jsxs(FormItem, { className: "min-w-0 flex-1", children: [_jsx(FormLabel, { className: "text-xs", children: "Schema" }), _jsx(FormControl, { children: _jsx(SchemaCombobox, { value: field.value, onChange: field.onChange, options: schemas, placeholder: "Schema...", searchPlaceholder: "Search...", emptyMessage: "No schemas.", disabled: isSubmitting }) })] })) }), (databases.length > 1 || watchTemp) && (_jsx(FormField, { control: form.control, name: "database", render: ({ field }) => (_jsxs(FormItem, { className: "min-w-0 flex-1", children: [_jsx(FormLabel, { className: "text-xs", children: "Database" }), _jsx(FormControl, { children: _jsx(SchemaCombobox, { value: watchTemp ? 'temp' : field.value, onChange: field.onChange, options: databases, placeholder: "Database...", searchPlaceholder: "Search...", emptyMessage: "No databases.", disabled: isSubmitting || watchTemp }) })] })) }))] }))] }), _jsx(FormField, { control: form.control, name: "query", render: ({ field }) => (_jsxs(FormItem, { className: "relative flex h-[200px] flex-col", children: [_jsx(FormControl, { children: _jsx(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
wordWrap: 'on',
|
|
170
|
-
folding: false,
|
|
171
|
-
lineNumbers: 'off',
|
|
172
|
-
readOnly: isSubmitting,
|
|
173
|
-
fixedOverflowWidgets: false, // default true doesn't work well in a modal
|
|
174
|
-
} }) }), _jsx(FormMessage, { className: "text-xs" })] })) }), !onAddOrUpdateSqlQuery && (_jsxs("div", { className: "flex items-center gap-6 rounded-md border px-3 py-2", children: [_jsx(FormField, { control: form.control, name: "view", render: ({ field }) => (_jsx(OptionCheckbox, { id: "create-table-view", label: "View", tooltip: "Create a view instead of a table. Views store the query, not the data.", checked: field.value, onCheckedChange: field.onChange, disabled: isSubmitting })) }), _jsx(FormField, { control: form.control, name: "replace", render: ({ field }) => (_jsx(OptionCheckbox, { id: "create-table-replace", label: "Overwrite", tooltip: `Overwrite existing ${watchView ? 'view' : 'table'} with the same name if it exists.`, checked: field.value, onCheckedChange: field.onChange, disabled: isSubmitting })) })] })), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "outline", onClick: onRequestClose, children: "Close" }), _jsxs(Button, { type: isSubmitting ? 'button' : 'submit', onClick: isSubmitting ? handleCancel : undefined, disabled: isSubmitting ? isCancelling : !watchTableName?.trim(), children: [isSubmitting && _jsx(Spinner, { className: "mr-2" }), isSubmitting
|
|
165
|
+
: 'Create a new table from the results of an SQL query.' }))] }), form.formState.errors.root && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { className: "font-mono text-xs whitespace-pre-wrap", children: form.formState.errors.root.message }) })), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(FormField, { control: form.control, name: "tableName", render: ({ field }) => (_jsxs(FormItem, { className: "min-w-0 flex-2", children: [_jsx(FormLabel, { className: "text-xs", children: watchView ? 'View name' : 'Table name' }), _jsx(FormControl, { children: _jsx(Input, { ...field, className: "h-9 font-mono text-xs", autoFocus: true, disabled: isSubmitting }) }), _jsx(FormMessage, { className: "text-xs" })] })) }), showSchemaSelection && (_jsxs(_Fragment, { children: [_jsx(FormField, { control: form.control, name: "schema", render: ({ field }) => (_jsxs(FormItem, { className: "min-w-0 flex-1", children: [_jsx(FormLabel, { className: "text-xs", children: "Schema" }), _jsx(FormControl, { children: _jsx(SchemaCombobox, { value: field.value, onChange: field.onChange, options: schemas, placeholder: "Schema...", searchPlaceholder: "Search...", emptyMessage: "No schemas.", disabled: isSubmitting }) })] })) }), (databases.length > 1 || watchTemp) && (_jsx(FormField, { control: form.control, name: "database", render: ({ field }) => (_jsxs(FormItem, { className: "min-w-0 flex-1", children: [_jsx(FormLabel, { className: "text-xs", children: "Database" }), _jsx(FormControl, { children: _jsx(SchemaCombobox, { value: watchTemp ? 'temp' : field.value, onChange: field.onChange, options: databases, placeholder: "Database...", searchPlaceholder: "Search...", emptyMessage: "No databases.", disabled: isSubmitting || watchTemp }) })] })) }))] }))] }), _jsx(FormField, { control: form.control, name: "query", render: ({ field }) => (_jsxs(FormItem, { className: "relative flex h-[200px] flex-col", children: [_jsx(FormControl, { children: _jsx(SqlCodeMirrorEditor, { connector: connector, value: field.value, onChange: field.onChange, className: "absolute inset-0 h-full w-full", options: {
|
|
166
|
+
lineWrapping: true,
|
|
167
|
+
lineNumbers: false,
|
|
168
|
+
}, readOnly: isSubmitting }) }), _jsx(FormMessage, { className: "text-xs" })] })) }), !onAddOrUpdateSqlQuery && (_jsxs("div", { className: "flex items-center gap-6 rounded-md border px-3 py-2", children: [_jsx(FormField, { control: form.control, name: "view", render: ({ field }) => (_jsx(OptionCheckbox, { id: "create-table-view", label: "View", tooltip: "Create a view instead of a table. Views store the query, not the data.", checked: field.value, onCheckedChange: field.onChange, disabled: isSubmitting })) }), _jsx(FormField, { control: form.control, name: "replace", render: ({ field }) => (_jsx(OptionCheckbox, { id: "create-table-replace", label: "Overwrite", tooltip: `Overwrite existing ${watchView ? 'view' : 'table'} with the same name if it exists.`, checked: field.value, onCheckedChange: field.onChange, disabled: isSubmitting })) })] })), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "outline", onClick: onRequestClose, children: "Close" }), _jsxs(Button, { type: isSubmitting ? 'button' : 'submit', onClick: isSubmitting ? handleCancel : undefined, disabled: isSubmitting ? isCancelling : !watchTableName?.trim(), children: [isSubmitting && _jsx(Spinner, { className: "mr-2" }), isSubmitting
|
|
175
169
|
? isCancelling
|
|
176
170
|
? 'Cancelling...'
|
|
177
171
|
: 'Cancel'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateTableModal.js","sourceRoot":"","sources":["../../src/components/CreateTableModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import {zodResolver} from '@hookform/resolvers/zod';\nimport {makeQualifiedTableName} from '@sqlrooms/db';\nimport {SqlQueryDataSource} from '@sqlrooms/room-shell';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Check, ChevronsUpDown, HelpCircle} from 'lucide-react';\nimport {FC, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport * as z from 'zod';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {SqlMonacoEditor} from '../SqlMonacoEditor';\n\nconst VALID_TABLE_OR_COLUMN_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\nconst formSchema = z.object({\n tableName: z\n .string()\n .min(1, 'Table name is required')\n .regex(\n VALID_TABLE_OR_COLUMN_REGEX,\n 'Only letters, digits and underscores are allowed; should not start with a digit',\n ),\n query: z.string().min(1, 'Query is required'),\n schema: z.string().optional(),\n database: z.string().optional(),\n replace: z.boolean(),\n temp: z.boolean(),\n view: z.boolean(),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\n/**\n * Initial values for the create table form.\n */\nexport type CreateTableFormInitialValues = Partial<{\n tableName: string;\n replace: boolean;\n temp: boolean;\n view: boolean;\n schema: string;\n database: string;\n}>;\n\nexport type CreateTableModalProps = {\n query: string;\n isOpen: boolean;\n onClose: () => void;\n editDataSource?: SqlQueryDataSource;\n /**\n * Allow multiple statements in the query. When true, preceding statements\n * will be executed before the final SELECT is wrapped in CREATE TABLE/VIEW.\n */\n allowMultipleStatements?: boolean;\n /**\n * Show schema/database selection UI.\n * @default false\n */\n showSchemaSelection?: boolean;\n /**\n * @deprecated Use createTableFromQuery directly instead.\n * When not provided, the modal will call createTableFromQuery directly.\n */\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n /**\n * Additional class name for the dialog content.\n */\n className?: string;\n /**\n * Initial values for the form fields.\n */\n initialValues?: CreateTableFormInitialValues;\n};\n\ntype CreateTableFormProps = {\n query: string;\n onClose: () => void;\n onRequestClose: () => void;\n editDataSource?: SqlQueryDataSource;\n allowMultipleStatements?: boolean;\n showSchemaSelection?: boolean;\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n initialValues?: CreateTableFormInitialValues;\n onSubmittingChange?: (isSubmitting: boolean) => void;\n onRegisterCancel?: (cancel: () => void) => void;\n};\n\nconst isAbortError = (err: unknown): boolean => {\n if (err instanceof DOMException) {\n return err.name === 'AbortError';\n }\n if (err instanceof Error) {\n return err.name === 'AbortError' || /cancelled|canceled/i.test(err.message);\n }\n return false;\n};\n\n/**\n * Compact searchable combobox for selecting schema or database.\n */\nconst SchemaCombobox: FC<{\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n options: string[];\n placeholder: string;\n searchPlaceholder: string;\n emptyMessage: string;\n disabled?: boolean;\n}> = ({\n value,\n onChange,\n options,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n}) => {\n const [open, setOpen] = useState(false);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"h-9 w-full min-w-0 justify-between font-mono text-xs\"\n disabled={disabled}\n >\n <span className=\"min-w-0 truncate\">{value || placeholder}</span>\n <ChevronsUpDown className=\"ml-1 h-3 w-3 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[180px] p-0\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} className=\"text-xs\" />\n <CommandList>\n <CommandEmpty className=\"text-xs\">{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option}\n value={option}\n className=\"text-xs\"\n onSelect={(currentValue) => {\n onChange(currentValue === value ? undefined : currentValue);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n 'mr-2 h-3 w-3',\n value === option ? 'opacity-100' : 'opacity-0',\n )}\n />\n {option}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n\n/**\n * Compact checkbox option with clickable label and tooltip.\n */\nconst OptionCheckbox: FC<{\n id: string;\n label: string;\n tooltip: string;\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n disabled?: boolean;\n}> = ({id, label, tooltip, checked, onCheckedChange, disabled}) => (\n <div className=\"flex items-center gap-1.5\">\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n className=\"h-3.5 w-3.5\"\n />\n <Label\n htmlFor={id}\n className={cn(\n 'cursor-pointer text-xs font-normal',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {label}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"text-muted-foreground h-3 w-3 cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[200px] text-xs\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n </div>\n);\n\nconst CreateTableForm: FC<CreateTableFormProps> = ({\n query,\n onClose,\n onRequestClose,\n editDataSource,\n allowMultipleStatements = false,\n showSchemaSelection = false,\n onAddOrUpdateSqlQuery,\n initialValues,\n onSubmittingChange,\n onRegisterCancel,\n}) => {\n const connector = useStoreWithSqlEditor((state) => state.db.connector);\n const createTableFromQuery = useStoreWithSqlEditor(\n (state) => state.db.createTableFromQuery,\n );\n const refreshTableSchemas = useStoreWithSqlEditor(\n (state) => state.db.refreshTableSchemas,\n );\n const tables = useStoreWithSqlEditor((state) => state.db.tables);\n const currentSchema = useStoreWithSqlEditor(\n (state) => state.db.currentSchema,\n );\n const currentDatabase = useStoreWithSqlEditor(\n (state) => state.db.currentDatabase,\n );\n\n // Extract unique schemas and databases from tables (excluding system ones)\n const {schemas, databases} = useMemo(() => {\n const schemaSet = new Set<string>();\n const databaseSet = new Set<string>();\n\n for (const table of tables) {\n if (table.table.schema && !table.table.schema.startsWith('pg_')) {\n schemaSet.add(table.table.schema);\n }\n if (table.table.database) {\n databaseSet.add(table.table.database);\n }\n }\n\n // Ensure current schema/database are included\n if (currentSchema) schemaSet.add(currentSchema);\n if (currentDatabase) databaseSet.add(currentDatabase);\n\n return {\n schemas: Array.from(schemaSet).sort(),\n databases: Array.from(databaseSet).sort(),\n };\n }, [tables, currentSchema, currentDatabase]);\n\n const form = useForm<FormValues>({\n resolver: zodResolver(formSchema as any),\n defaultValues: {\n tableName: editDataSource?.tableName ?? initialValues?.tableName ?? '',\n query: editDataSource?.sqlQuery ?? query.trim(),\n schema: initialValues?.schema ?? currentSchema,\n database: initialValues?.database ?? currentDatabase,\n replace: initialValues?.replace ?? false,\n temp: initialValues?.temp ?? false,\n view: initialValues?.view ?? false,\n },\n });\n\n const isSubmitting = form.formState.isSubmitting;\n const [isCancelling, setIsCancelling] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n };\n }, []);\n useEffect(() => {\n onSubmittingChange?.(isSubmitting);\n }, [isSubmitting, onSubmittingChange]);\n\n const onSubmit = useCallback(\n async (values: FormValues) => {\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n setIsCancelling(false);\n try {\n const {tableName, query, schema, database, replace, temp, view} =\n values;\n\n if (onAddOrUpdateSqlQuery) {\n // Legacy path: use the callback\n await onAddOrUpdateSqlQuery(\n tableName,\n query,\n editDataSource?.tableName,\n abortController.signal,\n );\n } else {\n // New path: call createTableFromQuery directly\n const qualifiedName =\n schema || database\n ? makeQualifiedTableName({table: tableName, schema, database})\n : tableName;\n\n await createTableFromQuery(qualifiedName, query, {\n replace,\n temp,\n view,\n allowMultipleStatements,\n abortSignal: abortController.signal,\n });\n\n // Refresh table schemas to show the new table\n await refreshTableSchemas();\n }\n\n form.reset();\n onClose();\n } catch (err) {\n if (isAbortError(err)) {\n return;\n }\n form.setError('root', {type: 'manual', message: `${err}`});\n } finally {\n abortControllerRef.current = null;\n setIsCancelling(false);\n }\n },\n [\n onAddOrUpdateSqlQuery,\n editDataSource?.tableName,\n createTableFromQuery,\n allowMultipleStatements,\n refreshTableSchemas,\n onClose,\n form,\n ],\n );\n\n const watchView = form.watch('view');\n const watchTemp = form.watch('temp');\n const watchTableName = form.watch('tableName');\n\n const handleCancel = useCallback(async () => {\n if (abortControllerRef.current) {\n setIsCancelling(true);\n abortControllerRef.current.abort();\n }\n }, []);\n useEffect(() => {\n onRegisterCancel?.(handleCancel);\n }, [handleCancel, onRegisterCancel]);\n\n return (\n <TooltipProvider delayDuration={200}>\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>\n {editDataSource\n ? 'Edit table query'\n : watchView\n ? 'Create view from query'\n : 'Create table from query'}\n </DialogTitle>\n {!editDataSource && (\n <DialogDescription>\n {watchView\n ? 'Create a new view from an SQL query.'\n : 'Create a new table from the results of an SQL query.'}\n </DialogDescription>\n )}\n </DialogHeader>\n\n {form.formState.errors.root && (\n <Alert variant=\"destructive\">\n <AlertDescription className=\"font-mono text-xs whitespace-pre-wrap\">\n {form.formState.errors.root.message}\n </AlertDescription>\n </Alert>\n )}\n\n {/* Table name, schema, database in single row */}\n <div className=\"flex items-start gap-3\">\n <FormField\n control={form.control}\n name=\"tableName\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-2\">\n <FormLabel className=\"text-xs\">\n {watchView ? 'View name' : 'Table name'}\n </FormLabel>\n <FormControl>\n <Input\n {...field}\n className=\"h-9 font-mono text-xs\"\n autoFocus\n disabled={isSubmitting}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {showSchemaSelection && (\n <>\n <FormField\n control={form.control}\n name=\"schema\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Schema</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={field.value}\n onChange={field.onChange}\n options={schemas}\n placeholder=\"Schema...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No schemas.\"\n disabled={isSubmitting}\n />\n </FormControl>\n </FormItem>\n )}\n />\n\n {(databases.length > 1 || watchTemp) && (\n <FormField\n control={form.control}\n name=\"database\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Database</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={watchTemp ? 'temp' : field.value}\n onChange={field.onChange}\n options={databases}\n placeholder=\"Database...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No databases.\"\n disabled={isSubmitting || watchTemp}\n />\n </FormControl>\n </FormItem>\n )}\n />\n )}\n </>\n )}\n </div>\n\n <FormField\n control={form.control}\n name=\"query\"\n render={({field}) => (\n <FormItem className=\"relative flex h-[200px] flex-col\">\n <FormControl>\n <SqlMonacoEditor\n connector={connector}\n value={field.value}\n onChange={field.onChange}\n className=\"absolute inset-0 h-full w-full\"\n options={{\n scrollBeyondLastLine: false,\n automaticLayout: true,\n minimap: {enabled: false},\n wordWrap: 'on',\n folding: false,\n lineNumbers: 'off',\n readOnly: isSubmitting,\n fixedOverflowWidgets: false, // default true doesn't work well in a modal\n }}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {/* Compact options row */}\n {!onAddOrUpdateSqlQuery && (\n <div className=\"flex items-center gap-6 rounded-md border px-3 py-2\">\n <FormField\n control={form.control}\n name=\"view\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-view\"\n label=\"View\"\n tooltip=\"Create a view instead of a table. Views store the query, not the data.\"\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n\n {/* <FormField\n control={form.control}\n name=\"temp\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-temp\"\n label=\"Temporary\"\n tooltip={`${watchView ? 'View' : 'Table'} will be deleted when the session ends.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n /> */}\n\n <FormField\n control={form.control}\n name=\"replace\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-replace\"\n label=\"Overwrite\"\n tooltip={`Overwrite existing ${watchView ? 'view' : 'table'} with the same name if it exists.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n </div>\n )}\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onRequestClose}>\n Close\n </Button>\n <Button\n type={isSubmitting ? 'button' : 'submit'}\n onClick={isSubmitting ? handleCancel : undefined}\n disabled={isSubmitting ? isCancelling : !watchTableName?.trim()}\n >\n {isSubmitting && <Spinner className=\"mr-2\" />}\n {isSubmitting\n ? isCancelling\n ? 'Cancelling...'\n : 'Cancel'\n : editDataSource\n ? 'Update'\n : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </Form>\n </TooltipProvider>\n );\n};\n\nconst CreateTableModal: FC<CreateTableModalProps> = (props) => {\n const {\n isOpen,\n onClose,\n query,\n editDataSource,\n allowMultipleStatements,\n showSchemaSelection,\n onAddOrUpdateSqlQuery,\n className,\n initialValues,\n } = props;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const cancelRef = useRef<(() => void) | null>(null);\n\n const resetState = useCallback(() => {\n setIsSubmitting(false);\n setIsConfirmOpen(false);\n cancelRef.current = null;\n }, []);\n\n const handleClose = useCallback(() => {\n resetState();\n onClose();\n }, [onClose, resetState]);\n\n const handleRequestClose = useCallback(() => {\n if (!isSubmitting) {\n handleClose();\n return;\n }\n setIsConfirmOpen(true);\n }, [handleClose, isSubmitting]);\n\n const handleConfirmClose = useCallback(() => {\n cancelRef.current?.();\n handleClose();\n }, [handleClose]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleRequestClose();\n }\n }}\n >\n <DialogContent className={cn('w-3xl max-w-[80%]', className)}>\n {isOpen && (\n <CreateTableForm\n query={query}\n onClose={handleClose}\n onRequestClose={handleRequestClose}\n editDataSource={editDataSource}\n allowMultipleStatements={allowMultipleStatements}\n showSchemaSelection={showSchemaSelection}\n onAddOrUpdateSqlQuery={onAddOrUpdateSqlQuery}\n initialValues={initialValues}\n onSubmittingChange={setIsSubmitting}\n onRegisterCancel={(cancel) => {\n cancelRef.current = cancel;\n }}\n />\n )}\n </DialogContent>\n <Dialog open={isConfirmOpen} onOpenChange={setIsConfirmOpen}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Cancel running query?</DialogTitle>\n <DialogDescription>\n A query is still running. Cancelling it will stop the query and\n close this dialog.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsConfirmOpen(false)}\n >\n Keep running\n </Button>\n <Button type=\"button\" onClick={handleConfirmClose}>\n Cancel & close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Dialog>\n );\n};\n\nexport default CreateTableModal;\n"]}
|
|
1
|
+
{"version":3,"file":"CreateTableModal.js","sourceRoot":"","sources":["../../src/components/CreateTableModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import {zodResolver} from '@hookform/resolvers/zod';\nimport {makeQualifiedTableName} from '@sqlrooms/db';\nimport {SqlQueryDataSource} from '@sqlrooms/room-shell';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Check, ChevronsUpDown, HelpCircle} from 'lucide-react';\nimport {FC, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport * as z from 'zod';\nimport {useStoreWithSqlEditor} from '../SqlEditorSlice';\nimport {SqlCodeMirrorEditor} from '../SqlCodeMirrorEditor';\n\nconst VALID_TABLE_OR_COLUMN_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\nconst formSchema = z.object({\n tableName: z\n .string()\n .min(1, 'Table name is required')\n .regex(\n VALID_TABLE_OR_COLUMN_REGEX,\n 'Only letters, digits and underscores are allowed; should not start with a digit',\n ),\n query: z.string().min(1, 'Query is required'),\n schema: z.string().optional(),\n database: z.string().optional(),\n replace: z.boolean(),\n temp: z.boolean(),\n view: z.boolean(),\n});\n\ntype FormValues = z.infer<typeof formSchema>;\n\n/**\n * Initial values for the create table form.\n */\nexport type CreateTableFormInitialValues = Partial<{\n tableName: string;\n replace: boolean;\n temp: boolean;\n view: boolean;\n schema: string;\n database: string;\n}>;\n\nexport type CreateTableModalProps = {\n query: string;\n isOpen: boolean;\n onClose: () => void;\n editDataSource?: SqlQueryDataSource;\n /**\n * Allow multiple statements in the query. When true, preceding statements\n * will be executed before the final SELECT is wrapped in CREATE TABLE/VIEW.\n */\n allowMultipleStatements?: boolean;\n /**\n * Show schema/database selection UI.\n * @default false\n */\n showSchemaSelection?: boolean;\n /**\n * @deprecated Use createTableFromQuery directly instead.\n * When not provided, the modal will call createTableFromQuery directly.\n */\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n /**\n * Additional class name for the dialog content.\n */\n className?: string;\n /**\n * Initial values for the form fields.\n */\n initialValues?: CreateTableFormInitialValues;\n};\n\ntype CreateTableFormProps = {\n query: string;\n onClose: () => void;\n onRequestClose: () => void;\n editDataSource?: SqlQueryDataSource;\n allowMultipleStatements?: boolean;\n showSchemaSelection?: boolean;\n onAddOrUpdateSqlQuery?: (\n tableName: string,\n query: string,\n oldTableName?: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n initialValues?: CreateTableFormInitialValues;\n onSubmittingChange?: (isSubmitting: boolean) => void;\n onRegisterCancel?: (cancel: () => void) => void;\n};\n\nconst isAbortError = (err: unknown): boolean => {\n if (err instanceof DOMException) {\n return err.name === 'AbortError';\n }\n if (err instanceof Error) {\n return err.name === 'AbortError' || /cancelled|canceled/i.test(err.message);\n }\n return false;\n};\n\n/**\n * Compact searchable combobox for selecting schema or database.\n */\nconst SchemaCombobox: FC<{\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n options: string[];\n placeholder: string;\n searchPlaceholder: string;\n emptyMessage: string;\n disabled?: boolean;\n}> = ({\n value,\n onChange,\n options,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n}) => {\n const [open, setOpen] = useState(false);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"h-9 w-full min-w-0 justify-between font-mono text-xs\"\n disabled={disabled}\n >\n <span className=\"min-w-0 truncate\">{value || placeholder}</span>\n <ChevronsUpDown className=\"ml-1 h-3 w-3 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[180px] p-0\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} className=\"text-xs\" />\n <CommandList>\n <CommandEmpty className=\"text-xs\">{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option}\n value={option}\n className=\"text-xs\"\n onSelect={(currentValue) => {\n onChange(currentValue === value ? undefined : currentValue);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n 'mr-2 h-3 w-3',\n value === option ? 'opacity-100' : 'opacity-0',\n )}\n />\n {option}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n\n/**\n * Compact checkbox option with clickable label and tooltip.\n */\nconst OptionCheckbox: FC<{\n id: string;\n label: string;\n tooltip: string;\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n disabled?: boolean;\n}> = ({id, label, tooltip, checked, onCheckedChange, disabled}) => (\n <div className=\"flex items-center gap-1.5\">\n <Checkbox\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n className=\"h-3.5 w-3.5\"\n />\n <Label\n htmlFor={id}\n className={cn(\n 'cursor-pointer text-xs font-normal',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {label}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"text-muted-foreground h-3 w-3 cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[200px] text-xs\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n </div>\n);\n\nconst CreateTableForm: FC<CreateTableFormProps> = ({\n query,\n onClose,\n onRequestClose,\n editDataSource,\n allowMultipleStatements = false,\n showSchemaSelection = false,\n onAddOrUpdateSqlQuery,\n initialValues,\n onSubmittingChange,\n onRegisterCancel,\n}) => {\n const connector = useStoreWithSqlEditor((state) => state.db.connector);\n const createTableFromQuery = useStoreWithSqlEditor(\n (state) => state.db.createTableFromQuery,\n );\n const refreshTableSchemas = useStoreWithSqlEditor(\n (state) => state.db.refreshTableSchemas,\n );\n const tables = useStoreWithSqlEditor((state) => state.db.tables);\n const currentSchema = useStoreWithSqlEditor(\n (state) => state.db.currentSchema,\n );\n const currentDatabase = useStoreWithSqlEditor(\n (state) => state.db.currentDatabase,\n );\n\n // Extract unique schemas and databases from tables (excluding system ones)\n const {schemas, databases} = useMemo(() => {\n const schemaSet = new Set<string>();\n const databaseSet = new Set<string>();\n\n for (const table of tables) {\n if (table.table.schema && !table.table.schema.startsWith('pg_')) {\n schemaSet.add(table.table.schema);\n }\n if (table.table.database) {\n databaseSet.add(table.table.database);\n }\n }\n\n // Ensure current schema/database are included\n if (currentSchema) schemaSet.add(currentSchema);\n if (currentDatabase) databaseSet.add(currentDatabase);\n\n return {\n schemas: Array.from(schemaSet).sort(),\n databases: Array.from(databaseSet).sort(),\n };\n }, [tables, currentSchema, currentDatabase]);\n\n const form = useForm<FormValues>({\n resolver: zodResolver(formSchema as any),\n defaultValues: {\n tableName: editDataSource?.tableName ?? initialValues?.tableName ?? '',\n query: editDataSource?.sqlQuery ?? query.trim(),\n schema: initialValues?.schema ?? currentSchema,\n database: initialValues?.database ?? currentDatabase,\n replace: initialValues?.replace ?? false,\n temp: initialValues?.temp ?? false,\n view: initialValues?.view ?? false,\n },\n });\n\n const isSubmitting = form.formState.isSubmitting;\n const [isCancelling, setIsCancelling] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n };\n }, []);\n useEffect(() => {\n onSubmittingChange?.(isSubmitting);\n }, [isSubmitting, onSubmittingChange]);\n\n const onSubmit = useCallback(\n async (values: FormValues) => {\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n setIsCancelling(false);\n try {\n const {tableName, query, schema, database, replace, temp, view} =\n values;\n\n if (onAddOrUpdateSqlQuery) {\n // Legacy path: use the callback\n await onAddOrUpdateSqlQuery(\n tableName,\n query,\n editDataSource?.tableName,\n abortController.signal,\n );\n } else {\n // New path: call createTableFromQuery directly\n const qualifiedName =\n schema || database\n ? makeQualifiedTableName({table: tableName, schema, database})\n : tableName;\n\n await createTableFromQuery(qualifiedName, query, {\n replace,\n temp,\n view,\n allowMultipleStatements,\n abortSignal: abortController.signal,\n });\n\n // Refresh table schemas to show the new table\n await refreshTableSchemas();\n }\n\n form.reset();\n onClose();\n } catch (err) {\n if (isAbortError(err)) {\n return;\n }\n form.setError('root', {type: 'manual', message: `${err}`});\n } finally {\n abortControllerRef.current = null;\n setIsCancelling(false);\n }\n },\n [\n onAddOrUpdateSqlQuery,\n editDataSource?.tableName,\n createTableFromQuery,\n allowMultipleStatements,\n refreshTableSchemas,\n onClose,\n form,\n ],\n );\n\n const watchView = form.watch('view');\n const watchTemp = form.watch('temp');\n const watchTableName = form.watch('tableName');\n\n const handleCancel = useCallback(async () => {\n if (abortControllerRef.current) {\n setIsCancelling(true);\n abortControllerRef.current.abort();\n }\n }, []);\n useEffect(() => {\n onRegisterCancel?.(handleCancel);\n }, [handleCancel, onRegisterCancel]);\n\n return (\n <TooltipProvider delayDuration={200}>\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>\n {editDataSource\n ? 'Edit table query'\n : watchView\n ? 'Create view from query'\n : 'Create table from query'}\n </DialogTitle>\n {!editDataSource && (\n <DialogDescription>\n {watchView\n ? 'Create a new view from an SQL query.'\n : 'Create a new table from the results of an SQL query.'}\n </DialogDescription>\n )}\n </DialogHeader>\n\n {form.formState.errors.root && (\n <Alert variant=\"destructive\">\n <AlertDescription className=\"font-mono text-xs whitespace-pre-wrap\">\n {form.formState.errors.root.message}\n </AlertDescription>\n </Alert>\n )}\n\n {/* Table name, schema, database in single row */}\n <div className=\"flex items-start gap-3\">\n <FormField\n control={form.control}\n name=\"tableName\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-2\">\n <FormLabel className=\"text-xs\">\n {watchView ? 'View name' : 'Table name'}\n </FormLabel>\n <FormControl>\n <Input\n {...field}\n className=\"h-9 font-mono text-xs\"\n autoFocus\n disabled={isSubmitting}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {showSchemaSelection && (\n <>\n <FormField\n control={form.control}\n name=\"schema\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Schema</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={field.value}\n onChange={field.onChange}\n options={schemas}\n placeholder=\"Schema...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No schemas.\"\n disabled={isSubmitting}\n />\n </FormControl>\n </FormItem>\n )}\n />\n\n {(databases.length > 1 || watchTemp) && (\n <FormField\n control={form.control}\n name=\"database\"\n render={({field}) => (\n <FormItem className=\"min-w-0 flex-1\">\n <FormLabel className=\"text-xs\">Database</FormLabel>\n <FormControl>\n <SchemaCombobox\n value={watchTemp ? 'temp' : field.value}\n onChange={field.onChange}\n options={databases}\n placeholder=\"Database...\"\n searchPlaceholder=\"Search...\"\n emptyMessage=\"No databases.\"\n disabled={isSubmitting || watchTemp}\n />\n </FormControl>\n </FormItem>\n )}\n />\n )}\n </>\n )}\n </div>\n\n <FormField\n control={form.control}\n name=\"query\"\n render={({field}) => (\n <FormItem className=\"relative flex h-[200px] flex-col\">\n <FormControl>\n <SqlCodeMirrorEditor\n connector={connector}\n value={field.value}\n onChange={field.onChange}\n className=\"absolute inset-0 h-full w-full\"\n options={{\n lineWrapping: true,\n lineNumbers: false,\n }}\n readOnly={isSubmitting}\n />\n </FormControl>\n <FormMessage className=\"text-xs\" />\n </FormItem>\n )}\n />\n\n {/* Compact options row */}\n {!onAddOrUpdateSqlQuery && (\n <div className=\"flex items-center gap-6 rounded-md border px-3 py-2\">\n <FormField\n control={form.control}\n name=\"view\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-view\"\n label=\"View\"\n tooltip=\"Create a view instead of a table. Views store the query, not the data.\"\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n\n {/* <FormField\n control={form.control}\n name=\"temp\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-temp\"\n label=\"Temporary\"\n tooltip={`${watchView ? 'View' : 'Table'} will be deleted when the session ends.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n /> */}\n\n <FormField\n control={form.control}\n name=\"replace\"\n render={({field}) => (\n <OptionCheckbox\n id=\"create-table-replace\"\n label=\"Overwrite\"\n tooltip={`Overwrite existing ${watchView ? 'view' : 'table'} with the same name if it exists.`}\n checked={field.value}\n onCheckedChange={field.onChange}\n disabled={isSubmitting}\n />\n )}\n />\n </div>\n )}\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onRequestClose}>\n Close\n </Button>\n <Button\n type={isSubmitting ? 'button' : 'submit'}\n onClick={isSubmitting ? handleCancel : undefined}\n disabled={isSubmitting ? isCancelling : !watchTableName?.trim()}\n >\n {isSubmitting && <Spinner className=\"mr-2\" />}\n {isSubmitting\n ? isCancelling\n ? 'Cancelling...'\n : 'Cancel'\n : editDataSource\n ? 'Update'\n : 'Create'}\n </Button>\n </DialogFooter>\n </form>\n </Form>\n </TooltipProvider>\n );\n};\n\nconst CreateTableModal: FC<CreateTableModalProps> = (props) => {\n const {\n isOpen,\n onClose,\n query,\n editDataSource,\n allowMultipleStatements,\n showSchemaSelection,\n onAddOrUpdateSqlQuery,\n className,\n initialValues,\n } = props;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isConfirmOpen, setIsConfirmOpen] = useState(false);\n const cancelRef = useRef<(() => void) | null>(null);\n\n const resetState = useCallback(() => {\n setIsSubmitting(false);\n setIsConfirmOpen(false);\n cancelRef.current = null;\n }, []);\n\n const handleClose = useCallback(() => {\n resetState();\n onClose();\n }, [onClose, resetState]);\n\n const handleRequestClose = useCallback(() => {\n if (!isSubmitting) {\n handleClose();\n return;\n }\n setIsConfirmOpen(true);\n }, [handleClose, isSubmitting]);\n\n const handleConfirmClose = useCallback(() => {\n cancelRef.current?.();\n handleClose();\n }, [handleClose]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleRequestClose();\n }\n }}\n >\n <DialogContent className={cn('w-3xl max-w-[80%]', className)}>\n {isOpen && (\n <CreateTableForm\n query={query}\n onClose={handleClose}\n onRequestClose={handleRequestClose}\n editDataSource={editDataSource}\n allowMultipleStatements={allowMultipleStatements}\n showSchemaSelection={showSchemaSelection}\n onAddOrUpdateSqlQuery={onAddOrUpdateSqlQuery}\n initialValues={initialValues}\n onSubmittingChange={setIsSubmitting}\n onRegisterCancel={(cancel) => {\n cancelRef.current = cancel;\n }}\n />\n )}\n </DialogContent>\n <Dialog open={isConfirmOpen} onOpenChange={setIsConfirmOpen}>\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Cancel running query?</DialogTitle>\n <DialogDescription>\n A query is still running. Cancelling it will stop the query and\n close this dialog.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsConfirmOpen(false)}\n >\n Keep running\n </Button>\n <Button type=\"button\" onClick={handleConfirmClose}>\n Cancel & close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Dialog>\n );\n};\n\nexport default CreateTableModal;\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import type { FunctionSuggestion } from '@sqlrooms/db';
|
|
3
|
+
export interface FunctionDocumentationProps {
|
|
4
|
+
functions: FunctionSuggestion[];
|
|
5
|
+
}
|
|
6
|
+
export declare const FunctionDocumentation: FC<FunctionDocumentationProps>;
|
|
7
|
+
//# sourceMappingURL=FunctionDocumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionDocumentation.d.ts","sourceRoot":"","sources":["../../src/components/FunctionDocumentation.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAI9B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAuBhE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { zip, uniq } from 'es-toolkit';
|
|
3
|
+
import Markdown from 'react-markdown';
|
|
4
|
+
import remarkGfm from 'remark-gfm';
|
|
5
|
+
export const FunctionDocumentation = ({ functions, }) => {
|
|
6
|
+
const description = functions[0]?.description;
|
|
7
|
+
const examples = uniq(functions.flatMap((fn) => fn.examples).filter(Boolean));
|
|
8
|
+
if (functions.length === 0) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return (_jsxs("div", { className: "max-h-[400px] max-w-[600px] overflow-auto p-2 text-xs", children: [_jsx(FunctionSignatures, { functions: functions, overloadsToShow: 3 }), description && (_jsx("div", { className: "prose dark:prose-invert prose-xs mt-2 text-xs [&>*]:text-xs", children: _jsx(Markdown, { remarkPlugins: [remarkGfm], children: description }) })), examples.length > 0 && (_jsx(FunctionExamples, { examples: examples, examplesToShow: 3 }))] }));
|
|
12
|
+
};
|
|
13
|
+
const FunctionExamples = ({ examples, examplesToShow, }) => {
|
|
14
|
+
const displayExamples = examples.slice(0, examplesToShow).join('\n');
|
|
15
|
+
if (!displayExamples) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return (_jsxs("div", { className: "mt-2", children: [_jsx("p", { className: "font-bold", children: "Examples:" }), _jsx("pre", { className: "mt-1", children: displayExamples })] }));
|
|
19
|
+
};
|
|
20
|
+
const FunctionSignatures = ({ functions, overloadsToShow, }) => {
|
|
21
|
+
const overloadToShow = functions.slice(0, overloadsToShow);
|
|
22
|
+
const moreOverloadsCount = functions.length - overloadToShow.length;
|
|
23
|
+
return (_jsxs("pre", { children: [overloadToShow.map((fn, index) => (_jsx(FunctionSignature, { functionMetadata: fn }, index))), moreOverloadsCount > 0 && (_jsxs(_Fragment, { children: ['\n', "(+", moreOverloadsCount, " more", ' ', moreOverloadsCount === 1 ? 'overload' : 'overloads', ")"] }))] }));
|
|
24
|
+
};
|
|
25
|
+
const FunctionSignature = ({ functionMetadata }) => {
|
|
26
|
+
const { parameterTypes, parameters, returnType } = functionMetadata;
|
|
27
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { style: { color: 'var(--color-editor-function)' }, children: functionMetadata.name }), "(", _jsx(FunctionParameters, { parameters: parameters, parameterTypes: parameterTypes }), ")", returnType && (_jsxs(_Fragment, { children: [' ', "\u2192", ' ', _jsx("span", { style: { color: 'var(--color-editor-type)' }, children: returnType })] })), '\n'] }));
|
|
28
|
+
};
|
|
29
|
+
const FunctionParameters = ({ parameters, parameterTypes, }) => {
|
|
30
|
+
const tuples = zip(parameters ?? [], parameterTypes ?? []);
|
|
31
|
+
return (_jsx(_Fragment, { children: tuples.map(([parameterName, parameterType], index) => {
|
|
32
|
+
if (!parameterName && parameterType) {
|
|
33
|
+
return (_jsxs("span", { children: [_jsx("span", { style: { color: 'var(--color-editor-type)' }, children: parameterType }), index < tuples.length - 1 && ', '] }, index));
|
|
34
|
+
}
|
|
35
|
+
if (!parameterType && parameterName) {
|
|
36
|
+
return (_jsxs("span", { children: [parameterName, index < tuples.length - 1 && ', '] }, index));
|
|
37
|
+
}
|
|
38
|
+
if (!parameterName || !parameterType) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return (_jsxs("span", { children: [parameterName, ":", ' ', _jsx("span", { style: { color: 'var(--color-editor-type)' }, children: parameterType }), index < tuples.length - 1 && ', '] }, index));
|
|
42
|
+
}) }));
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=FunctionDocumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionDocumentation.js","sourceRoot":"","sources":["../../src/components/FunctionDocumentation.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2022 Foursquare Labs, Inc. All Rights Reserved.\n\nimport type {FC} from 'react';\nimport {zip, uniq} from 'es-toolkit';\nimport Markdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport type {FunctionSuggestion} from '@sqlrooms/db';\n\nexport interface FunctionDocumentationProps {\n functions: FunctionSuggestion[];\n}\n\nexport const FunctionDocumentation: FC<FunctionDocumentationProps> = ({\n functions,\n}) => {\n const description = functions[0]?.description;\n const examples = uniq(functions.flatMap((fn) => fn.examples).filter(Boolean));\n\n if (functions.length === 0) {\n return null;\n }\n\n return (\n <div className=\"max-h-[400px] max-w-[600px] overflow-auto p-2 text-xs\">\n <FunctionSignatures functions={functions} overloadsToShow={3} />\n {description && (\n <div className=\"prose dark:prose-invert prose-xs mt-2 text-xs [&>*]:text-xs\">\n <Markdown remarkPlugins={[remarkGfm]}>{description}</Markdown>\n </div>\n )}\n {examples.length > 0 && (\n <FunctionExamples examples={examples} examplesToShow={3} />\n )}\n </div>\n );\n};\n\ninterface FunctionExamplesProps {\n examples: (string | null | undefined)[];\n examplesToShow: number;\n}\n\nconst FunctionExamples: FC<FunctionExamplesProps> = ({\n examples,\n examplesToShow,\n}) => {\n const displayExamples = examples.slice(0, examplesToShow).join('\\n');\n\n if (!displayExamples) {\n return null;\n }\n\n return (\n <div className=\"mt-2\">\n <p className=\"font-bold\">Examples:</p>\n <pre className=\"mt-1\">{displayExamples}</pre>\n </div>\n );\n};\n\ninterface FunctionSignaturesProps {\n functions: FunctionSuggestion[];\n overloadsToShow: number;\n}\n\nconst FunctionSignatures: FC<FunctionSignaturesProps> = ({\n functions,\n overloadsToShow,\n}) => {\n const overloadToShow = functions.slice(0, overloadsToShow);\n const moreOverloadsCount = functions.length - overloadToShow.length;\n\n return (\n <pre>\n {overloadToShow.map((fn, index) => (\n <FunctionSignature key={index} functionMetadata={fn} />\n ))}\n {moreOverloadsCount > 0 && (\n <>\n {'\\n'}(+{moreOverloadsCount} more{' '}\n {moreOverloadsCount === 1 ? 'overload' : 'overloads'})\n </>\n )}\n </pre>\n );\n};\n\ninterface FunctionSignatureProps {\n functionMetadata: FunctionSuggestion;\n}\n\nconst FunctionSignature: FC<FunctionSignatureProps> = ({functionMetadata}) => {\n const {parameterTypes, parameters, returnType} = functionMetadata;\n\n return (\n <>\n <span style={{color: 'var(--color-editor-function)'}}>\n {functionMetadata.name}\n </span>\n (\n <FunctionParameters\n parameters={parameters}\n parameterTypes={parameterTypes}\n />\n )\n {returnType && (\n <>\n {' '}\n →{' '}\n <span style={{color: 'var(--color-editor-type)'}}>{returnType}</span>\n </>\n )}\n {'\\n'}\n </>\n );\n};\n\ninterface FunctionParametersProps {\n parameters?: (string | null | undefined)[] | null;\n parameterTypes?: (string | null | undefined)[] | null;\n}\n\nconst FunctionParameters: FC<FunctionParametersProps> = ({\n parameters,\n parameterTypes,\n}) => {\n const tuples = zip(parameters ?? [], parameterTypes ?? []);\n\n return (\n <>\n {tuples.map(\n (\n [parameterName, parameterType]: [\n string | null | undefined,\n string | null | undefined,\n ],\n index: number,\n ) => {\n if (!parameterName && parameterType) {\n return (\n <span key={index}>\n <span style={{color: 'var(--color-editor-type)'}}>\n {parameterType}\n </span>\n {index < tuples.length - 1 && ', '}\n </span>\n );\n }\n\n if (!parameterType && parameterName) {\n return (\n <span key={index}>\n {parameterName}\n {index < tuples.length - 1 && ', '}\n </span>\n );\n }\n\n if (!parameterName || !parameterType) {\n return null;\n }\n\n return (\n <span key={index}>\n {parameterName}:{' '}\n <span style={{color: 'var(--color-editor-type)'}}>\n {parameterType}\n </span>\n {index < tuples.length - 1 && ', '}\n </span>\n );\n },\n )}\n </>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryEditorPanelActions.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanelActions.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QueryEditorPanelActions.d.ts","sourceRoot":"","sources":["../../src/components/QueryEditorPanelActions.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CA2ClE,CAAC"}
|