@quillsql/react 2.11.23 → 2.11.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +32 -16
  3. package/dist/cjs/ChartBuilder.d.ts +55 -2
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +223 -206
  6. package/dist/cjs/ChartEditor.d.ts +49 -2
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +3 -3
  9. package/dist/cjs/Dashboard.d.ts +5 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +42 -18
  12. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  15. package/dist/cjs/ReportBuilder.d.ts +57 -2
  16. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.js +969 -684
  18. package/dist/cjs/SQLEditor.d.ts +83 -2
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +10 -2
  21. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  22. package/dist/cjs/components/Chart/BarChart.js +8 -6
  23. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  24. package/dist/cjs/components/Chart/BarList.js +0 -153
  25. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  26. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  27. package/dist/cjs/components/Chart/ChartError.js +13 -7
  28. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  31. package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
  32. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  33. package/dist/cjs/components/Chart/LineChart.js +32 -31
  34. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  37. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  40. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  42. package/dist/cjs/components/QuillSelect.js +1 -1
  43. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  44. package/dist/cjs/components/QuillTable.js +11 -12
  45. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  46. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  48. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  53. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  55. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  56. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  58. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  59. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  62. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  64. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  65. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  67. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  69. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  70. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  71. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  73. package/dist/cjs/components/UiComponents.d.ts +34 -4
  74. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  75. package/dist/cjs/components/UiComponents.js +165 -68
  76. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  77. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  78. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  80. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  81. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
  84. package/dist/cjs/utils/axisFormatter.js +3 -3
  85. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  86. package/dist/cjs/utils/getDomain.js +3 -0
  87. package/dist/cjs/utils/merge.d.ts.map +1 -1
  88. package/dist/cjs/utils/merge.js +2 -0
  89. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  91. package/dist/cjs/utils/pivotProcessing.js +177 -0
  92. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  94. package/dist/cjs/utils/queryConstructor.js +11 -0
  95. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  97. package/dist/cjs/utils/tableProcessing.js +84 -0
  98. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  99. package/dist/cjs/utils/valueFormatter.js +40 -8
  100. package/dist/esm/Chart.d.ts.map +1 -1
  101. package/dist/esm/Chart.js +33 -17
  102. package/dist/esm/ChartBuilder.d.ts +55 -2
  103. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  104. package/dist/esm/ChartBuilder.js +225 -208
  105. package/dist/esm/ChartEditor.d.ts +49 -2
  106. package/dist/esm/ChartEditor.d.ts.map +1 -1
  107. package/dist/esm/ChartEditor.js +4 -4
  108. package/dist/esm/Dashboard.d.ts +5 -1
  109. package/dist/esm/Dashboard.d.ts.map +1 -1
  110. package/dist/esm/Dashboard.js +21 -20
  111. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  112. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  114. package/dist/esm/ReportBuilder.d.ts +57 -2
  115. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  116. package/dist/esm/ReportBuilder.js +971 -687
  117. package/dist/esm/SQLEditor.d.ts +83 -2
  118. package/dist/esm/SQLEditor.d.ts.map +1 -1
  119. package/dist/esm/SQLEditor.js +11 -3
  120. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  121. package/dist/esm/components/Chart/BarChart.js +8 -6
  122. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarList.js +0 -153
  124. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  125. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  126. package/dist/esm/components/Chart/ChartError.js +13 -7
  127. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  128. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  129. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  130. package/dist/esm/components/Chart/LineChart.d.ts +1 -1
  131. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  132. package/dist/esm/components/Chart/LineChart.js +32 -31
  133. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  134. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  135. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  136. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  137. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  138. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  139. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  141. package/dist/esm/components/QuillSelect.js +1 -1
  142. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  143. package/dist/esm/components/QuillTable.js +11 -12
  144. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  145. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  147. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  148. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  149. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  150. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  152. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  153. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  154. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  155. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  156. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  157. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  158. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  159. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  160. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  161. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  162. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  163. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  164. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  165. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  166. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  167. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  169. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  170. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  171. package/dist/esm/components/ReportBuilder/util.js +3 -0
  172. package/dist/esm/components/UiComponents.d.ts +34 -4
  173. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  174. package/dist/esm/components/UiComponents.js +155 -66
  175. package/dist/esm/hooks/useQuill.d.ts +1 -0
  176. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  177. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  178. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  180. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  181. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  182. package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
  183. package/dist/esm/utils/axisFormatter.js +3 -3
  184. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  185. package/dist/esm/utils/getDomain.js +3 -0
  186. package/dist/esm/utils/merge.d.ts.map +1 -1
  187. package/dist/esm/utils/merge.js +2 -0
  188. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  189. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  190. package/dist/esm/utils/pivotProcessing.js +170 -0
  191. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  192. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  193. package/dist/esm/utils/queryConstructor.js +7 -0
  194. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  195. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  196. package/dist/esm/utils/tableProcessing.js +80 -0
  197. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  198. package/dist/esm/utils/valueFormatter.js +41 -9
  199. package/package.json +1 -1
  200. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  201. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /* eslint-disable no-unused-vars */
3
3
  import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
4
4
  import { ClientContext, DashboardContext, DashboardFiltersContext, SchemaContext, ThemeContext, } from './Context';
@@ -7,7 +7,7 @@ import { getPostgresBasicType } from './components/ReportBuilder/util';
7
7
  import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
8
8
  import { PivotCard } from './internals/ReportBuilder/PivotList';
9
9
  import Chart from './Chart';
10
- import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, } from './components/UiComponents';
10
+ import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, } from './components/UiComponents';
11
11
  import { mergeComparisonRange } from './utils/merge';
12
12
  import { removeDoubleQuotes, snakeCaseToTitleCase, } from './utils/textProcessing';
13
13
  import { QuillSelectComponent } from './components/QuillSelect';
@@ -176,7 +176,7 @@ export function ChartBuilderWithModal(props) {
176
176
  setModalWidth(window.innerWidth - 80);
177
177
  }
178
178
  else {
179
- setModalWidth(705); // width of the form + padding
179
+ setModalWidth(undefined); // use dynamic width of contents
180
180
  }
181
181
  setModalHeight(window.innerHeight - 80);
182
182
  }
@@ -186,7 +186,7 @@ export function ChartBuilderWithModal(props) {
186
186
  window.removeEventListener('resize', handleResize);
187
187
  };
188
188
  }, []);
189
- return (_jsx("div", { ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
189
+ return (_jsx("div", { style: { height: '100%' }, ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
190
190
  // For isHorizontalView, use full viewport size minus 80px for padding,
191
191
  // otherwise use the default layout method of the modal (contents).
192
192
  width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
@@ -215,14 +215,17 @@ export function ChartBuilderWithModal(props) {
215
215
  * ### Chart Builder API
216
216
  * @see https://docs.quillsql.com/components/chart-builder
217
217
  */
218
- export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = 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, }) {
218
+ export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = 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, }) {
219
219
  const dateRange = dr || [null, null, null];
220
220
  const [client] = useContext(ClientContext);
221
221
  const [theme] = useContext(ThemeContext);
222
222
  const [schema, setSchema] = useContext(SchemaContext);
223
223
  const [windowWidth, setWindowWidth] = useState(1200);
224
224
  const [isSubmitting, setIsSubmitting] = useState(false);
225
- const [divWidth, setDivWidth] = useState('auto');
225
+ const [pivotCardWidth, setPivotCardWidth] = useState(665);
226
+ const [formWidth, setFormWidth] = useState(665);
227
+ const inputRef = useRef(null);
228
+ const selectRef = useRef(null);
226
229
  const { dispatch } = useContext(DashboardContext);
227
230
  const fields = fieldsProp?.map((field) => ({
228
231
  field: field.name,
@@ -232,9 +235,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
232
235
  })) || [];
233
236
  const parentRef = useRef(null);
234
237
  const deleteRef = useRef(null);
235
- const pivotCardContainer = useRef(null);
236
238
  const modalPadding = 20;
237
- const deleteButtonMargin = -13;
239
+ const deleteButtonMargin = -12;
238
240
  useEffect(() => {
239
241
  const handleResize = () => setWindowWidth(window.innerWidth);
240
242
  handleResize();
@@ -244,58 +246,51 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
244
246
  };
245
247
  }, []);
246
248
  useEffect(() => {
247
- const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ??
248
- 240 - 40 ??
249
- 'calc(100% - 40px)';
250
249
  const handleResize = () => {
251
- if (pivotCardContainer.current) {
252
- setDivWidth(calculateWidth());
250
+ // The pivot card should be the same width as the row of inputs
251
+ // above it (an input, two selects, plus the gaps between them).
252
+ if (inputRef.current && selectRef.current) {
253
+ const inputSize = inputRef.current?.getBoundingClientRect();
254
+ const selectSize = selectRef.current?.getBoundingClientRect();
255
+ const selectWidth = selectSize.width;
256
+ const showDash = showDashboardDropdown && !destinationDashboard;
257
+ const spaceBetween = selectSize.left - inputSize.right;
258
+ const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
259
+ const width = inputSize.width + 2 * gap + 2 * selectWidth;
260
+ setPivotCardWidth(width);
261
+ // Calculate the form width by adding the width of the delete button
262
+ const deleteSize = deleteRef.current?.getBoundingClientRect();
263
+ const deleteWidth = deleteSize?.width ?? 0;
264
+ setFormWidth(width + deleteWidth);
253
265
  }
254
266
  };
255
267
  handleResize();
256
- window.addEventListener('resize', handleResize);
257
- return () => {
258
- window.removeEventListener('resize', handleResize);
259
- };
260
- }, [pivotCardContainer]);
261
- // get schema
268
+ }, [isOpen]);
262
269
  useEffect(() => {
263
- let isSubscribed = true;
264
- async function getSchema() {
265
- if (!schema || !schema.length) {
266
- const { queryEndpoint, queryHeaders, publicKey } = client;
267
- const response = await fetch(`${queryEndpoint}`, {
268
- method: 'POST',
269
- headers: {
270
- ...queryHeaders,
271
- 'Content-Type': 'application/json',
272
- },
273
- body: JSON.stringify({
274
- metadata: {
275
- clientId: publicKey,
276
- publicKey: publicKey,
277
- task: 'schema',
278
- },
279
- }),
280
- });
281
- const results = await response.json();
282
- if (isSubscribed) {
283
- if (results.data?.data) {
284
- setSchema(results.data.data.tables);
285
- }
286
- else {
287
- setSchema(results.data.tables);
288
- }
289
- }
270
+ const handleResize = () => {
271
+ // The pivot card should be the same width as the row of inputs
272
+ // above it (an input, two selects, plus the gaps between them).
273
+ if (inputRef.current && selectRef.current) {
274
+ const inputSize = inputRef.current?.getBoundingClientRect();
275
+ const selectSize = selectRef.current?.getBoundingClientRect();
276
+ const selectWidth = selectSize.width;
277
+ const showDash = showDashboardDropdown && !destinationDashboard;
278
+ const spaceBetween = selectSize.left - inputSize.right;
279
+ const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
280
+ const width = inputSize.width + 2 * gap + 2 * selectWidth;
281
+ setPivotCardWidth(width);
282
+ // Calculate the form width by adding the width of the delete button
283
+ const deleteSize = deleteRef.current?.getBoundingClientRect();
284
+ const deleteWidth = deleteSize?.width ?? 0;
285
+ setFormWidth(width + deleteWidth);
290
286
  }
291
- }
292
- if (isSubscribed) {
293
- getSchema();
294
- }
287
+ };
288
+ handleResize();
289
+ window.addEventListener('resize', handleResize);
295
290
  return () => {
296
- isSubscribed = false;
291
+ window.removeEventListener('resize', handleResize);
297
292
  };
298
- }, [schema]);
293
+ }, []);
299
294
  // get dashboards
300
295
  const [dashboardOptions, setDashboardOptions] = useState([]);
301
296
  const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || dashboardItem?.dashboardName || '');
@@ -311,17 +306,18 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
311
306
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
312
307
  const [tableName, setTableName] = useState(undefined);
313
308
  const selectedTable = schema?.find((t) => t.displayName === tableName);
314
- const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add Pivot');
309
+ const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
315
310
  const [createdPivots, setCreatedPivots] = useState(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
316
311
  const [recommendedPivots, setRecommendedPivots] = useState(rp);
317
- const [pivotRowField, setPivotRowField] = useState(undefined);
318
- const [pivotColumnField, setPivotColumnField] = useState(undefined);
319
- const [pivotValueField, setPivotValueField] = useState(undefined);
320
- const [pivotAggregation, setPivotAggregation] = useState(undefined);
312
+ const [pivotRowField, setPivotRowField] = useState(pivot?.rowField);
313
+ const [pivotColumnField, setPivotColumnField] = useState(pivot?.columnField);
314
+ const [pivotValueField, setPivotValueField] = useState(pivot?.valueField);
315
+ const [pivotAggregation, setPivotAggregation] = useState(pivot?.aggregationType);
321
316
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
322
317
  const [fieldOptions, setFieldOptions] = useState(fields);
323
318
  const [dateFieldOptions, setDateFieldOptions] = useState([]);
324
319
  const [allTables, setAllTables] = useState([]);
320
+ const [uniqueValues, setUniqueValues] = useState(undefined);
325
321
  const [defaultDateField, setDefaultDateField] = useState({
326
322
  table: dateFieldOptions[0]?.name || '',
327
323
  field: dateFieldOptions[0]?.columns[0]?.name || '',
@@ -349,7 +345,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
349
345
  template: false,
350
346
  };
351
347
  const updateDashboardFilters = async (dashboardName) => {
352
- const { queryEndpoint, queryHeaders, publicKey } = client;
348
+ const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
353
349
  if (queryEndpoint) {
354
350
  const response = await fetch(queryEndpoint, {
355
351
  method: 'POST',
@@ -359,7 +355,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
359
355
  },
360
356
  body: JSON.stringify({
361
357
  metadata: {
362
- orgId: '*',
358
+ orgId: customerId || '*',
363
359
  task: 'config',
364
360
  name: dashboardName,
365
361
  clientId: publicKey,
@@ -376,10 +372,13 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
376
372
  };
377
373
  const pivotFormData = (pivot) => {
378
374
  const yAxisField = pivot.columnField || pivot.valueField;
375
+ const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
376
+ ? dashboardItem.yAxisFields[0].label
377
+ : pivot.valueField;
379
378
  // date labels for pivots should be treated like strings since they are
380
379
  // formatted in generatePivotTable
381
380
  const yAxisIsDate = pivot.columnField
382
- ? isDateField(pivot.columnFieldType)
381
+ ? isDateField(pivot.columnFieldType || '')
383
382
  : false;
384
383
  const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
385
384
  return {
@@ -390,21 +389,28 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
390
389
  ? 'string'
391
390
  : columns.find((col) => col.field === pivot.rowField)?.format ||
392
391
  'whole_number',
393
- xAxisLabel: '',
392
+ xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
394
393
  yAxisFields: [
395
394
  {
396
395
  field: yAxisField,
397
- label: '',
396
+ label: yAxisLabel,
398
397
  format: yAxisIsDate
399
398
  ? 'string'
400
- : columns.find((col) => col.field === yAxisField)?.format ||
401
- 'whole_number',
399
+ : dashboardItem?.yAxisFields?.length > 0
400
+ ? dashboardItem?.yAxisFields[0].format
401
+ : columns.find((col) => col.field === pivot.valueField)?.format ||
402
+ 'whole_number',
402
403
  },
403
404
  ],
404
405
  };
405
406
  };
406
407
  const [formData, setFormData] = useState(pivot
407
- ? { ...formEmptyState, ...dashboardItem, ...pivotFormData(pivot) }
408
+ ? {
409
+ ...formEmptyState,
410
+ ...dashboardItem,
411
+ ...pivotFormData(pivot),
412
+ ...(destinationDashboard && { dashboardName: destinationDashboard }),
413
+ }
408
414
  : dashboardItem || formEmptyState);
409
415
  useEffect(() => {
410
416
  async function getFormData() {
@@ -413,27 +419,46 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
413
419
  const dashboardOptions = resp.dashboardNames
414
420
  .filter((elem) => elem !== null)
415
421
  .map((key) => ({ label: key, value: key }));
416
- await updateDashboardFilters(dashboardItem
422
+ await updateDashboardFilters(destinationDashboard ?? dashboardItem
417
423
  ? dashboardItem.dashboardName
418
424
  : dashboardOptions[0]?.label);
419
425
  setDashboardOptions(dashboardOptions);
420
- const dashboardName = dashboardItem
426
+ const dashboardName = destinationDashboard ?? dashboardItem
421
427
  ? dashboardItem?.dashboardName
422
428
  : dashboardOptions[0]?.label;
423
429
  curFormData.dashboardName = dashboardName;
424
- setDefaultDashboardName(dashboardItem
430
+ setDefaultDashboardName(destinationDashboard ?? dashboardItem
425
431
  ? dashboardItem?.dashboardName
426
432
  : dashboardOptions[0]?.label);
427
- // setFormData({
428
- // ...formData,
429
- // dashboardName: dashboardItem
430
- // ? dashboardItem?.dashboardName
431
- // : dashboardOptions[0]?.label,
432
- // });
433
+ const { queryEndpoint, queryHeaders, publicKey } = client;
434
+ const response = await fetch(`${queryEndpoint}`, {
435
+ method: 'POST',
436
+ headers: {
437
+ ...queryHeaders,
438
+ 'Content-Type': 'application/json',
439
+ },
440
+ body: JSON.stringify({
441
+ metadata: {
442
+ clientId: publicKey,
443
+ publicKey: publicKey,
444
+ task: 'schema',
445
+ },
446
+ }),
447
+ });
448
+ const schemaInfo = await response.json();
449
+ let schemaData = schemaInfo.data?.data;
450
+ if (schemaInfo.data?.data) {
451
+ schemaData = schemaInfo.data.data.tables;
452
+ setSchema(schemaInfo.data.data.tables);
453
+ }
454
+ else {
455
+ schemaData = schemaInfo.data.tables;
456
+ setSchema(schemaInfo.data.tables);
457
+ }
433
458
  if (!query) {
434
459
  return;
435
460
  }
436
- const result = await getReferencedTables(client, query, schema, true);
461
+ const result = await getReferencedTables(client, query, schemaData, true);
437
462
  setDateFieldOptions(result);
438
463
  if (result[0] && result[0].columns[0]) {
439
464
  setDefaultDateField({
@@ -441,7 +466,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
441
466
  field: result[0].columns[0].name,
442
467
  });
443
468
  }
444
- const allReferencedFields = await getReferencedTables(client, query, schema, false);
469
+ const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
445
470
  setAllTables(allReferencedFields.map((table) => table.name));
446
471
  setTableName(result[0]?.name);
447
472
  const dateField = {
@@ -453,6 +478,9 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
453
478
  curFormData.dateField = dateField;
454
479
  setFormData({
455
480
  ...curFormData,
481
+ dashboardName: dashboardItem
482
+ ? dashboardItem?.dashboardName
483
+ : dashboardOptions[0]?.label,
456
484
  });
457
485
  }
458
486
  getFormData();
@@ -494,6 +522,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
494
522
  });
495
523
  }
496
524
  else {
525
+ if (!rows)
526
+ return [];
497
527
  return rows.map((row) => {
498
528
  return formData.columns.reduce((formattedRow, column) => {
499
529
  // Apply the format function to each field in the row
@@ -590,16 +620,30 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
590
620
  }
591
621
  };
592
622
  const handleAddPivot = (pivot) => {
623
+ const newPivotFormData = pivotFormData(pivot);
624
+ // Only keep the old chart type if the shapes of the pivots are the same
625
+ // since the valid chart types for some pivots might have changed (eg. going
626
+ // from a 1D pivot to a 2D pivot would make bar lists not an option).
627
+ // They don't have to have the same value, just same 'truthiness'.
628
+ const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
629
+ Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
630
+ const isNewChartType = formData.chartType !== newPivotFormData.chartType;
631
+ const keepOldChartType = isNewChartType && isPivotSameShape;
593
632
  setFormData((formData) => ({
594
633
  ...formData,
595
- ...pivotFormData(pivot),
634
+ ...newPivotFormData,
635
+ ...(keepOldChartType && { chartType: formData.chartType }),
596
636
  }));
597
637
  };
598
638
  const handleDeletePivot = () => {
599
639
  if (!formData.pivot) {
600
640
  return;
601
641
  }
602
- setFormData({ ...formEmptyState, pivot: null });
642
+ setFormData({
643
+ ...formEmptyState,
644
+ dashboardName: formData.dashboardName,
645
+ pivot: null,
646
+ });
603
647
  };
604
648
  const handleAddField = (fieldName) => {
605
649
  if (fieldName === 'columns') {
@@ -760,7 +804,12 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
760
804
  setIsOpen(false);
761
805
  setIsSubmitting(false);
762
806
  if (onAddToDashboardComplete) {
763
- onAddToDashboardComplete();
807
+ onAddToDashboardComplete({
808
+ ...resp,
809
+ rows,
810
+ fieldOptions,
811
+ filtersApplied: dashboardFilters,
812
+ });
764
813
  }
765
814
  };
766
815
  // Prevent horizontal view on small screens.
@@ -787,13 +836,14 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
787
836
  display: 'flex',
788
837
  flexDirection: 'column',
789
838
  gap: '20px',
790
- height: '100%',
839
+ height: isHorizontalView || !isOpen ? '100%' : 800,
791
840
  ...(isHorizontalView && {
792
841
  flexGrow: 1,
793
- maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
842
+ maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
794
843
  }),
844
+ ...(!isHorizontalView && isOpen && { width: formWidth }),
795
845
  }, children: [((!isHorizontalView && windowWidth >= 1200) ||
796
- formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
846
+ formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
797
847
  width: '100%',
798
848
  height: formData.chartType === 'metric'
799
849
  ? 100
@@ -812,40 +862,37 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
812
862
  : formData.columns })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
813
863
  display: 'flex',
814
864
  flexDirection: 'column',
815
- height: '100%',
816
865
  gap: 20,
817
866
  ...(isHorizontalView && {
818
- minWidth: 665,
819
- maxWidth: 665,
820
- width: 665,
867
+ height: '100%',
868
+ minWidth: formWidth,
869
+ maxWidth: formWidth,
870
+ width: formWidth,
821
871
  }),
822
872
  ...(windowWidth < 1200 && {
823
- paddingBottom: modalPadding
824
- })
825
- }, children: [_jsxs("div", { style: { overflow: 'auto' }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(LabelComponent, { label: "Name" }), _jsx(TextInputComponent, { id: "chart-builder-name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" })] }), showDashboardDropdown && !destinationDashboard && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(LabelComponent, { label: "Dashboard" }), _jsx(SelectComponent, { value: formData.dashboardName || '', onChange: async (e) => {
826
- handleChange(e.target.value, 'dashboardName');
827
- await updateDashboardFilters(e.target.value);
828
- }, options: dashboardOptions.map((elem) => ({
829
- label: elem.label,
830
- value: elem.label,
831
- })), width: 200 })] })), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(LabelComponent, { label: "Chart type" }), _jsx(SelectComponent, { value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
832
- // filter out metric for all pivots
833
- // filter out bar and pie for row and column pivot
834
- options: getChartTypeOptions(formData), width: 200 })] })] }), _jsx("br", {}), _jsxs("div", { style: {
873
+ width: formWidth,
874
+ paddingTop: modalPadding,
875
+ paddingBottom: modalPadding,
876
+ }),
877
+ }, children: [_jsxs(FormContainer, { children: [_jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(TextInputComponent, { id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboard && (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
878
+ handleChange(e.target.value, 'dashboardName');
879
+ await updateDashboardFilters(e.target.value);
880
+ }, options: dashboardOptions.map((elem) => ({
881
+ label: elem.label,
882
+ value: elem.label,
883
+ })), width: 200 }) })), _jsx("div", { ref: selectRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Chart type", value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
884
+ // filter out metric for all pivots
885
+ // filter out bar and pie for row and column pivot
886
+ options: getChartTypeOptions(formData), width: 200 }) })] }), _jsxs("div", { style: {
835
887
  display: 'flex',
836
888
  flexDirection: 'column',
837
- gap: 12,
838
- marginTop: 6,
889
+ gap: 6,
839
890
  }, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
840
891
  maxWidth: 200,
841
892
  // marginTop: 6,
842
893
  display: 'flex',
843
894
  flexDirection: 'column',
844
- }, children: _jsx(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 && (_jsx("div", { ref: pivotCardContainer, children: _jsx("div", { style: {
845
- width: !isHorizontalView
846
- ? divWidth
847
- : 'calc(100% - 40px)',
848
- }, children: _jsx(PivotCard, { pivotTable: {
895
+ }, children: _jsx(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 && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: {
849
896
  pivot: formData.pivot,
850
897
  rows: selectedPivotTable?.rows,
851
898
  columns: selectedPivotTable?.columns,
@@ -856,127 +903,97 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
856
903
  setPivotColumnField(formData.pivot?.columnField);
857
904
  setPivotValueField(formData.pivot?.valueField);
858
905
  setPivotAggregation(formData.pivot?.aggregationType);
859
- setPivotPopUpTitle('Edit Pivot');
860
- }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), _jsx("br", {}), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
906
+ setPivotPopUpTitle('Edit pivot');
907
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
861
908
  display: 'flex',
862
909
  flexDirection: 'column',
863
- gap: 6,
864
- marginTop: 6,
865
- }, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(LabelComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), _jsxs("div", { style: {
866
- display: 'flex',
867
- flexDirection: 'row',
868
- gap: 12,
869
- }, children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
910
+ }, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
870
911
  ? getPivotMetricOptions(formData.pivot)
871
912
  : fieldOptions.map((elem) => ({
872
913
  label: elem.field,
873
914
  value: elem.field,
874
- })), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
875
- ? formData.pivot.rowField
876
- : formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), _jsx(SelectComponent, { value: formData.pivot &&
915
+ })), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), _jsx(SelectComponent, { value: formData.pivot &&
877
916
  isDateField(formData.pivot.rowFieldType)
878
917
  ? 'pivot_date'
879
918
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
880
919
  isDateField(formData.pivot.rowFieldType)
881
920
  ? [{ value: 'pivot_date', label: 'date' }]
882
- : formatOptions, width: 200 })] }, 'xAxisField'), _jsx("br", {})] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(LabelComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsx("div", { style: {
883
- display: 'flex',
884
- flexDirection: 'column',
885
- gap: 10,
886
- }, children: formData.yAxisFields.map((yAxisField, index) => (_jsxs("div", { style: {
887
- display: 'flex',
888
- flexDirection: 'row',
889
- gap: 12,
890
- }, children: [_jsx(SelectComponent, { value: formData.pivot
891
- ? formData.pivot.valueField
892
- : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
893
- ? [
894
- {
895
- label: `Pivot Column (${formData.pivot.valueField})`,
896
- value: formData.pivot.valueField,
897
- },
898
- ]
899
- : fieldOptions
900
- .filter((elem) => {
901
- return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
902
- })
903
- .map((elem) => ({
904
- label: elem.field,
905
- value: elem.field,
906
- })), width: 200 }), _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) }), _jsx(SelectComponent, { value: formData.pivot
907
- ? NUMBER_OPTIONS.find((option) => {
908
- return (option.value === yAxisField.format);
909
- })
910
- ? // @ts-ignore
911
- NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
912
- : 'whole_number'
913
- : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
914
- ? NUMBER_OPTIONS
915
- : formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && (_jsxs(_Fragment, { children: [_jsx("br", {}), _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), _jsx("br", {})] })), showTableFormatOptions && (_jsxs("div", { children: [_jsxs("div", { style: {
921
+ : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
922
+ ? formData.pivot.valueField || 'count'
923
+ : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
924
+ ? [
925
+ {
926
+ label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
927
+ value: formData.pivot.valueField ||
928
+ 'count',
929
+ },
930
+ ]
931
+ : fieldOptions
932
+ .filter((elem) => {
933
+ return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
934
+ })
935
+ .map((elem) => ({
936
+ label: elem.field,
937
+ value: elem.field,
938
+ })), width: 200 }), _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) }), _jsx(SelectComponent, { value: formData.pivot
939
+ ? NUMBER_OPTIONS.find((option) => {
940
+ return (option.value === yAxisField.format);
941
+ })
942
+ ? // @ts-ignore
943
+ NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
944
+ : ''
945
+ : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
946
+ ? NUMBER_OPTIONS
947
+ : formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), showTableFormatOptions && (_jsxs("div", { children: [_jsxs("div", { style: {
916
948
  display: 'flex',
917
949
  flexDirection: 'column',
918
- gap: 6,
919
- marginTop: 6,
920
- }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(LabelComponent, { label: "Columns" })] }), _jsx("div", { style: {
921
- display: 'flex',
922
- flexDirection: 'column',
923
- gap: 10,
924
- }, children: formData.pivot &&
925
- selectedPivotTable &&
926
- selectedPivotTable.columns &&
927
- formData.chartType === 'table'
928
- ? // THIS CASE IF FOR PIVOT TABLES ONLY
929
- selectedPivotTable.columns.map((column, index) => (_jsxs("div", { style: {
930
- display: 'flex',
931
- flexDirection: 'row',
932
- gap: 12,
933
- }, children: [_jsx(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
934
- label: elem.label,
935
- value: elem.label,
936
- })), width: 200 }), _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) }), _jsx(SelectComponent, { value:
937
- // The first index use rowField for the rest of them use value fields
938
- formData.pivot &&
939
- column.field === formData.pivot.rowField
940
- ? formData.pivot &&
941
- isDateField(formData.pivot.rowFieldType)
942
- ? 'pivot_date'
943
- : 'string'
944
- : formData.pivot?.valueFieldType ||
945
- 'whole_number', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
946
- ? isDateField(formData.pivot.rowFieldType)
947
- ? [{ label: 'date', value: 'pivot_date' }]
948
- : [{ label: 'string', value: 'string' }]
949
- : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
950
- : formData.columns.map((column, index) => (_jsxs("div", { style: {
951
- display: 'flex',
952
- flexDirection: 'row',
953
- gap: 12,
954
- }, children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
955
- label: elem.field,
956
- value: elem.field,
957
- })), width: 200 }), _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) }), _jsx(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), _jsx("br", {}), _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), _jsx("br", {}), _jsx("br", {})] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
950
+ }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
951
+ selectedPivotTable &&
952
+ selectedPivotTable.columns &&
953
+ formData.chartType === 'table'
954
+ ? // THIS CASE IF FOR PIVOT TABLES ONLY
955
+ selectedPivotTable.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
956
+ label: elem.label,
957
+ value: elem.label,
958
+ })), width: 200 }), _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) }), _jsx(SelectComponent, { value:
959
+ // The first index use rowField for the rest of them use value fields
960
+ formData.pivot &&
961
+ column.field === formData.pivot.rowField
962
+ ? formData.pivot &&
963
+ isDateField(formData.pivot.rowFieldType)
964
+ ? 'pivot_date'
965
+ : 'string'
966
+ : formData.pivot?.valueFieldType ||
967
+ 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
968
+ ? isDateField(formData.pivot.rowFieldType)
969
+ ? [{ label: 'date', value: 'pivot_date' }]
970
+ : [{ label: 'string', value: 'string' }]
971
+ : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
972
+ : formData.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: columns.map((elem) => ({
973
+ label: elem.field,
974
+ value: elem.field,
975
+ })), width: 200 }), _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) }), _jsx(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), _jsx("div", { children: !(
976
+ // hide when pivoted and chartType === 'table'
977
+ (formData.pivot &&
978
+ selectedPivotTable &&
979
+ selectedPivotTable.columns &&
980
+ formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
958
981
  display: 'flex',
959
982
  flexDirection: 'column',
960
983
  gap: 6,
961
- marginTop: 6,
962
- }, children: [_jsx(HeaderComponent, { label: "Date field" }), _jsxs("div", { style: {
963
- display: 'flex',
964
- flexDirection: 'row',
965
- gap: 12,
966
- }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(LabelComponent, { label: "Table" }), _jsx(SelectComponent, { value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
967
- label: elem.name,
968
- value: elem.name,
969
- })), width: 200 })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(LabelComponent, { label: "Field" }), _jsx(SelectComponent, { value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
970
- ?.find((elem) => elem.name === formData.dateField?.table)
971
- ?.columns?.map((elem) => ({
972
- label: elem.name,
973
- value: elem.name,
974
- })) || [], width: 200 })] })] }), _jsx("br", {})] })), showAccessControlOptions && (_jsxs("div", { style: {
984
+ }, children: [_jsx(HeaderComponent, { label: "Date field" }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
985
+ label: elem.name,
986
+ value: elem.name,
987
+ })), width: 200 }) }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Field", value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
988
+ ?.find((elem) => elem.name === formData.dateField?.table)
989
+ ?.columns?.map((elem) => ({
990
+ label: elem.name,
991
+ value: elem.name,
992
+ })) || [], width: 200 }) })] })] })), showAccessControlOptions && (_jsxs("div", { style: {
975
993
  display: 'flex',
976
994
  flexDirection: 'column',
977
995
  gap: 12,
978
- marginTop: 6,
979
- }, children: [_jsx(HeaderComponent, { label: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName })] }))] }), _jsxs("div", { style: {
996
+ }, children: [_jsx(HeaderComponent, { label: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template || !organizationName, theme: theme, organizationName: organizationName })] }))] }), _jsxs("div", { style: {
980
997
  display: 'flex',
981
998
  flexDirection: 'row',
982
999
  justifyContent: 'flex-end',
@@ -1060,7 +1077,7 @@ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent
1060
1077
  padding: '20px',
1061
1078
  boxSizing: 'border-box',
1062
1079
  overflow: 'scroll',
1063
- }, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("br", {}), _jsx("div", { style: {
1080
+ }, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("div", { style: {
1064
1081
  display: 'flex',
1065
1082
  flexDirection: 'row',
1066
1083
  gap: '12px',