@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.
- package/lib/AddToDashboardModal.js +3 -0
- package/lib/AddToDashboardModal.js.map +1 -1
- package/lib/Chart.js +2 -0
- package/lib/Chart.js.map +1 -1
- package/lib/ChartBuilder.d.ts +7 -0
- package/lib/ChartBuilder.js +48 -12
- package/lib/ChartBuilder.js.map +1 -1
- package/lib/ChartEditor.d.ts +5 -1
- package/lib/ChartEditor.js +4 -2
- package/lib/ChartEditor.js.map +1 -1
- package/lib/Dashboard.js +3 -3
- package/lib/Dashboard.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 +6 -1
- package/lib/ReportBuilder.js +288 -92
- package/lib/ReportBuilder.js.map +1 -1
- package/lib/SQLEditor.d.ts +6 -1
- package/lib/SQLEditor.js +49 -21
- package/lib/SQLEditor.js.map +1 -1
- package/lib/Table.js +6 -4
- package/lib/Table.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/lib/utils/dataFetcher.js +3 -3
- package/lib/utils/dataFetcher.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, 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
|
-
|
|
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, 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 [
|
|
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
|
-
|
|
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
|
-
|
|
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')})`,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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')})`,
|
|
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
|
-
|
|
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
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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)(
|
|
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: [
|
|
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,
|
|
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",
|
|
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.
|
|
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
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
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' &&
|
|
952
|
+
if (columnType === 'date' && !dateRange) {
|
|
757
953
|
return;
|
|
758
954
|
}
|
|
759
955
|
if (indexBeingEdited > -1) {
|