@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
@@ -182,7 +182,7 @@ function ChartBuilderWithModal(props) {
182
182
  setModalWidth(window.innerWidth - 80);
183
183
  }
184
184
  else {
185
- setModalWidth(705); // width of the form + padding
185
+ setModalWidth(undefined); // use dynamic width of contents
186
186
  }
187
187
  setModalHeight(window.innerHeight - 80);
188
188
  }
@@ -192,7 +192,7 @@ function ChartBuilderWithModal(props) {
192
192
  window.removeEventListener('resize', handleResize);
193
193
  };
194
194
  }, []);
195
- 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',
196
196
  // For isHorizontalView, use full viewport size minus 80px for padding,
197
197
  // otherwise use the default layout method of the modal (contents).
198
198
  width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: (0, jsx_runtime_1.jsx)(ChartBuilder, { ...props }) }) }));
@@ -222,14 +222,17 @@ exports.ChartBuilderWithModal = ChartBuilderWithModal;
222
222
  * ### Chart Builder API
223
223
  * @see https://docs.quillsql.com/components/chart-builder
224
224
  */
225
- 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, }) {
226
226
  const dateRange = dr || [null, null, null];
227
227
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
228
228
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
229
229
  const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
230
230
  const [windowWidth, setWindowWidth] = (0, react_1.useState)(1200);
231
231
  const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
232
- 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);
233
236
  const { dispatch } = (0, react_1.useContext)(Context_1.DashboardContext);
234
237
  const fields = fieldsProp?.map((field) => ({
235
238
  field: field.name,
@@ -239,9 +242,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
239
242
  })) || [];
240
243
  const parentRef = (0, react_1.useRef)(null);
241
244
  const deleteRef = (0, react_1.useRef)(null);
242
- const pivotCardContainer = (0, react_1.useRef)(null);
243
245
  const modalPadding = 20;
244
- const deleteButtonMargin = -13;
246
+ const deleteButtonMargin = -12;
245
247
  (0, react_1.useEffect)(() => {
246
248
  const handleResize = () => setWindowWidth(window.innerWidth);
247
249
  handleResize();
@@ -251,58 +253,51 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
251
253
  };
252
254
  }, []);
253
255
  (0, react_1.useEffect)(() => {
254
- const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ??
255
- 240 - 40 ??
256
- 'calc(100% - 40px)';
257
256
  const handleResize = () => {
258
- if (pivotCardContainer.current) {
259
- 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);
260
272
  }
261
273
  };
262
274
  handleResize();
263
- window.addEventListener('resize', handleResize);
264
- return () => {
265
- window.removeEventListener('resize', handleResize);
266
- };
267
- }, [pivotCardContainer]);
268
- // get schema
275
+ }, [isOpen]);
269
276
  (0, react_1.useEffect)(() => {
270
- let isSubscribed = true;
271
- async function getSchema() {
272
- if (!schema || !schema.length) {
273
- const { queryEndpoint, queryHeaders, publicKey } = client;
274
- const response = await fetch(`${queryEndpoint}`, {
275
- method: 'POST',
276
- headers: {
277
- ...queryHeaders,
278
- 'Content-Type': 'application/json',
279
- },
280
- body: JSON.stringify({
281
- metadata: {
282
- clientId: publicKey,
283
- publicKey: publicKey,
284
- task: 'schema',
285
- },
286
- }),
287
- });
288
- const results = await response.json();
289
- if (isSubscribed) {
290
- if (results.data?.data) {
291
- setSchema(results.data.data.tables);
292
- }
293
- else {
294
- setSchema(results.data.tables);
295
- }
296
- }
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);
297
293
  }
298
- }
299
- if (isSubscribed) {
300
- getSchema();
301
- }
294
+ };
295
+ handleResize();
296
+ window.addEventListener('resize', handleResize);
302
297
  return () => {
303
- isSubscribed = false;
298
+ window.removeEventListener('resize', handleResize);
304
299
  };
305
- }, [schema]);
300
+ }, []);
306
301
  // get dashboards
307
302
  const [dashboardOptions, setDashboardOptions] = (0, react_1.useState)([]);
308
303
  const [defaultDashboardName, setDefaultDashboardName] = (0, react_1.useState)(destinationDashboard || dashboardItem?.dashboardName || '');
@@ -318,17 +313,18 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
318
313
  const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
319
314
  const [tableName, setTableName] = (0, react_1.useState)(undefined);
320
315
  const selectedTable = schema?.find((t) => t.displayName === tableName);
321
- const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add Pivot');
316
+ const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
322
317
  const [createdPivots, setCreatedPivots] = (0, react_1.useState)(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
323
318
  const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)(rp);
324
- const [pivotRowField, setPivotRowField] = (0, react_1.useState)(undefined);
325
- const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
326
- const [pivotValueField, setPivotValueField] = (0, react_1.useState)(undefined);
327
- 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);
328
323
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
329
324
  const [fieldOptions, setFieldOptions] = (0, react_1.useState)(fields);
330
325
  const [dateFieldOptions, setDateFieldOptions] = (0, react_1.useState)([]);
331
326
  const [allTables, setAllTables] = (0, react_1.useState)([]);
327
+ const [uniqueValues, setUniqueValues] = (0, react_1.useState)(undefined);
332
328
  const [defaultDateField, setDefaultDateField] = (0, react_1.useState)({
333
329
  table: dateFieldOptions[0]?.name || '',
334
330
  field: dateFieldOptions[0]?.columns[0]?.name || '',
@@ -356,7 +352,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
356
352
  template: false,
357
353
  };
358
354
  const updateDashboardFilters = async (dashboardName) => {
359
- const { queryEndpoint, queryHeaders, publicKey } = client;
355
+ const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
360
356
  if (queryEndpoint) {
361
357
  const response = await fetch(queryEndpoint, {
362
358
  method: 'POST',
@@ -366,7 +362,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
366
362
  },
367
363
  body: JSON.stringify({
368
364
  metadata: {
369
- orgId: '*',
365
+ orgId: customerId || '*',
370
366
  task: 'config',
371
367
  name: dashboardName,
372
368
  clientId: publicKey,
@@ -383,10 +379,13 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
383
379
  };
384
380
  const pivotFormData = (pivot) => {
385
381
  const yAxisField = pivot.columnField || pivot.valueField;
382
+ const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
383
+ ? dashboardItem.yAxisFields[0].label
384
+ : pivot.valueField;
386
385
  // date labels for pivots should be treated like strings since they are
387
386
  // formatted in generatePivotTable
388
387
  const yAxisIsDate = pivot.columnField
389
- ? (0, PivotModal_1.isDateField)(pivot.columnFieldType)
388
+ ? (0, PivotModal_1.isDateField)(pivot.columnFieldType || '')
390
389
  : false;
391
390
  const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
392
391
  return {
@@ -397,21 +396,28 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
397
396
  ? 'string'
398
397
  : columns.find((col) => col.field === pivot.rowField)?.format ||
399
398
  'whole_number',
400
- xAxisLabel: '',
399
+ xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
401
400
  yAxisFields: [
402
401
  {
403
402
  field: yAxisField,
404
- label: '',
403
+ label: yAxisLabel,
405
404
  format: yAxisIsDate
406
405
  ? 'string'
407
- : columns.find((col) => col.field === yAxisField)?.format ||
408
- 'whole_number',
406
+ : dashboardItem?.yAxisFields?.length > 0
407
+ ? dashboardItem?.yAxisFields[0].format
408
+ : columns.find((col) => col.field === pivot.valueField)?.format ||
409
+ 'whole_number',
409
410
  },
410
411
  ],
411
412
  };
412
413
  };
413
414
  const [formData, setFormData] = (0, react_1.useState)(pivot
414
- ? { ...formEmptyState, ...dashboardItem, ...pivotFormData(pivot) }
415
+ ? {
416
+ ...formEmptyState,
417
+ ...dashboardItem,
418
+ ...pivotFormData(pivot),
419
+ ...(destinationDashboard && { dashboardName: destinationDashboard }),
420
+ }
415
421
  : dashboardItem || formEmptyState);
416
422
  (0, react_1.useEffect)(() => {
417
423
  async function getFormData() {
@@ -420,27 +426,46 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
420
426
  const dashboardOptions = resp.dashboardNames
421
427
  .filter((elem) => elem !== null)
422
428
  .map((key) => ({ label: key, value: key }));
423
- await updateDashboardFilters(dashboardItem
429
+ await updateDashboardFilters(destinationDashboard ?? dashboardItem
424
430
  ? dashboardItem.dashboardName
425
431
  : dashboardOptions[0]?.label);
426
432
  setDashboardOptions(dashboardOptions);
427
- const dashboardName = dashboardItem
433
+ const dashboardName = destinationDashboard ?? dashboardItem
428
434
  ? dashboardItem?.dashboardName
429
435
  : dashboardOptions[0]?.label;
430
436
  curFormData.dashboardName = dashboardName;
431
- setDefaultDashboardName(dashboardItem
437
+ setDefaultDashboardName(destinationDashboard ?? dashboardItem
432
438
  ? dashboardItem?.dashboardName
433
439
  : dashboardOptions[0]?.label);
434
- // setFormData({
435
- // ...formData,
436
- // dashboardName: dashboardItem
437
- // ? dashboardItem?.dashboardName
438
- // : dashboardOptions[0]?.label,
439
- // });
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
+ }
440
465
  if (!query) {
441
466
  return;
442
467
  }
443
- const result = await getReferencedTables(client, query, schema, true);
468
+ const result = await getReferencedTables(client, query, schemaData, true);
444
469
  setDateFieldOptions(result);
445
470
  if (result[0] && result[0].columns[0]) {
446
471
  setDefaultDateField({
@@ -448,7 +473,7 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
448
473
  field: result[0].columns[0].name,
449
474
  });
450
475
  }
451
- const allReferencedFields = await getReferencedTables(client, query, schema, false);
476
+ const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
452
477
  setAllTables(allReferencedFields.map((table) => table.name));
453
478
  setTableName(result[0]?.name);
454
479
  const dateField = {
@@ -460,6 +485,9 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
460
485
  curFormData.dateField = dateField;
461
486
  setFormData({
462
487
  ...curFormData,
488
+ dashboardName: dashboardItem
489
+ ? dashboardItem?.dashboardName
490
+ : dashboardOptions[0]?.label,
463
491
  });
464
492
  }
465
493
  getFormData();
@@ -501,6 +529,8 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
501
529
  });
502
530
  }
503
531
  else {
532
+ if (!rows)
533
+ return [];
504
534
  return rows.map((row) => {
505
535
  return formData.columns.reduce((formattedRow, column) => {
506
536
  // Apply the format function to each field in the row
@@ -597,16 +627,30 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
597
627
  }
598
628
  };
599
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;
600
639
  setFormData((formData) => ({
601
640
  ...formData,
602
- ...pivotFormData(pivot),
641
+ ...newPivotFormData,
642
+ ...(keepOldChartType && { chartType: formData.chartType }),
603
643
  }));
604
644
  };
605
645
  const handleDeletePivot = () => {
606
646
  if (!formData.pivot) {
607
647
  return;
608
648
  }
609
- setFormData({ ...formEmptyState, pivot: null });
649
+ setFormData({
650
+ ...formEmptyState,
651
+ dashboardName: formData.dashboardName,
652
+ pivot: null,
653
+ });
610
654
  };
611
655
  const handleAddField = (fieldName) => {
612
656
  if (fieldName === 'columns') {
@@ -767,7 +811,12 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
767
811
  setIsOpen(false);
768
812
  setIsSubmitting(false);
769
813
  if (onAddToDashboardComplete) {
770
- onAddToDashboardComplete();
814
+ onAddToDashboardComplete({
815
+ ...resp,
816
+ rows,
817
+ fieldOptions,
818
+ filtersApplied: dashboardFilters,
819
+ });
771
820
  }
772
821
  };
773
822
  // Prevent horizontal view on small screens.
@@ -794,13 +843,14 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
794
843
  display: 'flex',
795
844
  flexDirection: 'column',
796
845
  gap: '20px',
797
- height: '100%',
846
+ height: isHorizontalView || !isOpen ? '100%' : 800,
798
847
  ...(isHorizontalView && {
799
848
  flexGrow: 1,
800
- 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
801
850
  }),
851
+ ...(!isHorizontalView && isOpen && { width: formWidth }),
802
852
  }, children: [((!isHorizontalView && windowWidth >= 1200) ||
803
- formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
853
+ formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
804
854
  width: '100%',
805
855
  height: formData.chartType === 'metric'
806
856
  ? 100
@@ -819,40 +869,37 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
819
869
  : formData.columns })) }))] }), isOpen && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
820
870
  display: 'flex',
821
871
  flexDirection: 'column',
822
- height: '100%',
823
872
  gap: 20,
824
873
  ...(isHorizontalView && {
825
- minWidth: 665,
826
- maxWidth: 665,
827
- width: 665,
874
+ height: '100%',
875
+ minWidth: formWidth,
876
+ maxWidth: formWidth,
877
+ width: formWidth,
828
878
  }),
829
879
  ...(windowWidth < 1200 && {
830
- paddingBottom: modalPadding
831
- })
832
- }, 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) => {
833
- handleChange(e.target.value, 'dashboardName');
834
- await updateDashboardFilters(e.target.value);
835
- }, options: dashboardOptions.map((elem) => ({
836
- label: elem.label,
837
- value: elem.label,
838
- })), 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'),
839
- // filter out metric for all pivots
840
- // filter out bar and pie for row and column pivot
841
- options: getChartTypeOptions(formData), width: 200 })] })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("div", { style: {
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: {
842
894
  display: 'flex',
843
895
  flexDirection: 'column',
844
- gap: 12,
845
- marginTop: 6,
896
+ gap: 6,
846
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: {
847
898
  maxWidth: 200,
848
899
  // marginTop: 6,
849
900
  display: 'flex',
850
901
  flexDirection: 'column',
851
- }, 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: {
852
- width: !isHorizontalView
853
- ? divWidth
854
- : 'calc(100% - 40px)',
855
- }, 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: {
856
903
  pivot: formData.pivot,
857
904
  rows: selectedPivotTable?.rows,
858
905
  columns: selectedPivotTable?.columns,
@@ -863,127 +910,97 @@ function ChartBuilder({ TextInputComponent = UiComponents_1.QuillTextInput, Sele
863
910
  setPivotColumnField(formData.pivot?.columnField);
864
911
  setPivotValueField(formData.pivot?.valueField);
865
912
  setPivotAggregation(formData.pivot?.aggregationType);
866
- setPivotPopUpTitle('Edit Pivot');
867
- }, 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: {
868
915
  display: 'flex',
869
916
  flexDirection: 'column',
870
- gap: 6,
871
- marginTop: 6,
872
- }, 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: {
873
- display: 'flex',
874
- flexDirection: 'row',
875
- gap: 12,
876
- }, 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
877
918
  ? getPivotMetricOptions(formData.pivot)
878
919
  : fieldOptions.map((elem) => ({
879
920
  label: elem.field,
880
921
  value: elem.field,
881
- })), width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
882
- ? formData.pivot.rowField
883
- : 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 &&
884
923
  (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
885
924
  ? 'pivot_date'
886
925
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
887
926
  (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
888
927
  ? [{ value: 'pivot_date', label: 'date' }]
889
- : 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: {
890
- display: 'flex',
891
- flexDirection: 'column',
892
- gap: 10,
893
- }, children: formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
894
- display: 'flex',
895
- flexDirection: 'row',
896
- gap: 12,
897
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: formData.pivot
898
- ? formData.pivot.valueField
899
- : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
900
- ? [
901
- {
902
- label: `Pivot Column (${formData.pivot.valueField})`,
903
- value: formData.pivot.valueField,
904
- },
905
- ]
906
- : fieldOptions
907
- .filter((elem) => {
908
- return exports.numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
909
- })
910
- .map((elem) => ({
911
- label: elem.field,
912
- value: elem.field,
913
- })), 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
914
- ? NUMBER_OPTIONS.find((option) => {
915
- return (option.value === yAxisField.format);
916
- })
917
- ? // @ts-ignore
918
- NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
919
- : 'whole_number'
920
- : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
921
- ? NUMBER_OPTIONS
922
- : 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", {})] })), showTableFormatOptions && ((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: {
923
955
  display: 'flex',
924
956
  flexDirection: 'column',
925
- gap: 6,
926
- marginTop: 6,
927
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Table" }), (0, jsx_runtime_1.jsx)(LabelComponent, { label: "Columns" })] }), (0, jsx_runtime_1.jsx)("div", { style: {
928
- display: 'flex',
929
- flexDirection: 'column',
930
- gap: 10,
931
- }, children: formData.pivot &&
932
- selectedPivotTable &&
933
- selectedPivotTable.columns &&
934
- formData.chartType === 'table'
935
- ? // THIS CASE IF FOR PIVOT TABLES ONLY
936
- selectedPivotTable.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
937
- display: 'flex',
938
- flexDirection: 'row',
939
- gap: 12,
940
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
941
- label: elem.label,
942
- value: elem.label,
943
- })), 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:
944
- // The first index use rowField for the rest of them use value fields
945
- formData.pivot &&
946
- column.field === formData.pivot.rowField
947
- ? formData.pivot &&
948
- (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
949
- ? 'pivot_date'
950
- : 'string'
951
- : formData.pivot?.valueFieldType ||
952
- 'whole_number', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
953
- ? (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
954
- ? [{ label: 'date', value: 'pivot_date' }]
955
- : [{ label: 'string', value: 'string' }]
956
- : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
957
- : formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
958
- display: 'flex',
959
- flexDirection: 'row',
960
- gap: 12,
961
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
962
- label: elem.field,
963
- value: elem.field,
964
- })), 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: {
965
988
  display: 'flex',
966
989
  flexDirection: 'column',
967
990
  gap: 6,
968
- marginTop: 6,
969
- }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { label: "Date field" }), (0, jsx_runtime_1.jsxs)("div", { style: {
970
- display: 'flex',
971
- flexDirection: 'row',
972
- gap: 12,
973
- }, 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) => ({
974
- label: elem.name,
975
- value: elem.name,
976
- })), 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
977
- ?.find((elem) => elem.name === formData.dateField?.table)
978
- ?.columns?.map((elem) => ({
979
- label: elem.name,
980
- value: elem.name,
981
- })) || [], 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: {
982
1000
  display: 'flex',
983
1001
  flexDirection: 'column',
984
1002
  gap: 12,
985
- marginTop: 6,
986
- }, 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: {
987
1004
  display: 'flex',
988
1005
  flexDirection: 'row',
989
1006
  justifyContent: 'flex-end',
@@ -1068,7 +1085,7 @@ function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent = UiCo
1068
1085
  padding: '20px',
1069
1086
  boxSizing: 'border-box',
1070
1087
  overflow: 'scroll',
1071
- }, 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: {
1072
1089
  display: 'flex',
1073
1090
  flexDirection: 'row',
1074
1091
  gap: '12px',