@quillsql/react 2.6.4 → 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.
- package/lib/ChartBuilder.d.ts +5 -0
- package/lib/ChartBuilder.js +16 -10
- package/lib/ChartBuilder.js.map +1 -1
- package/lib/ChartEditor.d.ts +2 -1
- package/lib/ChartEditor.js +2 -2
- package/lib/ChartEditor.js.map +1 -1
- package/lib/DateRangePicker/DateRangePicker.d.ts +1 -0
- package/lib/DateRangePicker/DateRangePicker.js.map +1 -1
- package/lib/DateRangePicker/dateRangePickerUtils.d.ts +1 -0
- package/lib/DateRangePicker/dateRangePickerUtils.js +33 -1
- package/lib/DateRangePicker/dateRangePickerUtils.js.map +1 -1
- package/lib/ReportBuilder.d.ts +2 -1
- package/lib/ReportBuilder.js +275 -91
- package/lib/ReportBuilder.js.map +1 -1
- package/lib/SQLEditor.d.ts +3 -1
- package/lib/SQLEditor.js +40 -15
- package/lib/SQLEditor.js.map +1 -1
- package/lib/components/UiComponents.js +4 -2
- package/lib/components/UiComponents.js.map +1 -1
- package/lib/internals/ReportBuilder/PivotModal.js +4 -6
- package/lib/internals/ReportBuilder/PivotModal.js.map +1 -1
- package/package.json +1 -1
package/lib/ReportBuilder.js
CHANGED
|
@@ -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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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 [
|
|
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
|
-
|
|
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
|
-
|
|
320
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
387
|
-
|
|
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
|
-
|
|
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
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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)(
|
|
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,
|
|
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,
|
|
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",
|
|
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.
|
|
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
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
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' &&
|
|
940
|
+
if (columnType === 'date' && !dateRange) {
|
|
757
941
|
return;
|
|
758
942
|
}
|
|
759
943
|
if (indexBeingEdited > -1) {
|