@quillsql/react 2.11.21 → 2.11.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +32 -16
  3. package/dist/cjs/ChartBuilder.d.ts +55 -2
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +235 -201
  6. package/dist/cjs/ChartEditor.d.ts +49 -2
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +9 -3
  9. package/dist/cjs/Dashboard.d.ts +5 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +42 -18
  12. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  15. package/dist/cjs/ReportBuilder.d.ts +59 -2
  16. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.js +979 -684
  18. package/dist/cjs/SQLEditor.d.ts +83 -2
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +10 -2
  21. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  22. package/dist/cjs/components/Chart/BarChart.js +8 -6
  23. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  24. package/dist/cjs/components/Chart/BarList.js +0 -153
  25. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  26. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  27. package/dist/cjs/components/Chart/ChartError.js +13 -7
  28. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  31. package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
  32. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  33. package/dist/cjs/components/Chart/LineChart.js +32 -31
  34. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  37. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  40. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  42. package/dist/cjs/components/QuillSelect.js +1 -1
  43. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  44. package/dist/cjs/components/QuillTable.js +11 -12
  45. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  46. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  48. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  53. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  55. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  56. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  58. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  59. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  62. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  64. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  65. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  67. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  69. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  70. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  71. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  73. package/dist/cjs/components/UiComponents.d.ts +34 -4
  74. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  75. package/dist/cjs/components/UiComponents.js +165 -68
  76. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  77. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  78. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  80. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  81. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
  84. package/dist/cjs/utils/axisFormatter.js +3 -3
  85. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  86. package/dist/cjs/utils/getDomain.js +3 -0
  87. package/dist/cjs/utils/merge.d.ts.map +1 -1
  88. package/dist/cjs/utils/merge.js +2 -0
  89. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  91. package/dist/cjs/utils/pivotProcessing.js +177 -0
  92. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  94. package/dist/cjs/utils/queryConstructor.js +11 -0
  95. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  97. package/dist/cjs/utils/tableProcessing.js +84 -0
  98. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  99. package/dist/cjs/utils/valueFormatter.js +40 -8
  100. package/dist/esm/Chart.d.ts.map +1 -1
  101. package/dist/esm/Chart.js +33 -17
  102. package/dist/esm/ChartBuilder.d.ts +55 -2
  103. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  104. package/dist/esm/ChartBuilder.js +237 -203
  105. package/dist/esm/ChartEditor.d.ts +49 -2
  106. package/dist/esm/ChartEditor.d.ts.map +1 -1
  107. package/dist/esm/ChartEditor.js +10 -4
  108. package/dist/esm/Dashboard.d.ts +5 -1
  109. package/dist/esm/Dashboard.d.ts.map +1 -1
  110. package/dist/esm/Dashboard.js +21 -20
  111. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  112. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  114. package/dist/esm/ReportBuilder.d.ts +59 -2
  115. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  116. package/dist/esm/ReportBuilder.js +981 -687
  117. package/dist/esm/SQLEditor.d.ts +83 -2
  118. package/dist/esm/SQLEditor.d.ts.map +1 -1
  119. package/dist/esm/SQLEditor.js +11 -3
  120. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  121. package/dist/esm/components/Chart/BarChart.js +8 -6
  122. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarList.js +0 -153
  124. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  125. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  126. package/dist/esm/components/Chart/ChartError.js +13 -7
  127. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  128. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  129. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  130. package/dist/esm/components/Chart/LineChart.d.ts +1 -1
  131. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  132. package/dist/esm/components/Chart/LineChart.js +32 -31
  133. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  134. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  135. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  136. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  137. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  138. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  139. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  141. package/dist/esm/components/QuillSelect.js +1 -1
  142. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  143. package/dist/esm/components/QuillTable.js +11 -12
  144. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  145. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  147. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  148. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  149. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  150. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  152. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  153. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  154. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  155. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  156. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  157. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  158. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  159. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  160. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  161. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  162. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  163. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  164. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  165. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  166. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  167. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  169. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  170. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  171. package/dist/esm/components/ReportBuilder/util.js +3 -0
  172. package/dist/esm/components/UiComponents.d.ts +34 -4
  173. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  174. package/dist/esm/components/UiComponents.js +155 -66
  175. package/dist/esm/hooks/useQuill.d.ts +1 -0
  176. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  177. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  178. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  180. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  181. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  182. package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
  183. package/dist/esm/utils/axisFormatter.js +3 -3
  184. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  185. package/dist/esm/utils/getDomain.js +3 -0
  186. package/dist/esm/utils/merge.d.ts.map +1 -1
  187. package/dist/esm/utils/merge.js +2 -0
  188. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  189. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  190. package/dist/esm/utils/pivotProcessing.js +170 -0
  191. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  192. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  193. package/dist/esm/utils/queryConstructor.js +7 -0
  194. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  195. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  196. package/dist/esm/utils/tableProcessing.js +80 -0
  197. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  198. package/dist/esm/utils/valueFormatter.js +41 -9
  199. package/package.json +1 -1
  200. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  201. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -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';
@@ -171,7 +171,13 @@ export function ChartBuilderWithModal(props) {
171
171
  const Modal = props.ModalComponent ?? MemoizedModal;
172
172
  useEffect(() => {
173
173
  function handleResize() {
174
- setModalWidth(window.innerWidth - 80);
174
+ const screenSize = window.innerWidth;
175
+ if (screenSize >= 1200) {
176
+ setModalWidth(window.innerWidth - 80);
177
+ }
178
+ else {
179
+ setModalWidth(undefined); // use dynamic width of contents
180
+ }
175
181
  setModalHeight(window.innerHeight - 80);
176
182
  }
177
183
  handleResize();
@@ -180,7 +186,7 @@ export function ChartBuilderWithModal(props) {
180
186
  window.removeEventListener('resize', handleResize);
181
187
  };
182
188
  }, []);
183
- 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',
184
190
  // For isHorizontalView, use full viewport size minus 80px for padding,
185
191
  // otherwise use the default layout method of the modal (contents).
186
192
  width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
@@ -209,14 +215,17 @@ export function ChartBuilderWithModal(props) {
209
215
  * ### Chart Builder API
210
216
  * @see https://docs.quillsql.com/components/chart-builder
211
217
  */
212
- 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, }) {
213
219
  const dateRange = dr || [null, null, null];
214
220
  const [client] = useContext(ClientContext);
215
221
  const [theme] = useContext(ThemeContext);
216
222
  const [schema, setSchema] = useContext(SchemaContext);
217
223
  const [windowWidth, setWindowWidth] = useState(1200);
218
224
  const [isSubmitting, setIsSubmitting] = useState(false);
219
- 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);
220
229
  const { dispatch } = useContext(DashboardContext);
221
230
  const fields = fieldsProp?.map((field) => ({
222
231
  field: field.name,
@@ -226,9 +235,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
226
235
  })) || [];
227
236
  const parentRef = useRef(null);
228
237
  const deleteRef = useRef(null);
229
- const pivotCardContainer = useRef(null);
230
238
  const modalPadding = 20;
231
- const deleteButtonMargin = -13;
239
+ const deleteButtonMargin = -12;
232
240
  useEffect(() => {
233
241
  const handleResize = () => setWindowWidth(window.innerWidth);
234
242
  handleResize();
@@ -238,56 +246,51 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
238
246
  };
239
247
  }, []);
240
248
  useEffect(() => {
241
- const calculateWidth = () => pivotCardContainer.current?.getBoundingClientRect().width ?? 'auto';
242
249
  const handleResize = () => {
243
- if (pivotCardContainer.current) {
244
- 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);
245
265
  }
246
266
  };
247
267
  handleResize();
248
- window.addEventListener('resize', handleResize);
249
- return () => {
250
- window.removeEventListener('resize', handleResize);
251
- };
252
- }, [pivotCardContainer]);
253
- // get schema
268
+ }, [isOpen]);
254
269
  useEffect(() => {
255
- let isSubscribed = true;
256
- async function getSchema() {
257
- if (!schema || !schema.length) {
258
- const { queryEndpoint, queryHeaders, publicKey } = client;
259
- const response = await fetch(`${queryEndpoint}`, {
260
- method: 'POST',
261
- headers: {
262
- ...queryHeaders,
263
- 'Content-Type': 'application/json',
264
- },
265
- body: JSON.stringify({
266
- metadata: {
267
- clientId: publicKey,
268
- publicKey: publicKey,
269
- task: 'schema',
270
- },
271
- }),
272
- });
273
- const results = await response.json();
274
- if (isSubscribed) {
275
- if (results.data?.data) {
276
- setSchema(results.data.data.tables);
277
- }
278
- else {
279
- setSchema(results.data.tables);
280
- }
281
- }
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);
282
286
  }
283
- }
284
- if (isSubscribed) {
285
- getSchema();
286
- }
287
+ };
288
+ handleResize();
289
+ window.addEventListener('resize', handleResize);
287
290
  return () => {
288
- isSubscribed = false;
291
+ window.removeEventListener('resize', handleResize);
289
292
  };
290
- }, [schema]);
293
+ }, []);
291
294
  // get dashboards
292
295
  const [dashboardOptions, setDashboardOptions] = useState([]);
293
296
  const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || dashboardItem?.dashboardName || '');
@@ -303,17 +306,18 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
303
306
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
304
307
  const [tableName, setTableName] = useState(undefined);
305
308
  const selectedTable = schema?.find((t) => t.displayName === tableName);
306
- const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add Pivot');
309
+ const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
307
310
  const [createdPivots, setCreatedPivots] = useState(pivot ? [pivot] : dashboardItem?.pivot ? [dashboardItem.pivot] : cp);
308
311
  const [recommendedPivots, setRecommendedPivots] = useState(rp);
309
- const [pivotRowField, setPivotRowField] = useState(undefined);
310
- const [pivotColumnField, setPivotColumnField] = useState(undefined);
311
- const [pivotValueField, setPivotValueField] = useState(undefined);
312
- 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);
313
316
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
314
317
  const [fieldOptions, setFieldOptions] = useState(fields);
315
318
  const [dateFieldOptions, setDateFieldOptions] = useState([]);
316
319
  const [allTables, setAllTables] = useState([]);
320
+ const [uniqueValues, setUniqueValues] = useState(undefined);
317
321
  const [defaultDateField, setDefaultDateField] = useState({
318
322
  table: dateFieldOptions[0]?.name || '',
319
323
  field: dateFieldOptions[0]?.columns[0]?.name || '',
@@ -341,7 +345,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
341
345
  template: false,
342
346
  };
343
347
  const updateDashboardFilters = async (dashboardName) => {
344
- const { queryEndpoint, queryHeaders, publicKey } = client;
348
+ const { queryEndpoint, queryHeaders, publicKey, customerId } = client;
345
349
  if (queryEndpoint) {
346
350
  const response = await fetch(queryEndpoint, {
347
351
  method: 'POST',
@@ -351,7 +355,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
351
355
  },
352
356
  body: JSON.stringify({
353
357
  metadata: {
354
- orgId: '*',
358
+ orgId: customerId || '*',
355
359
  task: 'config',
356
360
  name: dashboardName,
357
361
  clientId: publicKey,
@@ -368,10 +372,13 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
368
372
  };
369
373
  const pivotFormData = (pivot) => {
370
374
  const yAxisField = pivot.columnField || pivot.valueField;
375
+ const yAxisLabel = dashboardItem?.yAxisFields?.length > 0
376
+ ? dashboardItem.yAxisFields[0].label
377
+ : pivot.valueField;
371
378
  // date labels for pivots should be treated like strings since they are
372
379
  // formatted in generatePivotTable
373
380
  const yAxisIsDate = pivot.columnField
374
- ? isDateField(pivot.columnFieldType)
381
+ ? isDateField(pivot.columnFieldType || '')
375
382
  : false;
376
383
  const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
377
384
  return {
@@ -382,21 +389,28 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
382
389
  ? 'string'
383
390
  : columns.find((col) => col.field === pivot.rowField)?.format ||
384
391
  'whole_number',
385
- xAxisLabel: '',
392
+ xAxisLabel: dashboardItem?.xAxisLabel || pivot.rowField,
386
393
  yAxisFields: [
387
394
  {
388
395
  field: yAxisField,
389
- label: '',
396
+ label: yAxisLabel,
390
397
  format: yAxisIsDate
391
398
  ? 'string'
392
- : columns.find((col) => col.field === yAxisField)?.format ||
393
- 'whole_number',
399
+ : dashboardItem?.yAxisFields?.length > 0
400
+ ? dashboardItem?.yAxisFields[0].format
401
+ : columns.find((col) => col.field === pivot.valueField)?.format ||
402
+ 'whole_number',
394
403
  },
395
404
  ],
396
405
  };
397
406
  };
398
407
  const [formData, setFormData] = useState(pivot
399
- ? { ...formEmptyState, ...dashboardItem, ...pivotFormData(pivot) }
408
+ ? {
409
+ ...formEmptyState,
410
+ ...dashboardItem,
411
+ ...pivotFormData(pivot),
412
+ ...(destinationDashboard && { dashboardName: destinationDashboard }),
413
+ }
400
414
  : dashboardItem || formEmptyState);
401
415
  useEffect(() => {
402
416
  async function getFormData() {
@@ -405,27 +419,46 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
405
419
  const dashboardOptions = resp.dashboardNames
406
420
  .filter((elem) => elem !== null)
407
421
  .map((key) => ({ label: key, value: key }));
408
- await updateDashboardFilters(dashboardItem
422
+ await updateDashboardFilters(destinationDashboard ?? dashboardItem
409
423
  ? dashboardItem.dashboardName
410
424
  : dashboardOptions[0]?.label);
411
425
  setDashboardOptions(dashboardOptions);
412
- const dashboardName = dashboardItem
426
+ const dashboardName = destinationDashboard ?? dashboardItem
413
427
  ? dashboardItem?.dashboardName
414
428
  : dashboardOptions[0]?.label;
415
429
  curFormData.dashboardName = dashboardName;
416
- setDefaultDashboardName(dashboardItem
430
+ setDefaultDashboardName(destinationDashboard ?? dashboardItem
417
431
  ? dashboardItem?.dashboardName
418
432
  : dashboardOptions[0]?.label);
419
- // setFormData({
420
- // ...formData,
421
- // dashboardName: dashboardItem
422
- // ? dashboardItem?.dashboardName
423
- // : dashboardOptions[0]?.label,
424
- // });
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
+ }
425
458
  if (!query) {
426
459
  return;
427
460
  }
428
- const result = await getReferencedTables(client, query, schema, true);
461
+ const result = await getReferencedTables(client, query, schemaData, true);
429
462
  setDateFieldOptions(result);
430
463
  if (result[0] && result[0].columns[0]) {
431
464
  setDefaultDateField({
@@ -433,7 +466,7 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
433
466
  field: result[0].columns[0].name,
434
467
  });
435
468
  }
436
- const allReferencedFields = await getReferencedTables(client, query, schema, false);
469
+ const allReferencedFields = await getReferencedTables(client, query, schemaData, false);
437
470
  setAllTables(allReferencedFields.map((table) => table.name));
438
471
  setTableName(result[0]?.name);
439
472
  const dateField = {
@@ -445,6 +478,9 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
445
478
  curFormData.dateField = dateField;
446
479
  setFormData({
447
480
  ...curFormData,
481
+ dashboardName: dashboardItem
482
+ ? dashboardItem?.dashboardName
483
+ : dashboardOptions[0]?.label,
448
484
  });
449
485
  }
450
486
  getFormData();
@@ -486,6 +522,8 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
486
522
  });
487
523
  }
488
524
  else {
525
+ if (!rows)
526
+ return [];
489
527
  return rows.map((row) => {
490
528
  return formData.columns.reduce((formattedRow, column) => {
491
529
  // Apply the format function to each field in the row
@@ -582,16 +620,30 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
582
620
  }
583
621
  };
584
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;
585
632
  setFormData((formData) => ({
586
633
  ...formData,
587
- ...pivotFormData(pivot),
634
+ ...newPivotFormData,
635
+ ...(keepOldChartType && { chartType: formData.chartType }),
588
636
  }));
589
637
  };
590
638
  const handleDeletePivot = () => {
591
639
  if (!formData.pivot) {
592
640
  return;
593
641
  }
594
- setFormData({ ...formEmptyState, pivot: null });
642
+ setFormData({
643
+ ...formEmptyState,
644
+ dashboardName: formData.dashboardName,
645
+ pivot: null,
646
+ });
595
647
  };
596
648
  const handleAddField = (fieldName) => {
597
649
  if (fieldName === 'columns') {
@@ -752,7 +804,12 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
752
804
  setIsOpen(false);
753
805
  setIsSubmitting(false);
754
806
  if (onAddToDashboardComplete) {
755
- onAddToDashboardComplete();
807
+ onAddToDashboardComplete({
808
+ ...resp,
809
+ rows,
810
+ fieldOptions,
811
+ filtersApplied: dashboardFilters,
812
+ });
756
813
  }
757
814
  };
758
815
  // Prevent horizontal view on small screens.
@@ -779,56 +836,63 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
779
836
  display: 'flex',
780
837
  flexDirection: 'column',
781
838
  gap: '20px',
839
+ height: isHorizontalView || !isOpen ? '100%' : 800,
782
840
  ...(isHorizontalView && {
783
841
  flexGrow: 1,
784
- 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
785
843
  }),
786
- }, children: [(!isHorizontalView || formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
844
+ ...(!isHorizontalView && isOpen && { width: formWidth }),
845
+ }, children: [((!isHorizontalView && windowWidth >= 1200) ||
846
+ formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
787
847
  width: '100%',
788
848
  height: formData.chartType === 'metric'
789
849
  ? 100
790
- : isHorizontalView
850
+ : isHorizontalView || !isOpen
791
851
  ? 'calc(50% - 10px)'
792
852
  : 400,
793
853
  ...(isHorizontalView && { flexGrow: 1 }),
794
854
  } })),
795
855
  // Make sure to display non-pivoted table when using pivot chart
796
- isHorizontalView && (_jsx("div", { style: {
856
+ (isHorizontalView || windowWidth < 1200) && (_jsx("div", { style: {
797
857
  width: '100%',
798
- height: 'calc(50% - 10px)',
858
+ height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
799
859
  flexGrow: 1,
800
860
  }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
801
861
  ? selectedPivotTable.columns
802
862
  : formData.columns })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
803
863
  display: 'flex',
804
864
  flexDirection: 'column',
805
- height: '100%',
865
+ gap: 20,
806
866
  ...(isHorizontalView && {
807
- minWidth: 665,
808
- maxWidth: 665,
809
- width: 665,
810
- gap: 20,
867
+ height: '100%',
868
+ minWidth: formWidth,
869
+ maxWidth: formWidth,
870
+ width: formWidth,
811
871
  }),
812
- }, 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) => {
813
- handleChange(e.target.value, 'dashboardName');
814
- await updateDashboardFilters(e.target.value);
815
- }, options: dashboardOptions.map((elem) => ({
816
- label: elem.label,
817
- value: elem.label,
818
- })), 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'),
819
- // filter out metric for all pivots
820
- // filter out bar and pie for row and column pivot
821
- options: getChartTypeOptions(formData), width: 200 })] })] }), _jsx("br", {}), _jsxs("div", { style: {
872
+ ...(windowWidth < 1200 && {
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: {
822
887
  display: 'flex',
823
888
  flexDirection: 'column',
824
- gap: 12,
825
- marginTop: 6,
889
+ gap: 6,
826
890
  }, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
827
891
  maxWidth: 200,
828
892
  // marginTop: 6,
829
893
  display: 'flex',
830
894
  flexDirection: 'column',
831
- }, 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: { width: !isHorizontalView ? divWidth : 'auto' }, 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: {
832
896
  pivot: formData.pivot,
833
897
  rows: selectedPivotTable?.rows,
834
898
  columns: selectedPivotTable?.columns,
@@ -839,127 +903,97 @@ export default function ChartBuilder({ TextInputComponent = QuillTextInput, Sele
839
903
  setPivotColumnField(formData.pivot?.columnField);
840
904
  setPivotValueField(formData.pivot?.valueField);
841
905
  setPivotAggregation(formData.pivot?.aggregationType);
842
- setPivotPopUpTitle('Edit Pivot');
843
- }, 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: {
844
908
  display: 'flex',
845
909
  flexDirection: 'column',
846
- gap: 6,
847
- marginTop: 6,
848
- }, 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: {
849
- display: 'flex',
850
- flexDirection: 'row',
851
- gap: 12,
852
- }, 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
853
911
  ? getPivotMetricOptions(formData.pivot)
854
912
  : fieldOptions.map((elem) => ({
855
913
  label: elem.field,
856
914
  value: elem.field,
857
- })), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.pivot
858
- ? formData.pivot.rowField
859
- : 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 &&
860
916
  isDateField(formData.pivot.rowFieldType)
861
917
  ? 'pivot_date'
862
918
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
863
919
  isDateField(formData.pivot.rowFieldType)
864
920
  ? [{ value: 'pivot_date', label: 'date' }]
865
- : 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: {
866
- display: 'flex',
867
- flexDirection: 'column',
868
- gap: 10,
869
- }, children: formData.yAxisFields.map((yAxisField, index) => (_jsxs("div", { style: {
870
- display: 'flex',
871
- flexDirection: 'row',
872
- gap: 12,
873
- }, children: [_jsx(SelectComponent, { value: formData.pivot
874
- ? formData.pivot.valueField
875
- : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
876
- ? [
877
- {
878
- label: `Pivot Column (${formData.pivot.valueField})`,
879
- value: formData.pivot.valueField,
880
- },
881
- ]
882
- : fieldOptions
883
- .filter((elem) => {
884
- return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
885
- })
886
- .map((elem) => ({
887
- label: elem.field,
888
- value: elem.field,
889
- })), 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
890
- ? NUMBER_OPTIONS.find((option) => {
891
- return (option.value === yAxisField.format);
892
- })
893
- ? // @ts-ignore
894
- NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
895
- : 'whole_number'
896
- : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
897
- ? NUMBER_OPTIONS
898
- : 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", {})] })), isHorizontalView && (_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: {
899
948
  display: 'flex',
900
949
  flexDirection: 'column',
901
- gap: 6,
902
- marginTop: 6,
903
- }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(LabelComponent, { label: "Columns" })] }), _jsx("div", { style: {
904
- display: 'flex',
905
- flexDirection: 'column',
906
- gap: 10,
907
- }, children: formData.pivot &&
908
- selectedPivotTable &&
909
- selectedPivotTable.columns &&
910
- formData.chartType === 'table'
911
- ? // THIS CASE IF FOR PIVOT TABLES ONLY
912
- selectedPivotTable.columns.map((column, index) => (_jsxs("div", { style: {
913
- display: 'flex',
914
- flexDirection: 'row',
915
- gap: 12,
916
- }, children: [_jsx(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
917
- label: elem.label,
918
- value: elem.label,
919
- })), 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:
920
- // The first index use rowField for the rest of them use value fields
921
- formData.pivot &&
922
- column.field === formData.pivot.rowField
923
- ? formData.pivot &&
924
- isDateField(formData.pivot.rowFieldType)
925
- ? 'pivot_date'
926
- : 'string'
927
- : formData.pivot?.valueFieldType ||
928
- 'whole_number', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
929
- ? isDateField(formData.pivot.rowFieldType)
930
- ? [{ label: 'date', value: 'pivot_date' }]
931
- : [{ label: 'string', value: 'string' }]
932
- : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
933
- : formData.columns.map((column, index) => (_jsxs("div", { style: {
934
- display: 'flex',
935
- flexDirection: 'row',
936
- gap: 12,
937
- }, children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: fields.map((elem) => ({
938
- label: elem.field,
939
- value: elem.field,
940
- })), 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: {
941
981
  display: 'flex',
942
982
  flexDirection: 'column',
943
983
  gap: 6,
944
- marginTop: 6,
945
- }, children: [_jsx(HeaderComponent, { label: "Date field" }), _jsxs("div", { style: {
946
- display: 'flex',
947
- flexDirection: 'row',
948
- gap: 12,
949
- }, 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) => ({
950
- label: elem.name,
951
- value: elem.name,
952
- })), 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
953
- ?.find((elem) => elem.name === formData.dateField?.table)
954
- ?.columns?.map((elem) => ({
955
- label: elem.name,
956
- value: elem.name,
957
- })) || [], 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: {
958
993
  display: 'flex',
959
994
  flexDirection: 'column',
960
995
  gap: 12,
961
- marginTop: 6,
962
- }, 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: {
963
997
  display: 'flex',
964
998
  flexDirection: 'row',
965
999
  justifyContent: 'flex-end',
@@ -1043,7 +1077,7 @@ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent
1043
1077
  padding: '20px',
1044
1078
  boxSizing: 'border-box',
1045
1079
  overflow: 'scroll',
1046
- }, 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: {
1047
1081
  display: 'flex',
1048
1082
  flexDirection: 'row',
1049
1083
  gap: '12px',