@quillsql/react 2.6.3 → 2.6.5

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, }) {
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, theme: theme, data: data, columns: columns, fields: fields, onChangeData: onChangeData, onChangeColumns: onChangeColumns, onChangePivot: onChangePivot, selectedPivot: selectedPivot, setSelectedPivot: pivot => {
112
133
  setSelectedPivot(pivot);
113
134
  if (onChangePivot) {
114
135
  const table = pivot
@@ -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, 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, }) {
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);
@@ -255,8 +404,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
255
404
  setIndexBeingEdited(index);
256
405
  }
257
406
  else if (filter.columnType === 'date') {
258
- setDateStart(filter.dateStart);
259
- setDateEnd(filter.dateEnd);
407
+ setFilterDateRange(filter.filterDateRange);
260
408
  setIndexBeingEdited(index);
261
409
  }
262
410
  };
@@ -311,14 +459,17 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
311
459
  });
312
460
  }
313
461
  else if (columnType === 'date') {
462
+ const label = filterDateRange[2]
463
+ ? dateRangePickerUtils_1.reportBuilderOptions.find(elem => elem.value === filterDateRange[2])
464
+ ?.text
465
+ : `${(0, date_fns_1.format)(new Date(filterDateRange[0]), 'MMM dd')} - ${(0, date_fns_1.format)(new Date(filterDateRange[1]), 'MMM dd')}`;
314
466
  setFilters(filters => {
315
467
  const newFilters = [...filters];
316
468
  newFilters[index] = {
317
469
  column: selectedColumn.name,
318
470
  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')})`,
471
+ filterDateRange,
472
+ tag: `${selectedColumn.name} (${label})`,
322
473
  };
323
474
  return newFilters;
324
475
  });
@@ -326,14 +477,13 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
326
477
  setStringFilterValues([]);
327
478
  setNumberStart(0);
328
479
  setNumberEnd(0);
329
- setDateStart('');
330
- setDateEnd('');
480
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
331
481
  setIndexBeingEdited(-1);
332
482
  return;
333
483
  }
334
484
  };
335
485
  // ADD FILTER TO "FILTERS" ARRAY
336
- const addFilter = () => {
486
+ const addFilter = async () => {
337
487
  if (selectedColumn && columnType) {
338
488
  // const type = getPostgresBasicType(selectedColumn);
339
489
  let newCondition;
@@ -352,8 +502,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
352
502
  setStringFilterValues([]);
353
503
  setNumberStart(0);
354
504
  setNumberEnd(0);
355
- setDateStart('');
356
- setDateEnd('');
505
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
357
506
  return;
358
507
  }
359
508
  else if (columnType === 'number') {
@@ -372,28 +521,29 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
372
521
  setStringFilterValues([]);
373
522
  setNumberStart(0);
374
523
  setNumberEnd(0);
375
- setDateStart('');
376
- setDateEnd('');
524
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
377
525
  return;
378
526
  }
379
527
  else if (columnType === 'date') {
528
+ const label = filterDateRange[2]
529
+ ? dateRangePickerUtils_1.reportBuilderOptions.find(elem => elem.value === filterDateRange[2])
530
+ ?.text
531
+ : `${(0, date_fns_1.format)(new Date(filterDateRange[0]), 'MMM dd')} - ${(0, date_fns_1.format)(new Date(filterDateRange[1]), 'MMM dd')}`;
380
532
  setFilters(filters => {
381
533
  return [
382
534
  ...filters,
383
535
  {
384
536
  column: selectedColumn.name,
385
537
  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')})`,
538
+ filterDateRange,
539
+ tag: `${selectedColumn.name} (${label})`,
389
540
  },
390
541
  ];
391
542
  });
392
543
  setStringFilterValues([]);
393
544
  setNumberStart(0);
394
545
  setNumberEnd(0);
395
- setDateStart('');
396
- setDateEnd('');
546
+ setFilterDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)('90d'));
397
547
  }
398
548
  }
399
549
  };
@@ -409,29 +559,28 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
409
559
  setSelectedColumn(selectedTable.columns.find(elem => elem.name !== 'id'));
410
560
  setFilters([]);
411
561
  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
- });
562
+ const resetAST = {
563
+ with: null,
564
+ type: 'select',
565
+ options: null,
566
+ distinct: { type: null },
567
+ columns: '*',
568
+ into: { position: null },
569
+ // where: newDateWhereAST(dateColumn, defaultDateRange),
570
+ where: null,
571
+ groupby: null,
572
+ having: null,
573
+ orderby: null,
574
+ limit: { seperator: '', value: [] },
575
+ window: null,
576
+ from: [{ db: null, table: selectedTable.displayName, as: null }],
577
+ };
578
+ setAST(resetAST);
579
+ setASTNoDateColumn(resetAST);
430
580
  return;
431
581
  }
432
582
  }, [selectedTable]);
433
- // USE EFFECT HOOK THAT TRANSFORMS "FILTERS ARRAY INTO AST"
434
- (0, react_1.useEffect)(() => {
583
+ const generateNewAST = includeDateColumn => {
435
584
  if (filters.length || dateRange) {
436
585
  const newAST = {
437
586
  with: null,
@@ -452,8 +601,11 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
452
601
  // FILTERS
453
602
  for (let i = 0; i < filters.length; i++) {
454
603
  const filter = filters[i];
455
- const { column, columnType, stringFilterValues, numberStart, numberEnd, dateStart, dateEnd, } = filter;
604
+ const { column, columnType, stringFilterValues, numberStart, numberEnd, filterDateRange, } = filter;
456
605
  let newCondition;
606
+ if (column === dateColumn && !includeDateColumn) {
607
+ continue;
608
+ }
457
609
  if (columnType === 'string') {
458
610
  newCondition = {
459
611
  type: 'binary_expr',
@@ -491,7 +643,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
491
643
  };
492
644
  }
493
645
  else if (columnType === 'date') {
494
- newCondition = newDateWhereAST(column, [dateStart, dateEnd]);
646
+ newCondition = newDateWhereAST(column, filterDateRange, client.databaseType);
495
647
  }
496
648
  if (!newAST.where) {
497
649
  newAST.where = newCondition;
@@ -505,7 +657,14 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
505
657
  };
506
658
  }
507
659
  }
508
- setAST(newAST);
660
+ return newAST;
661
+ }
662
+ };
663
+ // USE EFFECT HOOK THAT TRANSFORMS "FILTERS ARRAY INTO AST"
664
+ (0, react_1.useEffect)(() => {
665
+ if (filters.length || dateRange) {
666
+ setAST(generateNewAST(true));
667
+ setASTNoDateColumn(generateNewAST(false));
509
668
  }
510
669
  }, [filters, dateRange]);
511
670
  const removeFilter = index => {
@@ -573,7 +732,9 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
573
732
  const getSqlQueryFromAST = async () => {
574
733
  try {
575
734
  if (AST && AST.from[0].table) {
576
- const resp = await (0, dataFetcher_1.getDataFromCloud)(null, 'sqlify', { ast: AST });
735
+ const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'sqlify', {
736
+ ast: AST,
737
+ });
577
738
  const newSqlQuery = resp.query; // assuming the response contains the SQL query
578
739
  if (newSqlQuery && newSqlQuery !== sqlQuery) {
579
740
  onChangeQuery(newSqlQuery);
@@ -588,6 +749,25 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
588
749
  };
589
750
  getSqlQueryFromAST();
590
751
  }, [AST]);
752
+ (0, react_1.useEffect)(() => {
753
+ const getSqlQueryFromAST = async () => {
754
+ try {
755
+ if (ASTNoDateColumn && ASTNoDateColumn.from[0].table) {
756
+ const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'sqlify', {
757
+ ast: ASTNoDateColumn,
758
+ });
759
+ const newSqlQuery = resp.query; // assuming the response contains the SQL query
760
+ if (newSqlQuery && newSqlQuery !== sqlQueryNoDateColumn) {
761
+ setSqlQueryNoDateColumn(newSqlQuery);
762
+ }
763
+ }
764
+ }
765
+ catch (err) {
766
+ console.error(err);
767
+ }
768
+ };
769
+ getSqlQueryFromAST();
770
+ }, [ASTNoDateColumn]);
591
771
  if (!schema || !schema.length) {
592
772
  return null;
593
773
  }
@@ -596,7 +776,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
596
776
  // marginLeft: '25px',
597
777
  // marginRight: '25px',
598
778
  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: {
779
+ }, 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, 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
780
  height: 400,
601
781
  marginTop: 10,
602
782
  } }), chartBuilderEnabled && columns.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { style: {
@@ -607,7 +787,7 @@ function ReportingTool({ schema, data, columns, runQuery, SelectComponent, Butto
607
787
  width: '100%',
608
788
  height: '70px',
609
789
  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 })] }))] }));
790
+ }, 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, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, showTableFormatOptions: showTableFormatOptions, showDateFieldOptions: showDateFieldOptions, showAccessControlOptions: showAccessControlOptions, dateRange: dateRange, recommendedPivots: recommendedPivots, destinationDashboard: destinationDashboard, dateColumn: dateColumn })] }))] }));
611
791
  }
612
792
  function FilterTag({ Label, id, label, removeFilter, isSelected, index, setIsOpen, selectFilter, theme, tagStyle, selectedTagBorderColor, }) {
613
793
  const handleRemoveFilter = () => {
@@ -658,7 +838,7 @@ function FilterTag({ Label, id, label, removeFilter, isSelected, index, setIsOpe
658
838
  paddingLeft: '6px',
659
839
  }, 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
840
  }
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, }) => {
841
+ 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
842
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
663
843
  return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
664
844
  position: 'relative',
@@ -676,7 +856,7 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
676
856
  position: 'absolute',
677
857
  top: -2,
678
858
  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: {
859
+ } })) }), (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
860
  backgroundColor: 'rgb(255, 255, 255)',
681
861
  display: 'flex',
682
862
  flexDirection: 'column',
@@ -692,9 +872,7 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
692
872
  const column = selectedTable.columns.find(c => c.name === e);
693
873
  setSelectedColumn(column);
694
874
  }, options: selectedTable.columns
695
- .filter(elem => !(elem.name === 'id' ||
696
- elem.name.endsWith('_id') ||
697
- (0, PivotModal_1.isDateField)(elem.fieldType)))
875
+ .filter(elem => !(elem.name === 'id' || elem.name.endsWith('_id')))
698
876
  .map(elem => {
699
877
  return { label: elem.name, value: elem.name };
700
878
  }) }), columnType === 'number' && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("div", { style: {
@@ -710,20 +888,26 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
710
888
  display: 'flex',
711
889
  flexDirection: 'column',
712
890
  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: {
891
+ }, 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
892
  display: 'flex',
715
893
  flexDirection: 'row',
716
- alignItems: 'center',
717
894
  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' &&
895
+ marginTop: 20,
896
+ }, children: (0, jsx_runtime_1.jsx)(Dashboard_1.QuillDateRangePicker, { dateRange: dateRange ? [dateRange[0], dateRange[1]] : [null, null], label: '', onChangeDateRange: dateRange => {
897
+ setDateRange([dateRange[0], dateRange[1], null]);
898
+ }, preset: dateRange && dateRange.length === 3 && dateRange[2] !== null
899
+ ? dateRange[2]
900
+ : '', onChangePreset: preset => {
901
+ if (typeof preset === 'string') {
902
+ setDateRange((0, dateRangePickerUtils_1.getRangeFromPreset)(preset));
903
+ return;
904
+ }
905
+ setDateRange([
906
+ preset?.startDate || null,
907
+ new Date(),
908
+ preset?.value || '',
909
+ ]);
910
+ }, presetOptions: dateRangePickerUtils_1.reportBuilderOptions }) })), columnType === 'string' &&
727
911
  columnStats &&
728
912
  columnStats.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
729
913
  flex: 'flex',
@@ -753,7 +937,7 @@ const AddFilterModal2 = ({ filters, selectedColumn, numberStart, numberEnd, date
753
937
  color: theme?.primaryTextColor,
754
938
  fontFamily: theme?.fontFamily,
755
939
  }, 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)) {
940
+ if (columnType === 'date' && !dateRange) {
757
941
  return;
758
942
  }
759
943
  if (indexBeingEdited > -1) {