@quillsql/react 2.11.8 → 2.11.12

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 (147) hide show
  1. package/dist/cjs/BarList.d.ts +2 -1
  2. package/dist/cjs/BarList.d.ts.map +1 -1
  3. package/dist/cjs/BarList.js +9 -3
  4. package/dist/cjs/Chart.d.ts +11 -5
  5. package/dist/cjs/Chart.d.ts.map +1 -1
  6. package/dist/cjs/Chart.js +57 -20
  7. package/dist/cjs/ChartBuilder.d.ts +16 -1
  8. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  9. package/dist/cjs/ChartBuilder.js +423 -281
  10. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  11. package/dist/cjs/ChartEditor.js +1 -0
  12. package/dist/cjs/Dashboard.d.ts +2 -1
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +5 -19
  15. package/dist/cjs/PieChart.d.ts.map +1 -1
  16. package/dist/cjs/PieChart.js +2 -1
  17. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  18. package/dist/cjs/QuillProvider.js +15 -1
  19. package/dist/cjs/ReportBuilder.d.ts +4 -3
  20. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  21. package/dist/cjs/ReportBuilder.js +76 -45
  22. package/dist/cjs/SQLEditor.d.ts +2 -1
  23. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  24. package/dist/cjs/SQLEditor.js +60 -90
  25. package/dist/cjs/components/Chart/BarChart.d.ts +2 -1
  26. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  27. package/dist/cjs/components/Chart/BarChart.js +10 -3
  28. package/dist/cjs/components/Chart/LineChart.d.ts +3 -4
  29. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/LineChart.js +32 -15
  31. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  32. package/dist/cjs/components/Dashboard/ChartComponent.js +0 -3
  33. package/dist/cjs/components/Dashboard/DashboardSection.js +4 -4
  34. package/dist/cjs/components/Dashboard/DashboardSectionContainer.js +1 -1
  35. package/dist/cjs/components/Dashboard/DataLoader.d.ts +8 -1
  36. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  37. package/dist/cjs/components/Dashboard/DataLoader.js +12 -3
  38. package/dist/cjs/components/Dashboard/MetricComponent.d.ts +12 -1
  39. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  40. package/dist/cjs/components/Dashboard/MetricComponent.js +105 -9
  41. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
  42. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  43. package/dist/cjs/components/Dashboard/TableComponent.js +78 -3
  44. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  45. package/dist/cjs/components/QuillTable.js +3 -1
  46. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  47. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -4
  48. package/dist/cjs/components/ReportBuilder/ast.d.ts +4 -0
  49. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  50. package/dist/cjs/components/ReportBuilder/ast.js +10 -1
  51. package/dist/cjs/components/ReportBuilder/convert.d.ts +4 -1
  52. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  53. package/dist/cjs/components/ReportBuilder/convert.js +45 -13
  54. package/dist/cjs/components/ReportBuilder/pivot.d.ts +3 -0
  55. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  56. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  57. package/dist/cjs/components/ReportBuilder/ui.js +3 -2
  58. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -0
  59. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  60. package/dist/cjs/components/ReportBuilder/util.js +48 -1
  61. package/dist/cjs/components/UiComponents.d.ts +3 -1
  62. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  63. package/dist/cjs/components/UiComponents.js +4 -4
  64. package/dist/cjs/hooks/useQuill.js +1 -1
  65. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  66. package/dist/cjs/internals/ReportBuilder/PivotModal.js +65 -62
  67. package/dist/cjs/utils/axisFormatter.js +74 -30
  68. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  69. package/dist/cjs/utils/dataFetcher.js +10 -0
  70. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  71. package/dist/cjs/utils/getDomain.js +22 -4
  72. package/dist/cjs/utils/valueFormatter.d.ts +2 -1
  73. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  74. package/dist/esm/BarList.d.ts +2 -1
  75. package/dist/esm/BarList.d.ts.map +1 -1
  76. package/dist/esm/BarList.js +9 -3
  77. package/dist/esm/Chart.d.ts +11 -5
  78. package/dist/esm/Chart.d.ts.map +1 -1
  79. package/dist/esm/Chart.js +57 -20
  80. package/dist/esm/ChartBuilder.d.ts +16 -1
  81. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  82. package/dist/esm/ChartBuilder.js +421 -280
  83. package/dist/esm/ChartEditor.d.ts.map +1 -1
  84. package/dist/esm/ChartEditor.js +1 -0
  85. package/dist/esm/Dashboard.d.ts +2 -1
  86. package/dist/esm/Dashboard.d.ts.map +1 -1
  87. package/dist/esm/Dashboard.js +5 -19
  88. package/dist/esm/PieChart.d.ts.map +1 -1
  89. package/dist/esm/PieChart.js +2 -1
  90. package/dist/esm/QuillProvider.d.ts.map +1 -1
  91. package/dist/esm/QuillProvider.js +16 -2
  92. package/dist/esm/ReportBuilder.d.ts +4 -3
  93. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  94. package/dist/esm/ReportBuilder.js +80 -49
  95. package/dist/esm/SQLEditor.d.ts +2 -1
  96. package/dist/esm/SQLEditor.d.ts.map +1 -1
  97. package/dist/esm/SQLEditor.js +61 -91
  98. package/dist/esm/components/Chart/BarChart.d.ts +2 -1
  99. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  100. package/dist/esm/components/Chart/BarChart.js +10 -3
  101. package/dist/esm/components/Chart/LineChart.d.ts +3 -4
  102. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  103. package/dist/esm/components/Chart/LineChart.js +32 -15
  104. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  105. package/dist/esm/components/Dashboard/ChartComponent.js +0 -3
  106. package/dist/esm/components/Dashboard/DashboardSection.js +4 -4
  107. package/dist/esm/components/Dashboard/DashboardSectionContainer.js +1 -1
  108. package/dist/esm/components/Dashboard/DataLoader.d.ts +8 -1
  109. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  110. package/dist/esm/components/Dashboard/DataLoader.js +13 -4
  111. package/dist/esm/components/Dashboard/MetricComponent.d.ts +12 -1
  112. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  113. package/dist/esm/components/Dashboard/MetricComponent.js +101 -8
  114. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
  115. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  116. package/dist/esm/components/Dashboard/TableComponent.js +74 -2
  117. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  118. package/dist/esm/components/QuillTable.js +3 -1
  119. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  120. package/dist/esm/components/ReportBuilder/AddSortPopover.js +6 -5
  121. package/dist/esm/components/ReportBuilder/ast.d.ts +4 -0
  122. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  123. package/dist/esm/components/ReportBuilder/ast.js +8 -0
  124. package/dist/esm/components/ReportBuilder/convert.d.ts +4 -1
  125. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  126. package/dist/esm/components/ReportBuilder/convert.js +45 -13
  127. package/dist/esm/components/ReportBuilder/pivot.d.ts +3 -0
  128. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  129. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  130. package/dist/esm/components/ReportBuilder/ui.js +3 -2
  131. package/dist/esm/components/ReportBuilder/util.d.ts +1 -0
  132. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  133. package/dist/esm/components/ReportBuilder/util.js +46 -0
  134. package/dist/esm/components/UiComponents.d.ts +3 -1
  135. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  136. package/dist/esm/components/UiComponents.js +4 -4
  137. package/dist/esm/hooks/useQuill.js +1 -1
  138. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  139. package/dist/esm/internals/ReportBuilder/PivotModal.js +65 -62
  140. package/dist/esm/utils/axisFormatter.js +74 -30
  141. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  142. package/dist/esm/utils/dataFetcher.js +10 -0
  143. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  144. package/dist/esm/utils/getDomain.js +22 -4
  145. package/dist/esm/utils/valueFormatter.d.ts +2 -1
  146. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  147. package/package.json +1 -1
@@ -26,7 +26,39 @@ const CHART_TO_LABELS = {
26
26
  bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
27
27
  pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
28
28
  };
29
- function getTablesHelper(ast, allTables) {
29
+ function getPivotMetricOptions(pivot) {
30
+ if (!pivot.rowField) {
31
+ return [
32
+ {
33
+ label: `Pivot Value (${pivot.valueField})`,
34
+ value: pivot.valueField,
35
+ },
36
+ ];
37
+ }
38
+ else {
39
+ return [
40
+ {
41
+ label: `Pivot Row (${pivot.rowField})`,
42
+ value: pivot.rowField,
43
+ },
44
+ ];
45
+ }
46
+ }
47
+ function getChartTypeOptions(formData) {
48
+ if (formData.pivot && !formData.pivot.rowField) {
49
+ return CHART_TYPES.filter((elem) => elem === 'metric' || elem === 'table').map((elem) => ({
50
+ label: elem,
51
+ value: elem,
52
+ }));
53
+ }
54
+ else {
55
+ return CHART_TYPES.filter((elem) => !((formData.pivot && elem === 'metric') ||
56
+ (formData.pivot &&
57
+ formData.pivot.columnField &&
58
+ (elem === 'bar' || elem === 'pie')))).map((elem) => ({ label: elem, value: elem }));
59
+ }
60
+ }
61
+ function getTablesHelper(ast, allTables, filterForDate = true) {
30
62
  const tables = [];
31
63
  const withAliases = [];
32
64
  if (ast.with && ast.with.length) {
@@ -59,14 +91,16 @@ function getTablesHelper(ast, allTables) {
59
91
  .map((table) => {
60
92
  return {
61
93
  name: table.displayName,
62
- columns: table.columns.filter((column) => POSTGRES_DATE_TYPES.includes(column.fieldType)),
94
+ columns: table.columns.filter((column) => filterForDate
95
+ ? POSTGRES_DATE_TYPES.includes(column.fieldType)
96
+ : column.fieldType),
63
97
  };
64
98
  })
65
99
  .filter((table) => table.columns.length > 0);
66
100
  }
67
- async function getReferencedTables(client, sqlQuery, dbTables) {
101
+ async function getReferencedTables(client, sqlQuery, dbTables, filterForDate = true) {
68
102
  const resp = await getDataFromCloud(client, `astify`, { query: sqlQuery });
69
- return getTablesHelper(resp.ast.length ? resp.ast[0] : resp.ast, dbTables);
103
+ return getTablesHelper(resp.ast.length ? resp.ast[0] : resp.ast, dbTables, filterForDate);
70
104
  }
71
105
  export const numberFormatOptions = [
72
106
  'whole_number',
@@ -113,12 +147,13 @@ export function ChartBuilderWithModal(props) {
113
147
  }
114
148
  : {}, theme: theme, children: _jsx(ChartBuilder, { ...props }) }));
115
149
  }
116
- export default function ChartBuilder({ TextInput = QuillTextInput, Select = QuillSelectComponent, Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, Header = MemoizedHeader, Label = MemoizedLabel, DeleteButton = MemoizedDeleteButton, Text = MemoizedText, Popover = MemoizedPopover, isOpen, isEditMode = false, horizontalView = false, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, formHeaderStyle, formLabelStyle, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, fields: fieldsProp, dashboardItem = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, }) {
150
+ export default function ChartBuilder({ TextInput = QuillTextInput, Select = QuillSelectComponent, Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, Header = MemoizedHeader, Label = MemoizedLabel, DeleteButton = MemoizedDeleteButton, Text = MemoizedText, Popover = MemoizedPopover, isOpen, isEditMode = false, horizontalView = false, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, formHeaderStyle, formLabelStyle, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, fields: fieldsProp, dashboardItem = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, }) {
117
151
  const dateRange = dr || [null, null, null];
118
152
  const [client] = useContext(ClientContext);
119
153
  const [theme] = useContext(ThemeContext);
120
154
  const [schema, setSchema] = useContext(SchemaContext);
121
155
  const [isSubmitting, setIsSubmitting] = useState(false);
156
+ const [divWidth, setDivWidth] = useState(0);
122
157
  const { dispatch } = useContext(DashboardContext);
123
158
  const fields = fieldsProp?.map((field) => ({
124
159
  field: field.name,
@@ -130,6 +165,31 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
130
165
  const deleteRef = useRef(null);
131
166
  const modalPadding = 20;
132
167
  const deleteButtonMargin = -13;
168
+ useEffect(() => {
169
+ const calculateWidth = () => {
170
+ return (
171
+ // @ts-ignore
172
+ parentRef.current.offsetWidth -
173
+ (deleteRef?.current
174
+ ? deleteRef?.current.offsetWidth - deleteButtonMargin
175
+ : 0));
176
+ };
177
+ // Measure the width of the div and update state
178
+ if (parentRef.current) {
179
+ setDivWidth(calculateWidth());
180
+ }
181
+ // Optional: Handle window resize
182
+ const handleResize = () => {
183
+ if (parentRef.current) {
184
+ setDivWidth(calculateWidth());
185
+ }
186
+ };
187
+ window.addEventListener('resize', handleResize);
188
+ // Cleanup listener
189
+ return () => {
190
+ window.removeEventListener('resize', handleResize);
191
+ };
192
+ }, []);
133
193
  // get schema
134
194
  useEffect(() => {
135
195
  let isSubscribed = true;
@@ -170,30 +230,16 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
170
230
  }, [schema]);
171
231
  // get dashboards
172
232
  const [dashboardOptions, setDashboardOptions] = useState([]);
173
- const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard ||
174
- dashboardItem?.dashboardName ||
175
- dashboardOptions[0]?.label);
176
- useEffect(() => {
177
- if (!destinationDashboard &&
178
- !dashboardItem &&
179
- dashboardOptions &&
180
- dashboardOptions.length) {
181
- setDefaultDashboardName(dashboardOptions[0]?.label);
182
- setFormData({ ...formData, dashboardName: dashboardOptions[0]?.label });
183
- }
184
- }, [dashboardOptions]);
185
- useEffect(() => {
186
- async function getDashNames() {
187
- const resp = await getDataFromCloud(client, `dashnames/${client.publicKey}/`, null, 'GET');
188
- setDashboardOptions(resp.dashboardNames
189
- .filter((elem) => elem !== null)
190
- .map((key) => ({ label: key, value: key })));
191
- }
192
- getDashNames();
193
- }, []);
233
+ const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || dashboardItem?.dashboardName || '');
194
234
  const { dashboardFilters } = useContext(DashboardFiltersContext);
235
+ const [dashboardFilters2, setDashboardFilters] = useState([]);
236
+ const [dashboardHasDateFilter, setDashboardHasDateFilter] = useState(false);
237
+ const [dashboardHasDateComparison, setDashboardHasDateComparison] = useState(false);
238
+ const [showFilterModal, setShowFilterModal] = useState(false);
239
+ const [filterIssues, setFilterIssues] = useState([]);
195
240
  const [showPivotPopover, setShowPivotPopover] = useState(false);
196
241
  const [isEdittingPivot, setIsEdittingPivot] = useState(false);
242
+ const [intialLoad, setInitialLoad] = useState(true);
197
243
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
198
244
  const [tableName, setTableName] = useState(undefined);
199
245
  const selectedTable = schema?.find((t) => t.displayName === tableName);
@@ -207,37 +253,15 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
207
253
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
208
254
  const [fieldOptions, setFieldOptions] = useState(fields);
209
255
  const [dateFieldOptions, setDateFieldOptions] = useState([]);
210
- useEffect(() => {
211
- const fetchReferencedTables = async () => {
212
- if (!query) {
213
- return;
214
- }
215
- const result = await getReferencedTables(client, query, schema);
216
- setDateFieldOptions(result);
217
- setTableName(result[0]?.name);
218
- if (!formData.dateField?.table) {
219
- setFormData({
220
- ...formData,
221
- dateField: {
222
- table: result[0]?.name || '',
223
- field: result[0]?.columns?.find((elem) => elem.name === dateColumn)
224
- ?.name ||
225
- result[0]?.columns[0]?.name ||
226
- '',
227
- },
228
- });
229
- }
230
- };
231
- fetchReferencedTables();
232
- }, [query]);
233
- const defaultDateField = {
234
- table: dateFieldOptions[0]?.name,
235
- field: dateFieldOptions[0]?.columns[0]?.name,
236
- };
256
+ const [allTables, setAllTables] = useState([]);
257
+ const [defaultDateField, setDefaultDateField] = useState({
258
+ table: dateFieldOptions[0]?.name || '',
259
+ field: dateFieldOptions[0]?.columns[0]?.name || '',
260
+ });
237
261
  const firstNumberColumn = columns?.find((col) => numberFormatOptions.includes(col.format));
238
262
  const formEmptyState = {
239
263
  name: 'My Chart',
240
- dashboardName: dashboardOptions?.[0]?.label,
264
+ dashboardName: dashboardOptions[0]?.label || '',
241
265
  columns: columns.map((col) => {
242
266
  return { ...col, label: snakeCaseToTitleCase(col.label) };
243
267
  }),
@@ -256,6 +280,32 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
256
280
  dateField: defaultDateField,
257
281
  template: false,
258
282
  };
283
+ const updateDashboardFilters = async (dashboardName) => {
284
+ const { queryEndpoint, queryHeaders, publicKey } = client;
285
+ if (queryEndpoint) {
286
+ const response = await fetch(queryEndpoint, {
287
+ method: 'POST',
288
+ headers: {
289
+ ...queryHeaders,
290
+ 'Content-Type': 'application/json',
291
+ },
292
+ body: JSON.stringify({
293
+ metadata: {
294
+ orgId: '*',
295
+ task: 'config',
296
+ name: dashboardName,
297
+ clientId: publicKey,
298
+ databaseType: client.databaseType,
299
+ },
300
+ }),
301
+ credentials: 'omit', // If withCredentials is true, set to 'include'. Otherwise, set to 'omit'.
302
+ });
303
+ const responseData = (await response.json()).data;
304
+ setDashboardFilters(responseData.filters);
305
+ setDashboardHasDateFilter(!!responseData.dateFilter);
306
+ setDashboardHasDateComparison(responseData.dateFilter?.comparison || false);
307
+ }
308
+ };
259
309
  const pivotFormData = (pivot) => {
260
310
  const yAxisField = pivot.columnField || pivot.valueField;
261
311
  // date labels for pivots should be treated like strings since they are
@@ -263,10 +313,11 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
263
313
  const yAxisIsDate = pivot.columnField
264
314
  ? isDateField(pivot.columnFieldType)
265
315
  : false;
316
+ const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
266
317
  return {
267
318
  pivot,
268
- chartType: dashboardItem?.chartType || 'column',
269
- xAxisField: pivot.rowField,
319
+ chartType: chartType,
320
+ xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
270
321
  xAxisFormat: isDateField(pivot.rowFieldType)
271
322
  ? 'string'
272
323
  : columns.find((col) => col.field === pivot.rowField)?.format ||
@@ -287,14 +338,66 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
287
338
  const [formData, setFormData] = useState(pivot
288
339
  ? { ...formEmptyState, ...dashboardItem, ...pivotFormData(pivot) }
289
340
  : dashboardItem || formEmptyState);
341
+ useEffect(() => {
342
+ async function getFormData() {
343
+ const curFormData = formData;
344
+ const resp = await getDataFromCloud(client, `dashnames/${client.publicKey}/`, null, 'GET');
345
+ const dashboardOptions = resp.dashboardNames
346
+ .filter((elem) => elem !== null)
347
+ .map((key) => ({ label: key, value: key }));
348
+ await updateDashboardFilters(dashboardItem
349
+ ? dashboardItem.dashboardName
350
+ : dashboardOptions[0]?.label);
351
+ setDashboardOptions(dashboardOptions);
352
+ const dashboardName = dashboardItem
353
+ ? dashboardItem?.dashboardName
354
+ : dashboardOptions[0]?.label;
355
+ curFormData.dashboardName = dashboardName;
356
+ setDefaultDashboardName(dashboardItem
357
+ ? dashboardItem?.dashboardName
358
+ : dashboardOptions[0]?.label);
359
+ // setFormData({
360
+ // ...formData,
361
+ // dashboardName: dashboardItem
362
+ // ? dashboardItem?.dashboardName
363
+ // : dashboardOptions[0]?.label,
364
+ // });
365
+ if (!query) {
366
+ return;
367
+ }
368
+ const result = await getReferencedTables(client, query, schema, true);
369
+ setDateFieldOptions(result);
370
+ const allReferencedFields = await getReferencedTables(client, query, schema, false);
371
+ setAllTables(allReferencedFields.map((table) => table.name));
372
+ setTableName(result[0]?.name);
373
+ const dateField = {
374
+ table: result[0]?.name || '',
375
+ field: result[0]?.columns?.find((elem) => elem.name === dateColumn)?.name ||
376
+ result[0]?.columns[0]?.name ||
377
+ '',
378
+ };
379
+ curFormData.dateField = dateField;
380
+ setFormData({
381
+ ...curFormData,
382
+ });
383
+ }
384
+ getFormData();
385
+ }, []);
290
386
  const selectedPivotTable = useMemo(() => {
291
387
  if (formData.pivot && rows) {
292
- return generatePivotTable(formData.pivot, rows, dateRange, false);
388
+ if (intialLoad && pivotData) {
389
+ setInitialLoad(false);
390
+ return pivotData;
391
+ }
392
+ else {
393
+ setInitialLoad(false);
394
+ return generatePivotTable(formData.pivot, rows, dateRange, false);
395
+ }
293
396
  }
294
397
  else {
295
398
  return undefined;
296
399
  }
297
- }, [formData.pivot, rows, formData]);
400
+ }, [formData.pivot, rows]);
298
401
  const handleChange = (value, fieldName, index) => {
299
402
  try {
300
403
  // WE NEED TO REPROCESS THE PIVOT TABLE IF THE PIVOT COLUMN CHANGES
@@ -374,7 +477,6 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
374
477
  }
375
478
  }
376
479
  catch (e) {
377
- console.log('No field or subfield found');
378
480
  setFormData({ ...formData, [fieldName]: value });
379
481
  }
380
482
  };
@@ -461,7 +563,29 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
461
563
  setIsOpen(false);
462
564
  setIsSubmitting(false);
463
565
  };
464
- const editChart = async () => {
566
+ const editChart = async (override = false) => {
567
+ if (!override) {
568
+ let dashboardDiscrepancyIssues = [];
569
+ if (dashboardHasDateComparison && formData.chartType === 'pie') {
570
+ dashboardDiscrepancyIssues.push(`The ${formData.dashboardName} dashboard is used for comparing date fields. This feature is not applicable to pie charts. We recommend switching to a column or bar chart instead.`);
571
+ }
572
+ if (dashboardHasDateFilter &&
573
+ (!defaultDateField ||
574
+ (!formData.dateField.field && !formData.dateField.table))) {
575
+ dashboardDiscrepancyIssues.push(`The dashboard "${formData.dashboardName}" has a global date filter but this chart doesn't reference any tables with a date field. It is not recommended to add this chart because the global filter cannot be applied.`);
576
+ }
577
+ dashboardFilters2.forEach((filter) => {
578
+ const table = allTables.find((elem) => elem === filter.table);
579
+ if (!table) {
580
+ dashboardDiscrepancyIssues.push(`The dashboard "${formData.dashboardName}" a global filter on "${filter.table}" "${filter.field}" but this chart doesn't reference "${filter.table}". It is not recommended to add this chart because the global filter on "${filter.table}" "${filter.field}" cannot be applied.`);
581
+ }
582
+ });
583
+ if (dashboardDiscrepancyIssues.length) {
584
+ setFilterIssues(dashboardDiscrepancyIssues);
585
+ setShowFilterModal(true);
586
+ return;
587
+ }
588
+ }
465
589
  if (isSubmitting) {
466
590
  return;
467
591
  }
@@ -532,231 +656,227 @@ export default function ChartBuilder({ TextInput = QuillTextInput, Select = Quil
532
656
  if (!schema) {
533
657
  return;
534
658
  }
535
- // if (horizontalView && !isEditMode) {
536
- // console.log(horizontalView, isEditMode);
537
- // return;
538
- // }
539
- return (_jsx("div", { style: { width: '100%', height: '100%', flexGrow: 1 }, children: _jsxs("div", { id: "quill-chart-modal", style: {
540
- width: '100%',
541
- height: '100%',
542
- maxWidth: '100%',
543
- display: 'flex',
544
- padding: modalPadding,
545
- gap: '20px',
546
- flexDirection: horizontalView ? 'row' : 'column',
547
- }, children: [_jsxs("div", { style: {
548
- display: 'flex',
549
- flexDirection: 'column',
550
- gap: '20px',
551
- ...(horizontalView && {
552
- flexGrow: 1,
553
- maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
554
- }),
555
- }, children: [(!horizontalView || formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
556
- width: '100%',
557
- height: 400,
558
- ...(horizontalView && { flexGrow: 1 }),
559
- } })),
560
- // Make sure to display non-pivoted table when using pivot chart
561
- horizontalView && formData.chartType !== 'table' ? (_jsx(Chart, { config: {
562
- ...formData,
563
- pivot: undefined,
564
- chartType: 'table',
565
- rows,
566
- rowsPerPage: 20,
567
- }, containerStyle: {
568
- height: '100%',
569
- width: '100%',
570
- flexGrow: 1,
571
- } })) : (horizontalView && (_jsx(Chart, { config: {
572
- ...formData,
573
- chartType: 'table',
574
- rows,
575
- rowsPerPage: 20,
576
- }, containerStyle: {
577
- height: '100%',
578
- width: '100%',
659
+ return (_jsxs("div", { style: { width: '100%', height: '100%', flexGrow: 1 }, children: [_jsxs("div", { id: "quill-chart-modal", style: {
660
+ width: '100%',
661
+ height: '100%',
662
+ maxWidth: '100%',
663
+ display: 'flex',
664
+ padding: modalPadding,
665
+ gap: '20px',
666
+ flexDirection: horizontalView ? 'row' : 'column',
667
+ boxSizing: 'border-box',
668
+ }, children: [_jsxs("div", { style: {
669
+ display: 'flex',
670
+ flexDirection: 'column',
671
+ gap: '20px',
672
+ ...(horizontalView && {
579
673
  flexGrow: 1,
580
- } })))] }), (isOpen || !horizontalView) && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
581
- display: 'flex',
582
- flexDirection: 'column',
583
- height: '100%',
584
- ...(horizontalView && {
585
- minWidth: 665,
586
- maxWidth: 665,
587
- width: 665,
588
- gap: 20,
589
- }),
590
- }, 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(Label, { children: "Name" }), _jsx(TextInput, { id: "chart-builder-name", value: formData.name, onChange: (e) => handleChange(e, 'name'), placeholder: "Name", theme: theme })] }), showDashboardDropdown && !destinationDashboard && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Dashboard" }), _jsx(Select, { value: formData.dashboardName || '', onChange: (e) => handleChange(e, 'dashboardName'), options: dashboardOptions.map((elem) => ({
591
- label: elem.label,
592
- value: elem.label,
593
- })), theme: theme })] })), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Chart type" }), _jsx(Select, { value: formData.chartType, onChange: (e) => handleChange(e, 'chartType'),
594
- // filter out metric for all pivots
595
- // filter out bar and pie for row and column pivot
596
- options: CHART_TYPES.filter((elem) => !((formData.pivot && elem === 'metric') ||
597
- (formData.pivot &&
598
- formData.pivot.columnField &&
599
- (elem === 'bar' || elem === 'pie')))).map((elem) => ({ label: elem, value: elem })), theme: theme })] })] }), _jsx("br", {}), _jsxs("div", { style: {
600
- display: 'flex',
601
- flexDirection: 'column',
602
- gap: 12,
603
- marginTop: 6,
604
- }, children: [_jsx(Header, { children: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
605
- maxWidth: 200,
606
- // marginTop: 6,
607
- display: 'flex',
608
- flexDirection: 'column',
609
- }, 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: Select, ButtonComponent: Button, PopoverComponent: Popover, LabelComponent: Label, TextComponent: Text, HeaderComponent: Header, 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", { style: {
610
- // width: 592,
611
- paddingRight: 42,
612
- maxWidth: 750,
613
- }, children: _jsx(PivotCard, { pivotTable: {
614
- pivot: formData.pivot,
615
- rows: selectedPivotTable?.rows,
616
- columns: selectedPivotTable?.columns,
617
- }, theme: theme, index: 0, onSelectPivot: () => {
618
- setIsEdittingPivot(true);
619
- setShowPivotPopover(true);
620
- setPivotRowField(formData.pivot?.rowField);
621
- setPivotColumnField(formData.pivot?.columnField);
622
- setPivotValueField(formData.pivot?.valueField);
623
- setPivotAggregation(formData.pivot?.aggregationType);
624
- setPivotPopUpTitle('Edit Pivot');
625
- }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: Button, HeaderComponent: Header, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: Label, TextComponent: Text }) }))] })] }), _jsx("br", {}), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
626
- display: 'flex',
627
- flexDirection: 'column',
628
- gap: 6,
629
- marginTop: 6,
630
- }, children: _jsx(Header, { children: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(Label, { children: CHART_TO_LABELS[formData.chartType]?.xAxisLabel }), _jsxs("div", { style: {
631
- display: 'flex',
632
- flexDirection: 'row',
633
- gap: 12,
634
- }, children: [_jsx(Select, { value: formData.xAxisField, onChange: (e) => handleChange(e, 'xAxisField'), options: formData.pivot
635
- ? [
636
- {
637
- label: `Pivot Row (${formData.pivot.rowField})`,
638
- value: formData.pivot.rowField,
639
- },
640
- ]
641
- : fieldOptions.map((elem) => ({
642
- label: elem.field,
643
- value: elem.field,
644
- })), theme: theme }), _jsx(TextInput, { id: "chart-builder-x-axis-label", value: formData.pivot
645
- ? formData.pivot.rowField
646
- : formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e, 'xAxisLabel'), theme: theme }), _jsx(Select, { value: formData.pivot &&
647
- isDateField(formData.pivot.rowFieldType)
648
- ? 'pivot_date'
649
- : formData.xAxisFormat, onChange: (e) => handleChange(e, 'xAxisFormat'), options: formData.pivot &&
650
- isDateField(formData.pivot.rowFieldType)
651
- ? [{ value: 'pivot_date', label: 'date' }]
652
- : formatOptions, theme: theme })] }, 'xAxisField'), _jsx("br", {})] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(Label, { children: CHART_TO_LABELS[formData.chartType]?.yAxisLabel }), _jsx("div", { style: {
653
- display: 'flex',
654
- flexDirection: 'column',
655
- gap: 10,
656
- }, children: formData.yAxisFields.map((yAxisField, index) => (_jsxs("div", { style: {
674
+ maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
675
+ }),
676
+ }, children: [(!horizontalView || formData.chartType !== 'table') && (_jsx(Chart, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
677
+ width: '100%',
678
+ height: formData.chartType === 'metric'
679
+ ? 100
680
+ : horizontalView
681
+ ? '100%'
682
+ : 400,
683
+ ...(horizontalView && { flexGrow: 1 }),
684
+ } })),
685
+ // Make sure to display non-pivoted table when using pivot chart
686
+ horizontalView && formData.chartType !== 'table' ? (_jsx(Chart, { config: {
687
+ ...formData,
688
+ pivot: undefined,
689
+ chartType: 'table',
690
+ rows,
691
+ rowsPerPage: 20,
692
+ }, containerStyle: {
693
+ height: '100%',
694
+ width: '100%',
695
+ flexGrow: 1,
696
+ } })) : (horizontalView && (_jsx(Chart, { config: {
697
+ ...formData,
698
+ chartType: 'table',
699
+ rows,
700
+ rowsPerPage: 20,
701
+ }, containerStyle: {
702
+ height: '100%',
703
+ width: '100%',
704
+ flexGrow: 1,
705
+ } })))] }), (isOpen || !horizontalView) && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
706
+ display: 'flex',
707
+ flexDirection: 'column',
708
+ height: '100%',
709
+ ...(horizontalView && {
710
+ minWidth: 665,
711
+ maxWidth: 665,
712
+ width: 665,
713
+ gap: 20,
714
+ }),
715
+ }, 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(Label, { children: "Name" }), _jsx(TextInput, { id: "chart-builder-name", value: formData.name, onChange: (e) => handleChange(e, 'name'), placeholder: "Name", theme: theme })] }), showDashboardDropdown && !destinationDashboard && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Dashboard" }), _jsx(Select, { value: formData.dashboardName || '', onChange: async (e) => {
716
+ await updateDashboardFilters(e);
717
+ handleChange(e, 'dashboardName');
718
+ }, options: dashboardOptions.map((elem) => ({
719
+ label: elem.label,
720
+ value: elem.label,
721
+ })), theme: theme })] })), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Chart type" }), _jsx(Select, { value: formData.chartType, onChange: (e) => handleChange(e, 'chartType'),
722
+ // filter out metric for all pivots
723
+ // filter out bar and pie for row and column pivot
724
+ options: getChartTypeOptions(formData), theme: theme })] })] }), _jsx("br", {}), _jsxs("div", { style: {
725
+ display: 'flex',
726
+ flexDirection: 'column',
727
+ gap: 12,
728
+ marginTop: 6,
729
+ }, children: [_jsx(Header, { children: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
730
+ maxWidth: 200,
731
+ // marginTop: 6,
732
+ display: 'flex',
733
+ flexDirection: 'column',
734
+ }, 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: Select, ButtonComponent: Button, PopoverComponent: Popover, LabelComponent: Label, TextComponent: Text, HeaderComponent: Header, 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", { style: {
735
+ // width: 592,
736
+ paddingRight: 42,
737
+ maxWidth: 750,
738
+ }, children: _jsx("div", { style: { width: !horizontalView ? divWidth : 'auto' }, children: _jsx(PivotCard, { pivotTable: {
739
+ pivot: formData.pivot,
740
+ rows: selectedPivotTable?.rows,
741
+ columns: selectedPivotTable?.columns,
742
+ }, theme: theme, index: 0, onSelectPivot: () => {
743
+ setIsEdittingPivot(true);
744
+ setShowPivotPopover(true);
745
+ setPivotRowField(formData.pivot?.rowField);
746
+ setPivotColumnField(formData.pivot?.columnField);
747
+ setPivotValueField(formData.pivot?.valueField);
748
+ setPivotAggregation(formData.pivot?.aggregationType);
749
+ setPivotPopUpTitle('Edit Pivot');
750
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: Button, HeaderComponent: Header, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: Label, TextComponent: Text }) }) }))] })] }), _jsx("br", {}), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
751
+ display: 'flex',
752
+ flexDirection: 'column',
753
+ gap: 6,
754
+ marginTop: 6,
755
+ }, children: _jsx(Header, { children: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(Label, { children: CHART_TO_LABELS[formData.chartType]?.xAxisLabel }), _jsxs("div", { style: {
657
756
  display: 'flex',
658
757
  flexDirection: 'row',
659
758
  gap: 12,
660
- }, children: [_jsx(Select, { value: formData.pivot
661
- ? formData.pivot.valueField
662
- : yAxisField.field, onChange: (e) => handleChange(e, 'yAxisFields.field', index), theme: theme, options: formData.pivot
663
- ? [
664
- {
665
- label: `Pivot Column (${formData.pivot.valueField})`,
666
- value: formData.pivot.valueField,
667
- },
668
- ]
669
- : fieldOptions
670
- .filter((elem) => {
671
- return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
672
- })
673
- .map((elem) => ({
759
+ }, children: [_jsx(Select, { value: formData.xAxisField, onChange: (e) => handleChange(e, 'xAxisField'), options: formData.pivot
760
+ ? getPivotMetricOptions(formData.pivot)
761
+ : fieldOptions.map((elem) => ({
674
762
  label: elem.field,
675
763
  value: elem.field,
676
- })) }), _jsx(TextInput, { id: "chart-builder-y-axis-label", value: formData.pivot?.valueField || yAxisField.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'yAxisFields.label', index), theme: theme }), _jsx(Select, { theme: theme, value: formData.pivot
677
- ? !!NUMBER_OPTIONS.find((option) => {
678
- return (option.value === yAxisField.format);
679
- })
680
- ? // @ts-ignore
681
- NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
682
- : 'whole_number'
683
- : yAxisField.format, onChange: (e) => handleChange(e, 'yAxisFields.format', index), options: formData.pivot
684
- ? NUMBER_OPTIONS
685
- : formatOptions }), formData.pivot === null && (_jsx("div", { ref: deleteRef, children: _jsx(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && (_jsxs(_Fragment, { children: [_jsx("br", {}), _jsx(SecondaryButton, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), _jsx("br", {})] })), (showTableFormatOptions || formData.chartType === 'table') && (_jsxs("div", { children: [_jsxs("div", { style: {
686
- display: 'flex',
687
- flexDirection: 'column',
688
- gap: 6,
689
- marginTop: 6,
690
- }, children: [_jsx(Header, { children: "Table" }), _jsx(Label, { children: "Columns" })] }), _jsx("div", { style: {
691
- display: 'flex',
692
- flexDirection: 'column',
693
- gap: 10,
694
- }, children: formData.pivot &&
695
- selectedPivotTable &&
696
- selectedPivotTable.columns &&
697
- formData.chartType === 'table'
698
- ? // THIS CASE IF FOR PIVOT TABLES ONLY
699
- selectedPivotTable.columns.map((column, index) => (_jsxs("div", { style: {
764
+ })), theme: theme }), _jsx(TextInput, { id: "chart-builder-x-axis-label", value: formData.pivot
765
+ ? formData.pivot.rowField
766
+ : formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e, 'xAxisLabel'), theme: theme }), _jsx(Select, { value: formData.pivot &&
767
+ isDateField(formData.pivot.rowFieldType)
768
+ ? 'pivot_date'
769
+ : formData.xAxisFormat, onChange: (e) => handleChange(e, 'xAxisFormat'), options: formData.pivot &&
770
+ isDateField(formData.pivot.rowFieldType)
771
+ ? [{ value: 'pivot_date', label: 'date' }]
772
+ : formatOptions, theme: theme })] }, 'xAxisField'), _jsx("br", {})] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(Label, { children: CHART_TO_LABELS[formData.chartType]?.yAxisLabel }), _jsx("div", { style: {
773
+ display: 'flex',
774
+ flexDirection: 'column',
775
+ gap: 10,
776
+ }, children: formData.yAxisFields.map((yAxisField, index) => (_jsxs("div", { style: {
777
+ display: 'flex',
778
+ flexDirection: 'row',
779
+ gap: 12,
780
+ }, children: [_jsx(Select, { value: formData.pivot
781
+ ? formData.pivot.valueField
782
+ : yAxisField.field, onChange: (e) => handleChange(e, 'yAxisFields.field', index), theme: theme, options: formData.pivot
783
+ ? [
784
+ {
785
+ label: `Pivot Column (${formData.pivot.valueField})`,
786
+ value: formData.pivot.valueField,
787
+ },
788
+ ]
789
+ : fieldOptions
790
+ .filter((elem) => {
791
+ return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
792
+ })
793
+ .map((elem) => ({
794
+ label: elem.field,
795
+ value: elem.field,
796
+ })) }), _jsx(TextInput, { id: "chart-builder-y-axis-label", value: formData.pivot?.valueField || yAxisField.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'yAxisFields.label', index), theme: theme }), _jsx(Select, { theme: theme, value: formData.pivot
797
+ ? !!NUMBER_OPTIONS.find((option) => {
798
+ return (option.value === yAxisField.format);
799
+ })
800
+ ? // @ts-ignore
801
+ NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
802
+ : 'whole_number'
803
+ : yAxisField.format, onChange: (e) => handleChange(e, 'yAxisFields.format', index), options: formData.pivot
804
+ ? NUMBER_OPTIONS
805
+ : formatOptions }), formData.pivot === null && (_jsx("div", { ref: deleteRef, children: _jsx(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && (_jsxs(_Fragment, { children: [_jsx("br", {}), _jsx(SecondaryButton, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), _jsx("br", {})] })), (showTableFormatOptions || formData.chartType === 'table') && (_jsxs("div", { children: [_jsxs("div", { style: {
806
+ display: 'flex',
807
+ flexDirection: 'column',
808
+ gap: 6,
809
+ marginTop: 6,
810
+ }, children: [_jsx(Header, { children: "Table" }), _jsx(Label, { children: "Columns" })] }), _jsx("div", { style: {
811
+ display: 'flex',
812
+ flexDirection: 'column',
813
+ gap: 10,
814
+ }, children: formData.pivot &&
815
+ selectedPivotTable &&
816
+ selectedPivotTable.columns &&
817
+ formData.chartType === 'table'
818
+ ? // THIS CASE IF FOR PIVOT TABLES ONLY
819
+ selectedPivotTable.columns.map((column, index) => (_jsxs("div", { style: {
820
+ display: 'flex',
821
+ flexDirection: 'row',
822
+ gap: 12,
823
+ }, children: [_jsx(Select, { theme: theme, value: column.label, onChange: (e) => handleChange(e, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
824
+ label: elem.label,
825
+ value: elem.label,
826
+ })) }), _jsx(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), _jsx(Select, { theme: theme, value:
827
+ // The first index use rowField for the rest of them use value fields
828
+ formData.pivot &&
829
+ column.field === formData.pivot.rowField
830
+ ? formData.pivot &&
831
+ isDateField(formData.pivot.rowFieldType)
832
+ ? 'pivot_date'
833
+ : 'string'
834
+ : formData.pivot?.valueFieldType ||
835
+ 'whole_number', onChange: (e) => handleChange(e, 'pivotColumn', index), options: formData.pivot && index === 0
836
+ ? isDateField(formData.pivot.rowFieldType)
837
+ ? [{ label: 'date', value: 'pivot_date' }]
838
+ : [{ label: 'string', value: 'string' }]
839
+ : [...NUMBER_OPTIONS] })] }, 'column' + index)))
840
+ : formData.columns.map((column, index) => (_jsxs("div", { style: {
700
841
  display: 'flex',
701
842
  flexDirection: 'row',
702
843
  gap: 12,
703
- }, children: [_jsx(Select, { theme: theme, value: column.label, onChange: (e) => handleChange(e, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
704
- label: elem.label,
705
- value: elem.label,
706
- })) }), _jsx(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), _jsx(Select, { theme: theme, value:
707
- // The first index use rowField for the rest of them use value fields
708
- formData.pivot &&
709
- column.field === formData.pivot.rowField
710
- ? formData.pivot &&
711
- isDateField(formData.pivot.rowFieldType)
712
- ? 'pivot_date'
713
- : 'string'
714
- : formData.pivot?.valueFieldType ||
715
- 'whole_number', onChange: (e) => handleChange(e, 'pivotColumn', index), options: formData.pivot && index === 0
716
- ? isDateField(formData.pivot.rowFieldType)
717
- ? [{ label: 'date', value: 'pivot_date' }]
718
- : [{ label: 'string', value: 'string' }]
719
- : [...NUMBER_OPTIONS] })] }, 'column' + index)))
720
- : formData.columns.map((column, index) => (_jsxs("div", { style: {
721
- display: 'flex',
722
- flexDirection: 'row',
723
- gap: 12,
724
- }, children: [_jsx(Select, { theme: theme, value: column.field, onChange: (e) => handleChange(e, 'columns.field', index), options: fields.map((elem) => ({
725
- label: elem.field,
726
- value: elem.field,
727
- })) }), _jsx(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), _jsx(Select, { theme: theme, value: column.format, onChange: (e) => handleChange(e, 'columns.format', index), options: formatOptions }), _jsx("div", { ref: deleteRef, children: _jsx(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), _jsx("br", {}), _jsx(SecondaryButton, { onClick: () => handleAddField('columns'), label: "Add column +" }), _jsx("br", {}), _jsx("br", {})] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
728
- display: 'flex',
729
- flexDirection: 'column',
730
- gap: 6,
731
- marginTop: 6,
732
- }, children: [_jsx(Header, { children: "Date field" }), _jsxs("div", { style: {
733
- display: 'flex',
734
- flexDirection: 'row',
735
- gap: 12,
736
- }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Table" }), _jsx(Select, { theme: theme, value: formData.dateField?.table, onChange: (e) => handleChange(e, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
737
- label: elem.name,
738
- value: elem.name,
739
- })) })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Field" }), _jsx(Select, { theme: theme, value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e, 'dateField.field'), options: dateFieldOptions
740
- ?.find((elem) => elem.name === formData.dateField?.table)
741
- ?.columns?.map((elem) => ({
742
- label: elem.name,
743
- value: elem.name,
744
- })) || [] })] })] }), _jsx("br", {})] })), showAccessControlOptions && (_jsxs("div", { style: {
745
- display: 'flex',
746
- flexDirection: 'column',
747
- gap: 12,
748
- marginTop: 6,
749
- }, children: [_jsx(Header, { children: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName || 'This Organization' })] }))] }), _jsxs("div", { style: {
750
- display: 'flex',
751
- flexDirection: 'row',
752
- justifyContent: 'flex-end',
753
- marginTop: 'auto',
754
- gap: 10,
755
- }, children: [!horizontalView && dashboardItem && (_jsx(SecondaryButton, { onClick: deleteChart, label: 'Delete' })), _jsx(Button, { onClick: editChart, label: buttonLabel
756
- ? buttonLabel
757
- : dashboardItem
758
- ? 'Save changes'
759
- : 'Add to dashboard' })] })] }))] }) }));
844
+ }, children: [_jsx(Select, { theme: theme, value: column.field, onChange: (e) => handleChange(e, 'columns.field', index), options: fields.map((elem) => ({
845
+ label: elem.field,
846
+ value: elem.field,
847
+ })) }), _jsx(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), _jsx(Select, { theme: theme, value: column.format, onChange: (e) => handleChange(e, 'columns.format', index), options: formatOptions }), _jsx("div", { ref: deleteRef, children: _jsx(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), _jsx("br", {}), _jsx(SecondaryButton, { onClick: () => handleAddField('columns'), label: "Add column +" }), _jsx("br", {}), _jsx("br", {})] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
848
+ display: 'flex',
849
+ flexDirection: 'column',
850
+ gap: 6,
851
+ marginTop: 6,
852
+ }, children: [_jsx(Header, { children: "Date field" }), _jsxs("div", { style: {
853
+ display: 'flex',
854
+ flexDirection: 'row',
855
+ gap: 12,
856
+ }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Table" }), _jsx(Select, { theme: theme, value: formData.dateField?.table, onChange: (e) => handleChange(e, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
857
+ label: elem.name,
858
+ value: elem.name,
859
+ })) })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(Label, { children: "Field" }), _jsx(Select, { theme: theme, value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e, 'dateField.field'), options: dateFieldOptions
860
+ ?.find((elem) => elem.name === formData.dateField?.table)
861
+ ?.columns?.map((elem) => ({
862
+ label: elem.name,
863
+ value: elem.name,
864
+ })) || [] })] })] }), _jsx("br", {})] })), showAccessControlOptions && (_jsxs("div", { style: {
865
+ display: 'flex',
866
+ flexDirection: 'column',
867
+ gap: 12,
868
+ marginTop: 6,
869
+ }, children: [_jsx(Header, { children: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName })] }))] }), _jsxs("div", { style: {
870
+ display: 'flex',
871
+ flexDirection: 'row',
872
+ justifyContent: 'flex-end',
873
+ marginTop: 'auto',
874
+ gap: 10,
875
+ }, children: [!horizontalView && dashboardItem && (_jsx(SecondaryButton, { onClick: deleteChart, label: 'Delete' })), _jsx(Button, { onClick: () => editChart(), label: buttonLabel
876
+ ? buttonLabel
877
+ : dashboardItem
878
+ ? 'Save changes'
879
+ : 'Add to dashboard' })] })] }))] }), _jsx(DashboardFilterModal, { isOpen: showFilterModal, setIsOpen: setShowFilterModal, override: () => editChart(true), theme: theme, issues: filterIssues })] }));
760
880
  }
761
881
  function SegmentedControl({ onChange, value, theme, organizationName, }) {
762
882
  return (_jsxs("div", { style: {
@@ -764,7 +884,7 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
764
884
  flexDirection: 'row',
765
885
  alignItems: 'center',
766
886
  background: '#F5F5F6',
767
- maxWidth: 418,
887
+ maxWidth: organizationName ? 418 : 209,
768
888
  padding: 4,
769
889
  borderRadius: 6,
770
890
  }, children: [_jsxs("button", { className: "quill-tab", onClick: () => onChange(true), style: {
@@ -790,7 +910,7 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
790
910
  .quill-tab:active {
791
911
  background-color: "rgba(56, 65, 81, 0.15)";
792
912
  }
793
- ` }), 'All Organizations'] }), _jsxs("button", { className: "quill-tab2", onClick: () => onChange(false), style: {
913
+ ` }), 'All Organizations'] }), organizationName && (_jsxs("button", { className: "quill-tab2", onClick: () => onChange(false), style: {
794
914
  border: value === false ? '1px solid #E7E7E7' : '1px solid transparent',
795
915
  boxShadow: value === false
796
916
  ? '0px 1px 4px 0px rgba(56, 65, 81, 0.08)'
@@ -798,7 +918,9 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
798
918
  outline: 'none',
799
919
  width: '100%',
800
920
  borderRadius: 4,
801
- color: value === false ? 'rgba(56, 65, 81, 1)' : 'rgba(56, 65, 81, 0.85)',
921
+ color: value === false
922
+ ? 'rgba(56, 65, 81, 1)'
923
+ : 'rgba(56, 65, 81, 0.85)',
802
924
  padding: 10,
803
925
  fontWeight: value === false ? 600 : 500,
804
926
  fontSize: 14,
@@ -816,5 +938,24 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
816
938
  .quill-tab2:active {
817
939
  background-color: "rgba(56, 65, 81, 0.15)";
818
940
  }
819
- ` }), organizationName] })] }));
941
+ ` }), organizationName] }))] }));
942
+ }
943
+ export function DashboardFilterModal({ isOpen, setIsOpen, override, theme, issues, }) {
944
+ return (_jsx(MemoizedModal, { isOpen: isOpen, onClose: () => {
945
+ setIsOpen(false);
946
+ }, setIsOpen: setIsOpen, theme: theme, title: 'Chart not compatible with selected dashboard', children: _jsxs("div", { style: {
947
+ display: 'flex',
948
+ flexDirection: 'column',
949
+ width: '600px',
950
+ padding: '20px',
951
+ boxSizing: 'border-box',
952
+ }, children: [issues.map((issue, index) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("br", {}), _jsxs("div", { style: {
953
+ display: 'flex',
954
+ flexDirection: 'row',
955
+ gap: '12px',
956
+ justifyContent: 'flex-end',
957
+ }, children: [_jsx(MemoizedButton, { label: "Got It", onClick: () => setIsOpen(false) }), _jsx(MemoizedSecondaryButton, { label: "Override", onClick: () => {
958
+ override();
959
+ setIsOpen(false);
960
+ } })] })] }) }));
820
961
  }