@quillsql/react 2.12.52 → 2.13.0
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 +5 -3
- package/dist/cjs/ChartBuilder.d.ts +10 -3
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +62 -26
- package/dist/cjs/ChartEditor.d.ts +3 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +74 -16
- package/dist/cjs/Context.d.ts +17 -6
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +138 -73
- package/dist/cjs/Dashboard.d.ts +8 -4
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +146 -367
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +20 -14
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -0
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -1
- package/dist/cjs/QuillProvider.js +1 -1
- package/dist/cjs/ReportBuilder.d.ts +8 -12
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +163 -83
- package/dist/cjs/SQLEditor.d.ts +8 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +81 -28
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +6 -3
- package/dist/cjs/assets/AdjustmentsIcon.d.ts +5 -0
- package/dist/cjs/assets/AdjustmentsIcon.d.ts.map +1 -0
- package/dist/cjs/assets/AdjustmentsIcon.js +5 -0
- package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +2 -2
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +4 -3
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +12 -12
- package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts +2 -2
- package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +11 -5
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +91 -32
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +2 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +10 -3
- package/dist/cjs/components/Dashboard/util.d.ts +2 -2
- package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/util.js +2 -2
- package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelect.js +18 -13
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +67 -45
- package/dist/cjs/components/QuillSelect.d.ts +1 -1
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelect.js +29 -7
- package/dist/cjs/components/QuillSelectWithCombo.d.ts +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +47 -26
- package/dist/cjs/components/QuillTable.d.ts +3 -2
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +32 -19
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +2 -2
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +2 -2
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +17 -4
- package/dist/cjs/components/ReportBuilder/ui.d.ts +13 -8
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +15 -24
- package/dist/cjs/components/UiComponents.d.ts +17 -9
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +30 -24
- package/dist/cjs/hooks/useAstToFilterTree.d.ts +2 -2
- package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.d.ts +13 -5
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +158 -70
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +9 -3
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +15 -15
- package/dist/cjs/hooks/useVirtualTables.d.ts +12 -3
- package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
- package/dist/cjs/hooks/useVirtualTables.js +105 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +3 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.js +9 -9
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +21 -15
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +3 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +9 -9
- package/dist/cjs/models/Client.d.ts +16 -2
- package/dist/cjs/models/Client.d.ts.map +1 -1
- package/dist/cjs/models/Dashboard.d.ts +1 -1
- package/dist/cjs/models/Dashboard.d.ts.map +1 -1
- package/dist/cjs/models/Filter.d.ts +4 -3
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +38 -1
- package/dist/cjs/utils/astProcessing.d.ts +3 -3
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/client.d.ts.map +1 -1
- package/dist/cjs/utils/client.js +2 -7
- package/dist/cjs/utils/dashboard.d.ts +5 -5
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +90 -9
- package/dist/cjs/utils/dataFetcher.d.ts +4 -4
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +1 -1
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +2 -8
- package/dist/cjs/utils/paginationProcessing.js +1 -1
- package/dist/cjs/utils/pivotConstructor.d.ts +2 -2
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +1 -1
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +6 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +12 -9
- package/dist/cjs/utils/report.d.ts +6 -5
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +71 -25
- package/dist/cjs/utils/schema.d.ts +3 -3
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +39 -35
- package/dist/cjs/utils/tableProcessing.d.ts +18 -11
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +44 -23
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +6 -4
- package/dist/esm/ChartBuilder.d.ts +10 -3
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +59 -26
- package/dist/esm/ChartEditor.d.ts +3 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +76 -18
- package/dist/esm/Context.d.ts +17 -6
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +139 -74
- package/dist/esm/Dashboard.d.ts +8 -4
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +146 -367
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +21 -15
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -0
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -1
- package/dist/esm/QuillProvider.js +1 -1
- package/dist/esm/ReportBuilder.d.ts +8 -12
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +167 -87
- package/dist/esm/SQLEditor.d.ts +8 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +84 -31
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +7 -4
- package/dist/esm/assets/AdjustmentsIcon.d.ts +5 -0
- package/dist/esm/assets/AdjustmentsIcon.d.ts.map +1 -0
- package/dist/esm/assets/AdjustmentsIcon.js +3 -0
- package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +2 -2
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +4 -3
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +12 -12
- package/dist/esm/components/Dashboard/DashboardTemplate.d.ts +2 -2
- package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +11 -5
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +94 -35
- package/dist/esm/components/Dashboard/TableComponent.d.ts +2 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +10 -3
- package/dist/esm/components/Dashboard/util.d.ts +2 -2
- package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/util.js +2 -2
- package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelect.js +19 -14
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +68 -46
- package/dist/esm/components/QuillSelect.d.ts +1 -1
- package/dist/esm/components/QuillSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillSelect.js +30 -8
- package/dist/esm/components/QuillSelectWithCombo.d.ts +1 -1
- package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +48 -27
- package/dist/esm/components/QuillTable.d.ts +3 -2
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +32 -19
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -2
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +2 -2
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +17 -4
- package/dist/esm/components/ReportBuilder/ui.d.ts +13 -8
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +14 -19
- package/dist/esm/components/UiComponents.d.ts +17 -9
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +30 -24
- package/dist/esm/hooks/useAstToFilterTree.d.ts +2 -2
- package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.d.ts +13 -5
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +158 -73
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +10 -4
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +17 -17
- package/dist/esm/hooks/useVirtualTables.d.ts +12 -3
- package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
- package/dist/esm/hooks/useVirtualTables.js +106 -2
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +3 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -9
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +21 -15
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +3 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +9 -9
- package/dist/esm/models/Client.d.ts +16 -2
- package/dist/esm/models/Client.d.ts.map +1 -1
- package/dist/esm/models/Dashboard.d.ts +1 -1
- package/dist/esm/models/Dashboard.d.ts.map +1 -1
- package/dist/esm/models/Filter.d.ts +4 -3
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +36 -0
- package/dist/esm/utils/astProcessing.d.ts +3 -3
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/client.d.ts.map +1 -1
- package/dist/esm/utils/client.js +2 -7
- package/dist/esm/utils/dashboard.d.ts +5 -5
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +90 -9
- package/dist/esm/utils/dataFetcher.d.ts +4 -4
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +1 -1
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +2 -8
- package/dist/esm/utils/paginationProcessing.js +1 -1
- package/dist/esm/utils/pivotConstructor.d.ts +2 -2
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +1 -1
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +6 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +12 -9
- package/dist/esm/utils/report.d.ts +6 -5
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +70 -25
- package/dist/esm/utils/schema.d.ts +3 -3
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +39 -35
- package/dist/esm/utils/tableProcessing.d.ts +18 -11
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +41 -20
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useContext, useEffect, useRef, useState, } from 'react';
|
|
2
|
+
import { useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
3
|
import { DEFAULT_TAB_OPTIONS, MemoizedButton, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedSecondaryButton, MemoizedText, MemoizedPopover, QuillTabs, MemoizedModal, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillColumnSearchEmptyState, QuillChartBuilderFormContainer, QuillLoadingComponent, QuillTableSQLEditorComponent, } 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
|
-
import { ClientContext, DashboardContext, SchemaDataContext, ThemeContext, } from './Context';
|
|
7
|
+
import { ClientContext, DashboardContext, DashboardFiltersContext, SchemaDataContext, ThemeContext, } from './Context';
|
|
8
8
|
import { getTableNames, isNumericColumnType, } from './components/ReportBuilder/ast';
|
|
9
9
|
import { ChartBuilderWithModal } from './ChartBuilder';
|
|
10
10
|
import { QuillTextInput } from './components/UiComponents';
|
|
@@ -22,7 +22,7 @@ import { QuillSelectComponent } from './components/QuillSelect';
|
|
|
22
22
|
import { QuillCard } from './components/QuillCard';
|
|
23
23
|
import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
|
|
24
24
|
import { pivotToSql } from './utils/pivotProcessing';
|
|
25
|
-
import { getUniqueValuesByColumns, getDateRangeByColumns,
|
|
25
|
+
import { getUniqueValuesByColumns, getDateRangeByColumns, fetchResultsByQuery, getUniqueStringValues, fetchTableByAST, } from './utils/tableProcessing';
|
|
26
26
|
import { fetchAndProcessASTFromPrompt, fetchASTFromQuillReport, getAllPossibleColumns, } from './utils/astProcessing';
|
|
27
27
|
import PivotForm from './internals/ReportBuilder/PivotForm';
|
|
28
28
|
import { getDateBucketFromRange } from './utils/dates';
|
|
@@ -31,7 +31,7 @@ import { astToFilterTree, filterToAst, filterTreeToAst, } from './utils/astFilte
|
|
|
31
31
|
import useAstToFilterTree from './hooks/useAstToFilterTree';
|
|
32
32
|
import { filterSentence, filterStackToFilterTree, uniqueValuesToStringMap, } from './utils/filterProcessing';
|
|
33
33
|
import { QuillMultiSelectComponentWithCombo } from './components/QuillMultiSelectWithCombo';
|
|
34
|
-
import { shouldFetchMore,
|
|
34
|
+
import { shouldFetchMore, shouldSortInMemory, } from './utils/paginationProcessing';
|
|
35
35
|
import { EMPTY_INTERNAL_REPORT, fetchReportBuilderDataFromAST, formatRowsFromReport, } from './utils/report';
|
|
36
36
|
import equal from 'fast-deep-equal';
|
|
37
37
|
export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
@@ -67,11 +67,20 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
|
|
|
67
67
|
* ### Report Builder API
|
|
68
68
|
* @see https://docs.quillsql.com/components/report-builder
|
|
69
69
|
*/
|
|
70
|
-
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, onDiscardChanges = undefined, onSaveChanges = undefined, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponentWithCombo, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs,
|
|
70
|
+
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, onDiscardChanges = undefined, onSaveChanges = undefined, onCloseChartBuilder = undefined, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponentWithCombo, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs,
|
|
71
71
|
// CheckboxComponent = MemoizedCheckbox,
|
|
72
72
|
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, onClickChartElement, }) {
|
|
73
73
|
const [dashboard] = useContext(DashboardContext);
|
|
74
74
|
const [schemaData] = useContext(SchemaDataContext);
|
|
75
|
+
const { dashboardFilters } = useContext(DashboardFiltersContext);
|
|
76
|
+
const specificDashboardFilters = useMemo(() => {
|
|
77
|
+
if (!reportId)
|
|
78
|
+
return [];
|
|
79
|
+
const dashboardName = dashboard[reportId]?.dashboardName;
|
|
80
|
+
if (!dashboardName)
|
|
81
|
+
return [];
|
|
82
|
+
return Object.values(dashboardFilters[dashboardName] ?? {}).map((f) => f.filter);
|
|
83
|
+
}, [dashboardFilters, reportId, dashboard]);
|
|
75
84
|
const [reportInfo, setReportInfo] = useState(null);
|
|
76
85
|
const [aiPrompt, setAiPrompt] = useState('');
|
|
77
86
|
const [errorMessage, setErrorMessage] = useState('');
|
|
@@ -86,7 +95,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
86
95
|
const [openPopover, setOpenPopover] = useState(null);
|
|
87
96
|
const [loading, setLoading] = useState(!!initialTableName);
|
|
88
97
|
const [isChartBuilderOpen, setIsChartBuilderOpen] = useState(false);
|
|
89
|
-
const [,
|
|
98
|
+
const [isAddLoading, setIsAddLoading] = useState(false);
|
|
90
99
|
const [isCopying, setIsCopying] = useState(false);
|
|
91
100
|
const [dataDisplayed, setDataDisplayed] = useState(false);
|
|
92
101
|
const [rows, setRows] = useState([]);
|
|
@@ -94,6 +103,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
94
103
|
const [columns, setColumns] = useState([]);
|
|
95
104
|
const [tempReport, setTempReport] = useState(EMPTY_INTERNAL_REPORT);
|
|
96
105
|
const [uniqueValues, setUniqueValues] = useState({});
|
|
106
|
+
const [uniqueValuesIsLoading, setUniqueValuesIsLoading] = useState(false);
|
|
97
107
|
const [pivot, setPivot] = useState(null);
|
|
98
108
|
const [pivotData, setPivotData] = useState(null);
|
|
99
109
|
const [createdPivots, setCreatedPivots] = useState([]);
|
|
@@ -118,18 +128,23 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
118
128
|
const [pivotAggregation, setPivotAggregation] = useState(undefined);
|
|
119
129
|
const [dateRanges, setDateRanges] = useState(null);
|
|
120
130
|
const [client] = useContext(ClientContext);
|
|
121
|
-
// JANK: This is temp and stupid
|
|
122
|
-
const [overrideRecommendations, setOverrideRecommendations] = useState(true);
|
|
123
131
|
const [fieldValuesMap, setFieldValuesMap] = useState({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
|
|
124
132
|
const [globalUniqueValues, setGlobalUniqueValues] = useState({});
|
|
133
|
+
const [globalUniqueValuesIsLoading, setGlobalUniqueValuesIsLoading] = useState(false);
|
|
125
134
|
const { filterTree, filterStack } = useAstToFilterTree(formData, client); // Stores the state of filters
|
|
126
135
|
const [removingFilter, setRemovingFilter] = useState(false);
|
|
136
|
+
const [pivotRecommendationsEnabledState, setPivotRecommendationsEnabledState,] = useState(pivotRecommendationsEnabled);
|
|
137
|
+
const REPORT_BUILDER_PAGINATION = {
|
|
138
|
+
page: 0,
|
|
139
|
+
rowsPerPage: 20,
|
|
140
|
+
rowsPerRequest: 1000,
|
|
141
|
+
};
|
|
127
142
|
useEffect(() => {
|
|
128
143
|
if (!client) {
|
|
129
144
|
return;
|
|
130
145
|
}
|
|
131
|
-
if (client.
|
|
132
|
-
|
|
146
|
+
if (client.recommendedPivotsDisabled !== undefined) {
|
|
147
|
+
setPivotRecommendationsEnabledState(!client.recommendedPivotsDisabled);
|
|
133
148
|
}
|
|
134
149
|
if (!initialLoad && client.publicKey) {
|
|
135
150
|
clearAllState();
|
|
@@ -139,13 +154,18 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
139
154
|
updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
140
155
|
updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
141
156
|
}, [dataDisplayed]);
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
if (isChartBuilderOpen === false) {
|
|
159
|
+
onCloseChartBuilder && onCloseChartBuilder();
|
|
160
|
+
}
|
|
161
|
+
}, [isChartBuilderOpen]);
|
|
142
162
|
// Whenever unique values changes, update the fieldValuesMap, used in FilterModals
|
|
143
|
-
const updateFieldValuesMap = (
|
|
163
|
+
const updateFieldValuesMap = (curUniqueValues, tableName) => {
|
|
144
164
|
const newFieldValues = {};
|
|
145
|
-
if (
|
|
146
|
-
for (const field of Object.keys(
|
|
165
|
+
if (curUniqueValues[tableName]) {
|
|
166
|
+
for (const field of Object.keys(curUniqueValues[tableName])) {
|
|
147
167
|
newFieldValues[field] = [];
|
|
148
|
-
for (const value of Object.keys(
|
|
168
|
+
for (const value of Object.keys(curUniqueValues[tableName][field])) {
|
|
149
169
|
newFieldValues[field]?.push(value);
|
|
150
170
|
}
|
|
151
171
|
}
|
|
@@ -166,7 +186,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
166
186
|
};
|
|
167
187
|
}, []);
|
|
168
188
|
const updatePivot = async (changeField, fieldKey) => {
|
|
169
|
-
const newPivot = pivot;
|
|
189
|
+
const newPivot = deepCopy(pivot);
|
|
170
190
|
setTableLoading(true);
|
|
171
191
|
// @ts-ignore
|
|
172
192
|
newPivot[fieldKey] = changeField;
|
|
@@ -191,19 +211,19 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
191
211
|
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
192
212
|
}
|
|
193
213
|
let distinctValuesForQuery = {};
|
|
194
|
-
|
|
214
|
+
setPivot(newPivot);
|
|
215
|
+
if (newPivot.columnField) {
|
|
195
216
|
distinctValuesForQuery = await getUniqueValuesByColumns([
|
|
196
217
|
{
|
|
197
|
-
field:
|
|
198
|
-
label:
|
|
218
|
+
field: newPivot.columnField,
|
|
219
|
+
label: newPivot.columnField,
|
|
199
220
|
format: 'string',
|
|
200
221
|
},
|
|
201
222
|
], activeQuery, [], client, schemaData.customFields ?? []);
|
|
202
223
|
}
|
|
203
|
-
const pivotedData = await generatePivotTable(
|
|
224
|
+
const pivotedData = await generatePivotTable(newPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, distinctValuesForQuery);
|
|
204
225
|
setPivotData(pivotedData || []);
|
|
205
226
|
const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
|
|
206
|
-
setPivot(newPivot);
|
|
207
227
|
setFormattedRows(formattedRows);
|
|
208
228
|
setTableLoading(false);
|
|
209
229
|
};
|
|
@@ -235,7 +255,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
235
255
|
setActivePath(null);
|
|
236
256
|
setOpenPopover(null);
|
|
237
257
|
setLoading(false);
|
|
238
|
-
setIsPending(false);
|
|
239
258
|
setDataDisplayed(false);
|
|
240
259
|
setRows([]);
|
|
241
260
|
setColumns([]);
|
|
@@ -248,8 +267,10 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
248
267
|
}, 0);
|
|
249
268
|
};
|
|
250
269
|
const fetchGlobalUniqueValues = async (columns, currentTable, client) => {
|
|
251
|
-
|
|
270
|
+
setGlobalUniqueValuesIsLoading(true);
|
|
271
|
+
const global = await getUniqueStringValues(columns, currentTable, client, schemaData.customFields, undefined, true);
|
|
252
272
|
setGlobalUniqueValues(uniqueValuesToStringMap(global));
|
|
273
|
+
setGlobalUniqueValuesIsLoading(false);
|
|
253
274
|
};
|
|
254
275
|
const uniqueValuesDependenciesRef = useRef({ client, columns, currentTable });
|
|
255
276
|
const memoizedFetchGlobalUniqueValues = useCallback(fetchGlobalUniqueValues, []);
|
|
@@ -397,11 +418,13 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
397
418
|
setLoading(true);
|
|
398
419
|
const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
|
|
399
420
|
if (tableInfo) {
|
|
400
|
-
|
|
421
|
+
setUniqueValuesIsLoading(true);
|
|
422
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName, client, schemaData.customFields, uniqueValues, true);
|
|
401
423
|
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
402
424
|
setUniqueValues(newUniqueValues);
|
|
403
425
|
updateFieldValuesMap(newUniqueValues, initialTableName);
|
|
404
426
|
}
|
|
427
|
+
setUniqueValuesIsLoading(false);
|
|
405
428
|
const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
|
|
406
429
|
setDateRanges(dateRangesTemp);
|
|
407
430
|
}
|
|
@@ -682,13 +705,14 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
682
705
|
};
|
|
683
706
|
const [previousPage, setPreviousPage] = useState(0);
|
|
684
707
|
const [currentProcessing, setCurrentProcessing] = useState({
|
|
685
|
-
page:
|
|
708
|
+
page: REPORT_BUILDER_PAGINATION,
|
|
686
709
|
});
|
|
687
710
|
const [numberOfRows, setNumberOfRows] = useState(0);
|
|
711
|
+
const [rowCountIsLoading, setRowCountIsLoading] = useState(false);
|
|
688
712
|
const [tableLoading, setTableLoading] = useState(false);
|
|
689
713
|
const onPageChange = (page) => {
|
|
690
714
|
if (currentProcessing.page &&
|
|
691
|
-
shouldFetchMore(
|
|
715
|
+
shouldFetchMore(REPORT_BUILDER_PAGINATION, page, previousPage)) {
|
|
692
716
|
const newPagination = { ...currentProcessing.page, page };
|
|
693
717
|
const updatedProcessing = { ...currentProcessing, page: newPagination };
|
|
694
718
|
setCurrentProcessing(updatedProcessing);
|
|
@@ -699,28 +723,50 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
699
723
|
}
|
|
700
724
|
};
|
|
701
725
|
const onSortChange = (sort) => {
|
|
702
|
-
if (shouldSortInMemory(
|
|
726
|
+
if (shouldSortInMemory(REPORT_BUILDER_PAGINATION, numberOfRows, !!pivot)) {
|
|
703
727
|
return;
|
|
704
728
|
}
|
|
705
|
-
const updatedProcessing = { page:
|
|
729
|
+
const updatedProcessing = { page: REPORT_BUILDER_PAGINATION, sort };
|
|
706
730
|
handleRunQuery(updatedProcessing, true);
|
|
707
731
|
setCurrentProcessing(updatedProcessing);
|
|
708
732
|
setPreviousPage(0);
|
|
709
733
|
};
|
|
710
|
-
const
|
|
734
|
+
const onFilterPreviewChange = (preview) => {
|
|
735
|
+
handleRunQuery(currentProcessing, true, preview);
|
|
736
|
+
};
|
|
737
|
+
const fetchRowCount = async (processing, includeFilters) => {
|
|
738
|
+
if (!client || !activeQuery) {
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
setRowCountIsLoading(true);
|
|
742
|
+
const tableInfo = await fetchResultsByQuery(activeQuery, client, processing, schemaData.customFields, includeFilters ? specificDashboardFilters : undefined, includeFilters
|
|
743
|
+
? tempReport.dateField ?? reportInfo?.dateField
|
|
744
|
+
: undefined, false, true);
|
|
745
|
+
if (tableInfo.rowCount) {
|
|
746
|
+
setNumberOfRows(tableInfo.rowCount);
|
|
747
|
+
}
|
|
748
|
+
setRowCountIsLoading(false);
|
|
749
|
+
};
|
|
750
|
+
const fetchRowCountFromAST = async (ast, where) => {
|
|
751
|
+
setRowCountIsLoading(true);
|
|
752
|
+
const tableData = await fetchTableByAST({ ...ast, where }, client, { page: REPORT_BUILDER_PAGINATION }, undefined, false, true);
|
|
753
|
+
if (tableData.rowCount) {
|
|
754
|
+
setNumberOfRows(tableData.rowCount);
|
|
755
|
+
}
|
|
756
|
+
setRowCountIsLoading(false);
|
|
757
|
+
};
|
|
758
|
+
const handleRunQuery = async (processing, resetRows = false, includeFilters = false) => {
|
|
711
759
|
try {
|
|
712
760
|
setErrorMessage('');
|
|
713
761
|
setTableLoading(true);
|
|
714
|
-
const tableInfo = await
|
|
762
|
+
const tableInfo = await fetchResultsByQuery(activeQuery, client, processing, schemaData.customFields, includeFilters ? specificDashboardFilters : undefined, includeFilters ? tempReport.dateField : undefined, true);
|
|
715
763
|
if (tableInfo.error) {
|
|
716
764
|
throw new Error(tableInfo.error);
|
|
717
765
|
}
|
|
718
766
|
else if (tableInfo.rows.length === 0) {
|
|
719
767
|
throw new Error('No data found');
|
|
720
768
|
}
|
|
721
|
-
|
|
722
|
-
setNumberOfRows(tableInfo.rowCount);
|
|
723
|
-
}
|
|
769
|
+
fetchRowCount(processing, includeFilters);
|
|
724
770
|
setCurrentProcessing(processing);
|
|
725
771
|
let tempRows = [...rows, ...tableInfo.rows];
|
|
726
772
|
if (resetRows) {
|
|
@@ -728,6 +774,11 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
728
774
|
}
|
|
729
775
|
setRows(tempRows);
|
|
730
776
|
setFormattedRows(formatRowsFromReport({ rows: tempRows, columns: tableInfo.columns }));
|
|
777
|
+
setTempReport({
|
|
778
|
+
...tempReport,
|
|
779
|
+
rows: tempRows,
|
|
780
|
+
rowCount: tableInfo.rowCount ?? tempReport.rowCount,
|
|
781
|
+
});
|
|
731
782
|
setColumns(tableInfo.columns);
|
|
732
783
|
setTableLoading(false);
|
|
733
784
|
}
|
|
@@ -739,7 +790,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
739
790
|
return;
|
|
740
791
|
}
|
|
741
792
|
};
|
|
742
|
-
const renderFilters = () => {
|
|
793
|
+
const renderFilters = (actionsEnabled = true) => {
|
|
743
794
|
// Render filterStack
|
|
744
795
|
return (_jsx("div", { style: {
|
|
745
796
|
display: 'flex',
|
|
@@ -783,7 +834,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
783
834
|
} }) }, index));
|
|
784
835
|
}
|
|
785
836
|
else if (item.value) {
|
|
786
|
-
return (_jsx(FilterPopoverWrapper, { schema: schemaData.schema.find((s) => s.name === currentTable || s.displayName === currentTable) ?? schemaData.schema[0], filter: item.value, filterLabel: item.value ? filterSentence(item.value) : '', index: index, FilterTagComponent: FilterPopoverComponent, FilterModal: FilterModal, fieldValuesMap: globalUniqueValues, priorFilters: filterStack.slice(0, index > 0 ? index - 1 : 0), columns: columns, client: client, customFields: schemaData.customFields, baseAst: baseAst, endpoint: QUILL_SERVER, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (filter) => {
|
|
837
|
+
return (_jsx(FilterPopoverWrapper, { schema: schemaData.schema.find((s) => s.name === currentTable || s.displayName === currentTable) ?? schemaData.schema[0], filter: item.value, filterLabel: item.value ? filterSentence(item.value) : '', index: index, FilterTagComponent: FilterPopoverComponent, FilterModal: FilterModal, fieldValuesMap: globalUniqueValues, fieldValuesMapIsLoading: globalUniqueValuesIsLoading, priorFilters: filterStack.slice(0, index > 0 ? index - 1 : 0), columns: columns, client: client, customFields: schemaData.customFields, baseAst: baseAst, endpoint: QUILL_SERVER, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (filter) => {
|
|
787
838
|
item.value = filter;
|
|
788
839
|
let newFormData = null;
|
|
789
840
|
if (filterTree) {
|
|
@@ -847,7 +898,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
847
898
|
fetchSqlQuery(newAst, newFormData);
|
|
848
899
|
setRemovingFilter(false);
|
|
849
900
|
}
|
|
850
|
-
} }, `filter_${index}_${item.value ? filterSentence(item.value) : ''}`));
|
|
901
|
+
}, disabled: !actionsEnabled }, `filter_${index}_${item.value ? filterSentence(item.value) : ''}`));
|
|
851
902
|
}
|
|
852
903
|
}) }));
|
|
853
904
|
};
|
|
@@ -874,12 +925,18 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
874
925
|
},
|
|
875
926
|
as: null,
|
|
876
927
|
});
|
|
928
|
+
const updateUniqueValue = (uniqueStrings, table) => {
|
|
929
|
+
const uniqueStringsObj = {};
|
|
930
|
+
uniqueStringsObj[table] = uniqueStrings ?? {};
|
|
931
|
+
setUniqueValues(uniqueStringsObj);
|
|
932
|
+
updateFieldValuesMap(uniqueStringsObj, table);
|
|
933
|
+
};
|
|
877
934
|
const fetchReportFromASTHelper = async (baseAst, newFormData, curPivot, curSchema, previousReport) => {
|
|
878
935
|
const curFormData = newFormData !== undefined ? newFormData : formData;
|
|
879
936
|
let reportBuilderInfo = undefined;
|
|
880
937
|
try {
|
|
881
938
|
setLoading(true);
|
|
882
|
-
reportBuilderInfo = await fetchReportBuilderDataFromAST(baseAst, curFormData, curSchema ?? schemaData.schema, client, curPivot ?? pivot, formData, currentTable, { uniqueStrings: uniqueValues, dateRanges: dateRanges ?? {} }, previousReport ?? reportInfo ?? undefined, schemaData.customFields);
|
|
939
|
+
reportBuilderInfo = await fetchReportBuilderDataFromAST(baseAst, curFormData, curSchema ?? schemaData.schema, client, curPivot ?? pivot, formData, currentTable, { uniqueStrings: uniqueValues, dateRanges: dateRanges ?? {} }, previousReport ?? reportInfo ?? undefined, schemaData.customFields, true, true, { page: REPORT_BUILDER_PAGINATION });
|
|
883
940
|
if (reportBuilderInfo.error) {
|
|
884
941
|
throw new Error(reportBuilderInfo.error);
|
|
885
942
|
}
|
|
@@ -898,21 +955,22 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
898
955
|
setErrorMessage('Failed to fetch');
|
|
899
956
|
return;
|
|
900
957
|
}
|
|
958
|
+
fetchRowCountFromAST(baseAst, curFormData);
|
|
901
959
|
const reportTable = reportBuilderInfo.table;
|
|
902
960
|
const reportBuilderInfoColumns = reportBuilderInfo.columns.map((column) => {
|
|
903
961
|
return `${reportTable}.${column.field}`;
|
|
904
962
|
});
|
|
963
|
+
const prevFormData = formData;
|
|
964
|
+
const prevTable = currentTable;
|
|
905
965
|
setRows(reportBuilderInfo.rows);
|
|
906
966
|
setColumns(reportBuilderInfo.columns);
|
|
907
|
-
setNumberOfRows(reportBuilderInfo.rowCount);
|
|
967
|
+
// setNumberOfRows(reportBuilderInfo.rowCount);
|
|
908
968
|
setPivot(reportBuilderInfo.pivot);
|
|
909
969
|
setPivotData(reportBuilderInfo.pivotData);
|
|
970
|
+
setDateRanges(reportBuilderInfo.dateRanges);
|
|
910
971
|
setFormattedRows(reportBuilderInfo.formattedRows);
|
|
911
972
|
setTempReport(reportBuilderInfo.report);
|
|
912
973
|
setSelectedColumns(reportBuilderInfoColumns);
|
|
913
|
-
setUniqueValues(reportBuilderInfo.uniqueValues);
|
|
914
|
-
updateFieldValuesMap(reportBuilderInfo.uniqueValues, reportBuilderInfo.table);
|
|
915
|
-
setDateRanges(reportBuilderInfo.dateRanges);
|
|
916
974
|
setLoading(false);
|
|
917
975
|
setDataDisplayed(true);
|
|
918
976
|
setCurrentTable(reportBuilderInfo.table);
|
|
@@ -924,6 +982,31 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
924
982
|
setPivotValueField(reportBuilderInfo.pivot.valueField);
|
|
925
983
|
}
|
|
926
984
|
setReportInfo(reportBuilderInfo.report);
|
|
985
|
+
// fetch unique values after everything else since it is the most expensive
|
|
986
|
+
if (prevTable !== reportBuilderInfo.table ||
|
|
987
|
+
!equal(prevFormData, curFormData)) {
|
|
988
|
+
try {
|
|
989
|
+
setUniqueValuesIsLoading(true);
|
|
990
|
+
const schema = curSchema ?? schemaData.schema;
|
|
991
|
+
const tableInfo = schema.find((tableInfo) => tableInfo.name === reportBuilderInfo?.table);
|
|
992
|
+
if (!reportBuilderInfo.table || !tableInfo) {
|
|
993
|
+
throw new Error('No table found;');
|
|
994
|
+
}
|
|
995
|
+
const uniqueStrings = await getUniqueStringValues(tableInfo.columns, reportBuilderInfo.table, client, schemaData.customFields, undefined, true, reportBuilderInfo.query);
|
|
996
|
+
updateUniqueValue(uniqueStrings, reportBuilderInfo.table);
|
|
997
|
+
setUniqueValuesIsLoading(false);
|
|
998
|
+
}
|
|
999
|
+
catch (err) {
|
|
1000
|
+
if (err instanceof Error) {
|
|
1001
|
+
setErrorMessage(err.message);
|
|
1002
|
+
setLoading(false);
|
|
1003
|
+
return { error: true, message: err.message, rows: [] };
|
|
1004
|
+
}
|
|
1005
|
+
setLoading(false);
|
|
1006
|
+
setErrorMessage('Failed to fetch');
|
|
1007
|
+
return { error: true, message: 'Failed to fetch', rows: [] };
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
927
1010
|
};
|
|
928
1011
|
const fetchAstFromPromptHelper = async (overridePrompt) => {
|
|
929
1012
|
let astInfo = {};
|
|
@@ -989,7 +1072,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
989
1072
|
};
|
|
990
1073
|
return (_jsx("div", { style: { ...style }, ref: setNodeRef, children: _jsx(DraggableColumnComponent, { label: snakeAndCamelCaseToTitleCase(label), onDelete: onDelete, DragHandle: (props) => (_jsx("div", { style: {
|
|
991
1074
|
cursor: 'grab',
|
|
992
|
-
}, ...attributes, ...listeners, children: _jsx(props.dragIcon, {}) })) }) }));
|
|
1075
|
+
}, ...attributes, ...listeners, children: _jsx(props.dragIcon, {}) })), deleteDisabled: loading }) }));
|
|
993
1076
|
};
|
|
994
1077
|
function DraggableColumns() {
|
|
995
1078
|
const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, {
|
|
@@ -1064,7 +1147,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1064
1147
|
display: 'flex',
|
|
1065
1148
|
flexDirection: 'column',
|
|
1066
1149
|
gap: 8,
|
|
1067
|
-
}, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
|
|
1150
|
+
}, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => !loading && handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
|
|
1068
1151
|
}
|
|
1069
1152
|
// TODO: Refactor this part
|
|
1070
1153
|
if (loading || initialChartLoad) {
|
|
@@ -1077,11 +1160,10 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1077
1160
|
if (!openPopover) {
|
|
1078
1161
|
setOpenPopover('AddColumnModal');
|
|
1079
1162
|
}
|
|
1080
|
-
}, label: 'Select columns' }), _jsx(ModalComponent, { isOpen: openPopover === 'AddColumnModal', setIsOpen: (isOpen) => {
|
|
1163
|
+
}, label: 'Select columns', disabled: true }), _jsx(ModalComponent, { isOpen: openPopover === 'AddColumnModal', setIsOpen: (isOpen) => {
|
|
1081
1164
|
if (!isOpen) {
|
|
1082
1165
|
// delay onClose callback so onClick no-ops
|
|
1083
1166
|
setTimeout(() => {
|
|
1084
|
-
setIsPending(false);
|
|
1085
1167
|
setActiveEditItem(null);
|
|
1086
1168
|
setActivePath(null);
|
|
1087
1169
|
setOpenPopover(null);
|
|
@@ -1099,7 +1181,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1099
1181
|
flexDirection: 'column',
|
|
1100
1182
|
gap: 8,
|
|
1101
1183
|
marginBottom: 12,
|
|
1102
|
-
}, children: renderFilters() })), _jsxs("div", { style: {
|
|
1184
|
+
}, children: renderFilters(false) })), _jsxs("div", { style: {
|
|
1103
1185
|
display: 'flex',
|
|
1104
1186
|
flexDirection: 'column',
|
|
1105
1187
|
alignItems: 'flex-start',
|
|
@@ -1125,14 +1207,12 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1125
1207
|
}
|
|
1126
1208
|
setOpenPopover('AddFilterPopover');
|
|
1127
1209
|
setActivePath('');
|
|
1128
|
-
setIsPending(true);
|
|
1129
1210
|
}
|
|
1130
|
-
}, label: 'Add filter' }), _jsx("div", { style: {
|
|
1211
|
+
}, label: 'Add filter', disabled: true }), _jsx("div", { style: {
|
|
1131
1212
|
position: 'relative',
|
|
1132
1213
|
...(openPopover === 'AddFilterPopover' && { top: 12 }),
|
|
1133
1214
|
}, children: _jsx(PopoverComponent, { isOpen: openPopover === 'AddFilterPopover', setIsOpen: (isOpen) => {
|
|
1134
1215
|
if (!isOpen) {
|
|
1135
|
-
setIsPending(false);
|
|
1136
1216
|
setActivePath(null);
|
|
1137
1217
|
setOpenPopover(null);
|
|
1138
1218
|
setTimeout(() => {
|
|
@@ -1143,9 +1223,8 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1143
1223
|
}, popoverTitle: 'Add filter', popoverChildren: _jsx(FilterModal, { schema: schemaData.schema.find((s) => s.name === currentTable ||
|
|
1144
1224
|
s.displayName === currentTable) ?? schemaData.schema[0], fieldValuesMap: uniqueValues[getTableNames(baseAst).length === 1
|
|
1145
1225
|
? getTableNames(baseAst)[0]
|
|
1146
|
-
: initialTableName], onSubmitFilter: (filter) => {
|
|
1226
|
+
: initialTableName], fieldValuesMapIsLoading: uniqueValuesIsLoading, onSubmitFilter: (filter) => {
|
|
1147
1227
|
setOpenPopover(null);
|
|
1148
|
-
setIsPending(false);
|
|
1149
1228
|
const item = filterToAst(filter, client.databaseType.toLowerCase());
|
|
1150
1229
|
handleInsertion(item, 'AND', false);
|
|
1151
1230
|
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) })] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _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, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEditingPivot, setShowUpdatePivot: setIsEditingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
|
|
@@ -1157,14 +1236,14 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1157
1236
|
// TODOs
|
|
1158
1237
|
selectPivot: () => {
|
|
1159
1238
|
return;
|
|
1160
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled:
|
|
1239
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: true, pivotRecommendationsEnabled: pivotRecommendationsEnabledState, report: tempReport ?? reportInfo }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], uniqueValuesIsLoading: uniqueValuesIsLoading, setPivotRowField: (value) => {
|
|
1161
1240
|
setPivotRowField(value);
|
|
1162
1241
|
}, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
|
|
1163
1242
|
setPivot(null);
|
|
1164
1243
|
setPivotData([]);
|
|
1165
1244
|
const formattedRows = formatRows(rows, columns, false);
|
|
1166
1245
|
setFormattedRows(formattedRows);
|
|
1167
|
-
}, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, PivotColumnContainer: PivotColumnContainer }))] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && (_jsx("div", { style: {
|
|
1246
|
+
}, isLoading: tableLoading, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, PivotColumnContainer: PivotColumnContainer }))] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && (_jsx("div", { style: {
|
|
1168
1247
|
display: 'flex',
|
|
1169
1248
|
flexDirection: 'column',
|
|
1170
1249
|
gap: 8,
|
|
@@ -1172,7 +1251,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1172
1251
|
}, children: _jsx(SortSentence, { sortData: {
|
|
1173
1252
|
type: pivot.sortDirection,
|
|
1174
1253
|
expr: { type: 'column_ref', column: pivot.sortField },
|
|
1175
|
-
}, columns: selectedColumns, setIsPending:
|
|
1254
|
+
}, columns: selectedColumns, setIsPending: () => { }, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
1176
1255
|
setPivot({ ...pivot, sort: false });
|
|
1177
1256
|
setBaseAst(deepCopy(baseAst));
|
|
1178
1257
|
if (!pivot) {
|
|
@@ -1200,7 +1279,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1200
1279
|
gap: 8,
|
|
1201
1280
|
marginBottom: 12,
|
|
1202
1281
|
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, onSave: (column, direction) => {
|
|
1203
|
-
setIsPending(false);
|
|
1204
1282
|
setActiveEditItem(null);
|
|
1205
1283
|
setOpenPopover(null);
|
|
1206
1284
|
if (column === '')
|
|
@@ -1221,14 +1299,14 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1221
1299
|
if (!pivot) {
|
|
1222
1300
|
fetchSqlQuery(newAst);
|
|
1223
1301
|
}
|
|
1224
|
-
}, setIsPending:
|
|
1302
|
+
}, setIsPending: () => { }, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
1225
1303
|
const newAst = { ...baseAst };
|
|
1226
1304
|
newAst.orderby.splice(id, 1);
|
|
1227
1305
|
setBaseAst(deepCopy(newAst));
|
|
1228
1306
|
if (!pivot) {
|
|
1229
1307
|
fetchSqlQuery(newAst);
|
|
1230
1308
|
}
|
|
1231
|
-
}, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-${id}`))) })), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1309
|
+
}, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, disabled: true }, `sort-sentence-${id}`))) })), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1232
1310
|
if (!selectedColumns ||
|
|
1233
1311
|
selectedColumns.length === 0 ||
|
|
1234
1312
|
loading) {
|
|
@@ -1237,9 +1315,8 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1237
1315
|
if (!openPopover) {
|
|
1238
1316
|
setOpenPopover('AddSortPopover');
|
|
1239
1317
|
}
|
|
1240
|
-
}, label: "Add sort" }), _jsx(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
|
|
1318
|
+
}, label: "Add sort", disabled: true }), _jsx(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
|
|
1241
1319
|
if (!isOpen) {
|
|
1242
|
-
setIsPending(false);
|
|
1243
1320
|
setActiveEditItem(null);
|
|
1244
1321
|
setActivePath(null);
|
|
1245
1322
|
setOpenPopover(null);
|
|
@@ -1268,7 +1345,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1268
1345
|
setOpenPopover(null);
|
|
1269
1346
|
setBaseAst(deepCopy(newAst));
|
|
1270
1347
|
fetchSqlQuery(newAst);
|
|
1271
|
-
}, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }) })) : (_jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1348
|
+
}, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, disabled: true }) })) : (_jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1272
1349
|
if (!selectedColumns ||
|
|
1273
1350
|
selectedColumns.length === 0 ||
|
|
1274
1351
|
loading) {
|
|
@@ -1277,9 +1354,8 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1277
1354
|
if (!openPopover) {
|
|
1278
1355
|
setOpenPopover('AddLimitPopover');
|
|
1279
1356
|
}
|
|
1280
|
-
}, label: 'Add limit' }), _jsx(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
|
|
1357
|
+
}, label: 'Add limit', disabled: true }), _jsx(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
|
|
1281
1358
|
if (!isOpen) {
|
|
1282
|
-
setIsPending(false);
|
|
1283
1359
|
setActiveEditItem(null);
|
|
1284
1360
|
setActivePath(null);
|
|
1285
1361
|
setOpenPopover(null);
|
|
@@ -1326,7 +1402,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1326
1402
|
if (!isOpen) {
|
|
1327
1403
|
// delay onClose callback so onClick no-ops
|
|
1328
1404
|
setTimeout(() => {
|
|
1329
|
-
setIsPending(false);
|
|
1330
1405
|
setActiveEditItem(null);
|
|
1331
1406
|
setActivePath(null);
|
|
1332
1407
|
setOpenPopover(null);
|
|
@@ -1370,7 +1445,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1370
1445
|
}
|
|
1371
1446
|
setOpenPopover('AddFilterPopover');
|
|
1372
1447
|
setActivePath('');
|
|
1373
|
-
setIsPending(true);
|
|
1374
1448
|
}
|
|
1375
1449
|
}, label: 'Add filter' }), _jsx("div", { style: {
|
|
1376
1450
|
position: 'relative',
|
|
@@ -1380,16 +1454,14 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1380
1454
|
// delay onClose callback so onClick no-ops
|
|
1381
1455
|
setOpenPopover(null);
|
|
1382
1456
|
setTimeout(() => {
|
|
1383
|
-
setIsPending(false);
|
|
1384
1457
|
setActivePath(null);
|
|
1385
1458
|
clearCheckboxes();
|
|
1386
1459
|
setActiveEditItem(null);
|
|
1387
1460
|
}, 300);
|
|
1388
1461
|
}
|
|
1389
1462
|
}, popoverTitle: "Add filter", popoverChildren: _jsx(FilterModal, { schema: schemaData.schema.find((s) => s.name === currentTable ||
|
|
1390
|
-
s.displayName === currentTable) ?? schemaData.schema[0], fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
|
|
1463
|
+
s.displayName === currentTable) ?? schemaData.schema[0], fieldValuesMap: fieldValuesMap, fieldValuesMapIsLoading: uniqueValuesIsLoading, onSubmitFilter: (filter) => {
|
|
1391
1464
|
setOpenPopover(null);
|
|
1392
|
-
setIsPending(false);
|
|
1393
1465
|
const item = filterToAst(filter, client.databaseType.toLowerCase());
|
|
1394
1466
|
handleInsertion(item, 'AND', false);
|
|
1395
1467
|
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) })] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _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: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEditingPivot, setShowUpdatePivot: setIsEditingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
|
|
@@ -1397,29 +1469,32 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1397
1469
|
setPivotData(null);
|
|
1398
1470
|
const formattedRows = formatRows(rows, columns, false);
|
|
1399
1471
|
setFormattedRows(formattedRows);
|
|
1400
|
-
}, selectPivot: async (
|
|
1401
|
-
if (!
|
|
1472
|
+
}, selectPivot: async (selectedPivot, uniqueValues, dateRange, pivotTable) => {
|
|
1473
|
+
if (!selectedPivot)
|
|
1402
1474
|
return;
|
|
1403
1475
|
const newAst = { ...baseAst };
|
|
1404
1476
|
newAst.orderby = null;
|
|
1405
|
-
if (
|
|
1406
|
-
|
|
1407
|
-
|
|
1477
|
+
if (selectedPivot.rowFieldType === 'date') {
|
|
1478
|
+
selectedPivot['sort'] = true;
|
|
1479
|
+
selectedPivot['sortDirection'] = 'ASC';
|
|
1408
1480
|
}
|
|
1409
1481
|
setBaseAst(newAst); // trigger refetch
|
|
1410
1482
|
let dateBucket = undefined;
|
|
1411
1483
|
if (dateRange) {
|
|
1412
1484
|
dateBucket = getDateBucketFromRange(dateRange);
|
|
1413
1485
|
}
|
|
1486
|
+
setPivot(selectedPivot);
|
|
1414
1487
|
if (!pivotTable) {
|
|
1415
|
-
|
|
1488
|
+
setTableLoading(true);
|
|
1489
|
+
pivotTable = await generatePivotTable(selectedPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
|
|
1416
1490
|
}
|
|
1491
|
+
// no other calls made
|
|
1417
1492
|
setPivotData(pivotTable || []);
|
|
1418
|
-
|
|
1419
|
-
const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
|
|
1493
|
+
const formattedRows = formatRows(pivotTable.rows, columns, true, selectedPivot.aggregationType);
|
|
1420
1494
|
setFormattedRows(formattedRows);
|
|
1421
1495
|
setErrorMessage('');
|
|
1422
|
-
|
|
1496
|
+
setTableLoading(false); // only set to false if this was the final call
|
|
1497
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], uniqueValuesIsLoading: uniqueValuesIsLoading, disabled: !baseAst || !dataDisplayed || tableLoading, pivotRecommendationsEnabled: pivotRecommendationsEnabledState, report: tempReport }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], uniqueValuesIsLoading: uniqueValuesIsLoading, setPivotRowField: (value) => {
|
|
1423
1498
|
setPivotRowField(value);
|
|
1424
1499
|
updatePivot(value, 'rowField');
|
|
1425
1500
|
}, setPivotColumnField: (value) => {
|
|
@@ -1436,7 +1511,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1436
1511
|
setPivotData([]);
|
|
1437
1512
|
const formattedRows = formatRows(rows, columns, false);
|
|
1438
1513
|
setFormattedRows(formattedRows);
|
|
1439
|
-
}, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, PivotColumnContainer: PivotColumnContainer }))] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && (_jsx("div", { style: {
|
|
1514
|
+
}, isLoading: tableLoading, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, PivotColumnContainer: PivotColumnContainer }))] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && (_jsx("div", { style: {
|
|
1440
1515
|
display: 'flex',
|
|
1441
1516
|
flexDirection: 'column',
|
|
1442
1517
|
gap: 8,
|
|
@@ -1451,7 +1526,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1451
1526
|
`.${pivot.rowField}`,
|
|
1452
1527
|
`.${pivot.valueField || 'count'}`,
|
|
1453
1528
|
]
|
|
1454
|
-
: selectedColumns, setIsPending:
|
|
1529
|
+
: selectedColumns, setIsPending: () => { }, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
|
|
1455
1530
|
if (pivot) {
|
|
1456
1531
|
const tempPivot = { ...pivot, sort: false };
|
|
1457
1532
|
let dateBucket = undefined;
|
|
@@ -1506,7 +1581,7 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1506
1581
|
flexDirection: 'column',
|
|
1507
1582
|
gap: 8,
|
|
1508
1583
|
marginBottom: 12,
|
|
1509
|
-
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending:
|
|
1584
|
+
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: () => { }, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
1510
1585
|
if (pivot) {
|
|
1511
1586
|
setPivot({ ...pivot, sort: false });
|
|
1512
1587
|
return;
|
|
@@ -1529,7 +1604,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1529
1604
|
});
|
|
1530
1605
|
return;
|
|
1531
1606
|
}
|
|
1532
|
-
setIsPending(false);
|
|
1533
1607
|
setActiveEditItem(null);
|
|
1534
1608
|
setOpenPopover(null);
|
|
1535
1609
|
if (column === '')
|
|
@@ -1560,7 +1634,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1560
1634
|
...(openPopover === 'AddSortPopover' && { top: 12 }),
|
|
1561
1635
|
}, children: _jsx(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
|
|
1562
1636
|
if (!isOpen) {
|
|
1563
|
-
setIsPending(false);
|
|
1564
1637
|
setActiveEditItem(null);
|
|
1565
1638
|
setActivePath(null);
|
|
1566
1639
|
setOpenPopover(null);
|
|
@@ -1655,7 +1728,6 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1655
1728
|
...(openPopover === 'AddLimitPopover' && { top: 12 }),
|
|
1656
1729
|
}, children: _jsx(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
|
|
1657
1730
|
if (!isOpen) {
|
|
1658
|
-
setIsPending(false);
|
|
1659
1731
|
setActiveEditItem(null);
|
|
1660
1732
|
setActivePath(null);
|
|
1661
1733
|
setOpenPopover(null);
|
|
@@ -1689,9 +1761,10 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1689
1761
|
? 'Ask a follow-up question...'
|
|
1690
1762
|
: 'Ask a question...' }), _jsx(ButtonComponent, { onClick: () => {
|
|
1691
1763
|
fetchAstFromPromptHelper();
|
|
1692
|
-
}, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && !reportId && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading:
|
|
1693
|
-
(
|
|
1694
|
-
|
|
1764
|
+
}, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && !reportId && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: !isAddLoading &&
|
|
1765
|
+
(tableLoading ||
|
|
1766
|
+
(loading && errorMessage.length === 0) ||
|
|
1767
|
+
initialChartLoad), rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, rowCountIsLoading: rowCountIsLoading, rowsPerPage: 20, columns: pivot
|
|
1695
1768
|
? pivotData?.columns || emptyPivotColumns()
|
|
1696
1769
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
1697
1770
|
return {
|
|
@@ -1715,13 +1788,17 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1715
1788
|
alignItems: 'center',
|
|
1716
1789
|
}, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
1717
1790
|
fetchAstFromPromptHelper();
|
|
1718
|
-
}, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && (_jsxs(_Fragment, { children: [onDiscardChanges && (_jsx(SecondaryButtonComponent, { onClick: onDiscardChanges, label: "Discard changes" })), !hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? 'Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: () => {
|
|
1791
|
+
}, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && (_jsxs(_Fragment, { children: [onDiscardChanges && (_jsx(SecondaryButtonComponent, { onClick: onDiscardChanges, label: "Discard changes" })), !hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? 'Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: async () => {
|
|
1792
|
+
setIsAddLoading(true);
|
|
1793
|
+
await handleRunQuery(currentProcessing, true);
|
|
1794
|
+
setIsAddLoading(false);
|
|
1719
1795
|
onSaveChanges && onSaveChanges();
|
|
1720
1796
|
setIsChartBuilderOpen(true);
|
|
1721
|
-
}, disabled: !!errorMessage, label: reportId ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: reportInfo
|
|
1797
|
+
}, disabled: !!errorMessage, label: reportId ? 'Save changes' : 'Add to dashboard', isLoading: isAddLoading })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: reportInfo
|
|
1722
1798
|
? {
|
|
1723
1799
|
...reportInfo,
|
|
1724
1800
|
...tempReport,
|
|
1801
|
+
filtersApplied: specificDashboardFilters,
|
|
1725
1802
|
pivot: pivot,
|
|
1726
1803
|
yAxisFields: reportInfo.pivot && !pivot ? [] : reportInfo.yAxisFields,
|
|
1727
1804
|
columns: reportInfo.columns.filter((col) => {
|
|
@@ -1732,5 +1809,8 @@ SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectCol
|
|
|
1732
1809
|
queryString: activeQuery,
|
|
1733
1810
|
rows: rows,
|
|
1734
1811
|
}
|
|
1735
|
-
:
|
|
1812
|
+
: {
|
|
1813
|
+
...tempReport,
|
|
1814
|
+
filtersApplied: specificDashboardFilters,
|
|
1815
|
+
}, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, isAdmin: isAdminEnabled, title: reportId ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: reportId ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], initialUniqueValuesIsLoading: uniqueValuesIsLoading, pivotRecommendationsEnabled: pivotRecommendationsEnabledState, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: !!reportId ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement, rowCount: numberOfRows, onPageChange: onPageChange, onSortChange: onSortChange, onFilterPreviewChange: onFilterPreviewChange, isLoading: tableLoading || isAddLoading, isEditingMode: true }))] }));
|
|
1736
1816
|
}
|