@quillsql/react 2.11.23 → 2.11.24

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