@quillsql/react 2.12.28 → 2.12.30
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 +24 -10
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +151 -189
- package/dist/cjs/ChartBuilder.d.ts +51 -11
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +162 -101
- package/dist/cjs/ChartEditor.d.ts +13 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +62 -121
- package/dist/cjs/Context.d.ts +1 -19
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +74 -85
- package/dist/cjs/Dashboard.d.ts +16 -7
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +90 -68
- package/dist/cjs/DateRangePicker/Calendar.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/Calendar.js +3 -6
- package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/DateRangePicker.js +2 -3
- package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts +1 -2
- package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/DateRangePickerButton.js +2 -4
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -4
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -15
- package/dist/cjs/ReportBuilder.d.ts +22 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +758 -505
- package/dist/cjs/SQLEditor.d.ts +2 -9
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +142 -90
- package/dist/cjs/Table.d.ts +19 -3
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +110 -92
- package/dist/cjs/TableChart.d.ts.map +1 -1
- package/dist/cjs/TableChart.js +0 -1
- package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowDownIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowDownRightIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowRightIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowUpHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowUpIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ArrowUpRightIcon.d.ts.map +1 -1
- package/dist/cjs/assets/CalendarIcon.d.ts.map +1 -1
- package/dist/cjs/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/cjs/assets/ExclamationFilledIcon.d.ts.map +1 -1
- package/dist/cjs/assets/LoadingSpinner.d.ts.map +1 -1
- package/dist/cjs/assets/SearchIcon.d.ts.map +1 -1
- package/dist/cjs/assets/XCircleIcon.d.ts.map +1 -1
- package/dist/cjs/components/Banner/index.d.ts +1 -1
- package/dist/cjs/components/Banner/index.d.ts.map +1 -1
- package/dist/cjs/components/Banner/index.js +1 -1
- package/dist/cjs/components/BigModal/BigModal.d.ts.map +1 -1
- package/dist/cjs/components/BigModal/BigModal.js +6 -12
- package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarList.js +21 -14
- package/dist/cjs/components/Chart/ChartError.d.ts +8 -1
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +40 -5
- package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +8 -2
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +2 -2
- package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/PieChart.js +1 -3
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +5 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +10 -5
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -6
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +98 -187
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -4
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +3 -3
- package/dist/cjs/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/cjs/components/Dropdown/Dropdown.js +1 -3
- package/dist/cjs/components/Dropdown/DropdownItem.d.ts.map +1 -1
- package/dist/cjs/components/Dropdown/DropdownItem.js +3 -8
- package/dist/cjs/components/Dropdown/index.d.ts +2 -2
- package/dist/cjs/components/Modal/Modal.d.ts.map +1 -1
- package/dist/cjs/components/Modal/Modal.js +2 -3
- package/dist/cjs/components/Modal/index.d.ts +1 -1
- package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelect.js +18 -3
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +2 -2
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +2 -2
- package/dist/cjs/components/QuillTable.d.ts +1 -4
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +5 -11
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +5 -8
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -3
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +12 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +22 -0
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/FilterModal.js +555 -0
- package/dist/cjs/components/ReportBuilder/ast.d.ts +2 -1
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +33 -6
- package/dist/cjs/components/ReportBuilder/constants.d.ts +18 -3
- package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/constants.js +24 -3
- package/dist/cjs/components/ReportBuilder/convert.d.ts +12 -15
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +326 -494
- package/dist/cjs/components/ReportBuilder/operators.d.ts +24 -4
- package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/operators.js +32 -4
- package/dist/cjs/components/ReportBuilder/ui.d.ts +20 -0
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +30 -4
- package/dist/cjs/components/ReportBuilder/util.d.ts +3 -11
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +15 -18
- package/dist/cjs/components/UiComponents.d.ts +10 -7
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +9 -8
- package/dist/cjs/components/selectUtils.d.ts +0 -1
- package/dist/cjs/components/selectUtils.d.ts.map +1 -1
- package/dist/cjs/components/selectUtils.js +1 -22
- package/dist/cjs/hooks/index.d.ts +4 -4
- package/dist/cjs/hooks/useAstToFilterTree.d.ts +11 -0
- package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -0
- package/dist/cjs/hooks/useAstToFilterTree.js +26 -0
- package/dist/cjs/hooks/useDashboard.d.ts +1 -1
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +22 -4
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +3 -1
- package/dist/cjs/hooks/useOnClickOutside.js +4 -4
- package/dist/cjs/hooks/useOnWindowResize.d.ts.map +1 -1
- package/dist/cjs/hooks/useOnWindowResize.js +2 -2
- package/dist/cjs/hooks/useQuill.d.ts +10 -27
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +114 -82
- package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
- package/dist/cjs/hooks/useSelectOnKeyDown.js +4 -4
- package/dist/cjs/hooks/useTheme.js +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.js +8 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +2 -2
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +2 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +64 -78
- package/dist/cjs/lib/utils.js +2 -2
- package/dist/cjs/models/Filter.d.ts +104 -4
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +91 -0
- package/dist/cjs/models/Pagination.d.ts +10 -0
- package/dist/cjs/models/Pagination.d.ts.map +1 -0
- package/dist/cjs/models/Pagination.js +2 -0
- package/dist/cjs/models/Report.d.ts +116 -0
- package/dist/cjs/models/Report.d.ts.map +1 -0
- package/dist/cjs/models/Report.js +2 -0
- package/dist/cjs/utils/aggregate.js +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts +36 -0
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/astFilterProcessing.js +8056 -0
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +4 -3
- package/dist/cjs/utils/axisFormatter.js +0 -71
- package/dist/cjs/utils/color.js +9 -87
- package/dist/cjs/utils/columnProcessing.d.ts +1 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +8 -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 +4 -4
- package/dist/cjs/utils/dataFetcher.d.ts +1 -1
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +72 -5
- package/dist/cjs/utils/dataProcessing.d.ts +8 -0
- package/dist/cjs/utils/dataProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/dataProcessing.js +127 -0
- package/dist/cjs/utils/dates.d.ts +2 -1
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +12 -3
- package/dist/cjs/utils/error.d.ts +5 -0
- package/dist/cjs/utils/error.d.ts.map +1 -0
- package/dist/cjs/utils/error.js +12 -0
- package/dist/cjs/utils/filterConstants.d.ts +34 -0
- package/dist/cjs/utils/filterConstants.d.ts.map +1 -0
- package/dist/cjs/utils/filterConstants.js +36 -0
- package/dist/cjs/utils/filterProcessing.js +4 -4
- package/dist/cjs/utils/logging.d.ts.map +1 -1
- package/dist/cjs/utils/logging.js +1 -0
- package/dist/cjs/utils/merge.js +0 -21
- package/dist/cjs/utils/monacoConfig.d.ts +21 -0
- package/dist/cjs/utils/monacoConfig.d.ts.map +1 -0
- package/dist/cjs/utils/monacoConfig.js +324 -0
- package/dist/cjs/utils/paginationProcessing.d.ts +5 -0
- package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/paginationProcessing.js +30 -0
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +67 -5
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +12 -6
- package/dist/cjs/utils/queryConstructor.d.ts +4 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +121 -59
- package/dist/cjs/utils/report.d.ts +7 -0
- package/dist/cjs/utils/report.d.ts.map +1 -0
- package/dist/cjs/utils/report.js +93 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +35 -6
- package/dist/cjs/utils/styles.d.ts +1 -1
- package/dist/cjs/utils/styles.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.d.ts +23 -8
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +156 -38
- package/dist/cjs/utils/textProcessing.js +3 -3
- package/dist/cjs/utils/validation.d.ts +9 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -0
- package/dist/cjs/utils/validation.js +24 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +8 -4
- package/dist/esm/Chart.d.ts +24 -10
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +154 -192
- package/dist/esm/ChartBuilder.d.ts +51 -11
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +161 -101
- package/dist/esm/ChartEditor.d.ts +13 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +63 -122
- package/dist/esm/Context.d.ts +1 -19
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +74 -84
- package/dist/esm/Dashboard.d.ts +16 -7
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +91 -69
- package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/Calendar.js +5 -8
- package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/DateRangePicker.js +2 -3
- package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +1 -2
- package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/DateRangePickerButton.js +2 -4
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -4
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -15
- package/dist/esm/ReportBuilder.d.ts +22 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +766 -513
- package/dist/esm/SQLEditor.d.ts +2 -9
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +144 -92
- package/dist/esm/Table.d.ts +19 -3
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +112 -94
- package/dist/esm/TableChart.d.ts.map +1 -1
- package/dist/esm/TableChart.js +0 -1
- package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -1
- package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -1
- package/dist/esm/assets/CalendarIcon.d.ts.map +1 -1
- package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
- package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -1
- package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -1
- package/dist/esm/assets/SearchIcon.d.ts.map +1 -1
- package/dist/esm/assets/XCircleIcon.d.ts.map +1 -1
- package/dist/esm/components/Banner/index.d.ts +1 -1
- package/dist/esm/components/Banner/index.d.ts.map +1 -1
- package/dist/esm/components/Banner/index.js +1 -1
- package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -1
- package/dist/esm/components/BigModal/BigModal.js +7 -13
- package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarList.js +21 -14
- package/dist/esm/components/Chart/ChartError.d.ts +8 -1
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +39 -6
- package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltip.js +8 -2
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +2 -2
- package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/PieChart.js +1 -3
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +5 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +10 -5
- package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -6
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +98 -187
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -4
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +3 -3
- package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/esm/components/Dropdown/Dropdown.js +2 -4
- package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
- package/dist/esm/components/Dropdown/DropdownItem.js +4 -9
- package/dist/esm/components/Dropdown/index.d.ts +2 -2
- package/dist/esm/components/Dropdown/index.js +2 -2
- package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
- package/dist/esm/components/Modal/Modal.js +2 -3
- package/dist/esm/components/Modal/index.d.ts +1 -1
- package/dist/esm/components/Modal/index.js +1 -1
- package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelect.js +18 -3
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +2 -2
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +2 -2
- package/dist/esm/components/QuillTable.d.ts +1 -4
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +5 -11
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.js +8 -11
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -4
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +12 -1
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +22 -0
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/FilterModal.js +552 -0
- package/dist/esm/components/ReportBuilder/ast.d.ts +2 -1
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ast.js +31 -5
- package/dist/esm/components/ReportBuilder/constants.d.ts +18 -3
- package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/constants.js +24 -3
- package/dist/esm/components/ReportBuilder/convert.d.ts +12 -15
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +324 -493
- package/dist/esm/components/ReportBuilder/convert.uspec.d.ts +2 -0
- package/dist/esm/components/ReportBuilder/convert.uspec.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/convert.uspec.js +1152 -0
- package/dist/esm/components/ReportBuilder/operators.d.ts +24 -4
- package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/operators.js +32 -4
- package/dist/esm/components/ReportBuilder/ui.d.ts +20 -0
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +28 -3
- package/dist/esm/components/ReportBuilder/util.d.ts +3 -11
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +16 -19
- package/dist/esm/components/UiComponents.d.ts +10 -7
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +9 -8
- package/dist/esm/components/selectUtils.d.ts +0 -1
- package/dist/esm/components/selectUtils.d.ts.map +1 -1
- package/dist/esm/components/selectUtils.js +0 -20
- package/dist/esm/hooks/index.d.ts +4 -4
- package/dist/esm/hooks/index.js +4 -4
- package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
- package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
- package/dist/esm/hooks/useAstToFilterTree.js +24 -0
- package/dist/esm/hooks/useDashboard.d.ts +1 -1
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +23 -5
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +4 -2
- package/dist/esm/hooks/useOnClickOutside.js +5 -5
- package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -1
- package/dist/esm/hooks/useOnWindowResize.js +3 -3
- package/dist/esm/hooks/useQuill.d.ts +10 -27
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +114 -82
- package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
- package/dist/esm/hooks/useSelectOnKeyDown.js +5 -5
- package/dist/esm/hooks/useTheme.js +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +2 -2
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +68 -82
- package/dist/esm/lib/utils.js +2 -2
- package/dist/esm/models/Filter.d.ts +104 -4
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +90 -1
- package/dist/esm/models/Pagination.d.ts +10 -0
- package/dist/esm/models/Pagination.d.ts.map +1 -0
- package/dist/esm/models/Pagination.js +1 -0
- package/dist/esm/models/Report.d.ts +116 -0
- package/dist/esm/models/Report.d.ts.map +1 -0
- package/dist/esm/models/Report.js +1 -0
- package/dist/esm/utils/aggregate.js +1 -1
- package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
- package/dist/esm/utils/astFilterProcessing.js +8049 -0
- package/dist/esm/utils/astFilterProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/astFilterProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/astFilterProcessing.uspec.js +2729 -0
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +4 -3
- package/dist/esm/utils/axisFormatter.js +0 -71
- package/dist/esm/utils/color.js +9 -87
- package/dist/esm/utils/columnProcessing.d.ts +1 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +6 -0
- 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 +4 -4
- package/dist/esm/utils/dataFetcher.d.ts +1 -1
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +72 -5
- package/dist/esm/utils/dataProcessing.d.ts +8 -0
- package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
- package/dist/esm/utils/dataProcessing.js +122 -0
- package/dist/esm/utils/dataProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/dataProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/dataProcessing.uspec.js +204 -0
- package/dist/esm/utils/dates.d.ts +2 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +10 -2
- package/dist/esm/utils/error.d.ts +5 -0
- package/dist/esm/utils/error.d.ts.map +1 -0
- package/dist/esm/utils/error.js +8 -0
- package/dist/esm/utils/filterConstants.d.ts +34 -0
- package/dist/esm/utils/filterConstants.d.ts.map +1 -0
- package/dist/esm/utils/filterConstants.js +33 -0
- package/dist/esm/utils/filterProcessing.js +4 -4
- package/dist/esm/utils/logging.d.ts.map +1 -1
- package/dist/esm/utils/logging.js +1 -0
- package/dist/esm/utils/merge.js +0 -21
- package/dist/esm/utils/monacoConfig.d.ts +21 -0
- package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
- package/dist/esm/utils/monacoConfig.js +319 -0
- package/dist/esm/utils/paginationProcessing.d.ts +5 -0
- package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
- package/dist/esm/utils/paginationProcessing.js +25 -0
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +67 -5
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +12 -6
- package/dist/esm/utils/queryConstructor.d.ts +4 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +118 -58
- package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
- package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
- package/dist/esm/utils/queryConstructor.uspec.js +223 -0
- package/dist/esm/utils/report.d.ts +7 -0
- package/dist/esm/utils/report.d.ts.map +1 -0
- package/dist/esm/utils/report.ispec.d.ts +2 -0
- package/dist/esm/utils/report.ispec.d.ts.map +1 -0
- package/dist/esm/utils/report.ispec.js +46 -0
- package/dist/esm/utils/report.js +88 -0
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +35 -6
- package/dist/esm/utils/styles.d.ts +1 -1
- package/dist/esm/utils/styles.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.d.ts +23 -8
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.ispec.d.ts +2 -0
- package/dist/esm/utils/tableProcessing.ispec.d.ts.map +1 -0
- package/dist/esm/utils/tableProcessing.ispec.js +61 -0
- package/dist/esm/utils/tableProcessing.js +152 -37
- package/dist/esm/utils/textProcessing.js +3 -3
- package/dist/esm/utils/validation.d.ts +9 -0
- package/dist/esm/utils/validation.d.ts.map +1 -0
- package/dist/esm/utils/validation.js +20 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +8 -4
- package/package.json +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
/* eslint-disable no-unused-vars */
|
|
3
2
|
import { useContext, useEffect, useRef, useState, } from 'react';
|
|
4
3
|
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
4
|
import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
6
5
|
import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
7
6
|
import { CSS as DND_CSS } from '@dnd-kit/utilities';
|
|
8
|
-
import { getQuarter } from 'date-fns';
|
|
9
7
|
import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
|
|
10
|
-
import { getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
11
|
-
import { ChartBuilderWithModal } from './ChartBuilder';
|
|
8
|
+
import { extractColumnish, getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
9
|
+
import { ChartBuilderWithModal, createInitialFormData } from './ChartBuilder';
|
|
12
10
|
import { QuillTextInput } from './components/UiComponents';
|
|
13
|
-
import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover,
|
|
11
|
+
import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover, QuillLimitPopover, FilterPopoverWrapper, } from './components/ReportBuilder/ui';
|
|
14
12
|
import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
|
|
15
13
|
import { convertBigQuery, convertGroupBy, convertRemoveSimpleParentheses, convertStringComparison, convertWildcardColumns, } from './components/ReportBuilder/convert';
|
|
16
|
-
import { deepCopy, formatDateComparisonNode, getDateFilterInfo,
|
|
14
|
+
import { deepCopy, formatDateComparisonNode, getDateFilterInfo, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, showNodeAsRow, removeNonSelectedTableReferences, isEquals, } from './components/ReportBuilder/util';
|
|
17
15
|
import { getDefaultOperatorSubtrees, OPERATOR_GROUPS, } from './components/ReportBuilder/operators';
|
|
18
16
|
import { hashCode } from './utils/crypto';
|
|
19
|
-
import {
|
|
17
|
+
import { defaultAST, defaultBoolComparison, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, } from './components/ReportBuilder/constants';
|
|
20
18
|
import AddColumnModal from './components/ReportBuilder/AddColumnModal';
|
|
21
19
|
import { AddSortPopover, SortSentence, } from './components/ReportBuilder/AddSortPopover';
|
|
22
|
-
import { PivotModal,
|
|
23
|
-
import { snakeAndCamelCaseToTitleCase
|
|
20
|
+
import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
|
|
21
|
+
import { snakeAndCamelCaseToTitleCase } from './utils/textProcessing';
|
|
24
22
|
import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
|
|
25
23
|
import { updateFirstChildWidth } from './utils/width';
|
|
26
24
|
import { QuillSelectComponent } from './components/QuillSelect';
|
|
@@ -28,13 +26,21 @@ import { QuillCard } from './components/QuillCard';
|
|
|
28
26
|
import { getData } from './utils/dataFetcher';
|
|
29
27
|
import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
|
|
30
28
|
import { getPossiblePivotFieldOptions, pivotToSql, } from './utils/pivotProcessing';
|
|
31
|
-
import { getUniqueValuesByColumns } from './utils/tableProcessing';
|
|
29
|
+
import { getUniqueValuesByColumns, getDateRangeByColumns, getCountsByColumns, fetchTableByQuery, } from './utils/tableProcessing';
|
|
32
30
|
import { useQuill } from './hooks/useQuill';
|
|
33
31
|
import { getDataFromCloud } from './utils/dataFetcher';
|
|
34
32
|
import { convertColumnInfoToColumnInternal, convertPostgresColumn, } from './utils/columnProcessing';
|
|
35
33
|
import { getSelectFromAST, processApostrophe, processStarColumn, } from './utils/astProcessing';
|
|
36
34
|
import PivotForm from './internals/ReportBuilder/PivotForm';
|
|
37
35
|
import { getSchemaInfoWithCustomFields } from './utils/schema';
|
|
36
|
+
import { getDateBucketFromRange } from './utils/dates';
|
|
37
|
+
import FilterModal from './components/ReportBuilder/FilterModal';
|
|
38
|
+
import { DateOperator, FilterNames } from './models/Filter';
|
|
39
|
+
import { filterToAst, filterTreeToAst, } from './utils/astFilterProcessing';
|
|
40
|
+
import useAstToFilterTree from './hooks/useAstToFilterTree';
|
|
41
|
+
import { QuillMultiSelectComponent } from './components/QuillMultiSelect';
|
|
42
|
+
import { shouldFetchMore, DEFAULT_PAGINATION, shouldSortInMemory, } from './utils/paginationProcessing';
|
|
43
|
+
import { formatRowsFromReport } from './utils/report';
|
|
38
44
|
export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
39
45
|
'https://quill-344421.uc.r.appspot.com';
|
|
40
46
|
/**
|
|
@@ -68,7 +74,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
|
|
|
68
74
|
* ### Report Builder API
|
|
69
75
|
* @see https://docs.quillsql.com/components/report-builder
|
|
70
76
|
*/
|
|
71
|
-
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (
|
|
77
|
+
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, MultiSelectComponent = QuillMultiSelectComponent, 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, onClickChartElement, }) {
|
|
72
78
|
const { data: report } = useQuill(reportId || '');
|
|
73
79
|
const [aiPrompt, setAiPrompt] = useState('');
|
|
74
80
|
const [errorMessage, setErrorMessage] = useState('');
|
|
@@ -91,8 +97,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
91
97
|
const [rows, setRows] = useState([]);
|
|
92
98
|
const [formattedRows, setFormattedRows] = useState([]);
|
|
93
99
|
const [columns, setColumns] = useState([]);
|
|
100
|
+
const [tempReport, setTempReport] = useState({});
|
|
94
101
|
const [topLevelBinaryOperator, setTopLevelBinaryOperator] = useState('AND');
|
|
95
|
-
const [editPopoverKey, setEditPopoverKey] = useState(null);
|
|
96
102
|
const [uniqueValues, setUniqueValues] = useState({});
|
|
97
103
|
const [pivot, setPivot] = useState(null);
|
|
98
104
|
const [pivotData, setPivotData] = useState(null);
|
|
@@ -100,8 +106,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
100
106
|
const [recommendedPivots, setRecommendedPivots] = useState([]);
|
|
101
107
|
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
102
108
|
const [showPivotPopover, setShowPivotPopover] = useState(false);
|
|
103
|
-
const [
|
|
104
|
-
const [
|
|
109
|
+
const [isEditingPivot, setIsEditingPivot] = useState(false);
|
|
110
|
+
const [initialChartLoad, setInitialChartLoad] = useState(false);
|
|
105
111
|
const [askedAQuestion, setAskedAQuestion] = useState(false);
|
|
106
112
|
const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
|
|
107
113
|
const [initialLoad, setInitialLoad] = useState(!!initialTableName || !!reportId);
|
|
@@ -116,23 +122,44 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
116
122
|
const [pivotColumnField, setPivotColumnField] = useState(undefined);
|
|
117
123
|
const [pivotValueField, setPivotValueField] = useState(undefined);
|
|
118
124
|
const [pivotAggregation, setPivotAggregation] = useState(undefined);
|
|
119
|
-
|
|
120
|
-
const [client
|
|
125
|
+
const [dateRanges, setDateRanges] = useState(null);
|
|
126
|
+
const [client] = useContext(ClientContext);
|
|
121
127
|
// JANK: This is temp and stupid
|
|
122
128
|
const [overrideRecommendations, setOverrideRecommendations] = useState(true);
|
|
123
129
|
const [customFields, setCustomFields] = useContext(CustomFieldContext);
|
|
130
|
+
const [openFilterIndex, setOpenFilterIndex] = useState(null); // Sets open filter modals
|
|
131
|
+
const [fieldValuesMap, setFieldValuesMap] = useState({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
|
|
132
|
+
const filterTree = useAstToFilterTree(formData, client); // Stores the state of filters
|
|
124
133
|
useEffect(() => {
|
|
134
|
+
if (!client) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
125
137
|
if (client.publicKey === '663416663aa9bc716e59a89d') {
|
|
126
138
|
setOverrideRecommendations(false);
|
|
127
139
|
}
|
|
128
140
|
if (!loadingSchema) {
|
|
129
141
|
fetchSchema();
|
|
130
142
|
}
|
|
131
|
-
}, [client
|
|
143
|
+
}, [client]);
|
|
132
144
|
useEffect(() => {
|
|
133
145
|
updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
134
146
|
updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
135
147
|
}, [dataDisplayed]);
|
|
148
|
+
// Whenever unique values changes, update the fieldValuesMap, used in FilterModals
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
const tables = getTableNames(baseAst);
|
|
151
|
+
const table = tables.length === 1 ? tables[0] : initialTableName;
|
|
152
|
+
const newFieldValues = {};
|
|
153
|
+
if (uniqueValues[table]) {
|
|
154
|
+
for (const field of Object.keys(uniqueValues[table])) {
|
|
155
|
+
newFieldValues[field] = [];
|
|
156
|
+
for (const value of Object.keys(uniqueValues[table][field])) {
|
|
157
|
+
newFieldValues[field]?.push(value);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
setFieldValuesMap(newFieldValues);
|
|
162
|
+
}, [uniqueValues]);
|
|
136
163
|
useEffect(() => {
|
|
137
164
|
// Since the TextInput component takes a required numeric width parameter,
|
|
138
165
|
// we dynamically calculate the width of this component here.
|
|
@@ -146,8 +173,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
146
173
|
window.removeEventListener('resize', handleResize);
|
|
147
174
|
};
|
|
148
175
|
}, []);
|
|
149
|
-
const updatePivot = (changeField, fieldKey) => {
|
|
176
|
+
const updatePivot = async (changeField, fieldKey) => {
|
|
150
177
|
const newPivot = pivot;
|
|
178
|
+
setTableLoading(true);
|
|
151
179
|
// @ts-ignore
|
|
152
180
|
newPivot[fieldKey] = changeField;
|
|
153
181
|
if (fieldKey === 'rowField') {
|
|
@@ -165,11 +193,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
165
193
|
newPivot.sort = undefined;
|
|
166
194
|
}
|
|
167
195
|
}
|
|
168
|
-
|
|
169
|
-
const
|
|
196
|
+
let dateBucket = undefined;
|
|
197
|
+
const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
|
|
198
|
+
if (tempDateRange) {
|
|
199
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
200
|
+
}
|
|
201
|
+
let distinctValuesForQuery = {};
|
|
202
|
+
if (pivot.columnField) {
|
|
203
|
+
distinctValuesForQuery = await getUniqueValuesByColumns([
|
|
204
|
+
{
|
|
205
|
+
field: pivot.columnField,
|
|
206
|
+
label: pivot.columnField,
|
|
207
|
+
format: 'string',
|
|
208
|
+
},
|
|
209
|
+
], activeQuery, [], client, customFields);
|
|
210
|
+
}
|
|
211
|
+
const pivotedData = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, distinctValuesForQuery);
|
|
170
212
|
setPivotData(pivotedData || []);
|
|
171
213
|
const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
|
|
214
|
+
setPivot(newPivot);
|
|
172
215
|
setFormattedRows(formattedRows);
|
|
216
|
+
setTableLoading(false);
|
|
173
217
|
};
|
|
174
218
|
const enforceOrderOnColumns = (columnNames) => {
|
|
175
219
|
if (pivot) {
|
|
@@ -204,7 +248,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
204
248
|
setRows([]);
|
|
205
249
|
setColumns([]);
|
|
206
250
|
setTopLevelBinaryOperator('AND');
|
|
207
|
-
setEditPopoverKey(null);
|
|
208
251
|
setErrorMessage('');
|
|
209
252
|
setFormattedRows([]);
|
|
210
253
|
// setUniqueValues({});
|
|
@@ -214,10 +257,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
214
257
|
}, 0);
|
|
215
258
|
};
|
|
216
259
|
useEffect(() => {
|
|
260
|
+
if (!client) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
217
263
|
if (!initialLoad && client.publicKey) {
|
|
218
264
|
clearAllState();
|
|
219
265
|
}
|
|
220
|
-
}, [client
|
|
266
|
+
}, [client]);
|
|
221
267
|
useEffect(() => {
|
|
222
268
|
if (activePath !== null) {
|
|
223
269
|
// update the modal with the new subtree
|
|
@@ -229,8 +275,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
229
275
|
if (pivot) {
|
|
230
276
|
const formattedRows = copiedRows.map((row) => {
|
|
231
277
|
const formattedRow = row;
|
|
232
|
-
Object.keys(row).forEach((key
|
|
233
|
-
|
|
278
|
+
Object.keys(row).forEach((key) => {
|
|
279
|
+
const column = columns.find((c) => c.field === key);
|
|
234
280
|
let format = 'string';
|
|
235
281
|
if (!column) {
|
|
236
282
|
format =
|
|
@@ -290,42 +336,20 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
290
336
|
navigator.clipboard.writeText(query);
|
|
291
337
|
setTimeout(() => setIsCopying(false), 800);
|
|
292
338
|
};
|
|
293
|
-
const copyToClipboard = (str) => {
|
|
294
|
-
setIsCopying(true);
|
|
295
|
-
navigator.clipboard.writeText(str);
|
|
296
|
-
setTimeout(() => setIsCopying(false), 800);
|
|
297
|
-
};
|
|
298
339
|
const clearCheckboxes = () => {
|
|
299
340
|
const checkboxes = uniqueValues;
|
|
300
341
|
const newValues = {};
|
|
301
|
-
for (
|
|
342
|
+
for (const table of Object.keys(checkboxes)) {
|
|
302
343
|
newValues[table] = {};
|
|
303
|
-
for (
|
|
344
|
+
for (const column of Object.keys(checkboxes[table])) {
|
|
304
345
|
newValues[table][column] = {};
|
|
305
|
-
for (
|
|
346
|
+
for (const variant of Object.keys(checkboxes[table][column])) {
|
|
306
347
|
newValues[table][column][variant] = false;
|
|
307
348
|
}
|
|
308
349
|
}
|
|
309
350
|
}
|
|
310
351
|
setUniqueValues(newValues);
|
|
311
352
|
};
|
|
312
|
-
const setCheckboxes = (node) => {
|
|
313
|
-
if (!['IN', 'NOT IN'].includes(node.operator))
|
|
314
|
-
return;
|
|
315
|
-
const selectedItems = node.right.value.flatMap((v) => v.args.value.map((x) => x.value.toLowerCase()));
|
|
316
|
-
const checkboxes = uniqueValues;
|
|
317
|
-
const newValues = {};
|
|
318
|
-
for (let table of Object.keys(checkboxes)) {
|
|
319
|
-
newValues[table] = {};
|
|
320
|
-
for (let column of Object.keys(checkboxes[table])) {
|
|
321
|
-
newValues[table][column] = {};
|
|
322
|
-
for (let variant of Object.keys(checkboxes[table][column])) {
|
|
323
|
-
newValues[table][column][variant] = selectedItems.includes(variant.toLowerCase());
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
setUniqueValues(newValues);
|
|
328
|
-
};
|
|
329
353
|
const fetchSqlQuery = async (ast, formData, fetchData = true) => {
|
|
330
354
|
if (fetchData) {
|
|
331
355
|
setLoading(true);
|
|
@@ -341,6 +365,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
341
365
|
body: JSON.stringify({
|
|
342
366
|
ast: { ...ast, where },
|
|
343
367
|
publicKey: client.publicKey,
|
|
368
|
+
useNewNodeSql: true, // new flag
|
|
344
369
|
}),
|
|
345
370
|
});
|
|
346
371
|
const data = await response.json();
|
|
@@ -348,12 +373,41 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
348
373
|
if (fetchData) {
|
|
349
374
|
fetchUponChange(ast, formData);
|
|
350
375
|
}
|
|
376
|
+
return data.query;
|
|
351
377
|
}
|
|
352
378
|
catch (error) {
|
|
353
379
|
setLoading(false);
|
|
354
380
|
console.error(error);
|
|
355
381
|
}
|
|
356
382
|
};
|
|
383
|
+
const getUniqueStringValues = async (columns, tableName) => {
|
|
384
|
+
const convertedStringColumns = columns
|
|
385
|
+
.filter((column) => {
|
|
386
|
+
return isTextColumnType(column.fieldType);
|
|
387
|
+
})
|
|
388
|
+
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
389
|
+
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
390
|
+
const smallStringColumns = await getCountsByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
|
|
391
|
+
const smallStringNames = smallStringColumns.map((column) => column.field);
|
|
392
|
+
const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, `Select ${smallStringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
393
|
+
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
394
|
+
joinedUniqueValues[tableName] = newUniqueValues;
|
|
395
|
+
return joinedUniqueValues;
|
|
396
|
+
};
|
|
397
|
+
const getDateRanges = async (columns, tableName) => {
|
|
398
|
+
const dateColumns = columns.filter((column) => {
|
|
399
|
+
return column.fieldType === 'date';
|
|
400
|
+
});
|
|
401
|
+
if (dateColumns.length === 0) {
|
|
402
|
+
return {};
|
|
403
|
+
}
|
|
404
|
+
const dateColumnNames = dateColumns.map((column) => {
|
|
405
|
+
//@ts-ignore
|
|
406
|
+
return column.field || column.name;
|
|
407
|
+
});
|
|
408
|
+
const dateRanges = await getDateRangeByColumns(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
|
|
409
|
+
return dateRanges;
|
|
410
|
+
};
|
|
357
411
|
// It's just like getColumnsInPivot but we expand the columnField
|
|
358
412
|
// if there is one to include all the variants just like it would
|
|
359
413
|
// show up in the table. (eg. category -> ...[Fuel, Food, Other])
|
|
@@ -380,18 +434,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
380
434
|
setLoading(true);
|
|
381
435
|
const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
|
|
382
436
|
if (tableInfo) {
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
})
|
|
387
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
388
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
389
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
|
|
390
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
391
|
-
joinedUniqueValues[initialTableName] = newUniqueValues;
|
|
392
|
-
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
393
|
-
setUniqueValues(joinedUniqueValues);
|
|
437
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
|
|
438
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
439
|
+
setUniqueValues(newUniqueValues);
|
|
394
440
|
}
|
|
441
|
+
const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
|
|
442
|
+
setDateRanges(dateRangesTemp);
|
|
395
443
|
}
|
|
396
444
|
const columnsForTable = tables
|
|
397
445
|
.find((t) => t.name === initialTableName)
|
|
@@ -450,80 +498,102 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
450
498
|
};
|
|
451
499
|
useEffect(() => {
|
|
452
500
|
const loadChart = async () => {
|
|
453
|
-
|
|
501
|
+
setInitialChartLoad(true);
|
|
502
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
454
503
|
if (!report || report.referencedTables.length !== 1) {
|
|
455
|
-
|
|
456
|
-
return;
|
|
457
|
-
}
|
|
458
|
-
const tableName = report.referencedTables[0];
|
|
459
|
-
if (!tableName) {
|
|
460
|
-
return;
|
|
461
|
-
}
|
|
462
|
-
const resp = await getDataFromCloud(client, `astify`, {
|
|
463
|
-
query: report.queryString,
|
|
464
|
-
});
|
|
465
|
-
if (resp.success === false) {
|
|
466
|
-
setErrorMessage('Error: ' + resp.message);
|
|
504
|
+
setInitialChartLoad(false);
|
|
467
505
|
return;
|
|
468
506
|
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
const stringNames = stringColumns.map((column) => column.field);
|
|
493
|
-
const newUniqueValues = await getUniqueValuesByColumns(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
494
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
495
|
-
joinedUniqueValues[tableName] = newUniqueValues;
|
|
496
|
-
setUniqueValues(joinedUniqueValues);
|
|
497
|
-
}
|
|
498
|
-
if (groupByPivot) {
|
|
499
|
-
// @ts-ignore
|
|
500
|
-
setPivotRowField(groupByPivot.rowField);
|
|
501
|
-
// @ts-ignore
|
|
502
|
-
setPivotAggregation(groupByPivot.aggregationType);
|
|
503
|
-
// @ts-ignore
|
|
504
|
-
setPivotColumnField(groupByPivot.columnField);
|
|
505
|
-
// @ts-ignore
|
|
506
|
-
setPivotValueField(groupByPivot.valueField);
|
|
507
|
-
setPivot(groupByPivot);
|
|
508
|
-
const pivotedData = generatePivotTableInMemory(
|
|
509
|
-
// @ts-ignore
|
|
510
|
-
groupByPivot, initialRows, undefined, false);
|
|
511
|
-
setPivotData(pivotedData || []);
|
|
512
|
-
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
507
|
+
try {
|
|
508
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
509
|
+
const tableName = report.referencedTables[0];
|
|
510
|
+
if (!tableName) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const resp = await getDataFromCloud(client, `astify`, {
|
|
514
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
515
|
+
query: report.queryString,
|
|
516
|
+
useNewNodeSql: true,
|
|
517
|
+
});
|
|
518
|
+
if (resp.success === false) {
|
|
519
|
+
setErrorMessage(resp.message);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
const ast = getSelectFromAST(resp.ast);
|
|
523
|
+
let convertedAst = processStarColumn(ast, report.columns);
|
|
524
|
+
processApostrophe(convertedAst, ['type', 'value']);
|
|
525
|
+
convertedAst = convertBigQuery(convertedAst);
|
|
526
|
+
const schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
|
|
527
|
+
let newAst;
|
|
528
|
+
let groupByPivot = {};
|
|
529
|
+
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(convertedAst,
|
|
513
530
|
// @ts-ignore
|
|
514
|
-
|
|
515
|
-
|
|
531
|
+
report.pivot, schemaInfo));
|
|
532
|
+
if (convertedAst.where) {
|
|
533
|
+
setFormData(deepCopy(convertedAst.where));
|
|
534
|
+
}
|
|
535
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
536
|
+
setActiveQuery(report.queryString);
|
|
537
|
+
newAst = groupByPivot ? newAst : convertedAst;
|
|
538
|
+
const initialRows = await fetchUponChange(newAst, undefined);
|
|
539
|
+
if (initialRows.error) {
|
|
540
|
+
setBaseAst(null);
|
|
541
|
+
setErrorMessage(initialRows.message);
|
|
542
|
+
setInitialChartLoad(false);
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
setBaseAst(newAst);
|
|
546
|
+
const tableInfo = schemaInfo.find((table) => table.name === tableName);
|
|
547
|
+
let newUniqueValues = undefined;
|
|
548
|
+
let dateRangesTemp = undefined;
|
|
549
|
+
if (tableName) {
|
|
550
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
|
|
551
|
+
setUniqueValues(newUniqueValues);
|
|
552
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
|
|
553
|
+
setDateRanges(dateRangesTemp);
|
|
554
|
+
}
|
|
555
|
+
if (groupByPivot) {
|
|
556
|
+
// @ts-ignore
|
|
557
|
+
setPivotRowField(groupByPivot.rowField);
|
|
558
|
+
// @ts-ignore
|
|
559
|
+
setPivotAggregation(groupByPivot.aggregationType);
|
|
560
|
+
// @ts-ignore
|
|
561
|
+
setPivotColumnField(groupByPivot.columnField);
|
|
562
|
+
// @ts-ignore
|
|
563
|
+
setPivotValueField(groupByPivot.valueField);
|
|
564
|
+
setPivot(groupByPivot);
|
|
565
|
+
let dateBucket = undefined;
|
|
566
|
+
const tempDateRange = dateRangesTemp &&
|
|
567
|
+
groupByPivot.rowField &&
|
|
568
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
569
|
+
if (tempDateRange) {
|
|
570
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
571
|
+
}
|
|
572
|
+
const pivotedData = await generatePivotTable(
|
|
573
|
+
// @ts-ignore
|
|
574
|
+
groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
|
|
575
|
+
setPivotData(pivotedData || []);
|
|
576
|
+
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
577
|
+
// @ts-ignore
|
|
578
|
+
groupByPivot.aggregationType);
|
|
579
|
+
setFormattedRows(formattedRows);
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
const formattedRows = formatRows(report.rows, report.columns);
|
|
583
|
+
setFormattedRows(formattedRows);
|
|
584
|
+
}
|
|
585
|
+
setCurrentTable(tableName);
|
|
516
586
|
}
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
587
|
+
catch (error) {
|
|
588
|
+
console.error(error);
|
|
589
|
+
setErrorMessage('Error loading report');
|
|
520
590
|
}
|
|
521
|
-
setCurrentTable(tableName);
|
|
522
591
|
// This handles a flashing issue
|
|
523
592
|
setTimeout(() => {
|
|
524
|
-
|
|
593
|
+
setInitialChartLoad(false);
|
|
525
594
|
}, 500);
|
|
526
595
|
};
|
|
596
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
527
597
|
if (report && report.referencedTables.length === 1) {
|
|
528
598
|
loadChart();
|
|
529
599
|
}
|
|
@@ -849,10 +919,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
849
919
|
isReplaceSubtree: true,
|
|
850
920
|
});
|
|
851
921
|
};
|
|
852
|
-
// Function to handle the deletion of expressions
|
|
853
|
-
const handleDelete = (key) => {
|
|
854
|
-
updateFormData([{ path: key, value: null }], { isDeletion: true });
|
|
855
|
-
};
|
|
856
922
|
// Function to handle the insertion of expressions
|
|
857
923
|
const handleInsertion = (value, op = 'OR', isCondition = undefined) => {
|
|
858
924
|
updateFormData([{ path: '', value }], {
|
|
@@ -915,6 +981,66 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
915
981
|
return [{ label: snakeAndCamelCaseToTitleCase(pivot.valueField) }];
|
|
916
982
|
}
|
|
917
983
|
};
|
|
984
|
+
const [previousPage, setPreviousPage] = useState(0);
|
|
985
|
+
const [currentProcessing, setCurrentProcessing] = useState({
|
|
986
|
+
page: DEFAULT_PAGINATION,
|
|
987
|
+
});
|
|
988
|
+
const [numberOfRows, setNumberOfRows] = useState(0);
|
|
989
|
+
const [tableLoading, setTableLoading] = useState(false);
|
|
990
|
+
const onPageChange = (page) => {
|
|
991
|
+
if (currentProcessing.page &&
|
|
992
|
+
shouldFetchMore(DEFAULT_PAGINATION, page, previousPage)) {
|
|
993
|
+
const newPagination = { ...currentProcessing.page, page };
|
|
994
|
+
const updatedProcessing = { ...currentProcessing, page: newPagination };
|
|
995
|
+
setCurrentProcessing(updatedProcessing);
|
|
996
|
+
handleRunQuery(updatedProcessing);
|
|
997
|
+
}
|
|
998
|
+
if (page > previousPage) {
|
|
999
|
+
setPreviousPage(page);
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
const onSortChange = (sort) => {
|
|
1003
|
+
if (report &&
|
|
1004
|
+
shouldSortInMemory(DEFAULT_PAGINATION, report.rowCount, !!report.pivot)) {
|
|
1005
|
+
return;
|
|
1006
|
+
}
|
|
1007
|
+
const updatedProcessing = { page: DEFAULT_PAGINATION, sort };
|
|
1008
|
+
handleRunQuery(updatedProcessing, true);
|
|
1009
|
+
setCurrentProcessing(updatedProcessing);
|
|
1010
|
+
setPreviousPage(0);
|
|
1011
|
+
};
|
|
1012
|
+
const handleRunQuery = async (processing, resetRows = false) => {
|
|
1013
|
+
try {
|
|
1014
|
+
setErrorMessage('');
|
|
1015
|
+
setTableLoading(true);
|
|
1016
|
+
const tableInfo = await fetchTableByQuery(activeQuery, client, processing, customFields);
|
|
1017
|
+
if (tableInfo.error) {
|
|
1018
|
+
throw new Error(tableInfo.error);
|
|
1019
|
+
}
|
|
1020
|
+
else if (tableInfo.rows.length === 0) {
|
|
1021
|
+
throw new Error('No data found');
|
|
1022
|
+
}
|
|
1023
|
+
if (tableInfo.rowCount) {
|
|
1024
|
+
setNumberOfRows(tableInfo.rowCount);
|
|
1025
|
+
}
|
|
1026
|
+
setCurrentProcessing(processing);
|
|
1027
|
+
let tempRows = [...rows, ...tableInfo.rows];
|
|
1028
|
+
if (resetRows) {
|
|
1029
|
+
tempRows = tableInfo.rows;
|
|
1030
|
+
}
|
|
1031
|
+
setRows(tempRows);
|
|
1032
|
+
setFormattedRows(formatRowsFromReport({ rows: tempRows, columns: tableInfo.columns }));
|
|
1033
|
+
setColumns(tableInfo.columns);
|
|
1034
|
+
setTableLoading(false);
|
|
1035
|
+
}
|
|
1036
|
+
catch (e) {
|
|
1037
|
+
setTableLoading(false);
|
|
1038
|
+
setErrorMessage('Failed to run SQL query: ' + e);
|
|
1039
|
+
setRows([]);
|
|
1040
|
+
setColumns([]);
|
|
1041
|
+
return;
|
|
1042
|
+
}
|
|
1043
|
+
};
|
|
918
1044
|
/**
|
|
919
1045
|
* Render form fields based on the type of the node
|
|
920
1046
|
* @param node the AST or subtree to render recursively
|
|
@@ -930,10 +1056,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
930
1056
|
case 'binary_expr':
|
|
931
1057
|
if (dateComparisonPartialMatch ||
|
|
932
1058
|
(isDateTruncEquals(node) && client.databaseType !== 'BigQuery')) {
|
|
933
|
-
const { dateColumn,
|
|
934
|
-
// see onChange callback handleChange
|
|
935
|
-
// eslint-disable-next-line no-unused-vars
|
|
936
|
-
dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
|
|
1059
|
+
const { dateColumn, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
|
|
937
1060
|
const isPlural = intervalCount !== 1 && dateFilterType !== 'in the current'
|
|
938
1061
|
? 's'
|
|
939
1062
|
: '';
|
|
@@ -1081,7 +1204,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1081
1204
|
} }))] }));
|
|
1082
1205
|
}
|
|
1083
1206
|
else if (isInTheLastInterval(node, client.databaseType)) {
|
|
1084
|
-
const { dateColumn
|
|
1207
|
+
const { dateColumn } = getDateFilterInfo(node);
|
|
1085
1208
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1086
1209
|
label: snakeAndCamelCaseToTitleCase(column.displayName),
|
|
1087
1210
|
value: column.name,
|
|
@@ -1142,7 +1265,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1142
1265
|
], width: 200 }) })] }));
|
|
1143
1266
|
}
|
|
1144
1267
|
else if (isTheCurrentInterval(node, client.databaseType)) {
|
|
1145
|
-
const { dateFilterType } = getDateFilterInfo(node);
|
|
1146
1268
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1147
1269
|
label: snakeAndCamelCaseToTitleCase(column.displayName),
|
|
1148
1270
|
value: column.name,
|
|
@@ -1201,7 +1323,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1201
1323
|
{ label: `week`, value: 'WEEK' },
|
|
1202
1324
|
], width: 200 })] }));
|
|
1203
1325
|
}
|
|
1204
|
-
else if (isThePreviousInterval(node
|
|
1326
|
+
else if (isThePreviousInterval(node)) {
|
|
1205
1327
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1206
1328
|
label: snakeAndCamelCaseToTitleCase(column.displayName),
|
|
1207
1329
|
value: column.name,
|
|
@@ -1348,7 +1470,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1348
1470
|
.find((tableInfo) => tableInfo.name === table)
|
|
1349
1471
|
?.columns.find((col) => col.name === leftChildValue);
|
|
1350
1472
|
const columnType = column?.fieldType;
|
|
1351
|
-
|
|
1473
|
+
const operatorOptions = [
|
|
1352
1474
|
...(isNumericColumnType(columnType)
|
|
1353
1475
|
? [
|
|
1354
1476
|
{ label: 'equal to', value: '=' },
|
|
@@ -1589,112 +1711,214 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1589
1711
|
}
|
|
1590
1712
|
return validPivot;
|
|
1591
1713
|
};
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
let
|
|
1601
|
-
let
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1714
|
+
/**
|
|
1715
|
+
*
|
|
1716
|
+
* @param filterTree
|
|
1717
|
+
* Returns a list of filters to be displayed
|
|
1718
|
+
* Replaces the functionality of renderNodes in the context of filters
|
|
1719
|
+
* Contains filterSentence, which replaces renderSentence
|
|
1720
|
+
*/
|
|
1721
|
+
const renderFilters = (filterTree) => {
|
|
1722
|
+
let tree = filterTree;
|
|
1723
|
+
let filterStack = [];
|
|
1724
|
+
/**
|
|
1725
|
+
* Function that takes in a FilterTree and flattens it into an array using in order traversal
|
|
1726
|
+
*/
|
|
1727
|
+
function traverseTree(node) {
|
|
1728
|
+
if (!node) {
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1731
|
+
if (node.leaf) {
|
|
1732
|
+
filterStack.push(node);
|
|
1733
|
+
}
|
|
1734
|
+
else {
|
|
1735
|
+
traverseTree(node.leftNode);
|
|
1736
|
+
filterStack.push(node);
|
|
1737
|
+
traverseTree(node.rightNode);
|
|
1738
|
+
}
|
|
1605
1739
|
}
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
'
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
'
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
'IS NOT': 'is not',
|
|
1625
|
-
IS: 'is',
|
|
1626
|
-
};
|
|
1627
|
-
switch (node.type) {
|
|
1628
|
-
case 'binary_expr':
|
|
1629
|
-
return (_jsx(TagWrapper, { keyPrefix: keyPrefix, formData: formData, activeEditItem: activeEditItem, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setCheckboxes: setCheckboxes, handleReplaceSubtree: handleReplaceSubtree, FilterPopover: FilterPopoverComponent, setActivePath: setActivePath, setOpenPopover: setOpenPopover, setIsPending: setIsPending, clearCheckboxes: clearCheckboxes, handleDelete: handleDelete, editPopoverKey: editPopoverKey, isCard: isCard, isRow: isRow, getByKey: getByKey, EditPopover: EditPopover, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, renderNode: renderNode, children: dateComparisonPartialMatch ??
|
|
1630
|
-
dateEqualityPartialMatch ??
|
|
1631
|
-
uniqueSentence ?? (_jsxs(_Fragment, { children: [node.left &&
|
|
1632
|
-
renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: SelectComponent })) : null, node.right &&
|
|
1633
|
-
renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
|
|
1634
|
-
case 'column_ref':
|
|
1635
|
-
return snakeAndCamelCaseToTitleCase(node.column);
|
|
1636
|
-
case 'expr_list':
|
|
1637
|
-
if (node.value.length === 1) {
|
|
1638
|
-
const subQuery = renderSentence(formData, node.value[0]);
|
|
1639
|
-
if (subQuery) {
|
|
1640
|
-
return `${subQuery}`;
|
|
1641
|
-
}
|
|
1642
|
-
return '()';
|
|
1740
|
+
/**
|
|
1741
|
+
* Returns a sentence to describe a Filter
|
|
1742
|
+
*/
|
|
1743
|
+
function filterSentence(filter) {
|
|
1744
|
+
let value = '';
|
|
1745
|
+
if (filter.name == FilterNames.NullFilter) {
|
|
1746
|
+
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}`;
|
|
1747
|
+
}
|
|
1748
|
+
else if (filter.value === null || filter.value === undefined) {
|
|
1749
|
+
return 'Error: filter missing value';
|
|
1750
|
+
}
|
|
1751
|
+
if (typeof filter.value === 'string' ||
|
|
1752
|
+
typeof filter.value === 'number') {
|
|
1753
|
+
value = filter.value.toString();
|
|
1754
|
+
}
|
|
1755
|
+
else if ('unit' in filter.value) {
|
|
1756
|
+
if (filter.operator === DateOperator.InTheCurrent) {
|
|
1757
|
+
value = `${filter.value.unit}`;
|
|
1643
1758
|
}
|
|
1644
|
-
|
|
1645
|
-
.
|
|
1646
|
-
.join(', ')}`;
|
|
1647
|
-
case 'single_quote_string':
|
|
1648
|
-
return node.value.replaceAll('%', '');
|
|
1649
|
-
case 'double_quote_string':
|
|
1650
|
-
case 'number':
|
|
1651
|
-
return node.value;
|
|
1652
|
-
case 'null':
|
|
1653
|
-
return 'null';
|
|
1654
|
-
case 'bool':
|
|
1655
|
-
return node.value.toString();
|
|
1656
|
-
case 'interval':
|
|
1657
|
-
if (node.unit) {
|
|
1658
|
-
// eg. `INTERVAL '90' DAY` -> "90 days"
|
|
1659
|
-
return `${node.expr.value} ${node.unit}s`;
|
|
1759
|
+
else {
|
|
1760
|
+
value = `${filter.value.value} ${filter.value.unit}${filter.value.value === 1 ? '' : 's'}`;
|
|
1660
1761
|
}
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1762
|
+
}
|
|
1763
|
+
else if ('startDate' in filter.value) {
|
|
1764
|
+
value = `from ${filter.value.startDate}`;
|
|
1765
|
+
}
|
|
1766
|
+
else if (filter.value.length > 0) {
|
|
1767
|
+
value = filter.value.join(', ');
|
|
1768
|
+
}
|
|
1769
|
+
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator} ${value}`;
|
|
1770
|
+
}
|
|
1771
|
+
/**
|
|
1772
|
+
* Given an array of Filters (presumed to be in in-order state), generate
|
|
1773
|
+
* the corresponding Filter tree. Essentially the reverse of what traverseTree does
|
|
1774
|
+
*/
|
|
1775
|
+
function filterStackToFilterTree(stack) {
|
|
1776
|
+
function buildTree(i) {
|
|
1777
|
+
const newNode = {
|
|
1778
|
+
leaf: false,
|
|
1779
|
+
operator: null,
|
|
1780
|
+
leftNode: null,
|
|
1781
|
+
rightNode: null,
|
|
1782
|
+
};
|
|
1783
|
+
if (i >= stack.length) {
|
|
1676
1784
|
return null;
|
|
1677
1785
|
}
|
|
1678
|
-
if (
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1786
|
+
else if (stack[i].leaf) {
|
|
1787
|
+
if (i < stack.length - 1) {
|
|
1788
|
+
// more nodes later
|
|
1789
|
+
newNode.operator = stack[i + 1].operator;
|
|
1790
|
+
newNode.leftNode = {
|
|
1791
|
+
leaf: true,
|
|
1792
|
+
leftNode: null,
|
|
1793
|
+
rightNode: null,
|
|
1794
|
+
operator: null,
|
|
1795
|
+
value: stack[i].value,
|
|
1796
|
+
};
|
|
1797
|
+
newNode.rightNode = buildTree(i + 2);
|
|
1798
|
+
}
|
|
1799
|
+
else {
|
|
1800
|
+
newNode.leaf = true;
|
|
1801
|
+
newNode.value = stack[i].value;
|
|
1802
|
+
}
|
|
1693
1803
|
}
|
|
1694
|
-
return
|
|
1695
|
-
|
|
1696
|
-
|
|
1804
|
+
return newNode;
|
|
1805
|
+
}
|
|
1806
|
+
return buildTree(0);
|
|
1697
1807
|
}
|
|
1808
|
+
traverseTree(tree);
|
|
1809
|
+
// Remove null (invalid) filters from filter stack
|
|
1810
|
+
filterStack = filterStack.filter((filter) => {
|
|
1811
|
+
return ((!filter.leaf &&
|
|
1812
|
+
filter.rightNode &&
|
|
1813
|
+
(!filter.rightNode.leaf || filter.rightNode.value)) ||
|
|
1814
|
+
(filter.leaf && filter.value));
|
|
1815
|
+
});
|
|
1816
|
+
// Render filterStack
|
|
1817
|
+
return (_jsx("div", { style: {
|
|
1818
|
+
display: 'flex',
|
|
1819
|
+
flexDirection: 'column',
|
|
1820
|
+
}, children: filterStack.map((item, index) => {
|
|
1821
|
+
if (!item.leaf &&
|
|
1822
|
+
(item.operator === 'and' || item.operator === 'or')) {
|
|
1823
|
+
return (_jsx("div", { style: {
|
|
1824
|
+
width: 'fit-content',
|
|
1825
|
+
marginBottom: '8px',
|
|
1826
|
+
marginTop: '8px',
|
|
1827
|
+
}, children: _jsx(TabsComponent, { value: item.operator.toUpperCase(), options: DEFAULT_TAB_OPTIONS, onChange: () => {
|
|
1828
|
+
if (item.operator === 'and') {
|
|
1829
|
+
item.operator = 'or';
|
|
1830
|
+
}
|
|
1831
|
+
else {
|
|
1832
|
+
item.operator = 'and';
|
|
1833
|
+
}
|
|
1834
|
+
let newFormData = null;
|
|
1835
|
+
if (tree) {
|
|
1836
|
+
newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
|
|
1837
|
+
}
|
|
1838
|
+
const newAst = deepCopy({
|
|
1839
|
+
...defaultAST,
|
|
1840
|
+
...baseAst,
|
|
1841
|
+
...(!baseAst?.columns && {
|
|
1842
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1843
|
+
const newColumn = deepCopy(defaultColumn);
|
|
1844
|
+
newColumn.expr.column = c.name;
|
|
1845
|
+
return newColumn;
|
|
1846
|
+
}),
|
|
1847
|
+
}),
|
|
1848
|
+
...(!baseAst?.from && {
|
|
1849
|
+
from: [{ ...defaultTable, table: initialTableName }],
|
|
1850
|
+
}),
|
|
1851
|
+
where: newFormData,
|
|
1852
|
+
});
|
|
1853
|
+
setBaseAst(newAst);
|
|
1854
|
+
setFormData(newFormData);
|
|
1855
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1856
|
+
} }) }, index));
|
|
1857
|
+
}
|
|
1858
|
+
else {
|
|
1859
|
+
return (_jsx("div", { children: _jsx(FilterPopoverWrapper, { schema: schema.find((s) => s.name === currentTable ||
|
|
1860
|
+
s.displayName === currentTable) ?? schema[0], filter: item.value, filterLabel: item.value ? filterSentence(item.value) : '', index: index, openFilterIndex: openFilterIndex, setOpenFilterIndex: setOpenFilterIndex, FilterPopover: FilterPopoverComponent, FilterModal: FilterModal, fieldValuesMap: fieldValuesMap, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (filter) => {
|
|
1861
|
+
item.value = filter;
|
|
1862
|
+
let newFormData = null;
|
|
1863
|
+
if (tree) {
|
|
1864
|
+
newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
|
|
1865
|
+
}
|
|
1866
|
+
const newAst = deepCopy({
|
|
1867
|
+
...defaultAST,
|
|
1868
|
+
...baseAst,
|
|
1869
|
+
...(!baseAst?.columns && {
|
|
1870
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1871
|
+
const newColumn = deepCopy(defaultColumn);
|
|
1872
|
+
newColumn.expr.column = c.name;
|
|
1873
|
+
return newColumn;
|
|
1874
|
+
}),
|
|
1875
|
+
}),
|
|
1876
|
+
...(!baseAst?.from && {
|
|
1877
|
+
from: [{ ...defaultTable, table: initialTableName }],
|
|
1878
|
+
}),
|
|
1879
|
+
where: newFormData,
|
|
1880
|
+
});
|
|
1881
|
+
setBaseAst(newAst);
|
|
1882
|
+
setFormData(newFormData);
|
|
1883
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1884
|
+
}, handleFilterDelete: (i) => {
|
|
1885
|
+
if (i > 0) {
|
|
1886
|
+
filterStack.splice(i - 1, 2);
|
|
1887
|
+
}
|
|
1888
|
+
else {
|
|
1889
|
+
if (filterStack.length > 1) {
|
|
1890
|
+
filterStack.splice(i, 2);
|
|
1891
|
+
}
|
|
1892
|
+
else {
|
|
1893
|
+
filterStack.splice(i, 1);
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
tree = filterStackToFilterTree(filterStack);
|
|
1897
|
+
let newFormData = null;
|
|
1898
|
+
if (tree) {
|
|
1899
|
+
newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
|
|
1900
|
+
}
|
|
1901
|
+
const newAst = deepCopy({
|
|
1902
|
+
...defaultAST,
|
|
1903
|
+
...baseAst,
|
|
1904
|
+
...(!baseAst?.columns && {
|
|
1905
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1906
|
+
const newColumn = deepCopy(defaultColumn);
|
|
1907
|
+
newColumn.expr.column = c.name;
|
|
1908
|
+
return newColumn;
|
|
1909
|
+
}),
|
|
1910
|
+
}),
|
|
1911
|
+
...(!baseAst?.from && {
|
|
1912
|
+
from: [{ ...defaultTable, table: initialTableName }],
|
|
1913
|
+
}),
|
|
1914
|
+
where: newFormData,
|
|
1915
|
+
});
|
|
1916
|
+
setBaseAst(newAst);
|
|
1917
|
+
setFormData(newFormData);
|
|
1918
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1919
|
+
} }) }, index));
|
|
1920
|
+
}
|
|
1921
|
+
}) }));
|
|
1698
1922
|
};
|
|
1699
1923
|
const getAllPossibleColumns = () => {
|
|
1700
1924
|
if (!baseAst || !baseAst.from) {
|
|
@@ -1736,7 +1960,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1736
1960
|
if (selectedColumns.length < 1)
|
|
1737
1961
|
return false;
|
|
1738
1962
|
const allColumns = orderedColumnNames.filter((row) => {
|
|
1739
|
-
const [table
|
|
1963
|
+
const [table] = row.split('.');
|
|
1740
1964
|
const selectedTable = selectedColumns[0].split('.')[0];
|
|
1741
1965
|
return selectedTable === table;
|
|
1742
1966
|
});
|
|
@@ -1780,35 +2004,38 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1780
2004
|
task: 'patterns',
|
|
1781
2005
|
getCustomFields: false,
|
|
1782
2006
|
customFields,
|
|
1783
|
-
|
|
2007
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2008
|
+
useUpdatedDataGathering: true,
|
|
2009
|
+
useNewNodeSql: true, // new flag
|
|
1784
2010
|
},
|
|
1785
2011
|
};
|
|
1786
|
-
const cloudBody = {};
|
|
1787
|
-
const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
1788
|
-
if (data2.success === false) {
|
|
1789
|
-
throw new Error(data2.errorMessage);
|
|
1790
|
-
}
|
|
1791
|
-
rows = data2.rows;
|
|
1792
2012
|
const tables = getTableNames(baseAst);
|
|
1793
2013
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1794
|
-
|
|
2014
|
+
let newUniqueValues = uniqueValues;
|
|
2015
|
+
let dateRangesTemp = dateRanges;
|
|
2016
|
+
let curReport = tempReport;
|
|
2017
|
+
if ((newUniqueValues && Object.keys(newUniqueValues).length === 0) ||
|
|
2018
|
+
table !== currentTable) {
|
|
1795
2019
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1796
2020
|
if (tableInfo) {
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
})
|
|
1801
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
1802
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
1803
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
1804
|
-
const joinedUniqueValues = deepCopy(uniqueValues);
|
|
1805
|
-
joinedUniqueValues[table] = newUniqueValues;
|
|
1806
|
-
if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
|
|
1807
|
-
setUniqueValues(joinedUniqueValues);
|
|
2021
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2022
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
2023
|
+
setUniqueValues(newUniqueValues);
|
|
1808
2024
|
}
|
|
2025
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2026
|
+
setDateRanges(dateRangesTemp || {});
|
|
1809
2027
|
}
|
|
1810
2028
|
setCurrentTable(table);
|
|
1811
2029
|
}
|
|
2030
|
+
const cloudBody = {};
|
|
2031
|
+
const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
2032
|
+
if (data2.success === false) {
|
|
2033
|
+
throw new Error(data2.errorMessage);
|
|
2034
|
+
}
|
|
2035
|
+
rows = data2.rows;
|
|
2036
|
+
if (data2.rowCount) {
|
|
2037
|
+
setNumberOfRows(data2.rowCount);
|
|
2038
|
+
}
|
|
1812
2039
|
if (data2.rows && data2.rows.length) {
|
|
1813
2040
|
if (pivot) {
|
|
1814
2041
|
// check if any of the pivot fields aren't in the data2.fields array
|
|
@@ -1818,23 +2045,75 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1818
2045
|
setPivotData(null);
|
|
1819
2046
|
setRows(data2.rows);
|
|
1820
2047
|
setColumns(processedFields);
|
|
2048
|
+
if (data2.rowCount) {
|
|
2049
|
+
const processedFormData = report
|
|
2050
|
+
? report
|
|
2051
|
+
: createInitialFormData(processedFields);
|
|
2052
|
+
setNumberOfRows(data2.rowCount);
|
|
2053
|
+
curReport = {
|
|
2054
|
+
...formData,
|
|
2055
|
+
...processedFormData,
|
|
2056
|
+
itemQuery: data2.itemQuery,
|
|
2057
|
+
rowCount: data2.rowCount,
|
|
2058
|
+
filtersApplied: [],
|
|
2059
|
+
rows: data2.rows,
|
|
2060
|
+
columns: processedFields,
|
|
2061
|
+
};
|
|
2062
|
+
setTempReport(curReport);
|
|
2063
|
+
}
|
|
1821
2064
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
1822
2065
|
setFormattedRows(formattedRows);
|
|
1823
2066
|
return;
|
|
1824
2067
|
}
|
|
2068
|
+
curReport = {
|
|
2069
|
+
...formData,
|
|
2070
|
+
itemQuery: data2.itemQuery,
|
|
2071
|
+
rowCount: data2.rowCount,
|
|
2072
|
+
filtersApplied: [],
|
|
2073
|
+
rows: data2.rows,
|
|
2074
|
+
};
|
|
1825
2075
|
// Do all of this to make sure we have the right unique columns when applying a pivot
|
|
1826
|
-
let
|
|
1827
|
-
const
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
2076
|
+
let dateBucket = undefined;
|
|
2077
|
+
const tempDateRange = dateRangesTemp &&
|
|
2078
|
+
pivot.rowField &&
|
|
2079
|
+
dateRangesTemp[pivot.rowField];
|
|
2080
|
+
if (tempDateRange) {
|
|
2081
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
2082
|
+
}
|
|
2083
|
+
let distinctValuesForQuery = {};
|
|
2084
|
+
if (pivot.columnField) {
|
|
2085
|
+
const sqlQuery = await fetchSqlQuery({ ...baseAst, where: curFormData }, null, false);
|
|
2086
|
+
distinctValuesForQuery = await getUniqueValuesByColumns([
|
|
2087
|
+
{
|
|
2088
|
+
field: pivot.columnField,
|
|
2089
|
+
label: pivot.columnField,
|
|
2090
|
+
format: 'string',
|
|
2091
|
+
},
|
|
2092
|
+
], sqlQuery, [], client, customFields);
|
|
2093
|
+
}
|
|
2094
|
+
const pivotedData = await generatePivotTable(
|
|
2095
|
+
// @ts-ignore
|
|
2096
|
+
pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, distinctValuesForQuery ? distinctValuesForQuery : undefined);
|
|
1833
2097
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1834
2098
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1835
2099
|
setPivotData(pivotedData);
|
|
1836
2100
|
setRows(data2.rows);
|
|
1837
2101
|
setColumns(processedFields);
|
|
2102
|
+
if (data2.rowCount) {
|
|
2103
|
+
const processedFormData = report
|
|
2104
|
+
? report
|
|
2105
|
+
: createInitialFormData(processedFields);
|
|
2106
|
+
setNumberOfRows(data2.rowCount);
|
|
2107
|
+
setTempReport({
|
|
2108
|
+
...formData,
|
|
2109
|
+
...processedFormData,
|
|
2110
|
+
itemQuery: data2.itemQuery,
|
|
2111
|
+
rowCount: data2.rowCount,
|
|
2112
|
+
filtersApplied: [],
|
|
2113
|
+
rows: data2.rows,
|
|
2114
|
+
columns: processedFields,
|
|
2115
|
+
});
|
|
2116
|
+
}
|
|
1838
2117
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
|
|
1839
2118
|
setSelectedColumns(processedFields.map((column) => {
|
|
1840
2119
|
return `${table}.${column.field}`;
|
|
@@ -1845,6 +2124,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1845
2124
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1846
2125
|
setRows(data2.rows);
|
|
1847
2126
|
setColumns(processedFields);
|
|
2127
|
+
if (data2.rowCount) {
|
|
2128
|
+
const processedFormData = report
|
|
2129
|
+
? report
|
|
2130
|
+
: createInitialFormData(processedFields);
|
|
2131
|
+
setNumberOfRows(data2.rowCount);
|
|
2132
|
+
setTempReport({
|
|
2133
|
+
...formData,
|
|
2134
|
+
...processedFormData,
|
|
2135
|
+
itemQuery: data2.itemQuery,
|
|
2136
|
+
rowCount: data2.rowCount,
|
|
2137
|
+
filtersApplied: [],
|
|
2138
|
+
rows: data2.rows,
|
|
2139
|
+
columns: processedFields,
|
|
2140
|
+
});
|
|
2141
|
+
}
|
|
1848
2142
|
setSelectedColumns(processedFields.map((column) => {
|
|
1849
2143
|
return `${table}.${column.field}`;
|
|
1850
2144
|
}));
|
|
@@ -1861,105 +2155,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1861
2155
|
setFormattedRows([]);
|
|
1862
2156
|
setPivotData(null);
|
|
1863
2157
|
}
|
|
2158
|
+
setLoading(false);
|
|
2159
|
+
setDataDisplayed(true);
|
|
2160
|
+
return rows;
|
|
1864
2161
|
}
|
|
1865
2162
|
catch (e) {
|
|
1866
|
-
console.error(e);
|
|
1867
2163
|
setErrorMessage(e.message);
|
|
1868
|
-
}
|
|
1869
|
-
finally {
|
|
1870
2164
|
setLoading(false);
|
|
1871
2165
|
setDataDisplayed(true);
|
|
1872
|
-
|
|
2166
|
+
setRows([]);
|
|
2167
|
+
setColumns([]);
|
|
2168
|
+
setFormattedRows([]);
|
|
2169
|
+
setPivotData(null);
|
|
2170
|
+
return { error: true, message: e.message };
|
|
1873
2171
|
}
|
|
1874
2172
|
}
|
|
1875
2173
|
};
|
|
1876
|
-
// Convert an array of columns to a map where the name is the
|
|
1877
|
-
// key and the value is the column node.
|
|
1878
|
-
const columnArrayToMap = (columns) => {
|
|
1879
|
-
const columnMap = {};
|
|
1880
|
-
for (const col of columns) {
|
|
1881
|
-
const key = col.expr?.value ?? col.expr?.column ?? col.as;
|
|
1882
|
-
columnMap[key] = col;
|
|
1883
|
-
}
|
|
1884
|
-
return columnMap;
|
|
1885
|
-
};
|
|
1886
|
-
const applyFormatting = (response, columns) => {
|
|
1887
|
-
const columnFormatters = {};
|
|
1888
|
-
const columnMap = columnArrayToMap(columns);
|
|
1889
|
-
response.fields.forEach((field) => {
|
|
1890
|
-
// TODO: columnMap[field.name] silently breaks for columnField columns
|
|
1891
|
-
const formatType = getPostgresBasicType(field);
|
|
1892
|
-
if (formatType === 'date') {
|
|
1893
|
-
columnFormatters[field.name] = (x) => {
|
|
1894
|
-
const d = new Date(x);
|
|
1895
|
-
// check if d is a valid date
|
|
1896
|
-
if (isNaN(d.getTime())) {
|
|
1897
|
-
return 'Invalid Date';
|
|
1898
|
-
}
|
|
1899
|
-
d.setMinutes(d.getMinutes() + d.getTimezoneOffset()); // TZ adjust
|
|
1900
|
-
if (columnMap[field.name]?.expr.type === 'function' &&
|
|
1901
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
1902
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
1903
|
-
'month') {
|
|
1904
|
-
return d.toLocaleString('default', {
|
|
1905
|
-
month: 'short',
|
|
1906
|
-
year: 'numeric',
|
|
1907
|
-
});
|
|
1908
|
-
}
|
|
1909
|
-
else if (columnMap[field.name]?.expr.type === 'function' &&
|
|
1910
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
1911
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
1912
|
-
'quarter') {
|
|
1913
|
-
return `Q${getQuarter(d)} ${d.getFullYear()}`;
|
|
1914
|
-
}
|
|
1915
|
-
else if (columnMap[field.name]?.expr.type === 'function' &&
|
|
1916
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
1917
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
1918
|
-
'year') {
|
|
1919
|
-
return d.toLocaleString('default', {
|
|
1920
|
-
year: 'numeric',
|
|
1921
|
-
});
|
|
1922
|
-
}
|
|
1923
|
-
return DATE_FMT.format(d);
|
|
1924
|
-
};
|
|
1925
|
-
}
|
|
1926
|
-
else if (formatType === 'number') {
|
|
1927
|
-
columnFormatters[field.name] = (x) => {
|
|
1928
|
-
if (columnMap[field.name]?.expr.type === 'extract' &&
|
|
1929
|
-
columnMap[field.name]?.expr.args.field.toLowerCase() === 'dow') {
|
|
1930
|
-
return DAY_OF_WEEK[x];
|
|
1931
|
-
}
|
|
1932
|
-
else if (columnMap[field.name]?.expr.type === 'extract' &&
|
|
1933
|
-
columnMap[field.name]?.expr.args.field.toLowerCase() === 'month') {
|
|
1934
|
-
return MONTH_OF_YEAR[x - 1];
|
|
1935
|
-
}
|
|
1936
|
-
else if (`${x}`.includes('.')) {
|
|
1937
|
-
// return MONEY_FMT.format(Number(x ?? 0.0));
|
|
1938
|
-
return Number(x ?? 0.0).toFixed(2);
|
|
1939
|
-
}
|
|
1940
|
-
return x ?? 0.0;
|
|
1941
|
-
};
|
|
1942
|
-
}
|
|
1943
|
-
else if (formatType === 'boolean') {
|
|
1944
|
-
columnFormatters[field.name] = (x) => {
|
|
1945
|
-
if (x) {
|
|
1946
|
-
return 'True';
|
|
1947
|
-
}
|
|
1948
|
-
return 'False';
|
|
1949
|
-
};
|
|
1950
|
-
}
|
|
1951
|
-
else {
|
|
1952
|
-
columnFormatters[field.name] = (x) => x;
|
|
1953
|
-
}
|
|
1954
|
-
});
|
|
1955
|
-
return response.rows.map((row) => {
|
|
1956
|
-
const newRow = {};
|
|
1957
|
-
Object.keys(row).forEach((key) => (newRow[key] = columnFormatters[key]
|
|
1958
|
-
? columnFormatters[key](row[key])
|
|
1959
|
-
: row[key]));
|
|
1960
|
-
return newRow;
|
|
1961
|
-
});
|
|
1962
|
-
};
|
|
1963
2174
|
// Returns whether a where-clause contains a nested subquery.
|
|
1964
2175
|
const isSubquery = (node) => {
|
|
1965
2176
|
if (!node)
|
|
@@ -1983,7 +2194,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1983
2194
|
return;
|
|
1984
2195
|
}
|
|
1985
2196
|
try {
|
|
1986
|
-
let errored = false;
|
|
1987
2197
|
setLoading(true);
|
|
1988
2198
|
setAskedAQuestion(true);
|
|
1989
2199
|
setErrorMessage('');
|
|
@@ -2003,6 +2213,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2003
2213
|
body: JSON.stringify({
|
|
2004
2214
|
initialQuestion: aiPrompt || overridePrompt,
|
|
2005
2215
|
publicKey: client.publicKey,
|
|
2216
|
+
useNewNodeSql: true, // new flag
|
|
2006
2217
|
}),
|
|
2007
2218
|
});
|
|
2008
2219
|
}
|
|
@@ -2014,6 +2225,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2014
2225
|
sqlQuery: activeQuery,
|
|
2015
2226
|
initialQuestion: aiPrompt,
|
|
2016
2227
|
publicKey: client.publicKey,
|
|
2228
|
+
useNewNodeSql: true, // new flag
|
|
2017
2229
|
}),
|
|
2018
2230
|
});
|
|
2019
2231
|
}
|
|
@@ -2031,31 +2243,33 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2031
2243
|
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2032
2244
|
return;
|
|
2033
2245
|
}
|
|
2246
|
+
let currentSchema = schema;
|
|
2247
|
+
if (currentSchema && currentSchema.length === 0) {
|
|
2248
|
+
currentSchema = await fetchSchema();
|
|
2249
|
+
}
|
|
2034
2250
|
let newAst, groupByPivot;
|
|
2035
2251
|
if (ast) {
|
|
2036
2252
|
// Unwrap the ast object, supporting many possible types
|
|
2037
2253
|
ast = ast.length ? ast[0] : ast;
|
|
2038
2254
|
newAst = convertBigQuery(ast);
|
|
2039
|
-
newAst = convertWildcardColumns(newAst,
|
|
2040
|
-
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot,
|
|
2041
|
-
if (groupByPivot && !groupByPivot?.valueField) {
|
|
2042
|
-
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2043
|
-
return;
|
|
2044
|
-
}
|
|
2255
|
+
newAst = convertWildcardColumns(newAst, currentSchema); // must go before groupby
|
|
2256
|
+
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, currentSchema));
|
|
2045
2257
|
newAst = convertStringComparison(newAst, client.databaseType);
|
|
2046
2258
|
newAst = convertRemoveSimpleParentheses(newAst);
|
|
2047
2259
|
const table = getTableNames(newAst)[0] ?? initialTableName;
|
|
2048
2260
|
const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
|
|
2049
2261
|
newAst = removeNonSelectedTableReferences(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
|
|
2050
|
-
|
|
2262
|
+
const procesedColumns = deepCopy(newAst).columns?.map((column) => {
|
|
2051
2263
|
if (column.expr.type === 'column_ref') {
|
|
2052
|
-
|
|
2264
|
+
const columnName = extractColumnish(column.expr);
|
|
2265
|
+
return `${table}.${columnName}`;
|
|
2053
2266
|
}
|
|
2054
2267
|
else if (column.as) {
|
|
2055
2268
|
return `${table}.${column.as}`;
|
|
2056
2269
|
}
|
|
2057
2270
|
return `${table}.${column.expr.value}`;
|
|
2058
|
-
})
|
|
2271
|
+
});
|
|
2272
|
+
setSelectedColumns(procesedColumns);
|
|
2059
2273
|
if (groupByPivot) {
|
|
2060
2274
|
setBaseAst(deepCopy({ ...newAst, orderby: null, limit: null }));
|
|
2061
2275
|
newAst = deepCopy({ ...newAst, orderby: null, limit: null });
|
|
@@ -2071,7 +2285,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2071
2285
|
ast = newAst; // so we fetch data for newAst later.
|
|
2072
2286
|
fetchSqlQuery(ast, undefined, false);
|
|
2073
2287
|
const table = getTableNames(newAst)[0] ?? initialTableName;
|
|
2074
|
-
const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
|
|
2075
2288
|
const hostedBody = {
|
|
2076
2289
|
metadata: {
|
|
2077
2290
|
clientId: client.publicKey,
|
|
@@ -2079,34 +2292,46 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2079
2292
|
publicKey: client.publicKey,
|
|
2080
2293
|
orgId: client.customerId,
|
|
2081
2294
|
task: 'patterns',
|
|
2082
|
-
|
|
2295
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2296
|
+
useUpdatedDataGathering: true,
|
|
2297
|
+
pivot: groupByPivot,
|
|
2298
|
+
useNewNodeSql: true, // new flag
|
|
2083
2299
|
},
|
|
2084
2300
|
};
|
|
2085
|
-
const cloudBody = {};
|
|
2086
|
-
const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2087
|
-
if (data2.status === 'error') {
|
|
2088
|
-
throw new Error('Error querying data from patterns');
|
|
2089
|
-
}
|
|
2090
2301
|
let currentUniqueValues = uniqueValues;
|
|
2091
|
-
|
|
2092
|
-
|
|
2302
|
+
let dateRangesTemp = dateRanges;
|
|
2303
|
+
if ((currentUniqueValues &&
|
|
2304
|
+
currentUniqueValues[table] &&
|
|
2305
|
+
Object.keys(currentUniqueValues[table]).length === 0) ||
|
|
2306
|
+
table !== currentTable) {
|
|
2307
|
+
const tableInfo = currentSchema.find((tableInfo) => tableInfo.name === table);
|
|
2093
2308
|
if (tableInfo) {
|
|
2094
|
-
const
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
.map((column) => convertColumnInfoToColumnInternal(column));
|
|
2099
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
2100
|
-
const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
2101
|
-
currentUniqueValues[table] = newUniqueValues;
|
|
2102
|
-
if (hashCode(uniqueValues) !== hashCode(currentUniqueValues)) {
|
|
2103
|
-
setUniqueValues(currentUniqueValues);
|
|
2309
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2310
|
+
currentUniqueValues = newUniqueValues;
|
|
2311
|
+
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
2312
|
+
setUniqueValues(newUniqueValues);
|
|
2104
2313
|
}
|
|
2314
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2315
|
+
setDateRanges(dateRangesTemp);
|
|
2105
2316
|
}
|
|
2106
2317
|
setCurrentTable(table);
|
|
2107
2318
|
}
|
|
2319
|
+
const cloudBody = {};
|
|
2320
|
+
const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2321
|
+
if (!data2 || data2.status === 'error') {
|
|
2322
|
+
throw new Error('Error querying data from patterns');
|
|
2323
|
+
}
|
|
2108
2324
|
if (data2.rows && data2.rows.length) {
|
|
2109
|
-
const processedFields = data2.fields
|
|
2325
|
+
const processedFields = data2.fields
|
|
2326
|
+
.map((elem) => convertPostgresColumn(elem))
|
|
2327
|
+
.map((elem) => {
|
|
2328
|
+
const tableInfo = currentSchema.find((t) => t.name === table);
|
|
2329
|
+
const columnInfo = tableInfo?.columns.find((column) => column.name === elem.field);
|
|
2330
|
+
return columnInfo
|
|
2331
|
+
? convertColumnInfoToColumnInternal(columnInfo)
|
|
2332
|
+
: null;
|
|
2333
|
+
})
|
|
2334
|
+
.filter((elem) => elem);
|
|
2110
2335
|
let possiblePivot = true;
|
|
2111
2336
|
const possibleColumns = getPossiblePivotFieldOptions(processedFields, currentUniqueValues[table]);
|
|
2112
2337
|
if (groupByPivot &&
|
|
@@ -2120,7 +2345,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2120
2345
|
let errorMessageEnding = '';
|
|
2121
2346
|
if (groupByPivot.columnField &&
|
|
2122
2347
|
!possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
|
|
2123
|
-
if (currentUniqueValues[table][groupByPivot?.columnField || '']) {
|
|
2348
|
+
if (currentUniqueValues[table]?.[groupByPivot?.columnField || '']) {
|
|
2124
2349
|
errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
|
|
2125
2350
|
}
|
|
2126
2351
|
else {
|
|
@@ -2129,7 +2354,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2129
2354
|
}
|
|
2130
2355
|
else if (groupByPivot.rowField &&
|
|
2131
2356
|
!possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
|
|
2132
|
-
if (currentUniqueValues[table][groupByPivot?.rowField || '']) {
|
|
2357
|
+
if (currentUniqueValues[table]?.[groupByPivot?.rowField || '']) {
|
|
2133
2358
|
errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
|
|
2134
2359
|
}
|
|
2135
2360
|
else {
|
|
@@ -2141,18 +2366,45 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2141
2366
|
errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
|
|
2142
2367
|
}
|
|
2143
2368
|
setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
|
|
2144
|
-
errored = true;
|
|
2145
2369
|
}
|
|
2146
2370
|
if (groupByPivot && possiblePivot) {
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2371
|
+
let curReport = report ? report : undefined;
|
|
2372
|
+
if (data2.rowCount) {
|
|
2373
|
+
const processedFormData = report
|
|
2374
|
+
? report
|
|
2375
|
+
: createInitialFormData(processedFields);
|
|
2376
|
+
setNumberOfRows(data2.rowCount);
|
|
2377
|
+
curReport = {
|
|
2378
|
+
...formData,
|
|
2379
|
+
...processedFormData,
|
|
2380
|
+
itemQuery: data2.itemQuery,
|
|
2381
|
+
rowCount: data2.rowCount,
|
|
2382
|
+
filtersApplied: [],
|
|
2383
|
+
rows: data2.rows,
|
|
2384
|
+
columns: processedFields,
|
|
2385
|
+
};
|
|
2386
|
+
setTempReport(curReport || null);
|
|
2387
|
+
}
|
|
2388
|
+
let dateBucket = undefined;
|
|
2389
|
+
const tempDateRange = dateRangesTemp &&
|
|
2390
|
+
groupByPivot.rowField &&
|
|
2391
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
2392
|
+
if (tempDateRange) {
|
|
2393
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
2394
|
+
}
|
|
2395
|
+
const pivotedData = await generatePivotTable(
|
|
2396
|
+
// @ts-ignore
|
|
2397
|
+
groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
|
|
2398
|
+
? currentUniqueValues[groupByPivot.columnField]
|
|
2399
|
+
: undefined);
|
|
2152
2400
|
console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
|
|
2153
2401
|
setPivotData(pivotedData);
|
|
2154
2402
|
setPivot(groupByPivot);
|
|
2155
2403
|
setRows(data2.rows);
|
|
2404
|
+
setPivotRowField(groupByPivot?.rowField);
|
|
2405
|
+
setPivotColumnField(groupByPivot?.columnField);
|
|
2406
|
+
setPivotValueField(groupByPivot?.valueField);
|
|
2407
|
+
setPivotAggregation(groupByPivot?.aggregationType);
|
|
2156
2408
|
setColumns(processedFields);
|
|
2157
2409
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
|
|
2158
2410
|
setFormattedRows(formattedRows);
|
|
@@ -2161,6 +2413,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2161
2413
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
2162
2414
|
setRows(data2.rows);
|
|
2163
2415
|
setColumns(processedFields);
|
|
2416
|
+
if (data2.rowCount) {
|
|
2417
|
+
setNumberOfRows(data2.rowCount);
|
|
2418
|
+
setTempReport({
|
|
2419
|
+
...formData,
|
|
2420
|
+
itemQuery: data2.itemQuery,
|
|
2421
|
+
rowCount: data2.rowCount,
|
|
2422
|
+
filtersApplied: [],
|
|
2423
|
+
rows: data2.rows,
|
|
2424
|
+
columns: processedFields,
|
|
2425
|
+
});
|
|
2426
|
+
}
|
|
2164
2427
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
2165
2428
|
setFormattedRows(formattedRows);
|
|
2166
2429
|
}
|
|
@@ -2179,7 +2442,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2179
2442
|
setActiveQuery('');
|
|
2180
2443
|
}
|
|
2181
2444
|
if (data2.errorMessage) {
|
|
2182
|
-
setErrorMessage(`Error:
|
|
2445
|
+
setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
|
|
2183
2446
|
}
|
|
2184
2447
|
}
|
|
2185
2448
|
catch (e) {
|
|
@@ -2199,7 +2462,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2199
2462
|
setSelectedColumns((selectedColumns) => selectedColumns.filter((column) => !column.endsWith(name)));
|
|
2200
2463
|
const columns = baseAst.columns.filter((col) => {
|
|
2201
2464
|
if (col.expr.type === 'column_ref') {
|
|
2202
|
-
return col.expr.column !== name
|
|
2465
|
+
return (col.expr.column !== name &&
|
|
2466
|
+
(!col.expr.column.expr || col.expr.column.expr.value !== name));
|
|
2203
2467
|
}
|
|
2204
2468
|
else if (col.as) {
|
|
2205
2469
|
return col.as !== name;
|
|
@@ -2214,14 +2478,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2214
2478
|
setBaseAst(newAst);
|
|
2215
2479
|
fetchSqlQuery(newAst);
|
|
2216
2480
|
};
|
|
2217
|
-
function TopLevelBooleanSwitch({ node, keyPrefix, handleOperatorChange, }) {
|
|
2218
|
-
return (_jsx("div", { style: { width: 'fit-content' }, children: _jsx(TabsComponent, { value: node.operator, options: DEFAULT_TAB_OPTIONS, onChange: (event) => {
|
|
2219
|
-
if (loading) {
|
|
2220
|
-
return;
|
|
2221
|
-
}
|
|
2222
|
-
handleOperatorChange(event.target.value, node, keyPrefix);
|
|
2223
|
-
} }) }));
|
|
2224
|
-
}
|
|
2225
2481
|
const DraggableItem = ({ id, label, onDelete }) => {
|
|
2226
2482
|
const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: id });
|
|
2227
2483
|
const style = {
|
|
@@ -2248,7 +2504,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2248
2504
|
setOrderedColumnNames(newOrder);
|
|
2249
2505
|
const orderedSelectedColumns = [];
|
|
2250
2506
|
for (const value of newOrder) {
|
|
2251
|
-
const
|
|
2507
|
+
const column = value.split('.')[1];
|
|
2252
2508
|
if (selectedColumns.includes(value)) {
|
|
2253
2509
|
orderedSelectedColumns.push(column);
|
|
2254
2510
|
}
|
|
@@ -2272,12 +2528,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2272
2528
|
fetchSqlQuery(newAst, undefined, false);
|
|
2273
2529
|
}
|
|
2274
2530
|
}
|
|
2275
|
-
const columnNamesInAst = baseAst?.columns
|
|
2276
|
-
|
|
2277
|
-
|
|
2531
|
+
const columnNamesInAst = baseAst?.columns
|
|
2532
|
+
.map((col) => {
|
|
2533
|
+
if (col.expr.type === 'column_ref' && col.expr.column) {
|
|
2534
|
+
if (typeof col.expr.column === 'string') {
|
|
2535
|
+
return col.expr.column;
|
|
2536
|
+
}
|
|
2537
|
+
else {
|
|
2538
|
+
return col.expr.column.expr.value;
|
|
2539
|
+
}
|
|
2278
2540
|
}
|
|
2279
2541
|
else if (col.as) {
|
|
2280
|
-
|
|
2542
|
+
if (typeof col.as === 'string') {
|
|
2543
|
+
return col.as;
|
|
2544
|
+
}
|
|
2545
|
+
else {
|
|
2546
|
+
return col.as.expr?.value;
|
|
2547
|
+
}
|
|
2281
2548
|
}
|
|
2282
2549
|
else if (col.expr && col.expr.type === 'aggr_func') {
|
|
2283
2550
|
if (col.expr.args) {
|
|
@@ -2286,22 +2553,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2286
2553
|
return col.expr.name;
|
|
2287
2554
|
}
|
|
2288
2555
|
return col.expr.value;
|
|
2289
|
-
})
|
|
2556
|
+
})
|
|
2557
|
+
.filter(
|
|
2558
|
+
// remove duplicate entries
|
|
2559
|
+
(value, index, self) => value && self.indexOf(value) === index) ?? [];
|
|
2290
2560
|
return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: columnNamesInAst, strategy: verticalListSortingStrategy, children: _jsxs("div", { style: {
|
|
2291
2561
|
display: 'flex',
|
|
2292
2562
|
flexDirection: 'column',
|
|
2293
2563
|
gap: 8,
|
|
2294
2564
|
}, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
|
|
2295
2565
|
}
|
|
2296
|
-
if (loading ||
|
|
2566
|
+
if (loading || initialChartLoad) {
|
|
2297
2567
|
return (_jsxs("div", { style: {
|
|
2298
2568
|
display: 'flex',
|
|
2299
2569
|
flexDirection: 'row',
|
|
2300
2570
|
height: '100%',
|
|
2301
2571
|
...containerStyle,
|
|
2302
2572
|
}, className: className, ref: parentRef, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2303
|
-
if (loadingSchema)
|
|
2304
|
-
return;
|
|
2305
2573
|
if (!openPopover) {
|
|
2306
2574
|
setOpenPopover('AddColumnModal');
|
|
2307
2575
|
}
|
|
@@ -2322,12 +2590,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2322
2590
|
}, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
|
|
2323
2591
|
setBaseAst(ast);
|
|
2324
2592
|
fetchSqlQuery(ast);
|
|
2325
|
-
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2593
|
+
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2326
2594
|
display: 'flex',
|
|
2327
2595
|
flexDirection: 'column',
|
|
2328
2596
|
gap: 8,
|
|
2329
2597
|
marginBottom: 12,
|
|
2330
|
-
}, children:
|
|
2598
|
+
}, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
|
|
2331
2599
|
display: 'flex',
|
|
2332
2600
|
flexDirection: 'column',
|
|
2333
2601
|
alignItems: 'flex-start',
|
|
@@ -2339,7 +2607,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2339
2607
|
}
|
|
2340
2608
|
if (!openPopover) {
|
|
2341
2609
|
const value = orderedColumnNames[0];
|
|
2342
|
-
const
|
|
2610
|
+
const column = value.split('.')[1];
|
|
2343
2611
|
const columnType = getColumnTypeByName(column);
|
|
2344
2612
|
if (isNumericColumnType(columnType)) {
|
|
2345
2613
|
const newSubtree = deepCopy(defaultNumericComparison);
|
|
@@ -2368,27 +2636,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2368
2636
|
setActiveEditItem(null);
|
|
2369
2637
|
}, 300);
|
|
2370
2638
|
}
|
|
2371
|
-
}, popoverTitle: 'Add filter', popoverChildren: _jsx(
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
}
|
|
2381
|
-
else {
|
|
2382
|
-
setIsPending(false);
|
|
2383
|
-
handleInsertion(activeEditItem, 'AND', false);
|
|
2384
|
-
setActivePath(null);
|
|
2385
|
-
setOpenPopover(null);
|
|
2386
|
-
setTimeout(() => {
|
|
2387
|
-
clearCheckboxes();
|
|
2388
|
-
setActiveEditItem(null);
|
|
2389
|
-
}, 300);
|
|
2390
|
-
}
|
|
2391
|
-
}, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
|
|
2639
|
+
}, popoverTitle: 'Add filter', popoverChildren: _jsx(FilterModal, { schema: schema.find((s) => s.name === currentTable ||
|
|
2640
|
+
s.displayName === currentTable) ?? schema[0], fieldValuesMap: uniqueValues[getTableNames(baseAst).length === 1
|
|
2641
|
+
? getTableNames(baseAst)[0]
|
|
2642
|
+
: initialTableName], onSubmitFilter: (filter) => {
|
|
2643
|
+
setOpenPopover(null);
|
|
2644
|
+
setIsPending(false);
|
|
2645
|
+
const item = filterToAst(filter, client.databaseType.toLowerCase());
|
|
2646
|
+
handleInsertion(item, 'AND', false);
|
|
2647
|
+
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
|
|
2392
2648
|
false && ( // temp removed the AddConditionPopover
|
|
2393
2649
|
_jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2394
2650
|
if (!openPopover) {
|
|
@@ -2427,25 +2683,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2427
2683
|
setActivePath(null);
|
|
2428
2684
|
setOpenPopover(null);
|
|
2429
2685
|
}
|
|
2430
|
-
} }) })] }))] })] }), _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:
|
|
2686
|
+
} }) })] }))] })] }), _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: () => {
|
|
2431
2687
|
setPivot(null);
|
|
2432
2688
|
setPivotData(null);
|
|
2433
2689
|
const formattedRows = formatRows(rows, columns, false);
|
|
2434
2690
|
setFormattedRows(formattedRows);
|
|
2435
2691
|
},
|
|
2436
2692
|
// TODOs
|
|
2437
|
-
selectPivot: (
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
const newAst = { ...baseAst };
|
|
2441
|
-
newAst.orderby = null;
|
|
2442
|
-
setBaseAst(newAst); // trigger refetch
|
|
2443
|
-
setPivot(pivot);
|
|
2444
|
-
const pivotedData = generatePivotTableInMemory(pivot, rows, undefined, false);
|
|
2445
|
-
setPivotData(pivotedData || []);
|
|
2446
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2447
|
-
setFormattedRows(formattedRows);
|
|
2448
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2693
|
+
selectPivot: () => {
|
|
2694
|
+
return;
|
|
2695
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport ?? report }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2449
2696
|
setPivotRowField(value);
|
|
2450
2697
|
}, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
|
|
2451
2698
|
setPivot(null);
|
|
@@ -2460,7 +2707,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2460
2707
|
}, children: _jsx(SortSentence, { sortData: {
|
|
2461
2708
|
type: pivot.sortDirection,
|
|
2462
2709
|
expr: { type: 'column_ref', column: pivot.sortField },
|
|
2463
|
-
}, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
2710
|
+
}, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
2464
2711
|
setPivot({ ...pivot, sort: false });
|
|
2465
2712
|
setBaseAst(deepCopy(baseAst));
|
|
2466
2713
|
if (!pivot) {
|
|
@@ -2509,7 +2756,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2509
2756
|
if (!pivot) {
|
|
2510
2757
|
fetchSqlQuery(newAst);
|
|
2511
2758
|
}
|
|
2512
|
-
}, setIsPending: setIsPending, setEditPopoverKey:
|
|
2759
|
+
}, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
2513
2760
|
const newAst = { ...baseAst };
|
|
2514
2761
|
newAst.orderby.splice(id, 1);
|
|
2515
2762
|
setBaseAst(deepCopy(newAst));
|
|
@@ -2532,7 +2779,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2532
2779
|
setActivePath(null);
|
|
2533
2780
|
setOpenPopover(null);
|
|
2534
2781
|
}
|
|
2535
|
-
}, popoverTitle: "Sort by", popoverChildren: _jsx(AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? (_jsx("div", { style: {
|
|
2782
|
+
}, popoverTitle: "Sort by", popoverChildren: _jsx(AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? (_jsx("div", { style: {
|
|
2536
2783
|
display: 'flex',
|
|
2537
2784
|
flexDirection: 'column',
|
|
2538
2785
|
gap: 8,
|
|
@@ -2587,7 +2834,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2587
2834
|
? askAIInputWidth
|
|
2588
2835
|
: askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), _jsx(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), ((baseAst && dataDisplayed) ||
|
|
2589
2836
|
initialLoad ||
|
|
2590
|
-
|
|
2837
|
+
initialChartLoad) && (_jsx(SecondaryButtonComponent, { onClick: () => { }, label: "New report" }))] }) })), _jsxs(_Fragment, { children: [_jsx(TableComponent, { isLoading: true, rows: [], columns: [] }), baseAst && dataDisplayed && !initialChartLoad && (_jsxs("div", { style: {
|
|
2591
2838
|
display: 'flex',
|
|
2592
2839
|
flexDirection: 'row',
|
|
2593
2840
|
gap: '12px',
|
|
@@ -2602,8 +2849,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2602
2849
|
boxSizing: 'border-box',
|
|
2603
2850
|
...containerStyle,
|
|
2604
2851
|
}, className: className, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2605
|
-
if (loadingSchema)
|
|
2606
|
-
return;
|
|
2607
2852
|
if (!orderedColumnNames) {
|
|
2608
2853
|
return;
|
|
2609
2854
|
}
|
|
@@ -2627,12 +2872,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2627
2872
|
}, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
|
|
2628
2873
|
setBaseAst(ast);
|
|
2629
2874
|
fetchSqlQuery(ast);
|
|
2630
|
-
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2875
|
+
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, schemaLoading: loadingSchema, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2631
2876
|
display: 'flex',
|
|
2632
2877
|
flexDirection: 'column',
|
|
2633
2878
|
gap: 8,
|
|
2634
2879
|
marginBottom: 12,
|
|
2635
|
-
}, children:
|
|
2880
|
+
}, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
|
|
2636
2881
|
display: 'flex',
|
|
2637
2882
|
flexDirection: 'column',
|
|
2638
2883
|
alignItems: 'flex-start',
|
|
@@ -2644,7 +2889,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2644
2889
|
}
|
|
2645
2890
|
if (!openPopover) {
|
|
2646
2891
|
const value = orderedColumnNames[0];
|
|
2647
|
-
const
|
|
2892
|
+
const column = value.split('.')[1];
|
|
2648
2893
|
const columnType = getColumnTypeByName(column);
|
|
2649
2894
|
if (isNumericColumnType(columnType)) {
|
|
2650
2895
|
const newSubtree = deepCopy(defaultNumericComparison);
|
|
@@ -2674,27 +2919,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2674
2919
|
setActiveEditItem(null);
|
|
2675
2920
|
}, 300);
|
|
2676
2921
|
}
|
|
2677
|
-
}, popoverTitle: "Add filter", popoverChildren: _jsx(
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
setActiveEditItem(null);
|
|
2685
|
-
}, 300);
|
|
2686
|
-
}
|
|
2687
|
-
else {
|
|
2688
|
-
setOpenPopover(null);
|
|
2689
|
-
setIsPending(false);
|
|
2690
|
-
handleInsertion(activeEditItem, 'AND', false);
|
|
2691
|
-
setActivePath(null);
|
|
2692
|
-
setTimeout(() => {
|
|
2693
|
-
clearCheckboxes();
|
|
2694
|
-
setActiveEditItem(null);
|
|
2695
|
-
}, 300);
|
|
2696
|
-
}
|
|
2697
|
-
}, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
|
|
2922
|
+
}, popoverTitle: "Add filter", popoverChildren: _jsx(FilterModal, { schema: schema.find((s) => s.name === currentTable ||
|
|
2923
|
+
s.displayName === currentTable) ?? schema[0], fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
|
|
2924
|
+
setOpenPopover(null);
|
|
2925
|
+
setIsPending(false);
|
|
2926
|
+
const item = filterToAst(filter, client.databaseType.toLowerCase());
|
|
2927
|
+
handleInsertion(item, 'AND', false);
|
|
2928
|
+
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
|
|
2698
2929
|
false && ( // temp removed the AddConditionPopover
|
|
2699
2930
|
_jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2700
2931
|
if (!openPopover) {
|
|
@@ -2734,12 +2965,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2734
2965
|
setOpenPopover(null);
|
|
2735
2966
|
clearCheckboxes();
|
|
2736
2967
|
}
|
|
2737
|
-
} }) })] }))] })] }), _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:
|
|
2968
|
+
} }) })] }))] })] }), _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: () => {
|
|
2738
2969
|
setPivot(null);
|
|
2739
2970
|
setPivotData(null);
|
|
2740
2971
|
const formattedRows = formatRows(rows, columns, false);
|
|
2741
2972
|
setFormattedRows(formattedRows);
|
|
2742
|
-
}, selectPivot: (pivot) => {
|
|
2973
|
+
}, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
|
|
2743
2974
|
if (!pivot)
|
|
2744
2975
|
return;
|
|
2745
2976
|
const newAst = { ...baseAst };
|
|
@@ -2749,13 +2980,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2749
2980
|
pivot['sortDirection'] = 'ASC';
|
|
2750
2981
|
}
|
|
2751
2982
|
setBaseAst(newAst); // trigger refetch
|
|
2983
|
+
let dateBucket = undefined;
|
|
2984
|
+
if (dateRange) {
|
|
2985
|
+
dateBucket = getDateBucketFromRange(dateRange);
|
|
2986
|
+
}
|
|
2987
|
+
if (!pivotTable) {
|
|
2988
|
+
pivotTable = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
|
|
2989
|
+
}
|
|
2990
|
+
setPivotData(pivotTable || []);
|
|
2752
2991
|
setPivot(pivot);
|
|
2753
|
-
const
|
|
2754
|
-
setPivotData(pivotedData || []);
|
|
2755
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2992
|
+
const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
|
|
2756
2993
|
setFormattedRows(formattedRows);
|
|
2757
2994
|
setErrorMessage('');
|
|
2758
|
-
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2995
|
+
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2759
2996
|
setPivotRowField(value);
|
|
2760
2997
|
updatePivot(value, 'rowField');
|
|
2761
2998
|
}, setPivotColumnField: (value) => {
|
|
@@ -2787,10 +3024,18 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2787
3024
|
`.${pivot.rowField}`,
|
|
2788
3025
|
`.${pivot.valueField || 'count'}`,
|
|
2789
3026
|
]
|
|
2790
|
-
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
3027
|
+
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
|
|
2791
3028
|
if (pivot) {
|
|
2792
|
-
|
|
2793
|
-
|
|
3029
|
+
const tempPivot = { ...pivot, sort: false };
|
|
3030
|
+
let dateBucket = undefined;
|
|
3031
|
+
const tempDateRange = dateRanges &&
|
|
3032
|
+
pivot.rowField &&
|
|
3033
|
+
dateRanges[pivot.rowField];
|
|
3034
|
+
if (tempDateRange) {
|
|
3035
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
3036
|
+
}
|
|
3037
|
+
setPivot(tempPivot);
|
|
3038
|
+
const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2794
3039
|
setPivotData(pivotedData || []);
|
|
2795
3040
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2796
3041
|
setFormattedRows(formattedRows);
|
|
@@ -2799,25 +3044,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2799
3044
|
}
|
|
2800
3045
|
setBaseAst(deepCopy(baseAst));
|
|
2801
3046
|
fetchSqlQuery(deepCopy(baseAst));
|
|
2802
|
-
}, onSave: (column, direction) => {
|
|
3047
|
+
}, onSave: async (column, direction) => {
|
|
2803
3048
|
if (pivot) {
|
|
2804
3049
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2805
3050
|
? 'number'
|
|
2806
3051
|
: pivot.rowFieldType;
|
|
2807
|
-
|
|
3052
|
+
const tempPivot = {
|
|
2808
3053
|
...pivot,
|
|
2809
3054
|
sort: true,
|
|
2810
3055
|
sortDirection: direction,
|
|
2811
3056
|
sortField: column,
|
|
2812
3057
|
sortFieldType: sortFieldType,
|
|
2813
|
-
}
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2820
|
-
|
|
3058
|
+
};
|
|
3059
|
+
setPivot(tempPivot);
|
|
3060
|
+
let dateBucket = undefined;
|
|
3061
|
+
const tempDateRange = dateRanges &&
|
|
3062
|
+
pivot.rowField &&
|
|
3063
|
+
dateRanges[pivot.rowField];
|
|
3064
|
+
if (tempDateRange) {
|
|
3065
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
3066
|
+
}
|
|
3067
|
+
const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2821
3068
|
setPivotData(pivotedData || []);
|
|
2822
3069
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2823
3070
|
setFormattedRows(formattedRows);
|
|
@@ -2832,7 +3079,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2832
3079
|
flexDirection: 'column',
|
|
2833
3080
|
gap: 8,
|
|
2834
3081
|
marginBottom: 12,
|
|
2835
|
-
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
3082
|
+
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
2836
3083
|
if (pivot) {
|
|
2837
3084
|
setPivot({ ...pivot, sort: false });
|
|
2838
3085
|
return;
|
|
@@ -2898,27 +3145,29 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2898
3145
|
`.${pivot.rowField}`,
|
|
2899
3146
|
`.${pivot.valueField || 'count'}`,
|
|
2900
3147
|
]
|
|
2901
|
-
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
|
|
3148
|
+
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
|
|
2902
3149
|
if (column === '')
|
|
2903
3150
|
return;
|
|
2904
3151
|
if (pivot) {
|
|
2905
3152
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2906
3153
|
? 'number'
|
|
2907
3154
|
: pivot.rowFieldType;
|
|
2908
|
-
|
|
2909
|
-
...pivot,
|
|
2910
|
-
sort: true,
|
|
2911
|
-
sortDirection: direction,
|
|
2912
|
-
sortField: column,
|
|
2913
|
-
sortFieldType: sortFieldType,
|
|
2914
|
-
});
|
|
2915
|
-
const pivotedData = generatePivotTableInMemory({
|
|
3155
|
+
const tempPivot = {
|
|
2916
3156
|
...pivot,
|
|
2917
3157
|
sort: true,
|
|
2918
3158
|
sortDirection: direction,
|
|
2919
3159
|
sortField: column,
|
|
2920
3160
|
sortFieldType: sortFieldType,
|
|
2921
|
-
}
|
|
3161
|
+
};
|
|
3162
|
+
setPivot(tempPivot);
|
|
3163
|
+
let dateBucket = undefined;
|
|
3164
|
+
const tempDateRange = dateRanges &&
|
|
3165
|
+
pivot.rowField &&
|
|
3166
|
+
dateRanges[pivot.rowField];
|
|
3167
|
+
if (tempDateRange) {
|
|
3168
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
3169
|
+
}
|
|
3170
|
+
const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2922
3171
|
setErrorMessage('');
|
|
2923
3172
|
setPivotData(pivotedData || []);
|
|
2924
3173
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
@@ -2940,7 +3189,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2940
3189
|
setOpenPopover(null);
|
|
2941
3190
|
setBaseAst(deepCopy(newAst));
|
|
2942
3191
|
fetchSqlQuery(deepCopy(newAst));
|
|
2943
|
-
} }) }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? (_jsx("div", { style: {
|
|
3192
|
+
} }) }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? (_jsx("div", { style: {
|
|
2944
3193
|
display: 'flex',
|
|
2945
3194
|
flexDirection: 'column',
|
|
2946
3195
|
gap: 8,
|
|
@@ -3011,14 +3260,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3011
3260
|
? askAIInputWidth
|
|
3012
3261
|
: askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
|
|
3013
3262
|
? 'Ask a follow-up question...'
|
|
3014
|
-
: 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading:
|
|
3263
|
+
: 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: tableLoading ||
|
|
3264
|
+
(loading && errorMessage.length === 0) ||
|
|
3265
|
+
initialChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
|
|
3015
3266
|
? pivotData?.columns || emptyPivotColumns()
|
|
3016
3267
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
3017
3268
|
return {
|
|
3018
3269
|
label: snakeAndCamelCaseToTitleCase(c),
|
|
3019
3270
|
field: c,
|
|
3020
3271
|
};
|
|
3021
|
-
}) })), _jsxs("div", { style: {
|
|
3272
|
+
}), onPageChange: onPageChange, onSortChange: onSortChange })), _jsxs("div", { style: {
|
|
3022
3273
|
display: 'flex',
|
|
3023
3274
|
flexDirection: 'row',
|
|
3024
3275
|
gap: '12px',
|
|
@@ -3029,11 +3280,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3029
3280
|
overflow: 'hidden',
|
|
3030
3281
|
width: '100%',
|
|
3031
3282
|
gap: 12,
|
|
3032
|
-
|
|
3283
|
+
alignItems: 'center',
|
|
3284
|
+
}, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && (_jsxs(_Fragment, { children: [!hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: () => {
|
|
3033
3285
|
setIsChartBuilderOpen(true);
|
|
3034
|
-
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3286
|
+
}, disabled: !!errorMessage, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3035
3287
|
? {
|
|
3036
3288
|
...report,
|
|
3289
|
+
...tempReport,
|
|
3037
3290
|
pivot: pivot,
|
|
3038
3291
|
yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
|
|
3039
3292
|
columns: report.columns.filter((col) => {
|
|
@@ -3044,5 +3297,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3044
3297
|
queryString: activeQuery,
|
|
3045
3298
|
rows: rows,
|
|
3046
3299
|
}
|
|
3047
|
-
:
|
|
3300
|
+
: tempReport, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, 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: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement, rowCount: numberOfRows, onPageChange: onPageChange, onSortChange: onSortChange, isLoading: tableLoading }))] }));
|
|
3048
3301
|
}
|