@quillsql/react 2.11.21 → 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 +235 -201
  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 +9 -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 +59 -2
  16. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.js +979 -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 +237 -203
  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 +10 -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 +59 -2
  115. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  116. package/dist/esm/ReportBuilder.js +981 -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
@@ -177,7 +177,13 @@ function ChartBuilderWithModal(props) {
177
177
  const Modal = props.ModalComponent ?? UiComponents_1.MemoizedModal;
178
178
  (0, react_1.useEffect)(() => {
179
179
  function handleResize() {
180
- setModalWidth(window.innerWidth - 80);
180
+ const screenSize = window.innerWidth;
181
+ if (screenSize >= 1200) {
182
+ setModalWidth(window.innerWidth - 80);
183
+ }
184
+ else {
185
+ setModalWidth(undefined); // use dynamic width of contents
186
+ }
181
187
  setModalHeight(window.innerHeight - 80);
182
188
  }
183
189
  handleResize();
@@ -186,7 +192,7 @@ function ChartBuilderWithModal(props) {
186
192
  window.removeEventListener('resize', handleResize);
187
193
  };
188
194
  }, []);
189
- return ((0, jsx_runtime_1.jsx)("div", { ref: parentRef, children: (0, jsx_runtime_1.jsx)(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
195
+ return ((0, jsx_runtime_1.jsx)("div", { style: { height: '100%' }, ref: parentRef, children: (0, jsx_runtime_1.jsx)(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
190
196
  // For isHorizontalView, use full viewport size minus 80px for padding,
191
197
  // otherwise use the default layout method of the modal (contents).
192
198
  width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: (0, jsx_runtime_1.jsx)(ChartBuilder, { ...props }) }) }));
@@ -216,14 +222,17 @@ exports.ChartBuilderWithModal = ChartBuilderWithModal;
216
222
  * ### Chart Builder API
217
223
  * @see https://docs.quillsql.com/components/chart-builder
218
224
  */
219
- function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent, isOpen, isHorizontalView = true, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, fields: fieldsProp, dashboardItem = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, hideDeleteButton = false, hideSubmitButton = false, }) {
225
+ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, LabelComponent = UiComponents_1.MemoizedLabel, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, TextComponent = UiComponents_1.MemoizedText, PopoverComponent = UiComponents_1.MemoizedPopover, CardComponent = QuillCard_1.QuillCard, TableComponent = UiComponents_1.QuillTableComponent, ModalComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, FormContainer = UiComponents_1.QuillChartBuilderFormContainer, isOpen, isHorizontalView = true, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, fields: fieldsProp, dashboardItem = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, initialUniqueValues, pivotRecommendationsEnabled = true, }) {
220
226
  const dateRange = dr || [null, null, null];
221
227
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
222
228
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
223
229
  const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
224
230
  const [windowWidth, setWindowWidth] = (0, react_1.useState)(1200);
225
231
  const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
226
- const [divWidth, setDivWidth] = (0, react_1.useState)('auto');
232
+ const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(665);
233
+ const [formWidth, setFormWidth] = (0, react_1.useState)(665);
234
+ const inputRef = (0, react_1.useRef)(null);
235
+ const selectRef = (0, react_1.useRef)(null);
227
236
  const { dispatch } = (0, react_1.useContext)(Context_1.DashboardContext);
228
237
  const fields = fieldsProp?.map((field) => ({
229
238
  field: field.name,
@@ -233,9 +242,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
233
242
  })) || [];
234
243
  const parentRef = (0, react_1.useRef)(null);
235
244
  const deleteRef = (0, react_1.useRef)(null);
236
- const pivotCardContainer = (0, react_1.useRef)(null);
237
245
  const modalPadding = 20;
238
- const deleteButtonMargin = -13;
246
+ const deleteButtonMargin = -12;
239
247
  (0, react_1.useEffect)(() => {
240
248
  const handleResize = () => setWindowWidth(window.innerWidth);
241
249
  handleResize();
@@ -245,56 +253,51 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
245
253
  };
246
254
  }, []);
247
255
  (0, react_1.useEffect)(() => {
248
- const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ?? 'auto';
249
256
  const handleResize = () => {
250
- if (pivotCardContainer.current) {
251
- setDivWidth(calculateWidth());
257
+ // The pivot card should be the same width as the row of inputs
258
+ // above it (an input, two selects, plus the gaps between them).
259
+ if (inputRef.current && selectRef.current) {
260
+ const inputSize = inputRef.current?.getBoundingClientRect();
261
+ const selectSize = selectRef.current?.getBoundingClientRect();
262
+ const selectWidth = selectSize.width;
263
+ const showDash = showDashboardDropdown && !destinationDashboard;
264
+ const spaceBetween = selectSize.left - inputSize.right;
265
+ const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
266
+ const width = inputSize.width + 2 * gap + 2 * selectWidth;
267
+ setPivotCardWidth(width);
268
+ // Calculate the form width by adding the width of the delete button
269
+ const deleteSize = deleteRef.current?.getBoundingClientRect();
270
+ const deleteWidth = deleteSize?.width ?? 0;
271
+ setFormWidth(width + deleteWidth);
252
272
  }
253
273
  };
254
274
  handleResize();
255
- window.addEventListener('resize', handleResize);
256
- return () => {
257
- window.removeEventListener('resize', handleResize);
258
- };
259
- }, [pivotCardContainer]);
260
- // get schema
275
+ }, [isOpen]);
261
276
  (0, react_1.useEffect)(() => {
262
- let isSubscribed = true;
263
- async function getSchema() {
264
- if (!schema || !schema.length) {
265
- const { queryEndpoint, queryHeaders, publicKey } = client;
266
- const response = await fetch(`${queryEndpoint}`, {
267
- method: 'POST',
268
- headers: {
269
- ...queryHeaders,
270
- 'Content-Type': 'application/json',
271
- },
272
- body: JSON.stringify({
273
- metadata: {
274
- clientId: publicKey,
275
- publicKey: publicKey,
276
- task: 'schema',
277
- },
278
- }),
279
- });
280
- const results = await response.json();
281
- if (isSubscribed) {
282
- if (results.data?.data) {
283
- setSchema(results.data.data.tables);
284
- }
285
- else {
286
- setSchema(results.data.tables);
287
- }
288
- }
277
+ const handleResize = () => {
278
+ // The pivot card should be the same width as the row of inputs
279
+ // above it (an input, two selects, plus the gaps between them).
280
+ if (inputRef.current && selectRef.current) {
281
+ const inputSize = inputRef.current?.getBoundingClientRect();
282
+ const selectSize = selectRef.current?.getBoundingClientRect();
283
+ const selectWidth = selectSize.width;
284
+ const showDash = showDashboardDropdown && !destinationDashboard;
285
+ const spaceBetween = selectSize.left - inputSize.right;
286
+ const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
287
+ const width = inputSize.width + 2 * gap + 2 * selectWidth;
288
+ setPivotCardWidth(width);
289
+ // Calculate the form width by adding the width of the delete button
290
+ const deleteSize = deleteRef.current?.getBoundingClientRect();
291
+ const deleteWidth = deleteSize?.width ?? 0;
292
+ setFormWidth(width + deleteWidth);
289
293
  }
290
- }
291
- if (isSubscribed) {
292
- getSchema();
293
- }
294
+ };
295
+ handleResize();
296
+ window.addEventListener('resize', handleResize);
294
297
  return () => {
295
- isSubscribed = false;
298
+ window.removeEventListener('resize', handleResize);
296
299
  };
297
- }, [schema]);
300
+ }, []);
298
301
  // get dashboards
299
302
  const [dashboardOptions, setDashboardOptions] = (0, react_1.useState)([]);
300
303
  const [defaultDashboardName, setDefaultDashboardName] = (0, react_1.useState)(destinationDashboard || dashboardItem?.dashboardName || '');
@@ -310,17 +313,18 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
310
313
  const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
311
314
  const [tableName, setTableName] = (0, react_1.useState)(undefined);
312
315
  const selectedTable = schema?.find((t) => t.displayName === tableName);
313
- const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add Pivot');
316
+ const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
314
317
  const [createdPivots, setCreatedPivots] = (0, react_1.useState)(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
315
318
  const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)(rp);
316
- const [pivotRowField, setPivotRowField] = (0, react_1.useState)(undefined);
317
- const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
318
- const [pivotValueField, setPivotValueField] = (0, react_1.useState)(undefined);
319
- const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(undefined);
319
+ const [pivotRowField, setPivotRowField] = (0, react_1.useState)(pivot?.rowField);
320
+ const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(pivot?.columnField);
321
+ const [pivotValueField, setPivotValueField] = (0, react_1.useState)(pivot?.valueField);
322
+ const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(pivot?.aggregationType);
320
323
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
321
324
  const [fieldOptions, setFieldOptions] = (0, react_1.useState)(fields);
322
325
  const [dateFieldOptions, setDateFieldOptions] = (0, react_1.useState)([]);
323
326
  const [allTables, setAllTables] = (0, react_1.useState)([]);
327
+ const [uniqueValues, setUniqueValues] = (0, react_1.useState)(undefined);
324
328
  const [defaultDateField, setDefaultDateField] = (0, react_1.useState)({
325
329
  table: dateFieldOptions[0]?.name || '',
326
330
  field: dateFieldOptions[0]?.columns[0]?.name || '',
@@ -348,7 +352,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
348
352
  template: false,
349
353
  };
350
354
  const updateDashboardFilters = async (dashboardName) => {
351
- const { queryEndpoint, queryHeaders, publicKey } = client;
355
+ const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
352
356
  if (queryEndpoint) {
353
357
  const response = await fetch(queryEndpoint, {
354
358
  method: 'POST',
@@ -358,7 +362,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
358
362
  },
359
363
  body: JSON.stringify({
360
364
  metadata: {
361
- orgId: '*',
365
+ orgId: customerId || '*',
362
366
  task: 'config',
363
367
  name: dashboardName,
364
368
  clientId: publicKey,
@@ -375,10 +379,13 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
375
379
  };
376
380
  const pivotFormData = (pivot) => {
377
381
  const yAxisField = pivot.columnField || pivot.valueField;
382
+ const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
383
+ ? dashboardItem.yAxisFields[0].label
384
+ : pivot.valueField;
378
385
  // date labels for pivots should be treated like strings since they are
379
386
  // formatted in generatePivotTable
380
387
  const yAxisIsDate = pivot.columnField
381
- ? (0, PivotModal_1.isDateField)(pivot.columnFieldType)
388
+ ? (0, PivotModal_1.isDateField)(pivot.columnFieldType || '')
382
389
  : false;
383
390
  const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
384
391
  return {
@@ -389,21 +396,28 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
389
396
  ? 'string'
390
397
  : columns.find((col) => col.field === pivot.rowField)?.format ||
391
398
  'whole_number',
392
- xAxisLabel: '',
399
+ xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
393
400
  yAxisFields: [
394
401
  {
395
402
  field: yAxisField,
396
- label: '',
403
+ label: yAxisLabel,
397
404
  format: yAxisIsDate
398
405
  ? 'string'
399
- : columns.find((col) => col.field === yAxisField)?.format ||
400
- 'whole_number',
406
+ : dashboardItem?.yAxisFields?.length > 0
407
+ ? dashboardItem?.yAxisFields[0].format
408
+ : columns.find((col) => col.field === pivot.valueField)?.format ||
409
+ 'whole_number',
401
410
  },
402
411
  ],
403
412
  };
404
413
  };
405
414
  const [formData, setFormData] = (0, react_1.useState)(pivot
406
- ? { ...formEmptyState, ...dashboardItem, ...pivotFormData(pivot) }
415
+ ? {
416
+ ...formEmptyState,
417
+ ...dashboardItem,
418
+ ...pivotFormData(pivot),
419
+ ...(destinationDashboard && { dashboardName: destinationDashboard }),
420
+ }
407
421
  : dashboardItem || formEmptyState);
408
422
  (0, react_1.useEffect)(() => {
409
423
  async function getFormData() {
@@ -412,27 +426,46 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
412
426
  const dashboardOptions = resp.dashboardNames
413
427
  .filter((elem) => elem !== null)
414
428
  .map((key) => ({ label: key, value: key }));
415
- await updateDashboardFilters(dashboardItem
429
+ await updateDashboardFilters(destinationDashboard ?? dashboardItem
416
430
  ? dashboardItem.dashboardName
417
431
  : dashboardOptions[0]?.label);
418
432
  setDashboardOptions(dashboardOptions);
419
- const dashboardName = dashboardItem
433
+ const dashboardName = destinationDashboard ?? dashboardItem
420
434
  ? dashboardItem?.dashboardName
421
435
  : dashboardOptions[0]?.label;
422
436
  curFormData.dashboardName = dashboardName;
423
- setDefaultDashboardName(dashboardItem
437
+ setDefaultDashboardName(destinationDashboard ?? dashboardItem
424
438
  ? dashboardItem?.dashboardName
425
439
  : dashboardOptions[0]?.label);
426
- // setFormData({
427
- // ...formData,
428
- // dashboardName: dashboardItem
429
- // ? dashboardItem?.dashboardName
430
- // : dashboardOptions[0]?.label,
431
- // });
440
+ const { queryEndpoint, queryHeaders, publicKey } = client;
441
+ const response = await fetch(`${queryEndpoint}`, {
442
+ method: 'POST',
443
+ headers: {
444
+ ...queryHeaders,
445
+ 'Content-Type': 'application/json',
446
+ },
447
+ body: JSON.stringify({
448
+ metadata: {
449
+ clientId: publicKey,
450
+ publicKey: publicKey,
451
+ task: 'schema',
452
+ },
453
+ }),
454
+ });
455
+ const schemaInfo = await response.json();
456
+ let schemaData = schemaInfo.data?.data;
457
+ if (schemaInfo.data?.data) {
458
+ schemaData = schemaInfo.data.data.tables;
459
+ setSchema(schemaInfo.data.data.tables);
460
+ }
461
+ else {
462
+ schemaData = schemaInfo.data.tables;
463
+ setSchema(schemaInfo.data.tables);
464
+ }
432
465
  if (!query) {
433
466
  return;
434
467
  }
435
- const result = await getReferencedTables(client, query, schema, true);
468
+ const result = await getReferencedTables(client, query, schemaData, true);
436
469
  setDateFieldOptions(result);
437
470
  if (result[0] && result[0].columns[0]) {
438
471
  setDefaultDateField({
@@ -440,7 +473,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
440
473
  field: result[0].columns[0].name,
441
474
  });
442
475
  }
443
- const allReferencedFields = await getReferencedTables(client, query, schema, false);
476
+ const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
444
477
  setAllTables(allReferencedFields.map((table) => table.name));
445
478
  setTableName(result[0]?.name);
446
479
  const dateField = {
@@ -452,6 +485,9 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
452
485
  curFormData.dateField = dateField;
453
486
  setFormData({
454
487
  ...curFormData,
488
+ dashboardName: dashboardItem
489
+ ? dashboardItem?.dashboardName
490
+ : dashboardOptions[0]?.label,
455
491
  });
456
492
  }
457
493
  getFormData();
@@ -493,6 +529,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
493
529
  });
494
530
  }
495
531
  else {
532
+ if (!rows)
533
+ return [];
496
534
  return rows.map((row) => {
497
535
  return formData.columns.reduce((formattedRow, column) => {
498
536
  // Apply the format function to each field in the row
@@ -589,16 +627,30 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
589
627
  }
590
628
  };
591
629
  const handleAddPivot = (pivot) => {
630
+ const newPivotFormData = pivotFormData(pivot);
631
+ // Only keep the old chart type if the shapes of the pivots are the same
632
+ // since the valid chart types for some pivots might have changed (eg. going
633
+ // from a 1D pivot to a 2D pivot would make bar lists not an option).
634
+ // They don't have to have the same value, just same 'truthiness'.
635
+ const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
636
+ Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
637
+ const isNewChartType = formData.chartType !== newPivotFormData.chartType;
638
+ const keepOldChartType = isNewChartType && isPivotSameShape;
592
639
  setFormData((formData) => ({
593
640
  ...formData,
594
- ...pivotFormData(pivot),
641
+ ...newPivotFormData,
642
+ ...(keepOldChartType && { chartType: formData.chartType }),
595
643
  }));
596
644
  };
597
645
  const handleDeletePivot = () => {
598
646
  if (!formData.pivot) {
599
647
  return;
600
648
  }
601
- setFormData({ ...formEmptyState, pivot: null });
649
+ setFormData({
650
+ ...formEmptyState,
651
+ dashboardName: formData.dashboardName,
652
+ pivot: null,
653
+ });
602
654
  };
603
655
  const handleAddField = (fieldName) => {
604
656
  if (fieldName === 'columns') {
@@ -759,7 +811,12 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
759
811
  setIsOpen(false);
760
812
  setIsSubmitting(false);
761
813
  if (onAddToDashboardComplete) {
762
- onAddToDashboardComplete();
814
+ onAddToDashboardComplete({
815
+ ...resp,
816
+ rows,
817
+ fieldOptions,
818
+ filtersApplied: dashboardFilters,
819
+ });
763
820
  }
764
821
  };
765
822
  // Prevent horizontal view on small screens.
@@ -786,56 +843,63 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
786
843
  display: 'flex',
787
844
  flexDirection: 'column',
788
845
  gap: '20px',
846
+ height: isHorizontalView || !isOpen ? '100%' : 800,
789
847
  ...(isHorizontalView && {
790
848
  flexGrow: 1,
791
- maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
849
+ maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
792
850
  }),
793
- }, children: [(!isHorizontalView || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
851
+ ...(!isHorizontalView && isOpen && { width: formWidth }),
852
+ }, children: [((!isHorizontalView && windowWidth >= 1200) ||
853
+ formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
794
854
  width: '100%',
795
855
  height: formData.chartType === 'metric'
796
856
  ? 100
797
- : isHorizontalView
857
+ : isHorizontalView || !isOpen
798
858
  ? 'calc(50% - 10px)'
799
859
  : 400,
800
860
  ...(isHorizontalView && { flexGrow: 1 }),
801
861
  } })),
802
862
  // Make sure to display non-pivoted table when using pivot chart
803
- isHorizontalView && ((0, jsx_runtime_1.jsx)("div", { style: {
863
+ (isHorizontalView || windowWidth < 1200) && ((0, jsx_runtime_1.jsx)("div", { style: {
804
864
  width: '100%',
805
- height: 'calc(50% - 10px)',
865
+ height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
806
866
  flexGrow: 1,
807
867
  }, children: formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: formData.columns })) : ((0, jsx_runtime_1.jsx)(TableComponent, { rows: formattedRows, columns: selectedPivotTable
808
868
  ? selectedPivotTable.columns
809
869
  : formData.columns })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
810
870
  display: 'flex',
811
871
  flexDirection: 'column',
812
- height: '100%',
872
+ gap: 20,
813
873
  ...(isHorizontalView && {
814
- minWidth: 665,
815
- maxWidth: 665,
816
- width: 665,
817
- gap: 20,
874
+ height: '100%',
875
+ minWidth: formWidth,
876
+ maxWidth: formWidth,
877
+ width: formWidth,
818
878
  }),
819
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { overflow: 'auto' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Name" }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" })] }), showDashboardDropdown && !destinationDashboard && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Dashboard" }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.dashboardName || '', onChange: async (e) => {
820
- handleChange(e.target.value, 'dashboardName');
821
- await updateDashboardFilters(e.target.value);
822
- }, options: dashboardOptions.map((elem) => ({
823
- label: elem.label,
824
- value: elem.label,
825
- })), width: 200 })] })), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Chart type" }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
826
- // filter out metric for all pivots
827
- // filter out bar and pie for row and column pivot
828
- options: getChartTypeOptions(formData), width: 200 })] })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("div", { style: {
879
+ ...(windowWidth < 1200 && {
880
+ width: formWidth,
881
+ paddingTop: modalPadding,
882
+ paddingBottom: modalPadding,
883
+ }),
884
+ }, children: [(0, jsx_runtime_1.jsxs)(FormContainer, { children: [(0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboard && ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
885
+ handleChange(e.target.value, 'dashboardName');
886
+ await updateDashboardFilters(e.target.value);
887
+ }, options: dashboardOptions.map((elem) => ({
888
+ label: elem.label,
889
+ value: elem.label,
890
+ })), width: 200 }) })), (0, jsx_runtime_1.jsx)("div", { ref: selectRef, style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Chart type", value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
891
+ // filter out metric for all pivots
892
+ // filter out bar and pie for row and column pivot
893
+ options: getChartTypeOptions(formData), width: 200 }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
829
894
  display: 'flex',
830
895
  flexDirection: 'column',
831
- gap: 12,
832
- marginTop: 6,
896
+ gap: 6,
833
897
  }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsxs)("div", { style: { fontFamily: theme?.fontFamily }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
834
898
  maxWidth: 200,
835
899
  // marginTop: 6,
836
900
  display: 'flex',
837
901
  flexDirection: 'column',
838
- }, children: (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot }) }), formData.pivot && ((0, jsx_runtime_1.jsx)("div", { ref: pivotCardContainer, children: (0, jsx_runtime_1.jsx)("div", { style: { width: !isHorizontalView ? divWidth : 'auto' }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
902
+ }, children: (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled }) }), formData.pivot && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("div", { style: { width: pivotCardWidth }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
839
903
  pivot: formData.pivot,
840
904
  rows: selectedPivotTable?.rows,
841
905
  columns: selectedPivotTable?.columns,
@@ -846,127 +910,97 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
846
910
  setPivotColumnField(formData.pivot?.columnField);
847
911
  setPivotValueField(formData.pivot?.valueField);
848
912
  setPivotAggregation(formData.pivot?.aggregationType);
849
- setPivotPopUpTitle('Edit Pivot');
850
- }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (0, jsx_runtime_1.jsx)("br", {}), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
913
+ setPivotPopUpTitle('Edit pivot');
914
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
851
915
  display: 'flex',
852
916
  flexDirection: 'column',
853
- gap: 6,
854
- marginTop: 6,
855
- }, children: (0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)("div", { style: {
856
- display: 'flex',
857
- flexDirection: 'row',
858
- gap: 12,
859
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
917
+ }, children: (0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
860
918
  ? getPivotMetricOptions(formData.pivot)
861
919
  : fieldOptions.map((elem) => ({
862
920
  label: elem.field,
863
921
  value: elem.field,
864
- })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
865
- ? formData.pivot.rowField
866
- : formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot &&
922
+ })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot &&
867
923
  (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
868
924
  ? 'pivot_date'
869
925
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
870
926
  (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
871
927
  ? [{ value: 'pivot_date', label: 'date' }]
872
- : formatOptions, width: 200 })] }, 'xAxisField'), (0, jsx_runtime_1.jsx)("br", {})] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsx)("div", { style: {
873
- display: 'flex',
874
- flexDirection: 'column',
875
- gap: 10,
876
- }, children: formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
877
- display: 'flex',
878
- flexDirection: 'row',
879
- gap: 12,
880
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
881
- ? formData.pivot.valueField
882
- : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
883
- ? [
884
- {
885
- label: `Pivot Column (${formData.pivot.valueField})`,
886
- value: formData.pivot.valueField,
887
- },
888
- ]
889
- : fieldOptions
890
- .filter((elem) => {
891
- return exports.numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
892
- })
893
- .map((elem) => ({
894
- label: elem.field,
895
- value: elem.field,
896
- })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-y-axis-label", width: 200, value: formData.pivot?.valueField || yAxisField.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'yAxisFields.label', index) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
897
- ? NUMBER_OPTIONS.find((option) => {
898
- return (option.value === yAxisField.format);
899
- })
900
- ? // @ts-ignore
901
- NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
902
- : 'whole_number'
903
- : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
904
- ? NUMBER_OPTIONS
905
- : formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), (0, jsx_runtime_1.jsx)("br", {})] })), isHorizontalView && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
928
+ : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
929
+ ? formData.pivot.valueField || 'count'
930
+ : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
931
+ ? [
932
+ {
933
+ label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
934
+ value: formData.pivot.valueField ||
935
+ 'count',
936
+ },
937
+ ]
938
+ : fieldOptions
939
+ .filter((elem) => {
940
+ return exports.numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
941
+ })
942
+ .map((elem) => ({
943
+ label: elem.field,
944
+ value: elem.field,
945
+ })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-y-axis-label", width: 200, value: yAxisField.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'yAxisFields.label', index) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
946
+ ? NUMBER_OPTIONS.find((option) => {
947
+ return (option.value === yAxisField.format);
948
+ })
949
+ ? // @ts-ignore
950
+ NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
951
+ : ''
952
+ : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
953
+ ? NUMBER_OPTIONS
954
+ : formatOptions, width: 200 }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), showTableFormatOptions && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
906
955
  display: 'flex',
907
956
  flexDirection: 'column',
908
- gap: 6,
909
- marginTop: 6,
910
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(LabelComponent, { label: "Columns" })] }), (0, jsx_runtime_1.jsx)("div", { style: {
911
- display: 'flex',
912
- flexDirection: 'column',
913
- gap: 10,
914
- }, children: formData.pivot &&
915
- selectedPivotTable &&
916
- selectedPivotTable.columns &&
917
- formData.chartType === 'table'
918
- ? // THIS CASE IF FOR PIVOT TABLES ONLY
919
- selectedPivotTable.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
920
- display: 'flex',
921
- flexDirection: 'row',
922
- gap: 12,
923
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
924
- label: elem.label,
925
- value: elem.label,
926
- })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value:
927
- // The first index use rowField for the rest of them use value fields
928
- formData.pivot &&
929
- column.field === formData.pivot.rowField
930
- ? formData.pivot &&
931
- (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
932
- ? 'pivot_date'
933
- : 'string'
934
- : formData.pivot?.valueFieldType ||
935
- 'whole_number', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
936
- ? (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
937
- ? [{ label: 'date', value: 'pivot_date' }]
938
- : [{ label: 'string', value: 'string' }]
939
- : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
940
- : formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
941
- display: 'flex',
942
- flexDirection: 'row',
943
- gap: 12,
944
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
945
- label: elem.field,
946
- value: elem.field,
947
- })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), (0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {})] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
957
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(SubHeaderComponent, { label: "Columns" })] }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
958
+ selectedPivotTable &&
959
+ selectedPivotTable.columns &&
960
+ formData.chartType === 'table'
961
+ ? // THIS CASE IF FOR PIVOT TABLES ONLY
962
+ selectedPivotTable.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
963
+ label: elem.label,
964
+ value: elem.label,
965
+ })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value:
966
+ // The first index use rowField for the rest of them use value fields
967
+ formData.pivot &&
968
+ column.field === formData.pivot.rowField
969
+ ? formData.pivot &&
970
+ (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
971
+ ? 'pivot_date'
972
+ : 'string'
973
+ : formData.pivot?.valueFieldType ||
974
+ 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
975
+ ? (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
976
+ ? [{ label: 'date', value: 'pivot_date' }]
977
+ : [{ label: 'string', value: 'string' }]
978
+ : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
979
+ : formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: columns.map((elem) => ({
980
+ label: elem.field,
981
+ value: elem.field,
982
+ })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), (0, jsx_runtime_1.jsx)("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: (0, jsx_runtime_1.jsx)(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), (0, jsx_runtime_1.jsx)("div", { children: !(
983
+ // hide when pivoted and chartType === 'table'
984
+ (formData.pivot &&
985
+ selectedPivotTable &&
986
+ selectedPivotTable.columns &&
987
+ formData.chartType === 'table')) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
948
988
  display: 'flex',
949
989
  flexDirection: 'column',
950
990
  gap: 6,
951
- marginTop: 6,
952
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Date field" }), (0, jsx_runtime_1.jsxs)("div", { style: {
953
- display: 'flex',
954
- flexDirection: 'row',
955
- gap: 12,
956
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
957
- label: elem.name,
958
- value: elem.name,
959
- })), width: 200 })] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { label: "Field" }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
960
- ?.find((elem) => elem.name === formData.dateField?.table)
961
- ?.columns?.map((elem) => ({
962
- label: elem.name,
963
- value: elem.name,
964
- })) || [], width: 200 })] })] }), (0, jsx_runtime_1.jsx)("br", {})] })), showAccessControlOptions && ((0, jsx_runtime_1.jsxs)("div", { style: {
991
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Date field" }), (0, jsx_runtime_1.jsxs)(ChartBuilderInputRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
992
+ label: elem.name,
993
+ value: elem.name,
994
+ })), width: 200 }) }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column' }, children: (0, jsx_runtime_1.jsx)(SelectComponent, { label: "Field", value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
995
+ ?.find((elem) => elem.name === formData.dateField?.table)
996
+ ?.columns?.map((elem) => ({
997
+ label: elem.name,
998
+ value: elem.name,
999
+ })) || [], width: 200 }) })] })] })), showAccessControlOptions && ((0, jsx_runtime_1.jsxs)("div", { style: {
965
1000
  display: 'flex',
966
1001
  flexDirection: 'column',
967
1002
  gap: 12,
968
- marginTop: 6,
969
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Organization access" }), (0, jsx_runtime_1.jsx)(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName })] }))] }), (0, jsx_runtime_1.jsxs)("div", { style: {
1003
+ }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Organization access" }), (0, jsx_runtime_1.jsx)(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template || !organizationName, theme: theme, organizationName: organizationName })] }))] }), (0, jsx_runtime_1.jsxs)("div", { style: {
970
1004
  display: 'flex',
971
1005
  flexDirection: 'row',
972
1006
  justifyContent: 'flex-end',
@@ -1051,7 +1085,7 @@ function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent = UiCo
1051
1085
  padding: '20px',
1052
1086
  boxSizing: 'border-box',
1053
1087
  overflow: 'scroll',
1054
- }, children: [issues.map((issue, index) => ((0, jsx_runtime_1.jsx)("span", { style: { paddingTop: '10px' }, children: issue }, issue))), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: {
1088
+ }, children: [issues.map((issue, index) => ((0, jsx_runtime_1.jsx)("span", { style: { paddingTop: '10px' }, children: issue }, issue))), (0, jsx_runtime_1.jsx)("div", { style: {
1055
1089
  display: 'flex',
1056
1090
  flexDirection: 'row',
1057
1091
  gap: '12px',