@quillsql/react 2.12.3 → 2.12.5
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/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +192 -72
- package/dist/cjs/ChartBuilder.d.ts +24 -1
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +43 -36
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +97 -41
- package/dist/cjs/Context.d.ts +1 -0
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +59 -30
- package/dist/cjs/Dashboard.d.ts +22 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +2 -2
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +47 -80
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +13 -27
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +3 -3
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +9 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +146 -112
- 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 +29 -11
- package/dist/cjs/components/QuillTable.d.ts +15 -2
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +58 -29
- package/dist/cjs/components/UiComponents.d.ts +11 -1
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +48 -4
- package/dist/cjs/hooks/useExport.d.ts +2 -1
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +44 -9
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +2 -0
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +2 -1
- package/dist/cjs/utils/csv.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +2 -0
- package/dist/cjs/utils/pivotProcessing.d.ts +2 -6
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +31 -28
- package/dist/cjs/utils/schema.d.ts +6 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -0
- package/dist/cjs/utils/schema.js +122 -0
- package/dist/cjs/utils/tableProcessing.d.ts +1 -1
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +5 -3
- package/dist/cjs/utils/valueFormatter.js +1 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +193 -73
- package/dist/esm/ChartBuilder.d.ts +24 -1
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +43 -36
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +98 -42
- package/dist/esm/Context.d.ts +1 -0
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +58 -29
- package/dist/esm/Dashboard.d.ts +22 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +2 -2
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +50 -83
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +15 -29
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +4 -4
- package/dist/esm/components/Dashboard/DataLoader.d.ts +9 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +147 -113
- 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 +30 -12
- package/dist/esm/components/QuillTable.d.ts +15 -2
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +58 -26
- package/dist/esm/components/UiComponents.d.ts +11 -1
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +47 -4
- package/dist/esm/hooks/useExport.d.ts +2 -1
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +44 -9
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +3 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +3 -2
- package/dist/esm/utils/csv.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +2 -0
- package/dist/esm/utils/pivotProcessing.d.ts +2 -6
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +31 -28
- package/dist/esm/utils/schema.d.ts +6 -0
- package/dist/esm/utils/schema.d.ts.map +1 -0
- package/dist/esm/utils/schema.js +117 -0
- package/dist/esm/utils/tableProcessing.d.ts +1 -1
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +5 -3
- package/dist/esm/utils/valueFormatter.js +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/* eslint-disable no-unused-vars */
|
|
3
3
|
import { useContext, useEffect, useRef, useState, } from 'react';
|
|
4
|
-
import { DEFAULT_TAB_OPTIONS, MemoizedButton, MemoizedCheckbox, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedSecondaryButton, MemoizedText, MemoizedPopover,
|
|
4
|
+
import { DEFAULT_TAB_OPTIONS, MemoizedButton, MemoizedCheckbox, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedSecondaryButton, MemoizedText, MemoizedPopover, QuillTabs, MemoizedModal, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillColumnSearchEmptyState, QuillChartBuilderFormContainer, QuillLoadingComponent, QuillTableSQLEditorComponent, } from './components/UiComponents';
|
|
5
5
|
import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
6
6
|
import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
7
7
|
import { CSS as DND_CSS } from '@dnd-kit/utilities';
|
|
8
8
|
import { getQuarter } from 'date-fns';
|
|
9
|
-
import { ClientContext, ThemeContext } from './Context';
|
|
9
|
+
import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
|
|
10
10
|
import { getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
11
11
|
import { ChartBuilderWithModal } from './ChartBuilder';
|
|
12
12
|
import { QuillTextInput } from './components/UiComponents';
|
|
@@ -27,13 +27,14 @@ import { QuillSelectComponent } from './components/QuillSelect';
|
|
|
27
27
|
import { QuillCard } from './components/QuillCard';
|
|
28
28
|
import { getData } from './utils/dataFetcher';
|
|
29
29
|
import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
|
|
30
|
-
import { getPossiblePivotFieldOptions } from './utils/pivotProcessing';
|
|
30
|
+
import { getPossiblePivotFieldOptions, pivotToSql, } from './utils/pivotProcessing';
|
|
31
31
|
import { getUniqueValuesByColumns } from './utils/tableProcessing';
|
|
32
32
|
import { useQuill } from './hooks/useQuill';
|
|
33
33
|
import { getDataFromCloud } from './utils/dataFetcher';
|
|
34
34
|
import { convertColumnInfoToColumnInternal, convertPostgresColumn, } from './utils/columnProcessing';
|
|
35
35
|
import { getSelectFromAST, processApostrophe, processStarColumn, } from './utils/astProcessing';
|
|
36
36
|
import PivotForm from './internals/ReportBuilder/PivotForm';
|
|
37
|
+
import { getSchemaInfoWithCustomFields } from './utils/schema';
|
|
37
38
|
export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
38
39
|
'https://quill-344421.uc.r.appspot.com';
|
|
39
40
|
/**
|
|
@@ -67,7 +68,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
|
|
|
67
68
|
* ### Report Builder API
|
|
68
69
|
* @see https://docs.quillsql.com/components/report-builder
|
|
69
70
|
*/
|
|
70
|
-
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent =
|
|
71
|
+
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, }) {
|
|
71
72
|
const { data: report } = useQuill(reportId || '');
|
|
72
73
|
const [aiPrompt, setAiPrompt] = useState('');
|
|
73
74
|
const [errorMessage, setErrorMessage] = useState('');
|
|
@@ -76,7 +77,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
76
77
|
const [orderedColumnNames, setOrderedColumnNames] = useState([]);
|
|
77
78
|
const [selectedColumns, setSelectedColumns] = useState([]);
|
|
78
79
|
const [selectedOrderedColumns, setSelectedOrderedColumns] = useState([]);
|
|
79
|
-
const [
|
|
80
|
+
const [schema, setSchema] = useContext(SchemaContext);
|
|
80
81
|
const [activeQuery, setActiveQuery] = useState('');
|
|
81
82
|
const [activeEditItem, setActiveEditItem] = useState(null);
|
|
82
83
|
const [activePath, setActivePath] = useState(null);
|
|
@@ -119,11 +120,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
119
120
|
const [client, _setClient] = useContext(ClientContext);
|
|
120
121
|
// JANK: This is temp and stupid
|
|
121
122
|
const [overrideRecommendations, setOverrideRecommendations] = useState(true);
|
|
123
|
+
const [customFields, setCustomFields] = useContext(CustomFieldContext);
|
|
122
124
|
useEffect(() => {
|
|
123
125
|
if (client.publicKey === '663416663aa9bc716e59a89d') {
|
|
124
126
|
setOverrideRecommendations(false);
|
|
125
127
|
}
|
|
126
|
-
|
|
128
|
+
if (!loadingSchema) {
|
|
129
|
+
fetchSchema();
|
|
130
|
+
}
|
|
131
|
+
}, [client.publicKey, client.customerId]);
|
|
127
132
|
useEffect(() => {
|
|
128
133
|
updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
129
134
|
updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
@@ -189,8 +194,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
189
194
|
setBaseAst(null);
|
|
190
195
|
setFormData(null);
|
|
191
196
|
setSelectedColumns([]);
|
|
192
|
-
setSchemaTables([]);
|
|
193
|
-
setOrderedColumnNames([]);
|
|
194
197
|
setActiveQuery('');
|
|
195
198
|
setActiveEditItem(null);
|
|
196
199
|
setActivePath(null);
|
|
@@ -278,6 +281,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
278
281
|
}
|
|
279
282
|
return current;
|
|
280
283
|
};
|
|
284
|
+
const copySQLToClipboard = () => {
|
|
285
|
+
let query = activeQuery;
|
|
286
|
+
if (pivot) {
|
|
287
|
+
query = pivotToSql(pivot, activeQuery, columns);
|
|
288
|
+
}
|
|
289
|
+
setIsCopying(true);
|
|
290
|
+
navigator.clipboard.writeText(query);
|
|
291
|
+
setTimeout(() => setIsCopying(false), 800);
|
|
292
|
+
};
|
|
281
293
|
const copyToClipboard = (str) => {
|
|
282
294
|
setIsCopying(true);
|
|
283
295
|
navigator.clipboard.writeText(str);
|
|
@@ -362,40 +374,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
362
374
|
result.push(valueField, rowField);
|
|
363
375
|
return result.filter(Boolean);
|
|
364
376
|
};
|
|
365
|
-
const fetchDistinctStrings = async (query, table) => {
|
|
366
|
-
try {
|
|
367
|
-
const hostedBody = {
|
|
368
|
-
metadata: {
|
|
369
|
-
query,
|
|
370
|
-
task: 'query',
|
|
371
|
-
orgId: client.customerId || '*',
|
|
372
|
-
clientId: client.publicKey,
|
|
373
|
-
databaseType: client?.databaseType,
|
|
374
|
-
},
|
|
375
|
-
};
|
|
376
|
-
const cloudBody = { query };
|
|
377
|
-
const data = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
378
|
-
if (data.errorMessage) {
|
|
379
|
-
return null;
|
|
380
|
-
}
|
|
381
|
-
const results = data.rows.map((columnInfo) => {
|
|
382
|
-
const column = columnInfo.field;
|
|
383
|
-
if (!columnInfo.string_values) {
|
|
384
|
-
return { table, column, values: {} };
|
|
385
|
-
}
|
|
386
|
-
const values = columnInfo.string_values.reduce((result, value) => {
|
|
387
|
-
result[value] = false;
|
|
388
|
-
return result;
|
|
389
|
-
}, {});
|
|
390
|
-
return { table, column, values };
|
|
391
|
-
});
|
|
392
|
-
return results;
|
|
393
|
-
}
|
|
394
|
-
catch (e) {
|
|
395
|
-
console.error(e);
|
|
396
|
-
return null;
|
|
397
|
-
}
|
|
398
|
-
};
|
|
399
377
|
const loadTable = async (tables) => {
|
|
400
378
|
if (!tables)
|
|
401
379
|
return;
|
|
@@ -408,7 +386,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
408
386
|
})
|
|
409
387
|
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
410
388
|
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
411
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client);
|
|
389
|
+
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
|
|
412
390
|
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
413
391
|
joinedUniqueValues[initialTableName] = newUniqueValues;
|
|
414
392
|
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
@@ -439,26 +417,10 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
439
417
|
const fetchSchema = async () => {
|
|
440
418
|
try {
|
|
441
419
|
setLoadingSchema(true);
|
|
442
|
-
const
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
'Content-Type': 'application/json',
|
|
447
|
-
},
|
|
448
|
-
body: JSON.stringify({
|
|
449
|
-
metadata: {
|
|
450
|
-
clientId: client.publicKey,
|
|
451
|
-
publicKey: client.publicKey,
|
|
452
|
-
task: 'schema',
|
|
453
|
-
removeCustomerField: true,
|
|
454
|
-
},
|
|
455
|
-
}),
|
|
456
|
-
});
|
|
457
|
-
const results = await response.json();
|
|
458
|
-
// Filter out hidden columns on tables back from schema2.
|
|
459
|
-
const tables = results.data.tables || results.data.data.tables;
|
|
460
|
-
setSchemaTables(tables ?? []);
|
|
461
|
-
setOrderedColumnNames((tables ?? []).flatMap((table) => table.columns
|
|
420
|
+
const { schemaData, customFieldsByTable } = await getSchemaInfoWithCustomFields(client, 'rb');
|
|
421
|
+
setCustomFields(customFieldsByTable);
|
|
422
|
+
setSchema(schemaData ?? []);
|
|
423
|
+
setOrderedColumnNames((schemaData ?? []).flatMap((table) => table.columns
|
|
462
424
|
.map((c) => `${table.name}.${c.name}`)
|
|
463
425
|
.sort((a, b) => {
|
|
464
426
|
const aIsId = a.endsWith('.id') ||
|
|
@@ -476,11 +438,11 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
476
438
|
return 0;
|
|
477
439
|
})));
|
|
478
440
|
if (initialTableName) {
|
|
479
|
-
await loadTable(
|
|
441
|
+
await loadTable(schemaData);
|
|
480
442
|
}
|
|
481
443
|
setLoadingSchema(false);
|
|
482
444
|
setInitialLoad(false);
|
|
483
|
-
return
|
|
445
|
+
return schemaData;
|
|
484
446
|
}
|
|
485
447
|
catch (error) {
|
|
486
448
|
console.error(error);
|
|
@@ -504,7 +466,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
504
466
|
let convertedAst = processStarColumn(ast, report.columns);
|
|
505
467
|
processApostrophe(convertedAst, ['type', 'value']);
|
|
506
468
|
convertedAst = convertBigQuery(convertedAst);
|
|
507
|
-
let schemaInfo =
|
|
469
|
+
let schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
|
|
508
470
|
let newAst, groupByPivot;
|
|
509
471
|
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(convertedAst,
|
|
510
472
|
// @ts-ignore
|
|
@@ -522,7 +484,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
522
484
|
});
|
|
523
485
|
if (stringColumns.length !== 0 && tableName) {
|
|
524
486
|
const stringNames = stringColumns.map((column) => column.field);
|
|
525
|
-
const newUniqueValues = await getUniqueValuesByColumns(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client);
|
|
487
|
+
const newUniqueValues = await getUniqueValuesByColumns(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
526
488
|
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
527
489
|
joinedUniqueValues[tableName] = newUniqueValues;
|
|
528
490
|
setUniqueValues(joinedUniqueValues);
|
|
@@ -561,10 +523,10 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
561
523
|
}
|
|
562
524
|
}, [report]);
|
|
563
525
|
useEffect(() => {
|
|
564
|
-
if (
|
|
526
|
+
if (schema.length === 0) {
|
|
565
527
|
fetchSchema();
|
|
566
528
|
}
|
|
567
|
-
}, [
|
|
529
|
+
}, [schema, initialTableName, reportId]);
|
|
568
530
|
const updateFormData = (updates, { isDeletion = false, isInsertion = false, isReplaceSubtree = false, isAddVariant = false, isDeleteVariant = false, topLevelBinOp = 'OR', isCondition = undefined, }) => {
|
|
569
531
|
// Function to immutably update or delete nodes based on their path
|
|
570
532
|
// TODO: fix the following horible code
|
|
@@ -1374,11 +1336,11 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1374
1336
|
// grab the value of the left child of the column comparison
|
|
1375
1337
|
// operator (ie. the column name)
|
|
1376
1338
|
const leftChildValue = getColumnValueForColumnComparison(node);
|
|
1377
|
-
const column = schemaTables
|
|
1378
|
-
.flatMap((t) => t.columns)
|
|
1379
|
-
.find((col) => col.name === leftChildValue);
|
|
1380
1339
|
const tables = getTableNames(baseAst);
|
|
1381
1340
|
const table = tables.length === 1 ? tables[0] : initialTableName;
|
|
1341
|
+
const column = schema
|
|
1342
|
+
.find((tableInfo) => tableInfo.name === table)
|
|
1343
|
+
?.columns.find((col) => col.name === leftChildValue);
|
|
1382
1344
|
const columnType = column?.fieldType;
|
|
1383
1345
|
let operatorOptions = [
|
|
1384
1346
|
...(isNumericColumnType(columnType)
|
|
@@ -1472,7 +1434,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1472
1434
|
}
|
|
1473
1435
|
else {
|
|
1474
1436
|
const columnName = node.left.column;
|
|
1475
|
-
const column =
|
|
1437
|
+
const column = schema
|
|
1438
|
+
.find((tableInfo) => tableInfo.name === currentTable)
|
|
1439
|
+
?.columns.find((col) => col.name === columnName);
|
|
1476
1440
|
const columnType = column?.fieldType;
|
|
1477
1441
|
return (_jsxs("div", { style: {
|
|
1478
1442
|
display: 'flex',
|
|
@@ -1728,7 +1692,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1728
1692
|
};
|
|
1729
1693
|
const getAllPossibleColumns = () => {
|
|
1730
1694
|
if (!baseAst || !baseAst.from) {
|
|
1731
|
-
return
|
|
1695
|
+
return schema.flatMap((table) => table.columns.map((c) => ({
|
|
1732
1696
|
...c,
|
|
1733
1697
|
table: table.displayName,
|
|
1734
1698
|
})));
|
|
@@ -1737,7 +1701,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1737
1701
|
// This currently only supports top-level table names in the FROM section
|
|
1738
1702
|
// of queries (eg. FROM "table_name", not "FROM (SELECT * FROM other) AS table_name")
|
|
1739
1703
|
const tableNamesInQuery = baseAst.from.map((tbl) => tbl.table);
|
|
1740
|
-
return
|
|
1704
|
+
return schema
|
|
1741
1705
|
.filter((t) => tableNamesInQuery.includes(t.displayName))
|
|
1742
1706
|
.flatMap((table) => table.columns
|
|
1743
1707
|
.map((c) => ({
|
|
@@ -1808,6 +1772,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1808
1772
|
publicKey: client.publicKey,
|
|
1809
1773
|
orgId: client.customerId,
|
|
1810
1774
|
task: 'patterns',
|
|
1775
|
+
getCustomFields: false,
|
|
1776
|
+
customFields,
|
|
1811
1777
|
},
|
|
1812
1778
|
};
|
|
1813
1779
|
const cloudBody = {};
|
|
@@ -1816,7 +1782,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1816
1782
|
const tables = getTableNames(baseAst);
|
|
1817
1783
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1818
1784
|
if (table !== currentTable) {
|
|
1819
|
-
const tableInfo =
|
|
1785
|
+
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1820
1786
|
if (tableInfo) {
|
|
1821
1787
|
const convertedStringColumns = tableInfo.columns
|
|
1822
1788
|
.filter((column) => {
|
|
@@ -1824,7 +1790,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1824
1790
|
})
|
|
1825
1791
|
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
1826
1792
|
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
1827
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client);
|
|
1793
|
+
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
1828
1794
|
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
1829
1795
|
joinedUniqueValues[table] = newUniqueValues;
|
|
1830
1796
|
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
@@ -2059,8 +2025,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2059
2025
|
// Unwrap the ast object, supporting many possible types
|
|
2060
2026
|
ast = ast.length ? ast[0] : ast;
|
|
2061
2027
|
newAst = convertBigQuery(ast);
|
|
2062
|
-
newAst = convertWildcardColumns(newAst,
|
|
2063
|
-
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot,
|
|
2028
|
+
newAst = convertWildcardColumns(newAst, schema); // must go before groupby
|
|
2029
|
+
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, schema));
|
|
2064
2030
|
if (groupByPivot && !groupByPivot?.valueField) {
|
|
2065
2031
|
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2066
2032
|
return;
|
|
@@ -2092,6 +2058,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2092
2058
|
newAst?.where ? newAst?.where?.operator : 'AND');
|
|
2093
2059
|
}
|
|
2094
2060
|
ast = newAst; // so we fetch data for newAst later.
|
|
2061
|
+
fetchSqlQuery(ast, undefined, false);
|
|
2095
2062
|
const table = getTableNames(newAst)[0] ?? initialTableName;
|
|
2096
2063
|
const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
|
|
2097
2064
|
const hostedBody = {
|
|
@@ -2107,7 +2074,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2107
2074
|
const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2108
2075
|
let currentUniqueValues = uniqueValues;
|
|
2109
2076
|
if (table !== currentTable) {
|
|
2110
|
-
const tableInfo =
|
|
2077
|
+
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
2111
2078
|
if (tableInfo) {
|
|
2112
2079
|
const convertedStringColumns = tableInfo.columns
|
|
2113
2080
|
.filter((column) => {
|
|
@@ -2115,7 +2082,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2115
2082
|
})
|
|
2116
2083
|
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
2117
2084
|
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
2118
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client);
|
|
2085
|
+
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
2119
2086
|
currentUniqueValues[table] = newUniqueValues;
|
|
2120
2087
|
if (hashCode(uniqueValues) !== hashCode(currentUniqueValues)) {
|
|
2121
2088
|
setUniqueValues(currentUniqueValues);
|
|
@@ -2609,7 +2576,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2609
2576
|
display: 'flex',
|
|
2610
2577
|
flexDirection: 'row',
|
|
2611
2578
|
gap: '12px',
|
|
2612
|
-
}, children: [_jsx("div", { style: { width: '100%' } }), !hideCopySQL && (_jsx(SecondaryButtonComponent, { onClick: () =>
|
|
2579
|
+
}, children: [_jsx("div", { style: { width: '100%' } }), !hideCopySQL && (_jsx(SecondaryButtonComponent, { onClick: () => copySQLToClipboard(), label: isCopying ? '✅ Copied' : 'Copy SQL' })), _jsx(ButtonComponent, { label: report ? 'Save changes' : 'Add to dashboard', onClick: () => { } })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] }));
|
|
2613
2580
|
}
|
|
2614
2581
|
return (_jsxs("div", { style: { backgroundColor: theme.backgroundColor, ...containerStyle }, className: className, children: [(!isChartBuilderHorizontalView ||
|
|
2615
2582
|
(isChartBuilderHorizontalView && !isChartBuilderOpen)) && (_jsxs("div", { ref: parentRef, style: {
|
|
@@ -3045,7 +3012,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3045
3012
|
overflow: 'hidden',
|
|
3046
3013
|
width: '100%',
|
|
3047
3014
|
gap: 12,
|
|
3048
|
-
}, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initalChartLoad && (_jsxs(_Fragment, { children: [!hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () =>
|
|
3015
|
+
}, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initalChartLoad && (_jsxs(_Fragment, { children: [!hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: () => {
|
|
3049
3016
|
setIsChartBuilderOpen(true);
|
|
3050
3017
|
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3051
3018
|
? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLEditor.d.ts","sourceRoot":"","sources":["../../src/SQLEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAMZ,SAAS,EACV,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SQLEditor.d.ts","sourceRoot":"","sources":["../../src/SQLEditor.tsx"],"names":[],"mappings":"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"}
|
package/dist/esm/SQLEditor.js
CHANGED
|
@@ -3,16 +3,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
4
4
|
import { useState, useContext, useEffect, useRef, } from 'react';
|
|
5
5
|
import MonacoEditor from '@monaco-editor/react';
|
|
6
|
-
import { ClientContext, SchemaContext, ThemeContext } from './Context';
|
|
6
|
+
import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
|
|
7
7
|
import { getData, getDataFromCloud } from './utils/dataFetcher';
|
|
8
8
|
import { ChartBuilderWithModal } from './ChartBuilder';
|
|
9
|
-
import { MemoizedButton, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedModal, MemoizedPopover, MemoizedSecondaryButton, MemoizedSubHeader, MemoizedText, QuillChartBuilderFormContainer, QuillChartBuilderInputColumnContainer, QuillChartBuilderInputRowContainer, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer,
|
|
9
|
+
import { MemoizedButton, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedModal, MemoizedPopover, MemoizedSecondaryButton, MemoizedSubHeader, MemoizedText, QuillChartBuilderFormContainer, QuillChartBuilderInputColumnContainer, QuillChartBuilderInputRowContainer, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, QuillTableSQLEditorComponent, } from './components/UiComponents';
|
|
10
10
|
import { QuillTextInput } from './components/UiComponents';
|
|
11
11
|
import { updateFirstChildWidth } from './utils/width';
|
|
12
12
|
import { QuillCard } from './components/QuillCard';
|
|
13
13
|
import { QuillSelectComponent } from './components/QuillSelect';
|
|
14
14
|
import { quillFormat } from './utils/valueFormatter';
|
|
15
15
|
import { convertPostgresColumn } from './utils/columnProcessing';
|
|
16
|
+
import { getSchemaInfoWithCustomFields } from './utils/schema';
|
|
16
17
|
function defineEditorTheme(monaco, theme) {
|
|
17
18
|
monaco.editor.defineTheme('onedark', {
|
|
18
19
|
base: theme.darkMode ? 'vs-dark' : 'vs',
|
|
@@ -63,7 +64,7 @@ function setEditorTheme(editor, monaco) {
|
|
|
63
64
|
* ### SQLEditor API
|
|
64
65
|
* @see https://docs.quillsql.com/components/sql-editor
|
|
65
66
|
*/
|
|
66
|
-
export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent =
|
|
67
|
+
export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, isNewQueryEnabled = false, LoadingComponent = QuillLoadingComponent, ModalComponent = MemoizedModal, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, ChartBuilderFormContainer = QuillChartBuilderFormContainer, defaultQuery, onChangeQuery, onChangeData, onChangeColumns, onChangeFields, isChartBuilderEnabled = false, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, destinationDashboard, chartBuilderTitle, chartBuilderButtonLabel, onAddToDashboardComplete, addToDashboardButtonLabel = 'Add to dashboard', report = undefined, organizationName = undefined, isChartBuilderHorizontalView = true, containerStyle = { height: '100vh' }, className, }) {
|
|
67
68
|
const [sqlPrompt, setSqlPrompt] = useState('');
|
|
68
69
|
const [client] = useContext(ClientContext);
|
|
69
70
|
const [theme] = useContext(ThemeContext);
|
|
@@ -71,6 +72,7 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
|
|
|
71
72
|
const [rows, setRows] = useState([]);
|
|
72
73
|
const [columns, setColumns] = useState([]);
|
|
73
74
|
const [schema, setSchema] = useContext(SchemaContext);
|
|
75
|
+
const [customFields, setCustomFields] = useContext(CustomFieldContext);
|
|
74
76
|
const [errorMessage, setErrorMessage] = useState('');
|
|
75
77
|
const [sqlResponseLoading, setSqlResponseLoading] = useState(false);
|
|
76
78
|
const [sqlQueryLoading, setSqlQueryLoading] = useState(false);
|
|
@@ -93,38 +95,20 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
|
|
|
93
95
|
};
|
|
94
96
|
}, []);
|
|
95
97
|
const getSchema = async () => {
|
|
96
|
-
const {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
...queryHeaders,
|
|
101
|
-
'Content-Type': 'application/json',
|
|
102
|
-
},
|
|
103
|
-
body: JSON.stringify({
|
|
104
|
-
metadata: {
|
|
105
|
-
clientId: publicKey,
|
|
106
|
-
publicKey: publicKey,
|
|
107
|
-
task: 'schema',
|
|
108
|
-
removeCustomerField: true,
|
|
109
|
-
},
|
|
110
|
-
}),
|
|
111
|
-
});
|
|
112
|
-
const results = await response.json();
|
|
113
|
-
if (results.data?.data) {
|
|
114
|
-
setSchema(results.data.data.tables);
|
|
115
|
-
setSchemaLoading(false);
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
setSchema(results.data.tables);
|
|
119
|
-
setSchemaLoading(false);
|
|
120
|
-
}
|
|
98
|
+
const { schemaData, customFieldsByTable } = await getSchemaInfoWithCustomFields(client);
|
|
99
|
+
setSchema(schemaData);
|
|
100
|
+
setCustomFields(customFieldsByTable);
|
|
101
|
+
setSchemaLoading(false);
|
|
121
102
|
};
|
|
122
103
|
useEffect(() => {
|
|
123
104
|
if (client && !schemaLoading) {
|
|
124
105
|
setSchemaLoading(true);
|
|
125
106
|
getSchema();
|
|
107
|
+
setRows([]);
|
|
108
|
+
setColumns([]);
|
|
109
|
+
setDisplayTable(false);
|
|
126
110
|
}
|
|
127
|
-
}, [client.publicKey]);
|
|
111
|
+
}, [client.publicKey, client.customerId]);
|
|
128
112
|
const handleRunSqlPrompt = async () => {
|
|
129
113
|
setSqlResponseLoading(true);
|
|
130
114
|
const resp = await getDataFromCloud(client, `quillai`, {
|
|
@@ -148,6 +132,8 @@ export default function SQLEditor({ ButtonComponent = MemoizedButton, SecondaryB
|
|
|
148
132
|
orgId: client.customerId || '*',
|
|
149
133
|
clientId: client.publicKey,
|
|
150
134
|
databaseType: client?.databaseType,
|
|
135
|
+
getCustomFields: !client.customerId || client.customerId === '*' ? false : true,
|
|
136
|
+
customFieldsByTable: customFields,
|
|
151
137
|
},
|
|
152
138
|
};
|
|
153
139
|
const cloudBody = { query };
|
package/dist/esm/Table.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAcrD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAyBD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IAEJ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IAErC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CAkC/B,CAAC;AAmGF,eAAe,KAAK,CAAC"}
|
package/dist/esm/Table.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useContext, useEffect } from 'react';
|
|
3
|
-
import { ClientContext, DashboardContext, DashboardFiltersContext, } from './Context';
|
|
3
|
+
import { ClientContext, CustomFieldContext, DashboardContext, DashboardFiltersContext, } from './Context';
|
|
4
4
|
import { getData } from './utils/dataFetcher';
|
|
5
5
|
import { mergeComparisonRange } from './utils/merge';
|
|
6
6
|
import QuillTable from './components/QuillTable';
|
|
@@ -44,13 +44,14 @@ const Table = (props) => {
|
|
|
44
44
|
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
45
45
|
const [client, _] = useContext(ClientContext);
|
|
46
46
|
if ('rows' in data && 'columns' in data) {
|
|
47
|
-
return (_jsx(QuillTable, { hideCSVDownloadButton: data.hideCSVDownloadButton,
|
|
47
|
+
return (_jsx(QuillTable, { hideCSVDownloadButton: data.hideCSVDownloadButton, columns: data.columns, rows: data.rows, className: data.className, containerStyle: data.containerStyle, LoadingComponent: data.LoadingComponent, isLoading: data.isLoading, downloadCSV: data.downloadCSV }));
|
|
48
48
|
}
|
|
49
49
|
return (_jsx(ChartUpdater, { hideCSVDownloadButton: data.hideCSVDownloadButton, dispatch: dispatch, dashboard: dashboard, reportId: data.reportId, className: data.className, containerStyle: data.containerStyle, dashboardFilters: dashboardFilters, client: client, csvFilename: data.csvFilename, LoadingComponent: data.LoadingComponent }));
|
|
50
50
|
};
|
|
51
51
|
const ChartUpdater = ({ reportId, containerStyle, className, dashboard, dispatch, client, dashboardFilters, csvFilename, hideCSVDownloadButton = true, LoadingComponent, }) => {
|
|
52
52
|
const { rows, loading } = useMemoizedRows(reportId);
|
|
53
53
|
const { downloadCSV } = useExport(reportId);
|
|
54
|
+
const [customFields] = useContext(CustomFieldContext);
|
|
54
55
|
useEffect(() => {
|
|
55
56
|
let isSubscribed = true;
|
|
56
57
|
async function getChartOptions() {
|
|
@@ -64,6 +65,7 @@ const ChartUpdater = ({ reportId, containerStyle, className, dashboard, dispatch
|
|
|
64
65
|
filters: [...Object.values(dashboardFilters)],
|
|
65
66
|
clientId: client.publicKey,
|
|
66
67
|
databaseType: client?.databaseType,
|
|
68
|
+
customFields,
|
|
67
69
|
},
|
|
68
70
|
};
|
|
69
71
|
const cloudBody = {
|
|
@@ -97,8 +99,6 @@ const ChartUpdater = ({ reportId, containerStyle, className, dashboard, dispatch
|
|
|
97
99
|
};
|
|
98
100
|
}, [dashboardFilters, client.customerId, reportId]);
|
|
99
101
|
return (_jsx(QuillTable, { hideCSVDownloadButton: hideCSVDownloadButton,
|
|
100
|
-
// @ts-ignore
|
|
101
|
-
downloadFileName: csvFilename || dashboard[reportId]?.name || '',
|
|
102
102
|
// @ts-ignore
|
|
103
103
|
columns: dashboard[reportId]?.columns || [],
|
|
104
104
|
// @ts-ignore
|
|
@@ -4,10 +4,18 @@ import { QuillTheme } from '../../QuillProvider';
|
|
|
4
4
|
export type DataLoaderChildProps = {
|
|
5
5
|
isLoading: boolean;
|
|
6
6
|
error?: string;
|
|
7
|
+
onPageChange: (page: {
|
|
8
|
+
currentPage: number;
|
|
9
|
+
rowsPerPage: number;
|
|
10
|
+
}) => void;
|
|
11
|
+
onSortChange: (sort: {
|
|
12
|
+
field: string;
|
|
13
|
+
direction: string;
|
|
14
|
+
}) => void;
|
|
7
15
|
};
|
|
8
16
|
export default function DataLoader({ id, children, }: {
|
|
9
17
|
id: string;
|
|
10
|
-
children: ({ isLoading, error }: DataLoaderChildProps) => JSX.Element;
|
|
18
|
+
children: ({ isLoading, error, onPageChange, onSortChange, }: DataLoaderChildProps) => JSX.Element;
|
|
11
19
|
}): JSX.Element;
|
|
12
20
|
type ColorMapType = {
|
|
13
21
|
[key: string]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataLoader.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DataLoader.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"DataLoader.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DataLoader.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3E,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,EAAE,EACF,QAAQ,GACT,EAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,EACT,SAAS,EACT,KAAK,EACL,YAAY,EACZ,YAAY,GACb,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;CACzC,GAAG,GAAG,CAAC,OAAO,CAmHd;AAED,KAAK,YAAY,GAAG;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,CAAC;AAIF,eAAO,MAAM,eAAe;QAKtB,MAAM;;mCAGC,WAAW,UACZ,UAAU,KACf,YAAY;4CAKd,yBAAyB,KAAK,WAAW;MAC1C,WA2FH,CAAC"}
|