@quillsql/react 1.5.3 → 1.5.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.
@@ -0,0 +1,1534 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
58
+ import { useState, useContext, useCallback, useEffect, useRef, } from 'react';
59
+ // import './nightOwlLight.css';
60
+ import axios from 'axios';
61
+ import { ClientContext, SchemaContext, ThemeContext } from './Context';
62
+ import { XMarkIcon, CheckIcon, } from '@heroicons/react/20/solid';
63
+ import { convertPostgresColumn } from './SQLEditor';
64
+ import { format } from 'date-fns';
65
+ export default function ReportBuilder(_a) {
66
+ var _this = this;
67
+ var onChangeQuery = _a.onChangeQuery, onChangeData = _a.onChangeData, onChangeColumns = _a.onChangeColumns, onChangeLoading = _a.onChangeLoading, onError = _a.onError, SelectComponent = _a.SelectComponent;
68
+ var _b = useState([]), data = _b[0], setData = _b[1];
69
+ var client = useContext(ClientContext)[0];
70
+ var _c = useContext(SchemaContext), schema = _c[0], setSchema = _c[1];
71
+ var theme = useContext(ThemeContext)[0];
72
+ var _d = useState([]), columns = _d[0], setColumns = _d[1];
73
+ var _e = useState([]), fields = _e[0], setFields = _e[1];
74
+ useEffect(function () {
75
+ function getData(schema) {
76
+ return __awaiter(this, void 0, void 0, function () {
77
+ var publicKey, customerId, environment, response;
78
+ return __generator(this, function (_a) {
79
+ switch (_a.label) {
80
+ case 0:
81
+ if (!(schema.length && !data.length)) return [3 /*break*/, 2];
82
+ publicKey = client.publicKey, customerId = client.customerId, environment = client.environment;
83
+ return [4 /*yield*/, axios.post("https://quill-344421.uc.r.appspot.com/dashquery", {
84
+ query: "select * from ".concat(schema[0].displayName, " limit 10;"),
85
+ }, {
86
+ params: {
87
+ orgId: customerId,
88
+ publicKey: publicKey,
89
+ },
90
+ headers: {
91
+ Authorization: "Bearer ",
92
+ environment: environment || undefined,
93
+ },
94
+ })];
95
+ case 1:
96
+ response = _a.sent();
97
+ setData(response.data.rows);
98
+ _a.label = 2;
99
+ case 2: return [2 /*return*/];
100
+ }
101
+ });
102
+ });
103
+ }
104
+ getData(schema);
105
+ }, [schema]);
106
+ useEffect(function () {
107
+ var isSubscribed = true;
108
+ function getSchema() {
109
+ return __awaiter(this, void 0, void 0, function () {
110
+ var publicKey, environment, response3;
111
+ return __generator(this, function (_a) {
112
+ switch (_a.label) {
113
+ case 0:
114
+ publicKey = client.publicKey, environment = client.environment;
115
+ return [4 /*yield*/, axios.get("https://quill-344421.uc.r.appspot.com/schema2/".concat(publicKey, "/"), {
116
+ headers: {
117
+ Authorization: "Bearer ",
118
+ environment: environment || undefined,
119
+ },
120
+ })];
121
+ case 1:
122
+ response3 = _a.sent();
123
+ if (isSubscribed) {
124
+ setSchema(response3.data.tables);
125
+ }
126
+ return [2 /*return*/];
127
+ }
128
+ });
129
+ });
130
+ }
131
+ if (isSubscribed) {
132
+ getSchema();
133
+ }
134
+ return function () {
135
+ isSubscribed = false;
136
+ };
137
+ }, []);
138
+ var runQuery = function (query) { return __awaiter(_this, void 0, void 0, function () {
139
+ var publicKey, customerId, environment, response;
140
+ return __generator(this, function (_a) {
141
+ switch (_a.label) {
142
+ case 0:
143
+ publicKey = client.publicKey, customerId = client.customerId, environment = client.environment;
144
+ return [4 /*yield*/, axios.post("https://quill-344421.uc.r.appspot.com/dashquery", {
145
+ query: query,
146
+ }, {
147
+ params: {
148
+ orgId: customerId,
149
+ publicKey: publicKey,
150
+ },
151
+ headers: {
152
+ Authorization: "Bearer ",
153
+ environment: environment || undefined,
154
+ },
155
+ })];
156
+ case 1:
157
+ response = _a.sent();
158
+ if (response && response.data && response.data.errorMessage) {
159
+ onError(response.data.errorMessage);
160
+ setData([]);
161
+ onChangeData([]);
162
+ setColumns([]);
163
+ onChangeColumns([]);
164
+ setFields([]);
165
+ return [2 /*return*/];
166
+ }
167
+ setData(response.data.rows);
168
+ onChangeData(response.data.rows);
169
+ setColumns(response.data.fields.map(function (elem) { return convertPostgresColumn(elem); }));
170
+ onChangeColumns(response.data.fields.map(function (elem) { return convertPostgresColumn(elem); }));
171
+ setFields(response.data.fields);
172
+ return [2 /*return*/];
173
+ }
174
+ });
175
+ }); };
176
+ if (!schema.length) {
177
+ return null;
178
+ }
179
+ return (_jsx(ReportingTool, { theme: theme, data: data, schema: schema, onChangeQuery: onChangeQuery, runQuery: runQuery, SelectComponent: SelectComponent }));
180
+ }
181
+ export function getPostgresBasicType(column) {
182
+ var format;
183
+ // first check if column.dataTypeID exists
184
+ if (column.dataTypeID) {
185
+ switch (column.dataTypeID) {
186
+ case 20: // int8
187
+ case 21: // int2
188
+ case 23: // int4
189
+ case 700: // float4
190
+ case 701: // float8
191
+ case 1700: // numeric
192
+ format = 'number';
193
+ break;
194
+ case 1082: // date
195
+ case 1083: // time
196
+ case 1184: // timestamptz
197
+ case 1114: // timestamp
198
+ format = 'date';
199
+ break;
200
+ case 1043: // varchar
201
+ default:
202
+ format = 'string';
203
+ }
204
+ }
205
+ else if (column.fieldType) {
206
+ // if column.dataTypeID doesn't exist, check column.fieldType
207
+ switch (column.fieldType) {
208
+ case 'int8':
209
+ case 'int2':
210
+ case 'int4':
211
+ case 'float4':
212
+ case 'float8':
213
+ case 'numeric':
214
+ format = 'number';
215
+ break;
216
+ case 'date':
217
+ case 'time':
218
+ case 'timestamptz':
219
+ case 'timestamp':
220
+ format = 'date';
221
+ break;
222
+ case 'varchar':
223
+ default:
224
+ format = 'string';
225
+ }
226
+ }
227
+ return format;
228
+ }
229
+ function ReportingTool(_a) {
230
+ var _this = this;
231
+ var schema = _a.schema, data = _a.data, runQuery = _a.runQuery, SelectComponent = _a.SelectComponent, onChangeQuery = _a.onChangeQuery, theme = _a.theme;
232
+ var _b = useState(schema[0]), selectedTable = _b[0], setSelectedTable = _b[1];
233
+ var _c = useState(schema[0].columns[0]), selectedColumn = _c[0], setSelectedColumn = _c[1];
234
+ var _d = useState([]), filters = _d[0], setFilters = _d[1];
235
+ var _e = useState({
236
+ with: null,
237
+ type: 'select',
238
+ options: null,
239
+ distinct: { type: null },
240
+ columns: '*',
241
+ into: { position: null },
242
+ from: [{ db: null, table: schema[0].displayName, as: null }],
243
+ where: null,
244
+ groupby: null,
245
+ having: null,
246
+ orderby: null,
247
+ limit: { seperator: '', value: [] },
248
+ window: null,
249
+ }), AST = _e[0], setAST = _e[1];
250
+ var _f = useState(0), numberStart = _f[0], setNumberStart = _f[1];
251
+ var _g = useState(0), numberEnd = _g[0], setNumberEnd = _g[1];
252
+ var _h = useState(''), dateStart = _h[0], setDateStart = _h[1];
253
+ var _j = useState(''), dateEnd = _j[0], setDateEnd = _j[1];
254
+ var _k = useState({}), computedColumns = _k[0], setComputedColumns = _k[1];
255
+ var _l = useState([]), stringFilterValues = _l[0], setStringFilterValues = _l[1];
256
+ var _m = useState(getPostgresBasicType(schema[0].columns[0])), columnType = _m[0], setColumnType = _m[1];
257
+ var _o = useState(''), sqlQuery = _o[0], setSqlQuery = _o[1];
258
+ // month | week | day | quarter
259
+ var _p = useState('month'), dateBucket = _p[0], setDateBucket = _p[1];
260
+ var _q = useState(-1), indexBeingEdited = _q[0], setIndexBeingEdited = _q[1];
261
+ var _r = useState([]), groupBys = _r[0], setGroupBys = _r[1];
262
+ var _s = useState([]), aggregations = _s[0], setAggregations = _s[1];
263
+ var _t = useState(schema[0].columns[0]), selectedGroupByColumn = _t[0], setSelectedGroupByColumn = _t[1];
264
+ var _u = useState(getPostgresBasicType(schema[0].columns[0])), groupByColumnType = _u[0], setGroupByColumnType = _u[1];
265
+ var _v = useState(schema[0].columns[0].name), selectedSortByColumn = _v[0], setSelectedSortByColumn = _v[1];
266
+ var _w = useState([]), sortBys = _w[0], setSortBys = _w[1];
267
+ var _x = useState('ascending'), selectedSortByDirection = _x[0], setSelectedSortByDirection = _x[1];
268
+ var _y = useState(-1), groupByIndexBeingEdited = _y[0], setGroupByIndexBeingEdited = _y[1];
269
+ var _z = useState(-1), sortByIndexBeingEdited = _z[0], setSortByIndexBeingEdited = _z[1];
270
+ var _0 = useState(schema[0].columns.map(function (col) { return col.name; })), sortableColumns = _0[0], setSortableColumns = _0[1];
271
+ var addGroupBy = function () {
272
+ if (selectedGroupByColumn && groupByColumnType) {
273
+ if (groupByColumnType === 'string') {
274
+ setGroupBys(function (groupBys) {
275
+ return __spreadArray(__spreadArray([], groupBys, true), [
276
+ {
277
+ column: selectedGroupByColumn.name,
278
+ columnType: groupByColumnType,
279
+ tag: selectedGroupByColumn.name,
280
+ },
281
+ ], false);
282
+ });
283
+ return;
284
+ }
285
+ else if (groupByColumnType === 'number') {
286
+ // is this possible lmao
287
+ return;
288
+ }
289
+ else if (groupByColumnType === 'date') {
290
+ setGroupBys(function (groupBys) {
291
+ return __spreadArray(__spreadArray([], groupBys, true), [
292
+ {
293
+ column: selectedGroupByColumn.name,
294
+ columnType: groupByColumnType,
295
+ bucket: dateBucket,
296
+ tag: dateBucket,
297
+ },
298
+ ], false);
299
+ });
300
+ return;
301
+ }
302
+ }
303
+ };
304
+ var addSortBy = function () {
305
+ setSortBys(function (sortBys) {
306
+ return __spreadArray(__spreadArray([], sortBys, true), [
307
+ {
308
+ column: selectedSortByColumn,
309
+ direction: selectedSortByDirection,
310
+ },
311
+ ], false);
312
+ });
313
+ };
314
+ var removeSortBy = function (index) {
315
+ setSortBys(function (oldSortBys) {
316
+ var newSortBys = __spreadArray([], oldSortBys, true);
317
+ newSortBys.splice(index, 1);
318
+ return newSortBys;
319
+ });
320
+ setSortByIndexBeingEdited(-1);
321
+ };
322
+ var removeGroupBy = function (index) {
323
+ var columnBeingDeleted = groupBys[index].tag;
324
+ setSortBys(function (oldSortBys) {
325
+ var newSortBys = __spreadArray([], oldSortBys.filter(function (sortBy) { return sortBy.column !== columnBeingDeleted; }), true);
326
+ return newSortBys;
327
+ });
328
+ setGroupBys(function (oldGroupBys) {
329
+ var newGroupBys = __spreadArray([], oldGroupBys, true);
330
+ newGroupBys.splice(index, 1);
331
+ return newGroupBys;
332
+ });
333
+ setGroupByIndexBeingEdited(-1);
334
+ };
335
+ var updateSortBy = function (index) {
336
+ if (selectedSortByColumn && selectedSortByDirection) {
337
+ setSortBys(function (sortBys) {
338
+ var newSortBys = __spreadArray([], sortBys, true);
339
+ newSortBys[index] = {
340
+ column: selectedSortByColumn,
341
+ direction: selectedSortByDirection,
342
+ };
343
+ return newSortBys;
344
+ });
345
+ setSortByIndexBeingEdited(-1);
346
+ return;
347
+ }
348
+ };
349
+ useEffect(function () {
350
+ setColumnType(getPostgresBasicType(selectedColumn));
351
+ // console.log("WTF: ", selectedColumn);
352
+ }, [selectedColumn]);
353
+ useEffect(function () {
354
+ setGroupByColumnType(getPostgresBasicType(selectedGroupByColumn));
355
+ }, [selectedGroupByColumn]);
356
+ var selectFilter = function (index) {
357
+ var filter = filters[index];
358
+ var matchingColumn = selectedTable.columns.find(function (column) { return column.name === filter.column; });
359
+ setSelectedColumn(matchingColumn);
360
+ if (filter.columnType === 'string') {
361
+ setStringFilterValues(filter.stringFilterValues);
362
+ setIndexBeingEdited(index);
363
+ }
364
+ else if (filter.columnType === 'number') {
365
+ setNumberStart(filter.numberStart);
366
+ setNumberEnd(filter.numberEnd);
367
+ setIndexBeingEdited(index);
368
+ }
369
+ else if (filter.columnType === 'date') {
370
+ setDateStart(filter.dateStart);
371
+ setDateEnd(filter.dateEnd);
372
+ setIndexBeingEdited(index);
373
+ }
374
+ };
375
+ var selectSortBy = function (index) {
376
+ var sortBy = sortBys[index];
377
+ setSelectedSortByColumn(sortBy.column);
378
+ setSelectedSortByDirection(sortBy.direction);
379
+ setSortByIndexBeingEdited(index);
380
+ };
381
+ var selectGroupBy = function (index) {
382
+ var groupBy = groupBys[index];
383
+ var matchingColumn = selectedTable.columns.find(function (column) { return column.name === groupBy.column; });
384
+ setSelectedGroupByColumn(matchingColumn);
385
+ if (groupBy.bucket) {
386
+ setDateBucket(groupBy.bucket);
387
+ }
388
+ setGroupByIndexBeingEdited(index);
389
+ };
390
+ var updateGroupBy = function (index) {
391
+ if (selectedGroupByColumn && groupByColumnType) {
392
+ // if column changed, then auto delete the sort using that column
393
+ var columnBeingDeleted_1 = selectedGroupByColumn.name !== groupBys[index].column
394
+ ? groupBys[index].tag
395
+ : 'nocolumnbeingdeleted';
396
+ setSortBys(function (oldSortBys) {
397
+ var newSortBys = __spreadArray([], oldSortBys.filter(function (sortBy) { return sortBy.column !== columnBeingDeleted_1; }), true);
398
+ return newSortBys;
399
+ });
400
+ if (groupByColumnType === 'date') {
401
+ setGroupBys(function (groupBys) {
402
+ var newGroupBys = __spreadArray([], groupBys, true);
403
+ newGroupBys[index] = {
404
+ column: selectedGroupByColumn.name,
405
+ columnType: groupByColumnType,
406
+ bucket: dateBucket,
407
+ tag: dateBucket,
408
+ };
409
+ return newGroupBys;
410
+ });
411
+ }
412
+ else {
413
+ setGroupBys(function (groupBys) {
414
+ var newGroupBys = __spreadArray([], groupBys, true);
415
+ newGroupBys[index] = {
416
+ column: selectedGroupByColumn.name,
417
+ columnType: groupByColumnType,
418
+ tag: selectedGroupByColumn.name,
419
+ };
420
+ return newGroupBys;
421
+ });
422
+ }
423
+ setGroupByIndexBeingEdited(-1);
424
+ return;
425
+ }
426
+ };
427
+ var updateFilter = function (index) {
428
+ if (selectedColumn && columnType) {
429
+ if (columnType === 'string') {
430
+ setFilters(function (filters) {
431
+ var newFilters = __spreadArray([], filters, true);
432
+ newFilters[index] = {
433
+ column: selectedColumn.name,
434
+ columnType: columnType,
435
+ stringFilterValues: stringFilterValues,
436
+ tag: "".concat(selectedColumn.name, " (").concat(stringFilterValues.join(', '), ")"),
437
+ };
438
+ return newFilters;
439
+ });
440
+ }
441
+ else if (columnType === 'number') {
442
+ setFilters(function (filters) {
443
+ var newFilters = __spreadArray([], filters, true);
444
+ newFilters[index] = {
445
+ column: selectedColumn.name,
446
+ columnType: columnType,
447
+ numberStart: numberStart,
448
+ numberEnd: numberEnd,
449
+ tag: "".concat(numberStart, " < ").concat(selectedColumn.name, " < ").concat(numberEnd),
450
+ };
451
+ return newFilters;
452
+ });
453
+ }
454
+ else if (columnType === 'date') {
455
+ setFilters(function (filters) {
456
+ var newFilters = __spreadArray([], filters, true);
457
+ newFilters[index] = {
458
+ column: selectedColumn.name,
459
+ columnType: columnType,
460
+ dateStart: dateStart,
461
+ dateEnd: dateEnd,
462
+ tag: "".concat(selectedColumn.name, " (").concat(format(new Date(dateStart), 'MMM dd'), " - ").concat(format(new Date(dateEnd), 'MMM dd'), ")"),
463
+ };
464
+ return newFilters;
465
+ });
466
+ }
467
+ setStringFilterValues([]);
468
+ setNumberStart(0);
469
+ setNumberEnd(0);
470
+ setDateStart('');
471
+ setDateEnd('');
472
+ setIndexBeingEdited(-1);
473
+ return;
474
+ }
475
+ };
476
+ // ADD FILTER TO "FILTERS" ARRAY
477
+ var addFilter = function () {
478
+ if (selectedColumn && columnType) {
479
+ // const type = getPostgresBasicType(selectedColumn);
480
+ var newCondition = void 0;
481
+ if (columnType === 'string') {
482
+ setFilters(function (filters) {
483
+ return __spreadArray(__spreadArray([], filters, true), [
484
+ {
485
+ column: selectedColumn.name,
486
+ columnType: columnType,
487
+ stringFilterValues: stringFilterValues,
488
+ tag: "".concat(selectedColumn.name, " (").concat(stringFilterValues.join(', '), ")"),
489
+ },
490
+ ], false);
491
+ });
492
+ setStringFilterValues([]);
493
+ setNumberStart(0);
494
+ setNumberEnd(0);
495
+ setDateStart('');
496
+ setDateEnd('');
497
+ return;
498
+ }
499
+ else if (columnType === 'number') {
500
+ setFilters(function (filters) {
501
+ return __spreadArray(__spreadArray([], filters, true), [
502
+ {
503
+ column: selectedColumn.name,
504
+ columnType: columnType,
505
+ numberStart: numberStart,
506
+ numberEnd: numberEnd,
507
+ tag: "".concat(numberStart, " < ").concat(selectedColumn.name, " < ").concat(numberEnd),
508
+ },
509
+ ], false);
510
+ });
511
+ setStringFilterValues([]);
512
+ setNumberStart(0);
513
+ setNumberEnd(0);
514
+ setDateStart('');
515
+ setDateEnd('');
516
+ return;
517
+ }
518
+ else if (columnType === 'date') {
519
+ setFilters(function (filters) {
520
+ return __spreadArray(__spreadArray([], filters, true), [
521
+ {
522
+ column: selectedColumn.name,
523
+ columnType: columnType,
524
+ dateStart: dateStart,
525
+ dateEnd: dateEnd,
526
+ tag: "".concat(selectedColumn.name, " (").concat(format(new Date(dateStart), 'MMM dd'), " - ").concat(format(new Date(dateEnd), 'MMM dd'), ")"),
527
+ },
528
+ ], false);
529
+ });
530
+ setStringFilterValues([]);
531
+ setNumberStart(0);
532
+ setNumberEnd(0);
533
+ setDateStart('');
534
+ setDateEnd('');
535
+ }
536
+ }
537
+ };
538
+ var setAggregationColumn = function (column, index) {
539
+ // ex
540
+ setAggregations(function (aggregations) {
541
+ var newAggregations = __spreadArray([], aggregations, true);
542
+ newAggregations[index] = __assign(__assign({}, newAggregations[index]), { column: column });
543
+ return newAggregations;
544
+ });
545
+ };
546
+ var setAggregationType = function (aggregationType, index) {
547
+ // ex
548
+ setAggregations(function (aggregations) {
549
+ var newAggregations = __spreadArray([], aggregations, true);
550
+ newAggregations[index] = __assign(__assign({}, newAggregations[index]), { aggregationType: aggregationType });
551
+ return newAggregations;
552
+ });
553
+ };
554
+ var addAggregation = function () {
555
+ // setAggregations([
556
+ // {
557
+ // column: selectedTable.columns.filter(
558
+ // (col) => getPostgresBasicType(col) === "number"
559
+ // )[0],
560
+ // aggregationType: "sum",
561
+ // },
562
+ // ]);
563
+ setAggregations(function (aggregations) {
564
+ var newAggregations = __spreadArray(__spreadArray([], aggregations, true), [
565
+ {
566
+ column: selectedTable.columns.filter(function (col) {
567
+ return getPostgresBasicType(col) === 'number' &&
568
+ !aggregations.map(function (elem) { return elem.name; }).includes(col.name);
569
+ })[0],
570
+ aggregationType: 'sum',
571
+ },
572
+ ], false);
573
+ return newAggregations;
574
+ });
575
+ };
576
+ useEffect(function () {
577
+ // if selected table changes, clear everything
578
+ if (selectedTable.displayName !== AST.from.table) {
579
+ setSelectedColumn(selectedTable.columns[0]);
580
+ setSortableColumns(selectedTable.columns.map(function (col) { return col.name; }));
581
+ setGroupBys([]);
582
+ setSortBys([]);
583
+ setFilters([]);
584
+ // setAST((AST) => {
585
+ // return {
586
+ // with: null,
587
+ // type: "select",
588
+ // options: null,
589
+ // distinct: { type: null },
590
+ // columns: "*",
591
+ // into: { position: null },
592
+ // where: null,
593
+ // groupby: null,
594
+ // having: null,
595
+ // orderby: null,
596
+ // limit: { seperator: "", value: [] },
597
+ // window: null,
598
+ // from: [{ db: null, table: selectedTable.displayName, as: null }],
599
+ // };
600
+ // });
601
+ return;
602
+ }
603
+ }, [selectedTable]);
604
+ // USE EFFECT HOOK THAT TRANSFORMS "FILTERS ARRAY INTO AST"
605
+ useEffect(function () {
606
+ if (filters.length || groupBys.length || aggregations.length) {
607
+ var newAST = {
608
+ with: null,
609
+ type: 'select',
610
+ options: null,
611
+ distinct: null,
612
+ columns: null,
613
+ into: { position: null },
614
+ from: [{ db: null, table: selectedTable.displayName, as: null }],
615
+ where: null,
616
+ groupby: null,
617
+ having: null,
618
+ orderby: null,
619
+ limit: null,
620
+ window: null,
621
+ };
622
+ // FILTERS
623
+ for (var i = 0; i < filters.length; i++) {
624
+ var filter = filters[i];
625
+ var column = filter.column, columnType_1 = filter.columnType, stringFilterValues_1 = filter.stringFilterValues, numberStart_1 = filter.numberStart, numberEnd_1 = filter.numberEnd, dateStart_1 = filter.dateStart, dateEnd_1 = filter.dateEnd;
626
+ var newCondition = void 0;
627
+ if (columnType_1 === 'string') {
628
+ newCondition = {
629
+ type: 'binary_expr',
630
+ operator: 'IN',
631
+ left: {
632
+ type: 'column_ref',
633
+ table: null,
634
+ column: column,
635
+ },
636
+ right: {
637
+ type: 'expr_list',
638
+ value: stringFilterValues_1.map(function (value) { return ({
639
+ type: 'single_quote_string',
640
+ value: value,
641
+ }); }),
642
+ },
643
+ };
644
+ }
645
+ else if (columnType_1 === 'number') {
646
+ newCondition = {
647
+ type: 'binary_expr',
648
+ operator: 'BETWEEN',
649
+ left: {
650
+ type: 'column_ref',
651
+ table: null,
652
+ column: column,
653
+ },
654
+ right: {
655
+ type: 'expr_list',
656
+ value: [
657
+ { type: 'number', value: numberStart_1 },
658
+ { type: 'number', value: numberEnd_1 },
659
+ ],
660
+ },
661
+ };
662
+ }
663
+ else if (columnType_1 === 'date') {
664
+ newCondition = {
665
+ type: 'binary_expr',
666
+ operator: 'BETWEEN',
667
+ left: {
668
+ type: 'column_ref',
669
+ table: null,
670
+ column: column,
671
+ },
672
+ right: {
673
+ type: 'expr_list',
674
+ value: [
675
+ {
676
+ type: 'single_quote_string',
677
+ value: format(new Date(dateStart_1), 'MM/dd/yyyy'),
678
+ },
679
+ {
680
+ type: 'single_quote_string',
681
+ value: format(new Date(dateEnd_1), 'MM/dd/yyyy'),
682
+ },
683
+ ],
684
+ },
685
+ };
686
+ }
687
+ if (!newAST.where) {
688
+ newAST.where = newCondition;
689
+ }
690
+ else {
691
+ newAST.where = {
692
+ type: 'binary_expr',
693
+ operator: 'AND',
694
+ left: newAST.where,
695
+ right: newCondition,
696
+ };
697
+ }
698
+ }
699
+ // GROUP BYS and AGGREGATIONS
700
+ // if (groupBys.length > 0) {
701
+ // newAST.groupby = groupBys.map((groupBy) => ({
702
+ // type: "column_ref",
703
+ // table: null,
704
+ // column: groupBy.column,
705
+ // }));
706
+ // if (aggregations.length > 0) {
707
+ // newAST.columns = [
708
+ // ...groupBys.map((groupBy) => ({
709
+ // expr: {
710
+ // type: "column_ref",
711
+ // table: null,
712
+ // column: groupBy.column,
713
+ // },
714
+ // as: null,
715
+ // })),
716
+ // ...aggregations.map((aggregation) => ({
717
+ // expr: {
718
+ // type: "aggr_func",
719
+ // name: aggregation.aggregationType.toUpperCase(),
720
+ // args: {
721
+ // expr: {
722
+ // type: "column_ref",
723
+ // table: null,
724
+ // column: aggregation.column.name,
725
+ // },
726
+ // },
727
+ // over: null,
728
+ // },
729
+ // as: null,
730
+ // })),
731
+ // ];
732
+ // } else {
733
+ // newAST.columns = groupBys.map((groupBy) => ({
734
+ // expr: {
735
+ // type: "column_ref",
736
+ // table: null,
737
+ // column: groupBy.column,
738
+ // },
739
+ // as: null,
740
+ // }));
741
+ // }
742
+ // } else {
743
+ // newAST.columns = "*";
744
+ // newAST.groupby = null;
745
+ // }
746
+ // GROUP BYS
747
+ if (groupBys.length > 0) {
748
+ newAST.columns = [];
749
+ newAST.groupby = [];
750
+ for (var i = 0; i < groupBys.length; i++) {
751
+ var groupBy = groupBys[i];
752
+ if (groupBy.columnType === 'date') {
753
+ newAST.columns.push({
754
+ expr: {
755
+ type: 'function',
756
+ name: 'date_trunc',
757
+ args: {
758
+ type: 'expr_list',
759
+ value: [
760
+ {
761
+ type: 'single_quote_string',
762
+ value: groupBy.bucket,
763
+ },
764
+ {
765
+ type: 'column_ref',
766
+ table: null,
767
+ column: groupBy.column,
768
+ },
769
+ ],
770
+ },
771
+ over: null,
772
+ },
773
+ as: groupBy.bucket,
774
+ });
775
+ newAST.groupby.push({
776
+ type: 'column_ref',
777
+ table: null,
778
+ column: groupBy.bucket,
779
+ });
780
+ }
781
+ else {
782
+ newAST.columns.push({
783
+ expr: {
784
+ type: 'column_ref',
785
+ table: null,
786
+ column: groupBy.column,
787
+ },
788
+ as: null,
789
+ });
790
+ newAST.groupby.push({
791
+ type: 'column_ref',
792
+ table: null,
793
+ column: groupBy.column,
794
+ });
795
+ }
796
+ }
797
+ // AGGREGATIONS
798
+ if (aggregations.length > 0) {
799
+ for (var i = 0; i < aggregations.length; i++) {
800
+ var aggregation = aggregations[i];
801
+ newAST.columns.push({
802
+ expr: {
803
+ type: 'aggr_func',
804
+ name: aggregation.aggregationType.toUpperCase(),
805
+ args: {
806
+ expr: {
807
+ type: 'column_ref',
808
+ table: null,
809
+ column: aggregation.column.name,
810
+ },
811
+ },
812
+ over: null,
813
+ },
814
+ as: null,
815
+ });
816
+ }
817
+ }
818
+ }
819
+ else {
820
+ newAST.columns = '*';
821
+ newAST.groupby = null;
822
+ }
823
+ if (sortBys.length > 0) {
824
+ newAST.orderby = [];
825
+ for (var i = 0; i < sortBys.length; i++) {
826
+ var sortBy = sortBys[i];
827
+ newAST.orderby.push({
828
+ expr: { type: 'column_ref', table: null, column: sortBy.column },
829
+ type: sortBy.direction === 'descending' ? 'DESC' : 'ASC',
830
+ });
831
+ }
832
+ // "orderby":[{"expr":{"type":"column_ref","table":null,"column":"amount"},"type":"DESC"},{"expr":{"type":"column_ref","table":null,"column":"month"},"type":"ASC"}]
833
+ }
834
+ setAST(newAST);
835
+ }
836
+ }, [filters, groupBys, aggregations, sortBys]);
837
+ var removeFilter = function (index) {
838
+ setFilters(function (oldFilters) {
839
+ var newFilters = __spreadArray([], oldFilters, true);
840
+ newFilters.splice(index, 1);
841
+ return newFilters;
842
+ });
843
+ setIndexBeingEdited(-1);
844
+ };
845
+ var computeStats = useCallback(function (column) {
846
+ var _a;
847
+ if (!computedColumns[column.name] && data) {
848
+ var basicType = getPostgresBasicType(column);
849
+ var result = void 0;
850
+ if (basicType === 'number') {
851
+ var min_1 = Infinity, max_1 = -Infinity;
852
+ data.forEach(function (row) {
853
+ var value = row[column.name];
854
+ min_1 = Math.min(min_1, value);
855
+ max_1 = Math.max(max_1, value);
856
+ });
857
+ result = { min: min_1, max: max_1 };
858
+ }
859
+ else if (basicType === 'string') {
860
+ var freqMap_1 = {};
861
+ data.forEach(function (row) {
862
+ var value = row[column.name];
863
+ freqMap_1[value] = (freqMap_1[value] || 0) + 1;
864
+ });
865
+ result = Object.entries(freqMap_1)
866
+ .sort(function (a, b) { return b[1] - a[1]; })
867
+ .slice(0, 6)
868
+ .map(function (_a) {
869
+ var key = _a[0];
870
+ return key;
871
+ });
872
+ }
873
+ else {
874
+ // Handle other column types if necessary
875
+ }
876
+ setComputedColumns(__assign(__assign({}, computedColumns), (_a = {}, _a[column.name] = result, _a)));
877
+ }
878
+ }, [data, computedColumns]);
879
+ // Call this function whenever the selected column changes
880
+ useEffect(function () {
881
+ computeStats(selectedColumn);
882
+ }, [selectedColumn]);
883
+ // Use the results directly in your component
884
+ var columnStats = computedColumns[selectedColumn.name];
885
+ // useEffect(() => {
886
+ // if (AST && AST.from[0].table) {
887
+ // const parser = new Parser();
888
+ // const sqlQuery = parser.sqlify(AST, { database: "PostgresQL" });
889
+ // if (sqlQuery) {
890
+ // runQuery(sqlQuery);
891
+ // return;
892
+ // }
893
+ // }
894
+ // }, [AST]);
895
+ useEffect(function () {
896
+ if (!aggregations.length) {
897
+ setAggregations([
898
+ {
899
+ column: selectedTable.columns.filter(function (col) { return getPostgresBasicType(col) === 'number'; })[0],
900
+ aggregationType: 'sum',
901
+ },
902
+ ]);
903
+ }
904
+ }, [selectedGroupByColumn]);
905
+ useEffect(function () {
906
+ var getSqlQueryFromAST = function () { return __awaiter(_this, void 0, void 0, function () {
907
+ var response, sqlQuery_1, err_1;
908
+ return __generator(this, function (_a) {
909
+ switch (_a.label) {
910
+ case 0:
911
+ _a.trys.push([0, 3, , 4]);
912
+ if (!(AST && AST.from[0].table)) return [3 /*break*/, 2];
913
+ return [4 /*yield*/, axios.post('https://quill-344421.uc.r.appspot.com/sqlify', { ast: AST })];
914
+ case 1:
915
+ response = _a.sent();
916
+ sqlQuery_1 = response.data.query;
917
+ // alert(sqlQuery);
918
+ if (sqlQuery_1) {
919
+ onChangeQuery(sqlQuery_1);
920
+ runQuery(sqlQuery_1);
921
+ setSqlQuery(sqlQuery_1);
922
+ if (AST.columns === '*') {
923
+ setSortableColumns(selectedTable.columns.map(function (col) { return col.name; }));
924
+ }
925
+ else if (AST.columns.length) {
926
+ setSortableColumns(AST.columns.map(function (elem) { return elem.as || elem.expr.name; }));
927
+ }
928
+ }
929
+ _a.label = 2;
930
+ case 2: return [3 /*break*/, 4];
931
+ case 3:
932
+ err_1 = _a.sent();
933
+ console.error(err_1);
934
+ return [3 /*break*/, 4];
935
+ case 4: return [2 /*return*/];
936
+ }
937
+ });
938
+ }); };
939
+ getSqlQueryFromAST();
940
+ }, [AST]);
941
+ useEffect(function () {
942
+ if (sortableColumns.length) {
943
+ setSelectedSortByColumn(sortableColumns[0]);
944
+ }
945
+ }, [sortableColumns]);
946
+ if (!schema || !schema.length) {
947
+ return null;
948
+ }
949
+ return (_jsxs("div", __assign({ style: { marginLeft: '25px' } }, { children: [_jsx("div", __assign({ style: {
950
+ fontSize: '0.8rem',
951
+ marginBottom: '6px',
952
+ fontWeight: 'bold',
953
+ color: theme.secondaryTextColor,
954
+ } }, { children: "Table" })), _jsx(SelectComponent, { value: selectedTable.displayName, onChange: function (e) {
955
+ var table = schema.find(function (t) { return t.displayName === e; });
956
+ setSelectedTable(table);
957
+ }, options: (schema === null || schema === void 0 ? void 0 : schema.length)
958
+ ? schema.map(function (elem) {
959
+ return { label: elem.displayName, value: elem.displayName };
960
+ })
961
+ : [] }), _jsxs("div", __assign({ style: { display: 'flex', flexDirection: 'column', marginTop: '12px' } }, { children: [_jsx(AddFilterModal2, { filters: filters, selectedColumn: selectedColumn, numberStart: numberStart, numberEnd: numberEnd, dateStart: dateStart, setDateStart: setDateStart, columnStats: columnStats, stringFilterValues: stringFilterValues, setStringFilterValues: setStringFilterValues, addFilter: addFilter, setSelectedColumn: setSelectedColumn, setNumberStart: setNumberStart, setNumberEnd: setNumberEnd, selectedTable: selectedTable, columnType: columnType, dateEnd: dateEnd, setDateEnd: setDateEnd, removeFilter: removeFilter, selectFilter: selectFilter, indexBeingEdited: indexBeingEdited, updateFilter: updateFilter, SelectComponent: SelectComponent, theme: theme }), _jsx(GroupByModal2, { selectedTable: selectedTable, groupBys: groupBys, selectedGroupByColumn: selectedGroupByColumn, setSelectedGroupByColumn: setSelectedGroupByColumn, addGroupBy: addGroupBy, groupByColumnType: groupByColumnType, removeGroupBy: removeGroupBy, selectGroupBy: selectGroupBy, groupByIndexBeingEdited: groupByIndexBeingEdited, updateGroupBy: updateGroupBy, aggregations: aggregations, setAggregationColumn: setAggregationColumn, setAggregationType: setAggregationType, SelectComponent: SelectComponent, addAggregation: addAggregation, dateBucket: dateBucket, setDateBucket: setDateBucket, theme: theme }), _jsx(SortByModal, { selectedTable: selectedTable, sortableColumns: sortableColumns, sortBys: sortBys, selectedSortByColumn: selectedSortByColumn, setSelectedSortByColumn: setSelectedSortByColumn, selectedSortByDirection: selectedSortByDirection, setSelectedSortByDirection: setSelectedSortByDirection, addSortBy: addSortBy, removeSortBy: removeSortBy, selectSortBy: selectSortBy, sortByIndexBeingEdited: sortByIndexBeingEdited, updateSortBy: updateSortBy, SelectComponent: SelectComponent, theme: theme })] }))] })));
962
+ }
963
+ function FilterTag(_a) {
964
+ var id = _a.id, label = _a.label, removeFilter = _a.removeFilter, index = _a.index, selectFilter = _a.selectFilter, theme = _a.theme;
965
+ var handleRemoveFilter = function () {
966
+ removeFilter(index);
967
+ };
968
+ var handleSelectFilter = function () {
969
+ selectFilter(index);
970
+ };
971
+ return (_jsxs("div", __assign({ id: id, onClick: handleSelectFilter, style: {
972
+ marginLeft: '12px',
973
+ cursor: 'pointer',
974
+ border: '1px',
975
+ borderColor: '#EFF0FC',
976
+ borderRadius: 6,
977
+ backgroundColor: '#EFF0FC',
978
+ paddingLeft: '1rem',
979
+ paddingRight: '0.5rem',
980
+ // paddingTop: "0.44rem",
981
+ // paddingBottom: "0.44rem",
982
+ height: 35,
983
+ display: 'flex',
984
+ alignItems: 'center',
985
+ fontSize: 14,
986
+ fontWeight: 'medium',
987
+ color: theme.primaryTextColor,
988
+ outline: 'none',
989
+ // ring: "2",
990
+ // ringColor: "white",
991
+ // ringOpacity: "75",
992
+ } }, { children: [_jsx("div", __assign({ id: id, style: { textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, { children: label })), _jsx("div", __assign({
993
+ // onClick={handleRemoveFilter}
994
+ onClick: function (e) {
995
+ e.stopPropagation(); // Prevents the event from bubbling up to the parent
996
+ handleRemoveFilter();
997
+ }, style: {
998
+ display: 'flex',
999
+ flexDirection: 'row',
1000
+ alignItems: 'center',
1001
+ cursor: 'pointer',
1002
+ paddingLeft: '0.375rem',
1003
+ } }, { children: _jsx(XMarkIcon, { style: {
1004
+ height: '1.25rem',
1005
+ width: '1.25rem',
1006
+ color: theme.primaryTextColor,
1007
+ }, "aria-hidden": "true" }) }))] })));
1008
+ }
1009
+ var SortByModal = function (_a) {
1010
+ var selectedSortByColumn = _a.selectedSortByColumn, selectedSortByDirection = _a.selectedSortByDirection, setSelectedSortByColumn = _a.setSelectedSortByColumn, setSelectedSortByDirection = _a.setSelectedSortByDirection, selectedTable = _a.selectedTable, sortableColumns = _a.sortableColumns, removeSortBy = _a.removeSortBy, selectSortBy = _a.selectSortBy, updateSortBy = _a.updateSortBy, addSortBy = _a.addSortBy, sortBys = _a.sortBys, SelectComponent = _a.SelectComponent, sortByIndexBeingEdited = _a.sortByIndexBeingEdited, theme = _a.theme;
1011
+ var dropdownRef = useRef(null);
1012
+ var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
1013
+ useEffect(function () {
1014
+ // Event listener to close the dropdown menu when clicking outside
1015
+ var handleOutsideClick = function (event) {
1016
+ if (event.target.id === 'sort-toggle-button' ||
1017
+ event.target.id === 'sort-tag') {
1018
+ setIsOpen(function (isOpen) { return !isOpen; });
1019
+ return;
1020
+ }
1021
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
1022
+ setIsOpen(false);
1023
+ }
1024
+ };
1025
+ // Attach the event listener to the document
1026
+ document.addEventListener('click', handleOutsideClick);
1027
+ // Clean up the event listener on component unmount
1028
+ return function () {
1029
+ document.removeEventListener('click', handleOutsideClick);
1030
+ };
1031
+ }, []);
1032
+ return (_jsx("div", __assign({ style: { display: 'flex', flexDirection: 'column', marginTop: 12 } }, { children: _jsxs("div", __assign({ style: {
1033
+ position: 'relative',
1034
+ display: 'inline-block',
1035
+ textAlign: 'left',
1036
+ } }, { children: [_jsxs("div", __assign({ style: {
1037
+ display: 'flex',
1038
+ flexDirection: 'row',
1039
+ alignItems: 'center',
1040
+ } }, { children: [_jsx("button", __assign({ id: "sort-toggle-button",
1041
+ // onClick={() => setIsOpen((isOpen) => !isOpen)}
1042
+ type: "button", "aria-haspopup": "menu", "aria-expanded": "true", "data-headlessui-state": "open", style: {
1043
+ display: 'inline-flex',
1044
+ boxShadow: 'rgba(231, 231, 231, 0.5) 0px 1px 2px 0px',
1045
+ borderRadius: '0.375rem',
1046
+ backgroundColor: 'rgba(0, 0, 0, 0)',
1047
+ padding: '0.375rem 0.75rem',
1048
+ fontSize: '0.875rem',
1049
+ fontWeight: '500',
1050
+ color: theme.primaryTextColor,
1051
+ borderWidth: 1,
1052
+ borderStyle: 'solid',
1053
+ borderColor: theme.borderColor,
1054
+ } }, { children: "Sort" })), _jsx("div", __assign({ style: {
1055
+ overflowX: 'scroll',
1056
+ display: 'flex',
1057
+ flexDirection: 'row',
1058
+ alignItems: 'center',
1059
+ } }, { children: sortBys.map(function (elem, index) { return (_jsx(FilterTag, { id: "sort-tag", label: elem.column, removeFilter: removeSortBy, selectFilter: selectSortBy, index: index, theme: theme })); }) }))] })), isOpen && (_jsxs("div", __assign({ ref: dropdownRef, role: "menu", tabindex: "0", "data-headlessui-state": "open", style: {
1060
+ zIndex: 120,
1061
+ position: 'absolute',
1062
+ left: '0px',
1063
+ marginTop: '12px',
1064
+ transformOrigin: 'right top',
1065
+ display: 'flex',
1066
+ flexDirection: 'column',
1067
+ padding: '1rem',
1068
+ borderRadius: '0.375rem',
1069
+ backgroundColor: 'rgb(255, 255, 255)',
1070
+ boxShadow: 'rgba(0, 0, 0, 0.2) 0px 1px 5px 0px',
1071
+ }, className: "transform opacity-100 scale-100" }, { children: [_jsx("div", __assign({ style: {
1072
+ display: 'flex',
1073
+ flexDirection: 'row',
1074
+ alignItems: 'center',
1075
+ } }, { children: _jsxs("div", __assign({ style: { display: 'flex', flexDirection: 'column' } }, { children: [_jsx("div", __assign({ style: {
1076
+ fontSize: '0.875rem',
1077
+ marginBottom: '6px',
1078
+ fontWeight: '600',
1079
+ color: '#384151',
1080
+ opacity: 0.7,
1081
+ } }, { children: "Column" })), _jsx(SelectComponent, { value: selectedSortByColumn, onChange: function (e) {
1082
+ setSelectedSortByColumn(e);
1083
+ }, options: sortableColumns.map(function (elem) {
1084
+ return { label: elem, value: elem };
1085
+ }) })] })) })), _jsx("div", __assign({ style: {
1086
+ fontSize: '0.875rem',
1087
+ marginBottom: '6px',
1088
+ fontWeight: '600',
1089
+ color: '#384151',
1090
+ opacity: 0.7,
1091
+ marginTop: 20,
1092
+ } }, { children: "Direction" })), _jsx(SelectComponent, { value: selectedSortByDirection, onChange: function (e) {
1093
+ setSelectedSortByDirection(e);
1094
+ }, options: [
1095
+ { label: 'ascending', value: 'ascending' },
1096
+ { label: 'descending', value: 'descending' },
1097
+ ] }), _jsx("button", __assign({ style: {
1098
+ width: '15.3125rem',
1099
+ marginTop: '1.25rem',
1100
+ paddingTop: '0.5rem',
1101
+ paddingBottom: '0.5rem',
1102
+ paddingLeft: '0.75rem',
1103
+ paddingRight: '0.75rem',
1104
+ backgroundColor: '#384151',
1105
+ // hover: { opacity: "90" },
1106
+ color: 'white',
1107
+ fontWeight: '500',
1108
+ borderRadius: '0.375rem',
1109
+ boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1110
+ }, onClick: function () {
1111
+ if (sortByIndexBeingEdited > -1) {
1112
+ updateSortBy(sortByIndexBeingEdited);
1113
+ setIsOpen(false);
1114
+ // close();
1115
+ return;
1116
+ }
1117
+ addSortBy();
1118
+ setIsOpen(false);
1119
+ // close();
1120
+ } }, { children: sortByIndexBeingEdited > -1 ? 'Edit sort' : 'Add sort' }))] })))] })) })));
1121
+ };
1122
+ var GroupByModal2 = function (_a) {
1123
+ var selectedGroupByColumn = _a.selectedGroupByColumn, addGroupBy = _a.addGroupBy, setSelectedGroupByColumn = _a.setSelectedGroupByColumn, selectedTable = _a.selectedTable, groupByColumnType = _a.groupByColumnType, groupByIndexBeingEdited = _a.groupByIndexBeingEdited, updateGroupBy = _a.updateGroupBy, groupBys = _a.groupBys, removeGroupBy = _a.removeGroupBy, selectGroupBy = _a.selectGroupBy, SelectComponent = _a.SelectComponent, aggregations = _a.aggregations, setAggregationColumn = _a.setAggregationColumn, setAggregationType = _a.setAggregationType, addAggregation = _a.addAggregation, dateBucket = _a.dateBucket, setDateBucket = _a.setDateBucket, theme = _a.theme;
1124
+ var dropdownRef = useRef(null);
1125
+ var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
1126
+ useEffect(function () {
1127
+ // Event listener to close the dropdown menu when clicking outside
1128
+ var handleOutsideClick = function (event) {
1129
+ if (event.target.id === 'group-toggle-button' ||
1130
+ event.target.id === 'group-tag') {
1131
+ setIsOpen(function (isOpen) { return !isOpen; });
1132
+ return;
1133
+ }
1134
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
1135
+ setIsOpen(false);
1136
+ }
1137
+ };
1138
+ // Attach the event listener to the document
1139
+ document.addEventListener('click', handleOutsideClick);
1140
+ // Clean up the event listener on component unmount
1141
+ return function () {
1142
+ document.removeEventListener('click', handleOutsideClick);
1143
+ };
1144
+ }, []);
1145
+ return (_jsx("div", __assign({ style: { display: 'flex', flexDirection: 'column' } }, { children: _jsxs("div", __assign({ style: {
1146
+ position: 'relative',
1147
+ display: 'inline-block',
1148
+ textAlign: 'left',
1149
+ } }, { children: [_jsxs("div", __assign({ style: {
1150
+ display: 'flex',
1151
+ flexDirection: 'row',
1152
+ alignItems: 'center',
1153
+ } }, { children: [_jsx("button", __assign({ id: "group-toggle-button",
1154
+ // onClick={() => setIsOpen((isOpen) => !isOpen)}
1155
+ type: "button", "aria-haspopup": "menu", "aria-expanded": "true", "data-headlessui-state": "open", style: {
1156
+ display: 'inline-flex',
1157
+ boxShadow: 'rgba(231, 231, 231, 0.5) 0px 1px 2px 0px',
1158
+ borderRadius: '0.375rem',
1159
+ backgroundColor: 'rgba(0, 0, 0, 0)',
1160
+ padding: '0.375rem 0.75rem',
1161
+ fontSize: '0.875rem',
1162
+ fontWeight: '500',
1163
+ color: theme.primaryTextColor,
1164
+ borderWidth: 1,
1165
+ borderStyle: 'solid',
1166
+ borderColor: theme.borderColor,
1167
+ } }, { children: "Groups" })), _jsx("div", __assign({ style: {
1168
+ overflowX: 'scroll',
1169
+ display: 'flex',
1170
+ flexDirection: 'row',
1171
+ alignItems: 'center',
1172
+ } }, { children: groupBys.map(function (elem, index) { return (_jsx(FilterTag, { id: "group-tag", label: elem.tag, removeFilter: removeGroupBy, selectFilter: selectGroupBy, index: index })); }) }))] })), isOpen && (_jsxs("div", __assign({ ref: dropdownRef, role: "menu", tabindex: "0", "data-headlessui-state": "open", style: {
1173
+ zIndex: 120,
1174
+ position: 'absolute',
1175
+ left: '0px',
1176
+ marginTop: '12px',
1177
+ transformOrigin: 'right top',
1178
+ padding: '1rem',
1179
+ borderRadius: '0.375rem',
1180
+ backgroundColor: 'rgb(255, 255, 255)',
1181
+ boxShadow: 'rgba(0, 0, 0, 0.2) 0px 1px 5px 0px',
1182
+ } }, { children: [_jsxs("div", __assign({ style: {
1183
+ display: 'flex',
1184
+ flexDirection: 'row',
1185
+ alignItems: 'center',
1186
+ } }, { children: [_jsxs("div", __assign({ style: { display: 'flex', flexDirection: 'column' } }, { children: [_jsx("div", __assign({ style: {
1187
+ fontSize: '0.875rem',
1188
+ marginBottom: '6px',
1189
+ fontWeight: '600',
1190
+ color: '#384151',
1191
+ opacity: 0.7,
1192
+ } }, { children: "Column" })), _jsx(SelectComponent, { value: selectedGroupByColumn.name, onChange: function (e) {
1193
+ var column = selectedTable.columns.find(function (c) { return c.name === e; });
1194
+ setSelectedGroupByColumn(column);
1195
+ }, options: selectedTable.columns.map(function (elem) {
1196
+ return { label: elem.name, value: elem.name };
1197
+ }) })] })), groupByColumnType === 'date' && (_jsxs("div", __assign({ style: {
1198
+ display: 'flex',
1199
+ flexDirection: 'column',
1200
+ marginLeft: 12,
1201
+ } }, { children: [_jsx("div", __assign({ style: {
1202
+ fontSize: '0.875rem',
1203
+ marginBottom: '6px',
1204
+ fontWeight: '600',
1205
+ color: '#384151',
1206
+ opacity: 0.7,
1207
+ } }, { children: "Bucket" })), _jsx(SelectComponent, { value: dateBucket, onChange: function (e) {
1208
+ setDateBucket(e);
1209
+ }, options: [
1210
+ { label: 'month', value: 'month' },
1211
+ { label: 'day', value: 'day' },
1212
+ { label: 'week', value: 'week' },
1213
+ ] })] })))] })), _jsx("div", __assign({ style: {
1214
+ fontSize: '0.875rem',
1215
+ marginBottom: '6px',
1216
+ fontWeight: '600',
1217
+ color: '#384151',
1218
+ opacity: 0.7,
1219
+ marginTop: 20,
1220
+ } }, { children: "Aggregations" })), aggregations.map(function (aggregation, index) {
1221
+ var _a;
1222
+ return (
1223
+ // setAggregationType
1224
+ _jsxs("div", __assign({ style: {
1225
+ display: 'flex',
1226
+ flexDirection: 'row',
1227
+ alignItems: 'center',
1228
+ } }, { children: [_jsx(SelectComponent, { value: (_a = aggregation.column) === null || _a === void 0 ? void 0 : _a.name, onChange: function (e) {
1229
+ var column = selectedTable.columns.find(function (c) { return c.name === e; });
1230
+ setAggregationColumn(column, index);
1231
+ }, options: selectedTable.columns.map(function (elem) {
1232
+ return { label: elem.name, value: elem.name };
1233
+ }) }), _jsx("div", { style: { width: 12 } }), _jsx(SelectComponent, { value: aggregation.aggregationType, onChange: function (e) {
1234
+ setAggregationType(e, index);
1235
+ }, options: [
1236
+ { label: 'sum', value: 'sum' },
1237
+ { label: 'average', value: 'average' },
1238
+ { label: 'count', value: 'count' },
1239
+ ] })] })));
1240
+ }), _jsx("button", __assign({ style: {
1241
+ width: '100%',
1242
+ marginTop: '1.25rem',
1243
+ paddingTop: '0.5rem',
1244
+ paddingBottom: '0.5rem',
1245
+ paddingLeft: '0.75rem',
1246
+ paddingRight: '0.75rem',
1247
+ backgroundColor: '#384151',
1248
+ // hover: { opacity: "90" },
1249
+ color: 'white',
1250
+ fontWeight: '500',
1251
+ borderRadius: '0.375rem',
1252
+ boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1253
+ }, onClick: function () {
1254
+ if (groupByIndexBeingEdited > -1) {
1255
+ updateGroupBy(groupByIndexBeingEdited);
1256
+ setIsOpen(false);
1257
+ // close();
1258
+ return;
1259
+ }
1260
+ addGroupBy();
1261
+ setIsOpen(false);
1262
+ // close();
1263
+ } }, { children: groupByIndexBeingEdited > -1 ? 'Edit group by' : 'Add group by' }))] })))] })) })));
1264
+ };
1265
+ var AddFilterModal2 = function (_a) {
1266
+ var filters = _a.filters, selectedColumn = _a.selectedColumn, numberStart = _a.numberStart, numberEnd = _a.numberEnd, dateStart = _a.dateStart, setDateStart = _a.setDateStart, columnStats = _a.columnStats, stringFilterValues = _a.stringFilterValues, setStringFilterValues = _a.setStringFilterValues, addFilter = _a.addFilter, setSelectedColumn = _a.setSelectedColumn, setNumberStart = _a.setNumberStart, setNumberEnd = _a.setNumberEnd, selectedTable = _a.selectedTable, columnType = _a.columnType, setDateEnd = _a.setDateEnd, dateEnd = _a.dateEnd, removeFilter = _a.removeFilter, selectFilter = _a.selectFilter, indexBeingEdited = _a.indexBeingEdited, updateFilter = _a.updateFilter, SelectComponent = _a.SelectComponent, theme = _a.theme;
1267
+ var dropdownRef = useRef(null);
1268
+ var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
1269
+ useEffect(function () {
1270
+ // Event listener to close the dropdown menu when clicking outside
1271
+ var handleOutsideClick = function (event) {
1272
+ if (event.target.id === 'toggle-button' ||
1273
+ event.target.id === 'filter-tag') {
1274
+ setIsOpen(function (isOpen) { return !isOpen; });
1275
+ return;
1276
+ }
1277
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
1278
+ setIsOpen(false);
1279
+ }
1280
+ };
1281
+ // Attach the event listener to the document
1282
+ document.addEventListener('click', handleOutsideClick);
1283
+ // Clean up the event listener on component unmount
1284
+ return function () {
1285
+ document.removeEventListener('click', handleOutsideClick);
1286
+ };
1287
+ }, []);
1288
+ return (_jsxs("div", __assign({ style: { display: 'flex', flexDirection: 'column' } }, { children: [_jsxs("div", __assign({ style: {
1289
+ position: 'relative',
1290
+ display: 'inline-block',
1291
+ textAlign: 'left',
1292
+ } }, { children: [_jsxs("div", __assign({ style: {
1293
+ display: 'flex',
1294
+ flexDirection: 'row',
1295
+ alignItems: 'center',
1296
+ } }, { children: [_jsx("button", __assign({ id: "toggle-button",
1297
+ // onClick={() => setIsOpen((isOpen) => !isOpen)}
1298
+ type: "button", "aria-haspopup": "menu", "aria-expanded": "true", "data-headlessui-state": "open", style: {
1299
+ display: 'inline-flex',
1300
+ borderWidth: '1px',
1301
+ borderStyle: 'solid',
1302
+ borderColor: theme.borderColor,
1303
+ boxShadow: 'rgba(231, 231, 231, 0.5) 0px 1px 2px 0px',
1304
+ borderRadius: '0.375rem',
1305
+ backgroundColor: theme.backgroundColor,
1306
+ padding: '0.375rem 0.75rem',
1307
+ fontSize: '0.875rem',
1308
+ fontWeight: '500',
1309
+ color: theme.primaryTextColor,
1310
+ } }, { children: "Filters" })), _jsx("div", __assign({ style: {
1311
+ overflowX: 'scroll',
1312
+ display: 'flex',
1313
+ flexDirection: 'row',
1314
+ alignItems: 'center',
1315
+ } }, { children: filters.map(function (elem, index) { return (_jsx(FilterTag, { id: "filter-tag", label: elem.tag, removeFilter: removeFilter, selectFilter: selectFilter, index: index })); }) }))] })), isOpen && (_jsxs("div", __assign({ ref: dropdownRef, role: "menu", tabindex: "0", "data-headlessui-state": "open", style: {
1316
+ zIndex: 120,
1317
+ position: 'absolute',
1318
+ left: '0px',
1319
+ marginTop: '12px',
1320
+ transformOrigin: 'right top',
1321
+ padding: '1rem',
1322
+ borderRadius: '0.375rem',
1323
+ backgroundColor: 'rgb(255, 255, 255)',
1324
+ boxShadow: 'rgba(0, 0, 0, 0.2) 0px 1px 5px 0px',
1325
+ display: 'flex',
1326
+ flexDirection: 'column',
1327
+ } }, { children: [_jsx("div", __assign({ style: {
1328
+ fontSize: '0.875rem',
1329
+ marginBottom: '6px',
1330
+ fontWeight: '600',
1331
+ color: theme.secondaryFontColor,
1332
+ // opacity: 0.7,
1333
+ } }, { children: "Column" })), _jsx(SelectComponent, { value: selectedColumn.name, onChange: function (e) {
1334
+ var column = selectedTable.columns.find(function (c) { return c.name === e; });
1335
+ setSelectedColumn(column);
1336
+ }, options: selectedTable.columns.map(function (elem) {
1337
+ return { label: elem.name, value: elem.name };
1338
+ }) }), columnType === 'number' && (_jsx("div", __assign({ style: {
1339
+ width: '245px',
1340
+ maxWidth: '245px',
1341
+ zIndex: 50,
1342
+ } }, { children: _jsxs("div", __assign({ style: {
1343
+ display: 'flex',
1344
+ flexDirection: 'row',
1345
+ alignItems: 'center',
1346
+ justifyContent: 'space-between',
1347
+ } }, { children: [_jsxs("div", __assign({ style: {
1348
+ display: 'flex',
1349
+ flexDirection: 'column',
1350
+ marginTop: '20px',
1351
+ } }, { children: [_jsx("div", __assign({ style: {
1352
+ fontSize: '0.875rem',
1353
+ fontWeight: '600',
1354
+ color: '#384151',
1355
+ opacity: 0.75,
1356
+ } }, { children: "Minimum" })), _jsx("input", {
1357
+ // type="number"
1358
+ value: numberStart, onChange: function (e) { return setNumberStart(e.target.value); }, placeholder: "", style: {
1359
+ textAlign: 'right',
1360
+ width: '100px',
1361
+ border: '1px solid #E7E7E7',
1362
+ color: '#384151',
1363
+ marginTop: '4px',
1364
+ height: 38,
1365
+ paddingRight: 8,
1366
+ backgroundColor: 'white',
1367
+ borderRadius: '0.375rem',
1368
+ boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1)',
1369
+ } })] })), _jsxs("div", __assign({ style: {
1370
+ display: 'flex',
1371
+ flexDirection: 'column',
1372
+ marginTop: '20px',
1373
+ } }, { children: [_jsx("div", __assign({ style: {
1374
+ fontSize: '0.875rem',
1375
+ fontWeight: '600',
1376
+ color: '#384151',
1377
+ opacity: 0.75,
1378
+ } }, { children: "Maximum" })), _jsx("input", {
1379
+ // type="number"
1380
+ value: numberEnd, onChange: function (e) { return setNumberEnd(e.target.value); }, placeholder: "", style: {
1381
+ textAlign: 'right',
1382
+ width: '100px',
1383
+ border: '1px solid #E7E7E7',
1384
+ color: '#384151',
1385
+ marginTop: '4px',
1386
+ paddingRight: 8,
1387
+ height: 38,
1388
+ backgroundColor: 'white',
1389
+ borderRadius: '0.375rem',
1390
+ boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1)',
1391
+ } })] }))] })) }))), columnType === 'date' && (_jsxs("div", __assign({ style: {
1392
+ display: 'flex',
1393
+ flexDirection: 'row',
1394
+ alignItems: 'center',
1395
+ justifyContent: 'space-between',
1396
+ } }, { children: [_jsxs("div", __assign({ style: {
1397
+ display: 'flex',
1398
+ flexDirection: 'column',
1399
+ marginTop: '20px',
1400
+ } }, { children: [_jsx("div", __assign({ style: {
1401
+ fontSize: '0.8rem',
1402
+ fontWeight: '600',
1403
+ color: 'rgba(56, 65, 81, 0.7)',
1404
+ } }, { children: "Start date" })), _jsx("input", { type: "date", value: dateStart, onChange: function (e) { return setDateStart(e.target.value); }, placeholder: "Start date", style: {
1405
+ width: '115px',
1406
+ fontSize: '0.8rem',
1407
+ color: '#384151',
1408
+ borderWidth: '1px',
1409
+ marginTop: '4px',
1410
+ borderColor: '#E7E7E7',
1411
+ backgroundColor: 'white',
1412
+ borderRadius: '0.375rem',
1413
+ boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1414
+ paddingLeft: '0.5rem',
1415
+ paddingRight: '0.5rem',
1416
+ paddingTop: '0.375rem',
1417
+ paddingBottom: '0.375rem',
1418
+ } })] })), _jsxs("div", __assign({ style: {
1419
+ display: 'flex',
1420
+ flexDirection: 'column',
1421
+ marginTop: '20px',
1422
+ } }, { children: [_jsx("div", __assign({ style: {
1423
+ fontSize: '0.8rem',
1424
+ fontWeight: '600',
1425
+ color: 'rgba(56, 65, 81, 0.7)',
1426
+ } }, { children: "End date" })), _jsx("input", { type: "date", value: dateEnd, onChange: function (e) { return setDateEnd(e.target.value); }, placeholder: "End date", style: {
1427
+ width: '115px',
1428
+ fontSize: '0.8rem',
1429
+ color: '#384151',
1430
+ borderWidth: '1px',
1431
+ marginTop: '4px',
1432
+ borderColor: '#E7E7E7',
1433
+ backgroundColor: 'white',
1434
+ borderRadius: '0.375rem',
1435
+ boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1436
+ paddingLeft: '0.5rem',
1437
+ paddingRight: '0.5rem',
1438
+ paddingTop: '0.375rem',
1439
+ paddingBottom: '0.375rem',
1440
+ } })] }))] }))), columnType === 'string' &&
1441
+ columnStats &&
1442
+ columnStats.length > 0 && (_jsx("div", __assign({ style: {
1443
+ flex: 'flex',
1444
+ flexDirection: 'column',
1445
+ marginTop: '14px',
1446
+ } }, { children: columnStats.map(function (value) { return (_jsx("div", __assign({ style: {
1447
+ display: 'flex',
1448
+ flexDirection: 'row',
1449
+ alignItems: 'center',
1450
+ } }, { children: _jsxs("div", __assign({ style: {
1451
+ display: 'flex',
1452
+ flexDirection: 'row',
1453
+ alignItems: 'center',
1454
+ } }, { children: [_jsx(DivCheckbox
1455
+ // type="checkbox"
1456
+ // style={{
1457
+ // border: "1px solid red",
1458
+ // borderRadius: "4px",
1459
+ // boxSizing: "border-box",
1460
+ // color: "#fff",
1461
+ // height: "18px",
1462
+ // minWidth: "18px",
1463
+ // position: "relative",
1464
+ // width: "18px",
1465
+ // }}
1466
+ // className="border-[#E7E7E7] border-[1px] shadow-sm rounded-sm bg-white cursor-pointer"
1467
+ , {
1468
+ // type="checkbox"
1469
+ // style={{
1470
+ // border: "1px solid red",
1471
+ // borderRadius: "4px",
1472
+ // boxSizing: "border-box",
1473
+ // color: "#fff",
1474
+ // height: "18px",
1475
+ // minWidth: "18px",
1476
+ // position: "relative",
1477
+ // width: "18px",
1478
+ // }}
1479
+ // className="border-[#E7E7E7] border-[1px] shadow-sm rounded-sm bg-white cursor-pointer"
1480
+ checked: stringFilterValues.includes(value), onChange: function () {
1481
+ setStringFilterValues(function (prev) {
1482
+ return prev.includes(value)
1483
+ ? prev.filter(function (v) { return v !== value; })
1484
+ : __spreadArray(__spreadArray([], prev, true), [value], false);
1485
+ });
1486
+ } }), _jsx("div", __assign({ style: {
1487
+ marginLeft: 6,
1488
+ display: 'block',
1489
+ overflow: 'hidden',
1490
+ textOverflow: 'ellipsis',
1491
+ whiteSpace: 'nowrap',
1492
+ color: '#384151',
1493
+ } }, { children: value }))] }), value) }), value)); }) }))), _jsx("button", __assign({ style: {
1494
+ width: '245px',
1495
+ marginTop: '20px',
1496
+ padding: '0.5rem 0.75rem',
1497
+ backgroundColor: 'rgb(56, 65, 81)',
1498
+ color: 'rgb(255, 255, 255)',
1499
+ fontWeight: '500',
1500
+ borderRadius: '0.375rem',
1501
+ boxShadow: 'rgba(0, 0, 0, 0.05) 0px 1px 2px 0px',
1502
+ }, onClick: function () {
1503
+ if (indexBeingEdited > -1) {
1504
+ updateFilter(indexBeingEdited);
1505
+ setIsOpen(false);
1506
+ return;
1507
+ }
1508
+ addFilter();
1509
+ setIsOpen(false);
1510
+ } }, { children: indexBeingEdited > -1 ? 'Edit filter' : 'Add filter' }))] })))] })), _jsx("div", { style: { height: '12px' } })] })));
1511
+ };
1512
+ var DivCheckbox = function (_a) {
1513
+ var onChange = _a.onChange, checked = _a.checked;
1514
+ var toggleCheckbox = function () {
1515
+ if (onChange) {
1516
+ onChange(!checked);
1517
+ }
1518
+ };
1519
+ var style = {
1520
+ display: 'inline-block',
1521
+ width: '18px',
1522
+ height: '18px',
1523
+ background: checked ? '#384151' : '#fff',
1524
+ border: checked ? '1px solid #384151' : '1px solid #E7E7E7',
1525
+ borderRadius: '4px',
1526
+ position: 'relative',
1527
+ cursor: 'pointer',
1528
+ boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1529
+ };
1530
+ return (_jsx("div", __assign({ style: style, onClick: toggleCheckbox, "aria-checked": checked,
1531
+ // className="shadow-sm"
1532
+ role: "checkbox" }, { children: checked && _jsx(CheckIcon, { className: "text-white", "aria-hidden": "true" }) })));
1533
+ };
1534
+ //# sourceMappingURL=ReportBuilder.js.map