@quillsql/react 2.12.29 → 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 +143 -183
- package/dist/cjs/ChartBuilder.d.ts +18 -12
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +125 -98
- 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.map +1 -1
- package/dist/cjs/Context.js +42 -2
- package/dist/cjs/Dashboard.d.ts +16 -7
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +17 -22
- 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 +17 -5
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +510 -487
- package/dist/cjs/SQLEditor.d.ts +2 -9
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +69 -86
- package/dist/cjs/Table.d.ts +19 -3
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +105 -87
- 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 +88 -181
- 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.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +5 -1
- 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 +8 -21
- 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/csv.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +3 -3
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +63 -1
- 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 +1 -1
- 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/{monacoAutocomplete.d.ts → monacoConfig.d.ts} +3 -2
- 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 +9 -0
- 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.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +4 -3
- 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 +22 -8
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +116 -35
- 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 +146 -186
- package/dist/esm/ChartBuilder.d.ts +18 -12
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +126 -99
- 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.map +1 -1
- package/dist/esm/Context.js +42 -2
- package/dist/esm/Dashboard.d.ts +16 -7
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +17 -22
- 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 +17 -5
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +516 -493
- package/dist/esm/SQLEditor.d.ts +2 -9
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +68 -85
- package/dist/esm/Table.d.ts +19 -3
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +107 -89
- 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 +88 -181
- 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.map +1 -1
- package/dist/esm/hooks/useDashboard.js +5 -1
- 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 +11 -24
- 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/csv.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +3 -3
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +63 -1
- 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 +1 -1
- 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/{monacoAutocomplete.d.ts → monacoConfig.d.ts} +3 -2
- 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 +9 -0
- 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.map +1 -1
- package/dist/esm/utils/queryConstructor.js +4 -3
- package/dist/esm/utils/queryConstructor.uspec.js +21 -21
- 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 +22 -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 +112 -33
- 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/utils/monacoAutocomplete.d.ts.map +0 -1
- package/dist/cjs/utils/monacoAutocomplete.js +0 -145
- package/dist/cjs/utils/queryConstructor.uspec.d.ts +0 -2
- package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +0 -1
- package/dist/cjs/utils/queryConstructor.uspec.js +0 -225
- package/dist/esm/utils/monacoAutocomplete.d.ts.map +0 -1
- package/dist/esm/utils/monacoAutocomplete.js +0 -140
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
/* eslint-disable no-unused-vars */
|
|
3
2
|
import { useContext, useEffect, useRef, useState, } from 'react';
|
|
4
3
|
import { DEFAULT_TAB_OPTIONS, MemoizedButton, MemoizedCheckbox, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedSecondaryButton, MemoizedText, MemoizedPopover, QuillTabs, MemoizedModal, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillColumnSearchEmptyState, QuillChartBuilderFormContainer, QuillLoadingComponent, QuillTableSQLEditorComponent, } from './components/UiComponents';
|
|
5
4
|
import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
6
5
|
import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
7
6
|
import { CSS as DND_CSS } from '@dnd-kit/utilities';
|
|
8
|
-
import { getQuarter } from 'date-fns';
|
|
9
7
|
import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
|
|
10
|
-
import { getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
8
|
+
import { extractColumnish, getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
|
|
11
9
|
import { ChartBuilderWithModal, createInitialFormData } from './ChartBuilder';
|
|
12
10
|
import { QuillTextInput } from './components/UiComponents';
|
|
13
|
-
import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover,
|
|
11
|
+
import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover, QuillLimitPopover, FilterPopoverWrapper, } from './components/ReportBuilder/ui';
|
|
14
12
|
import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
|
|
15
13
|
import { convertBigQuery, convertGroupBy, convertRemoveSimpleParentheses, convertStringComparison, convertWildcardColumns, } from './components/ReportBuilder/convert';
|
|
16
|
-
import { deepCopy, formatDateComparisonNode, getDateFilterInfo,
|
|
14
|
+
import { deepCopy, formatDateComparisonNode, getDateFilterInfo, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, showNodeAsRow, removeNonSelectedTableReferences, isEquals, } from './components/ReportBuilder/util';
|
|
17
15
|
import { getDefaultOperatorSubtrees, OPERATOR_GROUPS, } from './components/ReportBuilder/operators';
|
|
18
16
|
import { hashCode } from './utils/crypto';
|
|
19
|
-
import {
|
|
17
|
+
import { defaultAST, defaultBoolComparison, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, } from './components/ReportBuilder/constants';
|
|
20
18
|
import AddColumnModal from './components/ReportBuilder/AddColumnModal';
|
|
21
19
|
import { AddSortPopover, SortSentence, } from './components/ReportBuilder/AddSortPopover';
|
|
22
20
|
import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
|
|
23
|
-
import { snakeAndCamelCaseToTitleCase
|
|
21
|
+
import { snakeAndCamelCaseToTitleCase } from './utils/textProcessing';
|
|
24
22
|
import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
|
|
25
23
|
import { updateFirstChildWidth } from './utils/width';
|
|
26
24
|
import { QuillSelectComponent } from './components/QuillSelect';
|
|
@@ -28,15 +26,21 @@ import { QuillCard } from './components/QuillCard';
|
|
|
28
26
|
import { getData } from './utils/dataFetcher';
|
|
29
27
|
import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
|
|
30
28
|
import { getPossiblePivotFieldOptions, pivotToSql, } from './utils/pivotProcessing';
|
|
31
|
-
import { getUniqueValuesByColumns, getDateRangeByColumns, getCountsByColumns, } from './utils/tableProcessing';
|
|
29
|
+
import { getUniqueValuesByColumns, getDateRangeByColumns, getCountsByColumns, fetchTableByQuery, } from './utils/tableProcessing';
|
|
32
30
|
import { useQuill } from './hooks/useQuill';
|
|
33
31
|
import { getDataFromCloud } from './utils/dataFetcher';
|
|
34
32
|
import { convertColumnInfoToColumnInternal, convertPostgresColumn, } from './utils/columnProcessing';
|
|
35
33
|
import { getSelectFromAST, processApostrophe, processStarColumn, } from './utils/astProcessing';
|
|
36
34
|
import PivotForm from './internals/ReportBuilder/PivotForm';
|
|
37
35
|
import { getSchemaInfoWithCustomFields } from './utils/schema';
|
|
38
|
-
import { MAX_COLUMN_ROWS_LIMIT } from './utils/constants';
|
|
39
36
|
import { getDateBucketFromRange } from './utils/dates';
|
|
37
|
+
import FilterModal from './components/ReportBuilder/FilterModal';
|
|
38
|
+
import { DateOperator, FilterNames } from './models/Filter';
|
|
39
|
+
import { filterToAst, filterTreeToAst, } from './utils/astFilterProcessing';
|
|
40
|
+
import useAstToFilterTree from './hooks/useAstToFilterTree';
|
|
41
|
+
import { QuillMultiSelectComponent } from './components/QuillMultiSelect';
|
|
42
|
+
import { shouldFetchMore, DEFAULT_PAGINATION, shouldSortInMemory, } from './utils/paginationProcessing';
|
|
43
|
+
import { formatRowsFromReport } from './utils/report';
|
|
40
44
|
export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
|
|
41
45
|
'https://quill-344421.uc.r.appspot.com';
|
|
42
46
|
/**
|
|
@@ -70,7 +74,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
|
|
|
70
74
|
* ### Report Builder API
|
|
71
75
|
* @see https://docs.quillsql.com/components/report-builder
|
|
72
76
|
*/
|
|
73
|
-
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (
|
|
77
|
+
export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
|
|
74
78
|
const { data: report } = useQuill(reportId || '');
|
|
75
79
|
const [aiPrompt, setAiPrompt] = useState('');
|
|
76
80
|
const [errorMessage, setErrorMessage] = useState('');
|
|
@@ -95,7 +99,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
95
99
|
const [columns, setColumns] = useState([]);
|
|
96
100
|
const [tempReport, setTempReport] = useState({});
|
|
97
101
|
const [topLevelBinaryOperator, setTopLevelBinaryOperator] = useState('AND');
|
|
98
|
-
const [editPopoverKey, setEditPopoverKey] = useState(null);
|
|
99
102
|
const [uniqueValues, setUniqueValues] = useState({});
|
|
100
103
|
const [pivot, setPivot] = useState(null);
|
|
101
104
|
const [pivotData, setPivotData] = useState(null);
|
|
@@ -103,8 +106,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
103
106
|
const [recommendedPivots, setRecommendedPivots] = useState([]);
|
|
104
107
|
const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
|
|
105
108
|
const [showPivotPopover, setShowPivotPopover] = useState(false);
|
|
106
|
-
const [
|
|
107
|
-
const [
|
|
109
|
+
const [isEditingPivot, setIsEditingPivot] = useState(false);
|
|
110
|
+
const [initialChartLoad, setInitialChartLoad] = useState(false);
|
|
108
111
|
const [askedAQuestion, setAskedAQuestion] = useState(false);
|
|
109
112
|
const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
|
|
110
113
|
const [initialLoad, setInitialLoad] = useState(!!initialTableName || !!reportId);
|
|
@@ -120,11 +123,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
120
123
|
const [pivotValueField, setPivotValueField] = useState(undefined);
|
|
121
124
|
const [pivotAggregation, setPivotAggregation] = useState(undefined);
|
|
122
125
|
const [dateRanges, setDateRanges] = useState(null);
|
|
123
|
-
|
|
124
|
-
const [client, _setClient] = useContext(ClientContext);
|
|
126
|
+
const [client] = useContext(ClientContext);
|
|
125
127
|
// JANK: This is temp and stupid
|
|
126
128
|
const [overrideRecommendations, setOverrideRecommendations] = useState(true);
|
|
127
129
|
const [customFields, setCustomFields] = useContext(CustomFieldContext);
|
|
130
|
+
const [openFilterIndex, setOpenFilterIndex] = useState(null); // Sets open filter modals
|
|
131
|
+
const [fieldValuesMap, setFieldValuesMap] = useState({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
|
|
132
|
+
const filterTree = useAstToFilterTree(formData, client); // Stores the state of filters
|
|
128
133
|
useEffect(() => {
|
|
129
134
|
if (!client) {
|
|
130
135
|
return;
|
|
@@ -140,6 +145,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
140
145
|
updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
|
|
141
146
|
updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
|
|
142
147
|
}, [dataDisplayed]);
|
|
148
|
+
// Whenever unique values changes, update the fieldValuesMap, used in FilterModals
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
const tables = getTableNames(baseAst);
|
|
151
|
+
const table = tables.length === 1 ? tables[0] : initialTableName;
|
|
152
|
+
const newFieldValues = {};
|
|
153
|
+
if (uniqueValues[table]) {
|
|
154
|
+
for (const field of Object.keys(uniqueValues[table])) {
|
|
155
|
+
newFieldValues[field] = [];
|
|
156
|
+
for (const value of Object.keys(uniqueValues[table][field])) {
|
|
157
|
+
newFieldValues[field]?.push(value);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
setFieldValuesMap(newFieldValues);
|
|
162
|
+
}, [uniqueValues]);
|
|
143
163
|
useEffect(() => {
|
|
144
164
|
// Since the TextInput component takes a required numeric width parameter,
|
|
145
165
|
// we dynamically calculate the width of this component here.
|
|
@@ -178,7 +198,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
178
198
|
if (tempDateRange) {
|
|
179
199
|
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
180
200
|
}
|
|
181
|
-
|
|
201
|
+
let distinctValuesForQuery = {};
|
|
202
|
+
if (pivot.columnField) {
|
|
203
|
+
distinctValuesForQuery = await getUniqueValuesByColumns([
|
|
204
|
+
{
|
|
205
|
+
field: pivot.columnField,
|
|
206
|
+
label: pivot.columnField,
|
|
207
|
+
format: 'string',
|
|
208
|
+
},
|
|
209
|
+
], activeQuery, [], client, customFields);
|
|
210
|
+
}
|
|
211
|
+
const pivotedData = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, distinctValuesForQuery);
|
|
182
212
|
setPivotData(pivotedData || []);
|
|
183
213
|
const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
|
|
184
214
|
setPivot(newPivot);
|
|
@@ -218,7 +248,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
218
248
|
setRows([]);
|
|
219
249
|
setColumns([]);
|
|
220
250
|
setTopLevelBinaryOperator('AND');
|
|
221
|
-
setEditPopoverKey(null);
|
|
222
251
|
setErrorMessage('');
|
|
223
252
|
setFormattedRows([]);
|
|
224
253
|
// setUniqueValues({});
|
|
@@ -246,8 +275,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
246
275
|
if (pivot) {
|
|
247
276
|
const formattedRows = copiedRows.map((row) => {
|
|
248
277
|
const formattedRow = row;
|
|
249
|
-
Object.keys(row).forEach((key
|
|
250
|
-
|
|
278
|
+
Object.keys(row).forEach((key) => {
|
|
279
|
+
const column = columns.find((c) => c.field === key);
|
|
251
280
|
let format = 'string';
|
|
252
281
|
if (!column) {
|
|
253
282
|
format =
|
|
@@ -307,42 +336,20 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
307
336
|
navigator.clipboard.writeText(query);
|
|
308
337
|
setTimeout(() => setIsCopying(false), 800);
|
|
309
338
|
};
|
|
310
|
-
const copyToClipboard = (str) => {
|
|
311
|
-
setIsCopying(true);
|
|
312
|
-
navigator.clipboard.writeText(str);
|
|
313
|
-
setTimeout(() => setIsCopying(false), 800);
|
|
314
|
-
};
|
|
315
339
|
const clearCheckboxes = () => {
|
|
316
340
|
const checkboxes = uniqueValues;
|
|
317
341
|
const newValues = {};
|
|
318
|
-
for (
|
|
342
|
+
for (const table of Object.keys(checkboxes)) {
|
|
319
343
|
newValues[table] = {};
|
|
320
|
-
for (
|
|
344
|
+
for (const column of Object.keys(checkboxes[table])) {
|
|
321
345
|
newValues[table][column] = {};
|
|
322
|
-
for (
|
|
346
|
+
for (const variant of Object.keys(checkboxes[table][column])) {
|
|
323
347
|
newValues[table][column][variant] = false;
|
|
324
348
|
}
|
|
325
349
|
}
|
|
326
350
|
}
|
|
327
351
|
setUniqueValues(newValues);
|
|
328
352
|
};
|
|
329
|
-
const setCheckboxes = (node) => {
|
|
330
|
-
if (!['IN', 'NOT IN'].includes(node.operator))
|
|
331
|
-
return;
|
|
332
|
-
const selectedItems = node.right.value.flatMap((v) => v.args.value.map((x) => x.value.toLowerCase()));
|
|
333
|
-
const checkboxes = uniqueValues;
|
|
334
|
-
const newValues = {};
|
|
335
|
-
for (let table of Object.keys(checkboxes)) {
|
|
336
|
-
newValues[table] = {};
|
|
337
|
-
for (let column of Object.keys(checkboxes[table])) {
|
|
338
|
-
newValues[table][column] = {};
|
|
339
|
-
for (let variant of Object.keys(checkboxes[table][column])) {
|
|
340
|
-
newValues[table][column][variant] = selectedItems.includes(variant.toLowerCase());
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
setUniqueValues(newValues);
|
|
345
|
-
};
|
|
346
353
|
const fetchSqlQuery = async (ast, formData, fetchData = true) => {
|
|
347
354
|
if (fetchData) {
|
|
348
355
|
setLoading(true);
|
|
@@ -358,6 +365,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
358
365
|
body: JSON.stringify({
|
|
359
366
|
ast: { ...ast, where },
|
|
360
367
|
publicKey: client.publicKey,
|
|
368
|
+
useNewNodeSql: true, // new flag
|
|
361
369
|
}),
|
|
362
370
|
});
|
|
363
371
|
const data = await response.json();
|
|
@@ -365,6 +373,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
365
373
|
if (fetchData) {
|
|
366
374
|
fetchUponChange(ast, formData);
|
|
367
375
|
}
|
|
376
|
+
return data.query;
|
|
368
377
|
}
|
|
369
378
|
catch (error) {
|
|
370
379
|
setLoading(false);
|
|
@@ -489,83 +498,102 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
489
498
|
};
|
|
490
499
|
useEffect(() => {
|
|
491
500
|
const loadChart = async () => {
|
|
492
|
-
|
|
501
|
+
setInitialChartLoad(true);
|
|
502
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
493
503
|
if (!report || report.referencedTables.length !== 1) {
|
|
494
|
-
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
const tableName = report.referencedTables[0];
|
|
498
|
-
if (!tableName) {
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
const resp = await getDataFromCloud(client, `astify`, {
|
|
502
|
-
query: report.queryString,
|
|
503
|
-
});
|
|
504
|
-
if (resp.success === false) {
|
|
505
|
-
setErrorMessage('Error: ' + resp.message);
|
|
504
|
+
setInitialChartLoad(false);
|
|
506
505
|
return;
|
|
507
506
|
}
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
setDateRanges(dateRangesTemp);
|
|
532
|
-
}
|
|
533
|
-
if (groupByPivot) {
|
|
534
|
-
// @ts-ignore
|
|
535
|
-
setPivotRowField(groupByPivot.rowField);
|
|
536
|
-
// @ts-ignore
|
|
537
|
-
setPivotAggregation(groupByPivot.aggregationType);
|
|
538
|
-
// @ts-ignore
|
|
539
|
-
setPivotColumnField(groupByPivot.columnField);
|
|
540
|
-
// @ts-ignore
|
|
541
|
-
setPivotValueField(groupByPivot.valueField);
|
|
542
|
-
setPivot(groupByPivot);
|
|
543
|
-
let dateBucket = undefined;
|
|
544
|
-
const tempDateRange = dateRangesTemp &&
|
|
545
|
-
groupByPivot.rowField &&
|
|
546
|
-
dateRangesTemp[groupByPivot.rowField];
|
|
547
|
-
if (tempDateRange) {
|
|
548
|
-
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
549
|
-
}
|
|
550
|
-
const pivotedData = await generatePivotTable(
|
|
551
|
-
// @ts-ignore
|
|
552
|
-
groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
|
|
553
|
-
setPivotData(pivotedData || []);
|
|
554
|
-
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
507
|
+
try {
|
|
508
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
509
|
+
const tableName = report.referencedTables[0];
|
|
510
|
+
if (!tableName) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const resp = await getDataFromCloud(client, `astify`, {
|
|
514
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
515
|
+
query: report.queryString,
|
|
516
|
+
useNewNodeSql: true,
|
|
517
|
+
});
|
|
518
|
+
if (resp.success === false) {
|
|
519
|
+
setErrorMessage(resp.message);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
const ast = getSelectFromAST(resp.ast);
|
|
523
|
+
let convertedAst = processStarColumn(ast, report.columns);
|
|
524
|
+
processApostrophe(convertedAst, ['type', 'value']);
|
|
525
|
+
convertedAst = convertBigQuery(convertedAst);
|
|
526
|
+
const schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
|
|
527
|
+
let newAst;
|
|
528
|
+
let groupByPivot = {};
|
|
529
|
+
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(convertedAst,
|
|
555
530
|
// @ts-ignore
|
|
556
|
-
|
|
557
|
-
|
|
531
|
+
report.pivot, schemaInfo));
|
|
532
|
+
if (convertedAst.where) {
|
|
533
|
+
setFormData(deepCopy(convertedAst.where));
|
|
534
|
+
}
|
|
535
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
536
|
+
setActiveQuery(report.queryString);
|
|
537
|
+
newAst = groupByPivot ? newAst : convertedAst;
|
|
538
|
+
const initialRows = await fetchUponChange(newAst, undefined);
|
|
539
|
+
if (initialRows.error) {
|
|
540
|
+
setBaseAst(null);
|
|
541
|
+
setErrorMessage(initialRows.message);
|
|
542
|
+
setInitialChartLoad(false);
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
setBaseAst(newAst);
|
|
546
|
+
const tableInfo = schemaInfo.find((table) => table.name === tableName);
|
|
547
|
+
let newUniqueValues = undefined;
|
|
548
|
+
let dateRangesTemp = undefined;
|
|
549
|
+
if (tableName) {
|
|
550
|
+
newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
|
|
551
|
+
setUniqueValues(newUniqueValues);
|
|
552
|
+
dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
|
|
553
|
+
setDateRanges(dateRangesTemp);
|
|
554
|
+
}
|
|
555
|
+
if (groupByPivot) {
|
|
556
|
+
// @ts-ignore
|
|
557
|
+
setPivotRowField(groupByPivot.rowField);
|
|
558
|
+
// @ts-ignore
|
|
559
|
+
setPivotAggregation(groupByPivot.aggregationType);
|
|
560
|
+
// @ts-ignore
|
|
561
|
+
setPivotColumnField(groupByPivot.columnField);
|
|
562
|
+
// @ts-ignore
|
|
563
|
+
setPivotValueField(groupByPivot.valueField);
|
|
564
|
+
setPivot(groupByPivot);
|
|
565
|
+
let dateBucket = undefined;
|
|
566
|
+
const tempDateRange = dateRangesTemp &&
|
|
567
|
+
groupByPivot.rowField &&
|
|
568
|
+
dateRangesTemp[groupByPivot.rowField];
|
|
569
|
+
if (tempDateRange) {
|
|
570
|
+
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
571
|
+
}
|
|
572
|
+
const pivotedData = await generatePivotTable(
|
|
573
|
+
// @ts-ignore
|
|
574
|
+
groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
|
|
575
|
+
setPivotData(pivotedData || []);
|
|
576
|
+
const formattedRows = formatRows(pivotedData.rows, report.columns, true,
|
|
577
|
+
// @ts-ignore
|
|
578
|
+
groupByPivot.aggregationType);
|
|
579
|
+
setFormattedRows(formattedRows);
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
const formattedRows = formatRows(report.rows, report.columns);
|
|
583
|
+
setFormattedRows(formattedRows);
|
|
584
|
+
}
|
|
585
|
+
setCurrentTable(tableName);
|
|
558
586
|
}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
587
|
+
catch (error) {
|
|
588
|
+
console.error(error);
|
|
589
|
+
setErrorMessage('Error loading report');
|
|
562
590
|
}
|
|
563
|
-
setCurrentTable(tableName);
|
|
564
591
|
// This handles a flashing issue
|
|
565
592
|
setTimeout(() => {
|
|
566
|
-
|
|
593
|
+
setInitialChartLoad(false);
|
|
567
594
|
}, 500);
|
|
568
595
|
};
|
|
596
|
+
// @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
|
|
569
597
|
if (report && report.referencedTables.length === 1) {
|
|
570
598
|
loadChart();
|
|
571
599
|
}
|
|
@@ -891,10 +919,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
891
919
|
isReplaceSubtree: true,
|
|
892
920
|
});
|
|
893
921
|
};
|
|
894
|
-
// Function to handle the deletion of expressions
|
|
895
|
-
const handleDelete = (key) => {
|
|
896
|
-
updateFormData([{ path: key, value: null }], { isDeletion: true });
|
|
897
|
-
};
|
|
898
922
|
// Function to handle the insertion of expressions
|
|
899
923
|
const handleInsertion = (value, op = 'OR', isCondition = undefined) => {
|
|
900
924
|
updateFormData([{ path: '', value }], {
|
|
@@ -959,84 +983,61 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
959
983
|
};
|
|
960
984
|
const [previousPage, setPreviousPage] = useState(0);
|
|
961
985
|
const [currentProcessing, setCurrentProcessing] = useState({
|
|
962
|
-
page:
|
|
986
|
+
page: DEFAULT_PAGINATION,
|
|
963
987
|
});
|
|
964
988
|
const [numberOfRows, setNumberOfRows] = useState(0);
|
|
965
989
|
const [tableLoading, setTableLoading] = useState(false);
|
|
966
990
|
const onPageChange = (page) => {
|
|
967
|
-
if (
|
|
968
|
-
|
|
991
|
+
if (currentProcessing.page &&
|
|
992
|
+
shouldFetchMore(DEFAULT_PAGINATION, page, previousPage)) {
|
|
993
|
+
const newPagination = { ...currentProcessing.page, page };
|
|
994
|
+
const updatedProcessing = { ...currentProcessing, page: newPagination };
|
|
995
|
+
setCurrentProcessing(updatedProcessing);
|
|
996
|
+
handleRunQuery(updatedProcessing);
|
|
969
997
|
}
|
|
970
|
-
if (
|
|
971
|
-
(page
|
|
972
|
-
(previousPage > page.currentPage &&
|
|
973
|
-
(previousPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0)) {
|
|
974
|
-
handleRunQuery({ ...currentProcessing, page });
|
|
998
|
+
if (page > previousPage) {
|
|
999
|
+
setPreviousPage(page);
|
|
975
1000
|
}
|
|
976
|
-
setPreviousPage(page.currentPage);
|
|
977
1001
|
};
|
|
978
1002
|
const onSortChange = (sort) => {
|
|
979
|
-
if (
|
|
1003
|
+
if (report &&
|
|
1004
|
+
shouldSortInMemory(DEFAULT_PAGINATION, report.rowCount, !!report.pivot)) {
|
|
980
1005
|
return;
|
|
981
1006
|
}
|
|
982
|
-
|
|
1007
|
+
const updatedProcessing = { page: DEFAULT_PAGINATION, sort };
|
|
1008
|
+
handleRunQuery(updatedProcessing, true);
|
|
1009
|
+
setCurrentProcessing(updatedProcessing);
|
|
983
1010
|
setPreviousPage(0);
|
|
984
1011
|
};
|
|
985
|
-
const handleRunQuery = async (processing) => {
|
|
1012
|
+
const handleRunQuery = async (processing, resetRows = false) => {
|
|
986
1013
|
try {
|
|
987
1014
|
setErrorMessage('');
|
|
988
1015
|
setTableLoading(true);
|
|
989
|
-
const
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
task: 'query',
|
|
993
|
-
orgId: client.customerId || '*',
|
|
994
|
-
clientId: client.publicKey,
|
|
995
|
-
databaseType: client?.databaseType,
|
|
996
|
-
getCustomFields: !client.customerId || client.customerId === '*' ? false : true,
|
|
997
|
-
customFieldsByTable: customFields,
|
|
998
|
-
additionalProcessing: processing,
|
|
999
|
-
useUpdatedDataGathering: true,
|
|
1000
|
-
},
|
|
1001
|
-
};
|
|
1002
|
-
const cloudBody = { activeQuery };
|
|
1003
|
-
const resp = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
1004
|
-
if (resp && resp.errorMessage) {
|
|
1005
|
-
setTableLoading(false);
|
|
1006
|
-
setErrorMessage('Failed to run SQL query: ' + resp.errorMessage);
|
|
1007
|
-
setRows([]);
|
|
1008
|
-
setColumns([]);
|
|
1009
|
-
return;
|
|
1016
|
+
const tableInfo = await fetchTableByQuery(activeQuery, client, processing, customFields);
|
|
1017
|
+
if (tableInfo.error) {
|
|
1018
|
+
throw new Error(tableInfo.error);
|
|
1010
1019
|
}
|
|
1011
|
-
if (
|
|
1012
|
-
|
|
1020
|
+
else if (tableInfo.rows.length === 0) {
|
|
1021
|
+
throw new Error('No data found');
|
|
1022
|
+
}
|
|
1023
|
+
if (tableInfo.rowCount) {
|
|
1024
|
+
setNumberOfRows(tableInfo.rowCount);
|
|
1013
1025
|
}
|
|
1014
|
-
setErrorMessage('');
|
|
1015
1026
|
setCurrentProcessing(processing);
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
setFormattedRows(temp_rows.map((row) => {
|
|
1024
|
-
return processedFields.reduce((formattedRow, column) => {
|
|
1025
|
-
// Apply the format function to each field in the row
|
|
1026
|
-
const formattedValue = quillFormat({
|
|
1027
|
-
value: row[column.field],
|
|
1028
|
-
format: column.format,
|
|
1029
|
-
});
|
|
1030
|
-
formattedRow[column.field] = formattedValue;
|
|
1031
|
-
return formattedRow;
|
|
1032
|
-
}, {});
|
|
1033
|
-
}));
|
|
1034
|
-
setColumns(processedFields);
|
|
1027
|
+
let tempRows = [...rows, ...tableInfo.rows];
|
|
1028
|
+
if (resetRows) {
|
|
1029
|
+
tempRows = tableInfo.rows;
|
|
1030
|
+
}
|
|
1031
|
+
setRows(tempRows);
|
|
1032
|
+
setFormattedRows(formatRowsFromReport({ rows: tempRows, columns: tableInfo.columns }));
|
|
1033
|
+
setColumns(tableInfo.columns);
|
|
1035
1034
|
setTableLoading(false);
|
|
1036
1035
|
}
|
|
1037
1036
|
catch (e) {
|
|
1038
1037
|
setTableLoading(false);
|
|
1039
|
-
|
|
1038
|
+
setErrorMessage('Failed to run SQL query: ' + e);
|
|
1039
|
+
setRows([]);
|
|
1040
|
+
setColumns([]);
|
|
1040
1041
|
return;
|
|
1041
1042
|
}
|
|
1042
1043
|
};
|
|
@@ -1055,10 +1056,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1055
1056
|
case 'binary_expr':
|
|
1056
1057
|
if (dateComparisonPartialMatch ||
|
|
1057
1058
|
(isDateTruncEquals(node) && client.databaseType !== 'BigQuery')) {
|
|
1058
|
-
const { dateColumn,
|
|
1059
|
-
// see onChange callback handleChange
|
|
1060
|
-
// eslint-disable-next-line no-unused-vars
|
|
1061
|
-
dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
|
|
1059
|
+
const { dateColumn, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
|
|
1062
1060
|
const isPlural = intervalCount !== 1 && dateFilterType !== 'in the current'
|
|
1063
1061
|
? 's'
|
|
1064
1062
|
: '';
|
|
@@ -1206,7 +1204,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1206
1204
|
} }))] }));
|
|
1207
1205
|
}
|
|
1208
1206
|
else if (isInTheLastInterval(node, client.databaseType)) {
|
|
1209
|
-
const { dateColumn
|
|
1207
|
+
const { dateColumn } = getDateFilterInfo(node);
|
|
1210
1208
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1211
1209
|
label: snakeAndCamelCaseToTitleCase(column.displayName),
|
|
1212
1210
|
value: column.name,
|
|
@@ -1267,7 +1265,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1267
1265
|
], width: 200 }) })] }));
|
|
1268
1266
|
}
|
|
1269
1267
|
else if (isTheCurrentInterval(node, client.databaseType)) {
|
|
1270
|
-
const { dateFilterType } = getDateFilterInfo(node);
|
|
1271
1268
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1272
1269
|
label: snakeAndCamelCaseToTitleCase(column.displayName),
|
|
1273
1270
|
value: column.name,
|
|
@@ -1326,7 +1323,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1326
1323
|
{ label: `week`, value: 'WEEK' },
|
|
1327
1324
|
], width: 200 })] }));
|
|
1328
1325
|
}
|
|
1329
|
-
else if (isThePreviousInterval(node
|
|
1326
|
+
else if (isThePreviousInterval(node)) {
|
|
1330
1327
|
const options = getAllPossibleColumns().map((column) => ({
|
|
1331
1328
|
label: snakeAndCamelCaseToTitleCase(column.displayName),
|
|
1332
1329
|
value: column.name,
|
|
@@ -1473,7 +1470,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1473
1470
|
.find((tableInfo) => tableInfo.name === table)
|
|
1474
1471
|
?.columns.find((col) => col.name === leftChildValue);
|
|
1475
1472
|
const columnType = column?.fieldType;
|
|
1476
|
-
|
|
1473
|
+
const operatorOptions = [
|
|
1477
1474
|
...(isNumericColumnType(columnType)
|
|
1478
1475
|
? [
|
|
1479
1476
|
{ label: 'equal to', value: '=' },
|
|
@@ -1714,112 +1711,214 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1714
1711
|
}
|
|
1715
1712
|
return validPivot;
|
|
1716
1713
|
};
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
let
|
|
1726
|
-
let
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1714
|
+
/**
|
|
1715
|
+
*
|
|
1716
|
+
* @param filterTree
|
|
1717
|
+
* Returns a list of filters to be displayed
|
|
1718
|
+
* Replaces the functionality of renderNodes in the context of filters
|
|
1719
|
+
* Contains filterSentence, which replaces renderSentence
|
|
1720
|
+
*/
|
|
1721
|
+
const renderFilters = (filterTree) => {
|
|
1722
|
+
let tree = filterTree;
|
|
1723
|
+
let filterStack = [];
|
|
1724
|
+
/**
|
|
1725
|
+
* Function that takes in a FilterTree and flattens it into an array using in order traversal
|
|
1726
|
+
*/
|
|
1727
|
+
function traverseTree(node) {
|
|
1728
|
+
if (!node) {
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1731
|
+
if (node.leaf) {
|
|
1732
|
+
filterStack.push(node);
|
|
1733
|
+
}
|
|
1734
|
+
else {
|
|
1735
|
+
traverseTree(node.leftNode);
|
|
1736
|
+
filterStack.push(node);
|
|
1737
|
+
traverseTree(node.rightNode);
|
|
1738
|
+
}
|
|
1730
1739
|
}
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
'
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
'
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
'IS NOT': 'is not',
|
|
1750
|
-
IS: 'is',
|
|
1751
|
-
};
|
|
1752
|
-
switch (node.type) {
|
|
1753
|
-
case 'binary_expr':
|
|
1754
|
-
return (_jsx(TagWrapper, { keyPrefix: keyPrefix, formData: formData, activeEditItem: activeEditItem, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setCheckboxes: setCheckboxes, handleReplaceSubtree: handleReplaceSubtree, FilterPopover: FilterPopoverComponent, setActivePath: setActivePath, setOpenPopover: setOpenPopover, setIsPending: setIsPending, clearCheckboxes: clearCheckboxes, handleDelete: handleDelete, editPopoverKey: editPopoverKey, isCard: isCard, isRow: isRow, getByKey: getByKey, EditPopover: EditPopover, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, renderNode: renderNode, children: dateComparisonPartialMatch ??
|
|
1755
|
-
dateEqualityPartialMatch ??
|
|
1756
|
-
uniqueSentence ?? (_jsxs(_Fragment, { children: [node.left &&
|
|
1757
|
-
renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: SelectComponent })) : null, node.right &&
|
|
1758
|
-
renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
|
|
1759
|
-
case 'column_ref':
|
|
1760
|
-
return snakeAndCamelCaseToTitleCase(node.column);
|
|
1761
|
-
case 'expr_list':
|
|
1762
|
-
if (node.value.length === 1) {
|
|
1763
|
-
const subQuery = renderSentence(formData, node.value[0]);
|
|
1764
|
-
if (subQuery) {
|
|
1765
|
-
return `${subQuery}`;
|
|
1766
|
-
}
|
|
1767
|
-
return '()';
|
|
1740
|
+
/**
|
|
1741
|
+
* Returns a sentence to describe a Filter
|
|
1742
|
+
*/
|
|
1743
|
+
function filterSentence(filter) {
|
|
1744
|
+
let value = '';
|
|
1745
|
+
if (filter.name == FilterNames.NullFilter) {
|
|
1746
|
+
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}`;
|
|
1747
|
+
}
|
|
1748
|
+
else if (filter.value === null || filter.value === undefined) {
|
|
1749
|
+
return 'Error: filter missing value';
|
|
1750
|
+
}
|
|
1751
|
+
if (typeof filter.value === 'string' ||
|
|
1752
|
+
typeof filter.value === 'number') {
|
|
1753
|
+
value = filter.value.toString();
|
|
1754
|
+
}
|
|
1755
|
+
else if ('unit' in filter.value) {
|
|
1756
|
+
if (filter.operator === DateOperator.InTheCurrent) {
|
|
1757
|
+
value = `${filter.value.unit}`;
|
|
1768
1758
|
}
|
|
1769
|
-
|
|
1770
|
-
.
|
|
1771
|
-
.join(', ')}`;
|
|
1772
|
-
case 'single_quote_string':
|
|
1773
|
-
return node.value.replaceAll('%', '');
|
|
1774
|
-
case 'double_quote_string':
|
|
1775
|
-
case 'number':
|
|
1776
|
-
return node.value;
|
|
1777
|
-
case 'null':
|
|
1778
|
-
return 'null';
|
|
1779
|
-
case 'bool':
|
|
1780
|
-
return node.value.toString();
|
|
1781
|
-
case 'interval':
|
|
1782
|
-
if (node.unit) {
|
|
1783
|
-
// eg. `INTERVAL '90' DAY` -> "90 days"
|
|
1784
|
-
return `${node.expr.value} ${node.unit}s`;
|
|
1759
|
+
else {
|
|
1760
|
+
value = `${filter.value.value} ${filter.value.unit}${filter.value.value === 1 ? '' : 's'}`;
|
|
1785
1761
|
}
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1762
|
+
}
|
|
1763
|
+
else if ('startDate' in filter.value) {
|
|
1764
|
+
value = `from ${filter.value.startDate}`;
|
|
1765
|
+
}
|
|
1766
|
+
else if (filter.value.length > 0) {
|
|
1767
|
+
value = filter.value.join(', ');
|
|
1768
|
+
}
|
|
1769
|
+
return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator} ${value}`;
|
|
1770
|
+
}
|
|
1771
|
+
/**
|
|
1772
|
+
* Given an array of Filters (presumed to be in in-order state), generate
|
|
1773
|
+
* the corresponding Filter tree. Essentially the reverse of what traverseTree does
|
|
1774
|
+
*/
|
|
1775
|
+
function filterStackToFilterTree(stack) {
|
|
1776
|
+
function buildTree(i) {
|
|
1777
|
+
const newNode = {
|
|
1778
|
+
leaf: false,
|
|
1779
|
+
operator: null,
|
|
1780
|
+
leftNode: null,
|
|
1781
|
+
rightNode: null,
|
|
1782
|
+
};
|
|
1783
|
+
if (i >= stack.length) {
|
|
1801
1784
|
return null;
|
|
1802
1785
|
}
|
|
1803
|
-
if (
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1786
|
+
else if (stack[i].leaf) {
|
|
1787
|
+
if (i < stack.length - 1) {
|
|
1788
|
+
// more nodes later
|
|
1789
|
+
newNode.operator = stack[i + 1].operator;
|
|
1790
|
+
newNode.leftNode = {
|
|
1791
|
+
leaf: true,
|
|
1792
|
+
leftNode: null,
|
|
1793
|
+
rightNode: null,
|
|
1794
|
+
operator: null,
|
|
1795
|
+
value: stack[i].value,
|
|
1796
|
+
};
|
|
1797
|
+
newNode.rightNode = buildTree(i + 2);
|
|
1798
|
+
}
|
|
1799
|
+
else {
|
|
1800
|
+
newNode.leaf = true;
|
|
1801
|
+
newNode.value = stack[i].value;
|
|
1802
|
+
}
|
|
1818
1803
|
}
|
|
1819
|
-
return
|
|
1820
|
-
|
|
1821
|
-
|
|
1804
|
+
return newNode;
|
|
1805
|
+
}
|
|
1806
|
+
return buildTree(0);
|
|
1822
1807
|
}
|
|
1808
|
+
traverseTree(tree);
|
|
1809
|
+
// Remove null (invalid) filters from filter stack
|
|
1810
|
+
filterStack = filterStack.filter((filter) => {
|
|
1811
|
+
return ((!filter.leaf &&
|
|
1812
|
+
filter.rightNode &&
|
|
1813
|
+
(!filter.rightNode.leaf || filter.rightNode.value)) ||
|
|
1814
|
+
(filter.leaf && filter.value));
|
|
1815
|
+
});
|
|
1816
|
+
// Render filterStack
|
|
1817
|
+
return (_jsx("div", { style: {
|
|
1818
|
+
display: 'flex',
|
|
1819
|
+
flexDirection: 'column',
|
|
1820
|
+
}, children: filterStack.map((item, index) => {
|
|
1821
|
+
if (!item.leaf &&
|
|
1822
|
+
(item.operator === 'and' || item.operator === 'or')) {
|
|
1823
|
+
return (_jsx("div", { style: {
|
|
1824
|
+
width: 'fit-content',
|
|
1825
|
+
marginBottom: '8px',
|
|
1826
|
+
marginTop: '8px',
|
|
1827
|
+
}, children: _jsx(TabsComponent, { value: item.operator.toUpperCase(), options: DEFAULT_TAB_OPTIONS, onChange: () => {
|
|
1828
|
+
if (item.operator === 'and') {
|
|
1829
|
+
item.operator = 'or';
|
|
1830
|
+
}
|
|
1831
|
+
else {
|
|
1832
|
+
item.operator = 'and';
|
|
1833
|
+
}
|
|
1834
|
+
let newFormData = null;
|
|
1835
|
+
if (tree) {
|
|
1836
|
+
newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
|
|
1837
|
+
}
|
|
1838
|
+
const newAst = deepCopy({
|
|
1839
|
+
...defaultAST,
|
|
1840
|
+
...baseAst,
|
|
1841
|
+
...(!baseAst?.columns && {
|
|
1842
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1843
|
+
const newColumn = deepCopy(defaultColumn);
|
|
1844
|
+
newColumn.expr.column = c.name;
|
|
1845
|
+
return newColumn;
|
|
1846
|
+
}),
|
|
1847
|
+
}),
|
|
1848
|
+
...(!baseAst?.from && {
|
|
1849
|
+
from: [{ ...defaultTable, table: initialTableName }],
|
|
1850
|
+
}),
|
|
1851
|
+
where: newFormData,
|
|
1852
|
+
});
|
|
1853
|
+
setBaseAst(newAst);
|
|
1854
|
+
setFormData(newFormData);
|
|
1855
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1856
|
+
} }) }, index));
|
|
1857
|
+
}
|
|
1858
|
+
else {
|
|
1859
|
+
return (_jsx("div", { children: _jsx(FilterPopoverWrapper, { schema: schema.find((s) => s.name === currentTable ||
|
|
1860
|
+
s.displayName === currentTable) ?? schema[0], filter: item.value, filterLabel: item.value ? filterSentence(item.value) : '', index: index, openFilterIndex: openFilterIndex, setOpenFilterIndex: setOpenFilterIndex, FilterPopover: FilterPopoverComponent, FilterModal: FilterModal, fieldValuesMap: fieldValuesMap, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (filter) => {
|
|
1861
|
+
item.value = filter;
|
|
1862
|
+
let newFormData = null;
|
|
1863
|
+
if (tree) {
|
|
1864
|
+
newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
|
|
1865
|
+
}
|
|
1866
|
+
const newAst = deepCopy({
|
|
1867
|
+
...defaultAST,
|
|
1868
|
+
...baseAst,
|
|
1869
|
+
...(!baseAst?.columns && {
|
|
1870
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1871
|
+
const newColumn = deepCopy(defaultColumn);
|
|
1872
|
+
newColumn.expr.column = c.name;
|
|
1873
|
+
return newColumn;
|
|
1874
|
+
}),
|
|
1875
|
+
}),
|
|
1876
|
+
...(!baseAst?.from && {
|
|
1877
|
+
from: [{ ...defaultTable, table: initialTableName }],
|
|
1878
|
+
}),
|
|
1879
|
+
where: newFormData,
|
|
1880
|
+
});
|
|
1881
|
+
setBaseAst(newAst);
|
|
1882
|
+
setFormData(newFormData);
|
|
1883
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1884
|
+
}, handleFilterDelete: (i) => {
|
|
1885
|
+
if (i > 0) {
|
|
1886
|
+
filterStack.splice(i - 1, 2);
|
|
1887
|
+
}
|
|
1888
|
+
else {
|
|
1889
|
+
if (filterStack.length > 1) {
|
|
1890
|
+
filterStack.splice(i, 2);
|
|
1891
|
+
}
|
|
1892
|
+
else {
|
|
1893
|
+
filterStack.splice(i, 1);
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
tree = filterStackToFilterTree(filterStack);
|
|
1897
|
+
let newFormData = null;
|
|
1898
|
+
if (tree) {
|
|
1899
|
+
newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
|
|
1900
|
+
}
|
|
1901
|
+
const newAst = deepCopy({
|
|
1902
|
+
...defaultAST,
|
|
1903
|
+
...baseAst,
|
|
1904
|
+
...(!baseAst?.columns && {
|
|
1905
|
+
columns: getAllPossibleColumns().map((c) => {
|
|
1906
|
+
const newColumn = deepCopy(defaultColumn);
|
|
1907
|
+
newColumn.expr.column = c.name;
|
|
1908
|
+
return newColumn;
|
|
1909
|
+
}),
|
|
1910
|
+
}),
|
|
1911
|
+
...(!baseAst?.from && {
|
|
1912
|
+
from: [{ ...defaultTable, table: initialTableName }],
|
|
1913
|
+
}),
|
|
1914
|
+
where: newFormData,
|
|
1915
|
+
});
|
|
1916
|
+
setBaseAst(newAst);
|
|
1917
|
+
setFormData(newFormData);
|
|
1918
|
+
fetchSqlQuery(newAst, newFormData);
|
|
1919
|
+
} }) }, index));
|
|
1920
|
+
}
|
|
1921
|
+
}) }));
|
|
1823
1922
|
};
|
|
1824
1923
|
const getAllPossibleColumns = () => {
|
|
1825
1924
|
if (!baseAst || !baseAst.from) {
|
|
@@ -1861,7 +1960,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1861
1960
|
if (selectedColumns.length < 1)
|
|
1862
1961
|
return false;
|
|
1863
1962
|
const allColumns = orderedColumnNames.filter((row) => {
|
|
1864
|
-
const [table
|
|
1963
|
+
const [table] = row.split('.');
|
|
1865
1964
|
const selectedTable = selectedColumns[0].split('.')[0];
|
|
1866
1965
|
return selectedTable === table;
|
|
1867
1966
|
});
|
|
@@ -1907,23 +2006,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1907
2006
|
customFields,
|
|
1908
2007
|
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
1909
2008
|
useUpdatedDataGathering: true,
|
|
2009
|
+
useNewNodeSql: true, // new flag
|
|
1910
2010
|
},
|
|
1911
2011
|
};
|
|
1912
|
-
const cloudBody = {};
|
|
1913
|
-
const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
1914
|
-
if (data2.success === false) {
|
|
1915
|
-
throw new Error(data2.errorMessage);
|
|
1916
|
-
}
|
|
1917
|
-
rows = data2.rows;
|
|
1918
|
-
if (data2.rowCount) {
|
|
1919
|
-
setNumberOfRows(data2.rowCount);
|
|
1920
|
-
}
|
|
1921
2012
|
const tables = getTableNames(baseAst);
|
|
1922
2013
|
const table = tables.length >= 1 ? tables[0] : initialTableName;
|
|
1923
2014
|
let newUniqueValues = uniqueValues;
|
|
1924
2015
|
let dateRangesTemp = dateRanges;
|
|
1925
|
-
let curReport =
|
|
1926
|
-
if (
|
|
2016
|
+
let curReport = tempReport;
|
|
2017
|
+
if ((newUniqueValues && Object.keys(newUniqueValues).length === 0) ||
|
|
2018
|
+
table !== currentTable) {
|
|
1927
2019
|
const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
|
|
1928
2020
|
if (tableInfo) {
|
|
1929
2021
|
newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
@@ -1935,6 +2027,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1935
2027
|
}
|
|
1936
2028
|
setCurrentTable(table);
|
|
1937
2029
|
}
|
|
2030
|
+
const cloudBody = {};
|
|
2031
|
+
const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
|
|
2032
|
+
if (data2.success === false) {
|
|
2033
|
+
throw new Error(data2.errorMessage);
|
|
2034
|
+
}
|
|
2035
|
+
rows = data2.rows;
|
|
2036
|
+
if (data2.rowCount) {
|
|
2037
|
+
setNumberOfRows(data2.rowCount);
|
|
2038
|
+
}
|
|
1938
2039
|
if (data2.rows && data2.rows.length) {
|
|
1939
2040
|
if (pivot) {
|
|
1940
2041
|
// check if any of the pivot fields aren't in the data2.fields array
|
|
@@ -1964,13 +2065,14 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1964
2065
|
setFormattedRows(formattedRows);
|
|
1965
2066
|
return;
|
|
1966
2067
|
}
|
|
2068
|
+
curReport = {
|
|
2069
|
+
...formData,
|
|
2070
|
+
itemQuery: data2.itemQuery,
|
|
2071
|
+
rowCount: data2.rowCount,
|
|
2072
|
+
filtersApplied: [],
|
|
2073
|
+
rows: data2.rows,
|
|
2074
|
+
};
|
|
1967
2075
|
// Do all of this to make sure we have the right unique columns when applying a pivot
|
|
1968
|
-
let uniqueFormatted = {};
|
|
1969
|
-
const uniqueRecords = Array.from(new Set(data2.rows.map((row) => row[pivot.columnField]))).reduce((acc, curr) => {
|
|
1970
|
-
acc[curr] = false;
|
|
1971
|
-
return acc;
|
|
1972
|
-
}, {});
|
|
1973
|
-
uniqueFormatted[pivot.columnField] = uniqueRecords;
|
|
1974
2076
|
let dateBucket = undefined;
|
|
1975
2077
|
const tempDateRange = dateRangesTemp &&
|
|
1976
2078
|
pivot.rowField &&
|
|
@@ -1978,9 +2080,20 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
1978
2080
|
if (tempDateRange) {
|
|
1979
2081
|
dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
|
|
1980
2082
|
}
|
|
2083
|
+
let distinctValuesForQuery = {};
|
|
2084
|
+
if (pivot.columnField) {
|
|
2085
|
+
const sqlQuery = await fetchSqlQuery({ ...baseAst, where: curFormData }, null, false);
|
|
2086
|
+
distinctValuesForQuery = await getUniqueValuesByColumns([
|
|
2087
|
+
{
|
|
2088
|
+
field: pivot.columnField,
|
|
2089
|
+
label: pivot.columnField,
|
|
2090
|
+
format: 'string',
|
|
2091
|
+
},
|
|
2092
|
+
], sqlQuery, [], client, customFields);
|
|
2093
|
+
}
|
|
1981
2094
|
const pivotedData = await generatePivotTable(
|
|
1982
2095
|
// @ts-ignore
|
|
1983
|
-
pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client,
|
|
2096
|
+
pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, distinctValuesForQuery ? distinctValuesForQuery : undefined);
|
|
1984
2097
|
console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
|
|
1985
2098
|
const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
|
|
1986
2099
|
setPivotData(pivotedData);
|
|
@@ -2042,105 +2155,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2042
2155
|
setFormattedRows([]);
|
|
2043
2156
|
setPivotData(null);
|
|
2044
2157
|
}
|
|
2158
|
+
setLoading(false);
|
|
2159
|
+
setDataDisplayed(true);
|
|
2160
|
+
return rows;
|
|
2045
2161
|
}
|
|
2046
2162
|
catch (e) {
|
|
2047
|
-
console.error(e);
|
|
2048
2163
|
setErrorMessage(e.message);
|
|
2049
|
-
}
|
|
2050
|
-
finally {
|
|
2051
2164
|
setLoading(false);
|
|
2052
2165
|
setDataDisplayed(true);
|
|
2053
|
-
|
|
2166
|
+
setRows([]);
|
|
2167
|
+
setColumns([]);
|
|
2168
|
+
setFormattedRows([]);
|
|
2169
|
+
setPivotData(null);
|
|
2170
|
+
return { error: true, message: e.message };
|
|
2054
2171
|
}
|
|
2055
2172
|
}
|
|
2056
2173
|
};
|
|
2057
|
-
// Convert an array of columns to a map where the name is the
|
|
2058
|
-
// key and the value is the column node.
|
|
2059
|
-
const columnArrayToMap = (columns) => {
|
|
2060
|
-
const columnMap = {};
|
|
2061
|
-
for (const col of columns) {
|
|
2062
|
-
const key = col.expr?.value ?? col.expr?.column ?? col.as;
|
|
2063
|
-
columnMap[key] = col;
|
|
2064
|
-
}
|
|
2065
|
-
return columnMap;
|
|
2066
|
-
};
|
|
2067
|
-
const applyFormatting = (response, columns) => {
|
|
2068
|
-
const columnFormatters = {};
|
|
2069
|
-
const columnMap = columnArrayToMap(columns);
|
|
2070
|
-
response.fields.forEach((field) => {
|
|
2071
|
-
// TODO: columnMap[field.name] silently breaks for columnField columns
|
|
2072
|
-
const formatType = getPostgresBasicType(field);
|
|
2073
|
-
if (formatType === 'date') {
|
|
2074
|
-
columnFormatters[field.name] = (x) => {
|
|
2075
|
-
const d = new Date(x);
|
|
2076
|
-
// check if d is a valid date
|
|
2077
|
-
if (isNaN(d.getTime())) {
|
|
2078
|
-
return 'Invalid Date';
|
|
2079
|
-
}
|
|
2080
|
-
d.setMinutes(d.getMinutes() + d.getTimezoneOffset()); // TZ adjust
|
|
2081
|
-
if (columnMap[field.name]?.expr.type === 'function' &&
|
|
2082
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
2083
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
2084
|
-
'month') {
|
|
2085
|
-
return d.toLocaleString('default', {
|
|
2086
|
-
month: 'short',
|
|
2087
|
-
year: 'numeric',
|
|
2088
|
-
});
|
|
2089
|
-
}
|
|
2090
|
-
else if (columnMap[field.name]?.expr.type === 'function' &&
|
|
2091
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
2092
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
2093
|
-
'quarter') {
|
|
2094
|
-
return `Q${getQuarter(d)} ${d.getFullYear()}`;
|
|
2095
|
-
}
|
|
2096
|
-
else if (columnMap[field.name]?.expr.type === 'function' &&
|
|
2097
|
-
columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
|
|
2098
|
-
columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
|
|
2099
|
-
'year') {
|
|
2100
|
-
return d.toLocaleString('default', {
|
|
2101
|
-
year: 'numeric',
|
|
2102
|
-
});
|
|
2103
|
-
}
|
|
2104
|
-
return DATE_FMT.format(d);
|
|
2105
|
-
};
|
|
2106
|
-
}
|
|
2107
|
-
else if (formatType === 'number') {
|
|
2108
|
-
columnFormatters[field.name] = (x) => {
|
|
2109
|
-
if (columnMap[field.name]?.expr.type === 'extract' &&
|
|
2110
|
-
columnMap[field.name]?.expr.args.field.toLowerCase() === 'dow') {
|
|
2111
|
-
return DAY_OF_WEEK[x];
|
|
2112
|
-
}
|
|
2113
|
-
else if (columnMap[field.name]?.expr.type === 'extract' &&
|
|
2114
|
-
columnMap[field.name]?.expr.args.field.toLowerCase() === 'month') {
|
|
2115
|
-
return MONTH_OF_YEAR[x - 1];
|
|
2116
|
-
}
|
|
2117
|
-
else if (`${x}`.includes('.')) {
|
|
2118
|
-
// return MONEY_FMT.format(Number(x ?? 0.0));
|
|
2119
|
-
return Number(x ?? 0.0).toFixed(2);
|
|
2120
|
-
}
|
|
2121
|
-
return x ?? 0.0;
|
|
2122
|
-
};
|
|
2123
|
-
}
|
|
2124
|
-
else if (formatType === 'boolean') {
|
|
2125
|
-
columnFormatters[field.name] = (x) => {
|
|
2126
|
-
if (x) {
|
|
2127
|
-
return 'True';
|
|
2128
|
-
}
|
|
2129
|
-
return 'False';
|
|
2130
|
-
};
|
|
2131
|
-
}
|
|
2132
|
-
else {
|
|
2133
|
-
columnFormatters[field.name] = (x) => x;
|
|
2134
|
-
}
|
|
2135
|
-
});
|
|
2136
|
-
return response.rows.map((row) => {
|
|
2137
|
-
const newRow = {};
|
|
2138
|
-
Object.keys(row).forEach((key) => (newRow[key] = columnFormatters[key]
|
|
2139
|
-
? columnFormatters[key](row[key])
|
|
2140
|
-
: row[key]));
|
|
2141
|
-
return newRow;
|
|
2142
|
-
});
|
|
2143
|
-
};
|
|
2144
2174
|
// Returns whether a where-clause contains a nested subquery.
|
|
2145
2175
|
const isSubquery = (node) => {
|
|
2146
2176
|
if (!node)
|
|
@@ -2164,7 +2194,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2164
2194
|
return;
|
|
2165
2195
|
}
|
|
2166
2196
|
try {
|
|
2167
|
-
let errored = false;
|
|
2168
2197
|
setLoading(true);
|
|
2169
2198
|
setAskedAQuestion(true);
|
|
2170
2199
|
setErrorMessage('');
|
|
@@ -2184,6 +2213,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2184
2213
|
body: JSON.stringify({
|
|
2185
2214
|
initialQuestion: aiPrompt || overridePrompt,
|
|
2186
2215
|
publicKey: client.publicKey,
|
|
2216
|
+
useNewNodeSql: true, // new flag
|
|
2187
2217
|
}),
|
|
2188
2218
|
});
|
|
2189
2219
|
}
|
|
@@ -2195,6 +2225,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2195
2225
|
sqlQuery: activeQuery,
|
|
2196
2226
|
initialQuestion: aiPrompt,
|
|
2197
2227
|
publicKey: client.publicKey,
|
|
2228
|
+
useNewNodeSql: true, // new flag
|
|
2198
2229
|
}),
|
|
2199
2230
|
});
|
|
2200
2231
|
}
|
|
@@ -2212,31 +2243,33 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2212
2243
|
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2213
2244
|
return;
|
|
2214
2245
|
}
|
|
2246
|
+
let currentSchema = schema;
|
|
2247
|
+
if (currentSchema && currentSchema.length === 0) {
|
|
2248
|
+
currentSchema = await fetchSchema();
|
|
2249
|
+
}
|
|
2215
2250
|
let newAst, groupByPivot;
|
|
2216
2251
|
if (ast) {
|
|
2217
2252
|
// Unwrap the ast object, supporting many possible types
|
|
2218
2253
|
ast = ast.length ? ast[0] : ast;
|
|
2219
2254
|
newAst = convertBigQuery(ast);
|
|
2220
|
-
newAst = convertWildcardColumns(newAst,
|
|
2221
|
-
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot,
|
|
2222
|
-
if (groupByPivot && !groupByPivot?.valueField) {
|
|
2223
|
-
setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
|
|
2224
|
-
return;
|
|
2225
|
-
}
|
|
2255
|
+
newAst = convertWildcardColumns(newAst, currentSchema); // must go before groupby
|
|
2256
|
+
({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, currentSchema));
|
|
2226
2257
|
newAst = convertStringComparison(newAst, client.databaseType);
|
|
2227
2258
|
newAst = convertRemoveSimpleParentheses(newAst);
|
|
2228
2259
|
const table = getTableNames(newAst)[0] ?? initialTableName;
|
|
2229
2260
|
const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
|
|
2230
2261
|
newAst = removeNonSelectedTableReferences(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
|
|
2231
|
-
|
|
2262
|
+
const procesedColumns = deepCopy(newAst).columns?.map((column) => {
|
|
2232
2263
|
if (column.expr.type === 'column_ref') {
|
|
2233
|
-
|
|
2264
|
+
const columnName = extractColumnish(column.expr);
|
|
2265
|
+
return `${table}.${columnName}`;
|
|
2234
2266
|
}
|
|
2235
2267
|
else if (column.as) {
|
|
2236
2268
|
return `${table}.${column.as}`;
|
|
2237
2269
|
}
|
|
2238
2270
|
return `${table}.${column.expr.value}`;
|
|
2239
|
-
})
|
|
2271
|
+
});
|
|
2272
|
+
setSelectedColumns(procesedColumns);
|
|
2240
2273
|
if (groupByPivot) {
|
|
2241
2274
|
setBaseAst(deepCopy({ ...newAst, orderby: null, limit: null }));
|
|
2242
2275
|
newAst = deepCopy({ ...newAst, orderby: null, limit: null });
|
|
@@ -2252,7 +2285,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2252
2285
|
ast = newAst; // so we fetch data for newAst later.
|
|
2253
2286
|
fetchSqlQuery(ast, undefined, false);
|
|
2254
2287
|
const table = getTableNames(newAst)[0] ?? initialTableName;
|
|
2255
|
-
const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
|
|
2256
2288
|
const hostedBody = {
|
|
2257
2289
|
metadata: {
|
|
2258
2290
|
clientId: client.publicKey,
|
|
@@ -2263,19 +2295,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2263
2295
|
additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
|
|
2264
2296
|
useUpdatedDataGathering: true,
|
|
2265
2297
|
pivot: groupByPivot,
|
|
2298
|
+
useNewNodeSql: true, // new flag
|
|
2266
2299
|
},
|
|
2267
2300
|
};
|
|
2268
|
-
const cloudBody = {};
|
|
2269
|
-
const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2270
|
-
if (data2.status === 'error') {
|
|
2271
|
-
throw new Error('Error querying data from patterns');
|
|
2272
|
-
}
|
|
2273
2301
|
let currentUniqueValues = uniqueValues;
|
|
2274
2302
|
let dateRangesTemp = dateRanges;
|
|
2275
|
-
if (
|
|
2276
|
-
|
|
2303
|
+
if ((currentUniqueValues &&
|
|
2304
|
+
currentUniqueValues[table] &&
|
|
2305
|
+
Object.keys(currentUniqueValues[table]).length === 0) ||
|
|
2306
|
+
table !== currentTable) {
|
|
2307
|
+
const tableInfo = currentSchema.find((tableInfo) => tableInfo.name === table);
|
|
2277
2308
|
if (tableInfo) {
|
|
2278
2309
|
const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
|
|
2310
|
+
currentUniqueValues = newUniqueValues;
|
|
2279
2311
|
if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
2280
2312
|
setUniqueValues(newUniqueValues);
|
|
2281
2313
|
}
|
|
@@ -2284,8 +2316,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2284
2316
|
}
|
|
2285
2317
|
setCurrentTable(table);
|
|
2286
2318
|
}
|
|
2319
|
+
const cloudBody = {};
|
|
2320
|
+
const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
|
|
2321
|
+
if (!data2 || data2.status === 'error') {
|
|
2322
|
+
throw new Error('Error querying data from patterns');
|
|
2323
|
+
}
|
|
2287
2324
|
if (data2.rows && data2.rows.length) {
|
|
2288
|
-
const processedFields = data2.fields
|
|
2325
|
+
const processedFields = data2.fields
|
|
2326
|
+
.map((elem) => convertPostgresColumn(elem))
|
|
2327
|
+
.map((elem) => {
|
|
2328
|
+
const tableInfo = currentSchema.find((t) => t.name === table);
|
|
2329
|
+
const columnInfo = tableInfo?.columns.find((column) => column.name === elem.field);
|
|
2330
|
+
return columnInfo
|
|
2331
|
+
? convertColumnInfoToColumnInternal(columnInfo)
|
|
2332
|
+
: null;
|
|
2333
|
+
})
|
|
2334
|
+
.filter((elem) => elem);
|
|
2289
2335
|
let possiblePivot = true;
|
|
2290
2336
|
const possibleColumns = getPossiblePivotFieldOptions(processedFields, currentUniqueValues[table]);
|
|
2291
2337
|
if (groupByPivot &&
|
|
@@ -2299,7 +2345,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2299
2345
|
let errorMessageEnding = '';
|
|
2300
2346
|
if (groupByPivot.columnField &&
|
|
2301
2347
|
!possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
|
|
2302
|
-
if (currentUniqueValues[table][groupByPivot?.columnField || '']) {
|
|
2348
|
+
if (currentUniqueValues[table]?.[groupByPivot?.columnField || '']) {
|
|
2303
2349
|
errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
|
|
2304
2350
|
}
|
|
2305
2351
|
else {
|
|
@@ -2308,7 +2354,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2308
2354
|
}
|
|
2309
2355
|
else if (groupByPivot.rowField &&
|
|
2310
2356
|
!possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
|
|
2311
|
-
if (currentUniqueValues[table][groupByPivot?.rowField || '']) {
|
|
2357
|
+
if (currentUniqueValues[table]?.[groupByPivot?.rowField || '']) {
|
|
2312
2358
|
errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
|
|
2313
2359
|
}
|
|
2314
2360
|
else {
|
|
@@ -2320,7 +2366,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2320
2366
|
errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
|
|
2321
2367
|
}
|
|
2322
2368
|
setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
|
|
2323
|
-
errored = true;
|
|
2324
2369
|
}
|
|
2325
2370
|
if (groupByPivot && possiblePivot) {
|
|
2326
2371
|
let curReport = report ? report : undefined;
|
|
@@ -2397,7 +2442,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2397
2442
|
setActiveQuery('');
|
|
2398
2443
|
}
|
|
2399
2444
|
if (data2.errorMessage) {
|
|
2400
|
-
setErrorMessage(`Error:
|
|
2445
|
+
setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
|
|
2401
2446
|
}
|
|
2402
2447
|
}
|
|
2403
2448
|
catch (e) {
|
|
@@ -2417,7 +2462,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2417
2462
|
setSelectedColumns((selectedColumns) => selectedColumns.filter((column) => !column.endsWith(name)));
|
|
2418
2463
|
const columns = baseAst.columns.filter((col) => {
|
|
2419
2464
|
if (col.expr.type === 'column_ref') {
|
|
2420
|
-
return col.expr.column !== name
|
|
2465
|
+
return (col.expr.column !== name &&
|
|
2466
|
+
(!col.expr.column.expr || col.expr.column.expr.value !== name));
|
|
2421
2467
|
}
|
|
2422
2468
|
else if (col.as) {
|
|
2423
2469
|
return col.as !== name;
|
|
@@ -2432,14 +2478,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2432
2478
|
setBaseAst(newAst);
|
|
2433
2479
|
fetchSqlQuery(newAst);
|
|
2434
2480
|
};
|
|
2435
|
-
function TopLevelBooleanSwitch({ node, keyPrefix, handleOperatorChange, }) {
|
|
2436
|
-
return (_jsx("div", { style: { width: 'fit-content' }, children: _jsx(TabsComponent, { value: node.operator, options: DEFAULT_TAB_OPTIONS, onChange: (event) => {
|
|
2437
|
-
if (loading) {
|
|
2438
|
-
return;
|
|
2439
|
-
}
|
|
2440
|
-
handleOperatorChange(event.target.value, node, keyPrefix);
|
|
2441
|
-
} }) }));
|
|
2442
|
-
}
|
|
2443
2481
|
const DraggableItem = ({ id, label, onDelete }) => {
|
|
2444
2482
|
const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: id });
|
|
2445
2483
|
const style = {
|
|
@@ -2466,7 +2504,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2466
2504
|
setOrderedColumnNames(newOrder);
|
|
2467
2505
|
const orderedSelectedColumns = [];
|
|
2468
2506
|
for (const value of newOrder) {
|
|
2469
|
-
const
|
|
2507
|
+
const column = value.split('.')[1];
|
|
2470
2508
|
if (selectedColumns.includes(value)) {
|
|
2471
2509
|
orderedSelectedColumns.push(column);
|
|
2472
2510
|
}
|
|
@@ -2490,12 +2528,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2490
2528
|
fetchSqlQuery(newAst, undefined, false);
|
|
2491
2529
|
}
|
|
2492
2530
|
}
|
|
2493
|
-
const columnNamesInAst = baseAst?.columns
|
|
2494
|
-
|
|
2495
|
-
|
|
2531
|
+
const columnNamesInAst = baseAst?.columns
|
|
2532
|
+
.map((col) => {
|
|
2533
|
+
if (col.expr.type === 'column_ref' && col.expr.column) {
|
|
2534
|
+
if (typeof col.expr.column === 'string') {
|
|
2535
|
+
return col.expr.column;
|
|
2536
|
+
}
|
|
2537
|
+
else {
|
|
2538
|
+
return col.expr.column.expr.value;
|
|
2539
|
+
}
|
|
2496
2540
|
}
|
|
2497
2541
|
else if (col.as) {
|
|
2498
|
-
|
|
2542
|
+
if (typeof col.as === 'string') {
|
|
2543
|
+
return col.as;
|
|
2544
|
+
}
|
|
2545
|
+
else {
|
|
2546
|
+
return col.as.expr?.value;
|
|
2547
|
+
}
|
|
2499
2548
|
}
|
|
2500
2549
|
else if (col.expr && col.expr.type === 'aggr_func') {
|
|
2501
2550
|
if (col.expr.args) {
|
|
@@ -2504,22 +2553,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2504
2553
|
return col.expr.name;
|
|
2505
2554
|
}
|
|
2506
2555
|
return col.expr.value;
|
|
2507
|
-
})
|
|
2556
|
+
})
|
|
2557
|
+
.filter(
|
|
2558
|
+
// remove duplicate entries
|
|
2559
|
+
(value, index, self) => value && self.indexOf(value) === index) ?? [];
|
|
2508
2560
|
return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: columnNamesInAst, strategy: verticalListSortingStrategy, children: _jsxs("div", { style: {
|
|
2509
2561
|
display: 'flex',
|
|
2510
2562
|
flexDirection: 'column',
|
|
2511
2563
|
gap: 8,
|
|
2512
2564
|
}, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
|
|
2513
2565
|
}
|
|
2514
|
-
if (loading ||
|
|
2566
|
+
if (loading || initialChartLoad) {
|
|
2515
2567
|
return (_jsxs("div", { style: {
|
|
2516
2568
|
display: 'flex',
|
|
2517
2569
|
flexDirection: 'row',
|
|
2518
2570
|
height: '100%',
|
|
2519
2571
|
...containerStyle,
|
|
2520
2572
|
}, className: className, ref: parentRef, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2521
|
-
if (loadingSchema)
|
|
2522
|
-
return;
|
|
2523
2573
|
if (!openPopover) {
|
|
2524
2574
|
setOpenPopover('AddColumnModal');
|
|
2525
2575
|
}
|
|
@@ -2540,12 +2590,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2540
2590
|
}, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
|
|
2541
2591
|
setBaseAst(ast);
|
|
2542
2592
|
fetchSqlQuery(ast);
|
|
2543
|
-
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2593
|
+
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2544
2594
|
display: 'flex',
|
|
2545
2595
|
flexDirection: 'column',
|
|
2546
2596
|
gap: 8,
|
|
2547
2597
|
marginBottom: 12,
|
|
2548
|
-
}, children:
|
|
2598
|
+
}, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
|
|
2549
2599
|
display: 'flex',
|
|
2550
2600
|
flexDirection: 'column',
|
|
2551
2601
|
alignItems: 'flex-start',
|
|
@@ -2557,7 +2607,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2557
2607
|
}
|
|
2558
2608
|
if (!openPopover) {
|
|
2559
2609
|
const value = orderedColumnNames[0];
|
|
2560
|
-
const
|
|
2610
|
+
const column = value.split('.')[1];
|
|
2561
2611
|
const columnType = getColumnTypeByName(column);
|
|
2562
2612
|
if (isNumericColumnType(columnType)) {
|
|
2563
2613
|
const newSubtree = deepCopy(defaultNumericComparison);
|
|
@@ -2586,27 +2636,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2586
2636
|
setActiveEditItem(null);
|
|
2587
2637
|
}, 300);
|
|
2588
2638
|
}
|
|
2589
|
-
}, popoverTitle: 'Add filter', popoverChildren: _jsx(
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
}
|
|
2599
|
-
else {
|
|
2600
|
-
setIsPending(false);
|
|
2601
|
-
handleInsertion(activeEditItem, 'AND', false);
|
|
2602
|
-
setActivePath(null);
|
|
2603
|
-
setOpenPopover(null);
|
|
2604
|
-
setTimeout(() => {
|
|
2605
|
-
clearCheckboxes();
|
|
2606
|
-
setActiveEditItem(null);
|
|
2607
|
-
}, 300);
|
|
2608
|
-
}
|
|
2609
|
-
}, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
|
|
2639
|
+
}, popoverTitle: 'Add filter', popoverChildren: _jsx(FilterModal, { schema: schema.find((s) => s.name === currentTable ||
|
|
2640
|
+
s.displayName === currentTable) ?? schema[0], fieldValuesMap: uniqueValues[getTableNames(baseAst).length === 1
|
|
2641
|
+
? getTableNames(baseAst)[0]
|
|
2642
|
+
: initialTableName], onSubmitFilter: (filter) => {
|
|
2643
|
+
setOpenPopover(null);
|
|
2644
|
+
setIsPending(false);
|
|
2645
|
+
const item = filterToAst(filter, client.databaseType.toLowerCase());
|
|
2646
|
+
handleInsertion(item, 'AND', false);
|
|
2647
|
+
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
|
|
2610
2648
|
false && ( // temp removed the AddConditionPopover
|
|
2611
2649
|
_jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2612
2650
|
if (!openPopover) {
|
|
@@ -2645,14 +2683,14 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2645
2683
|
setActivePath(null);
|
|
2646
2684
|
setOpenPopover(null);
|
|
2647
2685
|
}
|
|
2648
|
-
} }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot:
|
|
2686
|
+
} }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEditingPivot, setShowUpdatePivot: setIsEditingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
|
|
2649
2687
|
setPivot(null);
|
|
2650
2688
|
setPivotData(null);
|
|
2651
2689
|
const formattedRows = formatRows(rows, columns, false);
|
|
2652
2690
|
setFormattedRows(formattedRows);
|
|
2653
2691
|
},
|
|
2654
2692
|
// TODOs
|
|
2655
|
-
selectPivot: (
|
|
2693
|
+
selectPivot: () => {
|
|
2656
2694
|
return;
|
|
2657
2695
|
}, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport ?? report }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
|
|
2658
2696
|
setPivotRowField(value);
|
|
@@ -2669,7 +2707,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2669
2707
|
}, children: _jsx(SortSentence, { sortData: {
|
|
2670
2708
|
type: pivot.sortDirection,
|
|
2671
2709
|
expr: { type: 'column_ref', column: pivot.sortField },
|
|
2672
|
-
}, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
2710
|
+
}, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
2673
2711
|
setPivot({ ...pivot, sort: false });
|
|
2674
2712
|
setBaseAst(deepCopy(baseAst));
|
|
2675
2713
|
if (!pivot) {
|
|
@@ -2718,7 +2756,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2718
2756
|
if (!pivot) {
|
|
2719
2757
|
fetchSqlQuery(newAst);
|
|
2720
2758
|
}
|
|
2721
|
-
}, setIsPending: setIsPending, setEditPopoverKey:
|
|
2759
|
+
}, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
2722
2760
|
const newAst = { ...baseAst };
|
|
2723
2761
|
newAst.orderby.splice(id, 1);
|
|
2724
2762
|
setBaseAst(deepCopy(newAst));
|
|
@@ -2741,7 +2779,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2741
2779
|
setActivePath(null);
|
|
2742
2780
|
setOpenPopover(null);
|
|
2743
2781
|
}
|
|
2744
|
-
}, popoverTitle: "Sort by", popoverChildren: _jsx(AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? (_jsx("div", { style: {
|
|
2782
|
+
}, popoverTitle: "Sort by", popoverChildren: _jsx(AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? (_jsx("div", { style: {
|
|
2745
2783
|
display: 'flex',
|
|
2746
2784
|
flexDirection: 'column',
|
|
2747
2785
|
gap: 8,
|
|
@@ -2796,7 +2834,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2796
2834
|
? askAIInputWidth
|
|
2797
2835
|
: askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), _jsx(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), ((baseAst && dataDisplayed) ||
|
|
2798
2836
|
initialLoad ||
|
|
2799
|
-
|
|
2837
|
+
initialChartLoad) && (_jsx(SecondaryButtonComponent, { onClick: () => { }, label: "New report" }))] }) })), _jsxs(_Fragment, { children: [_jsx(TableComponent, { isLoading: true, rows: [], columns: [] }), baseAst && dataDisplayed && !initialChartLoad && (_jsxs("div", { style: {
|
|
2800
2838
|
display: 'flex',
|
|
2801
2839
|
flexDirection: 'row',
|
|
2802
2840
|
gap: '12px',
|
|
@@ -2811,8 +2849,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2811
2849
|
boxSizing: 'border-box',
|
|
2812
2850
|
...containerStyle,
|
|
2813
2851
|
}, className: className, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2814
|
-
if (loadingSchema)
|
|
2815
|
-
return;
|
|
2816
2852
|
if (!orderedColumnNames) {
|
|
2817
2853
|
return;
|
|
2818
2854
|
}
|
|
@@ -2836,12 +2872,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2836
2872
|
}, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
|
|
2837
2873
|
setBaseAst(ast);
|
|
2838
2874
|
fetchSqlQuery(ast);
|
|
2839
|
-
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2875
|
+
}, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, schemaLoading: loadingSchema, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
|
|
2840
2876
|
display: 'flex',
|
|
2841
2877
|
flexDirection: 'column',
|
|
2842
2878
|
gap: 8,
|
|
2843
2879
|
marginBottom: 12,
|
|
2844
|
-
}, children:
|
|
2880
|
+
}, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
|
|
2845
2881
|
display: 'flex',
|
|
2846
2882
|
flexDirection: 'column',
|
|
2847
2883
|
alignItems: 'flex-start',
|
|
@@ -2853,7 +2889,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2853
2889
|
}
|
|
2854
2890
|
if (!openPopover) {
|
|
2855
2891
|
const value = orderedColumnNames[0];
|
|
2856
|
-
const
|
|
2892
|
+
const column = value.split('.')[1];
|
|
2857
2893
|
const columnType = getColumnTypeByName(column);
|
|
2858
2894
|
if (isNumericColumnType(columnType)) {
|
|
2859
2895
|
const newSubtree = deepCopy(defaultNumericComparison);
|
|
@@ -2883,27 +2919,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2883
2919
|
setActiveEditItem(null);
|
|
2884
2920
|
}, 300);
|
|
2885
2921
|
}
|
|
2886
|
-
}, popoverTitle: "Add filter", popoverChildren: _jsx(
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
setActiveEditItem(null);
|
|
2894
|
-
}, 300);
|
|
2895
|
-
}
|
|
2896
|
-
else {
|
|
2897
|
-
setOpenPopover(null);
|
|
2898
|
-
setIsPending(false);
|
|
2899
|
-
handleInsertion(activeEditItem, 'AND', false);
|
|
2900
|
-
setActivePath(null);
|
|
2901
|
-
setTimeout(() => {
|
|
2902
|
-
clearCheckboxes();
|
|
2903
|
-
setActiveEditItem(null);
|
|
2904
|
-
}, 300);
|
|
2905
|
-
}
|
|
2906
|
-
}, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
|
|
2922
|
+
}, popoverTitle: "Add filter", popoverChildren: _jsx(FilterModal, { schema: schema.find((s) => s.name === currentTable ||
|
|
2923
|
+
s.displayName === currentTable) ?? schema[0], fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
|
|
2924
|
+
setOpenPopover(null);
|
|
2925
|
+
setIsPending(false);
|
|
2926
|
+
const item = filterToAst(filter, client.databaseType.toLowerCase());
|
|
2927
|
+
handleInsertion(item, 'AND', false);
|
|
2928
|
+
}, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
|
|
2907
2929
|
false && ( // temp removed the AddConditionPopover
|
|
2908
2930
|
_jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
|
|
2909
2931
|
if (!openPopover) {
|
|
@@ -2943,7 +2965,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
2943
2965
|
setOpenPopover(null);
|
|
2944
2966
|
clearCheckboxes();
|
|
2945
2967
|
}
|
|
2946
|
-
} }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot:
|
|
2968
|
+
} }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEditingPivot, setShowUpdatePivot: setIsEditingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
|
|
2947
2969
|
setPivot(null);
|
|
2948
2970
|
setPivotData(null);
|
|
2949
2971
|
const formattedRows = formatRows(rows, columns, false);
|
|
@@ -3002,7 +3024,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3002
3024
|
`.${pivot.rowField}`,
|
|
3003
3025
|
`.${pivot.valueField || 'count'}`,
|
|
3004
3026
|
]
|
|
3005
|
-
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
3027
|
+
: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
|
|
3006
3028
|
if (pivot) {
|
|
3007
3029
|
const tempPivot = { ...pivot, sort: false };
|
|
3008
3030
|
let dateBucket = undefined;
|
|
@@ -3057,7 +3079,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3057
3079
|
flexDirection: 'column',
|
|
3058
3080
|
gap: 8,
|
|
3059
3081
|
marginBottom: 12,
|
|
3060
|
-
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey:
|
|
3082
|
+
}, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
|
|
3061
3083
|
if (pivot) {
|
|
3062
3084
|
setPivot({ ...pivot, sort: false });
|
|
3063
3085
|
return;
|
|
@@ -3167,7 +3189,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3167
3189
|
setOpenPopover(null);
|
|
3168
3190
|
setBaseAst(deepCopy(newAst));
|
|
3169
3191
|
fetchSqlQuery(deepCopy(newAst));
|
|
3170
|
-
} }) }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? (_jsx("div", { style: {
|
|
3192
|
+
} }) }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? (_jsx("div", { style: {
|
|
3171
3193
|
display: 'flex',
|
|
3172
3194
|
flexDirection: 'column',
|
|
3173
3195
|
gap: 8,
|
|
@@ -3240,7 +3262,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3240
3262
|
? 'Ask a follow-up question...'
|
|
3241
3263
|
: 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: tableLoading ||
|
|
3242
3264
|
(loading && errorMessage.length === 0) ||
|
|
3243
|
-
|
|
3265
|
+
initialChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
|
|
3244
3266
|
? pivotData?.columns || emptyPivotColumns()
|
|
3245
3267
|
: enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
|
|
3246
3268
|
return {
|
|
@@ -3258,9 +3280,10 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3258
3280
|
overflow: 'hidden',
|
|
3259
3281
|
width: '100%',
|
|
3260
3282
|
gap: 12,
|
|
3261
|
-
|
|
3283
|
+
alignItems: 'center',
|
|
3284
|
+
}, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && (_jsxs(_Fragment, { children: [!hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: () => {
|
|
3262
3285
|
setIsChartBuilderOpen(true);
|
|
3263
|
-
}, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3286
|
+
}, disabled: !!errorMessage, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
|
|
3264
3287
|
? {
|
|
3265
3288
|
...report,
|
|
3266
3289
|
...tempReport,
|
|
@@ -3274,5 +3297,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
|
|
|
3274
3297
|
queryString: activeQuery,
|
|
3275
3298
|
rows: rows,
|
|
3276
3299
|
}
|
|
3277
|
-
: 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 }))] }));
|
|
3300
|
+
: tempReport, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement, rowCount: numberOfRows, onPageChange: onPageChange, onSortChange: onSortChange, isLoading: tableLoading }))] }));
|
|
3278
3301
|
}
|