@quillsql/react 1.5.2 → 1.5.4

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,710 @@
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 __rest = (this && this.__rest) || function (s, e) {
49
+ var t = {};
50
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
51
+ t[p] = s[p];
52
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
53
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
54
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
55
+ t[p[i]] = s[p[i]];
56
+ }
57
+ return t;
58
+ };
59
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
60
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
61
+ if (ar || !(i in from)) {
62
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
63
+ ar[i] = from[i];
64
+ }
65
+ }
66
+ return to.concat(ar || Array.prototype.slice.call(from));
67
+ };
68
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
69
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
70
+ // @ts-nocheck
71
+ import React, { useContext, useEffect, useState } from 'react';
72
+ import axios from 'axios';
73
+ import { ClientContext, } from './Context';
74
+ function ReportBuilder(_a) {
75
+ var _this = this;
76
+ var schema = _a.schema, containerStyle = _a.containerStyle;
77
+ var _b = useState([]), data = _b[0], setData = _b[1];
78
+ var client = useContext(ClientContext)[0];
79
+ // const [organization] = useContext(OrganizationContext);
80
+ // const [environment] = useContext(EnvironmentContext);
81
+ var _c = useState([]), columns = _c[0], setColumns = _c[1];
82
+ var _d = useState([]), fields = _d[0], setFields = _d[1];
83
+ useEffect(function () {
84
+ function getData(schema) {
85
+ return __awaiter(this, void 0, void 0, function () {
86
+ var _id, queryEndpoint, queryHeaders, response;
87
+ return __generator(this, function (_a) {
88
+ switch (_a.label) {
89
+ case 0:
90
+ if (!(schema.length && !data.length)) return [3 /*break*/, 2];
91
+ _id = client._id, queryEndpoint = client.queryEndpoint, queryHeaders = client.queryHeaders;
92
+ return [4 /*yield*/, axios.post(queryEndpoint || 'https://quill-244421.uc.appspot.com/dashquery', {
93
+ query: "select * from ".concat(schema[0].name, " limit 10;"),
94
+ }, {
95
+ params: !queryEndpoint
96
+ ? {
97
+ orgId: organization && organization.id ? organization.id : '',
98
+ publicKey: _id,
99
+ }
100
+ : undefined,
101
+ headers: __assign(__assign({}, queryHeaders), { environment: environment }),
102
+ })];
103
+ case 1:
104
+ response = _a.sent();
105
+ setData(response.data.rows);
106
+ _a.label = 2;
107
+ case 2: return [2 /*return*/];
108
+ }
109
+ });
110
+ });
111
+ }
112
+ getData(schema);
113
+ }, [schema]);
114
+ var runQuery = function (query) { return __awaiter(_this, void 0, void 0, function () {
115
+ var _id, response;
116
+ return __generator(this, function (_a) {
117
+ switch (_a.label) {
118
+ case 0:
119
+ _id = client._id;
120
+ return [4 /*yield*/, axios.post(queryEndpoint, {
121
+ query: query,
122
+ }, {
123
+ params: {
124
+ orgId: organization && organization.id ? organization.id : '',
125
+ publicKey: _id,
126
+ },
127
+ headers: queryHeaders,
128
+ })];
129
+ case 1:
130
+ response = _a.sent();
131
+ setData(response.data.rows);
132
+ setColumns(response.data.fields.map(function (elem) { return convertPostgresColumn(elem); }));
133
+ setFields(response.data.fields);
134
+ return [2 /*return*/];
135
+ }
136
+ });
137
+ }); };
138
+ return (_jsx("div", __assign({ className: "flex flex-col pt-[0px] pl-[100px]" }, { children: _jsxs("div", __assign({ style: { width: 'calc(100vw - 30px)' }, className: "flex mt-[25px] flex-col pr-[50px] absolute z-10" }, { children: [_jsx("h1", __assign({ className: "text-3xl mb-[25px] ml-[25px] pt-[0px] mt-[15px] font-semibold text-[#384151]" }, { children: "Report builder" })), schema.length > 0 && (_jsx(ReportingTool, { data: data, schema: schema, runQuery: runQuery })), data.length > 0 && columns.length > 0 ? (_jsx(Chart, { colors: ['red', 'blue'], containerStyle: {
139
+ width: 'calc(100% - 700px)',
140
+ height: 693,
141
+ }, config: {
142
+ chartType: 'table',
143
+ rows: Array.from(data),
144
+ yAxisFields: Array.from(columns),
145
+ } })) : null] })) })));
146
+ }
147
+ function ReportingTool(_a) {
148
+ var _this = this;
149
+ var schema = _a.schema, data = _a.data, runQuery = _a.runQuery;
150
+ var _b = useState(schema[0]), selectedTable = _b[0], setSelectedTable = _b[1];
151
+ var _c = useState(schema[0].columns[0]), selectedColumn = _c[0], setSelectedColumn = _c[1];
152
+ var _d = useState([]), filters = _d[0], setFilters = _d[1];
153
+ var _e = useState({
154
+ with: null,
155
+ type: 'select',
156
+ options: null,
157
+ distinct: { type: null },
158
+ columns: '*',
159
+ into: { position: null },
160
+ from: [{ db: null, table: schema[0].name, as: null }],
161
+ where: null,
162
+ groupby: null,
163
+ having: null,
164
+ orderby: null,
165
+ limit: { seperator: '', value: [] },
166
+ window: null,
167
+ }), AST = _e[0], setAST = _e[1];
168
+ var _f = useState(0), numberStart = _f[0], setNumberStart = _f[1];
169
+ var _g = useState(0), numberEnd = _g[0], setNumberEnd = _g[1];
170
+ var _h = useState(''), dateStart = _h[0], setDateStart = _h[1];
171
+ var _j = useState(''), dateEnd = _j[0], setDateEnd = _j[1];
172
+ var _k = useState({}), computedColumns = _k[0], setComputedColumns = _k[1];
173
+ var _l = useState([]), stringFilterValues = _l[0], setStringFilterValues = _l[1];
174
+ var _m = useState(getPostgresBasicType(schema[0].columns[0])), columnType = _m[0], setColumnType = _m[1];
175
+ // month | week | day | quarter
176
+ var _o = useState('month'), dateBucket = _o[0], setDateBucket = _o[1];
177
+ var ref = useRef();
178
+ var _p = useState(-1), indexBeingEdited = _p[0], setIndexBeingEdited = _p[1];
179
+ var _q = useState([]), groupBys = _q[0], setGroupBys = _q[1];
180
+ var _r = useState([]), aggregations = _r[0], setAggregations = _r[1];
181
+ var _s = useState(schema[0].columns[0]), selectedGroupByColumn = _s[0], setSelectedGroupByColumn = _s[1];
182
+ var _t = useState(getPostgresBasicType(schema[0].columns[0])), groupByColumnType = _t[0], setGroupByColumnType = _t[1];
183
+ var groupByRef = useRef(null);
184
+ var _u = useState(-1), groupByIndexBeingEdited = _u[0], setGroupByIndexBeingEdited = _u[1];
185
+ var addGroupBy = function () {
186
+ if (selectedGroupByColumn && groupByColumnType) {
187
+ if (groupByColumnType === 'string') {
188
+ setGroupBys(function (groupBys) {
189
+ return __spreadArray(__spreadArray([], groupBys, true), [
190
+ {
191
+ column: selectedColumn.name,
192
+ columnType: columnType,
193
+ },
194
+ ], false);
195
+ });
196
+ return;
197
+ }
198
+ else if (groupByColumnType === 'number') {
199
+ // is this possible lmao
200
+ return;
201
+ }
202
+ else if (groupByColumnType === 'date') {
203
+ setGroupBys(function (groupBys) {
204
+ return __spreadArray(__spreadArray([], groupBys, true), [
205
+ {
206
+ column: selectedColumn.name,
207
+ columnType: columnType,
208
+ bucket: dateBucket,
209
+ },
210
+ ], false);
211
+ });
212
+ setDateBucket('month');
213
+ return;
214
+ }
215
+ }
216
+ };
217
+ var removeGroupBy = function (index) { };
218
+ var selectGroupBy = function (index) { };
219
+ var updateGroupBy = function (index) { };
220
+ useEffect(function () {
221
+ setSelectedColumn(selectedTable.columns[0]);
222
+ setAST(function (AST) {
223
+ return __assign(__assign({}, AST), { from: [{ db: null, table: selectedTable.name, as: null }] });
224
+ });
225
+ }, [selectedTable]);
226
+ useEffect(function () {
227
+ setColumnType(getPostgresBasicType(selectedColumn));
228
+ }, [selectedColumn]);
229
+ useEffect(function () {
230
+ setGroupByColumnType(getPostgresBasicType(selectedGroupByColumn));
231
+ }, [selectedGroupByColumn]);
232
+ var selectFilter = function (index) {
233
+ var filter = filters[index];
234
+ var matchingColumn = selectedTable.columns.find(function (column) { return column.name === filter.column; });
235
+ setSelectedColumn(matchingColumn);
236
+ if (filter.columnType === 'string') {
237
+ setStringFilterValues(filter.stringFilterValues);
238
+ setIndexBeingEdited(index);
239
+ }
240
+ else if (filter.columnType === 'number') {
241
+ setNumberStart(filter.numberStart);
242
+ setNumberEnd(filter.numberEnd);
243
+ setIndexBeingEdited(index);
244
+ }
245
+ else if (filter.columnType === 'date') {
246
+ setDateStart(filter.dateStart);
247
+ setDateEnd(filter.dateEnd);
248
+ setIndexBeingEdited(index);
249
+ }
250
+ // if (ref.current) {
251
+ // ref.current["data-headless-ui-state"] = "open";
252
+ // }
253
+ var button = ref.current.children[0].children[0];
254
+ if (button) {
255
+ button.click();
256
+ }
257
+ };
258
+ var updateFilter = function (index) {
259
+ if (selectedColumn && columnType) {
260
+ if (columnType === 'string') {
261
+ setFilters(function (filters) {
262
+ var newFilters = __spreadArray([], filters, true);
263
+ console.log('INDEX: ', index);
264
+ newFilters[index] = {
265
+ column: selectedColumn.name,
266
+ columnType: columnType,
267
+ stringFilterValues: stringFilterValues,
268
+ tag: "".concat(selectedColumn.name, " (").concat(stringFilterValues.join(', '), ")"),
269
+ };
270
+ return newFilters;
271
+ });
272
+ }
273
+ else if (columnType === 'number') {
274
+ setFilters(function (filters) {
275
+ var newFilters = __spreadArray([], filters, true);
276
+ console.log('INDEX: ', index);
277
+ newFilters[index] = {
278
+ column: selectedColumn.name,
279
+ columnType: columnType,
280
+ numberStart: numberStart,
281
+ numberEnd: numberEnd,
282
+ tag: "".concat(numberStart, " < ").concat(selectedColumn.name, " < ").concat(numberEnd),
283
+ };
284
+ return newFilters;
285
+ });
286
+ }
287
+ else if (columnType === 'date') {
288
+ setFilters(function (filters) {
289
+ var newFilters = __spreadArray([], filters, true);
290
+ newFilters[index] = {
291
+ column: selectedColumn.name,
292
+ columnType: columnType,
293
+ dateStart: dateStart,
294
+ dateEnd: dateEnd,
295
+ tag: "".concat(selectedColumn.name, " (").concat(format(new Date(dateStart), 'MMM dd'), " - ").concat(format(new Date(dateEnd), 'MMM dd'), ")"),
296
+ };
297
+ return newFilters;
298
+ });
299
+ }
300
+ setStringFilterValues([]);
301
+ setNumberStart(0);
302
+ setNumberEnd(0);
303
+ setDateStart('');
304
+ setDateEnd('');
305
+ setIndexBeingEdited(-1);
306
+ return;
307
+ }
308
+ };
309
+ // ADD FILTER TO "FILTERS" ARRAY
310
+ var addFilter = function () {
311
+ if (selectedColumn && columnType) {
312
+ // const type = getPostgresBasicType(selectedColumn);
313
+ var newCondition = void 0;
314
+ if (columnType === 'string') {
315
+ setFilters(function (filters) {
316
+ return __spreadArray(__spreadArray([], filters, true), [
317
+ {
318
+ column: selectedColumn.name,
319
+ columnType: columnType,
320
+ stringFilterValues: stringFilterValues,
321
+ tag: "".concat(selectedColumn.name, " (").concat(stringFilterValues.join(', '), ")"),
322
+ },
323
+ ], false);
324
+ });
325
+ setStringFilterValues([]);
326
+ setNumberStart(0);
327
+ setNumberEnd(0);
328
+ setDateStart('');
329
+ setDateEnd('');
330
+ return;
331
+ }
332
+ else if (columnType === 'number') {
333
+ setFilters(function (filters) {
334
+ return __spreadArray(__spreadArray([], filters, true), [
335
+ {
336
+ column: selectedColumn.name,
337
+ columnType: columnType,
338
+ numberStart: numberStart,
339
+ numberEnd: numberEnd,
340
+ tag: "".concat(numberStart, " < ").concat(selectedColumn.name, " < ").concat(numberEnd),
341
+ },
342
+ ], false);
343
+ });
344
+ setStringFilterValues([]);
345
+ setNumberStart(0);
346
+ setNumberEnd(0);
347
+ setDateStart('');
348
+ setDateEnd('');
349
+ return;
350
+ }
351
+ else if (columnType === 'date') {
352
+ setFilters(function (filters) {
353
+ return __spreadArray(__spreadArray([], filters, true), [
354
+ {
355
+ column: selectedColumn.name,
356
+ columnType: columnType,
357
+ dateStart: dateStart,
358
+ dateEnd: dateEnd,
359
+ tag: "".concat(selectedColumn.name, " (").concat(format(new Date(dateStart), 'MMM dd'), " - ").concat(format(new Date(dateEnd), 'MMM dd'), ")"),
360
+ },
361
+ ], false);
362
+ });
363
+ setStringFilterValues([]);
364
+ setNumberStart(0);
365
+ setNumberEnd(0);
366
+ setDateStart('');
367
+ setDateEnd('');
368
+ }
369
+ }
370
+ };
371
+ // USE EFFECT HOOK THAT TRANSFORMS "FILTERS ARRAY INTO AST"
372
+ useEffect(function () {
373
+ if (filters.length || (groupBys.length && aggregations.length)) {
374
+ var newAST = {
375
+ with: null,
376
+ type: 'select',
377
+ options: null,
378
+ distinct: { type: null },
379
+ columns: (aggregations.length && aggregations) || '*',
380
+ into: { position: null },
381
+ from: [{ db: null, table: schema[0].name, as: null }],
382
+ where: null,
383
+ groupby: null,
384
+ having: null,
385
+ orderby: null,
386
+ limit: { seperator: '', value: [] },
387
+ window: null,
388
+ };
389
+ // FILTERS
390
+ for (var i = 0; i < filters.length; i++) {
391
+ var filter = filters[i];
392
+ 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;
393
+ var newCondition = void 0;
394
+ if (columnType_1 === 'string') {
395
+ newCondition = {
396
+ type: 'binary_expr',
397
+ operator: 'IN',
398
+ left: {
399
+ type: 'column_ref',
400
+ table: null,
401
+ column: column,
402
+ },
403
+ right: {
404
+ type: 'expr_list',
405
+ value: stringFilterValues_1.map(function (value) { return ({
406
+ type: 'single_quote_string',
407
+ value: value,
408
+ }); }),
409
+ },
410
+ };
411
+ }
412
+ else if (columnType_1 === 'number') {
413
+ newCondition = {
414
+ type: 'binary_expr',
415
+ operator: 'BETWEEN',
416
+ left: {
417
+ type: 'column_ref',
418
+ table: null,
419
+ column: column,
420
+ },
421
+ right: {
422
+ type: 'expr_list',
423
+ value: [
424
+ { type: 'number', value: numberStart_1 },
425
+ { type: 'number', value: numberEnd_1 },
426
+ ],
427
+ },
428
+ };
429
+ }
430
+ else if (columnType_1 === 'date') {
431
+ newCondition = {
432
+ type: 'binary_expr',
433
+ operator: 'BETWEEN',
434
+ left: {
435
+ type: 'column_ref',
436
+ table: null,
437
+ column: column,
438
+ },
439
+ right: {
440
+ type: 'expr_list',
441
+ value: [
442
+ {
443
+ type: 'single_quote_string',
444
+ value: format(new Date(dateStart_1), 'MM/dd/yyyy'),
445
+ },
446
+ {
447
+ type: 'single_quote_string',
448
+ value: format(new Date(dateEnd_1), 'MM/dd/yyyy'),
449
+ },
450
+ ],
451
+ },
452
+ };
453
+ }
454
+ if (!newAST.where) {
455
+ newAST = __assign(__assign({}, newAST), { where: newCondition });
456
+ }
457
+ else {
458
+ newAST = __assign(__assign({}, newAST), { where: {
459
+ type: 'binary_expr',
460
+ operator: 'AND',
461
+ left: newAST.where,
462
+ right: newCondition,
463
+ } });
464
+ }
465
+ }
466
+ // GROUP BYS
467
+ setAST(newAST);
468
+ }
469
+ }, [filters, groupBys, aggregations]);
470
+ var removeFilter = function (index) {
471
+ setFilters(function (oldFilters) {
472
+ var newFilters = __spreadArray([], oldFilters, true);
473
+ newFilters.splice(index, 1);
474
+ return newFilters;
475
+ });
476
+ };
477
+ var computeStats = useCallback(function (column) {
478
+ var _a;
479
+ if (!computedColumns[column.name]) {
480
+ var basicType = getPostgresBasicType(column);
481
+ var result = void 0;
482
+ if (basicType === 'number') {
483
+ var min_1 = Infinity, max_1 = -Infinity;
484
+ data.forEach(function (row) {
485
+ var value = row[column.name];
486
+ min_1 = Math.min(min_1, value);
487
+ max_1 = Math.max(max_1, value);
488
+ });
489
+ result = { min: min_1, max: max_1 };
490
+ }
491
+ else if (basicType === 'string') {
492
+ var freqMap_1 = {};
493
+ data.forEach(function (row) {
494
+ var value = row[column.name];
495
+ freqMap_1[value] = (freqMap_1[value] || 0) + 1;
496
+ });
497
+ result = Object.entries(freqMap_1)
498
+ .sort(function (a, b) { return b[1] - a[1]; })
499
+ .slice(0, 6)
500
+ .map(function (_a) {
501
+ var key = _a[0];
502
+ return key;
503
+ });
504
+ }
505
+ else {
506
+ // Handle other column types if necessary
507
+ }
508
+ setComputedColumns(__assign(__assign({}, computedColumns), (_a = {}, _a[column.name] = result, _a)));
509
+ }
510
+ }, [data, computedColumns]);
511
+ // Call this function whenever the selected column changes
512
+ useEffect(function () {
513
+ computeStats(selectedColumn);
514
+ }, [selectedColumn]);
515
+ // Use the results directly in your component
516
+ var columnStats = computedColumns[selectedColumn.name];
517
+ // useEffect(() => {
518
+ // if (AST && AST.from[0].table) {
519
+ // const parser = new Parser();
520
+ // const sqlQuery = parser.sqlify(AST, { database: "PostgresQL" });
521
+ // if (sqlQuery) {
522
+ // runQuery(sqlQuery);
523
+ // return;
524
+ // }
525
+ // }
526
+ // }, [AST]);
527
+ useEffect(function () {
528
+ var getSqlQueryFromAST = function () { return __awaiter(_this, void 0, void 0, function () {
529
+ var response, sqlQuery, err_1;
530
+ return __generator(this, function (_a) {
531
+ switch (_a.label) {
532
+ case 0:
533
+ _a.trys.push([0, 3, , 4]);
534
+ if (!(AST && AST.from[0].table)) return [3 /*break*/, 2];
535
+ return [4 /*yield*/, axios.post('https://quill-344421.uc.r.appspot.com/sqlify', { ast: AST })];
536
+ case 1:
537
+ response = _a.sent();
538
+ sqlQuery = response.data.query;
539
+ if (sqlQuery) {
540
+ runQuery(sqlQuery);
541
+ }
542
+ _a.label = 2;
543
+ case 2: return [3 /*break*/, 4];
544
+ case 3:
545
+ err_1 = _a.sent();
546
+ console.error(err_1);
547
+ return [3 /*break*/, 4];
548
+ case 4: return [2 /*return*/];
549
+ }
550
+ });
551
+ }); };
552
+ getSqlQueryFromAST();
553
+ }, [AST]);
554
+ return (_jsxs("div", __assign({ className: "ml-[25px]" }, { children: [_jsx("div", __assign({ className: "text-sm mb-[6px] font-semibold text-[#384151]/[0.7]" }, { children: "Table" })), _jsx(Dropdown, { value: selectedTable.name, onChange: function (e) {
555
+ var table = schema.find(function (t) { return t.name === e; });
556
+ setSelectedTable(table);
557
+ }, options: schema.map(function (elem) {
558
+ return { label: elem.name, value: elem.name };
559
+ }) }), _jsx("div", __assign({ className: "flex flex-col", style: { marginTop: 12 } }, { children: _jsx(AddFilterModal, { 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, ref: ref, indexBeingEdited: indexBeingEdited, updateFilter: updateFilter }) }))] })));
560
+ }
561
+ function FilterTag(_a) {
562
+ var label = _a.label, removeFilter = _a.removeFilter, index = _a.index, selectFilter = _a.selectFilter;
563
+ var handleRemoveFilter = function () {
564
+ removeFilter(index);
565
+ };
566
+ var handleSelectFilter = function () {
567
+ selectFilter(index);
568
+ };
569
+ return (_jsxs("div", __assign({ onClick: handleSelectFilter, className: "flex ml-[12px] cursor-pointer border-[1px] border-[#EFF0FC] rounded-md bg-[#EFF0FC] pl-4 pr-2 py-1.5 text-sm font-medium text-[#384151] focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75" }, { children: [_jsx("div", __assign({ style: { textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, { children: label })), _jsx("div", __assign({
570
+ // onClick={handleRemoveFilter}
571
+ onClick: function (e) {
572
+ e.stopPropagation(); // Prevents the event from bubbling up to the parent
573
+ handleRemoveFilter();
574
+ }, className: "cursor-pointer flex items-center pl-1.5" }, { children: _jsx(XMarkIcon, { className: "h-5 w-5 text-[#384151]", "aria-hidden": "true" }) }))] })));
575
+ }
576
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
577
+ var GroupByModal = React.forwardRef(function (props, ref) {
578
+ var selectedGroupByColumn = props.selectedGroupByColumn, addGroupBy = props.addGroupBy, setSelectedGroupByColumn = props.setSelectedGroupByColumn, selectedTable = props.selectedTable, groupByColumnType = props.groupByColumnType, groupByIndexBeingEdited = props.groupByIndexBeingEdited, updateGroupBy = props.updateGroupBy, groupBys = props.groupBys, removeGroupBy = props.removeGroupBy, selectGroupBy = props.selectGroupBy;
579
+ return (_jsxs(Menu, __assign({ as: "div", ref: ref, className: "relative inline-block text-left" }, { children: [_jsxs("div", __assign({ className: "flex flex-row items-center" }, { children: [_jsx(Menu.Button, __assign({ className: "inline-flex border-[1px] shadow-sm border-[#E7E7E7] rounded-md bg-black bg-opacity-0 px-4 py-1.5 text-sm font-medium text-[#384151] hover:bg-opacity-[0.03] focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75" }, { children: "Groups" })), _jsx("div", __assign({ style: { overflowX: 'scroll' }, className: "flex flex-row items-center" }, { children: groupBys.map(function (elem, index) { return (_jsx(FilterTag, { label: elem.tag, removeFilter: removeGroupBy, selectFilter: selectGroupBy, index: index })); }) }))] })), _jsx(Transition, __assign({ as: Fragment, enter: "transition ease-out duration-100", enterFrom: "transform opacity-0 scale-95", enterTo: "transform opacity-100 scale-100", leave: "transition ease-in duration-75", leaveFrom: "transform opacity-100 scale-100", leaveTo: "transform opacity-0 scale-95" }, { children: _jsxs(Menu.Items, __assign({ className: "absolute left-0 mt-[12px] origin-top-right p-4 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none" }, { children: [_jsx("div", __assign({ className: "text-sm mb-[6px] font-semibold text-[#384151]/[0.7]" }, { children: "Column" })), _jsx(Dropdown, { value: selectedGroupByColumn.name, onChange: function (e) {
580
+ var column = selectedTable.columns.find(function (c) { return c.name === e; });
581
+ setSelectedGroupByColumn(column);
582
+ }, options: selectedTable.columns.map(function (elem) {
583
+ return { label: elem.name, value: elem.name };
584
+ }) }), groupByColumnType === 'number' && (_jsx("div", { style: {
585
+ width: 245,
586
+ maxWidth: 245,
587
+ // height: 40,
588
+ zIndex: 50,
589
+ // position: "relative",
590
+ } })), groupByColumnType === 'date' && (_jsx("div", { className: "flex flex-row items-center justify-between" })), groupByColumnType === 'string' && (_jsx("div", { className: "flex flex-col mt-[14px]" })), _jsx(Menu.Item, { children: function (_a) {
591
+ var close = _a.close;
592
+ return (_jsx("button", __assign({ className: "w-[245px] mt-[20px] py-2 px-3 bg-[#384151] hover:opacity-90 text-white font-medium rounded-md shoadow-sm", onClick: function () {
593
+ if (groupByIndexBeingEdited > -1) {
594
+ updateGroupBy(groupByIndexBeingEdited);
595
+ close();
596
+ return;
597
+ }
598
+ addGroupBy();
599
+ close();
600
+ } }, { children: groupByIndexBeingEdited > -1
601
+ ? 'Edit group by'
602
+ : 'Add group by' })));
603
+ } })] })) }))] })));
604
+ });
605
+ var AddFilterModal = React.forwardRef(function (props, ref) {
606
+ var filters = props.filters, selectedColumn = props.selectedColumn, numberStart = props.numberStart, numberEnd = props.numberEnd, dateStart = props.dateStart, setDateStart = props.setDateStart, columnStats = props.columnStats, stringFilterValues = props.stringFilterValues, setStringFilterValues = props.setStringFilterValues, addFilter = props.addFilter, setSelectedColumn = props.setSelectedColumn, setNumberStart = props.setNumberStart, setNumberEnd = props.setNumberEnd, selectedTable = props.selectedTable, columnType = props.columnType, setDateEnd = props.setDateEnd, dateEnd = props.dateEnd, removeFilter = props.removeFilter, selectFilter = props.selectFilter, indexBeingEdited = props.indexBeingEdited, updateFilter = props.updateFilter;
607
+ return (_jsxs(Menu, __assign({ as: "div", ref: ref, className: "relative inline-block text-left" }, { children: [_jsxs("div", __assign({ className: "flex flex-row items-center" }, { children: [_jsx(Menu.Button, __assign({ className: "inline-flex border-[1px] shadow-sm border-[#E7E7E7] rounded-md bg-black bg-opacity-0 px-4 py-1.5 text-sm font-medium text-[#384151] hover:bg-opacity-[0.03] focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75" }, { children: "Filters" })), _jsx("div", __assign({ style: { overflowX: 'scroll' }, className: "flex flex-row items-center" }, { children: filters.map(function (elem, index) { return (_jsx(FilterTag, { label: elem.tag, removeFilter: removeFilter, selectFilter: selectFilter, index: index })); }) }))] })), _jsx(Transition, __assign({ as: Fragment, enter: "transition ease-out duration-100", enterFrom: "transform opacity-0 scale-95", enterTo: "transform opacity-100 scale-100", leave: "transition ease-in duration-75", leaveFrom: "transform opacity-100 scale-100", leaveTo: "transform opacity-0 scale-95" }, { children: _jsxs(Menu.Items, __assign({ style: { zIndex: 120 }, className: "absolute left-0 mt-[12px] origin-top-right p-4 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none" }, { children: [_jsx("div", __assign({ className: "text-sm mb-[6px] font-semibold text-[#384151]/[0.7]" }, { children: "Column" })), _jsx(Dropdown, { value: selectedColumn.name, onChange: function (e) {
608
+ var column = selectedTable.columns.find(function (c) { return c.name === e; });
609
+ setSelectedColumn(column);
610
+ }, options: selectedTable.columns.map(function (elem) {
611
+ return { label: elem.name, value: elem.name };
612
+ }) }), columnType === 'number' && (_jsxs("div", __assign({ style: {
613
+ width: 245,
614
+ maxWidth: 245,
615
+ // height: 40,
616
+ zIndex: 50,
617
+ // position: "relative",
618
+ } }, { children: [_jsx(MultiRangeSlider, { style: {
619
+ border: 'none',
620
+ boxShadow: 'none',
621
+ padding: 0,
622
+ marginTop: 28,
623
+ }, min: 0, max: 1000000,
624
+ // step={5}
625
+ minValue: numberStart, maxValue: numberEnd, ruler: false, label: false, preventWheel: true, barLeftColor: "transparent", barRightColor: "transparent", barInnerColor: "#384151", onInput: function (e) {
626
+ setNumberStart(e.minValue);
627
+ setNumberEnd(e.maxValue);
628
+ } }), _jsxs("div", __assign({ className: "flex flex-row items-center justify-between" }, { children: [_jsxs("div", __assign({ className: "flex flex-col mt-[20px]" }, { children: [_jsx("div", __assign({ className: "text-sm font-semibold text-[#384151]/[0.7]" }, { children: "Minimum" })), _jsx("input", {
629
+ // type="number"
630
+ value: numberStart, onChange: function (e) { return setNumberStart(e.target.value); }, placeholder: "Start number",
631
+ // style={{ textAlign: "right" }}
632
+ className: "w-[100px] border-[1px] text-[#384151] mt-[4px] border-[#E7E7E7] bg-white rounded-md shadow-sm px-2 py-1.5" })] })), _jsxs("div", __assign({ className: "flex flex-col mt-[20px]" }, { children: [_jsx("div", __assign({ className: "text-sm font-semibold text-[#384151]/[0.7]" }, { children: "Maximum" })), _jsx("input", {
633
+ // type="number"
634
+ value: numberEnd, onChange: function (e) { return setNumberEnd(e.target.value); }, placeholder: "End number",
635
+ // style={{ textAlign: "right" }}
636
+ className: "w-[100px] border-[1px] text-[#384151] mt-[4px] border-[#E7E7E7] bg-white rounded-md shadow-sm px-2 py-1.5" })] }))] }))] }))), columnType === 'date' && (_jsxs("div", __assign({ className: "flex flex-row items-center justify-between" }, { children: [_jsxs("div", __assign({ className: "flex flex-col mt-[20px]" }, { children: [_jsx("div", __assign({ className: "text-sm font-semibold text-[#384151]/[0.7]" }, { children: "Start date" })), _jsx("input", { type: "date", value: dateStart, onChange: function (e) { return setDateStart(e.target.value); }, placeholder: "Start date", className: "w-[115px] text-sm text-[#384151] border-[1px] mt-[4px] border-[#E7E7E7] bg-white rounded-md shadow-sm px-2 py-1.5" })] })), _jsxs("div", __assign({ className: "flex flex-col mt-[20px]" }, { children: [_jsx("div", __assign({ className: "text-sm font-semibold text-[#384151]/[0.7]" }, { children: "End date" })), _jsx("input", { type: "date", value: dateEnd, onChange: function (e) { return setDateEnd(e.target.value); }, placeholder: "End date", className: "w-[115px] text-sm text-[#384151] border-[1px] mt-[4px] border-[#E7E7E7] bg-white rounded-md shadow-sm px-2 py-1.5" })] }))] }))), columnType === 'string' && columnStats && columnStats.length > 0 && (_jsx("div", __assign({ className: "flex flex-col mt-[14px]" }, { children: columnStats.map(function (value) { return (_jsxs("div", __assign({ className: "flex flex-row items-center" }, { children: [_jsx(DivCheckbox
637
+ // type="checkbox"
638
+ // style={{
639
+ // border: "1px solid red",
640
+ // borderRadius: "4px",
641
+ // boxSizing: "border-box",
642
+ // color: "#fff",
643
+ // height: "18px",
644
+ // minWidth: "18px",
645
+ // position: "relative",
646
+ // width: "18px",
647
+ // }}
648
+ // className="border-[#E7E7E7] border-[1px] shadow-sm rounded-sm bg-white cursor-pointer"
649
+ , {
650
+ // type="checkbox"
651
+ // style={{
652
+ // border: "1px solid red",
653
+ // borderRadius: "4px",
654
+ // boxSizing: "border-box",
655
+ // color: "#fff",
656
+ // height: "18px",
657
+ // minWidth: "18px",
658
+ // position: "relative",
659
+ // width: "18px",
660
+ // }}
661
+ // className="border-[#E7E7E7] border-[1px] shadow-sm rounded-sm bg-white cursor-pointer"
662
+ checked: stringFilterValues.includes(value), onChange: function () {
663
+ setStringFilterValues(function (prev) {
664
+ return prev.includes(value)
665
+ ? prev.filter(function (v) { return v !== value; })
666
+ : __spreadArray(__spreadArray([], prev, true), [value], false);
667
+ });
668
+ } }), _jsx("div", __assign({ className: "ml-[6px] text-[#384151]" }, { children: value }))] }), value)); }) }))), _jsx(Menu.Item, { children: function (_a) {
669
+ var close = _a.close;
670
+ return (_jsx("button", __assign({ className: "w-[245px] mt-[20px] py-2 px-3 bg-[#384151] hover:opacity-90 text-white font-medium rounded-md shoadow-sm", onClick: function () {
671
+ if (indexBeingEdited > -1) {
672
+ updateFilter(indexBeingEdited);
673
+ close();
674
+ return;
675
+ }
676
+ addFilter();
677
+ close();
678
+ } }, { children: indexBeingEdited > -1 ? 'Edit filter' : 'Add filter' })));
679
+ } })] })) }))] })));
680
+ });
681
+ var DivCheckbox = function (_a) {
682
+ var onChange = _a.onChange, checked = _a.checked;
683
+ var toggleCheckbox = function () {
684
+ if (onChange) {
685
+ onChange(!checked);
686
+ }
687
+ };
688
+ var style = {
689
+ display: 'inline-block',
690
+ width: '18px',
691
+ height: '18px',
692
+ background: checked ? '#384151' : '#fff',
693
+ border: checked ? '1px solid #384151' : '1px solid #E7E7E7',
694
+ borderRadius: '4px',
695
+ position: 'relative',
696
+ cursor: 'pointer',
697
+ };
698
+ return (_jsx("div", __assign({ style: style, onClick: toggleCheckbox, "aria-checked": checked, className: "shadow-sm", role: "checkbox" }, { children: checked && _jsx(CheckIcon, { className: "text-white", "aria-hidden": "true" }) })));
699
+ };
700
+ var Dropdown = function (_a) {
701
+ var _b;
702
+ var field = _a.field, form = _a.form, children = _a.children, props = __rest(_a, ["field", "form", "children"]);
703
+ var options = props.options, onChange = props.onChange, value = props.value;
704
+ return (_jsx(Listbox, __assign({ value: value, onChange: onChange }, { children: _jsxs("div", __assign({ className: "relative" }, { children: [_jsxs(Listbox.Button, __assign({ className: "relative w-[245px] cursor-pointer border-[1px] border-[#E7E7E7] rounded-md shadow-sm bg-white py-2 pl-3 pr-10 text-left focus:outline-none focus-visible:border-indigo-500 focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-orange-300 sm:text-sm" }, { children: [_jsx("span", __assign({ className: "block truncate" }, { children: (_b = options.find(function (elem) { return value === elem.value; })) === null || _b === void 0 ? void 0 : _b.label })), _jsx("span", __assign({ className: "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2" }, { children: _jsx(ChevronDownIcon, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" }) }))] })), _jsx(Transition, __assign({ as: Fragment, leave: "transition ease-in duration-100", leaveFrom: "opacity-100", leaveTo: "opacity-0" }, { children: _jsx(Listbox.Options, __assign({ style: { zIndex: 120 }, className: "absolute mt-1 max-h-60 w-[245px] overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm" }, { children: options.map(function (person, personIdx) { return (_jsx(Listbox.Option, __assign({ className: function (_a) {
705
+ var active = _a.active;
706
+ return "relative cursor-pointer select-none py-2 pl-4 pr-4 ".concat(active ? 'bg-[#212121]/[0.05]' : 'text-gray-900');
707
+ }, value: person.value }, { children: _jsx(_Fragment, { children: _jsx("span", __assign({ className: "block truncate ".concat(value === person.value ? 'font-medium' : 'font-normal') }, { children: person.label })) }) }), personIdx)); }) })) }))] })) })));
708
+ };
709
+ export default Table;
710
+ //# sourceMappingURL=ReportBuilder.js.map