@quillsql/react 2.11.9 → 2.11.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/BarList.d.ts +2 -1
- package/dist/cjs/BarList.d.ts.map +1 -1
- package/dist/cjs/BarList.js +9 -3
- package/dist/cjs/Chart.d.ts +11 -5
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +57 -20
- package/dist/cjs/ChartBuilder.d.ts +16 -1
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +423 -281
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +1 -0
- package/dist/cjs/Dashboard.d.ts +2 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +6 -20
- package/dist/cjs/PieChart.d.ts.map +1 -1
- package/dist/cjs/PieChart.js +2 -1
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/QuillProvider.js +15 -1
- package/dist/cjs/ReportBuilder.d.ts +4 -3
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +238 -108
- package/dist/cjs/SQLEditor.d.ts +2 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +61 -90
- package/dist/cjs/components/Chart/BarChart.d.ts +2 -1
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +10 -3
- package/dist/cjs/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltipFrame.js +1 -0
- package/dist/cjs/components/Chart/LineChart.d.ts +3 -4
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +35 -15
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +0 -3
- package/dist/cjs/components/Dashboard/DashboardSection.js +4 -4
- package/dist/cjs/components/Dashboard/DashboardSectionContainer.js +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +8 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +12 -3
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts +12 -1
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +105 -9
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +78 -3
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelect.js +7 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +3 -1
- package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +3 -3
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +3 -0
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +43 -0
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +14 -7
- package/dist/cjs/components/ReportBuilder/ast.d.ts +4 -0
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +10 -1
- package/dist/cjs/components/ReportBuilder/bigDateMap.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/bigDateMap.js +2 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts +4 -1
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +45 -13
- package/dist/cjs/components/ReportBuilder/pivot.d.ts +3 -0
- package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +7 -5
- package/dist/cjs/components/ReportBuilder/util.d.ts +1 -0
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +55 -6
- package/dist/cjs/components/UiComponents.d.ts +3 -1
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +4 -4
- package/dist/cjs/hooks/useQuill.js +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +2 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +91 -91
- package/dist/cjs/utils/axisFormatter.js +74 -30
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +10 -0
- package/dist/cjs/utils/getDomain.js +25 -4
- package/dist/cjs/utils/valueFormatter.d.ts +2 -1
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/BarList.d.ts +2 -1
- package/dist/esm/BarList.d.ts.map +1 -1
- package/dist/esm/BarList.js +9 -3
- package/dist/esm/Chart.d.ts +11 -5
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +57 -20
- package/dist/esm/ChartBuilder.d.ts +16 -1
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +421 -280
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +1 -0
- package/dist/esm/Dashboard.d.ts +2 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +6 -20
- package/dist/esm/PieChart.d.ts.map +1 -1
- package/dist/esm/PieChart.js +2 -1
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/QuillProvider.js +16 -2
- package/dist/esm/ReportBuilder.d.ts +4 -3
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +242 -112
- package/dist/esm/SQLEditor.d.ts +2 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +62 -91
- package/dist/esm/components/Chart/BarChart.d.ts +2 -1
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +10 -3
- package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltipFrame.js +1 -0
- package/dist/esm/components/Chart/LineChart.d.ts +3 -4
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +35 -15
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +0 -3
- package/dist/esm/components/Dashboard/DashboardSection.js +4 -4
- package/dist/esm/components/Dashboard/DashboardSectionContainer.js +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +8 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +13 -4
- package/dist/esm/components/Dashboard/MetricComponent.d.ts +12 -1
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +101 -8
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +74 -2
- package/dist/esm/components/QuillSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillSelect.js +7 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +3 -1
- package/dist/esm/components/ReportBuilder/AddColumnPopover.js +3 -3
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +3 -0
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +38 -0
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +15 -8
- package/dist/esm/components/ReportBuilder/ast.d.ts +4 -0
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ast.js +8 -0
- package/dist/esm/components/ReportBuilder/bigDateMap.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/bigDateMap.js +2 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts +4 -1
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +45 -13
- package/dist/esm/components/ReportBuilder/pivot.d.ts +3 -0
- package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +7 -5
- package/dist/esm/components/ReportBuilder/util.d.ts +1 -0
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +53 -5
- package/dist/esm/components/UiComponents.d.ts +3 -1
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +4 -4
- package/dist/esm/hooks/useQuill.js +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +2 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +91 -91
- package/dist/esm/utils/axisFormatter.js +74 -30
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +10 -0
- package/dist/esm/utils/getDomain.js +25 -4
- package/dist/esm/utils/valueFormatter.d.ts +2 -1
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useContext, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useContext, useEffect, useRef, useState, } from 'react';
|
|
3
3
|
import { MemoizedButton, MemoizedCheckbox, MemoizedHeader, MemoizedLabel, MemoizedPopover, MemoizedSecondaryButton, MemoizedText, } from './components/UiComponents';
|
|
4
4
|
import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
5
5
|
import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
6
6
|
import { CSS as DND_CSS } from '@dnd-kit/utilities';
|
|
7
7
|
import { getQuarter } from 'date-fns';
|
|
8
8
|
import { ClientContext, ThemeContext } from './Context';
|
|
9
|
-
import { getTableNames, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
9
|
+
import { getTableAliases, getTableNames, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
10
10
|
import { ChartBuilderWithModal } from './ChartBuilder';
|
|
11
|
-
import { QuillPopover,
|
|
11
|
+
import { QuillPopover, QuillTabs, QuillTextInput, QuillSidebar, CustomContainer, QuillHandleButton, QuillSelectColumn, QuillDraggableColumn, QuillButtonLoadingState, QuillTableLoadingState, QuillSidebarHeading, QuillSidebarSubHeading, QuillFilterPopover, QuillSortPopover, DEFAULT_TAB_OPTIONS, TagWrapper, EditPopover, AddFilterPopover, } from './components/ReportBuilder/ui';
|
|
12
12
|
import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
|
|
13
13
|
import { convertBigQuery, convertGroupBy, convertRemoveSimpleParentheses, convertStringComparison, convertWildcardColumns, } from './components/ReportBuilder/convert';
|
|
14
|
-
import { deepCopy, formatDateComparisonNode, getDateFilterInfo, getInTheCurrentIntervalSentence, getInTheLastIntervalSentence, getInThePreviousIntervalSentence, getPostgresBasicType, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, isTopLevelBoolean, showNodeAsRow, tryConvertDateEquality, } from './components/ReportBuilder/util';
|
|
14
|
+
import { deepCopy, formatDateComparisonNode, getDateFilterInfo, getInTheCurrentIntervalSentence, getInTheLastIntervalSentence, getInThePreviousIntervalSentence, getPostgresBasicType, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, isTopLevelBoolean, showNodeAsRow, tryConvertDateEquality, removeNonSelectedTableReferences, } from './components/ReportBuilder/util';
|
|
15
15
|
import { getDefaultOperatorSubtrees, OPERATOR_GROUPS, } from './components/ReportBuilder/operators';
|
|
16
16
|
import { hashCode } from './utils/crypto';
|
|
17
17
|
import { DATE_FMT, DAY_OF_WEEK, defaultAST, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, MONTH_OF_YEAR, } from './components/ReportBuilder/constants';
|
|
@@ -20,6 +20,9 @@ import { AddSortPopover, SortSentence, } from './components/ReportBuilder/AddSor
|
|
|
20
20
|
import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
|
|
21
21
|
import { PivotCard } from './internals/ReportBuilder/PivotList';
|
|
22
22
|
import QuillTable from './components/QuillTable';
|
|
23
|
+
import { QuillSelectComponent } from './components/QuillSelect';
|
|
24
|
+
import { snakeCaseToTitleCase } from './utils/textProcessing';
|
|
25
|
+
import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
|
|
23
26
|
/**
|
|
24
27
|
* Quill Report Builder
|
|
25
28
|
*
|
|
@@ -28,7 +31,7 @@ import QuillTable from './components/QuillTable';
|
|
|
28
31
|
* they can click a button and add that report to their dashboard or export it
|
|
29
32
|
* as a CSV.
|
|
30
33
|
*/
|
|
31
|
-
export default function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, TextInput = QuillTextInput, Select =
|
|
34
|
+
export default function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, TextInput = QuillTextInput, Select = QuillSelectComponent, Table = QuillTable, Popover = QuillPopover, Tabs = QuillTabs, Checkbox = MemoizedCheckbox, Sidebar = QuillSidebar, Container = CustomContainer, HandleButton = QuillHandleButton, SelectColumn = QuillSelectColumn, DraggableColumn = QuillDraggableColumn, ButtonLoadingState = QuillButtonLoadingState, TableLoadingState = QuillTableLoadingState, SidebarHeading = QuillSidebarHeading, SidebarSubHeading = QuillSidebarSubHeading, FilterPopover = QuillFilterPopover, SortPopover = QuillSortPopover, Label = MemoizedLabel, Header = MemoizedHeader, Text = MemoizedText, PivotPopover = MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
|
|
32
35
|
const [aiPrompt, setAiPrompt] = useState('');
|
|
33
36
|
const [errorMessage, setErrorMessage] = useState('');
|
|
34
37
|
const [baseAst, setBaseAst] = useState(null);
|
|
@@ -84,7 +87,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
84
87
|
return columns.map((col) => ({
|
|
85
88
|
label: col,
|
|
86
89
|
name: col,
|
|
87
|
-
displayName: col,
|
|
90
|
+
displayName: snakeCaseToTitleCase(col),
|
|
88
91
|
field: col,
|
|
89
92
|
format: getPostgresBasicType(fields.find((f) => f.name === col))?.replace('number', 'whole_number') || 'string',
|
|
90
93
|
fieldType: schemaTables
|
|
@@ -116,6 +119,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
116
119
|
// setUniqueValues({});
|
|
117
120
|
setPivot(null);
|
|
118
121
|
setPivotData(null);
|
|
122
|
+
setRecommendedPivots([]);
|
|
119
123
|
}, 0);
|
|
120
124
|
};
|
|
121
125
|
useEffect(() => {
|
|
@@ -243,14 +247,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
243
247
|
'Content-Type': 'application/json',
|
|
244
248
|
},
|
|
245
249
|
body: JSON.stringify({
|
|
246
|
-
orgId:
|
|
250
|
+
orgId: client.customerId,
|
|
247
251
|
publicKey: client.publicKey,
|
|
248
252
|
query: query,
|
|
249
253
|
}),
|
|
250
254
|
});
|
|
251
255
|
const data = await response.json();
|
|
252
256
|
if (data.errorMessage) {
|
|
253
|
-
console.error(data.errorMessage);
|
|
257
|
+
// console.error(data.errorMessage);
|
|
254
258
|
return null;
|
|
255
259
|
}
|
|
256
260
|
const options = data.rows.map((r) => r[column]);
|
|
@@ -267,19 +271,36 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
267
271
|
};
|
|
268
272
|
const fetchSchema = async () => {
|
|
269
273
|
try {
|
|
270
|
-
const response = await fetch(
|
|
274
|
+
const response = await fetch(`${client.queryEndpoint}`, {
|
|
275
|
+
method: 'POST',
|
|
276
|
+
headers: {
|
|
277
|
+
...client.queryHeaders,
|
|
278
|
+
'Content-Type': 'application/json',
|
|
279
|
+
},
|
|
280
|
+
body: JSON.stringify({
|
|
281
|
+
metadata: {
|
|
282
|
+
clientId: client.publicKey,
|
|
283
|
+
publicKey: client.publicKey,
|
|
284
|
+
task: 'schema',
|
|
285
|
+
removeCustomerField: true,
|
|
286
|
+
},
|
|
287
|
+
}),
|
|
288
|
+
});
|
|
289
|
+
const results = await response.json();
|
|
271
290
|
// Filter out hidden columns on tables back from schema2.
|
|
272
|
-
const tables =
|
|
273
|
-
for (const table of tables) {
|
|
274
|
-
table.columns = table.columns.filter((column) =>
|
|
275
|
-
// Quick and dirty fix for removing org ids from response.
|
|
276
|
-
// TODO: Fix this on the backend or something.
|
|
277
|
-
column.isVisible && column.displayName !== 'pm_company_id');
|
|
278
|
-
}
|
|
291
|
+
const tables = results.data.tables || results.data.data.tables;
|
|
279
292
|
setSchemaTables(tables ?? []);
|
|
280
|
-
setOrderedColumnNames((tables ?? [])
|
|
281
|
-
|
|
282
|
-
.
|
|
293
|
+
setOrderedColumnNames((tables ?? []).flatMap((table) => table.columns
|
|
294
|
+
.map((c) => `${table.name}.${c.name}`)
|
|
295
|
+
.sort((a, b) => {
|
|
296
|
+
const aIsId = a.endsWith('.id') || a.endsWith('_id');
|
|
297
|
+
const bIsId = b.endsWith('.id') || b.endsWith('_id');
|
|
298
|
+
if (aIsId && !bIsId)
|
|
299
|
+
return 1;
|
|
300
|
+
if (bIsId && !aIsId)
|
|
301
|
+
return -1;
|
|
302
|
+
return 0;
|
|
303
|
+
})));
|
|
283
304
|
// Fetch all the unique values in parallel
|
|
284
305
|
const pendingFetches = [];
|
|
285
306
|
for (let table of tables ?? []) {
|
|
@@ -304,6 +325,12 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
304
325
|
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
305
326
|
setUniqueValues(newUniqueValues);
|
|
306
327
|
}
|
|
328
|
+
if (initialTableName) {
|
|
329
|
+
const columnsForTable = tables
|
|
330
|
+
.find((t) => t.name === initialTableName)
|
|
331
|
+
?.columns.map((c) => c.name);
|
|
332
|
+
await handleAsk(`get ${columnsForTable} from ${initialTableName}`);
|
|
333
|
+
}
|
|
307
334
|
}
|
|
308
335
|
catch (error) {
|
|
309
336
|
console.error(error);
|
|
@@ -606,6 +633,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
606
633
|
};
|
|
607
634
|
// Function to handle operator changes
|
|
608
635
|
const handleOperatorChange = (value, node, keyPrefix, column = null) => {
|
|
636
|
+
if (!keyPrefix) {
|
|
637
|
+
setTopLevelBinaryOperator(value);
|
|
638
|
+
}
|
|
609
639
|
if (isPending) {
|
|
610
640
|
updateActiveItem([{ path: keyPrefix + 'operator', value }], { column });
|
|
611
641
|
}
|
|
@@ -703,7 +733,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
703
733
|
'node.right.args.value.1.column') ??
|
|
704
734
|
(node.right?.args?.value[1]?.value &&
|
|
705
735
|
'node.right.args.value.1.value');
|
|
706
|
-
return (_jsxs("div", { style: { display: 'flex', gap: 20 }, children: [_jsx(Select, { value: dateColumn, onChange: (value) => {
|
|
736
|
+
return (_jsxs("div", { style: { display: 'flex', gap: 20 }, children: [_jsx(Select, { theme: theme, value: dateColumn, onChange: (value) => {
|
|
707
737
|
const columnType = getColumnTypeByName(value);
|
|
708
738
|
if (isDateishColumnType(columnType)) {
|
|
709
739
|
// handleChange(value, keyPrefix + dateColumnPath, "text");
|
|
@@ -720,9 +750,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
720
750
|
handleReplaceSubtree(keyPrefix, newSubtree);
|
|
721
751
|
}
|
|
722
752
|
}, options: getAllPossibleColumns().map((column) => ({
|
|
723
|
-
label: column.displayName,
|
|
753
|
+
label: snakeCaseToTitleCase(column.displayName),
|
|
724
754
|
value: column.name,
|
|
725
|
-
})) }), _jsx(Select, { value: dateFilterType, onChange: (value) => {
|
|
755
|
+
})) }), _jsx(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
|
|
726
756
|
if (value === dateFilterType)
|
|
727
757
|
return null;
|
|
728
758
|
let newSubtree = {};
|
|
@@ -768,7 +798,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
768
798
|
path: keyPrefix + intervalPath,
|
|
769
799
|
},
|
|
770
800
|
]));
|
|
771
|
-
} })), _jsx(Select, { value: intervalType, onChange: (value) => {
|
|
801
|
+
} })), _jsx(Select, { theme: theme, value: intervalType, onChange: (value) => {
|
|
772
802
|
if (intervalPaths.length === 1) {
|
|
773
803
|
handleChangeText([
|
|
774
804
|
{
|
|
@@ -814,7 +844,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
814
844
|
else if (isInTheLastInterval(node, client.databaseType)) {
|
|
815
845
|
const { dateColumn, dateFilterType, intervalCount, intervalType } = getDateFilterInfo(node);
|
|
816
846
|
const options = getAllPossibleColumns().map((column) => ({
|
|
817
|
-
label: column.displayName,
|
|
847
|
+
label: snakeCaseToTitleCase(column.displayName),
|
|
818
848
|
value: column.name,
|
|
819
849
|
}));
|
|
820
850
|
const plural = node.right.args.value[1].expr.value > 1 ? 's' : '';
|
|
@@ -823,7 +853,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
823
853
|
flexDirection: 'row',
|
|
824
854
|
alignItems: 'center',
|
|
825
855
|
gap: 20,
|
|
826
|
-
}, children: [_jsx("div", { children: _jsx(Select, { value: node.left.column, onChange: (value) => {
|
|
856
|
+
}, children: [_jsx("div", { children: _jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
|
|
827
857
|
const columnType = getColumnTypeByName(value);
|
|
828
858
|
if (isDateishColumnType(columnType)) {
|
|
829
859
|
// handleChange(value, keyPrefix + dateColumnPath, "text");
|
|
@@ -839,7 +869,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
839
869
|
newSubtree.left.args.value[0].column = value;
|
|
840
870
|
handleReplaceSubtree(keyPrefix, newSubtree);
|
|
841
871
|
}
|
|
842
|
-
}, options: options }) }), _jsx(Select, { value: dateFilterType, onChange: (value) => {
|
|
872
|
+
}, options: options }) }), _jsx(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
|
|
843
873
|
handleOperatorChange(value, node, keyPrefix, dateColumn);
|
|
844
874
|
}, options: [
|
|
845
875
|
{ label: 'in the last', value: 'IN_THE_LAST' },
|
|
@@ -853,7 +883,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
853
883
|
path: keyPrefix + 'right.args.value||1.expr.value',
|
|
854
884
|
},
|
|
855
885
|
]);
|
|
856
|
-
} }), _jsx("div", { children: _jsx(Select, { value: node.right.args.value[1].unit, onChange: (value) => handleChange([
|
|
886
|
+
} }), _jsx("div", { children: _jsx(Select, { theme: theme, value: node.right.args.value[1].unit, onChange: (value) => handleChange([
|
|
857
887
|
{ value, path: keyPrefix + 'right.args.value||1.unit' },
|
|
858
888
|
]), options: [
|
|
859
889
|
{ label: `year${plural}`, value: '* 365 DAY' },
|
|
@@ -865,7 +895,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
865
895
|
else if (isTheCurrentInterval(node, client.databaseType)) {
|
|
866
896
|
const { dateFilterType } = getDateFilterInfo(node);
|
|
867
897
|
const options = getAllPossibleColumns().map((column) => ({
|
|
868
|
-
label: column.displayName,
|
|
898
|
+
label: snakeCaseToTitleCase(column.displayName),
|
|
869
899
|
value: column.name,
|
|
870
900
|
}));
|
|
871
901
|
return (_jsxs("div", { style: {
|
|
@@ -873,7 +903,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
873
903
|
flexDirection: 'row',
|
|
874
904
|
alignItems: 'center',
|
|
875
905
|
gap: 20,
|
|
876
|
-
}, children: [_jsx(Select, { value: node.left.column, onChange: (value) => {
|
|
906
|
+
}, children: [_jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
|
|
877
907
|
const columnType = getColumnTypeByName(value);
|
|
878
908
|
if (isDateishColumnType(columnType)) {
|
|
879
909
|
// handleChange(value, keyPrefix + dateColumnPath, "text");
|
|
@@ -889,14 +919,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
889
919
|
newSubtree.left.args.value[0].column = value;
|
|
890
920
|
handleReplaceSubtree(keyPrefix, newSubtree);
|
|
891
921
|
}
|
|
892
|
-
}, options: options }), _jsx(Select, { value: 'IN_THE_CURRENT', onChange: (value) => {
|
|
922
|
+
}, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_CURRENT', onChange: (value) => {
|
|
893
923
|
handleOperatorChange(value, node, keyPrefix, node.left.column);
|
|
894
924
|
}, options: [
|
|
895
925
|
{ label: 'in the last', value: 'IN_THE_LAST' },
|
|
896
926
|
{ label: 'in the previous', value: 'IN_THE_PREVIOUS' },
|
|
897
927
|
{ label: 'in the current', value: 'IN_THE_CURRENT' },
|
|
898
928
|
// { label: 'equals', value: 'equals' },
|
|
899
|
-
] }), _jsx(Select, { value: node.left.args.value[1].column, onChange: (value) => {
|
|
929
|
+
] }), _jsx(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
|
|
900
930
|
handleChange([
|
|
901
931
|
{ value, path: 'right.args.value||1.column' },
|
|
902
932
|
{ value, path: 'left.args.value||1.column' },
|
|
@@ -910,7 +940,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
910
940
|
}
|
|
911
941
|
else if (isThePreviousInterval(node, client.databaseType)) {
|
|
912
942
|
const options = getAllPossibleColumns().map((column) => ({
|
|
913
|
-
label: column.displayName,
|
|
943
|
+
label: snakeCaseToTitleCase(column.displayName),
|
|
914
944
|
value: column.name,
|
|
915
945
|
}));
|
|
916
946
|
return (_jsxs("div", { style: {
|
|
@@ -918,7 +948,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
918
948
|
flexDirection: 'row',
|
|
919
949
|
alignItems: 'center',
|
|
920
950
|
gap: 20,
|
|
921
|
-
}, children: [_jsx(Select, { value: node.left.column, onChange: (value) => {
|
|
951
|
+
}, children: [_jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
|
|
922
952
|
const columnType = getColumnTypeByName(value);
|
|
923
953
|
if (isDateishColumnType(columnType)) {
|
|
924
954
|
// handleChange(value, keyPrefix + dateColumnPath, "text");
|
|
@@ -934,14 +964,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
934
964
|
newSubtree.left.args.value[0].column = value;
|
|
935
965
|
handleReplaceSubtree(keyPrefix, newSubtree);
|
|
936
966
|
}
|
|
937
|
-
}, opt: true, options: options }), _jsx(Select, { value: 'IN_THE_PREVIOUS', onChange: (value) => {
|
|
967
|
+
}, opt: true, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
|
|
938
968
|
handleOperatorChange(value, node, keyPrefix, node.left.column);
|
|
939
969
|
}, options: [
|
|
940
970
|
{ label: 'in the last', value: 'IN_THE_LAST' },
|
|
941
971
|
{ label: 'in the previous', value: 'IN_THE_PREVIOUS' },
|
|
942
972
|
{ label: 'in the current', value: 'IN_THE_CURRENT' },
|
|
943
973
|
// { label: 'equals', value: 'equals' },
|
|
944
|
-
] }), _jsx(Select, { value: node.left.args.value[1].column, onChange: (value) => {
|
|
974
|
+
] }), _jsx(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
|
|
945
975
|
const dayConversion = {
|
|
946
976
|
YEAR: 365,
|
|
947
977
|
QUARTER: 90,
|
|
@@ -971,7 +1001,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
971
1001
|
}
|
|
972
1002
|
else if (isColumnComparison(node)) {
|
|
973
1003
|
const options = getAllPossibleColumns().map((column) => ({
|
|
974
|
-
label: column.displayName,
|
|
1004
|
+
label: snakeCaseToTitleCase(column.displayName),
|
|
975
1005
|
value: column.name,
|
|
976
1006
|
}));
|
|
977
1007
|
// grab the value of the left child of the column comparison
|
|
@@ -1025,6 +1055,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1025
1055
|
gap: 12,
|
|
1026
1056
|
flexDirection: 'column',
|
|
1027
1057
|
width: '100%',
|
|
1058
|
+
padding: '6px 0px',
|
|
1028
1059
|
}, children: [_jsxs("div", { style: {
|
|
1029
1060
|
display: 'flex',
|
|
1030
1061
|
gap: 20,
|
|
@@ -1033,7 +1064,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1033
1064
|
? 'row'
|
|
1034
1065
|
: 'column',
|
|
1035
1066
|
width: '100%',
|
|
1036
|
-
}, children: [_jsx(Select, { style: { width: 'min-content' }, value: leftChildValue, onChange: (value) => {
|
|
1067
|
+
}, children: [_jsx(Select, { theme: theme, style: { width: 'min-content' }, value: leftChildValue, onChange: (value) => {
|
|
1037
1068
|
const columnType = getColumnTypeByName(value);
|
|
1038
1069
|
if (isDateishColumnType(columnType)) {
|
|
1039
1070
|
handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
|
|
@@ -1048,7 +1079,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1048
1079
|
newSubtree.left.args.value[0].column = value;
|
|
1049
1080
|
handleReplaceSubtree(keyPrefix, newSubtree);
|
|
1050
1081
|
}
|
|
1051
|
-
}, options: options }), operatorOptions.length > 0 && (_jsx(Select, { value: node.operator, onChange: (value) => {
|
|
1082
|
+
}, options: options }), operatorOptions.length > 0 && (_jsx(Select, { theme: theme, value: node.operator, onChange: (value) => {
|
|
1052
1083
|
handleOperatorChange(value, node, keyPrefix, leftChildValue);
|
|
1053
1084
|
}, style: { width: 'min-content' }, options: operatorOptions })), node.right &&
|
|
1054
1085
|
node.right.type !== 'expr_list' &&
|
|
@@ -1078,7 +1109,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1078
1109
|
justifyContent: 'space-between',
|
|
1079
1110
|
flexDirection: showNodeAsRow(node, formData) ? 'row' : 'column',
|
|
1080
1111
|
width: '100%',
|
|
1081
|
-
}, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), _jsx(Select, { value: node.operator, onChange: (value) => {
|
|
1112
|
+
}, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), _jsx(Select, { theme: theme, value: node.operator, onChange: (value) => {
|
|
1082
1113
|
handleOperatorChange(value, node, keyPrefix);
|
|
1083
1114
|
}, style: { width: `100%` }, options: [
|
|
1084
1115
|
// { label: `and`, value: "AND" },
|
|
@@ -1120,10 +1151,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1120
1151
|
}
|
|
1121
1152
|
case 'column_ref': {
|
|
1122
1153
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1123
|
-
label: column.displayName,
|
|
1154
|
+
label: snakeCaseToTitleCase(column.displayName),
|
|
1124
1155
|
value: column.name,
|
|
1125
1156
|
}));
|
|
1126
|
-
return (_jsx(Select, { style: { width: '120px' }, value: node.column ?? options[0]?.value, onChange: (value) => {
|
|
1157
|
+
return (_jsx(Select, { theme: theme, style: { width: '120px' }, value: node.column ?? options[0]?.value, onChange: (value) => {
|
|
1127
1158
|
handleChange([{ value, path: keyPrefix + 'column' }]);
|
|
1128
1159
|
}, options: options }));
|
|
1129
1160
|
}
|
|
@@ -1247,10 +1278,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1247
1278
|
isInTheCurrentIntervalSentence ??
|
|
1248
1279
|
isInTheLastIntervalSentence ??
|
|
1249
1280
|
isInThePreviousIntervalSentence ?? (_jsxs(_Fragment, { children: [node.left &&
|
|
1250
|
-
renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: Select })) : null, node.right &&
|
|
1281
|
+
renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: Select })) : null, node.right &&
|
|
1251
1282
|
renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
|
|
1252
1283
|
case 'column_ref':
|
|
1253
|
-
return node.column;
|
|
1284
|
+
return snakeCaseToTitleCase(node.column);
|
|
1254
1285
|
case 'expr_list':
|
|
1255
1286
|
if (node.value.length === 1) {
|
|
1256
1287
|
const subQuery = renderSentence(formData, node.value[0]);
|
|
@@ -1282,10 +1313,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1282
1313
|
if (node.args.value.length < 1)
|
|
1283
1314
|
return null;
|
|
1284
1315
|
if (node.args.value[0].value) {
|
|
1285
|
-
return node.args.value[0].value.replaceAll('%', '');
|
|
1316
|
+
return snakeCaseToTitleCase(node.args.value[0].value.replaceAll('%', ''));
|
|
1286
1317
|
}
|
|
1287
1318
|
if (node.args.value[0].column)
|
|
1288
|
-
return node.args.value[0].column.replaceAll('%', '');
|
|
1319
|
+
return snakeCaseToTitleCase(node.args.value[0].column.replaceAll('%', ''));
|
|
1289
1320
|
return null;
|
|
1290
1321
|
}
|
|
1291
1322
|
if (node.name.toLowerCase() === 'current_date' ||
|
|
@@ -1322,10 +1353,22 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1322
1353
|
const tableNamesInQuery = baseAst.from.map((tbl) => tbl.table);
|
|
1323
1354
|
return schemaTables
|
|
1324
1355
|
.filter((t) => tableNamesInQuery.includes(t.displayName))
|
|
1325
|
-
.flatMap((table) => table.columns
|
|
1356
|
+
.flatMap((table) => table.columns
|
|
1357
|
+
.map((c) => ({
|
|
1326
1358
|
...c,
|
|
1327
1359
|
table: table.displayName,
|
|
1328
|
-
}))
|
|
1360
|
+
}))
|
|
1361
|
+
.sort((a, b) => {
|
|
1362
|
+
const aIsId = a.name.toLowerCase() === 'id' ||
|
|
1363
|
+
a.name.toLowerCase().endsWith('_id');
|
|
1364
|
+
const bIsId = b.name.toLowerCase() === 'id' ||
|
|
1365
|
+
b.name.toLowerCase().endsWith('_id');
|
|
1366
|
+
if (aIsId && !bIsId)
|
|
1367
|
+
return 1;
|
|
1368
|
+
if (bIsId && !aIsId)
|
|
1369
|
+
return -1;
|
|
1370
|
+
return 0;
|
|
1371
|
+
}));
|
|
1329
1372
|
};
|
|
1330
1373
|
const getDateColumns = () => {
|
|
1331
1374
|
const allColumns = getAllPossibleColumns();
|
|
@@ -1376,26 +1419,6 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1376
1419
|
},
|
|
1377
1420
|
as: null,
|
|
1378
1421
|
});
|
|
1379
|
-
const SortableItem = ({ id, label, setSelectedColumns, selectedColumns, }) => {
|
|
1380
|
-
const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: id });
|
|
1381
|
-
const style = {
|
|
1382
|
-
transform: DND_CSS.Transform.toString(transform),
|
|
1383
|
-
transition,
|
|
1384
|
-
};
|
|
1385
|
-
const handleSelect = () => {
|
|
1386
|
-
setSelectedColumns((selectedColumns) => {
|
|
1387
|
-
if (selectedColumns.includes(id)) {
|
|
1388
|
-
return selectedColumns.filter((column) => column !== id);
|
|
1389
|
-
}
|
|
1390
|
-
else {
|
|
1391
|
-
return [...selectedColumns, id];
|
|
1392
|
-
}
|
|
1393
|
-
});
|
|
1394
|
-
};
|
|
1395
|
-
return (_jsx("div", { style: { userSelect: 'none', ...style }, ref: setNodeRef, children: _jsx(SelectColumn, { selected: selectedColumns?.includes(id), setSelected: handleSelect, label: label, children: _jsx("div", { style: {
|
|
1396
|
-
cursor: 'grab',
|
|
1397
|
-
}, ...attributes, ...listeners, children: _jsx(HandleButton, {}) }) }) }));
|
|
1398
|
-
};
|
|
1399
1422
|
const AddConditionPopover = ({ onSave }) => {
|
|
1400
1423
|
return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [_jsx("h1", { style: {
|
|
1401
1424
|
fontWeight: '600',
|
|
@@ -1421,13 +1444,24 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1421
1444
|
body: JSON.stringify({
|
|
1422
1445
|
ast: { ...baseAst, where: formData },
|
|
1423
1446
|
publicKey: client.publicKey,
|
|
1424
|
-
orgId:
|
|
1447
|
+
orgId: client.customerId,
|
|
1425
1448
|
}),
|
|
1426
1449
|
});
|
|
1427
1450
|
const data2 = await res2.json();
|
|
1428
1451
|
if (data2.rows && data2.rows.length) {
|
|
1429
1452
|
const tables = getTableNames(baseAst);
|
|
1430
1453
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1454
|
+
const sortedFields = data2.fields.sort((a, b) => {
|
|
1455
|
+
const aIsId = a.name.toLowerCase() === 'id' ||
|
|
1456
|
+
a.name.toLowerCase().endsWith('_id');
|
|
1457
|
+
const bIsId = b.name.toLowerCase() === 'id' ||
|
|
1458
|
+
b.name.toLowerCase().endsWith('_id');
|
|
1459
|
+
if (aIsId && !bIsId)
|
|
1460
|
+
return 1;
|
|
1461
|
+
if (bIsId && !aIsId)
|
|
1462
|
+
return -1;
|
|
1463
|
+
return 0;
|
|
1464
|
+
});
|
|
1431
1465
|
if (pivot) {
|
|
1432
1466
|
// Do all of this to make sure we have the right unique columns when applying a pivot
|
|
1433
1467
|
let uniqueFormatted = {};
|
|
@@ -1439,6 +1473,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1439
1473
|
const pivotedData = generatePivotTable(pivot, data2.rows, [null, null, null], false);
|
|
1440
1474
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1441
1475
|
setPivotData(pivotedData);
|
|
1476
|
+
setRows(data2.rows);
|
|
1477
|
+
setFields(data2.fields);
|
|
1442
1478
|
}
|
|
1443
1479
|
else {
|
|
1444
1480
|
setRows(data2.rows);
|
|
@@ -1559,8 +1595,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1559
1595
|
}
|
|
1560
1596
|
return false;
|
|
1561
1597
|
};
|
|
1562
|
-
const handleAsk = async () => {
|
|
1563
|
-
if (!aiPrompt) {
|
|
1598
|
+
const handleAsk = async (overridePrompt = '') => {
|
|
1599
|
+
if (!aiPrompt && !overridePrompt) {
|
|
1564
1600
|
return;
|
|
1565
1601
|
}
|
|
1566
1602
|
try {
|
|
@@ -1579,7 +1615,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1579
1615
|
method: 'POST',
|
|
1580
1616
|
headers: { 'Content-Type': 'application/json' },
|
|
1581
1617
|
body: JSON.stringify({
|
|
1582
|
-
initialQuestion: aiPrompt,
|
|
1618
|
+
initialQuestion: aiPrompt || overridePrompt,
|
|
1583
1619
|
publicKey: client.publicKey,
|
|
1584
1620
|
}),
|
|
1585
1621
|
});
|
|
@@ -1616,11 +1652,21 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1616
1652
|
newAst = convertBigQuery(ast);
|
|
1617
1653
|
newAst = convertWildcardColumns(newAst, schemaTables); // must go before groupby
|
|
1618
1654
|
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, schemaTables));
|
|
1655
|
+
if (groupByPivot && !groupByPivot?.valueField) {
|
|
1656
|
+
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
1657
|
+
return;
|
|
1658
|
+
}
|
|
1619
1659
|
newAst = convertStringComparison(newAst, client.databaseType);
|
|
1620
1660
|
newAst = convertRemoveSimpleParentheses(newAst);
|
|
1661
|
+
const table = getTableNames(newAst)[0] ?? initialTableName;
|
|
1662
|
+
const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
|
|
1663
|
+
newAst = removeNonSelectedTableReferences(newAst, tableAlias ?? table);
|
|
1621
1664
|
// newAst = convertDateComparison(newAst); // TODO
|
|
1622
1665
|
ast = newAst; // so we fetch data for newAst later.
|
|
1623
|
-
|
|
1666
|
+
setPivotRowField(groupByPivot?.rowField);
|
|
1667
|
+
setPivotColumnField(groupByPivot?.columnField);
|
|
1668
|
+
setPivotValueField(groupByPivot?.valueField);
|
|
1669
|
+
setPivotAggregation(groupByPivot?.aggregationType);
|
|
1624
1670
|
setPivot(groupByPivot);
|
|
1625
1671
|
setSelectedColumns(deepCopy(newAst).columns?.map((column) => {
|
|
1626
1672
|
if (column.expr.type === 'column_ref') {
|
|
@@ -1652,7 +1698,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1652
1698
|
body: JSON.stringify({
|
|
1653
1699
|
ast: ast,
|
|
1654
1700
|
publicKey: client.publicKey,
|
|
1655
|
-
orgId:
|
|
1701
|
+
orgId: client.customerId,
|
|
1656
1702
|
}),
|
|
1657
1703
|
});
|
|
1658
1704
|
const data2 = await res2.json();
|
|
@@ -1663,6 +1709,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1663
1709
|
const pivotedData = generatePivotTable(pivot, data2.rows, [null, null, null], false);
|
|
1664
1710
|
console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
|
|
1665
1711
|
setPivotData(pivotedData);
|
|
1712
|
+
setRows(data2.rows);
|
|
1713
|
+
setFields(data2.fields);
|
|
1666
1714
|
}
|
|
1667
1715
|
else {
|
|
1668
1716
|
setRows(data2.rows);
|
|
@@ -1726,7 +1774,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1726
1774
|
transform: DND_CSS.Transform.toString(transform),
|
|
1727
1775
|
transition,
|
|
1728
1776
|
};
|
|
1729
|
-
return (_jsx("div", { style: { ...style }, ref: setNodeRef, children: _jsx(DraggableColumn, { label: label, onDelete: onDelete, children: _jsx("div", { style: {
|
|
1777
|
+
return (_jsx("div", { style: { ...style }, ref: setNodeRef, children: _jsx(DraggableColumn, { label: snakeCaseToTitleCase(label), onDelete: onDelete, children: _jsx("div", { style: {
|
|
1730
1778
|
cursor: 'grab',
|
|
1731
1779
|
}, ...attributes, ...listeners, children: _jsx(HandleButton, {}) }) }) }));
|
|
1732
1780
|
};
|
|
@@ -1787,24 +1835,17 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1787
1835
|
gap: 8,
|
|
1788
1836
|
}, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
|
|
1789
1837
|
}
|
|
1790
|
-
const allNumericColumns = getNumericColumns().map((column) => ({
|
|
1791
|
-
label: column.displayName,
|
|
1792
|
-
value: column.name,
|
|
1793
|
-
}));
|
|
1794
|
-
const allNonNumericColumns = getNonNumericColumns().map((column) => ({
|
|
1795
|
-
label: column.displayName,
|
|
1796
|
-
value: column.name,
|
|
1797
|
-
}));
|
|
1798
|
-
const allStringColumns = getStringColumns().map((column) => ({
|
|
1799
|
-
label: column.displayName,
|
|
1800
|
-
value: column.name,
|
|
1801
|
-
}));
|
|
1802
1838
|
if (loading) {
|
|
1803
|
-
return (_jsxs("div", { style: {
|
|
1839
|
+
return (_jsxs("div", { style: {
|
|
1840
|
+
display: 'flex',
|
|
1841
|
+
flexDirection: 'row',
|
|
1842
|
+
height: '100%',
|
|
1843
|
+
...containerStyle,
|
|
1844
|
+
}, ref: parentRef, children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeading, { label: "Columns" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(DraggableColumns, {}), _jsx(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
|
|
1804
1845
|
if (!openPopover) {
|
|
1805
1846
|
setOpenPopover('AddColumnPopover');
|
|
1806
1847
|
}
|
|
1807
|
-
}, label: 'Select columns' }),
|
|
1848
|
+
}, label: 'Select columns' }), label: "Select columns", onClose: () => {
|
|
1808
1849
|
setIsPending(false);
|
|
1809
1850
|
setActiveEditItem(null);
|
|
1810
1851
|
setActivePath(null);
|
|
@@ -1917,7 +1958,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1917
1958
|
newAst.orderby = null;
|
|
1918
1959
|
setBaseAst(newAst); // trigger refetch
|
|
1919
1960
|
setPivot(pivot);
|
|
1920
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && (_jsx(PivotCard, { pivotTable: {
|
|
1961
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot || !pivotData, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3, SecondaryButtonComponent: SecondaryButton }), pivot && pivotData && (_jsx(PivotCard, { pivotTable: {
|
|
1921
1962
|
pivot: pivot,
|
|
1922
1963
|
rows: pivotData?.rows || [],
|
|
1923
1964
|
columns: pivotData?.columns || [],
|
|
@@ -1976,7 +2017,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1976
2017
|
const newAst = { ...baseAst };
|
|
1977
2018
|
newAst.orderby.splice(id, 1);
|
|
1978
2019
|
setBaseAst(deepCopy(newAst));
|
|
1979
|
-
} }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
|
|
2020
|
+
} }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
|
|
1980
2021
|
if (!openPopover) {
|
|
1981
2022
|
setOpenPopover('AddSortPopover');
|
|
1982
2023
|
}
|
|
@@ -1985,12 +2026,45 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
1985
2026
|
setActiveEditItem(null);
|
|
1986
2027
|
setActivePath(null);
|
|
1987
2028
|
setOpenPopover(null);
|
|
1988
|
-
}, children: _jsx(AddSortPopover, { columns: selectedColumns, Select: Select, Button: Button, onSave: () => { } }) })
|
|
2029
|
+
}, children: _jsx(AddSortPopover, { columns: selectedColumns, Select: Select, Button: Button, onSave: () => { } }) }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Limit" }), _jsx("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? (_jsx("div", { style: {
|
|
2030
|
+
display: 'flex',
|
|
2031
|
+
flexDirection: 'column',
|
|
2032
|
+
gap: 8,
|
|
2033
|
+
marginBottom: 12,
|
|
2034
|
+
}, children: _jsx(LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: SortPopover, EditPopover: AddLimitPopover, handleDelete: () => {
|
|
2035
|
+
const newAst = { ...baseAst };
|
|
2036
|
+
newAst.limit = null;
|
|
2037
|
+
setBaseAst(deepCopy(newAst));
|
|
2038
|
+
}, onSave: (limit) => {
|
|
2039
|
+
const newAst = { ...baseAst };
|
|
2040
|
+
newAst.limit = {
|
|
2041
|
+
seperator: '',
|
|
2042
|
+
value: [
|
|
2043
|
+
{
|
|
2044
|
+
type: 'number',
|
|
2045
|
+
value: limit,
|
|
2046
|
+
},
|
|
2047
|
+
],
|
|
2048
|
+
};
|
|
2049
|
+
setOpenPopover(null);
|
|
2050
|
+
setBaseAst(deepCopy(newAst));
|
|
2051
|
+
} }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
|
|
2052
|
+
if (!openPopover) {
|
|
2053
|
+
setOpenPopover('AddLimitPopover');
|
|
2054
|
+
}
|
|
2055
|
+
}, label: 'Add limit' }), title: "Limit", onClose: () => {
|
|
2056
|
+
setIsPending(false);
|
|
2057
|
+
setActiveEditItem(null);
|
|
2058
|
+
setActivePath(null);
|
|
2059
|
+
setOpenPopover(null);
|
|
2060
|
+
}, children: _jsx(TextInput, { value: 0, type: "number", style: { width: 120, minHeight: 32 }, onChange: (e) => { } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: (event) => {
|
|
2061
|
+
event.preventDefault();
|
|
2062
|
+
}, style: {
|
|
1989
2063
|
display: 'flex',
|
|
1990
2064
|
flexDirection: 'row',
|
|
1991
2065
|
gap: 12,
|
|
1992
2066
|
padding: 1,
|
|
1993
|
-
}, children: [_jsx(TextInput, { placeholder:
|
|
2067
|
+
}, children: [_jsx(TextInput, { placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), _jsx(Button, { onClick: () => { }, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), baseAst && (_jsxs(_Fragment, { children: [_jsx(TableLoadingState, {}), _jsxs("div", { style: {
|
|
1994
2068
|
display: 'flex',
|
|
1995
2069
|
flexDirection: 'row',
|
|
1996
2070
|
gap: '12px',
|
|
@@ -2001,6 +2075,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
2001
2075
|
flexDirection: 'row',
|
|
2002
2076
|
height: '100%',
|
|
2003
2077
|
overflowY: 'auto',
|
|
2078
|
+
boxSizing: 'border-box',
|
|
2079
|
+
...containerStyle,
|
|
2004
2080
|
}, children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeading, { label: "Columns" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(DraggableColumns, {}), _jsx(Popover, { isOpen: openPopover === 'AddColumnPopover', title: "Select columns", trigger: _jsx(SecondaryButton, { onClick: () => {
|
|
2005
2081
|
if (!openPopover) {
|
|
2006
2082
|
setOpenPopover('AddColumnPopover');
|
|
@@ -2113,7 +2189,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
2113
2189
|
setOpenPopover(null);
|
|
2114
2190
|
clearCheckboxes();
|
|
2115
2191
|
}
|
|
2116
|
-
} }) }))] }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Pivot" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: Select, ButtonComponent: Button, PopoverComponent: PivotPopover, TextComponent: Text, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
|
|
2192
|
+
} }) }))] }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Pivot" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: Select, ButtonComponent: Button, SecondaryButtonComponent: SecondaryButton, PopoverComponent: PivotPopover, TextComponent: Text, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
|
|
2117
2193
|
setPivot(null);
|
|
2118
2194
|
setPivotData(null);
|
|
2119
2195
|
}, selectPivot: (pivot) => {
|
|
@@ -2121,9 +2197,13 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
2121
2197
|
return;
|
|
2122
2198
|
const newAst = { ...baseAst };
|
|
2123
2199
|
newAst.orderby = null;
|
|
2200
|
+
if (pivot.rowFieldType === 'date') {
|
|
2201
|
+
pivot['sort'] = true;
|
|
2202
|
+
pivot['sortDirection'] = 'ASC';
|
|
2203
|
+
}
|
|
2124
2204
|
setBaseAst(newAst); // trigger refetch
|
|
2125
2205
|
setPivot(pivot);
|
|
2126
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && (_jsx(PivotCard, { pivotTable: {
|
|
2206
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot || !pivotData, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && pivotData && (_jsx(PivotCard, { pivotTable: {
|
|
2127
2207
|
pivot: pivot,
|
|
2128
2208
|
rows: pivotData?.rows || [],
|
|
2129
2209
|
columns: pivotData?.columns || [],
|
|
@@ -2224,27 +2304,77 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
|
|
|
2224
2304
|
setActivePath(null);
|
|
2225
2305
|
setOpenPopover(null);
|
|
2226
2306
|
setBaseAst(deepCopy(newAst));
|
|
2227
|
-
} }) })
|
|
2307
|
+
} }) }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Limit" }), _jsx("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? (_jsx("div", { style: {
|
|
2308
|
+
display: 'flex',
|
|
2309
|
+
flexDirection: 'column',
|
|
2310
|
+
gap: 8,
|
|
2311
|
+
marginBottom: 12,
|
|
2312
|
+
}, children: _jsx(LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: SortPopover, EditPopover: AddLimitPopover, handleDelete: () => {
|
|
2313
|
+
const newAst = { ...baseAst };
|
|
2314
|
+
newAst.limit = null;
|
|
2315
|
+
setBaseAst(deepCopy(newAst));
|
|
2316
|
+
}, onSave: (limit) => {
|
|
2317
|
+
const newAst = { ...baseAst };
|
|
2318
|
+
newAst.limit = {
|
|
2319
|
+
seperator: '',
|
|
2320
|
+
value: [
|
|
2321
|
+
{
|
|
2322
|
+
type: 'number',
|
|
2323
|
+
value: limit,
|
|
2324
|
+
},
|
|
2325
|
+
],
|
|
2326
|
+
};
|
|
2327
|
+
setOpenPopover(null);
|
|
2328
|
+
setBaseAst(deepCopy(newAst));
|
|
2329
|
+
} }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
|
|
2330
|
+
if (!baseAst) {
|
|
2331
|
+
return;
|
|
2332
|
+
}
|
|
2333
|
+
if (!openPopover) {
|
|
2334
|
+
setOpenPopover('AddLimitPopover');
|
|
2335
|
+
}
|
|
2336
|
+
}, label: 'Add limit' }), title: "Limit", onClose: () => {
|
|
2337
|
+
setIsPending(false);
|
|
2338
|
+
setActiveEditItem(null);
|
|
2339
|
+
setActivePath(null);
|
|
2340
|
+
setOpenPopover(null);
|
|
2341
|
+
}, children: _jsx(AddLimitPopover, { TextInput: TextInput, onSave: (limit) => {
|
|
2342
|
+
const newAst = { ...baseAst };
|
|
2343
|
+
newAst.limit = {
|
|
2344
|
+
seperator: '',
|
|
2345
|
+
value: [
|
|
2346
|
+
{
|
|
2347
|
+
type: 'number',
|
|
2348
|
+
value: Number(limit),
|
|
2349
|
+
},
|
|
2350
|
+
],
|
|
2351
|
+
};
|
|
2352
|
+
setOpenPopover(null);
|
|
2353
|
+
setBaseAst(deepCopy(newAst));
|
|
2354
|
+
} }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: (event) => {
|
|
2355
|
+
event.preventDefault();
|
|
2356
|
+
handleAsk();
|
|
2357
|
+
}, style: {
|
|
2228
2358
|
display: 'flex',
|
|
2229
2359
|
flexDirection: 'row',
|
|
2230
2360
|
gap: 12,
|
|
2231
2361
|
padding: 1,
|
|
2232
|
-
}, children: [_jsx(TextInput, { type: "text", value: aiPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), _jsx(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && (
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2362
|
+
}, children: [_jsx(TextInput, { type: "text", value: aiPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), _jsx(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && (_jsx(_Fragment, { children: loading && errorMessage.length === 0 ? (_jsx(TableLoadingState, {})) : (_jsx(Table, { rows: applyFormatting({
|
|
2363
|
+
rows: pivotData?.rows || rows,
|
|
2364
|
+
fields: pivotData?.fields || fields,
|
|
2365
|
+
}, baseAst?.columns ?? []), columns: pivotData?.columns ||
|
|
2366
|
+
enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
2367
|
+
return { label: snakeCaseToTitleCase(c), field: c };
|
|
2368
|
+
}), error: errorMessage, rowsPerPage: 20 })) })), _jsxs("div", { style: {
|
|
2369
|
+
display: 'flex',
|
|
2370
|
+
flexDirection: 'row',
|
|
2371
|
+
gap: '12px',
|
|
2372
|
+
}, children: [errorMessage && (_jsx("div", { style: {
|
|
2373
|
+
color: 'red',
|
|
2374
|
+
fontSize: 14,
|
|
2375
|
+
padding: '12px',
|
|
2376
|
+
whiteSpace: 'nowrap',
|
|
2377
|
+
}, children: errorMessage })), _jsx("div", { style: { width: '100%' } }), baseAst && (_jsxs(_Fragment, { children: [_jsx(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), _jsx(Button, { onClick: () => {
|
|
2248
2378
|
setIsChartBuilderOpen(true);
|
|
2249
|
-
}, label: 'Add to dashboard' })] })] })
|
|
2379
|
+
}, label: 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` }), _jsx(ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData })] }));
|
|
2250
2380
|
}
|