@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
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ChartBuilderWithModal = exports.dateFormatOptions = exports.numberFormatOptions = void 0;
6
+ exports.DashboardFilterModal = exports.ChartBuilderWithModal = exports.dateFormatOptions = exports.numberFormatOptions = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const react_1 = require("react");
9
9
  const Context_1 = require("./Context");
@@ -32,7 +32,39 @@ const CHART_TO_LABELS = {
32
32
  bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
33
33
  pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
34
34
  };
35
- function getTablesHelper(ast, allTables) {
35
+ function getPivotMetricOptions(pivot) {
36
+ if (!pivot.rowField) {
37
+ return [
38
+ {
39
+ label: `Pivot Value (${pivot.valueField})`,
40
+ value: pivot.valueField,
41
+ },
42
+ ];
43
+ }
44
+ else {
45
+ return [
46
+ {
47
+ label: `Pivot Row (${pivot.rowField})`,
48
+ value: pivot.rowField,
49
+ },
50
+ ];
51
+ }
52
+ }
53
+ function getChartTypeOptions(formData) {
54
+ if (formData.pivot && !formData.pivot.rowField) {
55
+ return CHART_TYPES.filter((elem) => elem === 'metric' || elem === 'table').map((elem) => ({
56
+ label: elem,
57
+ value: elem,
58
+ }));
59
+ }
60
+ else {
61
+ return CHART_TYPES.filter((elem) => !((formData.pivot && elem === 'metric') ||
62
+ (formData.pivot &&
63
+ formData.pivot.columnField &&
64
+ (elem === 'bar' || elem === 'pie')))).map((elem) => ({ label: elem, value: elem }));
65
+ }
66
+ }
67
+ function getTablesHelper(ast, allTables, filterForDate = true) {
36
68
  const tables = [];
37
69
  const withAliases = [];
38
70
  if (ast.with && ast.with.length) {
@@ -65,14 +97,16 @@ function getTablesHelper(ast, allTables) {
65
97
  .map((table) => {
66
98
  return {
67
99
  name: table.displayName,
68
- columns: table.columns.filter((column) => POSTGRES_DATE_TYPES.includes(column.fieldType)),
100
+ columns: table.columns.filter((column) => filterForDate
101
+ ? POSTGRES_DATE_TYPES.includes(column.fieldType)
102
+ : column.fieldType),
69
103
  };
70
104
  })
71
105
  .filter((table) => table.columns.length > 0);
72
106
  }
73
- async function getReferencedTables(client, sqlQuery, dbTables) {
107
+ async function getReferencedTables(client, sqlQuery, dbTables, filterForDate = true) {
74
108
  const resp = await (0, dataFetcher_1.getDataFromCloud)(client, `astify`, { query: sqlQuery });
75
- return getTablesHelper(resp.ast.length ? resp.ast[0] : resp.ast, dbTables);
109
+ return getTablesHelper(resp.ast.length ? resp.ast[0] : resp.ast, dbTables, filterForDate);
76
110
  }
77
111
  exports.numberFormatOptions = [
78
112
  'whole_number',
@@ -120,12 +154,13 @@ function ChartBuilderWithModal(props) {
120
154
  : {}, theme: theme, children: (0, jsx_runtime_1.jsx)(ChartBuilder, { ...props }) }));
121
155
  }
122
156
  exports.ChartBuilderWithModal = ChartBuilderWithModal;
123
- function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = QuillSelect_1.QuillSelectComponent, Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, Header = UiComponents_1.MemoizedHeader, Label = UiComponents_1.MemoizedLabel, DeleteButton = UiComponents_1.MemoizedDeleteButton, Text = UiComponents_1.MemoizedText, Popover = UiComponents_1.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, }) {
157
+ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = QuillSelect_1.QuillSelectComponent, Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, Header = UiComponents_1.MemoizedHeader, Label = UiComponents_1.MemoizedLabel, DeleteButton = UiComponents_1.MemoizedDeleteButton, Text = UiComponents_1.MemoizedText, Popover = UiComponents_1.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, }) {
124
158
  const dateRange = dr || [null, null, null];
125
159
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
126
160
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
127
161
  const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
128
162
  const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
163
+ const [divWidth, setDivWidth] = (0, react_1.useState)(0);
129
164
  const { dispatch } = (0, react_1.useContext)(Context_1.DashboardContext);
130
165
  const fields = fieldsProp?.map((field) => ({
131
166
  field: field.name,
@@ -137,6 +172,31 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
137
172
  const deleteRef = (0, react_1.useRef)(null);
138
173
  const modalPadding = 20;
139
174
  const deleteButtonMargin = -13;
175
+ (0, react_1.useEffect)(() => {
176
+ const calculateWidth = () => {
177
+ return (
178
+ // @ts-ignore
179
+ parentRef.current.offsetWidth -
180
+ (deleteRef?.current
181
+ ? deleteRef?.current.offsetWidth - deleteButtonMargin
182
+ : 0));
183
+ };
184
+ // Measure the width of the div and update state
185
+ if (parentRef.current) {
186
+ setDivWidth(calculateWidth());
187
+ }
188
+ // Optional: Handle window resize
189
+ const handleResize = () => {
190
+ if (parentRef.current) {
191
+ setDivWidth(calculateWidth());
192
+ }
193
+ };
194
+ window.addEventListener('resize', handleResize);
195
+ // Cleanup listener
196
+ return () => {
197
+ window.removeEventListener('resize', handleResize);
198
+ };
199
+ }, []);
140
200
  // get schema
141
201
  (0, react_1.useEffect)(() => {
142
202
  let isSubscribed = true;
@@ -177,30 +237,16 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
177
237
  }, [schema]);
178
238
  // get dashboards
179
239
  const [dashboardOptions, setDashboardOptions] = (0, react_1.useState)([]);
180
- const [defaultDashboardName, setDefaultDashboardName] = (0, react_1.useState)(destinationDashboard ||
181
- dashboardItem?.dashboardName ||
182
- dashboardOptions[0]?.label);
183
- (0, react_1.useEffect)(() => {
184
- if (!destinationDashboard &&
185
- !dashboardItem &&
186
- dashboardOptions &&
187
- dashboardOptions.length) {
188
- setDefaultDashboardName(dashboardOptions[0]?.label);
189
- setFormData({ ...formData, dashboardName: dashboardOptions[0]?.label });
190
- }
191
- }, [dashboardOptions]);
192
- (0, react_1.useEffect)(() => {
193
- async function getDashNames() {
194
- const resp = await (0, dataFetcher_1.getDataFromCloud)(client, `dashnames/${client.publicKey}/`, null, 'GET');
195
- setDashboardOptions(resp.dashboardNames
196
- .filter((elem) => elem !== null)
197
- .map((key) => ({ label: key, value: key })));
198
- }
199
- getDashNames();
200
- }, []);
240
+ const [defaultDashboardName, setDefaultDashboardName] = (0, react_1.useState)(destinationDashboard || dashboardItem?.dashboardName || '');
201
241
  const { dashboardFilters } = (0, react_1.useContext)(Context_1.DashboardFiltersContext);
242
+ const [dashboardFilters2, setDashboardFilters] = (0, react_1.useState)([]);
243
+ const [dashboardHasDateFilter, setDashboardHasDateFilter] = (0, react_1.useState)(false);
244
+ const [dashboardHasDateComparison, setDashboardHasDateComparison] = (0, react_1.useState)(false);
245
+ const [showFilterModal, setShowFilterModal] = (0, react_1.useState)(false);
246
+ const [filterIssues, setFilterIssues] = (0, react_1.useState)([]);
202
247
  const [showPivotPopover, setShowPivotPopover] = (0, react_1.useState)(false);
203
248
  const [isEdittingPivot, setIsEdittingPivot] = (0, react_1.useState)(false);
249
+ const [intialLoad, setInitialLoad] = (0, react_1.useState)(true);
204
250
  const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
205
251
  const [tableName, setTableName] = (0, react_1.useState)(undefined);
206
252
  const selectedTable = schema?.find((t) => t.displayName === tableName);
@@ -214,37 +260,15 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
214
260
  // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
215
261
  const [fieldOptions, setFieldOptions] = (0, react_1.useState)(fields);
216
262
  const [dateFieldOptions, setDateFieldOptions] = (0, react_1.useState)([]);
217
- (0, react_1.useEffect)(() => {
218
- const fetchReferencedTables = async () => {
219
- if (!query) {
220
- return;
221
- }
222
- const result = await getReferencedTables(client, query, schema);
223
- setDateFieldOptions(result);
224
- setTableName(result[0]?.name);
225
- if (!formData.dateField?.table) {
226
- setFormData({
227
- ...formData,
228
- dateField: {
229
- table: result[0]?.name || '',
230
- field: result[0]?.columns?.find((elem) => elem.name === dateColumn)
231
- ?.name ||
232
- result[0]?.columns[0]?.name ||
233
- '',
234
- },
235
- });
236
- }
237
- };
238
- fetchReferencedTables();
239
- }, [query]);
240
- const defaultDateField = {
241
- table: dateFieldOptions[0]?.name,
242
- field: dateFieldOptions[0]?.columns[0]?.name,
243
- };
263
+ const [allTables, setAllTables] = (0, react_1.useState)([]);
264
+ const [defaultDateField, setDefaultDateField] = (0, react_1.useState)({
265
+ table: dateFieldOptions[0]?.name || '',
266
+ field: dateFieldOptions[0]?.columns[0]?.name || '',
267
+ });
244
268
  const firstNumberColumn = columns?.find((col) => exports.numberFormatOptions.includes(col.format));
245
269
  const formEmptyState = {
246
270
  name: 'My Chart',
247
- dashboardName: dashboardOptions?.[0]?.label,
271
+ dashboardName: dashboardOptions[0]?.label || '',
248
272
  columns: columns.map((col) => {
249
273
  return { ...col, label: (0, textProcessing_1.snakeCaseToTitleCase)(col.label) };
250
274
  }),
@@ -263,6 +287,32 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
263
287
  dateField: defaultDateField,
264
288
  template: false,
265
289
  };
290
+ const updateDashboardFilters = async (dashboardName) => {
291
+ const { queryEndpoint, queryHeaders, publicKey } = client;
292
+ if (queryEndpoint) {
293
+ const response = await fetch(queryEndpoint, {
294
+ method: 'POST',
295
+ headers: {
296
+ ...queryHeaders,
297
+ 'Content-Type': 'application/json',
298
+ },
299
+ body: JSON.stringify({
300
+ metadata: {
301
+ orgId: '*',
302
+ task: 'config',
303
+ name: dashboardName,
304
+ clientId: publicKey,
305
+ databaseType: client.databaseType,
306
+ },
307
+ }),
308
+ credentials: 'omit', // If withCredentials is true, set to 'include'. Otherwise, set to 'omit'.
309
+ });
310
+ const responseData = (await response.json()).data;
311
+ setDashboardFilters(responseData.filters);
312
+ setDashboardHasDateFilter(!!responseData.dateFilter);
313
+ setDashboardHasDateComparison(responseData.dateFilter?.comparison || false);
314
+ }
315
+ };
266
316
  const pivotFormData = (pivot) => {
267
317
  const yAxisField = pivot.columnField || pivot.valueField;
268
318
  // date labels for pivots should be treated like strings since they are
@@ -270,10 +320,11 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
270
320
  const yAxisIsDate = pivot.columnField
271
321
  ? (0, PivotModal_1.isDateField)(pivot.columnFieldType)
272
322
  : false;
323
+ const chartType = dashboardItem?.chartType ?? (pivot.rowField ? 'column' : 'metric');
273
324
  return {
274
325
  pivot,
275
- chartType: dashboardItem?.chartType || 'column',
276
- xAxisField: pivot.rowField,
326
+ chartType: chartType,
327
+ xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
277
328
  xAxisFormat: (0, PivotModal_1.isDateField)(pivot.rowFieldType)
278
329
  ? 'string'
279
330
  : columns.find((col) => col.field === pivot.rowField)?.format ||
@@ -294,14 +345,66 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
294
345
  const [formData, setFormData] = (0, react_1.useState)(pivot
295
346
  ? { ...formEmptyState, ...dashboardItem, ...pivotFormData(pivot) }
296
347
  : dashboardItem || formEmptyState);
348
+ (0, react_1.useEffect)(() => {
349
+ async function getFormData() {
350
+ const curFormData = formData;
351
+ const resp = await (0, dataFetcher_1.getDataFromCloud)(client, `dashnames/${client.publicKey}/`, null, 'GET');
352
+ const dashboardOptions = resp.dashboardNames
353
+ .filter((elem) => elem !== null)
354
+ .map((key) => ({ label: key, value: key }));
355
+ await updateDashboardFilters(dashboardItem
356
+ ? dashboardItem.dashboardName
357
+ : dashboardOptions[0]?.label);
358
+ setDashboardOptions(dashboardOptions);
359
+ const dashboardName = dashboardItem
360
+ ? dashboardItem?.dashboardName
361
+ : dashboardOptions[0]?.label;
362
+ curFormData.dashboardName = dashboardName;
363
+ setDefaultDashboardName(dashboardItem
364
+ ? dashboardItem?.dashboardName
365
+ : dashboardOptions[0]?.label);
366
+ // setFormData({
367
+ // ...formData,
368
+ // dashboardName: dashboardItem
369
+ // ? dashboardItem?.dashboardName
370
+ // : dashboardOptions[0]?.label,
371
+ // });
372
+ if (!query) {
373
+ return;
374
+ }
375
+ const result = await getReferencedTables(client, query, schema, true);
376
+ setDateFieldOptions(result);
377
+ const allReferencedFields = await getReferencedTables(client, query, schema, false);
378
+ setAllTables(allReferencedFields.map((table) => table.name));
379
+ setTableName(result[0]?.name);
380
+ const dateField = {
381
+ table: result[0]?.name || '',
382
+ field: result[0]?.columns?.find((elem) => elem.name === dateColumn)?.name ||
383
+ result[0]?.columns[0]?.name ||
384
+ '',
385
+ };
386
+ curFormData.dateField = dateField;
387
+ setFormData({
388
+ ...curFormData,
389
+ });
390
+ }
391
+ getFormData();
392
+ }, []);
297
393
  const selectedPivotTable = (0, react_1.useMemo)(() => {
298
394
  if (formData.pivot && rows) {
299
- return (0, PivotModal_1.generatePivotTable)(formData.pivot, rows, dateRange, false);
395
+ if (intialLoad && pivotData) {
396
+ setInitialLoad(false);
397
+ return pivotData;
398
+ }
399
+ else {
400
+ setInitialLoad(false);
401
+ return (0, PivotModal_1.generatePivotTable)(formData.pivot, rows, dateRange, false);
402
+ }
300
403
  }
301
404
  else {
302
405
  return undefined;
303
406
  }
304
- }, [formData.pivot, rows, formData]);
407
+ }, [formData.pivot, rows]);
305
408
  const handleChange = (value, fieldName, index) => {
306
409
  try {
307
410
  // WE NEED TO REPROCESS THE PIVOT TABLE IF THE PIVOT COLUMN CHANGES
@@ -381,7 +484,6 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
381
484
  }
382
485
  }
383
486
  catch (e) {
384
- console.log('No field or subfield found');
385
487
  setFormData({ ...formData, [fieldName]: value });
386
488
  }
387
489
  };
@@ -468,7 +570,29 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
468
570
  setIsOpen(false);
469
571
  setIsSubmitting(false);
470
572
  };
471
- const editChart = async () => {
573
+ const editChart = async (override = false) => {
574
+ if (!override) {
575
+ let dashboardDiscrepancyIssues = [];
576
+ if (dashboardHasDateComparison && formData.chartType === 'pie') {
577
+ 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.`);
578
+ }
579
+ if (dashboardHasDateFilter &&
580
+ (!defaultDateField ||
581
+ (!formData.dateField.field && !formData.dateField.table))) {
582
+ 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.`);
583
+ }
584
+ dashboardFilters2.forEach((filter) => {
585
+ const table = allTables.find((elem) => elem === filter.table);
586
+ if (!table) {
587
+ 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.`);
588
+ }
589
+ });
590
+ if (dashboardDiscrepancyIssues.length) {
591
+ setFilterIssues(dashboardDiscrepancyIssues);
592
+ setShowFilterModal(true);
593
+ return;
594
+ }
595
+ }
472
596
  if (isSubmitting) {
473
597
  return;
474
598
  }
@@ -539,231 +663,227 @@ function ChartBuilder({ TextInput = UiComponents_1.QuillTextInput, Select = Quil
539
663
  if (!schema) {
540
664
  return;
541
665
  }
542
- // if (horizontalView && !isEditMode) {
543
- // console.log(horizontalView, isEditMode);
544
- // return;
545
- // }
546
- return ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%', height: '100%', flexGrow: 1 }, children: (0, jsx_runtime_1.jsxs)("div", { id: "quill-chart-modal", style: {
547
- width: '100%',
548
- height: '100%',
549
- maxWidth: '100%',
550
- display: 'flex',
551
- padding: modalPadding,
552
- gap: '20px',
553
- flexDirection: horizontalView ? 'row' : 'column',
554
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
555
- display: 'flex',
556
- flexDirection: 'column',
557
- gap: '20px',
558
- ...(horizontalView && {
559
- flexGrow: 1,
560
- maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
561
- }),
562
- }, children: [(!horizontalView || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
563
- width: '100%',
564
- height: 400,
565
- ...(horizontalView && { flexGrow: 1 }),
566
- } })),
567
- // Make sure to display non-pivoted table when using pivot chart
568
- horizontalView && formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(Chart_1.default, { config: {
569
- ...formData,
570
- pivot: undefined,
571
- chartType: 'table',
572
- rows,
573
- rowsPerPage: 20,
574
- }, containerStyle: {
575
- height: '100%',
576
- width: '100%',
577
- flexGrow: 1,
578
- } })) : (horizontalView && ((0, jsx_runtime_1.jsx)(Chart_1.default, { config: {
579
- ...formData,
580
- chartType: 'table',
581
- rows,
582
- rowsPerPage: 20,
583
- }, containerStyle: {
584
- height: '100%',
585
- width: '100%',
666
+ return ((0, jsx_runtime_1.jsxs)("div", { style: { width: '100%', height: '100%', flexGrow: 1 }, children: [(0, jsx_runtime_1.jsxs)("div", { id: "quill-chart-modal", style: {
667
+ width: '100%',
668
+ height: '100%',
669
+ maxWidth: '100%',
670
+ display: 'flex',
671
+ padding: modalPadding,
672
+ gap: '20px',
673
+ flexDirection: horizontalView ? 'row' : 'column',
674
+ boxSizing: 'border-box',
675
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
676
+ display: 'flex',
677
+ flexDirection: 'column',
678
+ gap: '20px',
679
+ ...(horizontalView && {
586
680
  flexGrow: 1,
587
- } })))] }), (isOpen || !horizontalView) && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
588
- display: 'flex',
589
- flexDirection: 'column',
590
- height: '100%',
591
- ...(horizontalView && {
592
- minWidth: 665,
593
- maxWidth: 665,
594
- width: 665,
595
- gap: 20,
596
- }),
597
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { overflow: 'auto' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Name" }), (0, jsx_runtime_1.jsx)(TextInput, { id: "chart-builder-name", value: formData.name, onChange: (e) => handleChange(e, 'name'), placeholder: "Name", theme: theme })] }), showDashboardDropdown && !destinationDashboard && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Dashboard" }), (0, jsx_runtime_1.jsx)(Select, { value: formData.dashboardName || '', onChange: (e) => handleChange(e, 'dashboardName'), options: dashboardOptions.map((elem) => ({
598
- label: elem.label,
599
- value: elem.label,
600
- })), theme: theme })] })), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Chart type" }), (0, jsx_runtime_1.jsx)(Select, { value: formData.chartType, onChange: (e) => handleChange(e, 'chartType'),
601
- // filter out metric for all pivots
602
- // filter out bar and pie for row and column pivot
603
- options: CHART_TYPES.filter((elem) => !((formData.pivot && elem === 'metric') ||
604
- (formData.pivot &&
605
- formData.pivot.columnField &&
606
- (elem === 'bar' || elem === 'pie')))).map((elem) => ({ label: elem, value: elem })), theme: theme })] })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("div", { style: {
607
- display: 'flex',
608
- flexDirection: 'column',
609
- gap: 12,
610
- marginTop: 6,
611
- }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Pivot" }), (0, jsx_runtime_1.jsxs)("div", { style: { fontFamily: theme?.fontFamily }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
612
- maxWidth: 200,
613
- // marginTop: 6,
614
- display: 'flex',
615
- flexDirection: 'column',
616
- }, children: (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: 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 && ((0, jsx_runtime_1.jsx)("div", { style: {
617
- // width: 592,
618
- paddingRight: 42,
619
- maxWidth: 750,
620
- }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
621
- pivot: formData.pivot,
622
- rows: selectedPivotTable?.rows,
623
- columns: selectedPivotTable?.columns,
624
- }, theme: theme, index: 0, onSelectPivot: () => {
625
- setIsEdittingPivot(true);
626
- setShowPivotPopover(true);
627
- setPivotRowField(formData.pivot?.rowField);
628
- setPivotColumnField(formData.pivot?.columnField);
629
- setPivotValueField(formData.pivot?.valueField);
630
- setPivotAggregation(formData.pivot?.aggregationType);
631
- setPivotPopUpTitle('Edit Pivot');
632
- }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: Button, HeaderComponent: Header, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: Label, TextComponent: Text }) }))] })] }), (0, jsx_runtime_1.jsx)("br", {}), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
633
- display: 'flex',
634
- flexDirection: 'column',
635
- gap: 6,
636
- marginTop: 6,
637
- }, children: (0, jsx_runtime_1.jsx)(Header, { children: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(Label, { children: CHART_TO_LABELS[formData.chartType]?.xAxisLabel }), (0, jsx_runtime_1.jsxs)("div", { style: {
638
- display: 'flex',
639
- flexDirection: 'row',
640
- gap: 12,
641
- }, children: [(0, jsx_runtime_1.jsx)(Select, { value: formData.xAxisField, onChange: (e) => handleChange(e, 'xAxisField'), options: formData.pivot
642
- ? [
643
- {
644
- label: `Pivot Row (${formData.pivot.rowField})`,
645
- value: formData.pivot.rowField,
646
- },
647
- ]
648
- : fieldOptions.map((elem) => ({
649
- label: elem.field,
650
- value: elem.field,
651
- })), theme: theme }), (0, jsx_runtime_1.jsx)(TextInput, { id: "chart-builder-x-axis-label", value: formData.pivot
652
- ? formData.pivot.rowField
653
- : formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e, 'xAxisLabel'), theme: theme }), (0, jsx_runtime_1.jsx)(Select, { value: formData.pivot &&
654
- (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
655
- ? 'pivot_date'
656
- : formData.xAxisFormat, onChange: (e) => handleChange(e, 'xAxisFormat'), options: formData.pivot &&
657
- (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
658
- ? [{ value: 'pivot_date', label: 'date' }]
659
- : formatOptions, theme: theme })] }, 'xAxisField'), (0, jsx_runtime_1.jsx)("br", {})] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(Label, { children: CHART_TO_LABELS[formData.chartType]?.yAxisLabel }), (0, jsx_runtime_1.jsx)("div", { style: {
660
- display: 'flex',
661
- flexDirection: 'column',
662
- gap: 10,
663
- }, children: formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
681
+ maxWidth: !isOpen ? '100%' : 'calc(100% - 665px - 20px)', // width of left sidebar plus gap
682
+ }),
683
+ }, children: [(!horizontalView || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsx)(Chart_1.default, { colors: theme.chartColors, config: { ...formData, rows }, containerStyle: {
684
+ width: '100%',
685
+ height: formData.chartType === 'metric'
686
+ ? 100
687
+ : horizontalView
688
+ ? '100%'
689
+ : 400,
690
+ ...(horizontalView && { flexGrow: 1 }),
691
+ } })),
692
+ // Make sure to display non-pivoted table when using pivot chart
693
+ horizontalView && formData.chartType !== 'table' ? ((0, jsx_runtime_1.jsx)(Chart_1.default, { config: {
694
+ ...formData,
695
+ pivot: undefined,
696
+ chartType: 'table',
697
+ rows,
698
+ rowsPerPage: 20,
699
+ }, containerStyle: {
700
+ height: '100%',
701
+ width: '100%',
702
+ flexGrow: 1,
703
+ } })) : (horizontalView && ((0, jsx_runtime_1.jsx)(Chart_1.default, { config: {
704
+ ...formData,
705
+ chartType: 'table',
706
+ rows,
707
+ rowsPerPage: 20,
708
+ }, containerStyle: {
709
+ height: '100%',
710
+ width: '100%',
711
+ flexGrow: 1,
712
+ } })))] }), (isOpen || !horizontalView) && ((0, jsx_runtime_1.jsxs)("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
713
+ display: 'flex',
714
+ flexDirection: 'column',
715
+ height: '100%',
716
+ ...(horizontalView && {
717
+ minWidth: 665,
718
+ maxWidth: 665,
719
+ width: 665,
720
+ gap: 20,
721
+ }),
722
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { overflow: 'auto' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Name" }), (0, jsx_runtime_1.jsx)(TextInput, { id: "chart-builder-name", value: formData.name, onChange: (e) => handleChange(e, 'name'), placeholder: "Name", theme: theme })] }), showDashboardDropdown && !destinationDashboard && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Dashboard" }), (0, jsx_runtime_1.jsx)(Select, { value: formData.dashboardName || '', onChange: async (e) => {
723
+ await updateDashboardFilters(e);
724
+ handleChange(e, 'dashboardName');
725
+ }, options: dashboardOptions.map((elem) => ({
726
+ label: elem.label,
727
+ value: elem.label,
728
+ })), theme: theme })] })), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Chart type" }), (0, jsx_runtime_1.jsx)(Select, { value: formData.chartType, onChange: (e) => handleChange(e, 'chartType'),
729
+ // filter out metric for all pivots
730
+ // filter out bar and pie for row and column pivot
731
+ options: getChartTypeOptions(formData), theme: theme })] })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("div", { style: {
732
+ display: 'flex',
733
+ flexDirection: 'column',
734
+ gap: 12,
735
+ marginTop: 6,
736
+ }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Pivot" }), (0, jsx_runtime_1.jsxs)("div", { style: { fontFamily: theme?.fontFamily }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
737
+ maxWidth: 200,
738
+ // marginTop: 6,
739
+ display: 'flex',
740
+ flexDirection: 'column',
741
+ }, children: (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: 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 && ((0, jsx_runtime_1.jsx)("div", { style: {
742
+ // width: 592,
743
+ paddingRight: 42,
744
+ maxWidth: 750,
745
+ }, children: (0, jsx_runtime_1.jsx)("div", { style: { width: !horizontalView ? divWidth : 'auto' }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
746
+ pivot: formData.pivot,
747
+ rows: selectedPivotTable?.rows,
748
+ columns: selectedPivotTable?.columns,
749
+ }, theme: theme, index: 0, onSelectPivot: () => {
750
+ setIsEdittingPivot(true);
751
+ setShowPivotPopover(true);
752
+ setPivotRowField(formData.pivot?.rowField);
753
+ setPivotColumnField(formData.pivot?.columnField);
754
+ setPivotValueField(formData.pivot?.valueField);
755
+ setPivotAggregation(formData.pivot?.aggregationType);
756
+ setPivotPopUpTitle('Edit Pivot');
757
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: Button, HeaderComponent: Header, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: Label, TextComponent: Text }) }) }))] })] }), (0, jsx_runtime_1.jsx)("br", {}), (formData.pivot || formData.chartType !== 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsx)("div", { style: {
758
+ display: 'flex',
759
+ flexDirection: 'column',
760
+ gap: 6,
761
+ marginTop: 6,
762
+ }, children: (0, jsx_runtime_1.jsx)(Header, { children: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(Label, { children: CHART_TO_LABELS[formData.chartType]?.xAxisLabel }), (0, jsx_runtime_1.jsxs)("div", { style: {
664
763
  display: 'flex',
665
764
  flexDirection: 'row',
666
765
  gap: 12,
667
- }, children: [(0, jsx_runtime_1.jsx)(Select, { value: formData.pivot
668
- ? formData.pivot.valueField
669
- : yAxisField.field, onChange: (e) => handleChange(e, 'yAxisFields.field', index), theme: theme, options: formData.pivot
670
- ? [
671
- {
672
- label: `Pivot Column (${formData.pivot.valueField})`,
673
- value: formData.pivot.valueField,
674
- },
675
- ]
676
- : fieldOptions
677
- .filter((elem) => {
678
- return exports.numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
679
- })
680
- .map((elem) => ({
766
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { value: formData.xAxisField, onChange: (e) => handleChange(e, 'xAxisField'), options: formData.pivot
767
+ ? getPivotMetricOptions(formData.pivot)
768
+ : fieldOptions.map((elem) => ({
681
769
  label: elem.field,
682
770
  value: elem.field,
683
- })) }), (0, jsx_runtime_1.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 }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: formData.pivot
684
- ? !!NUMBER_OPTIONS.find((option) => {
685
- return (option.value === yAxisField.format);
686
- })
687
- ? // @ts-ignore
688
- NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
689
- : 'whole_number'
690
- : yAxisField.format, onChange: (e) => handleChange(e, 'yAxisFields.format', index), options: formData.pivot
691
- ? NUMBER_OPTIONS
692
- : formatOptions }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, children: (0, jsx_runtime_1.jsx)(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), (0, jsx_runtime_1.jsx)("br", {})] })), (showTableFormatOptions || formData.chartType === 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
693
- display: 'flex',
694
- flexDirection: 'column',
695
- gap: 6,
696
- marginTop: 6,
697
- }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Table" }), (0, jsx_runtime_1.jsx)(Label, { children: "Columns" })] }), (0, jsx_runtime_1.jsx)("div", { style: {
698
- display: 'flex',
699
- flexDirection: 'column',
700
- gap: 10,
701
- }, children: formData.pivot &&
702
- selectedPivotTable &&
703
- selectedPivotTable.columns &&
704
- formData.chartType === 'table'
705
- ? // THIS CASE IF FOR PIVOT TABLES ONLY
706
- selectedPivotTable.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
771
+ })), theme: theme }), (0, jsx_runtime_1.jsx)(TextInput, { id: "chart-builder-x-axis-label", value: formData.pivot
772
+ ? formData.pivot.rowField
773
+ : formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e, 'xAxisLabel'), theme: theme }), (0, jsx_runtime_1.jsx)(Select, { value: formData.pivot &&
774
+ (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
775
+ ? 'pivot_date'
776
+ : formData.xAxisFormat, onChange: (e) => handleChange(e, 'xAxisFormat'), options: formData.pivot &&
777
+ (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
778
+ ? [{ value: 'pivot_date', label: 'date' }]
779
+ : formatOptions, theme: theme })] }, 'xAxisField'), (0, jsx_runtime_1.jsx)("br", {})] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(Label, { children: CHART_TO_LABELS[formData.chartType]?.yAxisLabel }), (0, jsx_runtime_1.jsx)("div", { style: {
780
+ display: 'flex',
781
+ flexDirection: 'column',
782
+ gap: 10,
783
+ }, children: formData.yAxisFields.map((yAxisField, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
784
+ display: 'flex',
785
+ flexDirection: 'row',
786
+ gap: 12,
787
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { value: formData.pivot
788
+ ? formData.pivot.valueField
789
+ : yAxisField.field, onChange: (e) => handleChange(e, 'yAxisFields.field', index), theme: theme, options: formData.pivot
790
+ ? [
791
+ {
792
+ label: `Pivot Column (${formData.pivot.valueField})`,
793
+ value: formData.pivot.valueField,
794
+ },
795
+ ]
796
+ : fieldOptions
797
+ .filter((elem) => {
798
+ return exports.numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
799
+ })
800
+ .map((elem) => ({
801
+ label: elem.field,
802
+ value: elem.field,
803
+ })) }), (0, jsx_runtime_1.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 }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: formData.pivot
804
+ ? !!NUMBER_OPTIONS.find((option) => {
805
+ return (option.value === yAxisField.format);
806
+ })
807
+ ? // @ts-ignore
808
+ NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
809
+ : 'whole_number'
810
+ : yAxisField.format, onChange: (e) => handleChange(e, 'yAxisFields.format', index), options: formData.pivot
811
+ ? NUMBER_OPTIONS
812
+ : formatOptions }), formData.pivot === null && ((0, jsx_runtime_1.jsx)("div", { ref: deleteRef, children: (0, jsx_runtime_1.jsx)(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))) }), formData.pivot === null && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" })] }))] })), (0, jsx_runtime_1.jsx)("br", {})] })), (showTableFormatOptions || formData.chartType === 'table') && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
813
+ display: 'flex',
814
+ flexDirection: 'column',
815
+ gap: 6,
816
+ marginTop: 6,
817
+ }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Table" }), (0, jsx_runtime_1.jsx)(Label, { children: "Columns" })] }), (0, jsx_runtime_1.jsx)("div", { style: {
818
+ display: 'flex',
819
+ flexDirection: 'column',
820
+ gap: 10,
821
+ }, children: formData.pivot &&
822
+ selectedPivotTable &&
823
+ selectedPivotTable.columns &&
824
+ formData.chartType === 'table'
825
+ ? // THIS CASE IF FOR PIVOT TABLES ONLY
826
+ selectedPivotTable.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
827
+ display: 'flex',
828
+ flexDirection: 'row',
829
+ gap: 12,
830
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: column.label, onChange: (e) => handleChange(e, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
831
+ label: elem.label,
832
+ value: elem.label,
833
+ })) }), (0, jsx_runtime_1.jsx)(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value:
834
+ // The first index use rowField for the rest of them use value fields
835
+ formData.pivot &&
836
+ column.field === formData.pivot.rowField
837
+ ? formData.pivot &&
838
+ (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
839
+ ? 'pivot_date'
840
+ : 'string'
841
+ : formData.pivot?.valueFieldType ||
842
+ 'whole_number', onChange: (e) => handleChange(e, 'pivotColumn', index), options: formData.pivot && index === 0
843
+ ? (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
844
+ ? [{ label: 'date', value: 'pivot_date' }]
845
+ : [{ label: 'string', value: 'string' }]
846
+ : [...NUMBER_OPTIONS] })] }, 'column' + index)))
847
+ : formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
707
848
  display: 'flex',
708
849
  flexDirection: 'row',
709
850
  gap: 12,
710
- }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: column.label, onChange: (e) => handleChange(e, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
711
- label: elem.label,
712
- value: elem.label,
713
- })) }), (0, jsx_runtime_1.jsx)(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value:
714
- // The first index use rowField for the rest of them use value fields
715
- formData.pivot &&
716
- column.field === formData.pivot.rowField
717
- ? formData.pivot &&
718
- (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
719
- ? 'pivot_date'
720
- : 'string'
721
- : formData.pivot?.valueFieldType ||
722
- 'whole_number', onChange: (e) => handleChange(e, 'pivotColumn', index), options: formData.pivot && index === 0
723
- ? (0, PivotModal_1.isDateField)(formData.pivot.rowFieldType)
724
- ? [{ label: 'date', value: 'pivot_date' }]
725
- : [{ label: 'string', value: 'string' }]
726
- : [...NUMBER_OPTIONS] })] }, 'column' + index)))
727
- : formData.columns.map((column, index) => ((0, jsx_runtime_1.jsxs)("div", { style: {
728
- display: 'flex',
729
- flexDirection: 'row',
730
- gap: 12,
731
- }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: column.field, onChange: (e) => handleChange(e, 'columns.field', index), options: fields.map((elem) => ({
732
- label: elem.field,
733
- value: elem.field,
734
- })) }), (0, jsx_runtime_1.jsx)(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: column.format, onChange: (e) => handleChange(e, 'columns.format', index), options: formatOptions }), (0, jsx_runtime_1.jsx)("div", { ref: deleteRef, children: (0, jsx_runtime_1.jsx)(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => handleAddField('columns'), label: "Add column +" }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {})] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
735
- display: 'flex',
736
- flexDirection: 'column',
737
- gap: 6,
738
- marginTop: 6,
739
- }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Date field" }), (0, jsx_runtime_1.jsxs)("div", { style: {
740
- display: 'flex',
741
- flexDirection: 'row',
742
- gap: 12,
743
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Table" }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: formData.dateField?.table, onChange: (e) => handleChange(e, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
744
- label: elem.name,
745
- value: elem.name,
746
- })) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Field" }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e, 'dateField.field'), options: dateFieldOptions
747
- ?.find((elem) => elem.name === formData.dateField?.table)
748
- ?.columns?.map((elem) => ({
749
- label: elem.name,
750
- value: elem.name,
751
- })) || [] })] })] }), (0, jsx_runtime_1.jsx)("br", {})] })), showAccessControlOptions && ((0, jsx_runtime_1.jsxs)("div", { style: {
752
- display: 'flex',
753
- flexDirection: 'column',
754
- gap: 12,
755
- marginTop: 6,
756
- }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Organization access" }), (0, jsx_runtime_1.jsx)(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName || 'This Organization' })] }))] }), (0, jsx_runtime_1.jsxs)("div", { style: {
757
- display: 'flex',
758
- flexDirection: 'row',
759
- justifyContent: 'flex-end',
760
- marginTop: 'auto',
761
- gap: 10,
762
- }, children: [!horizontalView && dashboardItem && ((0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: deleteChart, label: 'Delete' })), (0, jsx_runtime_1.jsx)(Button, { onClick: editChart, label: buttonLabel
763
- ? buttonLabel
764
- : dashboardItem
765
- ? 'Save changes'
766
- : 'Add to dashboard' })] })] }))] }) }));
851
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: column.field, onChange: (e) => handleChange(e, 'columns.field', index), options: fields.map((elem) => ({
852
+ label: elem.field,
853
+ value: elem.field,
854
+ })) }), (0, jsx_runtime_1.jsx)(TextInput, { id: `chart-builder-column-label-${index}`, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e, 'columns.label', index), theme: theme }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: column.format, onChange: (e) => handleChange(e, 'columns.format', index), options: formatOptions }), (0, jsx_runtime_1.jsx)("div", { ref: deleteRef, children: (0, jsx_runtime_1.jsx)(DeleteButton, { style: { marginLeft: deleteButtonMargin }, onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))) }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => handleAddField('columns'), label: "Add column +" }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {})] })), showDateFieldOptions && formData.dateField && ((0, jsx_runtime_1.jsxs)("div", { style: {
855
+ display: 'flex',
856
+ flexDirection: 'column',
857
+ gap: 6,
858
+ marginTop: 6,
859
+ }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Date field" }), (0, jsx_runtime_1.jsxs)("div", { style: {
860
+ display: 'flex',
861
+ flexDirection: 'row',
862
+ gap: 12,
863
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Table" }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: formData.dateField?.table, onChange: (e) => handleChange(e, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
864
+ label: elem.name,
865
+ value: elem.name,
866
+ })) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsx)(Label, { children: "Field" }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: (0, textProcessing_1.removeDoubleQuotes)(formData.dateField?.field), onChange: (e) => handleChange(e, 'dateField.field'), options: dateFieldOptions
867
+ ?.find((elem) => elem.name === formData.dateField?.table)
868
+ ?.columns?.map((elem) => ({
869
+ label: elem.name,
870
+ value: elem.name,
871
+ })) || [] })] })] }), (0, jsx_runtime_1.jsx)("br", {})] })), showAccessControlOptions && ((0, jsx_runtime_1.jsxs)("div", { style: {
872
+ display: 'flex',
873
+ flexDirection: 'column',
874
+ gap: 12,
875
+ marginTop: 6,
876
+ }, children: [(0, jsx_runtime_1.jsx)(Header, { children: "Organization access" }), (0, jsx_runtime_1.jsx)(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template, theme: theme, organizationName: organizationName })] }))] }), (0, jsx_runtime_1.jsxs)("div", { style: {
877
+ display: 'flex',
878
+ flexDirection: 'row',
879
+ justifyContent: 'flex-end',
880
+ marginTop: 'auto',
881
+ gap: 10,
882
+ }, children: [!horizontalView && dashboardItem && ((0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: deleteChart, label: 'Delete' })), (0, jsx_runtime_1.jsx)(Button, { onClick: () => editChart(), label: buttonLabel
883
+ ? buttonLabel
884
+ : dashboardItem
885
+ ? 'Save changes'
886
+ : 'Add to dashboard' })] })] }))] }), (0, jsx_runtime_1.jsx)(DashboardFilterModal, { isOpen: showFilterModal, setIsOpen: setShowFilterModal, override: () => editChart(true), theme: theme, issues: filterIssues })] }));
767
887
  }
768
888
  exports.default = ChartBuilder;
769
889
  function SegmentedControl({ onChange, value, theme, organizationName, }) {
@@ -772,7 +892,7 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
772
892
  flexDirection: 'row',
773
893
  alignItems: 'center',
774
894
  background: '#F5F5F6',
775
- maxWidth: 418,
895
+ maxWidth: organizationName ? 418 : 209,
776
896
  padding: 4,
777
897
  borderRadius: 6,
778
898
  }, children: [(0, jsx_runtime_1.jsxs)("button", { className: "quill-tab", onClick: () => onChange(true), style: {
@@ -798,7 +918,7 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
798
918
  .quill-tab:active {
799
919
  background-color: "rgba(56, 65, 81, 0.15)";
800
920
  }
801
- ` }), 'All Organizations'] }), (0, jsx_runtime_1.jsxs)("button", { className: "quill-tab2", onClick: () => onChange(false), style: {
921
+ ` }), 'All Organizations'] }), organizationName && ((0, jsx_runtime_1.jsxs)("button", { className: "quill-tab2", onClick: () => onChange(false), style: {
802
922
  border: value === false ? '1px solid #E7E7E7' : '1px solid transparent',
803
923
  boxShadow: value === false
804
924
  ? '0px 1px 4px 0px rgba(56, 65, 81, 0.08)'
@@ -806,7 +926,9 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
806
926
  outline: 'none',
807
927
  width: '100%',
808
928
  borderRadius: 4,
809
- color: value === false ? 'rgba(56, 65, 81, 1)' : 'rgba(56, 65, 81, 0.85)',
929
+ color: value === false
930
+ ? 'rgba(56, 65, 81, 1)'
931
+ : 'rgba(56, 65, 81, 0.85)',
810
932
  padding: 10,
811
933
  fontWeight: value === false ? 600 : 500,
812
934
  fontSize: 14,
@@ -824,5 +946,25 @@ function SegmentedControl({ onChange, value, theme, organizationName, }) {
824
946
  .quill-tab2:active {
825
947
  background-color: "rgba(56, 65, 81, 0.15)";
826
948
  }
827
- ` }), organizationName] })] }));
949
+ ` }), organizationName] }))] }));
950
+ }
951
+ function DashboardFilterModal({ isOpen, setIsOpen, override, theme, issues, }) {
952
+ return ((0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedModal, { isOpen: isOpen, onClose: () => {
953
+ setIsOpen(false);
954
+ }, setIsOpen: setIsOpen, theme: theme, title: 'Chart not compatible with selected dashboard', children: (0, jsx_runtime_1.jsxs)("div", { style: {
955
+ display: 'flex',
956
+ flexDirection: 'column',
957
+ width: '600px',
958
+ padding: '20px',
959
+ boxSizing: 'border-box',
960
+ }, children: [issues.map((issue, index) => ((0, jsx_runtime_1.jsx)("span", { style: { paddingTop: '10px' }, children: issue }, issue))), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("div", { style: {
961
+ display: 'flex',
962
+ flexDirection: 'row',
963
+ gap: '12px',
964
+ justifyContent: 'flex-end',
965
+ }, children: [(0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedButton, { label: "Got It", onClick: () => setIsOpen(false) }), (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedSecondaryButton, { label: "Override", onClick: () => {
966
+ override();
967
+ setIsOpen(false);
968
+ } })] })] }) }));
828
969
  }
970
+ exports.DashboardFilterModal = DashboardFilterModal;