@quillsql/react 2.6.4 → 2.6.6

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.
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getPostgresBasicType = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- // @ts-nocheck
8
+ // // @ts-nocheck
9
9
  const react_1 = require("react");
10
10
  // import './nightOwlLight.css';
11
11
  const Context_1 = require("./Context");
@@ -13,13 +13,14 @@ const SQLEditor_1 = require("./SQLEditor");
13
13
  const date_fns_1 = require("date-fns");
14
14
  const PivotModal_1 = require("./internals/ReportBuilder/PivotModal");
15
15
  const dataFetcher_1 = require("./utils/dataFetcher");
16
+ const Dashboard_1 = require("./Dashboard");
16
17
  const dateRangePickerUtils_1 = require("./DateRangePicker/dateRangePickerUtils");
17
18
  const Table_1 = __importDefault(require("./Table"));
18
19
  const ChartBuilder_1 = __importDefault(require("./ChartBuilder"));
19
20
  const UiComponents_1 = require("./components/UiComponents");
20
- function ReportBuilder({ onChangeQuery, onChangeData, onChangeColumns, onChangeLoading, onChangePivot, onDateFilterChange, onChangeFields, onError, TextInput = UiComponents_1.MemoizedTextInput, containerStyle, Select = UiComponents_1.MemoizedSelect, Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, Header = UiComponents_1.MemoizedHeader, Label = UiComponents_1.MemoizedLabel, DeleteButton = UiComponents_1.MemoizedDeleteButton, Text = UiComponents_1.MemoizedText, Modal = UiComponents_1.MemoizedModal, Popover = UiComponents_1.MemoizedPopover, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, tagStyle, tableName, dateColumn, selectedTagBorderColor, chartBuilderEnabled = false, }) {
21
+ function ReportBuilder({ onChangeQuery, onChangeData, onChangeColumns, onChangeLoading, onChangePivot, onDateFilterChange, onChangeFields, onError, TextInput = UiComponents_1.MemoizedTextInput, containerStyle, Select = UiComponents_1.MemoizedSelect, Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, Header = UiComponents_1.MemoizedHeader, Label = UiComponents_1.MemoizedLabel, DeleteButton = UiComponents_1.MemoizedDeleteButton, Text = UiComponents_1.MemoizedText, Modal = UiComponents_1.MemoizedModal, Popover = UiComponents_1.MemoizedPopover, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, tagStyle, tableName, dateColumn, selectedTagBorderColor, chartBuilderEnabled = false, destinationDashboard, chartBuilderTitle, chartBuilderButtonLabel, editSQLEnabled, navigateToSQLEditor, }) {
21
22
  const [data, setData] = (0, react_1.useState)([]);
22
- const [client] = (0, react_1.useContext)(Context_1.ClientContext);
23
+ const [client, setClient] = (0, react_1.useContext)(Context_1.ClientContext);
23
24
  const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
24
25
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
25
26
  const [columns, setColumns] = (0, react_1.useState)([]);
@@ -28,6 +29,26 @@ function ReportBuilder({ onChangeQuery, onChangeData, onChangeColumns, onChangeL
28
29
  const [selectedPivot, setSelectedPivot] = (0, react_1.useState)(null);
29
30
  const defaultDateRange = (0, dateRangePickerUtils_1.getRangeFromPreset)('90d');
30
31
  const [dateRange, setDateRange] = (0, react_1.useState)(defaultDateRange);
32
+ (0, react_1.useEffect)(() => {
33
+ let isSubscribed = true;
34
+ async function getClient() {
35
+ try {
36
+ const resp = await (0, dataFetcher_1.getDataFromCloud)(client, `client/${client.publicKey}/`, null, 'GET');
37
+ if (resp) {
38
+ setClient({ ...client, ...resp.client });
39
+ }
40
+ }
41
+ catch (error) {
42
+ console.error('ERROR getting client:', error);
43
+ }
44
+ }
45
+ if (isSubscribed) {
46
+ getClient();
47
+ }
48
+ return () => {
49
+ isSubscribed = false;
50
+ };
51
+ }, []);
31
52
  (0, react_1.useEffect)(() => {
32
53
  let isSubscribed = true;
33
54
  async function getSchema() {
@@ -108,7 +129,7 @@ function ReportBuilder({ onChangeQuery, onChangeData, onChangeColumns, onChangeL
108
129
  if (!schema || !schema.length || !tableName) {
109
130
  return null;
110
131
  }
111
- return ((0, jsx_runtime_1.jsx)(ReportingTool, { containerStyle: containerStyle, theme: theme, data: data, columns: columns, fields: fields, onChangeData: onChangeData, onChangeColumns: onChangeColumns, onChangePivot: onChangePivot, selectedPivot: selectedPivot, setSelectedPivot: pivot => {
132
+ return ((0, jsx_runtime_1.jsx)(ReportingTool, { containerStyle: containerStyle, destinationDashboard: destinationDashboard, client: client, editSQLEnabled: editSQLEnabled, navigateToSQLEditor: navigateToSQLEditor, theme: theme, data: data, columns: columns, fields: fields, chartBuilderTitle: chartBuilderTitle, chartBuilderButtonLabel: chartBuilderButtonLabel, onChangeData: onChangeData, onChangeColumns: onChangeColumns, onChangePivot: onChangePivot, selectedPivot: selectedPivot, setSelectedPivot: pivot => {
112
133
  setSelectedPivot(pivot);
113
134
  if (onChangePivot) {
114
135
  const table = pivot
@@ -116,7 +137,7 @@ function ReportBuilder({ onChangeQuery, onChangeData, onChangeColumns, onChangeL
116
137
  : { rows: null, columns: null };
117
138
  onChangePivot(pivot, table.columns, table.rows);
118
139
  }
119
- }, schema: schema, tableName: tableName, dateColumn: dateColumn, selectedTagBorderColor: selectedTagBorderColor, onChangeQuery: onChangeQuery, runQuery: runQuery, dateRange: dateRange, setDateRange: setDateRange, defaultDateRange: defaultDateRange, chartBuilderEnabled: chartBuilderEnabled, HeaderComponent: Header, LabelComponent: Label, SelectComponent: Select, TextComponent: Text, ButtonComponent: Button, ModalComponent: Modal, PopoverComponent: Popover, TextInputComponent: TextInput, tagStyle: tagStyle, showTableFormatOptions: showTableFormatOptions, showDateFieldOptions: showDateFieldOptions, showAccessControlOptions: showAccessControlOptions }));
140
+ }, schema: schema, tableName: tableName, dateColumn: dateColumn, selectedTagBorderColor: selectedTagBorderColor, onChangeQuery: onChangeQuery, runQuery: runQuery, dateRange: dateRange, setDateRange: setDateRange, defaultDateRange: defaultDateRange, chartBuilderEnabled: chartBuilderEnabled, HeaderComponent: Header, LabelComponent: Label, SelectComponent: Select, TextComponent: Text, ButtonComponent: Button, SecondaryButtonComponent: SecondaryButton, ModalComponent: Modal, PopoverComponent: Popover, TextInputComponent: TextInput, tagStyle: tagStyle, showTableFormatOptions: showTableFormatOptions, showDateFieldOptions: showDateFieldOptions, showAccessControlOptions: showAccessControlOptions }));
120
141
  }
121
142
  exports.default = ReportBuilder;
122
143
  function getPostgresBasicType(column) {
@@ -168,31 +189,157 @@ function getPostgresBasicType(column) {
168
189
  return format;
169
190
  }
170
191
  exports.getPostgresBasicType = getPostgresBasicType;
171
- const newDateWhereAST = (column, dateRange) => {
172
- return {
173
- type: 'binary_expr',
174
- operator: 'BETWEEN',
175
- left: {
176
- type: 'column_ref',
177
- table: null,
178
- column: column,
179
- },
180
- right: {
181
- type: 'expr_list',
182
- value: [
183
- {
184
- type: 'single_quote_string',
185
- value: (0, date_fns_1.format)(new Date(dateRange[0]), 'MM/dd/yyyy'),
186
- },
187
- {
188
- type: 'single_quote_string',
189
- value: (0, date_fns_1.format)(new Date(dateRange[1]), 'MM/dd/yyyy'),
190
- },
191
- ],
192
- },
193
- };
192
+ const newDateWhereAST = (column, dateRange, databaseType) => {
193
+ // all time means no filter
194
+ if (dateRange[2] === 'at') {
195
+ return null;
196
+ }
197
+ // if using preset
198
+ if (dateRange[2]) {
199
+ const timeInterval = dateRangePickerUtils_1.reportBuilderOptions.find(elem => elem.value === dateRange[2])?.dayInterval;
200
+ switch (databaseType) {
201
+ case 'BigQuery': {
202
+ return {
203
+ type: 'binary_expr',
204
+ operator: 'BETWEEN',
205
+ left: {
206
+ type: 'function',
207
+ name: 'Date',
208
+ args: {
209
+ type: 'expr_list',
210
+ value: [
211
+ {
212
+ type: 'column_ref',
213
+ table: null,
214
+ column: column,
215
+ },
216
+ ],
217
+ },
218
+ over: null,
219
+ },
220
+ right: {
221
+ type: 'expr_list',
222
+ value: [
223
+ {
224
+ type: 'function',
225
+ name: 'DATE_SUB',
226
+ args: {
227
+ type: 'expr_list',
228
+ value: [
229
+ {
230
+ type: 'function',
231
+ name: 'CURRENT_DATE',
232
+ args: {
233
+ type: 'expr_list',
234
+ value: [],
235
+ },
236
+ over: null,
237
+ },
238
+ {
239
+ type: 'interval',
240
+ expr: {
241
+ type: 'number',
242
+ value: timeInterval,
243
+ },
244
+ unit: 'day',
245
+ },
246
+ ],
247
+ },
248
+ over: null,
249
+ },
250
+ {
251
+ type: 'function',
252
+ name: 'CURRENT_DATE',
253
+ args: {
254
+ type: 'expr_list',
255
+ value: [],
256
+ },
257
+ over: null,
258
+ },
259
+ ],
260
+ },
261
+ };
262
+ }
263
+ default: {
264
+ return {
265
+ type: 'binary_expr',
266
+ operator: 'AND',
267
+ left: {
268
+ type: 'binary_expr',
269
+ operator: '>=',
270
+ left: {
271
+ type: 'column_ref',
272
+ table: null,
273
+ column: column,
274
+ },
275
+ right: {
276
+ type: 'binary_expr',
277
+ operator: '-',
278
+ left: {
279
+ type: 'function',
280
+ name: 'now',
281
+ args: {
282
+ type: 'expr_list',
283
+ value: [],
284
+ },
285
+ },
286
+ right: {
287
+ type: 'interval',
288
+ expr: {
289
+ type: 'single_quote_string',
290
+ value: `${timeInterval} day`,
291
+ },
292
+ unit: '',
293
+ },
294
+ },
295
+ },
296
+ right: {
297
+ type: 'binary_expr',
298
+ operator: '<=',
299
+ left: {
300
+ type: 'column_ref',
301
+ table: null,
302
+ column: column,
303
+ },
304
+ right: {
305
+ type: 'function',
306
+ name: 'now',
307
+ args: {
308
+ type: 'expr_list',
309
+ value: [],
310
+ },
311
+ },
312
+ },
313
+ };
314
+ }
315
+ }
316
+ }
317
+ else {
318
+ return {
319
+ type: 'binary_expr',
320
+ operator: 'BETWEEN',
321
+ left: {
322
+ type: 'column_ref',
323
+ table: null,
324
+ column: column,
325
+ },
326
+ right: {
327
+ type: 'expr_list',
328
+ value: [
329
+ {
330
+ type: 'single_quote_string',
331
+ value: (0, date_fns_1.format)(new Date(dateRange[0]), 'MM/dd/yyyy'),
332
+ },
333
+ {
334
+ type: 'single_quote_string',
335
+ value: (0, date_fns_1.format)(new Date(dateRange[1]), 'MM/dd/yyyy'),
336
+ },
337
+ ],
338
+ },
339
+ };
340
+ }
194
341
  };
195
- function ReportingTool({ schema, data, columns, runQuery, SelectComponent, ButtonComponent, onChangeQuery, onChangePivot, selectedPivot, setSelectedPivot, theme, ModalComponent, HeaderComponent, PopoverComponent, TextComponent, TextInputComponent, LabelComponent, tagStyle, tableName, dateColumn, selectedTagBorderColor, dateRange, setDateRange, defaultDateRange, chartBuilderEnabled, fields, containerStyle, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, }) {
342
+ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, ButtonComponent, SecondaryButtonComponent, editSQLEnabled, navigateToSQLEditor, onChangeQuery, onChangePivot, selectedPivot, setSelectedPivot, theme, ModalComponent, HeaderComponent, PopoverComponent, TextComponent, TextInputComponent, LabelComponent, tagStyle, tableName, dateColumn, selectedTagBorderColor, dateRange, setDateRange, defaultDateRange, chartBuilderEnabled, fields, containerStyle, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, client, destinationDashboard, chartBuilderTitle, chartBuilderButtonLabel, }) {
196
343
  const selectedTable = (0, react_1.useMemo)(() => schema.find(t => t.displayName === tableName), [schema, tableName]);
197
344
  const [selectedColumn, setSelectedColumn] = (0, react_1.useState)(schema[0].columns.find(elem => elem.name !== 'id'));
198
345
  const parentRef = (0, react_1.useRef)();
@@ -205,21 +352,23 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
205
352
  columns: '*',
206
353
  into: { position: null },
207
354
  from: [{ db: null, table: selectedTable.displayName, as: null }],
208
- where: newDateWhereAST(dateColumn, defaultDateRange),
355
+ // where: newDateWhereAST(dateColumn, defaultDateRange),
356
+ where: null,
209
357
  groupby: null,
210
358
  having: null,
211
359
  orderby: null,
212
360
  limit: { seperator: '', value: [] },
213
361
  window: null,
214
362
  });
363
+ const [ASTNoDateColumn, setASTNoDateColumn] = (0, react_1.useState)(AST);
215
364
  const [numberStart, setNumberStart] = (0, react_1.useState)(0);
216
365
  const [numberEnd, setNumberEnd] = (0, react_1.useState)(0);
217
- const [dateStart, setDateStart] = (0, react_1.useState)('');
218
- const [dateEnd, setDateEnd] = (0, react_1.useState)('');
366
+ const [filterDateRange, setFilterDateRange] = (0, react_1.useState)((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
219
367
  const [computedColumns, setComputedColumns] = (0, react_1.useState)({});
220
368
  const [stringFilterValues, setStringFilterValues] = (0, react_1.useState)([]);
221
369
  const [columnType, setColumnType] = (0, react_1.useState)(getPostgresBasicType(schema[0].columns[0]));
222
370
  const [sqlQuery, setSqlQuery] = (0, react_1.useState)('');
371
+ const [sqlQueryNoDateColumn, setSqlQueryNoDateColumn] = (0, react_1.useState)('');
223
372
  const [indexBeingEdited, setIndexBeingEdited] = (0, react_1.useState)(-1);
224
373
  const [isAddFilterModalOpen, setIsAddFilterModalOpen] = (0, react_1.useState)(false);
225
374
  const [isEdittingPivot, setIsEdittingPivot] = (0, react_1.useState)(false);
@@ -244,6 +393,14 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
244
393
  const selectFilter = index => {
245
394
  const filter = filters[index];
246
395
  const matchingColumn = selectedTable.columns.find(column => column.name === filter.column);
396
+ if (indexBeingEdited === index) {
397
+ setIndexBeingEdited(-1);
398
+ setStringFilterValues([]);
399
+ setNumberStart(0);
400
+ setNumberEnd(0);
401
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
402
+ return;
403
+ }
247
404
  setSelectedColumn(matchingColumn);
248
405
  if (filter.columnType === 'string') {
249
406
  setStringFilterValues(filter.stringFilterValues);
@@ -255,8 +412,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
255
412
  setIndexBeingEdited(index);
256
413
  }
257
414
  else if (filter.columnType === 'date') {
258
- setDateStart(filter.dateStart);
259
- setDateEnd(filter.dateEnd);
415
+ setFilterDateRange(filter.filterDateRange);
260
416
  setIndexBeingEdited(index);
261
417
  }
262
418
  };
@@ -311,14 +467,17 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
311
467
  });
312
468
  }
313
469
  else if (columnType === 'date') {
470
+ const label = filterDateRange[2]
471
+ ? dateRangePickerUtils_1.reportBuilderOptions.find(elem => elem.value === filterDateRange[2])
472
+ ?.text
473
+ : `${(0, date_fns_1.format)(new Date(filterDateRange[0]), 'MMM dd')} - ${(0, date_fns_1.format)(new Date(filterDateRange[1]), 'MMM dd')}`;
314
474
  setFilters(filters => {
315
475
  const newFilters = [...filters];
316
476
  newFilters[index] = {
317
477
  column: selectedColumn.name,
318
478
  columnType,
319
- dateStart,
320
- dateEnd,
321
- tag: `${selectedColumn.name} (${(0, date_fns_1.format)(new Date(dateStart), 'MMM dd')} - ${(0, date_fns_1.format)(new Date(dateEnd), 'MMM dd')})`,
479
+ filterDateRange,
480
+ tag: `${selectedColumn.name} (${label})`,
322
481
  };
323
482
  return newFilters;
324
483
  });
@@ -326,14 +485,13 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
326
485
  setStringFilterValues([]);
327
486
  setNumberStart(0);
328
487
  setNumberEnd(0);
329
- setDateStart('');
330
- setDateEnd('');
488
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
331
489
  setIndexBeingEdited(-1);
332
490
  return;
333
491
  }
334
492
  };
335
493
  // ADD FILTER TO "FILTERS" ARRAY
336
- const addFilter = () => {
494
+ const addFilter = async () => {
337
495
  if (selectedColumn && columnType) {
338
496
  // const type = getPostgresBasicType(selectedColumn);
339
497
  let newCondition;
@@ -352,8 +510,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
352
510
  setStringFilterValues([]);
353
511
  setNumberStart(0);
354
512
  setNumberEnd(0);
355
- setDateStart('');
356
- setDateEnd('');
513
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
357
514
  return;
358
515
  }
359
516
  else if (columnType === 'number') {
@@ -372,28 +529,29 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
372
529
  setStringFilterValues([]);
373
530
  setNumberStart(0);
374
531
  setNumberEnd(0);
375
- setDateStart('');
376
- setDateEnd('');
532
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
377
533
  return;
378
534
  }
379
535
  else if (columnType === 'date') {
536
+ const label = filterDateRange[2]
537
+ ? dateRangePickerUtils_1.reportBuilderOptions.find(elem => elem.value === filterDateRange[2])
538
+ ?.text
539
+ : `${(0, date_fns_1.format)(new Date(filterDateRange[0]), 'MMM dd')} - ${(0, date_fns_1.format)(new Date(filterDateRange[1]), 'MMM dd')}`;
380
540
  setFilters(filters => {
381
541
  return [
382
542
  ...filters,
383
543
  {
384
544
  column: selectedColumn.name,
385
545
  columnType,
386
- dateStart,
387
- dateEnd,
388
- tag: `${selectedColumn.name} (${(0, date_fns_1.format)(new Date(dateStart), 'MMM dd')} - ${(0, date_fns_1.format)(new Date(dateEnd), 'MMM dd')})`,
546
+ filterDateRange,
547
+ tag: `${selectedColumn.name} (${label})`,
389
548
  },
390
549
  ];
391
550
  });
392
551
  setStringFilterValues([]);
393
552
  setNumberStart(0);
394
553
  setNumberEnd(0);
395
- setDateStart('');
396
- setDateEnd('');
554
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
397
555
  }
398
556
  }
399
557
  };
@@ -409,29 +567,28 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
409
567
  setSelectedColumn(selectedTable.columns.find(elem => elem.name !== 'id'));
410
568
  setFilters([]);
411
569
  removePivot();
412
- setAST(AST => {
413
- return {
414
- with: null,
415
- type: 'select',
416
- options: null,
417
- distinct: { type: null },
418
- columns: '*',
419
- into: { position: null },
420
- // where: newDateWhereAST(dateColumn, defaultDateRange),
421
- where: null,
422
- groupby: null,
423
- having: null,
424
- orderby: null,
425
- limit: { seperator: '', value: [] },
426
- window: null,
427
- from: [{ db: null, table: selectedTable.displayName, as: null }],
428
- };
429
- });
570
+ const resetAST = {
571
+ with: null,
572
+ type: 'select',
573
+ options: null,
574
+ distinct: { type: null },
575
+ columns: '*',
576
+ into: { position: null },
577
+ // where: newDateWhereAST(dateColumn, defaultDateRange),
578
+ where: null,
579
+ groupby: null,
580
+ having: null,
581
+ orderby: null,
582
+ limit: { seperator: '', value: [] },
583
+ window: null,
584
+ from: [{ db: null, table: selectedTable.displayName, as: null }],
585
+ };
586
+ setAST(resetAST);
587
+ setASTNoDateColumn(resetAST);
430
588
  return;
431
589
  }
432
590
  }, [selectedTable]);
433
- // USE EFFECT HOOK THAT TRANSFORMS "FILTERS ARRAY INTO AST"
434
- (0, react_1.useEffect)(() => {
591
+ const generateNewAST = includeDateColumn => {
435
592
  if (filters.length || dateRange) {
436
593
  const newAST = {
437
594
  with: null,
@@ -452,8 +609,11 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
452
609
  // FILTERS
453
610
  for (let i = 0; i < filters.length; i++) {
454
611
  const filter = filters[i];
455
- const { column, columnType, stringFilterValues, numberStart, numberEnd, dateStart, dateEnd, } = filter;
612
+ const { column, columnType, stringFilterValues, numberStart, numberEnd, filterDateRange, } = filter;
456
613
  let newCondition;
614
+ if (column === dateColumn && !includeDateColumn) {
615
+ continue;
616
+ }
457
617
  if (columnType === 'string') {
458
618
  newCondition = {
459
619
  type: 'binary_expr',
@@ -491,7 +651,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
491
651
  };
492
652
  }
493
653
  else if (columnType === 'date') {
494
- newCondition = newDateWhereAST(column, [dateStart, dateEnd]);
654
+ newCondition = newDateWhereAST(column, filterDateRange, client.databaseType);
495
655
  }
496
656
  if (!newAST.where) {
497
657
  newAST.where = newCondition;
@@ -505,7 +665,14 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
505
665
  };
506
666
  }
507
667
  }
508
- setAST(newAST);
668
+ return newAST;
669
+ }
670
+ };
671
+ // USE EFFECT HOOK THAT TRANSFORMS "FILTERS ARRAY INTO AST"
672
+ (0, react_1.useEffect)(() => {
673
+ if (filters.length || dateRange) {
674
+ setAST(generateNewAST(true));
675
+ setASTNoDateColumn(generateNewAST(false));
509
676
  }
510
677
  }, [filters, dateRange]);
511
678
  const removeFilter = index => {
@@ -573,7 +740,9 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
573
740
  const getSqlQueryFromAST = async () => {
574
741
  try {
575
742
  if (AST && AST.from[0].table) {
576
- const resp = await (0, dataFetcher_1.getDataFromCloud)(null, 'sqlify', { ast: AST });
743
+ const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'sqlify', {
744
+ ast: AST,
745
+ });
577
746
  const newSqlQuery = resp.query; // assuming the response contains the SQL query
578
747
  if (newSqlQuery && newSqlQuery !== sqlQuery) {
579
748
  onChangeQuery(newSqlQuery);
@@ -588,6 +757,25 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
588
757
  };
589
758
  getSqlQueryFromAST();
590
759
  }, [AST]);
760
+ (0, react_1.useEffect)(() => {
761
+ const getSqlQueryFromAST = async () => {
762
+ try {
763
+ if (ASTNoDateColumn && ASTNoDateColumn.from[0].table) {
764
+ const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'sqlify', {
765
+ ast: ASTNoDateColumn,
766
+ });
767
+ const newSqlQuery = resp.query; // assuming the response contains the SQL query
768
+ if (newSqlQuery && newSqlQuery !== sqlQueryNoDateColumn) {
769
+ setSqlQueryNoDateColumn(newSqlQuery);
770
+ }
771
+ }
772
+ }
773
+ catch (err) {
774
+ console.error(err);
775
+ }
776
+ };
777
+ getSqlQueryFromAST();
778
+ }, [ASTNoDateColumn]);
591
779
  if (!schema || !schema.length) {
592
780
  return null;
593
781
  }
@@ -596,7 +784,11 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
596
784
  // marginLeft: '25px',
597
785
  // marginRight: '25px',
598
786
  justifyContent: 'end',
599
- }, children: (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: '12px' }, children: [(0, jsx_runtime_1.jsx)(AddFilterModal2, { filters: filters, selectedColumn: selectedColumn, numberStart: numberStart, numberEnd: numberEnd, dateStart: dateStart, setDateStart: setDateStart, columnStats: columnStats, stringFilterValues: stringFilterValues, setStringFilterValues: setStringFilterValues, addFilter: addFilter, parentRef: parentRef, setSelectedColumn: setSelectedColumn, setNumberStart: setNumberStart, setNumberEnd: setNumberEnd, selectedTable: selectedTable, columnType: columnType, dateEnd: dateEnd, setDateEnd: setDateEnd, removeFilter: removeFilter, selectFilter: selectFilter, indexBeingEdited: indexBeingEdited, updateFilter: updateFilter, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextInputComponent: TextInputComponent, LabelComponent: LabelComponent, tagStyle: tagStyle, theme: theme, setIsOpen: setIsAddFilterModalOpen, isOpen: isAddFilterModalOpen, selectedTagBorderColor: selectedTagBorderColor }), (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, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, TextComponent: TextComponent, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, theme: theme, data: data, parentRef: parentRef, columns: columns, setIsOpen: setIsPivotModalOpen, isOpen: isPivotModalOpen, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: removePivot, selectPivot: selectPivot, dateRange: dateRange, rightAlign: true })] }) }), (0, jsx_runtime_1.jsx)(Table_1.default, { rows: selectedPivotTable?.rows || data, columns: selectedPivotTable?.columns || columns, containerStyle: {
787
+ }, children: (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: '12px' }, children: [editSQLEnabled && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
788
+ if (navigateToSQLEditor) {
789
+ navigateToSQLEditor(sqlQuery);
790
+ }
791
+ }, label: "Edit Query" })), (0, jsx_runtime_1.jsx)(AddFilterModal2, { filters: filters, selectedColumn: selectedColumn, numberStart: numberStart, numberEnd: numberEnd, setDateRange: setFilterDateRange, dateRange: filterDateRange, columnStats: columnStats, stringFilterValues: stringFilterValues, setStringFilterValues: setStringFilterValues, addFilter: addFilter, parentRef: parentRef, setSelectedColumn: setSelectedColumn, setNumberStart: setNumberStart, setNumberEnd: setNumberEnd, selectedTable: selectedTable, columnType: columnType, removeFilter: removeFilter, selectFilter: selectFilter, indexBeingEdited: indexBeingEdited, updateFilter: updateFilter, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextInputComponent: TextInputComponent, LabelComponent: LabelComponent, tagStyle: tagStyle, theme: theme, setIsOpen: setIsAddFilterModalOpen, isOpen: isAddFilterModalOpen, selectedTagBorderColor: selectedTagBorderColor }), (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, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, TextComponent: TextComponent, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, theme: theme, data: data, parentRef: parentRef, columns: columns, setIsOpen: setIsPivotModalOpen, isOpen: isPivotModalOpen, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: removePivot, selectPivot: selectPivot, dateRange: dateRange, rightAlign: true })] }) }), (0, jsx_runtime_1.jsx)(Table_1.default, { rows: selectedPivotTable?.rows || data, columns: selectedPivotTable?.columns || columns, containerStyle: {
600
792
  height: 400,
601
793
  marginTop: 10,
602
794
  } }), chartBuilderEnabled && columns.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { style: {
@@ -607,7 +799,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
607
799
  width: '100%',
608
800
  height: '70px',
609
801
  gap: '8px',
610
- }, children: (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => setIsChartBuilderOpen(true), label: "Add to dashboard" }) }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.default, { rows: data, columns: columns, fields: fields, query: sqlQuery, pivot: selectedPivot, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, showTableFormatOptions: showTableFormatOptions, showDateFieldOptions: showDateFieldOptions, showAccessControlOptions: showAccessControlOptions, dateRange: dateRange, recommendedPivots: recommendedPivots })] }))] }));
802
+ }, children: (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => setIsChartBuilderOpen(true), label: "Add to dashboard" }) }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.default, { rows: data, columns: columns, fields: fields, query: sqlQuery, queryNoDateColumn: sqlQueryNoDateColumn, pivot: selectedPivot, title: chartBuilderTitle, buttonLabel: chartBuilderButtonLabel, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, showTableFormatOptions: showTableFormatOptions, showDateFieldOptions: showDateFieldOptions, showAccessControlOptions: showAccessControlOptions, dateRange: dateRange, recommendedPivots: recommendedPivots, destinationDashboard: destinationDashboard, dateColumn: dateColumn })] }))] }));
611
803
  }
612
804
  function FilterTag({ Label, id, label, removeFilter, isSelected, index, setIsOpen, selectFilter, theme, tagStyle, selectedTagBorderColor, }) {
613
805
  const handleRemoveFilter = () => {
@@ -658,7 +850,7 @@ function FilterTag({ Label, id, label, removeFilter, isSelected, index, setIsOpe
658
850
  paddingLeft: '6px',
659
851
  }, children: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: tagStyle?.color || theme?.primaryTextColor, height: "20", width: "20", children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) })] }));
660
852
  }
661
- const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, dateStart, setDateStart, columnStats, stringFilterValues, setStringFilterValues, addFilter, setSelectedColumn, setNumberStart, setNumberEnd, selectedTable, columnType, setDateEnd, dateEnd, removeFilter, selectFilter, indexBeingEdited, updateFilter, SelectComponent, ButtonComponent, PopoverComponent, LabelComponent, theme, TextInputComponent, tagStyle, selectedTagBorderColor, parentRef, }) => {
853
+ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, setDateRange, dateRange, columnStats, stringFilterValues, setStringFilterValues, addFilter, setSelectedColumn, setNumberStart, setNumberEnd, selectedTable, columnType, removeFilter, selectFilter, indexBeingEdited, updateFilter, SelectComponent, ButtonComponent, PopoverComponent, LabelComponent, theme, TextInputComponent, tagStyle, selectedTagBorderColor, parentRef, }) => {
662
854
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
663
855
  return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
664
856
  position: 'relative',
@@ -676,7 +868,7 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
676
868
  position: 'absolute',
677
869
  top: -2,
678
870
  right: -2,
679
- } })) }), (0, jsx_runtime_1.jsx)(PopoverComponent, { parentRef: parentRef, label: "Add filter", style: { right: 0, minWidth: 400 }, isOpen: isOpen, onClose: () => setIsOpen(false), title: "Add filter", style: { right: 0, minWidth: 400 }, setIsOpen: setIsOpen, children: (0, jsx_runtime_1.jsxs)("div", { style: {
871
+ } })) }), (0, jsx_runtime_1.jsx)(PopoverComponent, { parentRef: parentRef, label: "Add filter", style: { right: 0, minWidth: 400, overflow: 'visible' }, isOpen: isOpen, onClose: () => setIsOpen(false), title: "Add filter", setIsOpen: setIsOpen, children: (0, jsx_runtime_1.jsxs)("div", { style: {
680
872
  backgroundColor: 'rgb(255, 255, 255)',
681
873
  display: 'flex',
682
874
  flexDirection: 'column',
@@ -692,9 +884,7 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
692
884
  const column = selectedTable.columns.find(c => c.name === e);
693
885
  setSelectedColumn(column);
694
886
  }, options: selectedTable.columns
695
- .filter(elem => !(elem.name === 'id' ||
696
- elem.name.endsWith('_id') ||
697
- (0, PivotModal_1.isDateField)(elem.fieldType)))
887
+ .filter(elem => !(elem.name === 'id' || elem.name.endsWith('_id')))
698
888
  .map(elem => {
699
889
  return { label: elem.name, value: elem.name };
700
890
  }) }), columnType === 'number' && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("div", { style: {
@@ -710,20 +900,26 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
710
900
  display: 'flex',
711
901
  flexDirection: 'column',
712
902
  marginTop: '20px',
713
- }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Maximum" }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "max-input", placeholder: "Maximum", value: numberEnd, onChange: value => setNumberEnd(value) })] })] }) })), columnType === 'date' && ((0, jsx_runtime_1.jsxs)("div", { style: {
903
+ }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Maximum" }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "max-input", placeholder: "Maximum", value: numberEnd, onChange: value => setNumberEnd(value) })] })] }) })), columnType === 'date' && ((0, jsx_runtime_1.jsx)("div", { style: {
714
904
  display: 'flex',
715
905
  flexDirection: 'row',
716
- alignItems: 'center',
717
906
  justifyContent: 'space-between',
718
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
719
- display: 'flex',
720
- flexDirection: 'column',
721
- marginTop: '20px',
722
- }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "Start date" }), (0, jsx_runtime_1.jsx)("input", { type: "date", value: dateStart, onChange: e => setDateStart(e.target.value), placeholder: "Start date" })] }), (0, jsx_runtime_1.jsxs)("div", { style: {
723
- display: 'flex',
724
- flexDirection: 'column',
725
- marginTop: '20px',
726
- }, children: [(0, jsx_runtime_1.jsx)(LabelComponent, { children: "End date" }), (0, jsx_runtime_1.jsx)("input", { type: "date", value: dateEnd, onChange: e => setDateEnd(e.target.value), placeholder: "End date" })] })] })), columnType === 'string' &&
907
+ marginTop: 20,
908
+ }, children: (0, jsx_runtime_1.jsx)(Dashboard_1.QuillDateRangePicker, { dateRange: dateRange ? [dateRange[0], dateRange[1]] : [null, null], label: '', onChangeDateRange: dateRange => {
909
+ setDateRange([dateRange[0], dateRange[1], null]);
910
+ }, preset: dateRange && dateRange.length === 3 && dateRange[2] !== null
911
+ ? dateRange[2]
912
+ : '', onChangePreset: preset => {
913
+ if (typeof preset === 'string') {
914
+ setDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)(preset));
915
+ return;
916
+ }
917
+ setDateRange([
918
+ preset?.startDate || null,
919
+ new Date(),
920
+ preset?.value || '',
921
+ ]);
922
+ }, presetOptions: dateRangePickerUtils_1.reportBuilderOptions }) })), columnType === 'string' &&
727
923
  columnStats &&
728
924
  columnStats.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
729
925
  flex: 'flex',
@@ -753,7 +949,7 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
753
949
  color: theme?.primaryTextColor,
754
950
  fontFamily: theme?.fontFamily,
755
951
  }, children: value })] }, value) }, value))) })), (0, jsx_runtime_1.jsx)("div", { style: { height: 20 } }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: () => {
756
- if (columnType === 'date' && (!dateStart || !dateEnd)) {
952
+ if (columnType === 'date' && !dateRange) {
757
953
  return;
758
954
  }
759
955
  if (indexBeingEdited > -1) {