@quillsql/react 2.9.1 → 2.9.3
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/AddToDashboardModal.d.ts +1 -0
- package/dist/AddToDashboardModal.d.ts.map +1 -1
- package/dist/AddToDashboardModal.js +152 -181
- package/dist/AddToDashboardModal.js.map +1 -1
- package/dist/BarList.d.ts +1 -0
- package/dist/BarList.js +36 -44
- package/dist/Chart.d.ts +5 -24
- package/dist/Chart.d.ts.map +1 -1
- package/dist/Chart.js +203 -802
- package/dist/Chart.js.map +1 -1
- package/dist/ChartBuilder.d.ts +1 -0
- package/dist/ChartBuilder.d.ts.map +1 -1
- package/dist/ChartBuilder.js +89 -91
- package/dist/ChartBuilder.js.map +1 -1
- package/dist/ChartEditor.d.ts +1 -0
- package/dist/ChartEditor.d.ts.map +1 -1
- package/dist/ChartEditor.js +23 -22
- package/dist/ChartEditor.js.map +1 -1
- package/dist/Context.d.ts +20 -0
- package/dist/Context.d.ts.map +1 -1
- package/dist/Context.js +82 -62
- package/dist/Context.js.map +1 -1
- package/dist/Dashboard.d.ts +4 -1
- package/dist/Dashboard.d.ts.map +1 -1
- package/dist/Dashboard.js +238 -336
- package/dist/Dashboard.js.map +1 -1
- package/dist/DateRangePicker/Calendar.d.ts +1 -0
- package/dist/DateRangePicker/Calendar.js +41 -46
- package/dist/DateRangePicker/DateRangePicker.d.ts +1 -0
- package/dist/DateRangePicker/DateRangePicker.js +32 -61
- package/dist/DateRangePicker/DateRangePickerButton.d.ts +1 -0
- package/dist/DateRangePicker/DateRangePickerButton.js +14 -17
- package/dist/DateRangePicker/dateRangePickerUtils.d.ts +1 -0
- package/dist/DateRangePicker/dateRangePickerUtils.js +76 -90
- package/dist/DateRangePicker/index.d.ts +1 -0
- package/dist/DateRangePicker/index.js +1 -9
- package/dist/PieChart.d.ts +1 -0
- package/dist/PieChart.js +35 -70
- package/dist/QuillProvider.d.ts +1 -0
- package/dist/QuillProvider.js +4 -7
- package/dist/ReportBuilder.d.ts +1 -0
- package/dist/ReportBuilder.js +120 -129
- package/dist/SQLEditor.d.ts +1 -0
- package/dist/SQLEditor.js +56 -65
- package/dist/SQLEditor.js.map +1 -1
- package/dist/Table.d.ts +1 -0
- package/dist/Table.d.ts.map +1 -1
- package/dist/Table.js +65 -65
- package/dist/Table.js.map +1 -1
- package/dist/TableChart.d.ts +1 -0
- package/dist/TableChart.js +17 -45
- package/dist/api/ServerClient.d.ts +30 -0
- package/dist/api/ServerClient.d.ts.map +1 -0
- package/dist/api/ServerClient.js +39 -0
- package/dist/api/ServerClient.js.map +1 -0
- package/dist/assets/ArrowDownHeadIcon.d.ts +1 -0
- package/dist/assets/ArrowDownHeadIcon.js +3 -6
- package/dist/assets/ArrowDownIcon.d.ts +1 -0
- package/dist/assets/ArrowDownIcon.js +3 -6
- package/dist/assets/ArrowDownRightIcon.d.ts +1 -0
- package/dist/assets/ArrowDownRightIcon.js +3 -6
- package/dist/assets/ArrowLeftHeadIcon.d.ts +1 -0
- package/dist/assets/ArrowLeftHeadIcon.js +3 -6
- package/dist/assets/ArrowRightHeadIcon.d.ts +1 -0
- package/dist/assets/ArrowRightHeadIcon.js +3 -6
- package/dist/assets/ArrowRightIcon.d.ts +1 -0
- package/dist/assets/ArrowRightIcon.js +3 -6
- package/dist/assets/ArrowUpHeadIcon.d.ts +1 -0
- package/dist/assets/ArrowUpHeadIcon.js +3 -6
- package/dist/assets/ArrowUpIcon.d.ts +1 -0
- package/dist/assets/ArrowUpIcon.js +3 -6
- package/dist/assets/ArrowUpRightIcon.d.ts +1 -0
- package/dist/assets/ArrowUpRightIcon.js +3 -6
- package/dist/assets/CalendarIcon.d.ts +1 -0
- package/dist/assets/CalendarIcon.js +3 -6
- package/dist/assets/CalendarNormalIcon.d.ts +1 -0
- package/dist/assets/CalendarNormalIcon.js +3 -6
- package/dist/assets/DoubleArrowLeftHeadIcon.d.ts +1 -0
- package/dist/assets/DoubleArrowLeftHeadIcon.js +3 -6
- package/dist/assets/DoubleArrowRightHeadIcon.d.ts +1 -0
- package/dist/assets/DoubleArrowRightHeadIcon.js +3 -6
- package/dist/assets/ExclamationFilledIcon.d.ts +1 -0
- package/dist/assets/ExclamationFilledIcon.js +3 -6
- package/dist/assets/FilterIcon.d.ts +1 -0
- package/dist/assets/FilterIcon.js +3 -6
- package/dist/assets/LoadingSpinner.d.ts +1 -0
- package/dist/assets/LoadingSpinner.js +3 -6
- package/dist/assets/RefreshIcon.d.ts +1 -0
- package/dist/assets/RefreshIcon.js +3 -6
- package/dist/assets/SearchIcon.d.ts +1 -0
- package/dist/assets/SearchIcon.js +3 -6
- package/dist/assets/UpLeftArrowsIcon.d.ts +1 -0
- package/dist/assets/UpLeftArrowsIcon.js +3 -6
- package/dist/assets/XCircleIcon.d.ts +1 -0
- package/dist/assets/XCircleIcon.js +3 -6
- package/dist/assets/XIcon.d.ts +1 -0
- package/dist/assets/XIcon.js +3 -6
- package/dist/assets/index.d.ts +1 -0
- package/dist/assets/index.js +21 -49
- package/dist/components/Banner/index.d.ts +1 -0
- package/dist/components/Banner/index.js +6 -10
- package/dist/components/BigModal/BigModal.d.ts +1 -0
- package/dist/components/BigModal/BigModal.js +13 -39
- package/dist/components/Chart/BarChart.d.ts +15 -0
- package/dist/components/Chart/BarChart.d.ts.map +1 -0
- package/dist/components/Chart/BarChart.js +57 -0
- package/dist/components/Chart/BarChart.js.map +1 -0
- package/dist/components/Chart/ChartTooltip.d.ts +29 -0
- package/dist/components/Chart/ChartTooltip.d.ts.map +1 -0
- package/dist/components/Chart/ChartTooltip.js +229 -0
- package/dist/components/Chart/ChartTooltip.js.map +1 -0
- package/dist/components/Chart/ChartTooltipFrame.d.ts +6 -0
- package/dist/components/Chart/ChartTooltipFrame.d.ts.map +1 -0
- package/dist/components/Chart/ChartTooltipFrame.js +12 -0
- package/dist/components/Chart/ChartTooltipFrame.js.map +1 -0
- package/dist/components/Chart/ChartTooltipGroup.d.ts +11 -0
- package/dist/components/Chart/ChartTooltipGroup.d.ts.map +1 -0
- package/dist/components/Chart/ChartTooltipGroup.js +23 -0
- package/dist/components/Chart/ChartTooltipGroup.js.map +1 -0
- package/dist/components/Chart/ChartTooltipRow.d.ts +8 -0
- package/dist/components/Chart/ChartTooltipRow.d.ts.map +1 -0
- package/dist/components/Chart/ChartTooltipRow.js +41 -0
- package/dist/components/Chart/ChartTooltipRow.js.map +1 -0
- package/dist/components/Chart/LineChart.d.ts +13 -0
- package/dist/components/Chart/LineChart.d.ts.map +1 -0
- package/dist/components/Chart/LineChart.js +68 -0
- package/dist/components/Chart/LineChart.js.map +1 -0
- package/dist/components/Dropdown/Dropdown.d.ts +1 -0
- package/dist/components/Dropdown/Dropdown.js +24 -53
- package/dist/components/Dropdown/DropdownItem.d.ts +1 -0
- package/dist/components/Dropdown/DropdownItem.js +9 -35
- package/dist/components/Dropdown/index.d.ts +1 -0
- package/dist/components/Dropdown/index.js +2 -11
- package/dist/components/Modal/Modal.d.ts +1 -0
- package/dist/components/Modal/Modal.js +13 -39
- package/dist/components/Modal/index.d.ts +1 -0
- package/dist/components/Modal/index.js +1 -9
- package/dist/components/QuillCard.d.ts +1 -0
- package/dist/components/QuillCard.js +8 -13
- package/dist/components/ReportBuilder/ColumnSelector.d.ts +24 -6
- package/dist/components/ReportBuilder/ColumnSelector.d.ts.map +1 -1
- package/dist/components/ReportBuilder/ColumnSelector.js +56 -8
- package/dist/components/ReportBuilder/ColumnSelector.js.map +1 -0
- package/dist/components/ReportBuilder/FiltersModal.d.ts +40 -0
- package/dist/components/ReportBuilder/FiltersModal.d.ts.map +1 -0
- package/dist/components/ReportBuilder/FiltersModal.js +273 -0
- package/dist/components/ReportBuilder/FiltersModal.js.map +1 -0
- package/dist/components/ReportBuilder/SortModal.d.ts +28 -0
- package/dist/components/ReportBuilder/SortModal.d.ts.map +1 -0
- package/dist/components/ReportBuilder/SortModal.js +41 -0
- package/dist/components/ReportBuilder/SortModal.js.map +1 -0
- package/dist/components/SqlTextEditor.d.ts +1 -0
- package/dist/components/SqlTextEditor.js +4 -11
- package/dist/components/UiComponents.d.ts +1 -0
- package/dist/components/UiComponents.js +37 -51
- package/dist/components/selectUtils.d.ts +1 -0
- package/dist/components/selectUtils.js +6 -17
- package/dist/contexts/BaseColorContext.d.ts +1 -0
- package/dist/contexts/BaseColorContext.js +3 -6
- package/dist/contexts/HoveredValueContext.d.ts +1 -0
- package/dist/contexts/HoveredValueContext.js +3 -6
- package/dist/contexts/RootStylesContext.d.ts +1 -0
- package/dist/contexts/RootStylesContext.js +3 -6
- package/dist/contexts/SelectedValueContext.d.ts +1 -0
- package/dist/contexts/SelectedValueContext.js +3 -6
- package/dist/contexts/index.d.ts +1 -0
- package/dist/contexts/index.js +4 -15
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +4 -15
- package/dist/hooks/useDashboard.d.ts +1 -0
- package/dist/hooks/useDashboard.js +10 -15
- package/dist/hooks/useInternalState.d.ts +1 -0
- package/dist/hooks/useInternalState.js +3 -6
- package/dist/hooks/useOnClickOutside.d.ts +1 -0
- package/dist/hooks/useOnClickOutside.js +3 -6
- package/dist/hooks/useOnWindowResize.d.ts +1 -0
- package/dist/hooks/useOnWindowResize.js +4 -7
- package/dist/hooks/useQuill.d.ts +3 -2
- package/dist/hooks/useQuill.d.ts.map +1 -1
- package/dist/hooks/useQuill.js +37 -28
- package/dist/hooks/useQuill.js.map +1 -1
- package/dist/hooks/useSelectOnKeyDown.d.ts +1 -0
- package/dist/hooks/useSelectOnKeyDown.js +4 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.js +13 -33
- package/dist/internals/ReportBuilder/PivotList.d.ts +1 -0
- package/dist/internals/ReportBuilder/PivotList.js +14 -20
- package/dist/internals/ReportBuilder/PivotModal.d.ts +3 -2
- package/dist/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/internals/ReportBuilder/PivotModal.js +280 -115
- package/dist/internals/ReportBuilder/PivotModal.js.map +1 -1
- package/dist/internals/ReportBuilder/PivotModal.spec.d.ts +1 -0
- package/dist/internals/ReportBuilder/PivotModal.spec.js +70 -73
- package/dist/lib/font.d.ts +1 -0
- package/dist/lib/font.js +2 -6
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +3 -20
- package/dist/lib/inputTypes.d.ts +1 -0
- package/dist/lib/inputTypes.js +1 -3
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.js +8 -19
- package/dist/test-data/tables.d.ts.map +1 -1
- package/dist/test-data/tables.js +27 -585
- package/dist/test-data/tables.js.map +1 -0
- package/dist/utils/aggregate.d.ts +1 -0
- package/dist/utils/aggregate.js +28 -35
- package/dist/utils/ast.d.ts +18 -0
- package/dist/utils/ast.d.ts.map +1 -0
- package/dist/utils/ast.js +310 -0
- package/dist/utils/ast.js.map +1 -0
- package/dist/utils/axisFormatter.d.ts +1 -0
- package/dist/utils/axisFormatter.js +19 -24
- package/dist/utils/color.d.ts +13 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +247 -0
- package/dist/utils/color.js.map +1 -0
- package/dist/utils/colorToHex.d.ts +1 -0
- package/dist/utils/colorToHex.js +1 -5
- package/dist/utils/crypto.d.ts +2 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +6 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/dataFetcher.d.ts +1 -0
- package/dist/utils/dataFetcher.d.ts.map +1 -1
- package/dist/utils/dataFetcher.js +8 -9
- package/dist/utils/dataFetcher.js.map +1 -1
- package/dist/utils/dates.d.ts +10 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +32 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/downloadCSV.d.ts +1 -0
- package/dist/utils/downloadCSV.js +1 -6
- package/dist/utils/getDomain.d.ts +8 -0
- package/dist/utils/getDomain.d.ts.map +1 -0
- package/dist/utils/getDomain.js +28 -0
- package/dist/utils/getDomain.js.map +1 -0
- package/dist/utils/merge.d.ts +2 -0
- package/dist/utils/merge.d.ts.map +1 -0
- package/dist/utils/merge.js +45 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/utils/schema.d.ts +7 -2
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +13 -7
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/sorting.d.ts +5 -0
- package/dist/utils/sorting.d.ts.map +1 -0
- package/dist/utils/sorting.js +14 -0
- package/dist/utils/sorting.js.map +1 -0
- package/dist/utils/textFormatting.d.ts.map +1 -1
- package/dist/utils/textFormatting.js +0 -1
- package/dist/utils/textFormatting.js.map +1 -0
- package/dist/utils/valueFormatter.d.ts +1 -0
- package/dist/utils/valueFormatter.js +19 -24
- package/dist/utils/valueFormatterCSV.d.ts +1 -0
- package/dist/utils/valueFormatterCSV.js +19 -24
- package/package.json +2 -3
- package/dist/DateRangePicker/Calendar.js.map +0 -1
- package/dist/DateRangePicker/dateRangePickerUtils.js.map +0 -1
- package/dist/DateRangePicker/index.js.map +0 -1
- package/dist/PieChart.js.map +0 -1
- package/dist/QuillProvider.js.map +0 -1
- package/dist/assets/ArrowDownIcon.js.map +0 -1
- package/dist/assets/ArrowDownRightIcon.js.map +0 -1
- package/dist/assets/ArrowLeftHeadIcon.js.map +0 -1
- package/dist/assets/ArrowRightHeadIcon.js.map +0 -1
- package/dist/assets/ArrowRightIcon.js.map +0 -1
- package/dist/assets/ArrowUpHeadIcon.js.map +0 -1
- package/dist/assets/ArrowUpIcon.js.map +0 -1
- package/dist/assets/ArrowUpRightIcon.js.map +0 -1
- package/dist/assets/CalendarIcon.js.map +0 -1
- package/dist/assets/CalendarNormalIcon.js.map +0 -1
- package/dist/assets/DoubleArrowLeftHeadIcon.js.map +0 -1
- package/dist/assets/DoubleArrowRightHeadIcon.js.map +0 -1
- package/dist/assets/ExclamationFilledIcon.js.map +0 -1
- package/dist/assets/FilterIcon.js.map +0 -1
- package/dist/assets/LoadingSpinner.js.map +0 -1
- package/dist/assets/RefreshIcon.js.map +0 -1
- package/dist/assets/SearchIcon.js.map +0 -1
- package/dist/assets/UpLeftArrowsIcon.js.map +0 -1
- package/dist/assets/XCircleIcon.js.map +0 -1
- package/dist/assets/XIcon.js.map +0 -1
- package/dist/assets/index.js.map +0 -1
- package/dist/components/BigModal/BigModal.js.map +0 -1
- package/dist/components/Dropdown/Dropdown.js.map +0 -1
- package/dist/components/Dropdown/DropdownItem.js.map +0 -1
- package/dist/components/Dropdown/index.js.map +0 -1
- package/dist/components/Modal/Modal.js.map +0 -1
- package/dist/components/Modal/index.js.map +0 -1
- package/dist/components/QuillCard.js.map +0 -1
- package/dist/components/selectUtils.js.map +0 -1
- package/dist/contexts/BaseColorContext.js.map +0 -1
- package/dist/contexts/HoveredValueContext.js.map +0 -1
- package/dist/contexts/RootStylesContext.js.map +0 -1
- package/dist/contexts/SelectedValueContext.js.map +0 -1
- package/dist/contexts/index.js.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/useDashboard.js.map +0 -1
- package/dist/hooks/useInternalState.js.map +0 -1
- package/dist/hooks/useOnClickOutside.js.map +0 -1
- package/dist/hooks/useOnWindowResize.js.map +0 -1
- package/dist/hooks/useSelectOnKeyDown.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internals/ReportBuilder/PivotModal.spec.js.map +0 -1
- package/dist/lib/font.js.map +0 -1
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/inputTypes.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
- package/dist/utils/aggregate.js.map +0 -1
- package/dist/utils/downloadCSV.js.map +0 -1
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generatePivotTable = exports.isDateField = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
2
|
// @ts-nocheck
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from 'react';
|
|
4
|
+
import { ClientContext } from '../../Context';
|
|
5
|
+
import { getDataFromCloud } from '../../utils/dataFetcher';
|
|
6
|
+
import { RefreshIcon } from '../../assets';
|
|
7
|
+
import { PivotList, PivotCard } from './PivotList';
|
|
8
|
+
import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, min, max, } from 'date-fns';
|
|
9
|
+
import { valueFormatter } from '../../utils/valueFormatter';
|
|
10
|
+
import { numberFormatOptions, snakeCaseToTitleCase } from '../../ChartBuilder';
|
|
11
|
+
import { QuillCard } from '../../components/QuillCard';
|
|
15
12
|
const QuillHover = () => {
|
|
16
|
-
return ((
|
|
13
|
+
return (_jsx("style", { children: `
|
|
17
14
|
.quill-hover {
|
|
18
15
|
background-color: white;
|
|
19
16
|
}
|
|
@@ -25,8 +22,8 @@ const QuillHover = () => {
|
|
|
25
22
|
}
|
|
26
23
|
` }));
|
|
27
24
|
};
|
|
28
|
-
const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, PopoverComponent, 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, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, }) => {
|
|
29
|
-
const [isLoading, setIsLoading] =
|
|
25
|
+
export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, PopoverComponent, 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, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, }) => {
|
|
26
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
30
27
|
// for testing
|
|
31
28
|
// const [createdPivots, setCreatedPivots] = useState<Pivot[]>([
|
|
32
29
|
// {
|
|
@@ -57,16 +54,16 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
57
54
|
// title: 'sum of amount by created_at and merchant',
|
|
58
55
|
// },
|
|
59
56
|
// ]);
|
|
60
|
-
const [pivotUpdateIndex, setPivotUpdateIndex] =
|
|
61
|
-
const [selectedPivotType, setSelectedPivotType] =
|
|
62
|
-
const [errors, setErrors] =
|
|
63
|
-
const [client] =
|
|
64
|
-
const [divWidth, setDivWidth] =
|
|
65
|
-
const editModalRef =
|
|
57
|
+
const [pivotUpdateIndex, setPivotUpdateIndex] = useState(null);
|
|
58
|
+
const [selectedPivotType, setSelectedPivotType] = useState('recommended');
|
|
59
|
+
const [errors, setErrors] = useState([]);
|
|
60
|
+
const [client] = useContext(ClientContext);
|
|
61
|
+
const [divWidth, setDivWidth] = useState(0);
|
|
62
|
+
const editModalRef = useRef();
|
|
66
63
|
const calculateWidth = () => {
|
|
67
64
|
return editModalRef.current.offsetWidth;
|
|
68
65
|
};
|
|
69
|
-
|
|
66
|
+
useEffect(() => {
|
|
70
67
|
// Measure the width of the div and update state
|
|
71
68
|
if (editModalRef.current) {
|
|
72
69
|
setDivWidth(calculateWidth());
|
|
@@ -83,13 +80,13 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
83
80
|
window.removeEventListener('resize', handleResize);
|
|
84
81
|
};
|
|
85
82
|
}, []);
|
|
86
|
-
|
|
83
|
+
useEffect(() => {
|
|
87
84
|
// Measure the width of the div and update state
|
|
88
85
|
if (editModalRef.current) {
|
|
89
86
|
setDivWidth(calculateWidth());
|
|
90
87
|
}
|
|
91
88
|
}, [editModalRef.current, showUpdatePivot]);
|
|
92
|
-
|
|
89
|
+
useEffect(() => {
|
|
93
90
|
setSelectedPivotIndex(-1);
|
|
94
91
|
setPivotUpdateIndex(null);
|
|
95
92
|
setSelectedPivotType(undefined);
|
|
@@ -100,7 +97,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
100
97
|
setIsOpen(false);
|
|
101
98
|
setErrors([]);
|
|
102
99
|
}, [selectedTable]);
|
|
103
|
-
const columnsToShow =
|
|
100
|
+
const columnsToShow = useMemo(() => {
|
|
104
101
|
return (columns || []).reduce((map, col) => {
|
|
105
102
|
// only use columns shown in the report builder's table
|
|
106
103
|
// also filter out id
|
|
@@ -110,7 +107,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
110
107
|
return map;
|
|
111
108
|
}, {});
|
|
112
109
|
}, [columns]);
|
|
113
|
-
const selectedPivotTable =
|
|
110
|
+
const selectedPivotTable = useMemo(() => {
|
|
114
111
|
if (selectedPivotIndex === -1) {
|
|
115
112
|
return null;
|
|
116
113
|
}
|
|
@@ -122,7 +119,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
122
119
|
columns: columns,
|
|
123
120
|
};
|
|
124
121
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
125
|
-
const columnSelectOptions =
|
|
122
|
+
const columnSelectOptions = useMemo(() => {
|
|
126
123
|
return [
|
|
127
124
|
{ label: 'Select', value: '' },
|
|
128
125
|
...Object.keys(columnsToShow).map((key) => {
|
|
@@ -161,7 +158,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
161
158
|
const onEditRecommendedPivot = (pivot, index) => {
|
|
162
159
|
onEditPivot(pivot, null);
|
|
163
160
|
};
|
|
164
|
-
const refreshPivots =
|
|
161
|
+
const refreshPivots = useCallback(async () => {
|
|
165
162
|
if (isLoading || Object.keys(columnsToShow).length === 0) {
|
|
166
163
|
return;
|
|
167
164
|
}
|
|
@@ -178,7 +175,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
178
175
|
}, {}),
|
|
179
176
|
};
|
|
180
177
|
try {
|
|
181
|
-
const resp = await
|
|
178
|
+
const resp = await getDataFromCloud(client, 'pivotai', cloudBody);
|
|
182
179
|
const recommendedPivots = resp?.data?.pivotTables || [];
|
|
183
180
|
// for testing if needed
|
|
184
181
|
// const recommendedPivots = [
|
|
@@ -241,26 +238,26 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
241
238
|
}
|
|
242
239
|
setIsLoading(false);
|
|
243
240
|
}, [selectedTable, data, columnsToShow, isLoading]);
|
|
244
|
-
|
|
241
|
+
useEffect(() => {
|
|
245
242
|
if (recommendedPivots.length === 0) {
|
|
246
243
|
refreshPivots();
|
|
247
244
|
}
|
|
248
245
|
}, [refreshPivots]);
|
|
249
|
-
const recommendedPivotTables =
|
|
246
|
+
const recommendedPivotTables = useMemo(() => {
|
|
250
247
|
const pts = recommendedPivots.map((p) => {
|
|
251
248
|
const { rows, columns } = generatePivotTable(p, data, dateRange, 6);
|
|
252
249
|
return { pivot: p, rows, columns };
|
|
253
250
|
});
|
|
254
251
|
return pts;
|
|
255
252
|
}, [recommendedPivots, data]);
|
|
256
|
-
const createdPivotTables =
|
|
253
|
+
const createdPivotTables = useMemo(() => {
|
|
257
254
|
const pts = createdPivots.map((p) => {
|
|
258
255
|
const { rows, columns } = generatePivotTable(p, data, dateRange, 6);
|
|
259
256
|
return { pivot: p, rows, columns };
|
|
260
257
|
});
|
|
261
258
|
return pts;
|
|
262
259
|
}, [createdPivots, data]);
|
|
263
|
-
const samplePivotTable =
|
|
260
|
+
const samplePivotTable = useMemo(() => {
|
|
264
261
|
if (!pivotAggregation || !pivotRowField) {
|
|
265
262
|
return null;
|
|
266
263
|
}
|
|
@@ -281,15 +278,15 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
281
278
|
pivotColumnField,
|
|
282
279
|
columnsToShow,
|
|
283
280
|
]);
|
|
284
|
-
return ((
|
|
281
|
+
return (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsxs("div", { style: {
|
|
285
282
|
position: 'relative',
|
|
286
283
|
display: 'inline-block',
|
|
287
284
|
textAlign: 'left',
|
|
288
|
-
}, children: [(
|
|
285
|
+
}, children: [_jsx("div", { style: {
|
|
289
286
|
display: 'flex',
|
|
290
287
|
flexDirection: 'row',
|
|
291
288
|
alignItems: 'center',
|
|
292
|
-
}, children: selectedPivotIndex !== -1 && ((
|
|
289
|
+
}, children: selectedPivotIndex !== -1 && (_jsx("span", { style: {
|
|
293
290
|
height: 10,
|
|
294
291
|
width: 10,
|
|
295
292
|
backgroundColor: theme.primaryButtonColor,
|
|
@@ -297,7 +294,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
297
294
|
position: 'absolute',
|
|
298
295
|
top: -2,
|
|
299
296
|
right: -2,
|
|
300
|
-
} })) }), (
|
|
297
|
+
} })) }), _jsx(PopoverComponent, { onClose: () => {
|
|
301
298
|
setShowUpdatePivot(false);
|
|
302
299
|
setPopUpTitle('Add Pivot');
|
|
303
300
|
}, style: rightAlign ? { right: 0 } : {}, parentRef: parentRef, showTrigger: showTrigger, label: triggerButtonText, isOpen: isOpen, setIsOpen: setIsOpen, onClick: () => {
|
|
@@ -309,52 +306,52 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
309
306
|
refreshPivots();
|
|
310
307
|
}
|
|
311
308
|
setShowUpdatePivot(false);
|
|
312
|
-
}, children: (
|
|
309
|
+
}, children: _jsx("div", { children: showUpdatePivot ? (_jsxs("div", { className: "ref-in-use", ref: editModalRef, style: {
|
|
313
310
|
backgroundColor: 'rgb(255, 255, 255)',
|
|
314
311
|
display: 'flex',
|
|
315
312
|
flexDirection: 'column',
|
|
316
|
-
}, children: [(
|
|
313
|
+
}, children: [_jsx(HeaderComponent, { children: popUpTitle }), _jsx("div", { style: { height: 12 } }), _jsx("div", { style: { width: divWidth }, children: samplePivotTable ? (_jsx("div", { style: {
|
|
317
314
|
marginBottom: 20,
|
|
318
315
|
minHeight: 160,
|
|
319
|
-
}, children: (
|
|
316
|
+
}, children: _jsx(PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, onSelectPivot: () => { }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 140, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent }) })) : (_jsx("div", { style: { marginBottom: 20, maxWidth: 470 }, children: _jsx(QuillCard, { theme: theme, clickable: false, children: _jsx("div", { style: {
|
|
320
317
|
color: theme.secondaryTextColor,
|
|
321
|
-
}, children: "Select a row field and aggregation type to see a preview" }) }) })) }), (
|
|
318
|
+
}, children: "Select a row field and aggregation type to see a preview" }) }) })) }), _jsxs("div", { style: {
|
|
322
319
|
display: 'flex',
|
|
323
320
|
flexDirection: 'column',
|
|
324
321
|
gap: 10,
|
|
325
322
|
alignItems: 'center',
|
|
326
323
|
justifyContent: 'space-between',
|
|
327
|
-
}, children: [(
|
|
324
|
+
}, children: [_jsxs("div", { style: {
|
|
328
325
|
display: 'flex',
|
|
329
326
|
flexDirection: 'row',
|
|
330
327
|
gap: 20,
|
|
331
328
|
marginBottom: 5,
|
|
332
|
-
}, children: [(
|
|
329
|
+
}, children: [_jsxs("div", { children: [_jsx(LabelComponent, { children: "Row Field" }), _jsx(SelectComponent, { label: 'Row Field', id: "pivot-row-field", value: pivotRowField, onChange: (e) => {
|
|
333
330
|
setPivotRowField(e === '' ? undefined : e);
|
|
334
|
-
}, options: columnSelectOptions, theme: theme })] }), (
|
|
331
|
+
}, options: columnSelectOptions, theme: theme })] }), _jsxs("div", { children: [_jsx(LabelComponent, { children: "Column Field" }), _jsx(SelectComponent, { label: 'Column Field', id: "pivot-row-field", value: pivotColumnField, onChange: (e) => {
|
|
335
332
|
setPivotColumnField(e === '' ? undefined : e);
|
|
336
|
-
}, options: columnSelectOptions, theme: theme })] })] }), (
|
|
333
|
+
}, options: columnSelectOptions, theme: theme })] })] }), _jsxs("div", { style: {
|
|
337
334
|
display: 'flex',
|
|
338
335
|
flexDirection: 'row',
|
|
339
336
|
gap: 20,
|
|
340
337
|
marginBottom: 20,
|
|
341
|
-
}, children: [(
|
|
338
|
+
}, children: [_jsxs("div", { children: [_jsx(LabelComponent, { children: "Value Field" }), _jsx(SelectComponent, { label: 'Value Field', id: "pivot-row-field", value: pivotValueField, onChange: (e) => {
|
|
342
339
|
setPivotValueField(e === '' ? undefined : e);
|
|
343
340
|
}, options: pivotAggregation === 'count'
|
|
344
341
|
? columnSelectOptions
|
|
345
342
|
: columnSelectOptions.filter((option) => {
|
|
346
343
|
return (option.value === '' ||
|
|
347
|
-
|
|
348
|
-
}), theme: theme })] }), (
|
|
344
|
+
numberFormatOptions.includes(columns.find((col) => col.field === option.value)?.format));
|
|
345
|
+
}), theme: theme })] }), _jsxs("div", { children: [_jsx(LabelComponent, { children: "Aggregation Type" }), _jsx(SelectComponent, { label: 'Aggregation Type', id: "pivot-row-field", value: pivotAggregation, theme: theme, onChange: (e) => {
|
|
349
346
|
if (e !== 'count' &&
|
|
350
347
|
pivotValueField &&
|
|
351
|
-
!
|
|
348
|
+
!numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)?.format)) {
|
|
352
349
|
setPivotValueField(null);
|
|
353
350
|
}
|
|
354
351
|
setPivotAggregation(e === '' ? undefined : e);
|
|
355
352
|
}, options: ['', 'sum', 'average', 'count'].map((option) => {
|
|
356
353
|
return { label: option || 'Select', value: option };
|
|
357
|
-
}) })] })] })] }), (
|
|
354
|
+
}) })] })] })] }), _jsx("div", { children: _jsx(ButtonComponent, { id: "custom-button", onClick: () => {
|
|
358
355
|
const errors = [];
|
|
359
356
|
if (!pivotRowField) {
|
|
360
357
|
errors.push('Row field cannot be empty');
|
|
@@ -381,13 +378,13 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
381
378
|
setPopUpTitle('Add Pivot');
|
|
382
379
|
}
|
|
383
380
|
setErrors(errors);
|
|
384
|
-
}, label: popUpTitle }) }), (
|
|
381
|
+
}, label: popUpTitle }) }), _jsx("div", { children: errors.length > 0 && (_jsxs("div", { children: [_jsx("div", { style: {
|
|
385
382
|
fontSize: 14,
|
|
386
383
|
marginBottom: '6px',
|
|
387
384
|
marginTop: '12px',
|
|
388
385
|
fontWeight: '600',
|
|
389
386
|
color: theme.secondaryTextColor,
|
|
390
|
-
}, children: "Pivot Errors" }), errors.map((error, index) => ((
|
|
387
|
+
}, children: "Pivot Errors" }), errors.map((error, index) => (_jsx("div", { style: {
|
|
391
388
|
borderRadius: 8,
|
|
392
389
|
backgroundColor: '#FF9494',
|
|
393
390
|
paddingLeft: '12px',
|
|
@@ -400,7 +397,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
400
397
|
fontFamily: theme?.fontFamily,
|
|
401
398
|
color: 'white',
|
|
402
399
|
marginBottom: 5,
|
|
403
|
-
}, children: error }, index)))] })) })] })) : ((
|
|
400
|
+
}, children: error }, index)))] })) })] })) : (_jsx("div", { style: {
|
|
404
401
|
display: 'flex',
|
|
405
402
|
flexDirection: 'column',
|
|
406
403
|
fontFamily: theme?.fontFamily,
|
|
@@ -408,20 +405,20 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
408
405
|
width: selectedPivotTable ? 500 : 600,
|
|
409
406
|
maxHeight: 600,
|
|
410
407
|
overflowY: 'scroll',
|
|
411
|
-
}, children: selectedPivotIndex >= 0 ? ((
|
|
408
|
+
}, children: selectedPivotIndex >= 0 ? (_jsx("div", { children: _jsx("div", { onClick: () => {
|
|
412
409
|
setPopUpTitle('Edit Pivot');
|
|
413
410
|
onEditPivot(createdPivots[0], 0);
|
|
414
|
-
}, children: (
|
|
411
|
+
}, children: _jsx(PivotCard, { pivotTable: {
|
|
415
412
|
pivot: selectedPivotTable?.pivot,
|
|
416
413
|
rows: selectedPivotTable?.rows,
|
|
417
414
|
columns: selectedPivotTable?.columns,
|
|
418
415
|
}, theme: theme, index: 0, onSelectPivot: () => { }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, onClose: () => {
|
|
419
416
|
removePivot();
|
|
420
|
-
}, clickable: true, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent }) }) })) : ((
|
|
417
|
+
}, clickable: true, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent }) }) })) : (_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx("div", { style: {
|
|
421
418
|
fontWeight: '600',
|
|
422
419
|
marginBottom: 5,
|
|
423
420
|
fontSize: 18,
|
|
424
|
-
}, children: "Recommended Pivots" }), (
|
|
421
|
+
}, children: "Recommended Pivots" }), _jsx("div", { children: _jsxs("div", { onClick: refreshPivots, style: {
|
|
425
422
|
color: theme?.secondaryTextColor,
|
|
426
423
|
cursor: 'pointer',
|
|
427
424
|
marginTop: 0,
|
|
@@ -436,7 +433,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
436
433
|
paddingTop: 6,
|
|
437
434
|
paddingBottom: 6,
|
|
438
435
|
borderRadius: 5,
|
|
439
|
-
}, className: "quill-hover", children: [(
|
|
436
|
+
}, className: "quill-hover", children: [_jsx(QuillHover, {}), _jsx(RefreshIcon, { style: { marginRight: 5 } }), "Refresh"] }) }), isLoading ? (_jsxs("div", { style: {
|
|
440
437
|
background: theme.backgroundColor,
|
|
441
438
|
width: 250,
|
|
442
439
|
minWidth: 250,
|
|
@@ -447,20 +444,19 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
|
|
|
447
444
|
display: 'flex',
|
|
448
445
|
margin: '0px auto',
|
|
449
446
|
justifyContent: 'center',
|
|
450
|
-
}, children: [(
|
|
447
|
+
}, children: [_jsx("div", { style: { height: 100 } }), _jsxs("svg", { width: "24", height: "24", children: [_jsx("circle", { cx: "12", cy: "12", r: "9.375", strokeWidth: "3.75", strokeDasharray: "calc(2 * 3.14 * 9.375 / 3) calc(2 * 3.14 * 9.375 * 2 / 3)", strokeDashoffset: "calc(2 * 3.14 * 9.375 / 6)", stroke: theme?.primaryTextColor || '#364153', fill: "none", transform: "rotate(-90 12 12)", children: _jsx("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "-180 12 12", to: "180 12 12", dur: "0.8s", repeatCount: "indefinite" }) }), _jsx("circle", { cx: "12", cy: "12", r: "9.375", strokeWidth: "3.75", strokeDasharray: "calc(2 * 3.14 * 9.375 / 3) calc(2 * 3.14 * 9.375 * 1 / 3)", strokeDashoffset: "calc(2 * 3.14 * 9.375 / 3) calc(2 * 3.14 * 9.375 * 2 / 3)", stroke: '#ADB1B9', fill: "none", transform: "rotate(90 12 12)", children: _jsx("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "0 12 12", to: "360 12 12", dur: "0.8s", repeatCount: "indefinite" }) })] })] })) : (_jsxs("div", { children: [recommendedPivotTables.length == 0 && (_jsx("div", { style: { marginBottom: 20 }, children: "There are currently no recommended pivots available." })), _jsx(PivotList, { recommendedPivotTables: recommendedPivotTables, createdPivotTables: createdPivotTables, theme: theme, onSelectRecommendedPivot: onSelectRecommendedPivot, onSelectCreatedPivot: onSelectCreatedPivot, selectedPivotIndex: selectedPivotIndex, selectedPivotType: selectedPivotType, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, onEditRecommendedPivot: onEditRecommendedPivot, onEditCreatedPivot: onEditPivot, showCreatePivot: true, showPivotEditButton: showPivotEditButton, LabelComponent: LabelComponent, TextComponent: TextComponent })] }))] })) })) }) })] }) }));
|
|
451
448
|
};
|
|
452
|
-
|
|
453
|
-
function generatePivotTableYAxis(pivot, cols, format) {
|
|
449
|
+
export function generatePivotTableYAxis(pivot, cols, format) {
|
|
454
450
|
// Use the column field for the field and label if there is one
|
|
455
451
|
if (pivot.columnField) {
|
|
456
452
|
return cols.slice(1).map(({ field, label }) => ({ field, label, format }));
|
|
457
453
|
}
|
|
458
454
|
// For count aggregations, use 'count' for the label
|
|
459
|
-
if (pivot?.aggregationType ===
|
|
460
|
-
return [{ field: pivot.valueField, label:
|
|
455
|
+
if (pivot?.aggregationType === 'count') {
|
|
456
|
+
return [{ field: pivot.valueField, label: 'count', format: format }];
|
|
461
457
|
}
|
|
462
458
|
// For average aggregations, use 'average <label>' for the label
|
|
463
|
-
if (pivot?.aggregationType ===
|
|
459
|
+
if (pivot?.aggregationType === 'average') {
|
|
464
460
|
const label = `average ${pivot.valueField}`;
|
|
465
461
|
return [{ field: pivot.valueField, label, format: format }];
|
|
466
462
|
}
|
|
@@ -473,9 +469,8 @@ function generatePivotTableYAxis(pivot, cols, format) {
|
|
|
473
469
|
},
|
|
474
470
|
];
|
|
475
471
|
}
|
|
476
|
-
exports.generatePivotTableYAxis = generatePivotTableYAxis;
|
|
477
472
|
function generatePivotTitle(pivot) {
|
|
478
|
-
return
|
|
473
|
+
return snakeCaseToTitleCase(`${pivot.aggregationType} of ${pivot.valueField} by ${pivot.rowField}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
|
|
479
474
|
}
|
|
480
475
|
function getDateRange(dateRange, column, data) {
|
|
481
476
|
if (!dateRange || !dateRange[0]) {
|
|
@@ -494,9 +489,9 @@ function getDateRange(dateRange, column, data) {
|
|
|
494
489
|
for (let i = 0; i < data.length; i++) {
|
|
495
490
|
if (data[i][column]) {
|
|
496
491
|
const value = new Date(data[i][column]);
|
|
497
|
-
lastestDate = lastestDate === null ? value :
|
|
492
|
+
lastestDate = lastestDate === null ? value : max([lastestDate, value]);
|
|
498
493
|
earliestDate =
|
|
499
|
-
earliestDate === null ? value :
|
|
494
|
+
earliestDate === null ? value : min([earliestDate, value]);
|
|
500
495
|
}
|
|
501
496
|
}
|
|
502
497
|
return { start: earliestDate, end: lastestDate };
|
|
@@ -507,20 +502,30 @@ function getDateRange(dateRange, column, data) {
|
|
|
507
502
|
}
|
|
508
503
|
function getDateBuckets(dateRange, column, data) {
|
|
509
504
|
if (!dateRange || !dateRange[0]) {
|
|
510
|
-
return
|
|
505
|
+
return eachMonthOfInterval(getDateRange(dateRange, column, data));
|
|
511
506
|
}
|
|
512
|
-
const dayDifference =
|
|
507
|
+
const dayDifference = differenceInDays(new Date(dateRange[1]), new Date(dateRange[0]));
|
|
508
|
+
return dayDifferenceToInterval(dayDifference, dateRange);
|
|
509
|
+
}
|
|
510
|
+
function getCompDateBuckets(dateRange, compDateRange, column, data) {
|
|
511
|
+
if (!dateRange || !dateRange[0]) {
|
|
512
|
+
return eachMonthOfInterval(getDateRange(dateRange, column, data));
|
|
513
|
+
}
|
|
514
|
+
const dayDifference = differenceInDays(new Date(dateRange[1]), new Date(dateRange[0]));
|
|
515
|
+
return dayDifferenceToInterval(dayDifference, compDateRange);
|
|
516
|
+
}
|
|
517
|
+
function dayDifferenceToInterval(dayDifference, dateRange) {
|
|
513
518
|
if (dayDifference < 14) {
|
|
514
|
-
return
|
|
519
|
+
return eachDayOfInterval({ start: dateRange[0], end: dateRange[1] });
|
|
515
520
|
}
|
|
516
521
|
else if (dayDifference < 60) {
|
|
517
|
-
return
|
|
522
|
+
return eachWeekOfInterval({ start: dateRange[0], end: dateRange[1] }, { weekStartsOn: 1 });
|
|
518
523
|
}
|
|
519
524
|
else if (dayDifference < 365 * 3) {
|
|
520
|
-
return
|
|
525
|
+
return eachMonthOfInterval({ start: dateRange[0], end: dateRange[1] });
|
|
521
526
|
}
|
|
522
527
|
else {
|
|
523
|
-
return
|
|
528
|
+
return eachYearOfInterval({ start: dateRange[0], end: dateRange[1] });
|
|
524
529
|
}
|
|
525
530
|
}
|
|
526
531
|
function getDateString(value, dateRange) {
|
|
@@ -529,7 +534,7 @@ function getDateString(value, dateRange) {
|
|
|
529
534
|
format = 'MMM_yyyy';
|
|
530
535
|
}
|
|
531
536
|
else {
|
|
532
|
-
const dayDifference =
|
|
537
|
+
const dayDifference = differenceInDays(new Date(dateRange[1]), new Date(dateRange[0]));
|
|
533
538
|
if (dayDifference < 14) {
|
|
534
539
|
format = 'MMM_dd_yyyy';
|
|
535
540
|
}
|
|
@@ -543,24 +548,23 @@ function getDateString(value, dateRange) {
|
|
|
543
548
|
format = 'yyyy';
|
|
544
549
|
}
|
|
545
550
|
}
|
|
546
|
-
return
|
|
551
|
+
return valueFormatter({
|
|
547
552
|
value,
|
|
548
553
|
field: 'date',
|
|
549
554
|
fields: [{ field: 'date', format }],
|
|
550
555
|
});
|
|
551
556
|
}
|
|
552
|
-
function isDateField(fieldType) {
|
|
557
|
+
export function isDateField(fieldType) {
|
|
553
558
|
return (fieldType === 'date' ||
|
|
554
559
|
fieldType === 'datetime' ||
|
|
555
560
|
fieldType === 'timestamp' ||
|
|
556
561
|
fieldType === 'timestamptz');
|
|
557
562
|
}
|
|
558
|
-
|
|
559
|
-
function generatePivotTable(pivot, data, dateRange, rowLimit = -1) {
|
|
563
|
+
export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = null) {
|
|
560
564
|
const pivotRows = [];
|
|
561
|
-
const uniqueRows = isDateField(pivot.rowFieldType)
|
|
565
|
+
const uniqueRows = (isDateField(pivot.rowFieldType)
|
|
562
566
|
? getDateBuckets(dateRange, pivot.rowField, data)
|
|
563
|
-
: [...new Set(data.map((item) => item[pivot.rowField]))];
|
|
567
|
+
: [...new Set(data.map((item) => item[pivot.rowField]))]).filter((row) => Boolean(row));
|
|
564
568
|
const rowDateRange = pivot.rowField
|
|
565
569
|
? getDateRange(dateRange, pivot.rowField, data)
|
|
566
570
|
: null;
|
|
@@ -568,11 +572,49 @@ function generatePivotTable(pivot, data, dateRange, rowLimit = -1) {
|
|
|
568
572
|
? getDateRange(dateRange, pivot.columnField, data)
|
|
569
573
|
: null;
|
|
570
574
|
// If columnField is not provided, we will not be using uniqueColumns
|
|
571
|
-
const uniqueColumns = pivot.columnField && pivot.columnField.trim()
|
|
575
|
+
const uniqueColumns = (pivot.columnField && pivot.columnField.trim()
|
|
572
576
|
? isDateField(pivot.columnFieldType)
|
|
573
577
|
? getDateBuckets(dateRange, pivot.columnField, data)
|
|
574
578
|
: [...new Set(data.map((item) => item[pivot.columnField || '']))]
|
|
575
|
-
: [pivot.valueField];
|
|
579
|
+
: [pivot.valueField]).filter((col) => Boolean(col));
|
|
580
|
+
// Map from new dates to their corresponding prior dates
|
|
581
|
+
const COL_DATE_MAP = {};
|
|
582
|
+
const ROW_DATE_MAP = {};
|
|
583
|
+
// add in the comparison columns for all columns in the pivot
|
|
584
|
+
let compUniqueRows = [];
|
|
585
|
+
let compRowDateRange = [];
|
|
586
|
+
if (isComparison) {
|
|
587
|
+
if (pivot.columnField) {
|
|
588
|
+
const col = pivot.columnField;
|
|
589
|
+
const row = pivot.rowField;
|
|
590
|
+
const isDateCol = isDateField(pivot.columnFieldType);
|
|
591
|
+
const isDateRow = isDateField(pivot.rowFieldType);
|
|
592
|
+
data.forEach((item) => {
|
|
593
|
+
if (isDateCol) {
|
|
594
|
+
const key = getDateString(item[col], dateRange);
|
|
595
|
+
const value = getDateString(item[`comparison_${col}`], dateRange);
|
|
596
|
+
COL_DATE_MAP[key] = value;
|
|
597
|
+
}
|
|
598
|
+
if (isDateRow) {
|
|
599
|
+
const key = getDateString(item[row], dateRange);
|
|
600
|
+
const value = getDateString(item[`comparison_${row}`], dateRange);
|
|
601
|
+
ROW_DATE_MAP[key] = value;
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
const primaryColumns = [...uniqueColumns];
|
|
607
|
+
for (const primaryKey of primaryColumns) {
|
|
608
|
+
uniqueColumns.push(`comparison_${primaryKey}`);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
compUniqueRows = (isDateField(pivot.rowFieldType)
|
|
612
|
+
? getCompDateBuckets(dateRange, compRange ?? dateRange, pivot.rowField, data)
|
|
613
|
+
: [...new Set(data.map((item) => item[pivot.rowField]))]).filter((row) => Boolean(row));
|
|
614
|
+
compRowDateRange = pivot.rowField
|
|
615
|
+
? getDateRange(compRange ?? dateRange, pivot.rowField, data)
|
|
616
|
+
: null;
|
|
617
|
+
}
|
|
576
618
|
const rowsToGenerate = rowLimit !== -1 && rowLimit <= uniqueRows.length
|
|
577
619
|
? uniqueRows.slice(0, rowLimit + 1)
|
|
578
620
|
: uniqueRows;
|
|
@@ -589,78 +631,149 @@ function generatePivotTable(pivot, data, dateRange, rowLimit = -1) {
|
|
|
589
631
|
: rowValue,
|
|
590
632
|
};
|
|
591
633
|
uniqueColumns.forEach((colValue, colIndex) => {
|
|
592
|
-
let
|
|
634
|
+
let comparisonFilteredData = [];
|
|
635
|
+
let filteredData = [];
|
|
636
|
+
let comparisonValue;
|
|
593
637
|
let value;
|
|
594
638
|
const nextRowValue = isDateField(pivot.rowFieldType)
|
|
595
|
-
? uniqueRows[rowIndex + 1]
|
|
639
|
+
? uniqueRows[rowIndex + 1] ?? endOfDay(rowDateRange.end)
|
|
640
|
+
: null;
|
|
641
|
+
const compRowValue = compUniqueRows[rowIndex];
|
|
642
|
+
const compNextRowValue = isDateField(pivot.rowFieldType)
|
|
643
|
+
? compUniqueRows[rowIndex + 1] ?? endOfDay(compRowDateRange.end)
|
|
596
644
|
: null;
|
|
597
645
|
if (pivot.columnField) {
|
|
598
646
|
const nextColumnValue = isDateField(pivot.columnFieldType)
|
|
599
|
-
? uniqueColumns[colIndex + 1] ||
|
|
647
|
+
? uniqueColumns[colIndex + 1] || endOfDay(columnDateRange.end)
|
|
600
648
|
: null;
|
|
601
649
|
// If columnField is provided, filter by both rowField and columnField
|
|
602
650
|
if (isDateField(pivot.columnFieldType) &&
|
|
603
651
|
isDateField(pivot.rowFieldType)) {
|
|
604
652
|
filteredData = data.filter((item) => {
|
|
605
|
-
return (
|
|
653
|
+
return (isWithinInterval(new Date(item[pivot.rowField]), {
|
|
606
654
|
start: rowValue,
|
|
607
|
-
end:
|
|
655
|
+
end: subMilliseconds(nextRowValue, 1),
|
|
608
656
|
}) &&
|
|
609
|
-
|
|
657
|
+
isWithinInterval(new Date(item[pivot.columnField]), {
|
|
610
658
|
start: colValue,
|
|
611
|
-
end:
|
|
659
|
+
end: subMilliseconds(nextColumnValue, 1),
|
|
612
660
|
}));
|
|
613
661
|
});
|
|
662
|
+
if (isComparison) {
|
|
663
|
+
comparisonFilteredData = data.filter((item) => {
|
|
664
|
+
return (isWithinInterval(new Date(item[pivot.rowField]), {
|
|
665
|
+
start: rowValue,
|
|
666
|
+
end: subMilliseconds(nextRowValue, 1),
|
|
667
|
+
}) &&
|
|
668
|
+
isWithinInterval(new Date(item[pivot.columnField]), {
|
|
669
|
+
start: colValue,
|
|
670
|
+
end: subMilliseconds(nextColumnValue, 1),
|
|
671
|
+
}));
|
|
672
|
+
});
|
|
673
|
+
}
|
|
614
674
|
}
|
|
615
675
|
else if (isDateField(pivot.columnFieldType) &&
|
|
616
676
|
!isDateField(pivot.rowFieldType)) {
|
|
617
677
|
filteredData = data.filter((item) => {
|
|
618
678
|
return (item[pivot.rowField] === rowValue &&
|
|
619
|
-
|
|
679
|
+
isWithinInterval(new Date(item[pivot.columnField]), {
|
|
620
680
|
start: colValue,
|
|
621
|
-
end:
|
|
681
|
+
end: subMilliseconds(nextColumnValue, 1),
|
|
622
682
|
}));
|
|
623
683
|
});
|
|
684
|
+
if (isComparison) {
|
|
685
|
+
comparisonFilteredData = data.filter((item) => {
|
|
686
|
+
return (item[`comparison_${pivot.rowField}`] === rowValue &&
|
|
687
|
+
isWithinInterval(new Date(item[pivot.columnField]), {
|
|
688
|
+
start: colValue,
|
|
689
|
+
end: subMilliseconds(nextColumnValue, 1),
|
|
690
|
+
}));
|
|
691
|
+
});
|
|
692
|
+
}
|
|
624
693
|
}
|
|
625
694
|
else if (!isDateField(pivot.columnFieldType) &&
|
|
626
695
|
isDateField(pivot.rowFieldType)) {
|
|
627
696
|
filteredData = data.filter((item) => {
|
|
628
|
-
return (
|
|
697
|
+
return (isWithinInterval(new Date(item[pivot.rowField]), {
|
|
629
698
|
start: rowValue,
|
|
630
|
-
end:
|
|
699
|
+
end: subMilliseconds(nextRowValue, 1),
|
|
631
700
|
}) && item[pivot.columnField || ''] === colValue);
|
|
632
701
|
});
|
|
702
|
+
if (isComparison) {
|
|
703
|
+
comparisonFilteredData = data.filter((item) => {
|
|
704
|
+
return (isWithinInterval(new Date(item[pivot.rowField]), {
|
|
705
|
+
start: rowValue,
|
|
706
|
+
end: subMilliseconds(nextRowValue, 1),
|
|
707
|
+
}) &&
|
|
708
|
+
item[`comparison_${pivot.columnField}` || ''] === colValue);
|
|
709
|
+
});
|
|
710
|
+
}
|
|
633
711
|
}
|
|
634
712
|
else {
|
|
635
713
|
filteredData = data.filter((item) => {
|
|
636
714
|
return (item[pivot.rowField] === rowValue &&
|
|
637
715
|
item[pivot.columnField || ''] === colValue);
|
|
638
716
|
});
|
|
717
|
+
if (isComparison) {
|
|
718
|
+
comparisonFilteredData = data.filter((item) => {
|
|
719
|
+
return (item[`comparison_${pivot.rowField}`] === rowValue &&
|
|
720
|
+
item[`comparison_${pivot.columnField}`] === colValue);
|
|
721
|
+
});
|
|
722
|
+
}
|
|
639
723
|
}
|
|
640
724
|
}
|
|
641
725
|
else {
|
|
726
|
+
// NOTE: For 1D columns, the comparisons are handled inside the colvalue
|
|
727
|
+
// so there is no need to filter for comparisonFilteredData here.
|
|
642
728
|
// If columnField is not provided, filter by rowField only
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
729
|
+
if (colValue.startsWith('comparison_')) {
|
|
730
|
+
filteredData = isDateField(pivot.rowFieldType)
|
|
731
|
+
? data.filter((item) => {
|
|
732
|
+
return (compRowValue &&
|
|
733
|
+
isWithinInterval(new Date(item[`comparison_${pivot.rowField}`]), {
|
|
734
|
+
start: compRowValue,
|
|
735
|
+
end: subMilliseconds(compNextRowValue, 1),
|
|
736
|
+
}));
|
|
737
|
+
})
|
|
738
|
+
: data.filter((item) => item[`comparison_${pivot.rowField}`] === compRowValue);
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
filteredData = isDateField(pivot.rowFieldType)
|
|
742
|
+
? data.filter((item) => {
|
|
743
|
+
return isWithinInterval(new Date(item[pivot.rowField]), {
|
|
744
|
+
start: rowValue,
|
|
745
|
+
end: subMilliseconds(nextRowValue, 1),
|
|
746
|
+
});
|
|
747
|
+
})
|
|
748
|
+
: data.filter((item) => item[pivot.rowField] === rowValue);
|
|
749
|
+
}
|
|
651
750
|
}
|
|
652
751
|
// Aggregation logic remains the same
|
|
752
|
+
const key = pivot.columnField && pivot.columnField.trim()
|
|
753
|
+
? pivot.valueField
|
|
754
|
+
: colValue;
|
|
653
755
|
switch (pivot.aggregationType) {
|
|
654
756
|
case 'sum':
|
|
655
|
-
value = filteredData.reduce((sum, item) => sum + parseFloat(item[
|
|
757
|
+
value = filteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0);
|
|
758
|
+
if (isComparison) {
|
|
759
|
+
comparisonValue = comparisonFilteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0);
|
|
760
|
+
}
|
|
656
761
|
break;
|
|
657
762
|
case 'count':
|
|
658
763
|
value = filteredData.length;
|
|
764
|
+
if (isComparison) {
|
|
765
|
+
comparisonValue = comparisonFilteredData.length;
|
|
766
|
+
}
|
|
659
767
|
break;
|
|
660
768
|
case 'average':
|
|
661
769
|
value = filteredData.length
|
|
662
|
-
? filteredData.reduce((sum, item) => sum + parseFloat(item[
|
|
770
|
+
? filteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0) / filteredData.length
|
|
663
771
|
: 0;
|
|
772
|
+
if (isComparison) {
|
|
773
|
+
comparisonValue = comparisonFilteredData.length
|
|
774
|
+
? comparisonFilteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0) / comparisonFilteredData.length
|
|
775
|
+
: 0;
|
|
776
|
+
}
|
|
664
777
|
break;
|
|
665
778
|
// Implement other aggregation types as needed
|
|
666
779
|
default:
|
|
@@ -671,15 +784,46 @@ function generatePivotTable(pivot, data, dateRange, rowLimit = -1) {
|
|
|
671
784
|
row[isDateField(pivot.columnFieldType)
|
|
672
785
|
? getDateString(colValue, dateRange)
|
|
673
786
|
: colValue] = pivot.aggregationType === 'count' ? value : value.toFixed(2);
|
|
787
|
+
if (isComparison && pivot.columnField) {
|
|
788
|
+
if (isDateField(pivot.columnFieldType)) {
|
|
789
|
+
row[`comparison_${getDateString(colValue, dateRange)}`] =
|
|
790
|
+
pivot.aggregationType === 'count'
|
|
791
|
+
? comparisonValue
|
|
792
|
+
: comparisonValue.toFixed(2);
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
row[`comparison_${colValue}`] =
|
|
796
|
+
pivot.aggregationType === 'count'
|
|
797
|
+
? comparisonValue
|
|
798
|
+
: comparisonValue.toFixed(2);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
674
801
|
});
|
|
675
802
|
pivotRows.push(row);
|
|
676
803
|
});
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
804
|
+
const columns = [
|
|
805
|
+
{
|
|
806
|
+
label: pivot.rowField === null
|
|
807
|
+
? 'Null'
|
|
808
|
+
: pivot.rowField === false
|
|
809
|
+
? 'False'
|
|
810
|
+
: snakeCaseToTitleCase(pivot.rowField),
|
|
811
|
+
field: pivot.rowField,
|
|
812
|
+
},
|
|
813
|
+
...(!pivot.columnField
|
|
814
|
+
? [
|
|
815
|
+
{
|
|
816
|
+
label: pivot.rowField === null
|
|
817
|
+
? 'Null'
|
|
818
|
+
: pivot.rowField === false
|
|
819
|
+
? 'False'
|
|
820
|
+
: `Comparison ${snakeCaseToTitleCase(pivot.rowField)}`,
|
|
821
|
+
field: `comparison_${pivot.rowField}`,
|
|
822
|
+
},
|
|
823
|
+
]
|
|
824
|
+
: []),
|
|
825
|
+
...uniqueColumns.map((column, index) => {
|
|
826
|
+
const columnName = isDateField(pivot.columnFieldType)
|
|
683
827
|
? getDateString(column, dateRange)
|
|
684
828
|
: column;
|
|
685
829
|
return {
|
|
@@ -691,11 +835,32 @@ function generatePivotTable(pivot, data, dateRange, rowLimit = -1) {
|
|
|
691
835
|
!pivot.columnField &&
|
|
692
836
|
index === 1
|
|
693
837
|
? 'Count'
|
|
694
|
-
:
|
|
838
|
+
: snakeCaseToTitleCase(columnName),
|
|
695
839
|
field: columnName,
|
|
696
840
|
};
|
|
697
841
|
}),
|
|
698
|
-
|
|
842
|
+
...(isComparison && pivot.columnField
|
|
843
|
+
? uniqueColumns.map((column, index) => {
|
|
844
|
+
const columnName = isDateField(pivot.columnFieldType)
|
|
845
|
+
? getDateString(column, dateRange)
|
|
846
|
+
: column;
|
|
847
|
+
return {
|
|
848
|
+
label: column === null
|
|
849
|
+
? 'Null'
|
|
850
|
+
: column === false
|
|
851
|
+
? 'False'
|
|
852
|
+
: pivot.aggregationType === 'count' &&
|
|
853
|
+
!pivot.columnField &&
|
|
854
|
+
index === 1
|
|
855
|
+
? 'Comparison Count'
|
|
856
|
+
: isDateField(pivot.columnFieldType)
|
|
857
|
+
? COL_DATE_MAP[getDateString(column, dateRange)] ??
|
|
858
|
+
'Comparison'
|
|
859
|
+
: `Comparison ${snakeCaseToTitleCase(columnName)}`,
|
|
860
|
+
field: `comparison_${columnName}`,
|
|
861
|
+
};
|
|
862
|
+
})
|
|
863
|
+
: []),
|
|
864
|
+
];
|
|
865
|
+
return { rows: pivotRows, columns };
|
|
699
866
|
}
|
|
700
|
-
exports.generatePivotTable = generatePivotTable;
|
|
701
|
-
//# sourceMappingURL=PivotModal.js.map
|