@quillsql/react 2.13.7 → 2.13.9
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 +5 -5
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +19 -8
- package/dist/cjs/ChartBuilder.d.ts +1 -1
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +58 -93
- package/dist/cjs/ChartEditor.js +1 -1
- package/dist/cjs/Context.d.ts +9 -8
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +119 -34
- package/dist/cjs/Dashboard.d.ts +20 -8
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +68 -58
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -2
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +1 -2
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +20 -20
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +64 -52
- package/dist/cjs/ReportBuilder.d.ts +2 -1
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +339 -339
- package/dist/cjs/SQLEditor.d.ts +1 -1
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +30 -18
- package/dist/cjs/components/Banner/index.d.ts +0 -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/Chart/BarChart.d.ts +0 -1
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +1 -1
- package/dist/cjs/components/Chart/BarList.js +1 -2
- package/dist/cjs/components/Chart/ChartError.js +2 -3
- package/dist/cjs/components/Chart/ChartSkeleton.js +1 -1
- package/dist/cjs/components/Chart/ChartTooltip.js +1 -1
- package/dist/cjs/components/Chart/ChartTooltipFrame.d.ts +0 -1
- package/dist/cjs/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartTooltipFrame.js +1 -1
- package/dist/cjs/components/Chart/ChartTooltipGroup.js +1 -1
- package/dist/cjs/components/Chart/ChartTooltipRow.js +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +0 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +1 -1
- package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/PieChart.js +18 -9
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +0 -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 +10 -2
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +9 -23
- package/dist/cjs/components/Dashboard/DashboardSection.d.ts +0 -1
- package/dist/cjs/components/Dashboard/DashboardSection.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardSection.js +1 -1
- package/dist/cjs/components/Dashboard/DashboardSectionContainer.d.ts +0 -1
- package/dist/cjs/components/Dashboard/DashboardSectionContainer.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardSectionContainer.js +1 -1
- package/dist/cjs/components/Dashboard/DashboardTemplate.js +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +9 -7
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +104 -61
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts +0 -1
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +3 -3
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +0 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +1 -1
- package/dist/cjs/components/Dashboard/TemplateChartComponent.d.ts +0 -1
- package/dist/cjs/components/Dashboard/TemplateChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TemplateChartComponent.js +1 -1
- package/dist/cjs/components/Dashboard/TemplateMetricComponent.d.ts +0 -1
- package/dist/cjs/components/Dashboard/TemplateMetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TemplateMetricComponent.js +1 -1
- package/dist/cjs/components/Dashboard/TemplateTableComponent.d.ts +0 -1
- package/dist/cjs/components/Dashboard/TemplateTableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TemplateTableComponent.js +1 -1
- package/dist/cjs/components/Dashboard/util.js +2 -3
- package/dist/cjs/components/QuillCard.js +1 -2
- package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelect.js +21 -20
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +172 -70
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelect.js +9 -8
- package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelectWithCombo.js +26 -12
- package/dist/cjs/components/QuillTable.d.ts +5 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +5 -3
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -3
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +5 -6
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +3 -4
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +45 -39
- package/dist/cjs/components/ReportBuilder/FilterStack.js +1 -1
- package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ast.js +2 -2
- package/dist/cjs/components/ReportBuilder/convert.js +11 -12
- package/dist/cjs/components/ReportBuilder/postgres.js +4 -4
- package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -3
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +21 -23
- package/dist/cjs/components/UiComponents.d.ts +14 -12
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +41 -17
- package/dist/cjs/components/selectUtils.js +3 -3
- package/dist/cjs/contexts/BaseColorContext.d.ts +0 -1
- package/dist/cjs/contexts/BaseColorContext.d.ts.map +1 -1
- package/dist/cjs/contexts/RootStylesContext.d.ts +0 -1
- package/dist/cjs/contexts/RootStylesContext.d.ts.map +1 -1
- package/dist/cjs/contexts/SelectedValueContext.d.ts +0 -1
- package/dist/cjs/contexts/SelectedValueContext.d.ts.map +1 -1
- package/dist/cjs/hooks/useAskQuill.d.ts +2 -2
- package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useAskQuill.js +11 -11
- package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.d.ts +8 -7
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +47 -31
- package/dist/cjs/hooks/useExport.d.ts +3 -4
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +6 -2
- package/dist/cjs/hooks/useInternalState.d.ts +1 -2
- package/dist/cjs/hooks/useInternalState.d.ts.map +1 -1
- package/dist/cjs/hooks/useOnClickOutside.d.ts +3 -1
- package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.d.ts +0 -14
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +17 -55
- package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -2
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +4 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.js +32 -7
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +17 -13
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +368 -162
- package/dist/cjs/lib/utils.d.ts +0 -1
- package/dist/cjs/lib/utils.d.ts.map +1 -1
- package/dist/cjs/lib/utils.js +2 -2
- package/dist/cjs/models/Filter.d.ts +49 -30
- package/dist/cjs/models/Filter.d.ts.map +1 -1
- package/dist/cjs/models/Filter.js +125 -52
- package/dist/cjs/models/Pivot.d.ts +3 -1
- package/dist/cjs/models/Pivot.d.ts.map +1 -1
- package/dist/cjs/models/Report.d.ts +2 -2
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts +4 -4
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.js +3839 -3427
- package/dist/cjs/utils/astProcessing.d.ts +12 -3
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +76 -11
- package/dist/cjs/utils/client.js +2 -2
- package/dist/cjs/utils/color.js +5 -6
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +7 -7
- package/dist/cjs/utils/crypto.js +1 -2
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +34 -30
- package/dist/cjs/utils/dataFetcher.js +3 -4
- package/dist/cjs/utils/dataProcessing.js +2 -2
- package/dist/cjs/utils/dates.d.ts +4 -1
- package/dist/cjs/utils/dates.d.ts.map +1 -1
- package/dist/cjs/utils/dates.js +12 -10
- package/dist/cjs/utils/errorProcessing.js +1 -2
- package/dist/cjs/utils/filterProcessing.d.ts +3 -3
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +30 -27
- package/dist/cjs/utils/getDomain.js +1 -1
- package/dist/cjs/utils/logging.js +1 -2
- package/dist/cjs/utils/merge.d.ts +1 -1
- package/dist/cjs/utils/merge.d.ts.map +1 -1
- package/dist/cjs/utils/merge.js +15 -11
- package/dist/cjs/utils/monacoConfig.js +3 -3
- package/dist/cjs/utils/paginationProcessing.js +3 -3
- package/dist/cjs/utils/pivotConstructor.d.ts +4 -4
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +104 -127
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +14 -16
- package/dist/cjs/utils/queryConstructor.d.ts +2 -2
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +344 -78
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +22 -12
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/styles.js +1 -2
- package/dist/cjs/utils/tableProcessing.d.ts +12 -12
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +69 -26
- package/dist/cjs/utils/textProcessing.js +5 -6
- package/dist/cjs/utils/validation.d.ts.map +1 -1
- package/dist/cjs/utils/validation.js +3 -1
- package/dist/cjs/utils/valueFormatter.d.ts +1 -0
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +2 -0
- package/dist/cjs/utils/width.d.ts.map +1 -1
- package/dist/esm/Chart.d.ts +5 -5
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +15 -4
- package/dist/esm/ChartBuilder.d.ts +1 -1
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +52 -87
- package/dist/esm/Context.d.ts +9 -8
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +119 -34
- package/dist/esm/Dashboard.d.ts +20 -8
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +68 -58
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -2
- package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +20 -20
- package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
- package/dist/esm/DateRangePicker/dateRangePickerUtils.js +64 -52
- package/dist/esm/ReportBuilder.d.ts +2 -1
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +343 -343
- package/dist/esm/SQLEditor.d.ts +1 -1
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +29 -17
- package/dist/esm/components/Banner/index.d.ts +0 -1
- package/dist/esm/components/Banner/index.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.d.ts +0 -1
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartTooltipFrame.d.ts +0 -1
- package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts +0 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/PieChart.js +18 -9
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +0 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts +10 -2
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +8 -21
- package/dist/esm/components/Dashboard/DashboardSection.d.ts +0 -1
- package/dist/esm/components/Dashboard/DashboardSection.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts +0 -1
- package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +9 -7
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +102 -62
- package/dist/esm/components/Dashboard/MetricComponent.d.ts +0 -1
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +2 -2
- package/dist/esm/components/Dashboard/TableComponent.d.ts +0 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TemplateChartComponent.d.ts +0 -1
- package/dist/esm/components/Dashboard/TemplateChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TemplateMetricComponent.d.ts +0 -1
- package/dist/esm/components/Dashboard/TemplateMetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TemplateTableComponent.d.ts +0 -1
- package/dist/esm/components/Dashboard/TemplateTableComponent.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelect.js +19 -18
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +171 -69
- package/dist/esm/components/QuillSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillSelect.js +8 -6
- package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillSelectWithCombo.js +25 -10
- package/dist/esm/components/QuillTable.d.ts +5 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +4 -2
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -3
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +5 -6
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +3 -4
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +46 -40
- package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts +3 -3
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +0 -2
- package/dist/esm/components/UiComponents.d.ts +14 -12
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +37 -14
- package/dist/esm/contexts/BaseColorContext.d.ts +0 -1
- package/dist/esm/contexts/BaseColorContext.d.ts.map +1 -1
- package/dist/esm/contexts/RootStylesContext.d.ts +0 -1
- package/dist/esm/contexts/RootStylesContext.d.ts.map +1 -1
- package/dist/esm/contexts/SelectedValueContext.d.ts +0 -1
- package/dist/esm/contexts/SelectedValueContext.d.ts.map +1 -1
- package/dist/esm/hooks/useAskQuill.d.ts +2 -2
- package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useAskQuill.js +12 -12
- package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.d.ts +8 -7
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +48 -32
- package/dist/esm/hooks/useExport.d.ts +3 -4
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +6 -2
- package/dist/esm/hooks/useInternalState.d.ts +1 -2
- package/dist/esm/hooks/useInternalState.d.ts.map +1 -1
- package/dist/esm/hooks/useOnClickOutside.d.ts +3 -1
- package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.d.ts +0 -14
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +16 -53
- package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +4 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.js +32 -7
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +17 -13
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +364 -158
- package/dist/esm/lib/utils.d.ts +0 -1
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/models/Filter.d.ts +49 -30
- package/dist/esm/models/Filter.d.ts.map +1 -1
- package/dist/esm/models/Filter.js +123 -50
- package/dist/esm/models/Pivot.d.ts +3 -1
- package/dist/esm/models/Pivot.d.ts.map +1 -1
- package/dist/esm/models/Report.d.ts +2 -2
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.d.ts +4 -4
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.js +3835 -3423
- package/dist/esm/utils/astProcessing.d.ts +12 -3
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +64 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +1 -1
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +31 -26
- package/dist/esm/utils/dates.d.ts +4 -1
- package/dist/esm/utils/dates.d.ts.map +1 -1
- package/dist/esm/utils/dates.js +6 -3
- package/dist/esm/utils/filterProcessing.d.ts +3 -3
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +22 -19
- package/dist/esm/utils/merge.d.ts +1 -1
- package/dist/esm/utils/merge.d.ts.map +1 -1
- package/dist/esm/utils/merge.js +14 -9
- package/dist/esm/utils/pivotConstructor.d.ts +4 -4
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +103 -125
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +9 -11
- package/dist/esm/utils/queryConstructor.d.ts +2 -2
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +338 -71
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +18 -8
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.d.ts +12 -12
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +69 -26
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +3 -1
- package/dist/esm/utils/valueFormatter.d.ts +1 -0
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +2 -1
- package/dist/esm/utils/width.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -3,21 +3,24 @@ import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from '
|
|
|
3
3
|
import { ClientContext, SchemaDataContext } from '../../Context';
|
|
4
4
|
import { getDataFromCloud } from '../../utils/dataFetcher';
|
|
5
5
|
import { PivotList, PivotCard } from './PivotList';
|
|
6
|
-
import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, } from 'date-fns';
|
|
7
|
-
import { valueFormatter } from '../../utils/valueFormatter';
|
|
8
|
-
import { numberFormatOptions
|
|
6
|
+
import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isValid, isWithinInterval, parseISO, subMilliseconds, } from 'date-fns';
|
|
7
|
+
import { compareValues, getValidDate, valueFormatter, } from '../../utils/valueFormatter';
|
|
8
|
+
import { numberFormatOptions } from '../../ChartBuilder';
|
|
9
9
|
import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
|
|
10
10
|
import { QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
|
|
11
|
-
import {
|
|
11
|
+
import { isTextColumnType } from '../../components/ReportBuilder/ast';
|
|
12
12
|
import { QuillCard } from '../../components/QuillCard';
|
|
13
13
|
import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
|
|
14
14
|
import { hashCode } from '../../utils/crypto';
|
|
15
|
-
import { getCountsByColumns,
|
|
15
|
+
import { getCountsByColumns, getQueryDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
|
|
16
16
|
import { generatePivotWithSQL } from '../../utils/pivotConstructor';
|
|
17
17
|
import { getDateBucketFromRange } from '../../utils/dates';
|
|
18
18
|
import Big from 'big.js';
|
|
19
|
-
|
|
19
|
+
import equal from 'fast-deep-equal';
|
|
20
|
+
import { uniqueValuesToStringMap } from '../../utils/filterProcessing';
|
|
21
|
+
export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotValueField2, setPivotValueField2, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, showTrigger = true, pivotCountRequest = 6, query, initialUniqueValues, uniqueValuesIsLoading, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, }) => {
|
|
20
22
|
const [isLoading, setIsLoading] = useState(false);
|
|
23
|
+
const [previewLoading, setPreviewLoading] = useState(false);
|
|
21
24
|
const [selectedPivotType, setSelectedPivotType] = useState('recommended');
|
|
22
25
|
const [errors, setErrors] = useState([]);
|
|
23
26
|
const [client] = useContext(ClientContext);
|
|
@@ -26,12 +29,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
26
29
|
const colFieldRef = useRef(null);
|
|
27
30
|
const [pivotCardWidth, setPivotCardWidth] = useState(420);
|
|
28
31
|
const [samplePivotTable, setSamplePivotTable] = useState(null);
|
|
32
|
+
const [hasNoRecommendedPivots, sethasNoRecommendedPivots] = useState(false);
|
|
33
|
+
const [isFetchingPivots, setIsFetchingPivots] = useState(false);
|
|
29
34
|
const [allowedColumnFields, setAllowedColumnFields] = useState([]);
|
|
30
35
|
const [allowedRowFields, setAllowedRowFields] = useState([]);
|
|
31
36
|
const [allowedValueFields, setAllowedValueFields] = useState([]);
|
|
32
37
|
const [uniqueValues, setUniqueValues] = useState(initialUniqueValues);
|
|
38
|
+
const buttonRef = useRef(null);
|
|
33
39
|
const [dateRanges, setDateRanges] = useState({});
|
|
34
|
-
const
|
|
40
|
+
const [pivotError, setPivotError] = useState('');
|
|
41
|
+
const getDistinctValues = async (fetchDistinct) => {
|
|
35
42
|
if (!client) {
|
|
36
43
|
return {
|
|
37
44
|
possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
|
|
@@ -49,8 +56,11 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
49
56
|
setAllowedValueFields(possibleColumns.valueFields);
|
|
50
57
|
return { possibleColumns, uniqueValues: {} };
|
|
51
58
|
}
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
let newUniqueValues = uniqueValues;
|
|
60
|
+
if (fetchDistinct || !uniqueValues) {
|
|
61
|
+
const { filteredColumns: smallStringColumns } = await getCountsByColumns(stringColumns, query || '', client, schemaData.customFields ?? []);
|
|
62
|
+
newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, query || '', data.rows || [], client, schemaData.customFields ?? []);
|
|
63
|
+
}
|
|
54
64
|
if (!uniqueValues ||
|
|
55
65
|
hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
|
|
56
66
|
const possibleColumns = getPossiblePivotFieldOptions(columns, newUniqueValues || {});
|
|
@@ -75,7 +85,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
75
85
|
if (dateColumns.length === 0) {
|
|
76
86
|
return;
|
|
77
87
|
}
|
|
78
|
-
const dateRangeByColumn = await
|
|
88
|
+
const dateRangeByColumn = await getQueryDateRangeByColumns(dateColumns, query || '', client, schemaData.customFields ?? []);
|
|
79
89
|
setDateRanges(dateRangeByColumn || {});
|
|
80
90
|
}
|
|
81
91
|
};
|
|
@@ -113,9 +123,23 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
113
123
|
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
114
124
|
valueField: pivotValueField || '',
|
|
115
125
|
aggregationType: pivotAggregation || '',
|
|
126
|
+
valueField2: pivotValueField2 || '',
|
|
116
127
|
};
|
|
117
|
-
|
|
118
|
-
|
|
128
|
+
try {
|
|
129
|
+
const { rows, columns } = await generatePivotTable({
|
|
130
|
+
pivot,
|
|
131
|
+
report,
|
|
132
|
+
client,
|
|
133
|
+
uniqueValues,
|
|
134
|
+
});
|
|
135
|
+
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
if (e instanceof Error) {
|
|
139
|
+
setPivotError(e.message);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
119
143
|
}
|
|
120
144
|
if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
|
|
121
145
|
getDistinctValues();
|
|
@@ -135,6 +159,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
135
159
|
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
136
160
|
valueField: pivotValueField || '',
|
|
137
161
|
aggregationType: pivotAggregation || '',
|
|
162
|
+
valueField2: pivotValueField2 || '',
|
|
138
163
|
};
|
|
139
164
|
if (initialSelectedPivotTable) {
|
|
140
165
|
setSamplePivotTable({
|
|
@@ -144,8 +169,21 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
144
169
|
});
|
|
145
170
|
}
|
|
146
171
|
else {
|
|
147
|
-
|
|
148
|
-
|
|
172
|
+
try {
|
|
173
|
+
const { rows, columns } = await generatePivotTable({
|
|
174
|
+
pivot,
|
|
175
|
+
report,
|
|
176
|
+
client,
|
|
177
|
+
uniqueValues,
|
|
178
|
+
});
|
|
179
|
+
setSamplePivotTable({ pivot: pivot, rows, columns });
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
if (e instanceof Error) {
|
|
183
|
+
setPivotError(e.message);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
149
187
|
}
|
|
150
188
|
}
|
|
151
189
|
};
|
|
@@ -161,15 +199,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
161
199
|
}
|
|
162
200
|
}, [initialSelectedPivotTable, columns, data, pivotRowField]);
|
|
163
201
|
useEffect(() => {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
202
|
+
setAllowedFields(initialUniqueValues || {});
|
|
203
|
+
setUniqueValues(initialUniqueValues);
|
|
204
|
+
}, [initialUniqueValues, columns]);
|
|
205
|
+
const setAllowedFields = (uniqueValues) => {
|
|
206
|
+
const possibleColumns = getPossiblePivotFieldOptions(columns, uniqueValues);
|
|
168
207
|
setAllowedRowFields(possibleColumns.rowFields);
|
|
169
208
|
setAllowedColumnFields(possibleColumns.columnFields);
|
|
170
209
|
setAllowedValueFields(possibleColumns.valueFields);
|
|
171
|
-
|
|
172
|
-
}
|
|
210
|
+
return possibleColumns;
|
|
211
|
+
};
|
|
173
212
|
const columnsToShow = useMemo(() => {
|
|
174
213
|
return (columns || []).reduce((map, col) => {
|
|
175
214
|
// only use columns shown in the report builder's table
|
|
@@ -188,15 +227,41 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
188
227
|
return null;
|
|
189
228
|
}
|
|
190
229
|
const pivot = createdPivots[selectedPivotIndex];
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
230
|
+
try {
|
|
231
|
+
const { rows, columns } = await generatePivotTable({
|
|
232
|
+
pivot,
|
|
233
|
+
report,
|
|
234
|
+
client,
|
|
235
|
+
uniqueValues,
|
|
236
|
+
});
|
|
237
|
+
setSelectedPivotTable({
|
|
238
|
+
pivot: pivot,
|
|
239
|
+
rows: rows,
|
|
240
|
+
columns: columns,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
if (e instanceof Error) {
|
|
245
|
+
setPivotError(e.message);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
197
249
|
};
|
|
198
250
|
fetchPivotTables();
|
|
199
251
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
252
|
+
const previousUniqueValuesRef = useRef();
|
|
253
|
+
useEffect(() => {
|
|
254
|
+
if (!uniqueValuesIsLoading &&
|
|
255
|
+
!equal(uniqueValues, previousUniqueValuesRef.current)) {
|
|
256
|
+
previousUniqueValuesRef.current = uniqueValues;
|
|
257
|
+
setRecommendedPivotTables([]);
|
|
258
|
+
setRecommendedPivots([]);
|
|
259
|
+
setCreatedPivotTables([]);
|
|
260
|
+
setCreatedPivots([]);
|
|
261
|
+
sethasNoRecommendedPivots(false);
|
|
262
|
+
refreshPivots();
|
|
263
|
+
}
|
|
264
|
+
}, [uniqueValuesIsLoading, uniqueValues]);
|
|
200
265
|
const onSelectRecommendedPivot = (pivot, index) => {
|
|
201
266
|
if (showEditOnPivotClick) {
|
|
202
267
|
onEditPivot(pivot, index, 'recommended');
|
|
@@ -212,7 +277,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
212
277
|
setIsOpen(false);
|
|
213
278
|
};
|
|
214
279
|
const onSelectCreatedPivot = (pivot) => {
|
|
215
|
-
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField || '']?.dateRange
|
|
280
|
+
selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField || '']?.dateRange);
|
|
216
281
|
setSelectedPivotType('created');
|
|
217
282
|
setIsOpen(false);
|
|
218
283
|
setPopUpTitle('Add pivot');
|
|
@@ -222,6 +287,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
222
287
|
setPivotRowField(pivot.rowField);
|
|
223
288
|
setPivotColumnField(pivot.columnField);
|
|
224
289
|
setPivotValueField(pivot.valueField);
|
|
290
|
+
setPivotValueField2(pivot.valueField2);
|
|
225
291
|
setPivotAggregation(pivot.aggregationType);
|
|
226
292
|
setShowUpdatePivot(true);
|
|
227
293
|
if (pivotType === 'recommended' &&
|
|
@@ -235,9 +301,24 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
235
301
|
if (pivotRowField && dateRanges[pivotRowField]) {
|
|
236
302
|
dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
|
|
237
303
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
304
|
+
try {
|
|
305
|
+
const { rows, columns } = await generatePivotTable({
|
|
306
|
+
pivot,
|
|
307
|
+
dateBucket,
|
|
308
|
+
report,
|
|
309
|
+
client,
|
|
310
|
+
uniqueValues,
|
|
311
|
+
});
|
|
312
|
+
setSamplePivotTable({ pivot, rows, columns });
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
catch (e) {
|
|
316
|
+
if (e instanceof Error) {
|
|
317
|
+
setPivotError(e.message);
|
|
318
|
+
setSamplePivotTable(null);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
241
322
|
}
|
|
242
323
|
setSamplePivotTable(null);
|
|
243
324
|
};
|
|
@@ -248,26 +329,33 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
248
329
|
if (!client) {
|
|
249
330
|
return;
|
|
250
331
|
}
|
|
251
|
-
if
|
|
332
|
+
// don't fetch unique values separately if they are already being fetched
|
|
333
|
+
if (uniqueValuesIsLoading) {
|
|
334
|
+
setIsLoading(true);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
if (isFetchingPivots ||
|
|
252
338
|
Object.keys(columnsToShow).length === 0 ||
|
|
253
339
|
!pivotRecommendationsEnabled) {
|
|
254
340
|
return;
|
|
255
341
|
}
|
|
342
|
+
setIsFetchingPivots(true);
|
|
343
|
+
setPivotError('');
|
|
256
344
|
setIsLoading(true);
|
|
257
|
-
let tempUniqueValues = uniqueValues;
|
|
345
|
+
let tempUniqueValues = uniqueValues || initialUniqueValues;
|
|
258
346
|
let possibleColumns = {
|
|
259
347
|
rowFields: allowedRowFields,
|
|
260
348
|
columnFields: allowedColumnFields,
|
|
261
349
|
valueFields: allowedValueFields,
|
|
262
350
|
};
|
|
263
|
-
if (
|
|
264
|
-
|
|
265
|
-
allowedValueFields.length === 0) ||
|
|
266
|
-
!uniqueValues) {
|
|
267
|
-
const distinctValues = await getDistinctValues();
|
|
351
|
+
if (!uniqueValues && !initialUniqueValues) {
|
|
352
|
+
const distinctValues = await getDistinctValues(true);
|
|
268
353
|
possibleColumns = distinctValues.possibleColumns;
|
|
269
354
|
tempUniqueValues = distinctValues.uniqueValues;
|
|
270
355
|
}
|
|
356
|
+
else {
|
|
357
|
+
possibleColumns = setAllowedFields(uniqueValues || initialUniqueValues);
|
|
358
|
+
}
|
|
271
359
|
const cloudBody = {
|
|
272
360
|
pivotCountRequest,
|
|
273
361
|
allowedRowFields: possibleColumns?.rowFields || [],
|
|
@@ -286,8 +374,12 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
286
374
|
try {
|
|
287
375
|
const resp = await getDataFromCloud(client, 'pivotai', cloudBody);
|
|
288
376
|
const recommendedPivots = resp?.data?.pivotTables.map((pivot) => cleanPivot(pivot, possibleColumns)) || [];
|
|
289
|
-
const cleanedPivots = recommendedPivots
|
|
290
|
-
|
|
377
|
+
const cleanedPivots = recommendedPivots
|
|
378
|
+
.filter((pivot) => isValidPivot(pivot) &&
|
|
379
|
+
(!pivot.columnField || pivot.columnField !== pivot.rowField)) // only recommend valid pivots
|
|
380
|
+
.map((pivot) => {
|
|
381
|
+
if (pivot.columnField &&
|
|
382
|
+
columnsToShow[pivot.columnField] === 'date') {
|
|
291
383
|
const columnField = pivot.columnField;
|
|
292
384
|
pivot.columnField = pivot.rowField;
|
|
293
385
|
pivot.rowField = columnField;
|
|
@@ -301,17 +393,42 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
301
393
|
title: generatePivotTitle(pivot),
|
|
302
394
|
};
|
|
303
395
|
});
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
396
|
+
const deduplicatedPivots = cleanedPivots
|
|
397
|
+
.filter((pivot, index, self) => index ===
|
|
398
|
+
self.findIndex((p) => p.rowField === pivot.rowField &&
|
|
399
|
+
p.columnField === pivot.columnField &&
|
|
400
|
+
p.valueField === pivot.valueField &&
|
|
401
|
+
p.aggregationType === pivot.aggregationType))
|
|
402
|
+
.filter((pivot) => !createdPivots.some((created) => created.rowField === pivot.rowField &&
|
|
403
|
+
created.columnField === pivot.columnField &&
|
|
404
|
+
created.valueField === pivot.valueField &&
|
|
405
|
+
created.aggregationType === pivot.aggregationType));
|
|
406
|
+
setRecommendedPivots(deduplicatedPivots);
|
|
407
|
+
sethasNoRecommendedPivots(deduplicatedPivots.length === 0);
|
|
408
|
+
const trimmedUniqueValues = trimUniqueValues(tempUniqueValues, 6);
|
|
409
|
+
const pts = await Promise.all(deduplicatedPivots.map(async (p) => {
|
|
410
|
+
try {
|
|
411
|
+
const { rows, columns } = await generatePivotTable({
|
|
412
|
+
pivot: p,
|
|
413
|
+
rowLimit: 6,
|
|
414
|
+
report,
|
|
415
|
+
client,
|
|
416
|
+
uniqueValues: trimmedUniqueValues,
|
|
417
|
+
});
|
|
418
|
+
return { pivot: p, rows, columns };
|
|
419
|
+
}
|
|
420
|
+
catch (e) {
|
|
421
|
+
return undefined;
|
|
422
|
+
}
|
|
308
423
|
}));
|
|
309
|
-
setRecommendedPivotTables(pts);
|
|
424
|
+
setRecommendedPivotTables(pts.filter((pt) => pt !== undefined));
|
|
310
425
|
setSelectedPivotIndex(-1);
|
|
311
426
|
}
|
|
312
427
|
catch (e) {
|
|
428
|
+
setPivotError('Failed to fetch pivot recommendations');
|
|
313
429
|
console.error('Failed parsing pivotai response', e);
|
|
314
430
|
}
|
|
431
|
+
setIsFetchingPivots(false);
|
|
315
432
|
setIsLoading(false);
|
|
316
433
|
}, [
|
|
317
434
|
selectedTable,
|
|
@@ -322,16 +439,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
322
439
|
allowedColumnFields,
|
|
323
440
|
allowedRowFields,
|
|
324
441
|
allowedValueFields,
|
|
442
|
+
uniqueValuesIsLoading,
|
|
325
443
|
columns,
|
|
326
444
|
]);
|
|
327
445
|
const pivotFieldChange = async (field, value) => {
|
|
328
446
|
setErrors([]);
|
|
329
|
-
setIsLoading(true);
|
|
330
447
|
const pivot = {
|
|
331
448
|
rowField: pivotRowField,
|
|
332
449
|
rowFieldType: columnsToShow[pivotRowField],
|
|
333
450
|
columnField: pivotColumnField,
|
|
334
451
|
valueField: pivotValueField,
|
|
452
|
+
valueField2: pivotValueField2,
|
|
335
453
|
aggregationType: pivotAggregation,
|
|
336
454
|
};
|
|
337
455
|
// @ts-ignore
|
|
@@ -344,52 +462,59 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
344
462
|
pivot.columnFieldType = columnsToShow[value];
|
|
345
463
|
}
|
|
346
464
|
if (!isValidPivot(pivot)) {
|
|
347
|
-
setIsLoading(false);
|
|
348
465
|
setSamplePivotTable(null);
|
|
349
466
|
return;
|
|
350
467
|
}
|
|
468
|
+
setPreviewLoading(true);
|
|
351
469
|
let dateBucket = undefined;
|
|
352
470
|
if (pivotRowField && dateRanges[pivotRowField]) {
|
|
353
471
|
dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
|
|
354
472
|
}
|
|
355
473
|
setTimeout(async () => {
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
474
|
+
try {
|
|
475
|
+
console.log('HELP: ', pivot);
|
|
476
|
+
const { rows, columns } = await generatePivotTable({
|
|
477
|
+
pivot,
|
|
478
|
+
rowLimit: 6, // limit previews
|
|
479
|
+
dateBucket,
|
|
480
|
+
report,
|
|
481
|
+
client,
|
|
482
|
+
uniqueValues,
|
|
483
|
+
});
|
|
484
|
+
setSamplePivotTable({ pivot, rows, columns });
|
|
485
|
+
}
|
|
486
|
+
catch (e) {
|
|
487
|
+
if (e instanceof Error) {
|
|
488
|
+
setPivotError(e.message);
|
|
489
|
+
setSamplePivotTable(null);
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
finally {
|
|
494
|
+
setPreviewLoading(false);
|
|
495
|
+
}
|
|
359
496
|
}, 500);
|
|
360
497
|
};
|
|
361
498
|
const [recommendedPivotTables, setRecommendedPivotTables] = useState([]);
|
|
362
|
-
// useEffect(() => {
|
|
363
|
-
// const fetchPivotTables = async () => {
|
|
364
|
-
// const pts = await Promise.all(
|
|
365
|
-
// recommendedPivots.map(async (p: Pivot) => {
|
|
366
|
-
// const { rows, columns } = await generatePivotTable(
|
|
367
|
-
// p,
|
|
368
|
-
// data,
|
|
369
|
-
// dateRange,
|
|
370
|
-
// false,
|
|
371
|
-
// 6,
|
|
372
|
-
// undefined,
|
|
373
|
-
// undefined,
|
|
374
|
-
// report,
|
|
375
|
-
// client,
|
|
376
|
-
// uniqueValues,
|
|
377
|
-
// );
|
|
378
|
-
// return { pivot: p, rows, columns };
|
|
379
|
-
// }),
|
|
380
|
-
// );
|
|
381
|
-
// setRecommendedPivotTables(pts);
|
|
382
|
-
// };
|
|
383
|
-
// fetchPivotTables();
|
|
384
|
-
// }, [recommendedPivots, dateRange]);
|
|
385
499
|
const [createdPivotTables, setCreatedPivotTables] = useState([]);
|
|
386
500
|
useEffect(() => {
|
|
387
501
|
const fetchPivotTables = async () => {
|
|
388
502
|
const pts = await Promise.all(createdPivots.map(async (p) => {
|
|
389
|
-
|
|
390
|
-
|
|
503
|
+
try {
|
|
504
|
+
const { rows, columns } = await generatePivotTable({
|
|
505
|
+
pivot: p,
|
|
506
|
+
rowLimit: 6,
|
|
507
|
+
report,
|
|
508
|
+
client,
|
|
509
|
+
uniqueValues,
|
|
510
|
+
});
|
|
511
|
+
return { pivot: p, rows, columns };
|
|
512
|
+
}
|
|
513
|
+
catch (e) {
|
|
514
|
+
return undefined;
|
|
515
|
+
}
|
|
391
516
|
}));
|
|
392
|
-
setCreatedPivotTables(pts);
|
|
517
|
+
setCreatedPivotTables(pts.filter((pt) => pt !== undefined));
|
|
393
518
|
};
|
|
394
519
|
fetchPivotTables();
|
|
395
520
|
}, [createdPivots, dateRange]);
|
|
@@ -409,22 +534,24 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
409
534
|
position: 'absolute',
|
|
410
535
|
top: -2,
|
|
411
536
|
right: -2,
|
|
412
|
-
} })) }), showTrigger && (_jsx(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
537
|
+
} })) }), showTrigger && (_jsx("div", { ref: buttonRef, children: _jsx(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
|
|
538
|
+
if (columns.length === 0) {
|
|
539
|
+
setIsOpen(false);
|
|
540
|
+
}
|
|
541
|
+
// table is not loaded yet, so pivot button is not clickable
|
|
542
|
+
if (Object.keys(columnsToShow).length === 0) {
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
if (!isOpen &&
|
|
546
|
+
pivotRecommendationsEnabled &&
|
|
547
|
+
!hasNoRecommendedPivots &&
|
|
548
|
+
(recommendedPivots.length === 0 ||
|
|
549
|
+
recommendedPivotTables.length === 0)) {
|
|
550
|
+
refreshPivots();
|
|
551
|
+
}
|
|
552
|
+
setIsOpen(!isOpen);
|
|
553
|
+
setShowUpdatePivot(false);
|
|
554
|
+
}, label: triggerButtonText }) })), _jsx("div", { style: {
|
|
428
555
|
position: 'relative',
|
|
429
556
|
...(isOpen && showTrigger && { top: 12 }),
|
|
430
557
|
}, children: _jsx(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
|
|
@@ -433,7 +560,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
433
560
|
setPopUpTitle('Add pivot');
|
|
434
561
|
}
|
|
435
562
|
setIsOpen(isOpen);
|
|
436
|
-
}, popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
|
|
563
|
+
}, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
|
|
437
564
|
? popUpTitle
|
|
438
565
|
: 'Recommended pivots', popoverChildren: _jsx("div", { style: {
|
|
439
566
|
paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
|
|
@@ -443,13 +570,14 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
443
570
|
display: 'flex',
|
|
444
571
|
flexDirection: 'column',
|
|
445
572
|
gap: 20,
|
|
446
|
-
}, children: [
|
|
573
|
+
}, children: [previewLoading && _jsx(LoadingComponent, {}), samplePivotTable && !previewLoading && (_jsx("div", { style: {
|
|
447
574
|
width: pivotCardWidth,
|
|
448
575
|
minHeight: 160,
|
|
449
576
|
}, children: _jsx(PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, onSelectPivot: () => { }, onClose: () => {
|
|
450
577
|
setPivotAggregation(null);
|
|
451
578
|
setPivotRowField(null);
|
|
452
579
|
setPivotValueField(null);
|
|
580
|
+
setPivotValueField2(null);
|
|
453
581
|
setPivotColumnField(null);
|
|
454
582
|
setSamplePivotTable(null);
|
|
455
583
|
} }) })), _jsxs(PivotColumnContainer, { children: [_jsxs(PivotRowContainer, { children: [_jsx("div", { ref: rowFieldRef, children: _jsx(SelectComponent, { id: "pivot-row-field", label: "Row field", value: pivotRowField, onChange: (e) => {
|
|
@@ -457,7 +585,9 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
457
585
|
setPivotRowField(e.target.value === ''
|
|
458
586
|
? undefined
|
|
459
587
|
: e.target.value);
|
|
460
|
-
}, options: allowedRowFields
|
|
588
|
+
}, options: allowedRowFields
|
|
589
|
+
.filter((field) => field !== pivotColumnField)
|
|
590
|
+
.map((field) => {
|
|
461
591
|
return {
|
|
462
592
|
label: snakeAndCamelCaseToTitleCase(field),
|
|
463
593
|
value: field,
|
|
@@ -467,22 +597,14 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
467
597
|
setPivotColumnField(e.target.value === ''
|
|
468
598
|
? undefined
|
|
469
599
|
: e.target.value);
|
|
470
|
-
}, options: allowedColumnFields
|
|
600
|
+
}, options: allowedColumnFields
|
|
601
|
+
.filter((field) => field !== pivotRowField)
|
|
602
|
+
.map((field) => {
|
|
471
603
|
return {
|
|
472
604
|
label: snakeAndCamelCaseToTitleCase(field),
|
|
473
605
|
value: field,
|
|
474
606
|
};
|
|
475
|
-
}), isLoading: uniqueValuesIsLoading, width: 200 }) })] }), _jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-row-field", label: "
|
|
476
|
-
pivotFieldChange('valueField', e.target.value);
|
|
477
|
-
setPivotValueField(e.target.value === ''
|
|
478
|
-
? undefined
|
|
479
|
-
: e.target.value);
|
|
480
|
-
}, options: allowedValueFields.map((field) => {
|
|
481
|
-
return {
|
|
482
|
-
label: snakeAndCamelCaseToTitleCase(field),
|
|
483
|
-
value: field,
|
|
484
|
-
};
|
|
485
|
-
}), isLoading: uniqueValuesIsLoading, width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
|
|
607
|
+
}), isLoading: uniqueValuesIsLoading, width: 200 }) })] }), _jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
|
|
486
608
|
if (e.target.value !== 'count' &&
|
|
487
609
|
pivotValueField &&
|
|
488
610
|
!numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField).format)) {
|
|
@@ -493,10 +615,49 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
493
615
|
? undefined
|
|
494
616
|
: e.target.value);
|
|
495
617
|
}, options: [
|
|
496
|
-
...[
|
|
618
|
+
...[
|
|
619
|
+
'sum',
|
|
620
|
+
'average',
|
|
621
|
+
'count',
|
|
622
|
+
'max',
|
|
623
|
+
'min',
|
|
624
|
+
'percentage',
|
|
625
|
+
].map((option) => {
|
|
497
626
|
return { label: option, value: option };
|
|
498
627
|
}),
|
|
499
|
-
], width: 200 })
|
|
628
|
+
], width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
|
|
629
|
+
pivotFieldChange('valueField', e.target.value);
|
|
630
|
+
setPivotValueField(e.target.value === ''
|
|
631
|
+
? undefined
|
|
632
|
+
: e.target.value);
|
|
633
|
+
}, options: allowedValueFields
|
|
634
|
+
.map((field) => {
|
|
635
|
+
return {
|
|
636
|
+
label: snakeAndCamelCaseToTitleCase(field),
|
|
637
|
+
value: field,
|
|
638
|
+
};
|
|
639
|
+
})
|
|
640
|
+
.filter((option) => {
|
|
641
|
+
return (pivotAggregation !== 'percentage' ||
|
|
642
|
+
pivotColumnField ||
|
|
643
|
+
option.value !== pivotValueField2);
|
|
644
|
+
}), isLoading: uniqueValuesIsLoading, width: 200 }), pivotAggregation === 'percentage' ? (_jsx(SelectComponent, { id: "pivot-row-field", label: "Total field", value: pivotValueField2, onChange: (e) => {
|
|
645
|
+
pivotFieldChange('valueField2', e.target.value);
|
|
646
|
+
setPivotValueField2(e.target.value === ''
|
|
647
|
+
? undefined
|
|
648
|
+
: e.target.value);
|
|
649
|
+
}, options: allowedValueFields
|
|
650
|
+
.map((field) => {
|
|
651
|
+
return {
|
|
652
|
+
label: snakeAndCamelCaseToTitleCase(field),
|
|
653
|
+
value: field,
|
|
654
|
+
};
|
|
655
|
+
})
|
|
656
|
+
.filter((option) => {
|
|
657
|
+
return (pivotAggregation !== 'percentage' ||
|
|
658
|
+
pivotColumnField ||
|
|
659
|
+
option.value !== pivotValueField);
|
|
660
|
+
}), isLoading: uniqueValuesIsLoading, width: 200 })) : null] })] }), _jsxs("div", { children: [_jsx(ButtonComponent, { id: "custom-button", onClick: () => {
|
|
500
661
|
const errors = [];
|
|
501
662
|
if (!pivotValueField &&
|
|
502
663
|
pivotAggregation !== 'count') {
|
|
@@ -519,6 +680,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
519
680
|
columnField: pivotColumnField,
|
|
520
681
|
columnFieldType: columnsToShow[pivotColumnField || ''],
|
|
521
682
|
valueField: pivotValueField || '',
|
|
683
|
+
valueField2: pivotValueField2 || '',
|
|
522
684
|
aggregationType: pivotAggregation || '',
|
|
523
685
|
};
|
|
524
686
|
if (isValidPivot(pivot)) {
|
|
@@ -565,7 +727,27 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
565
727
|
display: 'flex',
|
|
566
728
|
flexDirection: 'row',
|
|
567
729
|
gap: 8,
|
|
568
|
-
}, children: [_jsx(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: _jsx("path", { fillRule: "evenodd", d: "M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z", clipRule: "evenodd" }) }) }), _jsx(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({}, null) })] }), isLoading ? (_jsx(LoadingComponent, {})) : (_jsx("div", {
|
|
730
|
+
}, children: [_jsx(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: _jsx("path", { fillRule: "evenodd", d: "M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z", clipRule: "evenodd" }) }) }), _jsx(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({}, null) })] }), isLoading || uniqueValuesIsLoading ? (_jsx(LoadingComponent, {})) : pivotError ? (_jsx("div", { style: {
|
|
731
|
+
width: '100%',
|
|
732
|
+
height: '140px',
|
|
733
|
+
display: 'flex',
|
|
734
|
+
justifyContent: 'center',
|
|
735
|
+
alignItems: 'center',
|
|
736
|
+
}, children: pivotError })) : (_jsx("div", { children: !hasNoRecommendedPivots ||
|
|
737
|
+
createdPivotTables.length > 0 ? (_jsx(PivotList, { recommendedPivotTables: recommendedPivotTables.filter((pivotTable) => !createdPivots.some((created) => created.rowField ===
|
|
738
|
+
pivotTable.pivot.rowField &&
|
|
739
|
+
created.columnField ===
|
|
740
|
+
pivotTable.pivot.columnField &&
|
|
741
|
+
created.valueField ===
|
|
742
|
+
pivotTable.pivot.valueField &&
|
|
743
|
+
created.aggregationType ===
|
|
744
|
+
pivotTable.pivot.aggregationType)), createdPivotTables: createdPivotTables, theme: theme, onSelectRecommendedPivot: onSelectRecommendedPivot, onSelectCreatedPivot: onSelectCreatedPivot, selectedPivotIndex: selectedPivotIndex, selectedPivotType: selectedPivotType, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, onEditRecommendedPivot: onEditRecommendedPivot, onEditCreatedPivot: onEditPivot, showPivotEditButton: showPivotEditButton, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent })) : (_jsx("div", { style: {
|
|
745
|
+
width: '100%',
|
|
746
|
+
height: '140px',
|
|
747
|
+
display: 'flex',
|
|
748
|
+
justifyContent: 'center',
|
|
749
|
+
alignItems: 'center',
|
|
750
|
+
}, children: "No valid pivots returned" })) }))] })) })) }) }) })] }) }));
|
|
569
751
|
};
|
|
570
752
|
export function generatePivotTableYAxis(pivot, cols, yAxisField) {
|
|
571
753
|
// For count aggregations, use 'count' for the label
|
|
@@ -602,10 +784,18 @@ function castValueToDate(value) {
|
|
|
602
784
|
if (!value) {
|
|
603
785
|
return null;
|
|
604
786
|
}
|
|
787
|
+
let dateStr = value;
|
|
605
788
|
if (typeof value === 'object' && value.value) {
|
|
606
|
-
|
|
789
|
+
dateStr = value.value;
|
|
790
|
+
}
|
|
791
|
+
if (dateStr instanceof Date) {
|
|
792
|
+
return dateStr;
|
|
607
793
|
}
|
|
608
|
-
|
|
794
|
+
const parsed = parseISO(dateStr);
|
|
795
|
+
if (isValid(parsed)) {
|
|
796
|
+
return parsed;
|
|
797
|
+
}
|
|
798
|
+
return new Date(dateStr);
|
|
609
799
|
}
|
|
610
800
|
function getLatestDate(a, b) {
|
|
611
801
|
return a > b ? a : b;
|
|
@@ -619,11 +809,11 @@ export function getDateRange(dateRange, column, data) {
|
|
|
619
809
|
const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
|
|
620
810
|
const minDate = new Date(0);
|
|
621
811
|
if (!dateRange) {
|
|
622
|
-
if (data.length == 0
|
|
812
|
+
if (data.length == 0) {
|
|
623
813
|
return { start: new Date(), end: new Date() };
|
|
624
814
|
}
|
|
625
|
-
const firstDate = castValueToDate(data[0][column]);
|
|
626
815
|
if (data.length == 1) {
|
|
816
|
+
const firstDate = castValueToDate(data[0][column]);
|
|
627
817
|
return {
|
|
628
818
|
start: firstDate || new Date(),
|
|
629
819
|
end: firstDate || new Date(),
|
|
@@ -632,12 +822,19 @@ export function getDateRange(dateRange, column, data) {
|
|
|
632
822
|
let earliestDate = undefined;
|
|
633
823
|
let latestDate = undefined;
|
|
634
824
|
for (let i = 0; i < data.length; i++) {
|
|
635
|
-
if (earliestDate && latestDate) {
|
|
636
|
-
break;
|
|
637
|
-
}
|
|
638
825
|
const value = castValueToDate(data[i][column]);
|
|
639
|
-
earliestDate =
|
|
640
|
-
|
|
826
|
+
earliestDate =
|
|
827
|
+
value && value > minDate
|
|
828
|
+
? earliestDate
|
|
829
|
+
? getEarliestDate(earliestDate, value)
|
|
830
|
+
: value
|
|
831
|
+
: earliestDate;
|
|
832
|
+
latestDate =
|
|
833
|
+
value && value < maxDate
|
|
834
|
+
? latestDate
|
|
835
|
+
? getLatestDate(latestDate, value)
|
|
836
|
+
: value
|
|
837
|
+
: latestDate;
|
|
641
838
|
}
|
|
642
839
|
if (!earliestDate || !latestDate) {
|
|
643
840
|
return {
|
|
@@ -683,6 +880,19 @@ function determineIntervalThroughOverride(dateBucket, dateRange) {
|
|
|
683
880
|
return eachMonthOfInterval(dateRange);
|
|
684
881
|
}
|
|
685
882
|
}
|
|
883
|
+
// function to that takes in a uniqueValues obj and trims the number of unique values per column
|
|
884
|
+
function trimUniqueValues(obj, limit) {
|
|
885
|
+
const trimmedObj = {};
|
|
886
|
+
Object.keys(obj).forEach((key) => {
|
|
887
|
+
const values = obj[key] ? Object.keys(obj[key]) : [];
|
|
888
|
+
const limitedValues = values.slice(0, limit);
|
|
889
|
+
trimmedObj[key] = limitedValues.reduce((acc, curr) => {
|
|
890
|
+
acc[curr] = obj[key] ? (obj[key][curr] ?? false) : false;
|
|
891
|
+
return acc;
|
|
892
|
+
}, {});
|
|
893
|
+
});
|
|
894
|
+
return trimmedObj;
|
|
895
|
+
}
|
|
686
896
|
export function getDateBuckets(dateRange, column, data, dateBucket) {
|
|
687
897
|
if (!dateRange) {
|
|
688
898
|
if (dateBucket) {
|
|
@@ -800,26 +1010,25 @@ const fixBigQueryData = (data = []) => {
|
|
|
800
1010
|
}
|
|
801
1011
|
return newData;
|
|
802
1012
|
};
|
|
803
|
-
export async function generatePivotTable(pivot,
|
|
1013
|
+
export async function generatePivotTable({ pivot, rowLimit = -1, dateBucket, report, client, uniqueValues, }) {
|
|
804
1014
|
try {
|
|
805
|
-
if (report && report.rowCount
|
|
1015
|
+
if (report && report.rowCount != null) {
|
|
1016
|
+
// rowCount can be 0 (could mean still loading in), loose equality check for undefined as well
|
|
806
1017
|
const dateFilter = report
|
|
807
1018
|
? report.filtersApplied.find((f) => f.filterType === 'date_range')
|
|
808
1019
|
: undefined;
|
|
809
1020
|
const pivotTable = await generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, pivot.columnField && uniqueValues
|
|
810
1021
|
? Object.keys(uniqueValues[pivot.columnField])
|
|
811
|
-
: undefined);
|
|
812
|
-
|
|
813
|
-
return pivotTable;
|
|
814
|
-
}
|
|
1022
|
+
: undefined, rowLimit === -1 ? undefined : rowLimit);
|
|
1023
|
+
return pivotTable;
|
|
815
1024
|
}
|
|
816
1025
|
}
|
|
817
1026
|
catch (e) {
|
|
818
|
-
|
|
1027
|
+
throw Error(`Failed to generate pivot table with SQL: ${e}`);
|
|
819
1028
|
}
|
|
820
|
-
|
|
1029
|
+
throw Error('Failed to generate pivot table: invalid report');
|
|
821
1030
|
}
|
|
822
|
-
export function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
|
|
1031
|
+
export function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, uniqueValues) {
|
|
823
1032
|
// If there is no rowField, aggregate on the valueField
|
|
824
1033
|
if (!pivot.rowField) {
|
|
825
1034
|
return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
|
|
@@ -837,9 +1046,15 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
837
1046
|
compRange = undefined;
|
|
838
1047
|
}
|
|
839
1048
|
const pivotRows = [];
|
|
1049
|
+
const uniqueValuesMap = uniqueValuesToStringMap(uniqueValues || {});
|
|
840
1050
|
const uniqueRows = (isDateField(pivot.rowFieldType || '')
|
|
841
1051
|
? getDateBuckets(dateRange, pivot.rowField, data, dateBucket)
|
|
842
|
-
: [
|
|
1052
|
+
: uniqueValuesMap[pivot.rowField] &&
|
|
1053
|
+
uniqueValuesMap[pivot.rowField]?.[0] !== 'EXCEEDS_LIMIT'
|
|
1054
|
+
? uniqueValuesMap[pivot.rowField]
|
|
1055
|
+
: [...new Set(data.map((item) => item[pivot.rowField || '']))])
|
|
1056
|
+
.filter((col) => col !== null && col !== '')
|
|
1057
|
+
.map((col) => isDateField(pivot.rowFieldType || '') ? castValueToDate(col) : col);
|
|
843
1058
|
const rowDateRange = getDateRange(dateRange, pivot.rowField, data);
|
|
844
1059
|
const compRowDateRange = getDateRange(compRange ?? dateRange, pivot.rowField, data);
|
|
845
1060
|
// If columnField is not provided, we will not be using uniqueColumns
|
|
@@ -847,8 +1062,10 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
847
1062
|
const uniqueColumns = (pivot.columnField
|
|
848
1063
|
? isDateField(pivot.columnFieldType || '')
|
|
849
1064
|
? getDateBuckets(dateRange, pivot.columnField, data, dateBucket)
|
|
850
|
-
:
|
|
851
|
-
|
|
1065
|
+
: uniqueValues && pivot.columnField
|
|
1066
|
+
? uniqueValuesMap[pivot.columnField]
|
|
1067
|
+
: [...new Set(data.map((item) => item[pivot.columnField || '']))]
|
|
1068
|
+
: [pivot.valueField]).filter((col) => col !== null && col !== '' && col !== undefined);
|
|
852
1069
|
// Map from new dates to their corresponding prior dates
|
|
853
1070
|
const COL_DATE_MAP = {};
|
|
854
1071
|
const ROW_DATE_MAP = {};
|
|
@@ -881,7 +1098,9 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
881
1098
|
}
|
|
882
1099
|
compUniqueRows = (isDateField(pivot.rowFieldType || '')
|
|
883
1100
|
? getCompDateBuckets(dateRange, compRange ?? dateRange, pivot.rowField, data)
|
|
884
|
-
:
|
|
1101
|
+
: (uniqueValuesMap[pivot.rowField] ?? [
|
|
1102
|
+
...new Set(data.map((item) => item[pivot.rowField || ''])),
|
|
1103
|
+
])).filter((col) => col !== null && col !== '');
|
|
885
1104
|
}
|
|
886
1105
|
// Special corner case for count with only rowField pivot
|
|
887
1106
|
if (!pivot.valueField &&
|
|
@@ -893,7 +1112,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
893
1112
|
}
|
|
894
1113
|
}
|
|
895
1114
|
const rowsToGenerate = rowLimit !== -1 && rowLimit <= uniqueRows.length
|
|
896
|
-
? uniqueRows.slice(0, rowLimit
|
|
1115
|
+
? uniqueRows.slice(0, rowLimit)
|
|
897
1116
|
: uniqueRows;
|
|
898
1117
|
rowsToGenerate.forEach((rowValue, rowIndex) => {
|
|
899
1118
|
const row = {
|
|
@@ -929,22 +1148,22 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
929
1148
|
if (isDateField(pivot.columnFieldType || '') &&
|
|
930
1149
|
isDateField(pivot.rowFieldType || '')) {
|
|
931
1150
|
filteredData = data.filter((item) => {
|
|
932
|
-
return (isWithinInterval(
|
|
1151
|
+
return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
|
|
933
1152
|
start: rowValue,
|
|
934
1153
|
end: subMilliseconds(nextRowValue, 1),
|
|
935
1154
|
}) &&
|
|
936
|
-
isWithinInterval(
|
|
1155
|
+
isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
|
|
937
1156
|
start: colValue,
|
|
938
1157
|
end: subMilliseconds(nextColumnValue, 1),
|
|
939
1158
|
}));
|
|
940
1159
|
});
|
|
941
1160
|
if (isComparison) {
|
|
942
1161
|
comparisonFilteredData = data.filter((item) => {
|
|
943
|
-
return (isWithinInterval(
|
|
1162
|
+
return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
|
|
944
1163
|
start: rowValue,
|
|
945
1164
|
end: subMilliseconds(nextRowValue, 1),
|
|
946
1165
|
}) &&
|
|
947
|
-
isWithinInterval(
|
|
1166
|
+
isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
|
|
948
1167
|
start: colValue,
|
|
949
1168
|
end: subMilliseconds(nextColumnValue, 1),
|
|
950
1169
|
}));
|
|
@@ -955,7 +1174,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
955
1174
|
!isDateField(pivot.rowFieldType || '')) {
|
|
956
1175
|
filteredData = data.filter((item) => {
|
|
957
1176
|
return (item[pivot.rowField || ''] === rowValue &&
|
|
958
|
-
isWithinInterval(
|
|
1177
|
+
isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
|
|
959
1178
|
start: colValue,
|
|
960
1179
|
end: subMilliseconds(nextColumnValue, 1),
|
|
961
1180
|
}));
|
|
@@ -963,7 +1182,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
963
1182
|
if (isComparison) {
|
|
964
1183
|
comparisonFilteredData = data.filter((item) => {
|
|
965
1184
|
return (item[`comparison_${pivot.rowField}`] === rowValue &&
|
|
966
|
-
isWithinInterval(
|
|
1185
|
+
isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
|
|
967
1186
|
start: colValue,
|
|
968
1187
|
end: subMilliseconds(nextColumnValue, 1),
|
|
969
1188
|
}));
|
|
@@ -973,14 +1192,14 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
973
1192
|
else if (!isDateField(pivot.columnFieldType || '') &&
|
|
974
1193
|
isDateField(pivot.rowFieldType || '')) {
|
|
975
1194
|
filteredData = data.filter((item) => {
|
|
976
|
-
return (isWithinInterval(
|
|
1195
|
+
return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
|
|
977
1196
|
start: rowValue,
|
|
978
1197
|
end: subMilliseconds(nextRowValue, 1),
|
|
979
1198
|
}) && item[pivot.columnField || ''] === colValue);
|
|
980
1199
|
});
|
|
981
1200
|
if (isComparison) {
|
|
982
1201
|
comparisonFilteredData = data.filter((item) => {
|
|
983
|
-
return (isWithinInterval(
|
|
1202
|
+
return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
|
|
984
1203
|
start: rowValue,
|
|
985
1204
|
end: subMilliseconds(nextRowValue, 1),
|
|
986
1205
|
}) &&
|
|
@@ -1009,7 +1228,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
1009
1228
|
filteredData = isDateField(pivot.rowFieldType || '')
|
|
1010
1229
|
? data.filter((item) => {
|
|
1011
1230
|
return (compRowValue &&
|
|
1012
|
-
isWithinInterval(
|
|
1231
|
+
isWithinInterval(getValidDate(item[`comparison_${pivot.rowField}`]) ?? 0, {
|
|
1013
1232
|
start: compRowValue,
|
|
1014
1233
|
end: subMilliseconds(compNextRowValue, 1),
|
|
1015
1234
|
}));
|
|
@@ -1019,7 +1238,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
1019
1238
|
else {
|
|
1020
1239
|
filteredData = isDateField(pivot.rowFieldType || '')
|
|
1021
1240
|
? data.filter((item) => {
|
|
1022
|
-
return isWithinInterval(
|
|
1241
|
+
return isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
|
|
1023
1242
|
start: rowValue,
|
|
1024
1243
|
end: subMilliseconds(nextRowValue, 1),
|
|
1025
1244
|
});
|
|
@@ -1145,24 +1364,11 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
|
|
|
1145
1364
|
];
|
|
1146
1365
|
if (pivot.sort) {
|
|
1147
1366
|
pivotRows.sort((a, b) => {
|
|
1148
|
-
if (pivot.
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
|
|
1152
|
-
}
|
|
1153
|
-
else if (isNumericColumnType(pivot.sortFieldType)) {
|
|
1154
|
-
return a[pivot.sortField] - b[pivot.sortField];
|
|
1155
|
-
}
|
|
1156
|
-
return a[pivot.sortField].localeCompare(b[pivot.sortField]);
|
|
1367
|
+
if (pivot.sortField) {
|
|
1368
|
+
const result = compareValues(a, b, pivot.sortField);
|
|
1369
|
+
return pivot.sortDirection === 'ASC' ? result : -result;
|
|
1157
1370
|
}
|
|
1158
1371
|
else {
|
|
1159
|
-
if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
|
|
1160
|
-
// @ts-ignore
|
|
1161
|
-
return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
|
|
1162
|
-
}
|
|
1163
|
-
else if (isNumericColumnType(pivot.sortFieldType)) {
|
|
1164
|
-
return b[pivot.sortField] - a[pivot.sortField];
|
|
1165
|
-
}
|
|
1166
1372
|
return b[pivot.sortField].localeCompare(a[pivot.sortField]);
|
|
1167
1373
|
}
|
|
1168
1374
|
});
|