@quillsql/react 2.11.23 → 2.11.25

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.
Files changed (203) hide show
  1. package/dist/cjs/Chart.d.ts +16 -0
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +34 -18
  4. package/dist/cjs/ChartBuilder.d.ts +55 -2
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +232 -212
  7. package/dist/cjs/ChartEditor.d.ts +49 -2
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +3 -3
  10. package/dist/cjs/Dashboard.d.ts +5 -1
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +42 -18
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  16. package/dist/cjs/ReportBuilder.d.ts +57 -2
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +962 -684
  19. package/dist/cjs/SQLEditor.d.ts +83 -2
  20. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  21. package/dist/cjs/SQLEditor.js +10 -2
  22. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  23. package/dist/cjs/components/Chart/BarChart.js +8 -6
  24. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  25. package/dist/cjs/components/Chart/BarList.js +0 -153
  26. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  27. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  28. package/dist/cjs/components/Chart/ChartError.js +13 -7
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  30. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  31. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  32. package/dist/cjs/components/Chart/LineChart.d.ts +6 -2
  33. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  34. package/dist/cjs/components/Chart/LineChart.js +35 -34
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  37. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  39. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  40. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  41. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  42. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  43. package/dist/cjs/components/QuillSelect.js +1 -1
  44. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  45. package/dist/cjs/components/QuillTable.js +11 -12
  46. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  47. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  48. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  53. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  55. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  56. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  58. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  59. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  61. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  62. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  64. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  65. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  67. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  69. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  70. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  71. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  73. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  74. package/dist/cjs/components/UiComponents.d.ts +34 -4
  75. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  76. package/dist/cjs/components/UiComponents.js +165 -68
  77. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  78. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  80. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  81. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  84. package/dist/cjs/internals/ReportBuilder/PivotModal.js +442 -282
  85. package/dist/cjs/utils/axisFormatter.js +3 -3
  86. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  87. package/dist/cjs/utils/getDomain.js +3 -0
  88. package/dist/cjs/utils/merge.d.ts.map +1 -1
  89. package/dist/cjs/utils/merge.js +2 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  91. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  92. package/dist/cjs/utils/pivotProcessing.js +177 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  94. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  95. package/dist/cjs/utils/queryConstructor.js +11 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  97. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  98. package/dist/cjs/utils/tableProcessing.js +84 -0
  99. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  100. package/dist/cjs/utils/valueFormatter.js +40 -8
  101. package/dist/esm/Chart.d.ts +16 -0
  102. package/dist/esm/Chart.d.ts.map +1 -1
  103. package/dist/esm/Chart.js +35 -19
  104. package/dist/esm/ChartBuilder.d.ts +55 -2
  105. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  106. package/dist/esm/ChartBuilder.js +234 -214
  107. package/dist/esm/ChartEditor.d.ts +49 -2
  108. package/dist/esm/ChartEditor.d.ts.map +1 -1
  109. package/dist/esm/ChartEditor.js +4 -4
  110. package/dist/esm/Dashboard.d.ts +5 -1
  111. package/dist/esm/Dashboard.d.ts.map +1 -1
  112. package/dist/esm/Dashboard.js +21 -20
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  114. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  115. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  116. package/dist/esm/ReportBuilder.d.ts +57 -2
  117. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  118. package/dist/esm/ReportBuilder.js +964 -687
  119. package/dist/esm/SQLEditor.d.ts +83 -2
  120. package/dist/esm/SQLEditor.d.ts.map +1 -1
  121. package/dist/esm/SQLEditor.js +11 -3
  122. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarChart.js +8 -6
  124. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  125. package/dist/esm/components/Chart/BarList.js +0 -153
  126. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  127. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  128. package/dist/esm/components/Chart/ChartError.js +13 -7
  129. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  130. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  131. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  132. package/dist/esm/components/Chart/LineChart.d.ts +6 -2
  133. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  134. package/dist/esm/components/Chart/LineChart.js +35 -34
  135. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  136. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  137. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  138. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  139. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  141. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  142. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  143. package/dist/esm/components/QuillSelect.js +1 -1
  144. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  145. package/dist/esm/components/QuillTable.js +11 -12
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  147. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  148. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  149. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  150. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  152. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  153. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  154. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  155. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  156. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  157. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  158. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  159. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  160. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  161. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  162. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  163. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  164. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  165. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  166. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  167. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  169. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  170. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  171. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  172. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  173. package/dist/esm/components/ReportBuilder/util.js +3 -0
  174. package/dist/esm/components/UiComponents.d.ts +34 -4
  175. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  176. package/dist/esm/components/UiComponents.js +155 -66
  177. package/dist/esm/hooks/useQuill.d.ts +1 -0
  178. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  180. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  181. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  182. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  183. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  184. package/dist/esm/internals/ReportBuilder/PivotModal.js +443 -284
  185. package/dist/esm/utils/axisFormatter.js +3 -3
  186. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  187. package/dist/esm/utils/getDomain.js +3 -0
  188. package/dist/esm/utils/merge.d.ts.map +1 -1
  189. package/dist/esm/utils/merge.js +2 -0
  190. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  191. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  192. package/dist/esm/utils/pivotProcessing.js +170 -0
  193. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  194. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  195. package/dist/esm/utils/queryConstructor.js +7 -0
  196. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  197. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  198. package/dist/esm/utils/tableProcessing.js +80 -0
  199. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  200. package/dist/esm/utils/valueFormatter.js +41 -9
  201. package/package.json +1 -1
  202. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  203. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generatePivotTable = exports.isDateField = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
3
+ exports.generatePivotTable = exports.isDateField = exports.generatePivotTitle = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- // @ts-nocheck
6
5
  const react_1 = require("react");
7
6
  const Context_1 = require("../../Context");
8
7
  const dataFetcher_1 = require("../../utils/dataFetcher");
@@ -11,9 +10,12 @@ const date_fns_1 = require("date-fns");
11
10
  const valueFormatter_1 = require("../../utils/valueFormatter");
12
11
  const ChartBuilder_1 = require("../../ChartBuilder");
13
12
  const textProcessing_1 = require("../../utils/textProcessing");
14
- const util_1 = require("../../components/ReportBuilder/util");
13
+ const UiComponents_1 = require("../../components/UiComponents");
15
14
  const ast_1 = require("../../components/ReportBuilder/ast");
16
15
  const QuillCard_1 = require("../../components/QuillCard");
16
+ const pivotProcessing_1 = require("../../utils/pivotProcessing");
17
+ const crypto_1 = require("../../utils/crypto");
18
+ const tableProcessing_1 = require("../../utils/tableProcessing");
17
19
  const QuillHover = () => {
18
20
  return ((0, jsx_runtime_1.jsx)("style", { children: `
19
21
  .quill-hover {
@@ -27,57 +29,158 @@ const QuillHover = () => {
27
29
  }
28
30
  ` }));
29
31
  };
30
- const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, CardComponent = QuillCard_1.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, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, recommendPivotCount = 6, }) => {
32
+ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, CardComponent = QuillCard_1.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, selectPivotOnEdit = false, showTrigger = true, rightAlign = false, parentRef, pivotCountRequest = 6, query, initialUniqueValues, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, }) => {
31
33
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
32
- const [pivotUpdateIndex, setPivotUpdateIndex] = (0, react_1.useState)(null);
33
34
  const [selectedPivotType, setSelectedPivotType] = (0, react_1.useState)('recommended');
34
35
  const [errors, setErrors] = (0, react_1.useState)([]);
35
36
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
37
+ const rowFieldRef = (0, react_1.useRef)(null);
38
+ const colFieldRef = (0, react_1.useRef)(null);
39
+ const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(420);
36
40
  const [divWidth, setDivWidth] = (0, react_1.useState)(0);
37
- const editModalRef = (0, react_1.useRef)();
38
- const calculateWidth = () => {
39
- return editModalRef.current.offsetWidth;
41
+ const [samplePivotTable, setSamplePivotTable] = (0, react_1.useState)(null);
42
+ const [allowedColumnFields, setAllowedColumnFields] = (0, react_1.useState)([]);
43
+ const [allowedRowFields, setAllowedRowFields] = (0, react_1.useState)([]);
44
+ const [allowedValueFields, setAllowedValueFields] = (0, react_1.useState)([]);
45
+ const [uniqueValues, setUniqueValues] = (0, react_1.useState)(initialUniqueValues);
46
+ const getDistinctValues = async () => {
47
+ if (columns) {
48
+ const stringColumns = columns.filter((column) => {
49
+ return (0, ast_1.isTextColumnType)(column.fieldType || column.format);
50
+ });
51
+ if (stringColumns.length === 0) {
52
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, {});
53
+ setAllowedRowFields(possibleColumns.rowFields);
54
+ setAllowedColumnFields(possibleColumns.columnFields);
55
+ setAllowedValueFields(possibleColumns.valueFields);
56
+ return possibleColumns;
57
+ }
58
+ const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(stringColumns, query || '', data.rows || [], client);
59
+ if (!uniqueValues ||
60
+ (0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
61
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, newUniqueValues || {});
62
+ setAllowedRowFields(possibleColumns.rowFields);
63
+ setAllowedColumnFields(possibleColumns.columnFields);
64
+ setAllowedValueFields(possibleColumns.valueFields);
65
+ setUniqueValues(newUniqueValues);
66
+ return possibleColumns;
67
+ }
68
+ }
69
+ return { rowFields: [], columnFields: [], valueFields: [] };
40
70
  };
41
71
  (0, react_1.useEffect)(() => {
42
- // Measure the width of the div and update state
43
- if (editModalRef.current) {
44
- setDivWidth(calculateWidth());
45
- }
46
- // Optional: Handle window resize
47
- const handleResize = () => {
48
- if (editModalRef.current) {
49
- setDivWidth(calculateWidth());
72
+ const calculatePivotCardSize = () => {
73
+ // The pivot card should be the same width as the row of inputs
74
+ // below it (two selects, plus the gap between them).
75
+ if (rowFieldRef.current && colFieldRef.current) {
76
+ const rowFieldSize = rowFieldRef.current?.getBoundingClientRect();
77
+ const colFieldSize = colFieldRef.current?.getBoundingClientRect();
78
+ const selectWidth = rowFieldSize.width;
79
+ const gap = colFieldSize.left - rowFieldSize.right;
80
+ const width = 2 * selectWidth + gap;
81
+ setPivotCardWidth(width);
50
82
  }
51
83
  };
52
- window.addEventListener('resize', handleResize);
53
- // Cleanup listener
54
- return () => {
55
- window.removeEventListener('resize', handleResize);
56
- };
84
+ if (rowFieldRef.current && colFieldRef.current) {
85
+ calculatePivotCardSize();
86
+ }
87
+ else {
88
+ setTimeout(() => {
89
+ calculatePivotCardSize();
90
+ }, 500);
91
+ }
92
+ }, [showUpdatePivot, isOpen]);
93
+ (0, react_1.useEffect)(() => {
94
+ if (pivotRowField && data && columns) {
95
+ const pivot = {
96
+ rowField: pivotRowField || '',
97
+ rowFieldType: columnsToShow[pivotRowField || ''],
98
+ columnField: pivotColumnField,
99
+ columnFieldType: columnsToShow[pivotColumnField || ''],
100
+ valueField: pivotValueField || '',
101
+ aggregationType: pivotAggregation || '',
102
+ };
103
+ const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
104
+ setSamplePivotTable({ pivot: pivot, rows, columns });
105
+ }
106
+ if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
107
+ getDistinctValues();
108
+ }
109
+ if (initialUniqueValues) {
110
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, initialUniqueValues);
111
+ setAllowedRowFields(possibleColumns.rowFields);
112
+ setAllowedColumnFields(possibleColumns.columnFields);
113
+ setAllowedValueFields(possibleColumns.valueFields);
114
+ setUniqueValues(initialUniqueValues);
115
+ }
116
+ if (pivotRowField && data && columns) {
117
+ const pivot = {
118
+ rowField: pivotRowField || '',
119
+ rowFieldType: columnsToShow[pivotRowField || ''],
120
+ columnField: pivotColumnField,
121
+ columnFieldType: columnsToShow[pivotColumnField || ''],
122
+ valueField: pivotValueField || '',
123
+ aggregationType: pivotAggregation || '',
124
+ };
125
+ if (initialSelectedPivotTable) {
126
+ setSamplePivotTable({
127
+ pivot: pivot,
128
+ rows: initialSelectedPivotTable.rows,
129
+ columns: initialSelectedPivotTable.columns,
130
+ });
131
+ }
132
+ else {
133
+ const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
134
+ setSamplePivotTable({ pivot: pivot, rows, columns });
135
+ }
136
+ }
57
137
  }, []);
58
138
  (0, react_1.useEffect)(() => {
59
- // Measure the width of the div and update state
60
- if (editModalRef.current) {
61
- setDivWidth(calculateWidth());
139
+ const pivot = {
140
+ rowField: pivotRowField || '',
141
+ rowFieldType: columnsToShow[pivotRowField || ''],
142
+ columnField: pivotColumnField,
143
+ columnFieldType: columnsToShow[pivotColumnField || ''],
144
+ valueField: pivotValueField || '',
145
+ aggregationType: pivotAggregation || '',
146
+ };
147
+ if ((0, pivotProcessing_1.isValidPivot)(pivot) && data && columns) {
148
+ const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
149
+ setSamplePivotTable({ pivot: pivot, rows, columns });
62
150
  }
63
- }, [editModalRef.current, showUpdatePivot]);
151
+ }, [
152
+ data,
153
+ columns,
154
+ pivotRowField,
155
+ pivotColumnField,
156
+ pivotValueField,
157
+ pivotAggregation,
158
+ ]);
64
159
  (0, react_1.useEffect)(() => {
65
160
  setSelectedPivotIndex(-1);
66
- setPivotUpdateIndex(null);
67
- setSelectedPivotType(undefined);
161
+ setSelectedPivotType('');
68
162
  setPivotRowField(undefined);
69
163
  setPivotColumnField(undefined);
70
164
  setPivotValueField(undefined);
71
165
  setPivotAggregation(undefined);
72
- setIsOpen(false);
73
166
  setErrors([]);
74
167
  }, [selectedTable]);
168
+ (0, react_1.useEffect)(() => {
169
+ if (!initialUniqueValues) {
170
+ return;
171
+ }
172
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, initialUniqueValues);
173
+ setAllowedRowFields(possibleColumns.rowFields);
174
+ setAllowedColumnFields(possibleColumns.columnFields);
175
+ setAllowedValueFields(possibleColumns.valueFields);
176
+ setUniqueValues(initialUniqueValues);
177
+ }, [initialUniqueValues, columns]);
75
178
  const columnsToShow = (0, react_1.useMemo)(() => {
76
179
  return (columns || []).reduce((map, col) => {
77
180
  // only use columns shown in the report builder's table
78
181
  // also filter out id
79
182
  if (col.field !== 'id') {
80
- map[col.field] = col.fieldType || col.format;
183
+ map[col.field] = col.format;
81
184
  }
82
185
  return map;
83
186
  }, {});
@@ -87,20 +190,13 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
87
190
  return null;
88
191
  }
89
192
  const pivot = createdPivots[selectedPivotIndex];
90
- const { rows, columns } = generatePivotTable(pivot, data, dateRange);
193
+ const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
91
194
  return {
92
195
  pivot: pivot,
93
196
  rows: rows,
94
197
  columns: columns,
95
198
  };
96
199
  }, [selectedPivotIndex, data, dateRange, createdPivots]);
97
- const columnSelectOptions = (0, react_1.useMemo)(() => {
98
- return [
99
- ...Object.keys(columnsToShow).map((key) => {
100
- return { label: (0, textProcessing_1.snakeCaseToTitleCase)(key), value: key };
101
- }),
102
- ];
103
- }, [columnsToShow]);
104
200
  const onSelectRecommendedPivot = (pivot, index) => {
105
201
  if (showEditOnPivotClick) {
106
202
  onEditPivot(pivot, index);
@@ -119,28 +215,47 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
119
215
  selectPivot(pivot);
120
216
  setSelectedPivotType('created');
121
217
  setIsOpen(false);
122
- setPopUpTitle('Add Pivot');
218
+ setPopUpTitle('Add pivot');
123
219
  };
124
220
  const onEditPivot = (pivot, index) => {
125
221
  setPivotRowField(pivot.rowField);
126
222
  setPivotColumnField(pivot.columnField);
127
223
  setPivotValueField(pivot.valueField);
128
224
  setPivotAggregation(pivot.aggregationType);
129
- setPivotUpdateIndex(index);
130
225
  setShowUpdatePivot(true);
226
+ if ((0, pivotProcessing_1.isValidPivot)(pivot)) {
227
+ const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
228
+ setSamplePivotTable({ pivot, rows, columns });
229
+ return;
230
+ }
231
+ setSamplePivotTable(null);
131
232
  };
132
233
  const onEditRecommendedPivot = (pivot, index) => {
133
234
  onEditPivot(pivot, null);
134
235
  };
135
236
  const refreshPivots = (0, react_1.useCallback)(async () => {
136
- if (!showTrigger) {
137
- return;
138
- }
139
- if (isLoading || Object.keys(columnsToShow).length === 0) {
237
+ if (isLoading ||
238
+ Object.keys(columnsToShow).length === 0 ||
239
+ !pivotRecommendationsEnabled) {
140
240
  return;
141
241
  }
142
242
  setIsLoading(true);
243
+ let possibleColumns = {
244
+ rowFields: allowedRowFields,
245
+ columnFields: allowedColumnFields,
246
+ valueFields: allowedValueFields,
247
+ };
248
+ if ((allowedRowFields.length === 0 &&
249
+ allowedColumnFields.length === 0 &&
250
+ allowedValueFields.length === 0) ||
251
+ !uniqueValues) {
252
+ possibleColumns = await getDistinctValues();
253
+ }
143
254
  const cloudBody = {
255
+ pivotCountRequest,
256
+ allowedRowFields: possibleColumns?.rowFields || [],
257
+ allowedColumnFields: possibleColumns?.columnFields || [],
258
+ allowedValueFields: possibleColumns?.valueFields || [],
144
259
  tableSchema: Object.keys(columnsToShow).reduce(function (map, col) {
145
260
  // stop ai from seeing date fields. this is meant to stop the ai
146
261
  // pivot tables from extracting month and year from the date
@@ -153,11 +268,10 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
153
268
  };
154
269
  try {
155
270
  const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'pivotai', cloudBody);
156
- const recommendedPivots = resp?.data?.pivotTables.slice(0, recommendPivotCount) || [];
157
- setRecommendedPivots(recommendedPivots
158
- .filter((pivot) => pivot.rowField != '')
159
- .map((pivot) => {
160
- if (columnsToShow[pivot.columnField] === 'date') {
271
+ const recommendedPivots = resp?.data?.pivotTables.map((pivot) => (0, pivotProcessing_1.cleanPivot)(pivot, possibleColumns)) || [];
272
+ setRecommendedPivots(recommendedPivots.map((pivot) => {
273
+ if (pivot.columnField &&
274
+ columnsToShow[pivot.columnField] === 'date') {
161
275
  const columnField = pivot.columnField;
162
276
  pivot.columnField = pivot.rowField;
163
277
  pivot.rowField = columnField;
@@ -165,57 +279,71 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
165
279
  return {
166
280
  ...pivot,
167
281
  rowFieldType: columnsToShow[pivot.rowField],
168
- columnFieldType: columnsToShow[pivot.columnField],
282
+ columnFieldType: pivot.columnField
283
+ ? columnsToShow[pivot.columnField]
284
+ : undefined,
285
+ title: generatePivotTitle(pivot),
169
286
  };
170
287
  }));
171
- // refreshing means the currently selected pivot doesn't exist in the options anymore
172
288
  setSelectedPivotIndex(-1);
173
289
  }
174
290
  catch (e) {
175
291
  console.error('Failed parsing pivotai response', e);
176
292
  }
177
293
  setIsLoading(false);
178
- }, [selectedTable, data, columnsToShow, isLoading, showTrigger]);
179
- (0, react_1.useEffect)(() => {
180
- if (recommendedPivots.length === 0) {
181
- refreshPivots();
294
+ }, [
295
+ selectedTable,
296
+ data,
297
+ columnsToShow,
298
+ isLoading,
299
+ showTrigger,
300
+ allowedColumnFields,
301
+ allowedRowFields,
302
+ allowedValueFields,
303
+ ]);
304
+ const pivotFieldChange = async (field, value) => {
305
+ setIsLoading(true);
306
+ const pivot = {
307
+ rowField: pivotRowField,
308
+ rowFieldType: columnsToShow[pivotRowField],
309
+ columnField: pivotColumnField,
310
+ valueField: pivotValueField,
311
+ aggregationType: pivotAggregation,
312
+ };
313
+ // @ts-ignore
314
+ pivot[field] = value;
315
+ pivot.title = generatePivotTitle(pivot);
316
+ if (field === 'rowField') {
317
+ pivot.rowFieldType = columnsToShow[value];
182
318
  }
183
- }, []);
319
+ else if (field === 'columnField') {
320
+ pivot.columnFieldType = columnsToShow[value];
321
+ }
322
+ if (!(0, pivotProcessing_1.isValidPivot)(pivot)) {
323
+ setIsLoading(false);
324
+ setSamplePivotTable(null);
325
+ return;
326
+ }
327
+ setTimeout(() => {
328
+ const { rows, columns } = generatePivotTable(pivot, data, dateRange, false);
329
+ setSamplePivotTable({ pivot, rows, columns });
330
+ setIsLoading(false);
331
+ }, 500);
332
+ };
184
333
  const recommendedPivotTables = (0, react_1.useMemo)(() => {
185
334
  const pts = recommendedPivots.map((p) => {
186
- const { rows, columns } = generatePivotTable(p, data, dateRange, 6);
335
+ const { rows, columns } = generatePivotTable(p, data, dateRange, false, 6);
187
336
  return { pivot: p, rows, columns };
188
337
  });
189
338
  return pts;
190
339
  }, [recommendedPivots, data]);
191
340
  const createdPivotTables = (0, react_1.useMemo)(() => {
192
341
  const pts = createdPivots.map((p) => {
193
- const { rows, columns } = generatePivotTable(p, data, dateRange, 6);
342
+ const { rows, columns } = generatePivotTable(p, data, dateRange, false, 6);
194
343
  return { pivot: p, rows, columns };
195
344
  });
196
345
  return pts;
197
346
  }, [createdPivots, data]);
198
- const samplePivotTable = (0, react_1.useMemo)(() => {
199
- if (!pivotAggregation) {
200
- return null;
201
- }
202
- const pivot = {
203
- rowField: pivotRowField || '',
204
- rowFieldType: columnsToShow[pivotRowField || ''],
205
- columnField: pivotColumnField,
206
- columnFieldType: columnsToShow[pivotColumnField || ''],
207
- valueField: pivotValueField || '',
208
- aggregationType: pivotAggregation || '',
209
- };
210
- const { rows, columns } = generatePivotTable(pivot, data, dateRange);
211
- return { pivot: pivot, rows, columns };
212
- }, [
213
- pivotAggregation,
214
- pivotValueField,
215
- pivotRowField,
216
- pivotColumnField,
217
- columnsToShow,
218
- ]);
219
347
  return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsxs)("div", { style: {
220
348
  position: 'relative',
221
349
  display: 'inline-block',
@@ -232,7 +360,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
232
360
  position: 'absolute',
233
361
  top: -2,
234
362
  right: -2,
235
- } })) }), showTrigger && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
363
+ } })) }), showTrigger && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
236
364
  if (columns.length === 0) {
237
365
  setIsOpen(false);
238
366
  }
@@ -245,149 +373,26 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
245
373
  }
246
374
  setIsOpen(!isOpen);
247
375
  setShowUpdatePivot(false);
248
- }, label: triggerButtonText })), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
249
- if (!isOpen) {
250
- setShowUpdatePivot(false);
251
- setPopUpTitle('Add Pivot');
252
- }
253
- setIsOpen(isOpen);
254
- }, popoverTitle: showUpdatePivot ? popUpTitle : 'Recommended pivots', popoverChildren: (0, jsx_runtime_1.jsx)("div", { style: {
255
- paddingTop: showUpdatePivot ? 0 : 20,
256
- position: 'relative',
257
- }, children: showUpdatePivot ? ((0, jsx_runtime_1.jsxs)("div", { className: "ref-in-use", ref: editModalRef, style: {
258
- backgroundColor: 'rgb(255, 255, 255)',
259
- display: 'flex',
260
- flexDirection: 'column',
261
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: { height: 12 } }), (0, jsx_runtime_1.jsx)("div", { style: { width: divWidth }, children: samplePivotTable && ((0, jsx_runtime_1.jsx)("div", { style: {
262
- marginBottom: 20,
263
- minHeight: 160,
264
- }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 140, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent }) })) }), (0, jsx_runtime_1.jsxs)("div", { style: {
265
- display: 'flex',
266
- flexDirection: 'column',
267
- gap: 10,
268
- alignItems: 'center',
269
- justifyContent: 'space-between',
270
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
271
- display: 'flex',
272
- flexDirection: 'row',
273
- gap: 20,
274
- marginBottom: 5,
275
- }, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Row Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotRowField, onChange: (e) => {
276
- setPivotRowField(e.target.value === ''
277
- ? undefined
278
- : e.target.value);
279
- }, options: [
280
- ...columnSelectOptions.filter((option) => {
281
- const format = columns.find((col) => col.field === option.value)?.format;
282
- return (format === 'string' ||
283
- ChartBuilder_1.dateFormatOptions.includes(format) ||
284
- (0, util_1.isIdColumn)(option.value));
285
- }),
286
- ], width: 200 })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Column Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotColumnField, onChange: (e) => {
287
- setPivotColumnField(e.target.value === ''
288
- ? undefined
289
- : e.target.value);
290
- }, options: [
291
- ...columnSelectOptions.filter((option) => {
292
- return (columns.find((col) => col.field === option.value)?.format === 'string');
293
- }),
294
- ], width: 200 })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
295
- display: 'flex',
296
- flexDirection: 'row',
297
- gap: 20,
298
- marginBottom: 20,
299
- }, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Value Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotValueField, onChange: (e) => {
300
- setPivotValueField(e.target.value === ''
301
- ? undefined
302
- : e.target.value);
303
- }, options: [
304
- ...columnSelectOptions.filter((option) => {
305
- return ((option.value === '' ||
306
- ChartBuilder_1.numberFormatOptions.includes(columns.find((col) => col.field === option.value)?.format)) &&
307
- !(0, util_1.isIdColumn)(option.value));
308
- }),
309
- ], width: 200 })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Aggregation Type" }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", value: pivotAggregation, onChange: (e) => {
310
- if (e.target.value !== 'count' &&
311
- pivotValueField &&
312
- !ChartBuilder_1.numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)?.format)) {
313
- setPivotValueField(null);
314
- }
315
- setPivotAggregation(e.target.value === ''
316
- ? undefined
317
- : e.target.value);
318
- }, options: [
319
- ...['sum', 'average', 'count', 'max', 'min'].map((option) => {
320
- return { label: option, value: option };
321
- }),
322
- ], width: 200 })] })] })] }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: () => {
323
- const errors = [];
324
- if (!pivotValueField && pivotAggregation !== 'count') {
325
- errors.push("Value field cannot be empty when aggregation is not 'count'");
326
- }
327
- if (!pivotAggregation) {
328
- errors.push('Aggregation cannot be empty');
329
- }
330
- if (errors.length === 0) {
331
- const pivot = {
332
- rowField: pivotRowField || '',
333
- rowFieldType: columnsToShow[pivotRowField || ''],
334
- columnField: pivotColumnField,
335
- columnFieldType: columnsToShow[pivotColumnField || ''],
336
- valueField: pivotValueField || '',
337
- aggregationType: pivotAggregation || '',
338
- };
339
- pivot.title = generatePivotTitle(pivot);
340
- setIsOpen(false);
341
- setCreatedPivots([pivot]);
342
- onSelectCreatedPivot(pivot, 0);
343
- setPopUpTitle('Add Pivot');
344
- }
345
- setErrors(errors);
346
- }, label: popUpTitle }) }), (0, jsx_runtime_1.jsx)("div", { children: errors.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { style: {
347
- paddingTop: '8px',
348
- } }), errors.map((error, index) => ((0, jsx_runtime_1.jsx)("div", { style: {
349
- borderRadius: 8,
350
- backgroundColor: '#FF9494',
351
- paddingLeft: '12px',
352
- paddingRight: '8px',
353
- height: 30,
354
- display: 'flex',
355
- alignItems: 'center',
356
- fontSize: 13,
357
- fontWeight: 'bold',
358
- fontFamily: theme?.fontFamily,
359
- color: 'white',
360
- marginBottom: 5,
361
- }, children: error }, index)))] })) })] })) : ((0, jsx_runtime_1.jsx)("div", { style: {
362
- display: 'flex',
363
- flexDirection: 'column',
364
- fontFamily: theme?.fontFamily,
365
- color: theme?.primaryTextColor,
366
- width: selectedPivotTable ? 500 : 600,
367
- maxHeight: 600,
368
- overflowY: 'scroll',
369
- }, children: selectedPivotIndex >= 0 ? ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { onClick: () => {
370
- setPopUpTitle('Edit Pivot');
371
- onEditPivot(createdPivots[0], 0);
372
- }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
373
- pivot: selectedPivotTable?.pivot,
374
- rows: selectedPivotTable?.rows,
375
- columns: selectedPivotTable?.columns,
376
- }, theme: theme, index: 0, onSelectPivot: () => { }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, onClose: () => {
377
- removePivot();
378
- }, clickable: true, minHeight: 180, CardComponent: CardComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent }) }) })) : ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
379
- // position button inline with the popover title
380
- position: 'absolute',
381
- top: -36,
382
- right: 0,
383
- }, children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: refreshPivots, label: (0, jsx_runtime_1.jsxs)("div", { style: {
384
- display: 'flex',
385
- flexDirection: 'row',
386
- whiteSpace: 'nowrap',
387
- alignItems: 'center',
388
- gap: 6,
389
- fontSize: 14,
390
- }, children: [(0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.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" }) }), "Regenerate"] }) }) }), isLoading ? ((0, jsx_runtime_1.jsxs)("div", { style: {
376
+ }, label: triggerButtonText })), (0, jsx_runtime_1.jsx)("div", { style: {
377
+ position: 'relative',
378
+ ...(isOpen && showTrigger && { top: 12 }),
379
+ }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
380
+ if (!isOpen) {
381
+ setShowUpdatePivot(false);
382
+ setPopUpTitle('Add pivot');
383
+ }
384
+ setIsOpen(isOpen);
385
+ }, popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
386
+ ? popUpTitle
387
+ : 'Recommended pivots', popoverChildren: (0, jsx_runtime_1.jsx)("div", { style: {
388
+ paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
389
+ position: 'relative',
390
+ }, children: showUpdatePivot || !pivotRecommendationsEnabled ? ((0, jsx_runtime_1.jsxs)("div", { style: {
391
+ backgroundColor: 'rgb(255, 255, 255)',
392
+ display: 'flex',
393
+ flexDirection: 'column',
394
+ gap: 20,
395
+ }, children: [isLoading && ((0, jsx_runtime_1.jsxs)("div", { style: {
391
396
  background: theme.backgroundColor,
392
397
  width: 250,
393
398
  minWidth: 250,
@@ -398,7 +403,128 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
398
403
  display: 'flex',
399
404
  margin: '0px auto',
400
405
  justifyContent: 'center',
401
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: { height: 100 } }), (0, jsx_runtime_1.jsxs)("svg", { width: "24", height: "24", children: [(0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "-180 12 12", to: "180 12 12", dur: "0.8s", repeatCount: "indefinite" }) }), (0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "0 12 12", to: "360 12 12", dur: "0.8s", repeatCount: "indefinite" }) })] })] })) : ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(PivotList_1.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, CardComponent: CardComponent }) }))] })) })) }) })] }) }));
406
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: { height: 100 } }), (0, jsx_runtime_1.jsxs)("svg", { width: "24", height: "24", children: [(0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "-180 12 12", to: "180 12 12", dur: "0.8s", repeatCount: "indefinite" }) }), (0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "0 12 12", to: "360 12 12", dur: "0.8s", repeatCount: "indefinite" }) })] })] })), samplePivotTable && !isLoading && ((0, jsx_runtime_1.jsx)("div", { style: {
407
+ width: pivotCardWidth,
408
+ minHeight: 160,
409
+ }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 140, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, onSelectPivot: () => { }, onClose: () => {
410
+ setPivotAggregation(null);
411
+ setPivotRowField(null);
412
+ setPivotValueField(null);
413
+ setPivotColumnField(null);
414
+ setSamplePivotTable(null);
415
+ } }) })), (0, jsx_runtime_1.jsxs)(PivotColumnContainer, { children: [(0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { ref: rowFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Row field", value: pivotRowField, onChange: (e) => {
416
+ pivotFieldChange('rowField', e.target.value);
417
+ setPivotRowField(e.target.value === ''
418
+ ? undefined
419
+ : e.target.value);
420
+ }, options: allowedRowFields.map((field) => {
421
+ return {
422
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(field),
423
+ value: field,
424
+ };
425
+ }), width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { ref: colFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Column field", value: pivotColumnField, onChange: (e) => {
426
+ pivotFieldChange('columnField', e.target.value);
427
+ setPivotColumnField(e.target.value === ''
428
+ ? undefined
429
+ : e.target.value);
430
+ }, options: allowedColumnFields.map((field) => {
431
+ return {
432
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(field),
433
+ value: field,
434
+ };
435
+ }), width: 200 }) })] }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
436
+ pivotFieldChange('valueField', e.target.value);
437
+ setPivotValueField(e.target.value === ''
438
+ ? undefined
439
+ : e.target.value);
440
+ }, options: allowedValueFields.map((field) => {
441
+ return {
442
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(field),
443
+ value: field,
444
+ };
445
+ }), width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
446
+ if (e.target.value !== 'count' &&
447
+ pivotValueField &&
448
+ !ChartBuilder_1.numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)?.format)) {
449
+ setPivotValueField(null);
450
+ }
451
+ pivotFieldChange('aggregationType', e.target.value);
452
+ setPivotAggregation(e.target.value === ''
453
+ ? undefined
454
+ : e.target.value);
455
+ }, options: [
456
+ ...['sum', 'average', 'count', 'max', 'min'].map((option) => {
457
+ return { label: option, value: option };
458
+ }),
459
+ ], width: 200 })] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: () => {
460
+ const errors = [];
461
+ if (!pivotValueField &&
462
+ pivotAggregation !== 'count') {
463
+ errors.push("Value field cannot be empty when aggregation is not 'count'");
464
+ }
465
+ if (!pivotAggregation) {
466
+ errors.push('Aggregation cannot be empty');
467
+ }
468
+ if (errors.length === 0) {
469
+ const pivot = {
470
+ rowField: pivotRowField || '',
471
+ rowFieldType: columnsToShow[pivotRowField || ''],
472
+ columnField: pivotColumnField,
473
+ columnFieldType: columnsToShow[pivotColumnField || ''],
474
+ valueField: pivotValueField || '',
475
+ aggregationType: pivotAggregation || '',
476
+ };
477
+ pivot.title = generatePivotTitle(pivot);
478
+ setIsOpen(false);
479
+ setCreatedPivots([pivot]);
480
+ onSelectCreatedPivot(pivot, 0);
481
+ setPopUpTitle('Add pivot');
482
+ }
483
+ setErrors(errors);
484
+ }, label: popUpTitle }), errors.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
485
+ display: 'flex',
486
+ flexDirection: 'column',
487
+ gap: 8,
488
+ paddingTop: 8,
489
+ width: pivotCardWidth,
490
+ maxWidth: pivotCardWidth,
491
+ }, children: errors.map((error, index) => ((0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) }))] })] })) : ((0, jsx_runtime_1.jsx)("div", { style: {
492
+ display: 'flex',
493
+ flexDirection: 'column',
494
+ fontFamily: theme?.fontFamily,
495
+ color: theme?.primaryTextColor,
496
+ width: selectedPivotTable ? 500 : 600,
497
+ maxHeight: 600,
498
+ overflowY: 'scroll',
499
+ }, children: selectedPivotIndex >= 0 ? ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { onClick: () => {
500
+ setPopUpTitle('Edit pivot');
501
+ onEditPivot(createdPivots[0], 0);
502
+ }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
503
+ pivot: selectedPivotTable?.pivot,
504
+ rows: selectedPivotTable?.rows,
505
+ columns: selectedPivotTable?.columns,
506
+ }, theme: theme, index: 0, onSelectPivot: () => { }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, onClose: () => {
507
+ removePivot();
508
+ }, clickable: true, minHeight: 180, CardComponent: CardComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent }) }) })) : ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
509
+ // position button inline with the popover title
510
+ position: 'absolute',
511
+ top: -36,
512
+ right: 0,
513
+ display: 'flex',
514
+ flexDirection: 'row',
515
+ gap: 8,
516
+ }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.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" }) }) }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({}, null) })] }), isLoading ? ((0, jsx_runtime_1.jsxs)("div", { style: {
517
+ background: theme.backgroundColor,
518
+ width: 250,
519
+ minWidth: 250,
520
+ height: '100%',
521
+ paddingLeft: 20,
522
+ paddingRight: 30,
523
+ paddingTop: 40,
524
+ display: 'flex',
525
+ margin: '0px auto',
526
+ justifyContent: 'center',
527
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: { height: 100 } }), (0, jsx_runtime_1.jsxs)("svg", { width: "24", height: "24", children: [(0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "-180 12 12", to: "180 12 12", dur: "0.8s", repeatCount: "indefinite" }) }), (0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "0 12 12", to: "360 12 12", dur: "0.8s", repeatCount: "indefinite" }) })] })] })) : ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotList, { recommendedPivotTables: recommendedPivotTables, 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 }) }))] })) })) }) }) })] }) }));
402
528
  };
403
529
  exports.PivotModal = PivotModal;
404
530
  function generatePivotTableYAxis(pivot, cols, format) {
@@ -408,12 +534,9 @@ function generatePivotTableYAxis(pivot, cols, format) {
408
534
  }
409
535
  // For count aggregations, use 'count' for the label
410
536
  if (pivot?.aggregationType === 'count') {
411
- return [{ field: pivot.valueField, label: 'count', format: format }];
412
- }
413
- // For average aggregations, use 'average <label>' for the label
414
- if (pivot?.aggregationType === 'average') {
415
- const label = `average ${pivot.valueField}`;
416
- return [{ field: pivot.valueField, label, format: format }];
537
+ return [
538
+ { field: pivot.valueField || 'count', label: 'count', format: format },
539
+ ];
417
540
  }
418
541
  // otherwise use the default (ie. the field label)
419
542
  return [
@@ -426,8 +549,17 @@ function generatePivotTableYAxis(pivot, cols, format) {
426
549
  }
427
550
  exports.generatePivotTableYAxis = generatePivotTableYAxis;
428
551
  function generatePivotTitle(pivot) {
552
+ if (pivot.rowField && !pivot.valueField) {
553
+ return (0, textProcessing_1.snakeCaseToTitleCase)(`${pivot.aggregationType} of ${pivot.rowField}
554
+ `);
555
+ }
556
+ else if (pivot.valueField && !pivot.rowField) {
557
+ return (0, textProcessing_1.snakeCaseToTitleCase)(`${pivot.aggregationType} of ${pivot.valueField}
558
+ `);
559
+ }
429
560
  return (0, textProcessing_1.snakeCaseToTitleCase)(`${pivot.aggregationType} of ${pivot.valueField} by ${pivot.rowField}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
430
561
  }
562
+ exports.generatePivotTitle = generatePivotTitle;
431
563
  function castValueToDate(value) {
432
564
  if (!value) {
433
565
  return null;
@@ -437,7 +569,17 @@ function castValueToDate(value) {
437
569
  }
438
570
  return new Date(value);
439
571
  }
572
+ function getRecentDate(a, b) {
573
+ return a > b ? a : b;
574
+ }
575
+ function getEarliestDate(a, b) {
576
+ return a < b ? a : b;
577
+ }
440
578
  function getDateRange(dateRange, column, data) {
579
+ const currentTime = new Date().getTime();
580
+ const ONE_CENTURY_IN_MILLISECONDS = 100 * 365 * 24 * 60 * 60 * 1000;
581
+ const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
582
+ const minDate = new Date(0);
441
583
  if (!dateRange || !dateRange[0]) {
442
584
  if (data.length == 0 || !data[0][column]) {
443
585
  return { start: new Date(), end: new Date() };
@@ -454,12 +596,28 @@ function getDateRange(dateRange, column, data) {
454
596
  for (let i = 0; i < data.length; i++) {
455
597
  if (data[i][column]) {
456
598
  const value = castValueToDate(data[i][column]);
457
- lastestDate = lastestDate === null ? value : (0, date_fns_1.max)([lastestDate, value]);
458
- earliestDate =
459
- earliestDate === null ? value : (0, date_fns_1.min)([earliestDate, value]);
599
+ if (lastestDate && lastestDate > minDate) {
600
+ lastestDate = value;
601
+ }
602
+ if (value && value < maxDate) {
603
+ lastestDate =
604
+ lastestDate === null ? value : getRecentDate(lastestDate, value);
605
+ }
606
+ if (value && value > minDate) {
607
+ if (earliestDate && earliestDate < minDate) {
608
+ earliestDate = value;
609
+ }
610
+ earliestDate =
611
+ earliestDate === null
612
+ ? value
613
+ : getEarliestDate(earliestDate, value);
614
+ }
460
615
  }
461
616
  }
462
- return { start: earliestDate, end: lastestDate };
617
+ return {
618
+ start: earliestDate,
619
+ end: lastestDate,
620
+ };
463
621
  }
464
622
  else {
465
623
  return { start: dateRange[0], end: dateRange[1] };
@@ -516,6 +674,7 @@ function getDateString(value, dateRange) {
516
674
  return (0, valueFormatter_1.valueFormatter)({
517
675
  value,
518
676
  field: 'date',
677
+ // @ts-ignore
519
678
  fields: [{ field: 'date', format }],
520
679
  });
521
680
  }
@@ -577,15 +736,12 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
577
736
  const uniqueRows = (isDateField(pivot.rowFieldType)
578
737
  ? getDateBuckets(dateRange, pivot.rowField, data)
579
738
  : [...new Set(data.map((item) => item[pivot.rowField]))]).filter((row) => Boolean(row));
580
- const rowDateRange = pivot.rowField
581
- ? getDateRange(dateRange, pivot.rowField, data)
582
- : null;
583
- const columnDateRange = pivot.columnField
584
- ? getDateRange(dateRange, pivot.columnField, data)
585
- : null;
739
+ const rowDateRange = getDateRange(dateRange, pivot.rowField, data);
740
+ const compRowDateRange = getDateRange(compRange ?? dateRange, pivot.rowField, data);
586
741
  // If columnField is not provided, we will not be using uniqueColumns
587
- const uniqueColumns = (pivot.columnField && pivot.columnField.trim()
588
- ? isDateField(pivot.columnFieldType)
742
+ // @ts-ignore
743
+ const uniqueColumns = (pivot.columnField
744
+ ? isDateField(pivot.columnFieldType || '')
589
745
  ? getDateBuckets(dateRange, pivot.columnField, data)
590
746
  : [...new Set(data.map((item) => item[pivot.columnField || '']))]
591
747
  : [pivot.valueField]).filter((col) => Boolean(col));
@@ -594,12 +750,11 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
594
750
  const ROW_DATE_MAP = {};
595
751
  // add in the comparison columns for all columns in the pivot
596
752
  let compUniqueRows = [];
597
- let compRowDateRange = [];
598
753
  if (isComparison) {
599
754
  if (pivot.columnField) {
600
755
  const col = pivot.columnField;
601
756
  const row = pivot.rowField;
602
- const isDateCol = isDateField(pivot.columnFieldType);
757
+ const isDateCol = isDateField(pivot.columnFieldType || '');
603
758
  const isDateRow = isDateField(pivot.rowFieldType);
604
759
  data.forEach((item) => {
605
760
  if (isDateCol) {
@@ -623,9 +778,15 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
623
778
  compUniqueRows = (isDateField(pivot.rowFieldType)
624
779
  ? getCompDateBuckets(dateRange, compRange ?? dateRange, pivot.rowField, data)
625
780
  : [...new Set(data.map((item) => item[pivot.rowField]))]).filter((row) => Boolean(row));
626
- compRowDateRange = pivot.rowField
627
- ? getDateRange(compRange ?? dateRange, pivot.rowField, data)
628
- : null;
781
+ }
782
+ // Special corner case for count with only rowField pivot
783
+ if (!pivot.valueField &&
784
+ !pivot.columnField &&
785
+ pivot.aggregationType === 'count') {
786
+ uniqueColumns.push('count');
787
+ if (isComparison) {
788
+ uniqueColumns.push('comparison_count');
789
+ }
629
790
  }
630
791
  const rowsToGenerate = rowLimit !== -1 && rowLimit <= uniqueRows.length
631
792
  ? uniqueRows.slice(0, rowLimit + 1)
@@ -648,18 +809,20 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
648
809
  let comparisonValue;
649
810
  let value;
650
811
  const nextRowValue = isDateField(pivot.rowFieldType)
651
- ? uniqueRows[rowIndex + 1] ?? (0, date_fns_1.endOfDay)(rowDateRange.end)
812
+ ? // @ts-ignore
813
+ uniqueRows[rowIndex + 1] ?? (0, date_fns_1.endOfDay)(rowDateRange.end)
652
814
  : null;
653
815
  const compRowValue = compUniqueRows[rowIndex];
654
816
  const compNextRowValue = isDateField(pivot.rowFieldType)
655
817
  ? compUniqueRows[rowIndex + 1] ?? (0, date_fns_1.endOfDay)(compRowDateRange.end)
656
818
  : null;
657
819
  if (pivot.columnField) {
658
- const nextColumnValue = isDateField(pivot.columnFieldType)
820
+ const columnDateRange = getDateRange(dateRange, pivot.columnField, data);
821
+ const nextColumnValue = isDateField(pivot.columnFieldType || '')
659
822
  ? uniqueColumns[colIndex + 1] || (0, date_fns_1.endOfDay)(columnDateRange.end)
660
823
  : null;
661
824
  // If columnField is provided, filter by both rowField and columnField
662
- if (isDateField(pivot.columnFieldType) &&
825
+ if (isDateField(pivot.columnFieldType || '') &&
663
826
  isDateField(pivot.rowFieldType)) {
664
827
  filteredData = data.filter((item) => {
665
828
  return ((0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField]), {
@@ -684,7 +847,7 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
684
847
  });
685
848
  }
686
849
  }
687
- else if (isDateField(pivot.columnFieldType) &&
850
+ else if (isDateField(pivot.columnFieldType || '') &&
688
851
  !isDateField(pivot.rowFieldType)) {
689
852
  filteredData = data.filter((item) => {
690
853
  return (item[pivot.rowField] === rowValue &&
@@ -703,7 +866,7 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
703
866
  });
704
867
  }
705
868
  }
706
- else if (!isDateField(pivot.columnFieldType) &&
869
+ else if (!isDateField(pivot.columnFieldType || '') &&
707
870
  isDateField(pivot.rowFieldType)) {
708
871
  filteredData = data.filter((item) => {
709
872
  return ((0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField]), {
@@ -789,15 +952,15 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
789
952
  }
790
953
  break;
791
954
  case 'max':
792
- value = filteredData.reduce((max, item) => Math.max(max, parseFloat(item[key] ?? 0)), -Infinity);
955
+ value = filteredData.reduce((max, item) => Math.max(max, parseFloat(item[key] ?? -Infinity)), -Infinity);
793
956
  if (isComparison) {
794
- comparisonValue = comparisonFilteredData.reduce((max, item) => Math.max(max, parseFloat(item[key] ?? 0)), -Infinity);
957
+ comparisonValue = comparisonFilteredData.reduce((max, item) => Math.max(max, parseFloat(item[key] ?? -Infinity)), -Infinity);
795
958
  }
796
959
  break;
797
960
  case 'min':
798
- value = filteredData.reduce((min, item) => Math.min(min, parseFloat(item[key] ?? 0)), Infinity);
961
+ value = filteredData.reduce((min, item) => Math.min(min, parseFloat(item[key] ?? Infinity)), Infinity);
799
962
  if (isComparison) {
800
- comparisonValue = comparisonFilteredData.reduce((min, item) => Math.min(min, parseFloat(item[key] ?? 0)), Infinity);
963
+ comparisonValue = comparisonFilteredData.reduce((min, item) => Math.min(min, parseFloat(item[key] ?? Infinity)), Infinity);
801
964
  }
802
965
  break;
803
966
  // Implement other aggregation types as needed
@@ -806,11 +969,11 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
806
969
  }
807
970
  // Set the value on the row
808
971
  // If columnField is not provided, colValue will be valueField
809
- row[isDateField(pivot.columnFieldType)
972
+ row[isDateField(pivot.columnFieldType || '')
810
973
  ? getDateString(colValue, dateRange)
811
974
  : colValue] = pivot.aggregationType === 'count' ? value : value.toFixed(2);
812
975
  if (isComparison && pivot.columnField) {
813
- if (isDateField(pivot.columnFieldType)) {
976
+ if (isDateField(pivot.columnFieldType || '')) {
814
977
  row[`comparison_${getDateString(colValue, dateRange)}`] =
815
978
  pivot.aggregationType === 'count'
816
979
  ? comparisonValue
@@ -828,15 +991,11 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
828
991
  });
829
992
  const columns = [
830
993
  {
831
- label: pivot.rowField === null
832
- ? 'Null'
833
- : pivot.rowField === false
834
- ? 'False'
835
- : (0, textProcessing_1.snakeCaseToTitleCase)(pivot.rowField),
994
+ label: pivot.rowField === null ? 'Null' : (0, textProcessing_1.snakeCaseToTitleCase)(pivot.rowField),
836
995
  field: pivot.rowField,
837
996
  },
838
997
  ...uniqueColumns.map((column, index) => {
839
- const columnName = isDateField(pivot.columnFieldType)
998
+ const columnName = isDateField(pivot.columnFieldType || '')
840
999
  ? getDateString(column, dateRange)
841
1000
  : column;
842
1001
  return {
@@ -854,7 +1013,7 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
854
1013
  }),
855
1014
  ...(isComparison && pivot.columnField
856
1015
  ? uniqueColumns.map((column, index) => {
857
- const columnName = isDateField(pivot.columnFieldType)
1016
+ const columnName = isDateField(pivot.columnFieldType || '')
858
1017
  ? getDateString(column, dateRange)
859
1018
  : column;
860
1019
  return {
@@ -866,10 +1025,10 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
866
1025
  !pivot.columnField &&
867
1026
  index === 1
868
1027
  ? 'Comparison Count'
869
- : isDateField(pivot.columnFieldType)
1028
+ : isDateField(pivot.columnFieldType || '')
870
1029
  ? COL_DATE_MAP[getDateString(column, dateRange)] ??
871
1030
  'Comparison'
872
- : `Comparison ${(0, textProcessing_1.snakeCaseToTitleCase)(columnName)}`,
1031
+ : `comparison ${(0, textProcessing_1.snakeCaseToTitleCase)(columnName)}`,
873
1032
  field: `comparison_${columnName}`,
874
1033
  };
875
1034
  })
@@ -878,22 +1037,24 @@ function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1,
878
1037
  if (pivot.sort) {
879
1038
  pivotRows.sort((a, b) => {
880
1039
  if (pivot.sortDirection === 'ASC') {
881
- if (pivot.rowFieldType === 'date') {
882
- return new Date(a[pivot.rowField]) - new Date(b[pivot.rowField]);
1040
+ if (ChartBuilder_1.dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1041
+ // @ts-ignore
1042
+ return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
883
1043
  }
884
- else if ((0, ast_1.isNumericColumnType)(pivot.rowFieldType)) {
885
- return a[pivot.rowField] - b[pivot.rowField];
1044
+ else if ((0, ast_1.isNumericColumnType)(pivot.sortFieldType)) {
1045
+ return a[pivot.sortField] - b[pivot.sortField];
886
1046
  }
887
- return a[pivot.rowField].localeCompare(b[pivot.rowField]);
1047
+ return a[pivot.sortField].localeCompare(b[pivot.sortField]);
888
1048
  }
889
1049
  else {
890
- if (pivot.rowFieldType === 'date') {
891
- return new Date(b[pivot.rowField]) - new Date(a[pivot.rowField]);
1050
+ if (ChartBuilder_1.dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1051
+ // @ts-ignore
1052
+ return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
892
1053
  }
893
- else if ((0, ast_1.isNumericColumnType)(pivot.rowFieldType)) {
894
- return a[pivot.rowField] - b[pivot.rowField];
1054
+ else if ((0, ast_1.isNumericColumnType)(pivot.sortFieldType)) {
1055
+ return b[pivot.sortField] - a[pivot.sortField];
895
1056
  }
896
- return b[pivot.rowField].localeCompare(a[pivot.rowField]);
1057
+ return b[pivot.sortField].localeCompare(a[pivot.sortField]);
897
1058
  }
898
1059
  });
899
1060
  }
@@ -920,8 +1081,7 @@ function valueFieldAggregation(data, valueField, aggregationType, isComparison)
920
1081
  case 'average':
921
1082
  const count = data.reduce((count, item) => count + (item[valueField] ? 1 : 0), 0);
922
1083
  value =
923
- data.reduce((sum, item) => sum + parseFloat(item[valueField] ?? 0), 0) /
924
- (count === 0 ? 1 : count);
1084
+ data.reduce((sum, item) => sum + parseFloat(item[valueField] ?? 0), 0) / (count === 0 ? 1 : count);
925
1085
  if (isComparison) {
926
1086
  const comparisonCount = data.reduce((count, item) => count + (item[`comparison_${valueField}`] ? 1 : 0), 0);
927
1087
  comparisonValue =
@@ -929,15 +1089,15 @@ function valueFieldAggregation(data, valueField, aggregationType, isComparison)
929
1089
  }
930
1090
  break;
931
1091
  case 'max':
932
- value = data.reduce((max, item) => Math.max(max, parseFloat(item[valueField] ?? 0)), -Infinity);
1092
+ value = data.reduce((max, item) => Math.max(max, parseFloat(item[valueField] ?? -Infinity)), -Infinity);
933
1093
  if (isComparison) {
934
- comparisonValue = data.reduce((max, item) => Math.max(max, parseFloat(item[`comparison_${valueField}`] ?? 0)), -Infinity);
1094
+ comparisonValue = data.reduce((max, item) => Math.max(max, parseFloat(item[`comparison_${valueField}`] ?? -Infinity)), -Infinity);
935
1095
  }
936
1096
  break;
937
1097
  case 'min':
938
- value = data.reduce((min, item) => Math.min(min, parseFloat(item[valueField] ?? 0)), Infinity);
1098
+ value = data.reduce((min, item) => Math.min(min, parseFloat(item[valueField] ?? Infinity)), Infinity);
939
1099
  if (isComparison) {
940
- comparisonValue = data.reduce((min, item) => Math.min(min, parseFloat(item[`comparison_${valueField}`] ?? 0)), Infinity);
1100
+ comparisonValue = data.reduce((min, item) => Math.min(min, parseFloat(item[`comparison_${valueField}`] ?? Infinity)), Infinity);
941
1101
  }
942
1102
  break;
943
1103
  // Implement other aggregation types as needed