@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
|
@@ -5,13 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.QUILL_SERVER = void 0;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
-
/* eslint-disable no-unused-vars */
|
|
9
8
|
const react_1 = require("react");
|
|
10
9
|
const UiComponents_1 = require("./components/UiComponents");
|
|
11
10
|
const core_1 = require("@dnd-kit/core");
|
|
12
11
|
const sortable_1 = require("@dnd-kit/sortable");
|
|
13
12
|
const utilities_1 = require("@dnd-kit/utilities");
|
|
14
|
-
const date_fns_1 = require("date-fns");
|
|
15
13
|
const Context_1 = require("./Context");
|
|
16
14
|
const ast_1 = require("./components/ReportBuilder/ast");
|
|
17
15
|
const ChartBuilder_1 = require("./ChartBuilder");
|
|
@@ -41,6 +39,14 @@ const columnProcessing_1 = require("./utils/columnProcessing");
|
|
|
41
39
|
const astProcessing_1 = require("./utils/astProcessing");
|
|
42
40
|
const PivotForm_1 = __importDefault(require("./internals/ReportBuilder/PivotForm"));
|
|
43
41
|
const schema_1 = require("./utils/schema");
|
|
42
|
+
const dates_1 = require("./utils/dates");
|
|
43
|
+
const FilterModal_1 = __importDefault(require("./components/ReportBuilder/FilterModal"));
|
|
44
|
+
const Filter_1 = require("./models/Filter");
|
|
45
|
+
const astFilterProcessing_1 = require("./utils/astFilterProcessing");
|
|
46
|
+
const useAstToFilterTree_1 = __importDefault(require("./hooks/useAstToFilterTree"));
|
|
47
|
+
const QuillMultiSelect_1 = require("./components/QuillMultiSelect");
|
|
48
|
+
const paginationProcessing_1 = require("./utils/paginationProcessing");
|
|
49
|
+
const report_1 = require("./utils/report");
|
|
44
50
|
exports.QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
45
51
|
'https://quill-344421.uc.r.appspot.com';
|
|
46
52
|
/**
|
|
@@ -74,7 +80,7 @@ exports.QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SE
|
|
|
74
80
|
* ### Report Builder API
|
|
75
81
|
* @see https://docs.quillsql.com/components/report-builder
|
|
76
82
|
*/
|
|
77
|
-
function ReportBuilder({ initialTableName = '', onSubmitEditReport = (
|
|
83
|
+
function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, MultiSelectComponent = QuillMultiSelect_1.QuillMultiSelectComponent, TableComponent = UiComponents_1.QuillTableSQLEditorComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.MemoizedCheckbox, SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, TextComponent = UiComponents_1.MemoizedText, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, ColumnSearchEmptyState = UiComponents_1.QuillColumnSearchEmptyState, ChartBuilderFormContainer = UiComponents_1.QuillChartBuilderFormContainer, ChartBuilderModalComponent = UiComponents_1.MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
|
|
78
84
|
const { data: report } = (0, useQuill_1.useQuill)(reportId || '');
|
|
79
85
|
const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
|
|
80
86
|
const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
|
|
@@ -97,8 +103,8 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
97
103
|
const [rows, setRows] = (0, react_1.useState)([]);
|
|
98
104
|
const [formattedRows, setFormattedRows] = (0, react_1.useState)([]);
|
|
99
105
|
const [columns, setColumns] = (0, react_1.useState)([]);
|
|
106
|
+
const [tempReport, setTempReport] = (0, react_1.useState)({});
|
|
100
107
|
const [topLevelBinaryOperator, setTopLevelBinaryOperator] = (0, react_1.useState)('AND');
|
|
101
|
-
const [editPopoverKey, setEditPopoverKey] = (0, react_1.useState)(null);
|
|
102
108
|
const [uniqueValues, setUniqueValues] = (0, react_1.useState)({});
|
|
103
109
|
const [pivot, setPivot] = (0, react_1.useState)(null);
|
|
104
110
|
const [pivotData, setPivotData] = (0, react_1.useState)(null);
|
|
@@ -106,8 +112,8 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
106
112
|
const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)([]);
|
|
107
113
|
const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
|
|
108
114
|
const [showPivotPopover, setShowPivotPopover] = (0, react_1.useState)(false);
|
|
109
|
-
const [
|
|
110
|
-
const [
|
|
115
|
+
const [isEditingPivot, setIsEditingPivot] = (0, react_1.useState)(false);
|
|
116
|
+
const [initialChartLoad, setInitialChartLoad] = (0, react_1.useState)(false);
|
|
111
117
|
const [askedAQuestion, setAskedAQuestion] = (0, react_1.useState)(false);
|
|
112
118
|
const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
|
|
113
119
|
const [initialLoad, setInitialLoad] = (0, react_1.useState)(!!initialTableName || !!reportId);
|
|
@@ -122,23 +128,44 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
122
128
|
const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
|
|
123
129
|
const [pivotValueField, setPivotValueField] = (0, react_1.useState)(undefined);
|
|
124
130
|
const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(undefined);
|
|
125
|
-
|
|
126
|
-
const [client
|
|
131
|
+
const [dateRanges, setDateRanges] = (0, react_1.useState)(null);
|
|
132
|
+
const [client] = (0, react_1.useContext)(Context_1.ClientContext);
|
|
127
133
|
// JANK: This is temp and stupid
|
|
128
134
|
const [overrideRecommendations, setOverrideRecommendations] = (0, react_1.useState)(true);
|
|
129
135
|
const [customFields, setCustomFields] = (0, react_1.useContext)(Context_1.CustomFieldContext);
|
|
136
|
+
const [openFilterIndex, setOpenFilterIndex] = (0, react_1.useState)(null); // Sets open filter modals
|
|
137
|
+
const [fieldValuesMap, setFieldValuesMap] = (0, react_1.useState)({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
|
|
138
|
+
const filterTree = (0, useAstToFilterTree_1.default)(formData, client); // Stores the state of filters
|
|
130
139
|
(0, react_1.useEffect)(() => {
|
|
140
|
+
if (!client) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
131
143
|
if (client.publicKey === '663416663aa9bc716e59a89d') {
|
|
132
144
|
setOverrideRecommendations(false);
|
|
133
145
|
}
|
|
134
146
|
if (!loadingSchema) {
|
|
135
147
|
fetchSchema();
|
|
136
148
|
}
|
|
137
|
-
}, [client
|
|
149
|
+
}, [client]);
|
|
138
150
|
(0, react_1.useEffect)(() => {
|
|
139
151
|
(0, width_1.updateFirstChildWidth)(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
140
152
|
(0, width_1.updateFirstChildWidth)(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
141
153
|
}, [dataDisplayed]);
|
|
154
|
+
// Whenever unique values changes, update the fieldValuesMap, used in FilterModals
|
|
155
|
+
(0, react_1.useEffect)(() => {
|
|
156
|
+
const tables = (0, ast_1.getTableNames)(baseAst);
|
|
157
|
+
const table = tables.length === 1 ? tables[0] : initialTableName;
|
|
158
|
+
const newFieldValues = {};
|
|
159
|
+
if (uniqueValues[table]) {
|
|
160
|
+
for (const field of Object.keys(uniqueValues[table])) {
|
|
161
|
+
newFieldValues[field] = [];
|
|
162
|
+
for (const value of Object.keys(uniqueValues[table][field])) {
|
|
163
|
+
newFieldValues[field]?.push(value);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
setFieldValuesMap(newFieldValues);
|
|
168
|
+
}, [uniqueValues]);
|
|
142
169
|
(0, react_1.useEffect)(() => {
|
|
143
170
|
// Since the TextInput component takes a required numeric width parameter,
|
|
144
171
|
// we dynamically calculate the width of this component here.
|
|
@@ -152,8 +179,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
152
179
|
window.removeEventListener('resize', handleResize);
|
|
153
180
|
};
|
|
154
181
|
}, []);
|
|
155
|
-
const updatePivot = (changeField, fieldKey) => {
|
|
182
|
+
const updatePivot = async (changeField, fieldKey) => {
|
|
156
183
|
const newPivot = pivot;
|
|
184
|
+
setTableLoading(true);
|
|
157
185
|
// @ts-ignore
|
|
158
186
|
newPivot[fieldKey] = changeField;
|
|
159
187
|
if (fieldKey === 'rowField') {
|
|
@@ -171,11 +199,27 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
171
199
|
newPivot.sort = undefined;
|
|
172
200
|
}
|
|
173
201
|
}
|
|
174
|
-
|
|
175
|
-
const
|
|
202
|
+
let dateBucket = undefined;
|
|
203
|
+
const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
|
|
204
|
+
if (tempDateRange) {
|
|
205
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
206
|
+
}
|
|
207
|
+
let distinctValuesForQuery = {};
|
|
208
|
+
if (pivot.columnField) {
|
|
209
|
+
distinctValuesForQuery = await (0, tableProcessing_1.getUniqueValuesByColumns)([
|
|
210
|
+
{
|
|
211
|
+
field: pivot.columnField,
|
|
212
|
+
label: pivot.columnField,
|
|
213
|
+
format: 'string',
|
|
214
|
+
},
|
|
215
|
+
], activeQuery, [], client, customFields);
|
|
216
|
+
}
|
|
217
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, distinctValuesForQuery);
|
|
176
218
|
setPivotData(pivotedData || []);
|
|
177
219
|
const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
|
|
220
|
+
setPivot(newPivot);
|
|
178
221
|
setFormattedRows(formattedRows);
|
|
222
|
+
setTableLoading(false);
|
|
179
223
|
};
|
|
180
224
|
const enforceOrderOnColumns = (columnNames) => {
|
|
181
225
|
if (pivot) {
|
|
@@ -210,7 +254,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
210
254
|
setRows([]);
|
|
211
255
|
setColumns([]);
|
|
212
256
|
setTopLevelBinaryOperator('AND');
|
|
213
|
-
setEditPopoverKey(null);
|
|
214
257
|
setErrorMessage('');
|
|
215
258
|
setFormattedRows([]);
|
|
216
259
|
// setUniqueValues({});
|
|
@@ -220,10 +263,13 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
220
263
|
}, 0);
|
|
221
264
|
};
|
|
222
265
|
(0, react_1.useEffect)(() => {
|
|
266
|
+
if (!client) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
223
269
|
if (!initialLoad && client.publicKey) {
|
|
224
270
|
clearAllState();
|
|
225
271
|
}
|
|
226
|
-
}, [client
|
|
272
|
+
}, [client]);
|
|
227
273
|
(0, react_1.useEffect)(() => {
|
|
228
274
|
if (activePath !== null) {
|
|
229
275
|
// update the modal with the new subtree
|
|
@@ -235,8 +281,8 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
235
281
|
if (pivot) {
|
|
236
282
|
const formattedRows = copiedRows.map((row) => {
|
|
237
283
|
const formattedRow = row;
|
|
238
|
-
Object.keys(row).forEach((key
|
|
239
|
-
|
|
284
|
+
Object.keys(row).forEach((key) => {
|
|
285
|
+
const column = columns.find((c) => c.field === key);
|
|
240
286
|
let format = 'string';
|
|
241
287
|
if (!column) {
|
|
242
288
|
format =
|
|
@@ -296,42 +342,20 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
296
342
|
navigator.clipboard.writeText(query);
|
|
297
343
|
setTimeout(() => setIsCopying(false), 800);
|
|
298
344
|
};
|
|
299
|
-
const copyToClipboard = (str) => {
|
|
300
|
-
setIsCopying(true);
|
|
301
|
-
navigator.clipboard.writeText(str);
|
|
302
|
-
setTimeout(() => setIsCopying(false), 800);
|
|
303
|
-
};
|
|
304
345
|
const clearCheckboxes = () => {
|
|
305
346
|
const checkboxes = uniqueValues;
|
|
306
347
|
const newValues = {};
|
|
307
|
-
for (
|
|
348
|
+
for (const table of Object.keys(checkboxes)) {
|
|
308
349
|
newValues[table] = {};
|
|
309
|
-
for (
|
|
350
|
+
for (const column of Object.keys(checkboxes[table])) {
|
|
310
351
|
newValues[table][column] = {};
|
|
311
|
-
for (
|
|
352
|
+
for (const variant of Object.keys(checkboxes[table][column])) {
|
|
312
353
|
newValues[table][column][variant] = false;
|
|
313
354
|
}
|
|
314
355
|
}
|
|
315
356
|
}
|
|
316
357
|
setUniqueValues(newValues);
|
|
317
358
|
};
|
|
318
|
-
const setCheckboxes = (node) => {
|
|
319
|
-
if (!['IN', 'NOT IN'].includes(node.operator))
|
|
320
|
-
return;
|
|
321
|
-
const selectedItems = node.right.value.flatMap((v) => v.args.value.map((x) => x.value.toLowerCase()));
|
|
322
|
-
const checkboxes = uniqueValues;
|
|
323
|
-
const newValues = {};
|
|
324
|
-
for (let table of Object.keys(checkboxes)) {
|
|
325
|
-
newValues[table] = {};
|
|
326
|
-
for (let column of Object.keys(checkboxes[table])) {
|
|
327
|
-
newValues[table][column] = {};
|
|
328
|
-
for (let variant of Object.keys(checkboxes[table][column])) {
|
|
329
|
-
newValues[table][column][variant] = selectedItems.includes(variant.toLowerCase());
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
setUniqueValues(newValues);
|
|
334
|
-
};
|
|
335
359
|
const fetchSqlQuery = async (ast, formData, fetchData = true) => {
|
|
336
360
|
if (fetchData) {
|
|
337
361
|
setLoading(true);
|
|
@@ -347,6 +371,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
347
371
|
body: JSON.stringify({
|
|
348
372
|
ast: { ...ast, where },
|
|
349
373
|
publicKey: client.publicKey,
|
|
374
|
+
useNewNodeSql: true, // new flag
|
|
350
375
|
}),
|
|
351
376
|
});
|
|
352
377
|
const data = await response.json();
|
|
@@ -354,12 +379,41 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
354
379
|
if (fetchData) {
|
|
355
380
|
fetchUponChange(ast, formData);
|
|
356
381
|
}
|
|
382
|
+
return data.query;
|
|
357
383
|
}
|
|
358
384
|
catch (error) {
|
|
359
385
|
setLoading(false);
|
|
360
386
|
console.error(error);
|
|
361
387
|
}
|
|
362
388
|
};
|
|
389
|
+
const getUniqueStringValues = async (columns, tableName) => {
|
|
390
|
+
const convertedStringColumns = columns
|
|
391
|
+
.filter((column) => {
|
|
392
|
+
return (0, ast_1.isTextColumnType)(column.fieldType);
|
|
393
|
+
})
|
|
394
|
+
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
395
|
+
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
396
|
+
const smallStringColumns = await (0, tableProcessing_1.getCountsByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
|
|
397
|
+
const smallStringNames = smallStringColumns.map((column) => column.field);
|
|
398
|
+
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(smallStringColumns, `Select ${smallStringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
399
|
+
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
400
|
+
joinedUniqueValues[tableName] = newUniqueValues;
|
|
401
|
+
return joinedUniqueValues;
|
|
402
|
+
};
|
|
403
|
+
const getDateRanges = async (columns, tableName) => {
|
|
404
|
+
const dateColumns = columns.filter((column) => {
|
|
405
|
+
return column.fieldType === 'date';
|
|
406
|
+
});
|
|
407
|
+
if (dateColumns.length === 0) {
|
|
408
|
+
return {};
|
|
409
|
+
}
|
|
410
|
+
const dateColumnNames = dateColumns.map((column) => {
|
|
411
|
+
//@ts-ignore
|
|
412
|
+
return column.field || column.name;
|
|
413
|
+
});
|
|
414
|
+
const dateRanges = await (0, tableProcessing_1.getDateRangeByColumns)(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
|
|
415
|
+
return dateRanges;
|
|
416
|
+
};
|
|
363
417
|
// It's just like getColumnsInPivot but we expand the columnField
|
|
364
418
|
// if there is one to include all the variants just like it would
|
|
365
419
|
// show up in the table. (eg. category -> ...[Fuel, Food, Other])
|
|
@@ -386,18 +440,12 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
386
440
|
setLoading(true);
|
|
387
441
|
const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
|
|
388
442
|
if (tableInfo) {
|
|
389
|
-
const
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
})
|
|
393
|
-
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
394
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
395
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
|
|
396
|
-
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
397
|
-
joinedUniqueValues[initialTableName] = newUniqueValues;
|
|
398
|
-
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(joinedUniqueValues)) {
|
|
399
|
-
setUniqueValues(joinedUniqueValues);
|
|
443
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
|
|
444
|
+
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
445
|
+
setUniqueValues(newUniqueValues);
|
|
400
446
|
}
|
|
447
|
+
const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
|
|
448
|
+
setDateRanges(dateRangesTemp);
|
|
401
449
|
}
|
|
402
450
|
const columnsForTable = tables
|
|
403
451
|
.find((t) => t.name === initialTableName)
|
|
@@ -456,80 +504,102 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
456
504
|
};
|
|
457
505
|
(0, react_1.useEffect)(() => {
|
|
458
506
|
const loadChart = async () => {
|
|
459
|
-
|
|
507
|
+
setInitialChartLoad(true);
|
|
508
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
460
509
|
if (!report || report.referencedTables.length !== 1) {
|
|
461
|
-
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
const tableName = report.referencedTables[0];
|
|
465
|
-
if (!tableName) {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
const resp = await (0, dataFetcher_2.getDataFromCloud)(client, `astify`, {
|
|
469
|
-
query: report.queryString,
|
|
470
|
-
});
|
|
471
|
-
if (resp.success === false) {
|
|
472
|
-
setErrorMessage('Error: ' + resp.message);
|
|
510
|
+
setInitialChartLoad(false);
|
|
473
511
|
return;
|
|
474
512
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
.
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
const stringNames = stringColumns.map((column) => column.field);
|
|
499
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
|
|
500
|
-
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
501
|
-
joinedUniqueValues[tableName] = newUniqueValues;
|
|
502
|
-
setUniqueValues(joinedUniqueValues);
|
|
503
|
-
}
|
|
504
|
-
if (groupByPivot) {
|
|
505
|
-
// @ts-ignore
|
|
506
|
-
setPivotRowField(groupByPivot.rowField);
|
|
507
|
-
// @ts-ignore
|
|
508
|
-
setPivotAggregation(groupByPivot.aggregationType);
|
|
509
|
-
// @ts-ignore
|
|
510
|
-
setPivotColumnField(groupByPivot.columnField);
|
|
511
|
-
// @ts-ignore
|
|
512
|
-
setPivotValueField(groupByPivot.valueField);
|
|
513
|
-
setPivot(groupByPivot);
|
|
514
|
-
const pivotedData = (0, PivotModal_1.generatePivotTableInMemory)(
|
|
515
|
-
// @ts-ignore
|
|
516
|
-
groupByPivot, initialRows, undefined, false);
|
|
517
|
-
setPivotData(pivotedData || []);
|
|
518
|
-
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
513
|
+
try {
|
|
514
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
515
|
+
const tableName = report.referencedTables[0];
|
|
516
|
+
if (!tableName) {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
const resp = await (0, dataFetcher_2.getDataFromCloud)(client, `astify`, {
|
|
520
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
521
|
+
query: report.queryString,
|
|
522
|
+
useNewNodeSql: true,
|
|
523
|
+
});
|
|
524
|
+
if (resp.success === false) {
|
|
525
|
+
setErrorMessage(resp.message);
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
const ast = (0, astProcessing_1.getSelectFromAST)(resp.ast);
|
|
529
|
+
let convertedAst = (0, astProcessing_1.processStarColumn)(ast, report.columns);
|
|
530
|
+
(0, astProcessing_1.processApostrophe)(convertedAst, ['type', 'value']);
|
|
531
|
+
convertedAst = (0, convert_1.convertBigQuery)(convertedAst);
|
|
532
|
+
const schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
|
|
533
|
+
let newAst;
|
|
534
|
+
let groupByPivot = {};
|
|
535
|
+
({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(convertedAst,
|
|
519
536
|
// @ts-ignore
|
|
520
|
-
|
|
521
|
-
|
|
537
|
+
report.pivot, schemaInfo));
|
|
538
|
+
if (convertedAst.where) {
|
|
539
|
+
setFormData((0, util_1.deepCopy)(convertedAst.where));
|
|
540
|
+
}
|
|
541
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
542
|
+
setActiveQuery(report.queryString);
|
|
543
|
+
newAst = groupByPivot ? newAst : convertedAst;
|
|
544
|
+
const initialRows = await fetchUponChange(newAst, undefined);
|
|
545
|
+
if (initialRows.error) {
|
|
546
|
+
setBaseAst(null);
|
|
547
|
+
setErrorMessage(initialRows.message);
|
|
548
|
+
setInitialChartLoad(false);
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
setBaseAst(newAst);
|
|
552
|
+
const tableInfo = schemaInfo.find((table) => table.name === tableName);
|
|
553
|
+
let newUniqueValues = undefined;
|
|
554
|
+
let dateRangesTemp = undefined;
|
|
555
|
+
if (tableName) {
|
|
556
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
|
|
557
|
+
setUniqueValues(newUniqueValues);
|
|
558
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
|
|
559
|
+
setDateRanges(dateRangesTemp);
|
|
560
|
+
}
|
|
561
|
+
if (groupByPivot) {
|
|
562
|
+
// @ts-ignore
|
|
563
|
+
setPivotRowField(groupByPivot.rowField);
|
|
564
|
+
// @ts-ignore
|
|
565
|
+
setPivotAggregation(groupByPivot.aggregationType);
|
|
566
|
+
// @ts-ignore
|
|
567
|
+
setPivotColumnField(groupByPivot.columnField);
|
|
568
|
+
// @ts-ignore
|
|
569
|
+
setPivotValueField(groupByPivot.valueField);
|
|
570
|
+
setPivot(groupByPivot);
|
|
571
|
+
let dateBucket = undefined;
|
|
572
|
+
const tempDateRange = dateRangesTemp &&
|
|
573
|
+
groupByPivot.rowField &&
|
|
574
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
575
|
+
if (tempDateRange) {
|
|
576
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
577
|
+
}
|
|
578
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(
|
|
579
|
+
// @ts-ignore
|
|
580
|
+
groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
|
|
581
|
+
setPivotData(pivotedData || []);
|
|
582
|
+
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
583
|
+
// @ts-ignore
|
|
584
|
+
groupByPivot.aggregationType);
|
|
585
|
+
setFormattedRows(formattedRows);
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
const formattedRows = formatRows(report.rows, report.columns);
|
|
589
|
+
setFormattedRows(formattedRows);
|
|
590
|
+
}
|
|
591
|
+
setCurrentTable(tableName);
|
|
522
592
|
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
593
|
+
catch (error) {
|
|
594
|
+
console.error(error);
|
|
595
|
+
setErrorMessage('Error loading report');
|
|
526
596
|
}
|
|
527
|
-
setCurrentTable(tableName);
|
|
528
597
|
// This handles a flashing issue
|
|
529
598
|
setTimeout(() => {
|
|
530
|
-
|
|
599
|
+
setInitialChartLoad(false);
|
|
531
600
|
}, 500);
|
|
532
601
|
};
|
|
602
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
533
603
|
if (report && report.referencedTables.length === 1) {
|
|
534
604
|
loadChart();
|
|
535
605
|
}
|
|
@@ -855,10 +925,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
855
925
|
isReplaceSubtree: true,
|
|
856
926
|
});
|
|
857
927
|
};
|
|
858
|
-
// Function to handle the deletion of expressions
|
|
859
|
-
const handleDelete = (key) => {
|
|
860
|
-
updateFormData([{ path: key, value: null }], { isDeletion: true });
|
|
861
|
-
};
|
|
862
928
|
// Function to handle the insertion of expressions
|
|
863
929
|
const handleInsertion = (value, op = 'OR', isCondition = undefined) => {
|
|
864
930
|
updateFormData([{ path: '', value }], {
|
|
@@ -921,6 +987,66 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
921
987
|
return [{ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(pivot.valueField) }];
|
|
922
988
|
}
|
|
923
989
|
};
|
|
990
|
+
const [previousPage, setPreviousPage] = (0, react_1.useState)(0);
|
|
991
|
+
const [currentProcessing, setCurrentProcessing] = (0, react_1.useState)({
|
|
992
|
+
page: paginationProcessing_1.DEFAULT_PAGINATION,
|
|
993
|
+
});
|
|
994
|
+
const [numberOfRows, setNumberOfRows] = (0, react_1.useState)(0);
|
|
995
|
+
const [tableLoading, setTableLoading] = (0, react_1.useState)(false);
|
|
996
|
+
const onPageChange = (page) => {
|
|
997
|
+
if (currentProcessing.page &&
|
|
998
|
+
(0, paginationProcessing_1.shouldFetchMore)(paginationProcessing_1.DEFAULT_PAGINATION, page, previousPage)) {
|
|
999
|
+
const newPagination = { ...currentProcessing.page, page };
|
|
1000
|
+
const updatedProcessing = { ...currentProcessing, page: newPagination };
|
|
1001
|
+
setCurrentProcessing(updatedProcessing);
|
|
1002
|
+
handleRunQuery(updatedProcessing);
|
|
1003
|
+
}
|
|
1004
|
+
if (page > previousPage) {
|
|
1005
|
+
setPreviousPage(page);
|
|
1006
|
+
}
|
|
1007
|
+
};
|
|
1008
|
+
const onSortChange = (sort) => {
|
|
1009
|
+
if (report &&
|
|
1010
|
+
(0, paginationProcessing_1.shouldSortInMemory)(paginationProcessing_1.DEFAULT_PAGINATION, report.rowCount, !!report.pivot)) {
|
|
1011
|
+
return;
|
|
1012
|
+
}
|
|
1013
|
+
const updatedProcessing = { page: paginationProcessing_1.DEFAULT_PAGINATION, sort };
|
|
1014
|
+
handleRunQuery(updatedProcessing, true);
|
|
1015
|
+
setCurrentProcessing(updatedProcessing);
|
|
1016
|
+
setPreviousPage(0);
|
|
1017
|
+
};
|
|
1018
|
+
const handleRunQuery = async (processing, resetRows = false) => {
|
|
1019
|
+
try {
|
|
1020
|
+
setErrorMessage('');
|
|
1021
|
+
setTableLoading(true);
|
|
1022
|
+
const tableInfo = await (0, tableProcessing_1.fetchTableByQuery)(activeQuery, client, processing, customFields);
|
|
1023
|
+
if (tableInfo.error) {
|
|
1024
|
+
throw new Error(tableInfo.error);
|
|
1025
|
+
}
|
|
1026
|
+
else if (tableInfo.rows.length === 0) {
|
|
1027
|
+
throw new Error('No data found');
|
|
1028
|
+
}
|
|
1029
|
+
if (tableInfo.rowCount) {
|
|
1030
|
+
setNumberOfRows(tableInfo.rowCount);
|
|
1031
|
+
}
|
|
1032
|
+
setCurrentProcessing(processing);
|
|
1033
|
+
let tempRows = [...rows, ...tableInfo.rows];
|
|
1034
|
+
if (resetRows) {
|
|
1035
|
+
tempRows = tableInfo.rows;
|
|
1036
|
+
}
|
|
1037
|
+
setRows(tempRows);
|
|
1038
|
+
setFormattedRows((0, report_1.formatRowsFromReport)({ rows: tempRows, columns: tableInfo.columns }));
|
|
1039
|
+
setColumns(tableInfo.columns);
|
|
1040
|
+
setTableLoading(false);
|
|
1041
|
+
}
|
|
1042
|
+
catch (e) {
|
|
1043
|
+
setTableLoading(false);
|
|
1044
|
+
setErrorMessage('Failed to run SQL query: ' + e);
|
|
1045
|
+
setRows([]);
|
|
1046
|
+
setColumns([]);
|
|
1047
|
+
return;
|
|
1048
|
+
}
|
|
1049
|
+
};
|
|
924
1050
|
/**
|
|
925
1051
|
* Render form fields based on the type of the node
|
|
926
1052
|
* @param node the AST or subtree to render recursively
|
|
@@ -936,10 +1062,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
936
1062
|
case 'binary_expr':
|
|
937
1063
|
if (dateComparisonPartialMatch ||
|
|
938
1064
|
((0, util_1.isDateTruncEquals)(node) && client.databaseType !== 'BigQuery')) {
|
|
939
|
-
const { dateColumn,
|
|
940
|
-
// see onChange callback handleChange
|
|
941
|
-
// eslint-disable-next-line no-unused-vars
|
|
942
|
-
dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = (0, util_1.getDateFilterInfo)(node);
|
|
1065
|
+
const { dateColumn, dateFilterType, intervalCount, intervalType, intervalPaths, } = (0, util_1.getDateFilterInfo)(node);
|
|
943
1066
|
const isPlural = intervalCount !== 1 && dateFilterType !== 'in the current'
|
|
944
1067
|
? 's'
|
|
945
1068
|
: '';
|
|
@@ -1087,7 +1210,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1087
1210
|
} }))] }));
|
|
1088
1211
|
}
|
|
1089
1212
|
else if ((0, util_1.isInTheLastInterval)(node, client.databaseType)) {
|
|
1090
|
-
const { dateColumn
|
|
1213
|
+
const { dateColumn } = (0, util_1.getDateFilterInfo)(node);
|
|
1091
1214
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1092
1215
|
label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
|
|
1093
1216
|
value: column.name,
|
|
@@ -1148,7 +1271,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1148
1271
|
], width: 200 }) })] }));
|
|
1149
1272
|
}
|
|
1150
1273
|
else if ((0, util_1.isTheCurrentInterval)(node, client.databaseType)) {
|
|
1151
|
-
const { dateFilterType } = (0, util_1.getDateFilterInfo)(node);
|
|
1152
1274
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1153
1275
|
label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
|
|
1154
1276
|
value: column.name,
|
|
@@ -1207,7 +1329,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1207
1329
|
{ label: `week`, value: 'WEEK' },
|
|
1208
1330
|
], width: 200 })] }));
|
|
1209
1331
|
}
|
|
1210
|
-
else if ((0, util_1.isThePreviousInterval)(node
|
|
1332
|
+
else if ((0, util_1.isThePreviousInterval)(node)) {
|
|
1211
1333
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1212
1334
|
label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
|
|
1213
1335
|
value: column.name,
|
|
@@ -1354,7 +1476,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1354
1476
|
.find((tableInfo) => tableInfo.name === table)
|
|
1355
1477
|
?.columns.find((col) => col.name === leftChildValue);
|
|
1356
1478
|
const columnType = column?.fieldType;
|
|
1357
|
-
|
|
1479
|
+
const operatorOptions = [
|
|
1358
1480
|
...((0, ast_1.isNumericColumnType)(columnType)
|
|
1359
1481
|
? [
|
|
1360
1482
|
{ label: 'equal to', value: '=' },
|
|
@@ -1595,112 +1717,214 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1595
1717
|
}
|
|
1596
1718
|
return validPivot;
|
|
1597
1719
|
};
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
let
|
|
1607
|
-
let
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1720
|
+
/**
|
|
1721
|
+
*
|
|
1722
|
+
* @param filterTree
|
|
1723
|
+
* Returns a list of filters to be displayed
|
|
1724
|
+
* Replaces the functionality of renderNodes in the context of filters
|
|
1725
|
+
* Contains filterSentence, which replaces renderSentence
|
|
1726
|
+
*/
|
|
1727
|
+
const renderFilters = (filterTree) => {
|
|
1728
|
+
let tree = filterTree;
|
|
1729
|
+
let filterStack = [];
|
|
1730
|
+
/**
|
|
1731
|
+
* Function that takes in a FilterTree and flattens it into an array using in order traversal
|
|
1732
|
+
*/
|
|
1733
|
+
function traverseTree(node) {
|
|
1734
|
+
if (!node) {
|
|
1735
|
+
return;
|
|
1736
|
+
}
|
|
1737
|
+
if (node.leaf) {
|
|
1738
|
+
filterStack.push(node);
|
|
1739
|
+
}
|
|
1740
|
+
else {
|
|
1741
|
+
traverseTree(node.leftNode);
|
|
1742
|
+
filterStack.push(node);
|
|
1743
|
+
traverseTree(node.rightNode);
|
|
1744
|
+
}
|
|
1611
1745
|
}
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
'
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
'
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
'IS NOT': 'is not',
|
|
1631
|
-
IS: 'is',
|
|
1632
|
-
};
|
|
1633
|
-
switch (node.type) {
|
|
1634
|
-
case 'binary_expr':
|
|
1635
|
-
return ((0, jsx_runtime_1.jsx)(ui_1.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: ui_1.EditPopover, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, renderNode: renderNode, children: dateComparisonPartialMatch ??
|
|
1636
|
-
dateEqualityPartialMatch ??
|
|
1637
|
-
uniqueSentence ?? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [node.left &&
|
|
1638
|
-
renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? ((0, jsx_runtime_1.jsx)(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: SelectComponent })) : null, node.right &&
|
|
1639
|
-
renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
|
|
1640
|
-
case 'column_ref':
|
|
1641
|
-
return (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(node.column);
|
|
1642
|
-
case 'expr_list':
|
|
1643
|
-
if (node.value.length === 1) {
|
|
1644
|
-
const subQuery = renderSentence(formData, node.value[0]);
|
|
1645
|
-
if (subQuery) {
|
|
1646
|
-
return `${subQuery}`;
|
|
1647
|
-
}
|
|
1648
|
-
return '()';
|
|
1746
|
+
/**
|
|
1747
|
+
* Returns a sentence to describe a Filter
|
|
1748
|
+
*/
|
|
1749
|
+
function filterSentence(filter) {
|
|
1750
|
+
let value = '';
|
|
1751
|
+
if (filter.name == Filter_1.FilterNames.NullFilter) {
|
|
1752
|
+
return `${(0, textProcessing_1.snakeAndCamelCaseToTitleCase)(filter.field)} ${filter.operator}`;
|
|
1753
|
+
}
|
|
1754
|
+
else if (filter.value === null || filter.value === undefined) {
|
|
1755
|
+
return 'Error: filter missing value';
|
|
1756
|
+
}
|
|
1757
|
+
if (typeof filter.value === 'string' ||
|
|
1758
|
+
typeof filter.value === 'number') {
|
|
1759
|
+
value = filter.value.toString();
|
|
1760
|
+
}
|
|
1761
|
+
else if ('unit' in filter.value) {
|
|
1762
|
+
if (filter.operator === Filter_1.DateOperator.InTheCurrent) {
|
|
1763
|
+
value = `${filter.value.unit}`;
|
|
1649
1764
|
}
|
|
1650
|
-
|
|
1651
|
-
.
|
|
1652
|
-
.join(', ')}`;
|
|
1653
|
-
case 'single_quote_string':
|
|
1654
|
-
return node.value.replaceAll('%', '');
|
|
1655
|
-
case 'double_quote_string':
|
|
1656
|
-
case 'number':
|
|
1657
|
-
return node.value;
|
|
1658
|
-
case 'null':
|
|
1659
|
-
return 'null';
|
|
1660
|
-
case 'bool':
|
|
1661
|
-
return node.value.toString();
|
|
1662
|
-
case 'interval':
|
|
1663
|
-
if (node.unit) {
|
|
1664
|
-
// eg. `INTERVAL '90' DAY` -> "90 days"
|
|
1665
|
-
return `${node.expr.value} ${node.unit}s`;
|
|
1765
|
+
else {
|
|
1766
|
+
value = `${filter.value.value} ${filter.value.unit}${filter.value.value === 1 ? '' : 's'}`;
|
|
1666
1767
|
}
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1768
|
+
}
|
|
1769
|
+
else if ('startDate' in filter.value) {
|
|
1770
|
+
value = `from ${filter.value.startDate}`;
|
|
1771
|
+
}
|
|
1772
|
+
else if (filter.value.length > 0) {
|
|
1773
|
+
value = filter.value.join(', ');
|
|
1774
|
+
}
|
|
1775
|
+
return `${(0, textProcessing_1.snakeAndCamelCaseToTitleCase)(filter.field)} ${filter.operator} ${value}`;
|
|
1776
|
+
}
|
|
1777
|
+
/**
|
|
1778
|
+
* Given an array of Filters (presumed to be in in-order state), generate
|
|
1779
|
+
* the corresponding Filter tree. Essentially the reverse of what traverseTree does
|
|
1780
|
+
*/
|
|
1781
|
+
function filterStackToFilterTree(stack) {
|
|
1782
|
+
function buildTree(i) {
|
|
1783
|
+
const newNode = {
|
|
1784
|
+
leaf: false,
|
|
1785
|
+
operator: null,
|
|
1786
|
+
leftNode: null,
|
|
1787
|
+
rightNode: null,
|
|
1788
|
+
};
|
|
1789
|
+
if (i >= stack.length) {
|
|
1682
1790
|
return null;
|
|
1683
1791
|
}
|
|
1684
|
-
if (
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1792
|
+
else if (stack[i].leaf) {
|
|
1793
|
+
if (i < stack.length - 1) {
|
|
1794
|
+
// more nodes later
|
|
1795
|
+
newNode.operator = stack[i + 1].operator;
|
|
1796
|
+
newNode.leftNode = {
|
|
1797
|
+
leaf: true,
|
|
1798
|
+
leftNode: null,
|
|
1799
|
+
rightNode: null,
|
|
1800
|
+
operator: null,
|
|
1801
|
+
value: stack[i].value,
|
|
1802
|
+
};
|
|
1803
|
+
newNode.rightNode = buildTree(i + 2);
|
|
1804
|
+
}
|
|
1805
|
+
else {
|
|
1806
|
+
newNode.leaf = true;
|
|
1807
|
+
newNode.value = stack[i].value;
|
|
1808
|
+
}
|
|
1699
1809
|
}
|
|
1700
|
-
return
|
|
1701
|
-
|
|
1702
|
-
|
|
1810
|
+
return newNode;
|
|
1811
|
+
}
|
|
1812
|
+
return buildTree(0);
|
|
1703
1813
|
}
|
|
1814
|
+
traverseTree(tree);
|
|
1815
|
+
// Remove null (invalid) filters from filter stack
|
|
1816
|
+
filterStack = filterStack.filter((filter) => {
|
|
1817
|
+
return ((!filter.leaf &&
|
|
1818
|
+
filter.rightNode &&
|
|
1819
|
+
(!filter.rightNode.leaf || filter.rightNode.value)) ||
|
|
1820
|
+
(filter.leaf && filter.value));
|
|
1821
|
+
});
|
|
1822
|
+
// Render filterStack
|
|
1823
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
1824
|
+
display: 'flex',
|
|
1825
|
+
flexDirection: 'column',
|
|
1826
|
+
}, children: filterStack.map((item, index) => {
|
|
1827
|
+
if (!item.leaf &&
|
|
1828
|
+
(item.operator === 'and' || item.operator === 'or')) {
|
|
1829
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
1830
|
+
width: 'fit-content',
|
|
1831
|
+
marginBottom: '8px',
|
|
1832
|
+
marginTop: '8px',
|
|
1833
|
+
}, children: (0, jsx_runtime_1.jsx)(TabsComponent, { value: item.operator.toUpperCase(), options: UiComponents_1.DEFAULT_TAB_OPTIONS, onChange: () => {
|
|
1834
|
+
if (item.operator === 'and') {
|
|
1835
|
+
item.operator = 'or';
|
|
1836
|
+
}
|
|
1837
|
+
else {
|
|
1838
|
+
item.operator = 'and';
|
|
1839
|
+
}
|
|
1840
|
+
let newFormData = null;
|
|
1841
|
+
if (tree) {
|
|
1842
|
+
newFormData = (0, astFilterProcessing_1.filterTreeToAst)(tree, client.databaseType.toLowerCase());
|
|
1843
|
+
}
|
|
1844
|
+
const newAst = (0, util_1.deepCopy)({
|
|
1845
|
+
...constants_1.defaultAST,
|
|
1846
|
+
...baseAst,
|
|
1847
|
+
...(!baseAst?.columns && {
|
|
1848
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1849
|
+
const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
|
|
1850
|
+
newColumn.expr.column = c.name;
|
|
1851
|
+
return newColumn;
|
|
1852
|
+
}),
|
|
1853
|
+
}),
|
|
1854
|
+
...(!baseAst?.from && {
|
|
1855
|
+
from: [{ ...constants_1.defaultTable, table: initialTableName }],
|
|
1856
|
+
}),
|
|
1857
|
+
where: newFormData,
|
|
1858
|
+
});
|
|
1859
|
+
setBaseAst(newAst);
|
|
1860
|
+
setFormData(newFormData);
|
|
1861
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1862
|
+
} }) }, index));
|
|
1863
|
+
}
|
|
1864
|
+
else {
|
|
1865
|
+
return ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(ui_1.FilterPopoverWrapper, { schema: schema.find((s) => s.name === currentTable ||
|
|
1866
|
+
s.displayName === currentTable) ?? schema[0], filter: item.value, filterLabel: item.value ? filterSentence(item.value) : '', index: index, openFilterIndex: openFilterIndex, setOpenFilterIndex: setOpenFilterIndex, FilterPopover: FilterPopoverComponent, FilterModal: FilterModal_1.default, fieldValuesMap: fieldValuesMap, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (filter) => {
|
|
1867
|
+
item.value = filter;
|
|
1868
|
+
let newFormData = null;
|
|
1869
|
+
if (tree) {
|
|
1870
|
+
newFormData = (0, astFilterProcessing_1.filterTreeToAst)(tree, client.databaseType.toLowerCase());
|
|
1871
|
+
}
|
|
1872
|
+
const newAst = (0, util_1.deepCopy)({
|
|
1873
|
+
...constants_1.defaultAST,
|
|
1874
|
+
...baseAst,
|
|
1875
|
+
...(!baseAst?.columns && {
|
|
1876
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1877
|
+
const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
|
|
1878
|
+
newColumn.expr.column = c.name;
|
|
1879
|
+
return newColumn;
|
|
1880
|
+
}),
|
|
1881
|
+
}),
|
|
1882
|
+
...(!baseAst?.from && {
|
|
1883
|
+
from: [{ ...constants_1.defaultTable, table: initialTableName }],
|
|
1884
|
+
}),
|
|
1885
|
+
where: newFormData,
|
|
1886
|
+
});
|
|
1887
|
+
setBaseAst(newAst);
|
|
1888
|
+
setFormData(newFormData);
|
|
1889
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1890
|
+
}, handleFilterDelete: (i) => {
|
|
1891
|
+
if (i > 0) {
|
|
1892
|
+
filterStack.splice(i - 1, 2);
|
|
1893
|
+
}
|
|
1894
|
+
else {
|
|
1895
|
+
if (filterStack.length > 1) {
|
|
1896
|
+
filterStack.splice(i, 2);
|
|
1897
|
+
}
|
|
1898
|
+
else {
|
|
1899
|
+
filterStack.splice(i, 1);
|
|
1900
|
+
}
|
|
1901
|
+
}
|
|
1902
|
+
tree = filterStackToFilterTree(filterStack);
|
|
1903
|
+
let newFormData = null;
|
|
1904
|
+
if (tree) {
|
|
1905
|
+
newFormData = (0, astFilterProcessing_1.filterTreeToAst)(tree, client.databaseType.toLowerCase());
|
|
1906
|
+
}
|
|
1907
|
+
const newAst = (0, util_1.deepCopy)({
|
|
1908
|
+
...constants_1.defaultAST,
|
|
1909
|
+
...baseAst,
|
|
1910
|
+
...(!baseAst?.columns && {
|
|
1911
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1912
|
+
const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
|
|
1913
|
+
newColumn.expr.column = c.name;
|
|
1914
|
+
return newColumn;
|
|
1915
|
+
}),
|
|
1916
|
+
}),
|
|
1917
|
+
...(!baseAst?.from && {
|
|
1918
|
+
from: [{ ...constants_1.defaultTable, table: initialTableName }],
|
|
1919
|
+
}),
|
|
1920
|
+
where: newFormData,
|
|
1921
|
+
});
|
|
1922
|
+
setBaseAst(newAst);
|
|
1923
|
+
setFormData(newFormData);
|
|
1924
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1925
|
+
} }) }, index));
|
|
1926
|
+
}
|
|
1927
|
+
}) }));
|
|
1704
1928
|
};
|
|
1705
1929
|
const getAllPossibleColumns = () => {
|
|
1706
1930
|
if (!baseAst || !baseAst.from) {
|
|
@@ -1742,7 +1966,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1742
1966
|
if (selectedColumns.length < 1)
|
|
1743
1967
|
return false;
|
|
1744
1968
|
const allColumns = orderedColumnNames.filter((row) => {
|
|
1745
|
-
const [table
|
|
1969
|
+
const [table] = row.split('.');
|
|
1746
1970
|
const selectedTable = selectedColumns[0].split('.')[0];
|
|
1747
1971
|
return selectedTable === table;
|
|
1748
1972
|
});
|
|
@@ -1786,35 +2010,38 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1786
2010
|
task: 'patterns',
|
|
1787
2011
|
getCustomFields: false,
|
|
1788
2012
|
customFields,
|
|
1789
|
-
|
|
2013
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2014
|
+
useUpdatedDataGathering: true,
|
|
2015
|
+
useNewNodeSql: true, // new flag
|
|
1790
2016
|
},
|
|
1791
2017
|
};
|
|
1792
|
-
const cloudBody = {};
|
|
1793
|
-
const data2 = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
1794
|
-
if (data2.success === false) {
|
|
1795
|
-
throw new Error(data2.errorMessage);
|
|
1796
|
-
}
|
|
1797
|
-
rows = data2.rows;
|
|
1798
2018
|
const tables = (0, ast_1.getTableNames)(baseAst);
|
|
1799
2019
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1800
|
-
|
|
2020
|
+
let newUniqueValues = uniqueValues;
|
|
2021
|
+
let dateRangesTemp = dateRanges;
|
|
2022
|
+
let curReport = tempReport;
|
|
2023
|
+
if ((newUniqueValues && Object.keys(newUniqueValues).length === 0) ||
|
|
2024
|
+
table !== currentTable) {
|
|
1801
2025
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1802
2026
|
if (tableInfo) {
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
})
|
|
1807
|
-
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
1808
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
1809
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
1810
|
-
const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
|
|
1811
|
-
joinedUniqueValues[table] = newUniqueValues;
|
|
1812
|
-
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(joinedUniqueValues)) {
|
|
1813
|
-
setUniqueValues(joinedUniqueValues);
|
|
2027
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2028
|
+
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
2029
|
+
setUniqueValues(newUniqueValues);
|
|
1814
2030
|
}
|
|
2031
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2032
|
+
setDateRanges(dateRangesTemp || {});
|
|
1815
2033
|
}
|
|
1816
2034
|
setCurrentTable(table);
|
|
1817
2035
|
}
|
|
2036
|
+
const cloudBody = {};
|
|
2037
|
+
const data2 = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
2038
|
+
if (data2.success === false) {
|
|
2039
|
+
throw new Error(data2.errorMessage);
|
|
2040
|
+
}
|
|
2041
|
+
rows = data2.rows;
|
|
2042
|
+
if (data2.rowCount) {
|
|
2043
|
+
setNumberOfRows(data2.rowCount);
|
|
2044
|
+
}
|
|
1818
2045
|
if (data2.rows && data2.rows.length) {
|
|
1819
2046
|
if (pivot) {
|
|
1820
2047
|
// check if any of the pivot fields aren't in the data2.fields array
|
|
@@ -1824,23 +2051,75 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1824
2051
|
setPivotData(null);
|
|
1825
2052
|
setRows(data2.rows);
|
|
1826
2053
|
setColumns(processedFields);
|
|
2054
|
+
if (data2.rowCount) {
|
|
2055
|
+
const processedFormData = report
|
|
2056
|
+
? report
|
|
2057
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
2058
|
+
setNumberOfRows(data2.rowCount);
|
|
2059
|
+
curReport = {
|
|
2060
|
+
...formData,
|
|
2061
|
+
...processedFormData,
|
|
2062
|
+
itemQuery: data2.itemQuery,
|
|
2063
|
+
rowCount: data2.rowCount,
|
|
2064
|
+
filtersApplied: [],
|
|
2065
|
+
rows: data2.rows,
|
|
2066
|
+
columns: processedFields,
|
|
2067
|
+
};
|
|
2068
|
+
setTempReport(curReport);
|
|
2069
|
+
}
|
|
1827
2070
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
1828
2071
|
setFormattedRows(formattedRows);
|
|
1829
2072
|
return;
|
|
1830
2073
|
}
|
|
2074
|
+
curReport = {
|
|
2075
|
+
...formData,
|
|
2076
|
+
itemQuery: data2.itemQuery,
|
|
2077
|
+
rowCount: data2.rowCount,
|
|
2078
|
+
filtersApplied: [],
|
|
2079
|
+
rows: data2.rows,
|
|
2080
|
+
};
|
|
1831
2081
|
// Do all of this to make sure we have the right unique columns when applying a pivot
|
|
1832
|
-
let
|
|
1833
|
-
const
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
2082
|
+
let dateBucket = undefined;
|
|
2083
|
+
const tempDateRange = dateRangesTemp &&
|
|
2084
|
+
pivot.rowField &&
|
|
2085
|
+
dateRangesTemp[pivot.rowField];
|
|
2086
|
+
if (tempDateRange) {
|
|
2087
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
2088
|
+
}
|
|
2089
|
+
let distinctValuesForQuery = {};
|
|
2090
|
+
if (pivot.columnField) {
|
|
2091
|
+
const sqlQuery = await fetchSqlQuery({ ...baseAst, where: curFormData }, null, false);
|
|
2092
|
+
distinctValuesForQuery = await (0, tableProcessing_1.getUniqueValuesByColumns)([
|
|
2093
|
+
{
|
|
2094
|
+
field: pivot.columnField,
|
|
2095
|
+
label: pivot.columnField,
|
|
2096
|
+
format: 'string',
|
|
2097
|
+
},
|
|
2098
|
+
], sqlQuery, [], client, customFields);
|
|
2099
|
+
}
|
|
2100
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(
|
|
2101
|
+
// @ts-ignore
|
|
2102
|
+
pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, distinctValuesForQuery ? distinctValuesForQuery : undefined);
|
|
1839
2103
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1840
2104
|
const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
1841
2105
|
setPivotData(pivotedData);
|
|
1842
2106
|
setRows(data2.rows);
|
|
1843
2107
|
setColumns(processedFields);
|
|
2108
|
+
if (data2.rowCount) {
|
|
2109
|
+
const processedFormData = report
|
|
2110
|
+
? report
|
|
2111
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
2112
|
+
setNumberOfRows(data2.rowCount);
|
|
2113
|
+
setTempReport({
|
|
2114
|
+
...formData,
|
|
2115
|
+
...processedFormData,
|
|
2116
|
+
itemQuery: data2.itemQuery,
|
|
2117
|
+
rowCount: data2.rowCount,
|
|
2118
|
+
filtersApplied: [],
|
|
2119
|
+
rows: data2.rows,
|
|
2120
|
+
columns: processedFields,
|
|
2121
|
+
});
|
|
2122
|
+
}
|
|
1844
2123
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
|
|
1845
2124
|
setSelectedColumns(processedFields.map((column) => {
|
|
1846
2125
|
return `${table}.${column.field}`;
|
|
@@ -1851,6 +2130,21 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1851
2130
|
const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
1852
2131
|
setRows(data2.rows);
|
|
1853
2132
|
setColumns(processedFields);
|
|
2133
|
+
if (data2.rowCount) {
|
|
2134
|
+
const processedFormData = report
|
|
2135
|
+
? report
|
|
2136
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
2137
|
+
setNumberOfRows(data2.rowCount);
|
|
2138
|
+
setTempReport({
|
|
2139
|
+
...formData,
|
|
2140
|
+
...processedFormData,
|
|
2141
|
+
itemQuery: data2.itemQuery,
|
|
2142
|
+
rowCount: data2.rowCount,
|
|
2143
|
+
filtersApplied: [],
|
|
2144
|
+
rows: data2.rows,
|
|
2145
|
+
columns: processedFields,
|
|
2146
|
+
});
|
|
2147
|
+
}
|
|
1854
2148
|
setSelectedColumns(processedFields.map((column) => {
|
|
1855
2149
|
return `${table}.${column.field}`;
|
|
1856
2150
|
}));
|
|
@@ -1867,105 +2161,22 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1867
2161
|
setFormattedRows([]);
|
|
1868
2162
|
setPivotData(null);
|
|
1869
2163
|
}
|
|
2164
|
+
setLoading(false);
|
|
2165
|
+
setDataDisplayed(true);
|
|
2166
|
+
return rows;
|
|
1870
2167
|
}
|
|
1871
2168
|
catch (e) {
|
|
1872
|
-
console.error(e);
|
|
1873
2169
|
setErrorMessage(e.message);
|
|
1874
|
-
}
|
|
1875
|
-
finally {
|
|
1876
2170
|
setLoading(false);
|
|
1877
2171
|
setDataDisplayed(true);
|
|
1878
|
-
|
|
2172
|
+
setRows([]);
|
|
2173
|
+
setColumns([]);
|
|
2174
|
+
setFormattedRows([]);
|
|
2175
|
+
setPivotData(null);
|
|
2176
|
+
return { error: true, message: e.message };
|
|
1879
2177
|
}
|
|
1880
2178
|
}
|
|
1881
2179
|
};
|
|
1882
|
-
// Convert an array of columns to a map where the name is the
|
|
1883
|
-
// key and the value is the column node.
|
|
1884
|
-
const columnArrayToMap = (columns) => {
|
|
1885
|
-
const columnMap = {};
|
|
1886
|
-
for (const col of columns) {
|
|
1887
|
-
const key = col.expr?.value ?? col.expr?.column ?? col.as;
|
|
1888
|
-
columnMap[key] = col;
|
|
1889
|
-
}
|
|
1890
|
-
return columnMap;
|
|
1891
|
-
};
|
|
1892
|
-
const applyFormatting = (response, columns) => {
|
|
1893
|
-
const columnFormatters = {};
|
|
1894
|
-
const columnMap = columnArrayToMap(columns);
|
|
1895
|
-
response.fields.forEach((field) => {
|
|
1896
|
-
// TODO: columnMap[field.name] silently breaks for columnField columns
|
|
1897
|
-
const formatType = (0, util_1.getPostgresBasicType)(field);
|
|
1898
|
-
if (formatType === 'date') {
|
|
1899
|
-
columnFormatters[field.name] = (x) => {
|
|
1900
|
-
const d = new Date(x);
|
|
1901
|
-
// check if d is a valid date
|
|
1902
|
-
if (isNaN(d.getTime())) {
|
|
1903
|
-
return 'Invalid Date';
|
|
1904
|
-
}
|
|
1905
|
-
d.setMinutes(d.getMinutes() + d.getTimezoneOffset()); // TZ adjust
|
|
1906
|
-
if (columnMap[field.name]?.expr.type === 'function' &&
|
|
1907
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
1908
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
1909
|
-
'month') {
|
|
1910
|
-
return d.toLocaleString('default', {
|
|
1911
|
-
month: 'short',
|
|
1912
|
-
year: 'numeric',
|
|
1913
|
-
});
|
|
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
|
-
'quarter') {
|
|
1919
|
-
return `Q${(0, date_fns_1.getQuarter)(d)} ${d.getFullYear()}`;
|
|
1920
|
-
}
|
|
1921
|
-
else if (columnMap[field.name]?.expr.type === 'function' &&
|
|
1922
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
1923
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
1924
|
-
'year') {
|
|
1925
|
-
return d.toLocaleString('default', {
|
|
1926
|
-
year: 'numeric',
|
|
1927
|
-
});
|
|
1928
|
-
}
|
|
1929
|
-
return constants_1.DATE_FMT.format(d);
|
|
1930
|
-
};
|
|
1931
|
-
}
|
|
1932
|
-
else if (formatType === 'number') {
|
|
1933
|
-
columnFormatters[field.name] = (x) => {
|
|
1934
|
-
if (columnMap[field.name]?.expr.type === 'extract' &&
|
|
1935
|
-
columnMap[field.name]?.expr.args.field.toLowerCase() === 'dow') {
|
|
1936
|
-
return constants_1.DAY_OF_WEEK[x];
|
|
1937
|
-
}
|
|
1938
|
-
else if (columnMap[field.name]?.expr.type === 'extract' &&
|
|
1939
|
-
columnMap[field.name]?.expr.args.field.toLowerCase() === 'month') {
|
|
1940
|
-
return constants_1.MONTH_OF_YEAR[x - 1];
|
|
1941
|
-
}
|
|
1942
|
-
else if (`${x}`.includes('.')) {
|
|
1943
|
-
// return MONEY_FMT.format(Number(x ?? 0.0));
|
|
1944
|
-
return Number(x ?? 0.0).toFixed(2);
|
|
1945
|
-
}
|
|
1946
|
-
return x ?? 0.0;
|
|
1947
|
-
};
|
|
1948
|
-
}
|
|
1949
|
-
else if (formatType === 'boolean') {
|
|
1950
|
-
columnFormatters[field.name] = (x) => {
|
|
1951
|
-
if (x) {
|
|
1952
|
-
return 'True';
|
|
1953
|
-
}
|
|
1954
|
-
return 'False';
|
|
1955
|
-
};
|
|
1956
|
-
}
|
|
1957
|
-
else {
|
|
1958
|
-
columnFormatters[field.name] = (x) => x;
|
|
1959
|
-
}
|
|
1960
|
-
});
|
|
1961
|
-
return response.rows.map((row) => {
|
|
1962
|
-
const newRow = {};
|
|
1963
|
-
Object.keys(row).forEach((key) => (newRow[key] = columnFormatters[key]
|
|
1964
|
-
? columnFormatters[key](row[key])
|
|
1965
|
-
: row[key]));
|
|
1966
|
-
return newRow;
|
|
1967
|
-
});
|
|
1968
|
-
};
|
|
1969
2180
|
// Returns whether a where-clause contains a nested subquery.
|
|
1970
2181
|
const isSubquery = (node) => {
|
|
1971
2182
|
if (!node)
|
|
@@ -1989,7 +2200,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
1989
2200
|
return;
|
|
1990
2201
|
}
|
|
1991
2202
|
try {
|
|
1992
|
-
let errored = false;
|
|
1993
2203
|
setLoading(true);
|
|
1994
2204
|
setAskedAQuestion(true);
|
|
1995
2205
|
setErrorMessage('');
|
|
@@ -2009,6 +2219,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2009
2219
|
body: JSON.stringify({
|
|
2010
2220
|
initialQuestion: aiPrompt || overridePrompt,
|
|
2011
2221
|
publicKey: client.publicKey,
|
|
2222
|
+
useNewNodeSql: true, // new flag
|
|
2012
2223
|
}),
|
|
2013
2224
|
});
|
|
2014
2225
|
}
|
|
@@ -2020,6 +2231,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2020
2231
|
sqlQuery: activeQuery,
|
|
2021
2232
|
initialQuestion: aiPrompt,
|
|
2022
2233
|
publicKey: client.publicKey,
|
|
2234
|
+
useNewNodeSql: true, // new flag
|
|
2023
2235
|
}),
|
|
2024
2236
|
});
|
|
2025
2237
|
}
|
|
@@ -2037,31 +2249,33 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2037
2249
|
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2038
2250
|
return;
|
|
2039
2251
|
}
|
|
2252
|
+
let currentSchema = schema;
|
|
2253
|
+
if (currentSchema && currentSchema.length === 0) {
|
|
2254
|
+
currentSchema = await fetchSchema();
|
|
2255
|
+
}
|
|
2040
2256
|
let newAst, groupByPivot;
|
|
2041
2257
|
if (ast) {
|
|
2042
2258
|
// Unwrap the ast object, supporting many possible types
|
|
2043
2259
|
ast = ast.length ? ast[0] : ast;
|
|
2044
2260
|
newAst = (0, convert_1.convertBigQuery)(ast);
|
|
2045
|
-
newAst = (0, convert_1.convertWildcardColumns)(newAst,
|
|
2046
|
-
({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(newAst, pivot,
|
|
2047
|
-
if (groupByPivot && !groupByPivot?.valueField) {
|
|
2048
|
-
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2049
|
-
return;
|
|
2050
|
-
}
|
|
2261
|
+
newAst = (0, convert_1.convertWildcardColumns)(newAst, currentSchema); // must go before groupby
|
|
2262
|
+
({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(newAst, pivot, currentSchema));
|
|
2051
2263
|
newAst = (0, convert_1.convertStringComparison)(newAst, client.databaseType);
|
|
2052
2264
|
newAst = (0, convert_1.convertRemoveSimpleParentheses)(newAst);
|
|
2053
2265
|
const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
|
|
2054
2266
|
const tableAlias = (0, ast_1.getTableAliases)(newAst)[0] ?? initialTableName;
|
|
2055
2267
|
newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
|
|
2056
|
-
|
|
2268
|
+
const procesedColumns = (0, util_1.deepCopy)(newAst).columns?.map((column) => {
|
|
2057
2269
|
if (column.expr.type === 'column_ref') {
|
|
2058
|
-
|
|
2270
|
+
const columnName = (0, ast_1.extractColumnish)(column.expr);
|
|
2271
|
+
return `${table}.${columnName}`;
|
|
2059
2272
|
}
|
|
2060
2273
|
else if (column.as) {
|
|
2061
2274
|
return `${table}.${column.as}`;
|
|
2062
2275
|
}
|
|
2063
2276
|
return `${table}.${column.expr.value}`;
|
|
2064
|
-
})
|
|
2277
|
+
});
|
|
2278
|
+
setSelectedColumns(procesedColumns);
|
|
2065
2279
|
if (groupByPivot) {
|
|
2066
2280
|
setBaseAst((0, util_1.deepCopy)({ ...newAst, orderby: null, limit: null }));
|
|
2067
2281
|
newAst = (0, util_1.deepCopy)({ ...newAst, orderby: null, limit: null });
|
|
@@ -2077,7 +2291,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2077
2291
|
ast = newAst; // so we fetch data for newAst later.
|
|
2078
2292
|
fetchSqlQuery(ast, undefined, false);
|
|
2079
2293
|
const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
|
|
2080
|
-
const tableAlias = (0, ast_1.getTableAliases)(newAst)[0] ?? initialTableName;
|
|
2081
2294
|
const hostedBody = {
|
|
2082
2295
|
metadata: {
|
|
2083
2296
|
clientId: client.publicKey,
|
|
@@ -2085,34 +2298,46 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2085
2298
|
publicKey: client.publicKey,
|
|
2086
2299
|
orgId: client.customerId,
|
|
2087
2300
|
task: 'patterns',
|
|
2088
|
-
|
|
2301
|
+
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2302
|
+
useUpdatedDataGathering: true,
|
|
2303
|
+
pivot: groupByPivot,
|
|
2304
|
+
useNewNodeSql: true, // new flag
|
|
2089
2305
|
},
|
|
2090
2306
|
};
|
|
2091
|
-
const cloudBody = {};
|
|
2092
|
-
const data2 = await (0, dataFetcher_1.getData)(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2093
|
-
if (data2.status === 'error') {
|
|
2094
|
-
throw new Error('Error querying data from patterns');
|
|
2095
|
-
}
|
|
2096
2307
|
let currentUniqueValues = uniqueValues;
|
|
2097
|
-
|
|
2098
|
-
|
|
2308
|
+
let dateRangesTemp = dateRanges;
|
|
2309
|
+
if ((currentUniqueValues &&
|
|
2310
|
+
currentUniqueValues[table] &&
|
|
2311
|
+
Object.keys(currentUniqueValues[table]).length === 0) ||
|
|
2312
|
+
table !== currentTable) {
|
|
2313
|
+
const tableInfo = currentSchema.find((tableInfo) => tableInfo.name === table);
|
|
2099
2314
|
if (tableInfo) {
|
|
2100
|
-
const
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
.map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
|
|
2105
|
-
const stringNames = convertedStringColumns.map((column) => column.field);
|
|
2106
|
-
const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
|
|
2107
|
-
currentUniqueValues[table] = newUniqueValues;
|
|
2108
|
-
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(currentUniqueValues)) {
|
|
2109
|
-
setUniqueValues(currentUniqueValues);
|
|
2315
|
+
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2316
|
+
currentUniqueValues = newUniqueValues;
|
|
2317
|
+
if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
|
|
2318
|
+
setUniqueValues(newUniqueValues);
|
|
2110
2319
|
}
|
|
2320
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, table);
|
|
2321
|
+
setDateRanges(dateRangesTemp);
|
|
2111
2322
|
}
|
|
2112
2323
|
setCurrentTable(table);
|
|
2113
2324
|
}
|
|
2325
|
+
const cloudBody = {};
|
|
2326
|
+
const data2 = await (0, dataFetcher_1.getData)(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2327
|
+
if (!data2 || data2.status === 'error') {
|
|
2328
|
+
throw new Error('Error querying data from patterns');
|
|
2329
|
+
}
|
|
2114
2330
|
if (data2.rows && data2.rows.length) {
|
|
2115
|
-
const processedFields = data2.fields
|
|
2331
|
+
const processedFields = data2.fields
|
|
2332
|
+
.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem))
|
|
2333
|
+
.map((elem) => {
|
|
2334
|
+
const tableInfo = currentSchema.find((t) => t.name === table);
|
|
2335
|
+
const columnInfo = tableInfo?.columns.find((column) => column.name === elem.field);
|
|
2336
|
+
return columnInfo
|
|
2337
|
+
? (0, columnProcessing_1.convertColumnInfoToColumnInternal)(columnInfo)
|
|
2338
|
+
: null;
|
|
2339
|
+
})
|
|
2340
|
+
.filter((elem) => elem);
|
|
2116
2341
|
let possiblePivot = true;
|
|
2117
2342
|
const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(processedFields, currentUniqueValues[table]);
|
|
2118
2343
|
if (groupByPivot &&
|
|
@@ -2126,7 +2351,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2126
2351
|
let errorMessageEnding = '';
|
|
2127
2352
|
if (groupByPivot.columnField &&
|
|
2128
2353
|
!possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
|
|
2129
|
-
if (currentUniqueValues[table][groupByPivot?.columnField || '']) {
|
|
2354
|
+
if (currentUniqueValues[table]?.[groupByPivot?.columnField || '']) {
|
|
2130
2355
|
errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
|
|
2131
2356
|
}
|
|
2132
2357
|
else {
|
|
@@ -2135,7 +2360,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2135
2360
|
}
|
|
2136
2361
|
else if (groupByPivot.rowField &&
|
|
2137
2362
|
!possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
|
|
2138
|
-
if (currentUniqueValues[table][groupByPivot?.rowField || '']) {
|
|
2363
|
+
if (currentUniqueValues[table]?.[groupByPivot?.rowField || '']) {
|
|
2139
2364
|
errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
|
|
2140
2365
|
}
|
|
2141
2366
|
else {
|
|
@@ -2147,18 +2372,45 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2147
2372
|
errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
|
|
2148
2373
|
}
|
|
2149
2374
|
setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
|
|
2150
|
-
errored = true;
|
|
2151
2375
|
}
|
|
2152
2376
|
if (groupByPivot && possiblePivot) {
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2377
|
+
let curReport = report ? report : undefined;
|
|
2378
|
+
if (data2.rowCount) {
|
|
2379
|
+
const processedFormData = report
|
|
2380
|
+
? report
|
|
2381
|
+
: (0, ChartBuilder_1.createInitialFormData)(processedFields);
|
|
2382
|
+
setNumberOfRows(data2.rowCount);
|
|
2383
|
+
curReport = {
|
|
2384
|
+
...formData,
|
|
2385
|
+
...processedFormData,
|
|
2386
|
+
itemQuery: data2.itemQuery,
|
|
2387
|
+
rowCount: data2.rowCount,
|
|
2388
|
+
filtersApplied: [],
|
|
2389
|
+
rows: data2.rows,
|
|
2390
|
+
columns: processedFields,
|
|
2391
|
+
};
|
|
2392
|
+
setTempReport(curReport || null);
|
|
2393
|
+
}
|
|
2394
|
+
let dateBucket = undefined;
|
|
2395
|
+
const tempDateRange = dateRangesTemp &&
|
|
2396
|
+
groupByPivot.rowField &&
|
|
2397
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
2398
|
+
if (tempDateRange) {
|
|
2399
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
2400
|
+
}
|
|
2401
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(
|
|
2402
|
+
// @ts-ignore
|
|
2403
|
+
groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
|
|
2404
|
+
? currentUniqueValues[groupByPivot.columnField]
|
|
2405
|
+
: undefined);
|
|
2158
2406
|
console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
|
|
2159
2407
|
setPivotData(pivotedData);
|
|
2160
2408
|
setPivot(groupByPivot);
|
|
2161
2409
|
setRows(data2.rows);
|
|
2410
|
+
setPivotRowField(groupByPivot?.rowField);
|
|
2411
|
+
setPivotColumnField(groupByPivot?.columnField);
|
|
2412
|
+
setPivotValueField(groupByPivot?.valueField);
|
|
2413
|
+
setPivotAggregation(groupByPivot?.aggregationType);
|
|
2162
2414
|
setColumns(processedFields);
|
|
2163
2415
|
const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
|
|
2164
2416
|
setFormattedRows(formattedRows);
|
|
@@ -2167,6 +2419,17 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2167
2419
|
const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
|
|
2168
2420
|
setRows(data2.rows);
|
|
2169
2421
|
setColumns(processedFields);
|
|
2422
|
+
if (data2.rowCount) {
|
|
2423
|
+
setNumberOfRows(data2.rowCount);
|
|
2424
|
+
setTempReport({
|
|
2425
|
+
...formData,
|
|
2426
|
+
itemQuery: data2.itemQuery,
|
|
2427
|
+
rowCount: data2.rowCount,
|
|
2428
|
+
filtersApplied: [],
|
|
2429
|
+
rows: data2.rows,
|
|
2430
|
+
columns: processedFields,
|
|
2431
|
+
});
|
|
2432
|
+
}
|
|
2170
2433
|
const formattedRows = formatRows(data2.rows, processedFields, false);
|
|
2171
2434
|
setFormattedRows(formattedRows);
|
|
2172
2435
|
}
|
|
@@ -2185,7 +2448,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2185
2448
|
setActiveQuery('');
|
|
2186
2449
|
}
|
|
2187
2450
|
if (data2.errorMessage) {
|
|
2188
|
-
setErrorMessage(`Error:
|
|
2451
|
+
setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
|
|
2189
2452
|
}
|
|
2190
2453
|
}
|
|
2191
2454
|
catch (e) {
|
|
@@ -2205,7 +2468,8 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2205
2468
|
setSelectedColumns((selectedColumns) => selectedColumns.filter((column) => !column.endsWith(name)));
|
|
2206
2469
|
const columns = baseAst.columns.filter((col) => {
|
|
2207
2470
|
if (col.expr.type === 'column_ref') {
|
|
2208
|
-
return col.expr.column !== name
|
|
2471
|
+
return (col.expr.column !== name &&
|
|
2472
|
+
(!col.expr.column.expr || col.expr.column.expr.value !== name));
|
|
2209
2473
|
}
|
|
2210
2474
|
else if (col.as) {
|
|
2211
2475
|
return col.as !== name;
|
|
@@ -2220,14 +2484,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2220
2484
|
setBaseAst(newAst);
|
|
2221
2485
|
fetchSqlQuery(newAst);
|
|
2222
2486
|
};
|
|
2223
|
-
function TopLevelBooleanSwitch({ node, keyPrefix, handleOperatorChange, }) {
|
|
2224
|
-
return ((0, jsx_runtime_1.jsx)("div", { style: { width: 'fit-content' }, children: (0, jsx_runtime_1.jsx)(TabsComponent, { value: node.operator, options: UiComponents_1.DEFAULT_TAB_OPTIONS, onChange: (event) => {
|
|
2225
|
-
if (loading) {
|
|
2226
|
-
return;
|
|
2227
|
-
}
|
|
2228
|
-
handleOperatorChange(event.target.value, node, keyPrefix);
|
|
2229
|
-
} }) }));
|
|
2230
|
-
}
|
|
2231
2487
|
const DraggableItem = ({ id, label, onDelete }) => {
|
|
2232
2488
|
const { attributes, listeners, setNodeRef, transform, transition } = (0, sortable_1.useSortable)({ id: id });
|
|
2233
2489
|
const style = {
|
|
@@ -2254,7 +2510,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2254
2510
|
setOrderedColumnNames(newOrder);
|
|
2255
2511
|
const orderedSelectedColumns = [];
|
|
2256
2512
|
for (const value of newOrder) {
|
|
2257
|
-
const
|
|
2513
|
+
const column = value.split('.')[1];
|
|
2258
2514
|
if (selectedColumns.includes(value)) {
|
|
2259
2515
|
orderedSelectedColumns.push(column);
|
|
2260
2516
|
}
|
|
@@ -2278,12 +2534,23 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2278
2534
|
fetchSqlQuery(newAst, undefined, false);
|
|
2279
2535
|
}
|
|
2280
2536
|
}
|
|
2281
|
-
const columnNamesInAst = baseAst?.columns
|
|
2282
|
-
|
|
2283
|
-
|
|
2537
|
+
const columnNamesInAst = baseAst?.columns
|
|
2538
|
+
.map((col) => {
|
|
2539
|
+
if (col.expr.type === 'column_ref' && col.expr.column) {
|
|
2540
|
+
if (typeof col.expr.column === 'string') {
|
|
2541
|
+
return col.expr.column;
|
|
2542
|
+
}
|
|
2543
|
+
else {
|
|
2544
|
+
return col.expr.column.expr.value;
|
|
2545
|
+
}
|
|
2284
2546
|
}
|
|
2285
2547
|
else if (col.as) {
|
|
2286
|
-
|
|
2548
|
+
if (typeof col.as === 'string') {
|
|
2549
|
+
return col.as;
|
|
2550
|
+
}
|
|
2551
|
+
else {
|
|
2552
|
+
return col.as.expr?.value;
|
|
2553
|
+
}
|
|
2287
2554
|
}
|
|
2288
2555
|
else if (col.expr && col.expr.type === 'aggr_func') {
|
|
2289
2556
|
if (col.expr.args) {
|
|
@@ -2292,22 +2559,23 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2292
2559
|
return col.expr.name;
|
|
2293
2560
|
}
|
|
2294
2561
|
return col.expr.value;
|
|
2295
|
-
})
|
|
2562
|
+
})
|
|
2563
|
+
.filter(
|
|
2564
|
+
// remove duplicate entries
|
|
2565
|
+
(value, index, self) => value && self.indexOf(value) === index) ?? [];
|
|
2296
2566
|
return ((0, jsx_runtime_1.jsx)(core_1.DndContext, { sensors: sensors, collisionDetection: core_1.closestCenter, onDragEnd: handleDragEnd, children: (0, jsx_runtime_1.jsx)(sortable_1.SortableContext, { items: columnNamesInAst, strategy: sortable_1.verticalListSortingStrategy, children: (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
2297
2567
|
display: 'flex',
|
|
2298
2568
|
flexDirection: 'column',
|
|
2299
2569
|
gap: 8,
|
|
2300
2570
|
}, children: [columnNamesInAst.map((name) => ((0, jsx_runtime_1.jsx)(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && (0, jsx_runtime_1.jsx)("div", { style: { height: 6 } })] }) }) }));
|
|
2301
2571
|
}
|
|
2302
|
-
if (loading ||
|
|
2572
|
+
if (loading || initialChartLoad) {
|
|
2303
2573
|
return ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
2304
2574
|
display: 'flex',
|
|
2305
2575
|
flexDirection: 'row',
|
|
2306
2576
|
height: '100%',
|
|
2307
2577
|
...containerStyle,
|
|
2308
2578
|
}, className: className, ref: parentRef, children: [(0, jsx_runtime_1.jsxs)(SidebarComponent, { children: [(0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Columns" }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
|
|
2309
|
-
if (loadingSchema)
|
|
2310
|
-
return;
|
|
2311
2579
|
if (!openPopover) {
|
|
2312
2580
|
setOpenPopover('AddColumnModal');
|
|
2313
2581
|
}
|
|
@@ -2328,12 +2596,12 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2328
2596
|
}, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
|
|
2329
2597
|
setBaseAst(ast);
|
|
2330
2598
|
fetchSqlQuery(ast);
|
|
2331
|
-
}, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2599
|
+
}, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2332
2600
|
display: 'flex',
|
|
2333
2601
|
flexDirection: 'column',
|
|
2334
2602
|
gap: 8,
|
|
2335
2603
|
marginBottom: 12,
|
|
2336
|
-
}, children:
|
|
2604
|
+
}, children: filterTree && renderFilters(filterTree) })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
2337
2605
|
display: 'flex',
|
|
2338
2606
|
flexDirection: 'column',
|
|
2339
2607
|
alignItems: 'flex-start',
|
|
@@ -2345,7 +2613,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2345
2613
|
}
|
|
2346
2614
|
if (!openPopover) {
|
|
2347
2615
|
const value = orderedColumnNames[0];
|
|
2348
|
-
const
|
|
2616
|
+
const column = value.split('.')[1];
|
|
2349
2617
|
const columnType = getColumnTypeByName(column);
|
|
2350
2618
|
if ((0, ast_1.isNumericColumnType)(columnType)) {
|
|
2351
2619
|
const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
|
|
@@ -2374,27 +2642,15 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2374
2642
|
setActiveEditItem(null);
|
|
2375
2643
|
}, 300);
|
|
2376
2644
|
}
|
|
2377
|
-
}, popoverTitle: 'Add filter', popoverChildren: (0, jsx_runtime_1.jsx)(
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
}
|
|
2387
|
-
else {
|
|
2388
|
-
setIsPending(false);
|
|
2389
|
-
handleInsertion(activeEditItem, 'AND', false);
|
|
2390
|
-
setActivePath(null);
|
|
2391
|
-
setOpenPopover(null);
|
|
2392
|
-
setTimeout(() => {
|
|
2393
|
-
clearCheckboxes();
|
|
2394
|
-
setActiveEditItem(null);
|
|
2395
|
-
}, 300);
|
|
2396
|
-
}
|
|
2397
|
-
}, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
|
|
2645
|
+
}, popoverTitle: 'Add filter', popoverChildren: (0, jsx_runtime_1.jsx)(FilterModal_1.default, { schema: schema.find((s) => s.name === currentTable ||
|
|
2646
|
+
s.displayName === currentTable) ?? schema[0], fieldValuesMap: uniqueValues[(0, ast_1.getTableNames)(baseAst).length === 1
|
|
2647
|
+
? (0, ast_1.getTableNames)(baseAst)[0]
|
|
2648
|
+
: initialTableName], onSubmitFilter: (filter) => {
|
|
2649
|
+
setOpenPopover(null);
|
|
2650
|
+
setIsPending(false);
|
|
2651
|
+
const item = (0, astFilterProcessing_1.filterToAst)(filter, client.databaseType.toLowerCase());
|
|
2652
|
+
handleInsertion(item, 'AND', false);
|
|
2653
|
+
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
|
|
2398
2654
|
false && ( // temp removed the AddConditionPopover
|
|
2399
2655
|
(0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
|
|
2400
2656
|
if (!openPopover) {
|
|
@@ -2433,25 +2689,16 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2433
2689
|
setActivePath(null);
|
|
2434
2690
|
setOpenPopover(null);
|
|
2435
2691
|
}
|
|
2436
|
-
} }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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:
|
|
2692
|
+
} }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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: () => {
|
|
2437
2693
|
setPivot(null);
|
|
2438
2694
|
setPivotData(null);
|
|
2439
2695
|
const formattedRows = formatRows(rows, columns, false);
|
|
2440
2696
|
setFormattedRows(formattedRows);
|
|
2441
2697
|
},
|
|
2442
2698
|
// TODOs
|
|
2443
|
-
selectPivot: (
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
const newAst = { ...baseAst };
|
|
2447
|
-
newAst.orderby = null;
|
|
2448
|
-
setBaseAst(newAst); // trigger refetch
|
|
2449
|
-
setPivot(pivot);
|
|
2450
|
-
const pivotedData = (0, PivotModal_1.generatePivotTableInMemory)(pivot, rows, undefined, false);
|
|
2451
|
-
setPivotData(pivotedData || []);
|
|
2452
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2453
|
-
setFormattedRows(formattedRows);
|
|
2454
|
-
}, 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 && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2699
|
+
selectPivot: () => {
|
|
2700
|
+
return;
|
|
2701
|
+
}, 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 && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2455
2702
|
setPivotRowField(value);
|
|
2456
2703
|
}, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
|
|
2457
2704
|
setPivot(null);
|
|
@@ -2466,7 +2713,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2466
2713
|
}, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: {
|
|
2467
2714
|
type: pivot.sortDirection,
|
|
2468
2715
|
expr: { type: 'column_ref', column: pivot.sortField },
|
|
2469
|
-
}, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
2716
|
+
}, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
|
|
2470
2717
|
setPivot({ ...pivot, sort: false });
|
|
2471
2718
|
setBaseAst((0, util_1.deepCopy)(baseAst));
|
|
2472
2719
|
if (!pivot) {
|
|
@@ -2515,7 +2762,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2515
2762
|
if (!pivot) {
|
|
2516
2763
|
fetchSqlQuery(newAst);
|
|
2517
2764
|
}
|
|
2518
|
-
}, setIsPending: setIsPending, setEditPopoverKey:
|
|
2765
|
+
}, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
|
|
2519
2766
|
const newAst = { ...baseAst };
|
|
2520
2767
|
newAst.orderby.splice(id, 1);
|
|
2521
2768
|
setBaseAst((0, util_1.deepCopy)(newAst));
|
|
@@ -2538,7 +2785,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2538
2785
|
setActivePath(null);
|
|
2539
2786
|
setOpenPopover(null);
|
|
2540
2787
|
}
|
|
2541
|
-
}, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2788
|
+
}, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2542
2789
|
display: 'flex',
|
|
2543
2790
|
flexDirection: 'column',
|
|
2544
2791
|
gap: 8,
|
|
@@ -2593,7 +2840,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2593
2840
|
? askAIInputWidth
|
|
2594
2841
|
: askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), ((baseAst && dataDisplayed) ||
|
|
2595
2842
|
initialLoad ||
|
|
2596
|
-
|
|
2843
|
+
initialChartLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => { }, label: "New report" }))] }) })), (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableComponent, { isLoading: true, rows: [], columns: [] }), baseAst && dataDisplayed && !initialChartLoad && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
2597
2844
|
display: 'flex',
|
|
2598
2845
|
flexDirection: 'row',
|
|
2599
2846
|
gap: '12px',
|
|
@@ -2608,8 +2855,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2608
2855
|
boxSizing: 'border-box',
|
|
2609
2856
|
...containerStyle,
|
|
2610
2857
|
}, className: className, children: [(0, jsx_runtime_1.jsxs)(SidebarComponent, { children: [(0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Columns" }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
|
|
2611
|
-
if (loadingSchema)
|
|
2612
|
-
return;
|
|
2613
2858
|
if (!orderedColumnNames) {
|
|
2614
2859
|
return;
|
|
2615
2860
|
}
|
|
@@ -2633,12 +2878,12 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2633
2878
|
}, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
|
|
2634
2879
|
setBaseAst(ast);
|
|
2635
2880
|
fetchSqlQuery(ast);
|
|
2636
|
-
}, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2881
|
+
}, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, schemaLoading: loadingSchema, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2637
2882
|
display: 'flex',
|
|
2638
2883
|
flexDirection: 'column',
|
|
2639
2884
|
gap: 8,
|
|
2640
2885
|
marginBottom: 12,
|
|
2641
|
-
}, children:
|
|
2886
|
+
}, children: filterTree && renderFilters(filterTree) })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
2642
2887
|
display: 'flex',
|
|
2643
2888
|
flexDirection: 'column',
|
|
2644
2889
|
alignItems: 'flex-start',
|
|
@@ -2650,7 +2895,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2650
2895
|
}
|
|
2651
2896
|
if (!openPopover) {
|
|
2652
2897
|
const value = orderedColumnNames[0];
|
|
2653
|
-
const
|
|
2898
|
+
const column = value.split('.')[1];
|
|
2654
2899
|
const columnType = getColumnTypeByName(column);
|
|
2655
2900
|
if ((0, ast_1.isNumericColumnType)(columnType)) {
|
|
2656
2901
|
const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
|
|
@@ -2680,27 +2925,13 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2680
2925
|
setActiveEditItem(null);
|
|
2681
2926
|
}, 300);
|
|
2682
2927
|
}
|
|
2683
|
-
}, popoverTitle: "Add filter", popoverChildren: (0, jsx_runtime_1.jsx)(
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
setActiveEditItem(null);
|
|
2691
|
-
}, 300);
|
|
2692
|
-
}
|
|
2693
|
-
else {
|
|
2694
|
-
setOpenPopover(null);
|
|
2695
|
-
setIsPending(false);
|
|
2696
|
-
handleInsertion(activeEditItem, 'AND', false);
|
|
2697
|
-
setActivePath(null);
|
|
2698
|
-
setTimeout(() => {
|
|
2699
|
-
clearCheckboxes();
|
|
2700
|
-
setActiveEditItem(null);
|
|
2701
|
-
}, 300);
|
|
2702
|
-
}
|
|
2703
|
-
}, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
|
|
2928
|
+
}, popoverTitle: "Add filter", popoverChildren: (0, jsx_runtime_1.jsx)(FilterModal_1.default, { schema: schema.find((s) => s.name === currentTable ||
|
|
2929
|
+
s.displayName === currentTable) ?? schema[0], fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
|
|
2930
|
+
setOpenPopover(null);
|
|
2931
|
+
setIsPending(false);
|
|
2932
|
+
const item = (0, astFilterProcessing_1.filterToAst)(filter, client.databaseType.toLowerCase());
|
|
2933
|
+
handleInsertion(item, 'AND', false);
|
|
2934
|
+
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
|
|
2704
2935
|
false && ( // temp removed the AddConditionPopover
|
|
2705
2936
|
(0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
|
|
2706
2937
|
if (!openPopover) {
|
|
@@ -2740,12 +2971,12 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2740
2971
|
setOpenPopover(null);
|
|
2741
2972
|
clearCheckboxes();
|
|
2742
2973
|
}
|
|
2743
|
-
} }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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:
|
|
2974
|
+
} }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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: () => {
|
|
2744
2975
|
setPivot(null);
|
|
2745
2976
|
setPivotData(null);
|
|
2746
2977
|
const formattedRows = formatRows(rows, columns, false);
|
|
2747
2978
|
setFormattedRows(formattedRows);
|
|
2748
|
-
}, selectPivot: (pivot) => {
|
|
2979
|
+
}, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
|
|
2749
2980
|
if (!pivot)
|
|
2750
2981
|
return;
|
|
2751
2982
|
const newAst = { ...baseAst };
|
|
@@ -2755,13 +2986,19 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2755
2986
|
pivot['sortDirection'] = 'ASC';
|
|
2756
2987
|
}
|
|
2757
2988
|
setBaseAst(newAst); // trigger refetch
|
|
2989
|
+
let dateBucket = undefined;
|
|
2990
|
+
if (dateRange) {
|
|
2991
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(dateRange);
|
|
2992
|
+
}
|
|
2993
|
+
if (!pivotTable) {
|
|
2994
|
+
pivotTable = await (0, PivotModal_1.generatePivotTable)(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
|
|
2995
|
+
}
|
|
2996
|
+
setPivotData(pivotTable || []);
|
|
2758
2997
|
setPivot(pivot);
|
|
2759
|
-
const
|
|
2760
|
-
setPivotData(pivotedData || []);
|
|
2761
|
-
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2998
|
+
const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
|
|
2762
2999
|
setFormattedRows(formattedRows);
|
|
2763
3000
|
setErrorMessage('');
|
|
2764
|
-
}, 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 && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
3001
|
+
}, 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 && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2765
3002
|
setPivotRowField(value);
|
|
2766
3003
|
updatePivot(value, 'rowField');
|
|
2767
3004
|
}, setPivotColumnField: (value) => {
|
|
@@ -2793,10 +3030,18 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2793
3030
|
`.${pivot.rowField}`,
|
|
2794
3031
|
`.${pivot.valueField || 'count'}`,
|
|
2795
3032
|
]
|
|
2796
|
-
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
3033
|
+
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: async () => {
|
|
2797
3034
|
if (pivot) {
|
|
2798
|
-
|
|
2799
|
-
|
|
3035
|
+
const tempPivot = { ...pivot, sort: false };
|
|
3036
|
+
let dateBucket = undefined;
|
|
3037
|
+
const tempDateRange = dateRanges &&
|
|
3038
|
+
pivot.rowField &&
|
|
3039
|
+
dateRanges[pivot.rowField];
|
|
3040
|
+
if (tempDateRange) {
|
|
3041
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
3042
|
+
}
|
|
3043
|
+
setPivot(tempPivot);
|
|
3044
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2800
3045
|
setPivotData(pivotedData || []);
|
|
2801
3046
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2802
3047
|
setFormattedRows(formattedRows);
|
|
@@ -2805,25 +3050,27 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2805
3050
|
}
|
|
2806
3051
|
setBaseAst((0, util_1.deepCopy)(baseAst));
|
|
2807
3052
|
fetchSqlQuery((0, util_1.deepCopy)(baseAst));
|
|
2808
|
-
}, onSave: (column, direction) => {
|
|
3053
|
+
}, onSave: async (column, direction) => {
|
|
2809
3054
|
if (pivot) {
|
|
2810
3055
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2811
3056
|
? 'number'
|
|
2812
3057
|
: pivot.rowFieldType;
|
|
2813
|
-
|
|
3058
|
+
const tempPivot = {
|
|
2814
3059
|
...pivot,
|
|
2815
3060
|
sort: true,
|
|
2816
3061
|
sortDirection: direction,
|
|
2817
3062
|
sortField: column,
|
|
2818
3063
|
sortFieldType: sortFieldType,
|
|
2819
|
-
}
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
3064
|
+
};
|
|
3065
|
+
setPivot(tempPivot);
|
|
3066
|
+
let dateBucket = undefined;
|
|
3067
|
+
const tempDateRange = dateRanges &&
|
|
3068
|
+
pivot.rowField &&
|
|
3069
|
+
dateRanges[pivot.rowField];
|
|
3070
|
+
if (tempDateRange) {
|
|
3071
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
3072
|
+
}
|
|
3073
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2827
3074
|
setPivotData(pivotedData || []);
|
|
2828
3075
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
2829
3076
|
setFormattedRows(formattedRows);
|
|
@@ -2838,7 +3085,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2838
3085
|
flexDirection: 'column',
|
|
2839
3086
|
gap: 8,
|
|
2840
3087
|
marginBottom: 12,
|
|
2841
|
-
}, children: baseAst.orderby.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
3088
|
+
}, children: baseAst.orderby.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
|
|
2842
3089
|
if (pivot) {
|
|
2843
3090
|
setPivot({ ...pivot, sort: false });
|
|
2844
3091
|
return;
|
|
@@ -2904,27 +3151,29 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2904
3151
|
`.${pivot.rowField}`,
|
|
2905
3152
|
`.${pivot.valueField || 'count'}`,
|
|
2906
3153
|
]
|
|
2907
|
-
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
|
|
3154
|
+
: selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
|
|
2908
3155
|
if (column === '')
|
|
2909
3156
|
return;
|
|
2910
3157
|
if (pivot) {
|
|
2911
3158
|
const sortFieldType = column === (pivot.valueField || 'count')
|
|
2912
3159
|
? 'number'
|
|
2913
3160
|
: pivot.rowFieldType;
|
|
2914
|
-
|
|
2915
|
-
...pivot,
|
|
2916
|
-
sort: true,
|
|
2917
|
-
sortDirection: direction,
|
|
2918
|
-
sortField: column,
|
|
2919
|
-
sortFieldType: sortFieldType,
|
|
2920
|
-
});
|
|
2921
|
-
const pivotedData = (0, PivotModal_1.generatePivotTableInMemory)({
|
|
3161
|
+
const tempPivot = {
|
|
2922
3162
|
...pivot,
|
|
2923
3163
|
sort: true,
|
|
2924
3164
|
sortDirection: direction,
|
|
2925
3165
|
sortField: column,
|
|
2926
3166
|
sortFieldType: sortFieldType,
|
|
2927
|
-
}
|
|
3167
|
+
};
|
|
3168
|
+
setPivot(tempPivot);
|
|
3169
|
+
let dateBucket = undefined;
|
|
3170
|
+
const tempDateRange = dateRanges &&
|
|
3171
|
+
pivot.rowField &&
|
|
3172
|
+
dateRanges[pivot.rowField];
|
|
3173
|
+
if (tempDateRange) {
|
|
3174
|
+
dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
|
|
3175
|
+
}
|
|
3176
|
+
const pivotedData = await (0, PivotModal_1.generatePivotTable)(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
|
|
2928
3177
|
setErrorMessage('');
|
|
2929
3178
|
setPivotData(pivotedData || []);
|
|
2930
3179
|
const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
|
|
@@ -2946,7 +3195,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
2946
3195
|
setOpenPopover(null);
|
|
2947
3196
|
setBaseAst((0, util_1.deepCopy)(newAst));
|
|
2948
3197
|
fetchSqlQuery((0, util_1.deepCopy)(newAst));
|
|
2949
|
-
} }) }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
3198
|
+
} }) }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
2950
3199
|
display: 'flex',
|
|
2951
3200
|
flexDirection: 'column',
|
|
2952
3201
|
gap: 8,
|
|
@@ -3017,14 +3266,16 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
3017
3266
|
? askAIInputWidth
|
|
3018
3267
|
: askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
|
|
3019
3268
|
? 'Ask a follow-up question...'
|
|
3020
|
-
: 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading:
|
|
3269
|
+
: 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: tableLoading ||
|
|
3270
|
+
(loading && errorMessage.length === 0) ||
|
|
3271
|
+
initialChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
|
|
3021
3272
|
? pivotData?.columns || emptyPivotColumns()
|
|
3022
3273
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
3023
3274
|
return {
|
|
3024
3275
|
label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(c),
|
|
3025
3276
|
field: c,
|
|
3026
3277
|
};
|
|
3027
|
-
}) })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
3278
|
+
}), onPageChange: onPageChange, onSortChange: onSortChange })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
3028
3279
|
display: 'flex',
|
|
3029
3280
|
flexDirection: 'row',
|
|
3030
3281
|
gap: '12px',
|
|
@@ -3035,11 +3286,13 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
3035
3286
|
overflow: 'hidden',
|
|
3036
3287
|
width: '100%',
|
|
3037
3288
|
gap: 12,
|
|
3038
|
-
|
|
3289
|
+
alignItems: 'center',
|
|
3290
|
+
}, children: [(0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: errorMessage }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [!hideCopySQL && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => {
|
|
3039
3291
|
setIsChartBuilderOpen(true);
|
|
3040
|
-
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { report: report
|
|
3292
|
+
}, disabled: !!errorMessage, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { report: report
|
|
3041
3293
|
? {
|
|
3042
3294
|
...report,
|
|
3295
|
+
...tempReport,
|
|
3043
3296
|
pivot: pivot,
|
|
3044
3297
|
yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
|
|
3045
3298
|
columns: report.columns.filter((col) => {
|
|
@@ -3050,6 +3303,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void
|
|
|
3050
3303
|
queryString: activeQuery,
|
|
3051
3304
|
rows: rows,
|
|
3052
3305
|
}
|
|
3053
|
-
:
|
|
3306
|
+
: 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 }))] }));
|
|
3054
3307
|
}
|
|
3055
3308
|
exports.default = ReportBuilder;
|