@quillsql/react 2.11.23 → 2.11.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/cjs/Chart.d.ts +16 -0
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +34 -18
  4. package/dist/cjs/ChartBuilder.d.ts +55 -2
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +232 -212
  7. package/dist/cjs/ChartEditor.d.ts +49 -2
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +3 -3
  10. package/dist/cjs/Dashboard.d.ts +5 -1
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +42 -18
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  16. package/dist/cjs/ReportBuilder.d.ts +57 -2
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +962 -684
  19. package/dist/cjs/SQLEditor.d.ts +83 -2
  20. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  21. package/dist/cjs/SQLEditor.js +10 -2
  22. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  23. package/dist/cjs/components/Chart/BarChart.js +8 -6
  24. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  25. package/dist/cjs/components/Chart/BarList.js +0 -153
  26. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  27. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  28. package/dist/cjs/components/Chart/ChartError.js +13 -7
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  30. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  31. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  32. package/dist/cjs/components/Chart/LineChart.d.ts +6 -2
  33. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  34. package/dist/cjs/components/Chart/LineChart.js +35 -34
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  37. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  39. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  40. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  41. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  42. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  43. package/dist/cjs/components/QuillSelect.js +1 -1
  44. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  45. package/dist/cjs/components/QuillTable.js +11 -12
  46. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  47. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  48. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  53. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  55. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  56. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  58. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  59. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  61. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  62. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  64. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  65. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  67. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  69. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  70. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  71. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  73. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  74. package/dist/cjs/components/UiComponents.d.ts +34 -4
  75. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  76. package/dist/cjs/components/UiComponents.js +165 -68
  77. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  78. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  80. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  81. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  84. package/dist/cjs/internals/ReportBuilder/PivotModal.js +442 -282
  85. package/dist/cjs/utils/axisFormatter.js +3 -3
  86. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  87. package/dist/cjs/utils/getDomain.js +3 -0
  88. package/dist/cjs/utils/merge.d.ts.map +1 -1
  89. package/dist/cjs/utils/merge.js +2 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  91. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  92. package/dist/cjs/utils/pivotProcessing.js +177 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  94. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  95. package/dist/cjs/utils/queryConstructor.js +11 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  97. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  98. package/dist/cjs/utils/tableProcessing.js +84 -0
  99. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  100. package/dist/cjs/utils/valueFormatter.js +40 -8
  101. package/dist/esm/Chart.d.ts +16 -0
  102. package/dist/esm/Chart.d.ts.map +1 -1
  103. package/dist/esm/Chart.js +35 -19
  104. package/dist/esm/ChartBuilder.d.ts +55 -2
  105. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  106. package/dist/esm/ChartBuilder.js +234 -214
  107. package/dist/esm/ChartEditor.d.ts +49 -2
  108. package/dist/esm/ChartEditor.d.ts.map +1 -1
  109. package/dist/esm/ChartEditor.js +4 -4
  110. package/dist/esm/Dashboard.d.ts +5 -1
  111. package/dist/esm/Dashboard.d.ts.map +1 -1
  112. package/dist/esm/Dashboard.js +21 -20
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  114. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  115. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  116. package/dist/esm/ReportBuilder.d.ts +57 -2
  117. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  118. package/dist/esm/ReportBuilder.js +964 -687
  119. package/dist/esm/SQLEditor.d.ts +83 -2
  120. package/dist/esm/SQLEditor.d.ts.map +1 -1
  121. package/dist/esm/SQLEditor.js +11 -3
  122. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarChart.js +8 -6
  124. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  125. package/dist/esm/components/Chart/BarList.js +0 -153
  126. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  127. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  128. package/dist/esm/components/Chart/ChartError.js +13 -7
  129. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  130. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  131. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  132. package/dist/esm/components/Chart/LineChart.d.ts +6 -2
  133. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  134. package/dist/esm/components/Chart/LineChart.js +35 -34
  135. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  136. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  137. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  138. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  139. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  141. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  142. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  143. package/dist/esm/components/QuillSelect.js +1 -1
  144. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  145. package/dist/esm/components/QuillTable.js +11 -12
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  147. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  148. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  149. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  150. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  152. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  153. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  154. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  155. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  156. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  157. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  158. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  159. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  160. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  161. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  162. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  163. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  164. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  165. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  166. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  167. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  169. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  170. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  171. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  172. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  173. package/dist/esm/components/ReportBuilder/util.js +3 -0
  174. package/dist/esm/components/UiComponents.d.ts +34 -4
  175. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  176. package/dist/esm/components/UiComponents.js +155 -66
  177. package/dist/esm/hooks/useQuill.d.ts +1 -0
  178. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  180. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  181. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  182. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  183. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  184. package/dist/esm/internals/ReportBuilder/PivotModal.js +443 -284
  185. package/dist/esm/utils/axisFormatter.js +3 -3
  186. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  187. package/dist/esm/utils/getDomain.js +3 -0
  188. package/dist/esm/utils/merge.d.ts.map +1 -1
  189. package/dist/esm/utils/merge.js +2 -0
  190. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  191. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  192. package/dist/esm/utils/pivotProcessing.js +170 -0
  193. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  194. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  195. package/dist/esm/utils/queryConstructor.js +7 -0
  196. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  197. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  198. package/dist/esm/utils/tableProcessing.js +80 -0
  199. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  200. package/dist/esm/utils/valueFormatter.js +41 -9
  201. package/package.json +1 -1
  202. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  203. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -1,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,49 @@ 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
417
- ? dashboardItem.dashboardName
418
- : dashboardOptions[0]?.label);
422
+ await updateDashboardFilters(destinationDashboard ??
423
+ (dashboardItem
424
+ ? dashboardItem?.dashboardName
425
+ : dashboardOptions[0]?.label));
419
426
  setDashboardOptions(dashboardOptions);
420
- const dashboardName = dashboardItem
421
- ? dashboardItem?.dashboardName
422
- : dashboardOptions[0]?.label;
427
+ const dashboardName = destinationDashboard ??
428
+ (dashboardItem
429
+ ? dashboardItem?.dashboardName
430
+ : dashboardOptions[0]?.label);
423
431
  curFormData.dashboardName = dashboardName;
424
- setDefaultDashboardName(dashboardItem
425
- ? dashboardItem?.dashboardName
426
- : dashboardOptions[0]?.label);
427
- // setFormData({
428
- // ...formData,
429
- // dashboardName: dashboardItem
430
- // ? dashboardItem?.dashboardName
431
- // : dashboardOptions[0]?.label,
432
- // });
432
+ setDefaultDashboardName(destinationDashboard ??
433
+ (dashboardItem
434
+ ? dashboardItem?.dashboardName
435
+ : dashboardOptions[0]?.label));
436
+ const { queryEndpoint, queryHeaders, publicKey } = client;
437
+ const response = await fetch(`${queryEndpoint}`, {
438
+ method: 'POST',
439
+ headers: {
440
+ ...queryHeaders,
441
+ 'Content-Type': 'application/json',
442
+ },
443
+ body: JSON.stringify({
444
+ metadata: {
445
+ clientId: publicKey,
446
+ publicKey: publicKey,
447
+ task: 'schema',
448
+ },
449
+ }),
450
+ });
451
+ const schemaInfo = await response.json();
452
+ let schemaData = schemaInfo.data?.data;
453
+ if (schemaInfo.data?.data) {
454
+ schemaData = schemaInfo.data.data.tables;
455
+ setSchema(schemaInfo.data.data.tables);
456
+ }
457
+ else {
458
+ schemaData = schemaInfo.data.tables;
459
+ setSchema(schemaInfo.data.tables);
460
+ }
433
461
  if (!query) {
434
462
  return;
435
463
  }
436
- const result = await getReferencedTables(client, query, schema, true);
464
+ const result = await getReferencedTables(client, query, schemaData, true);
437
465
  setDateFieldOptions(result);
438
466
  if (result[0] && result[0].columns[0]) {
439
467
  setDefaultDateField({
@@ -441,7 +469,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
441
469
  field: result[0].columns[0].name,
442
470
  });
443
471
  }
444
- const allReferencedFields = await getReferencedTables(client, query, schema, false);
472
+ const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
445
473
  setAllTables(allReferencedFields.map((table) => table.name));
446
474
  setTableName(result[0]?.name);
447
475
  const dateField = {
@@ -453,6 +481,9 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
453
481
  curFormData.dateField = dateField;
454
482
  setFormData({
455
483
  ...curFormData,
484
+ dashboardName: dashboardItem
485
+ ? dashboardItem?.dashboardName
486
+ : dashboardOptions[0]?.label,
456
487
  });
457
488
  }
458
489
  getFormData();
@@ -494,6 +525,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
494
525
  });
495
526
  }
496
527
  else {
528
+ if (!rows)
529
+ return [];
497
530
  return rows.map((row) => {
498
531
  return formData.columns.reduce((formattedRow, column) => {
499
532
  // Apply the format function to each field in the row
@@ -590,16 +623,30 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
590
623
  }
591
624
  };
592
625
  const handleAddPivot = (pivot) => {
626
+ const newPivotFormData = pivotFormData(pivot);
627
+ // Only keep the old chart type if the shapes of the pivots are the same
628
+ // since the valid chart types for some pivots might have changed (eg. going
629
+ // from a 1D pivot to a 2D pivot would make bar lists not an option).
630
+ // They don't have to have the same value, just same 'truthiness'.
631
+ const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
632
+ Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
633
+ const isNewChartType = formData.chartType !== newPivotFormData.chartType;
634
+ const keepOldChartType = isNewChartType && isPivotSameShape;
593
635
  setFormData((formData) => ({
594
636
  ...formData,
595
- ...pivotFormData(pivot),
637
+ ...newPivotFormData,
638
+ ...(keepOldChartType && { chartType: formData.chartType }),
596
639
  }));
597
640
  };
598
641
  const handleDeletePivot = () => {
599
642
  if (!formData.pivot) {
600
643
  return;
601
644
  }
602
- setFormData({ ...formEmptyState, pivot: null });
645
+ setFormData({
646
+ ...formEmptyState,
647
+ dashboardName: formData.dashboardName,
648
+ pivot: null,
649
+ });
603
650
  };
604
651
  const handleAddField = (fieldName) => {
605
652
  if (fieldName === 'columns') {
@@ -760,7 +807,12 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
760
807
  setIsOpen(false);
761
808
  setIsSubmitting(false);
762
809
  if (onAddToDashboardComplete) {
763
- onAddToDashboardComplete();
810
+ onAddToDashboardComplete({
811
+ ...resp,
812
+ rows,
813
+ fieldOptions,
814
+ filtersApplied: dashboardFilters,
815
+ });
764
816
  }
765
817
  };
766
818
  // Prevent horizontal view on small screens.
@@ -787,13 +839,14 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
787
839
  display: 'flex',
788
840
  flexDirection: 'column',
789
841
  gap: '20px',
790
- height: '100%',
842
+ height: isHorizontalView || !isOpen ? '100%' : 800,
791
843
  ...(isHorizontalView && {
792
844
  flexGrow: 1,
793
- maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
845
+ maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
794
846
  }),
847
+ ...(!isHorizontalView && isOpen && { width: formWidth }),
795
848
  }, children: [((!isHorizontalView && windowWidth >= 1200) ||
796
- formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
849
+ formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
797
850
  width: '100%',
798
851
  height: formData.chartType === 'metric'
799
852
  ? 100
@@ -812,40 +865,37 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
812
865
  : formData.columns })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
813
866
  display: 'flex',
814
867
  flexDirection: 'column',
815
- height: '100%',
816
868
  gap: 20,
817
869
  ...(isHorizontalView && {
818
- minWidth: 665,
819
- maxWidth: 665,
820
- width: 665,
870
+ height: '100%',
871
+ minWidth: formWidth,
872
+ maxWidth: formWidth,
873
+ width: formWidth,
821
874
  }),
822
875
  ...(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: {
876
+ width: formWidth,
877
+ paddingTop: modalPadding,
878
+ paddingBottom: modalPadding,
879
+ }),
880
+ }, 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) => {
881
+ handleChange(e.target.value, 'dashboardName');
882
+ await updateDashboardFilters(e.target.value);
883
+ }, options: dashboardOptions.map((elem) => ({
884
+ label: elem.label,
885
+ value: elem.label,
886
+ })), 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'),
887
+ // filter out metric for all pivots
888
+ // filter out bar and pie for row and column pivot
889
+ options: getChartTypeOptions(formData), width: 200 }) })] }), _jsxs("div", { style: {
835
890
  display: 'flex',
836
891
  flexDirection: 'column',
837
- gap: 12,
838
- marginTop: 6,
892
+ gap: 6,
839
893
  }, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
840
894
  maxWidth: 200,
841
895
  // marginTop: 6,
842
896
  display: 'flex',
843
897
  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: {
898
+ }, 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
899
  pivot: formData.pivot,
850
900
  rows: selectedPivotTable?.rows,
851
901
  columns: selectedPivotTable?.columns,
@@ -856,127 +906,97 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
856
906
  setPivotColumnField(formData.pivot?.columnField);
857
907
  setPivotValueField(formData.pivot?.valueField);
858
908
  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: {
909
+ setPivotPopUpTitle('Edit pivot');
910
+ }, 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
911
  display: 'flex',
862
912
  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
913
+ }, 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
914
  ? getPivotMetricOptions(formData.pivot)
871
915
  : fieldOptions.map((elem) => ({
872
916
  label: elem.field,
873
917
  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 &&
918
+ })), 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
919
  isDateField(formData.pivot.rowFieldType)
878
920
  ? 'pivot_date'
879
921
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
880
922
  isDateField(formData.pivot.rowFieldType)
881
923
  ? [{ 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: {
924
+ : 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
925
+ ? formData.pivot.valueField || 'count'
926
+ : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
927
+ ? [
928
+ {
929
+ label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
930
+ value: formData.pivot.valueField ||
931
+ 'count',
932
+ },
933
+ ]
934
+ : fieldOptions
935
+ .filter((elem) => {
936
+ return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
937
+ })
938
+ .map((elem) => ({
939
+ label: elem.field,
940
+ value: elem.field,
941
+ })), 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
942
+ ? NUMBER_OPTIONS.find((option) => {
943
+ return (option.value === yAxisField.format);
944
+ })
945
+ ? // @ts-ignore
946
+ NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
947
+ : ''
948
+ : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
949
+ ? NUMBER_OPTIONS
950
+ : 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
951
  display: 'flex',
917
952
  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: {
953
+ }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
954
+ selectedPivotTable &&
955
+ selectedPivotTable.columns &&
956
+ formData.chartType === 'table'
957
+ ? // THIS CASE IF FOR PIVOT TABLES ONLY
958
+ 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) => ({
959
+ label: elem.label,
960
+ value: elem.label,
961
+ })), 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:
962
+ // The first index use rowField for the rest of them use value fields
963
+ formData.pivot &&
964
+ column.field === formData.pivot.rowField
965
+ ? formData.pivot &&
966
+ isDateField(formData.pivot.rowFieldType)
967
+ ? 'pivot_date'
968
+ : 'string'
969
+ : formData.pivot?.valueFieldType ||
970
+ 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
971
+ ? isDateField(formData.pivot.rowFieldType)
972
+ ? [{ label: 'date', value: 'pivot_date' }]
973
+ : [{ label: 'string', value: 'string' }]
974
+ : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
975
+ : 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) => ({
976
+ label: elem.field,
977
+ value: elem.field,
978
+ })), 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: !(
979
+ // hide when pivoted and chartType === 'table'
980
+ (formData.pivot &&
981
+ selectedPivotTable &&
982
+ selectedPivotTable.columns &&
983
+ formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
958
984
  display: 'flex',
959
985
  flexDirection: 'column',
960
986
  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: {
987
+ }, 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) => ({
988
+ label: elem.name,
989
+ value: elem.name,
990
+ })), 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
991
+ ?.find((elem) => elem.name === formData.dateField?.table)
992
+ ?.columns?.map((elem) => ({
993
+ label: elem.name,
994
+ value: elem.name,
995
+ })) || [], width: 200 }) })] })] })), showAccessControlOptions && (_jsxs("div", { style: {
975
996
  display: 'flex',
976
997
  flexDirection: 'column',
977
998
  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: {
999
+ }, 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
1000
  display: 'flex',
981
1001
  flexDirection: 'row',
982
1002
  justifyContent: 'flex-end',
@@ -1060,7 +1080,7 @@ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent
1060
1080
  padding: '20px',
1061
1081
  boxSizing: 'border-box',
1062
1082
  overflow: 'scroll',
1063
- }, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("br", {}), _jsx("div", { style: {
1083
+ }, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("div", { style: {
1064
1084
  display: 'flex',
1065
1085
  flexDirection: 'row',
1066
1086
  gap: '12px',