@quillsql/react 2.10.36 → 2.10.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/BarList.d.ts +1 -1
- package/dist/cjs/BarList.d.ts.map +1 -1
- package/dist/cjs/Chart.d.ts +2 -1
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +70 -73
- package/dist/cjs/ChartBuilder.d.ts +8 -4
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +206 -126
- package/dist/cjs/ChartEditor.js +1 -1
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +9 -1
- package/dist/cjs/PieChart.d.ts +1 -0
- package/dist/cjs/PieChart.d.ts.map +1 -1
- package/dist/cjs/PieChart.js +2 -2
- package/dist/cjs/QuillProvider.d.ts +1 -0
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/Table.js +0 -4
- package/dist/cjs/components/Chart/BarChart.d.ts +1 -1
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.d.ts +2 -1
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +2 -7
- package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +5 -21
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +5 -2
- package/dist/cjs/components/UiComponents.d.ts +6 -18
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +21 -3
- package/dist/cjs/hooks/useQuill.d.ts +1 -1
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotList.js +9 -3
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +31 -28
- package/dist/cjs/models/Pivots.d.ts +2 -0
- package/dist/cjs/models/Pivots.d.ts.map +1 -0
- package/dist/cjs/models/Pivots.js +2 -0
- package/dist/cjs/models/Tables.d.ts +16 -0
- package/dist/cjs/models/Tables.d.ts.map +1 -0
- package/dist/cjs/models/Tables.js +2 -0
- package/dist/cjs/utils/aggregate.d.ts.map +1 -1
- package/dist/cjs/utils/aggregate.js +26 -23
- package/dist/cjs/utils/textProcessing.d.ts +5 -0
- package/dist/cjs/utils/textProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/textProcessing.js +37 -0
- package/dist/cjs/utils/types.d.ts +4 -0
- package/dist/cjs/utils/types.d.ts.map +1 -0
- package/dist/cjs/utils/types.js +52 -0
- package/dist/esm/BarList.d.ts +1 -1
- package/dist/esm/BarList.d.ts.map +1 -1
- package/dist/esm/Chart.d.ts +2 -1
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +70 -73
- package/dist/esm/ChartBuilder.d.ts +8 -4
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +206 -125
- package/dist/esm/ChartEditor.js +1 -1
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +9 -1
- package/dist/esm/PieChart.d.ts +1 -0
- package/dist/esm/PieChart.d.ts.map +1 -1
- package/dist/esm/PieChart.js +2 -2
- package/dist/esm/QuillProvider.d.ts +1 -0
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/Table.js +1 -5
- package/dist/esm/components/Chart/BarChart.d.ts +1 -1
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.d.ts +2 -1
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +4 -9
- package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +5 -18
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +2 -2
- package/dist/esm/components/UiComponents.d.ts +6 -18
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +19 -2
- package/dist/esm/hooks/useQuill.d.ts +1 -1
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotList.js +9 -3
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +28 -25
- package/dist/esm/models/Pivots.d.ts +2 -0
- package/dist/esm/models/Pivots.d.ts.map +1 -0
- package/dist/esm/models/Pivots.js +1 -0
- package/dist/esm/models/Tables.d.ts +16 -0
- package/dist/esm/models/Tables.d.ts.map +1 -0
- package/dist/esm/models/Tables.js +1 -0
- package/dist/esm/utils/aggregate.d.ts.map +1 -1
- package/dist/esm/utils/aggregate.js +26 -23
- package/dist/esm/utils/textProcessing.d.ts +5 -0
- package/dist/esm/utils/textProcessing.d.ts.map +1 -0
- package/dist/esm/utils/textProcessing.js +30 -0
- package/dist/esm/utils/types.d.ts +4 -0
- package/dist/esm/utils/types.d.ts.map +1 -0
- package/dist/esm/utils/types.js +48 -0
- package/package.json +1 -1
|
@@ -7,7 +7,8 @@ import { RefreshIcon } from '../../assets';
|
|
|
7
7
|
import { PivotList, PivotCard } from './PivotList';
|
|
8
8
|
import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, min, max, add, } from 'date-fns';
|
|
9
9
|
import { valueFormatter } from '../../utils/valueFormatter';
|
|
10
|
-
import { numberFormatOptions,
|
|
10
|
+
import { numberFormatOptions, dateFormatOptions } from '../../ChartBuilder';
|
|
11
|
+
import { snakeCaseToTitleCase } from '../../utils/textProcessing';
|
|
11
12
|
import { QuillCard } from '../../components/QuillCard';
|
|
12
13
|
const QuillHover = () => {
|
|
13
14
|
return (_jsx("style", { children: `
|
|
@@ -102,7 +103,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
102
103
|
// only use columns shown in the report builder's table
|
|
103
104
|
// also filter out id
|
|
104
105
|
if (col.field !== 'id' && !col.field.endsWith('_id')) {
|
|
105
|
-
map[col.field] = col.fieldType;
|
|
106
|
+
map[col.field] = col.fieldType || col.format;
|
|
106
107
|
}
|
|
107
108
|
return map;
|
|
108
109
|
}, {});
|
|
@@ -121,7 +122,6 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
121
122
|
}, [selectedPivotIndex, data, dateRange, createdPivots]);
|
|
122
123
|
const columnSelectOptions = useMemo(() => {
|
|
123
124
|
return [
|
|
124
|
-
{ label: 'Select', value: '' },
|
|
125
125
|
...Object.keys(columnsToShow).map((key) => {
|
|
126
126
|
return { label: key, value: key };
|
|
127
127
|
}),
|
|
@@ -136,13 +136,13 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
136
136
|
removePivot();
|
|
137
137
|
}
|
|
138
138
|
else {
|
|
139
|
-
selectPivot(pivot
|
|
139
|
+
selectPivot(pivot);
|
|
140
140
|
setSelectedPivotType('recommended');
|
|
141
141
|
}
|
|
142
142
|
setIsOpen(false);
|
|
143
143
|
};
|
|
144
144
|
const onSelectCreatedPivot = (pivot, index) => {
|
|
145
|
-
selectPivot(pivot
|
|
145
|
+
selectPivot(pivot);
|
|
146
146
|
setSelectedPivotType('created');
|
|
147
147
|
setIsOpen(false);
|
|
148
148
|
setPopUpTitle('Add Pivot');
|
|
@@ -326,31 +326,38 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
|
|
|
326
326
|
flexDirection: 'row',
|
|
327
327
|
gap: 20,
|
|
328
328
|
marginBottom: 5,
|
|
329
|
-
}, children: [_jsxs("div", { children: [_jsx(LabelComponent, { children: "Row Field" }), _jsx(SelectComponent, {
|
|
329
|
+
}, children: [_jsxs("div", { children: [_jsx(LabelComponent, { children: "Row Field" }), _jsx(SelectComponent, { id: "pivot-row-field", value: pivotRowField, onChange: (e) => {
|
|
330
330
|
setPivotRowField(e === '' ? undefined : e);
|
|
331
|
-
}, options: columnSelectOptions
|
|
331
|
+
}, options: columnSelectOptions.filter((option) => {
|
|
332
|
+
const format = columns.find((col) => col.field === option.value)?.format;
|
|
333
|
+
return (format === 'string' ||
|
|
334
|
+
dateFormatOptions.includes(format));
|
|
335
|
+
}), theme: theme })] }), _jsxs("div", { children: [_jsx(LabelComponent, { children: "Column Field" }), _jsx(SelectComponent, { id: "pivot-row-field", value: pivotColumnField, onChange: (e) => {
|
|
332
336
|
setPivotColumnField(e === '' ? undefined : e);
|
|
333
|
-
}, options: columnSelectOptions
|
|
337
|
+
}, options: columnSelectOptions.filter((option) => {
|
|
338
|
+
return (columns.find((col) => col.field === option.value)
|
|
339
|
+
?.format === 'string');
|
|
340
|
+
}), theme: theme })] })] }), _jsxs("div", { style: {
|
|
334
341
|
display: 'flex',
|
|
335
342
|
flexDirection: 'row',
|
|
336
343
|
gap: 20,
|
|
337
344
|
marginBottom: 20,
|
|
338
|
-
}, children: [_jsxs("div", { children: [_jsx(LabelComponent, { children: "Value Field" }), _jsx(SelectComponent, {
|
|
345
|
+
}, children: [_jsxs("div", { children: [_jsx(LabelComponent, { children: "Value Field" }), _jsx(SelectComponent, { id: "pivot-row-field", value: pivotValueField, onChange: (e) => {
|
|
339
346
|
setPivotValueField(e === '' ? undefined : e);
|
|
340
347
|
}, options: pivotAggregation === 'count'
|
|
341
348
|
? columnSelectOptions
|
|
342
349
|
: columnSelectOptions.filter((option) => {
|
|
343
350
|
return (option.value === '' ||
|
|
344
351
|
numberFormatOptions.includes(columns.find((col) => col.field === option.value)?.format));
|
|
345
|
-
}), theme: theme })] }), _jsxs("div", { children: [_jsx(LabelComponent, { children: "Aggregation Type" }), _jsx(SelectComponent, {
|
|
352
|
+
}), theme: theme })] }), _jsxs("div", { children: [_jsx(LabelComponent, { children: "Aggregation Type" }), _jsx(SelectComponent, { id: "pivot-row-field", value: pivotAggregation, theme: theme, onChange: (e) => {
|
|
346
353
|
if (e !== 'count' &&
|
|
347
354
|
pivotValueField &&
|
|
348
355
|
!numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)?.format)) {
|
|
349
356
|
setPivotValueField(null);
|
|
350
357
|
}
|
|
351
358
|
setPivotAggregation(e === '' ? undefined : e);
|
|
352
|
-
}, options: ['
|
|
353
|
-
return { label: option
|
|
359
|
+
}, options: ['sum', 'average', 'count'].map((option) => {
|
|
360
|
+
return { label: option, value: option };
|
|
354
361
|
}) })] })] })] }), _jsx("div", { children: _jsx(ButtonComponent, { id: "custom-button", onClick: () => {
|
|
355
362
|
const errors = [];
|
|
356
363
|
if (!pivotRowField) {
|
|
@@ -567,7 +574,12 @@ export function isDateField(fieldType) {
|
|
|
567
574
|
return (fieldType === 'date' ||
|
|
568
575
|
fieldType === 'datetime' ||
|
|
569
576
|
fieldType === 'timestamp' ||
|
|
570
|
-
fieldType === 'timestamptz'
|
|
577
|
+
fieldType === 'timestamptz' ||
|
|
578
|
+
fieldType === 'MMM_yyyy' ||
|
|
579
|
+
fieldType === 'MMM_dd' ||
|
|
580
|
+
fieldType === 'MMM_dd_yyyy' ||
|
|
581
|
+
fieldType === 'MMM_dd_hh:mm_ap_pm' ||
|
|
582
|
+
fieldType === 'hh_ap_pm');
|
|
571
583
|
}
|
|
572
584
|
const isNullUndefinedOrInvalidDate = (date) => date === null || date === undefined || isNaN(date.getTime());
|
|
573
585
|
// If the value is an object with key value (ie. a BigQuery date) we will
|
|
@@ -598,6 +610,9 @@ export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimi
|
|
|
598
610
|
data = fixBigQueryData(data);
|
|
599
611
|
if (dateRange[0] === null && dateRange[1] === null) {
|
|
600
612
|
dateRange = [new Date(0), add(new Date(), { years: 5 })];
|
|
613
|
+
if (isDateField(pivot.rowFieldType)) {
|
|
614
|
+
dateRange = getDateRange(dateRange, pivot.rowField, data);
|
|
615
|
+
}
|
|
601
616
|
}
|
|
602
617
|
if (!compRange ||
|
|
603
618
|
isNullUndefinedOrInvalidDate(compRange[0]) ||
|
|
@@ -853,18 +868,6 @@ export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimi
|
|
|
853
868
|
: snakeCaseToTitleCase(pivot.rowField),
|
|
854
869
|
field: pivot.rowField,
|
|
855
870
|
},
|
|
856
|
-
...(!pivot.columnField
|
|
857
|
-
? [
|
|
858
|
-
{
|
|
859
|
-
label: pivot.rowField === null
|
|
860
|
-
? 'Null'
|
|
861
|
-
: pivot.rowField === false
|
|
862
|
-
? 'False'
|
|
863
|
-
: `Comparison ${snakeCaseToTitleCase(pivot.rowField)}`,
|
|
864
|
-
field: `comparison_${pivot.rowField}`,
|
|
865
|
-
},
|
|
866
|
-
]
|
|
867
|
-
: []),
|
|
868
871
|
...uniqueColumns.map((column, index) => {
|
|
869
872
|
const columnName = isDateField(pivot.columnFieldType)
|
|
870
873
|
? getDateString(column, dateRange)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pivots.d.ts","sourceRoot":"","sources":["../../../src/models/Pivots.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Column {
|
|
2
|
+
label: string;
|
|
3
|
+
field: string;
|
|
4
|
+
name: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
fieldType: string;
|
|
7
|
+
format: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Table {
|
|
10
|
+
}
|
|
11
|
+
export interface YAxisField {
|
|
12
|
+
field: string;
|
|
13
|
+
label: string;
|
|
14
|
+
format: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Tables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tables.d.ts","sourceRoot":"","sources":["../../../src/models/Tables.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;CAAG;AAEzB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/utils/aggregate.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,qBAAqB,CAAC,IAAI,KAAA,EAAE,SAAS,KAAA,UAuCpD;AAED,wBAAgB,UAAU,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/utils/aggregate.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,qBAAqB,CAAC,IAAI,KAAA,EAAE,SAAS,KAAA,UAuCpD;AAED,wBAAgB,UAAU,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,OAmJjE;AACD,wBAAgB,SAAS,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,OAqRhE"}
|
|
@@ -87,16 +87,18 @@ export function whatIsProbablyTheType(data, fieldName) {
|
|
|
87
87
|
export function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
88
88
|
const timePeriod = findTimePeriod(dateFilter);
|
|
89
89
|
const rows = dashboardItem.rows;
|
|
90
|
+
const fields = dashboardItem.fields || dashboardItem.columns;
|
|
90
91
|
const xAxisLabel = timePeriod;
|
|
91
92
|
const xAxisField = timePeriod;
|
|
92
93
|
if (!bucketFields.length || !rows.length)
|
|
93
94
|
return { ...dashboardItem, bucketedRows: [] };
|
|
94
|
-
if (
|
|
95
|
+
if (dashboardItem.fields &&
|
|
96
|
+
getPostgresBasicType(dashboardItem.fields.find((field) => field.name === bucketFields[0].field)) === 'string') {
|
|
95
97
|
const stringField = bucketFields[0].field;
|
|
96
98
|
const aggregation = {};
|
|
97
99
|
// let aggregatedArray;
|
|
98
100
|
// if (rows.length > 0) {
|
|
99
|
-
rows.forEach(row => {
|
|
101
|
+
rows.forEach((row) => {
|
|
100
102
|
const strValue = row[stringField];
|
|
101
103
|
if (!aggregation[strValue]) {
|
|
102
104
|
aggregation[strValue] = {
|
|
@@ -107,7 +109,7 @@ export function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
107
109
|
aggregation[strValue][dashboardItem.yAxisFields[0].field] += parseFloat(row[dashboardItem.yAxisFields[0].field]);
|
|
108
110
|
});
|
|
109
111
|
// Convert the object to an array
|
|
110
|
-
aggregatedArray = Object.keys(aggregation).map(str => ({
|
|
112
|
+
aggregatedArray = Object.keys(aggregation).map((str) => ({
|
|
111
113
|
[stringField]: str,
|
|
112
114
|
[dashboardItem.yAxisFields[0].field]: aggregation[str][dashboardItem.yAxisFields[0].field].toFixed(2),
|
|
113
115
|
}));
|
|
@@ -122,7 +124,7 @@ export function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
122
124
|
bucketedRows: aggregatedArray,
|
|
123
125
|
};
|
|
124
126
|
}
|
|
125
|
-
else if (getPostgresBasicType(dashboardItem.fields.find(field => field.name === bucketFields[0].field)) === 'date') {
|
|
127
|
+
else if (getPostgresBasicType(dashboardItem.fields.find((field) => field.name === bucketFields[0].field)) === 'date') {
|
|
126
128
|
const dateField = bucketFields[0].field;
|
|
127
129
|
let xAxisFormat;
|
|
128
130
|
switch (timePeriod) {
|
|
@@ -141,7 +143,7 @@ export function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
141
143
|
}
|
|
142
144
|
const aggregation = {};
|
|
143
145
|
// TODO MAKE WORK WITH MULTIPLE Y AXIS FIELDS
|
|
144
|
-
rows.forEach(row => {
|
|
146
|
+
rows.forEach((row) => {
|
|
145
147
|
const date = new Date(row[dateField]);
|
|
146
148
|
let formattedDate;
|
|
147
149
|
switch (timePeriod) {
|
|
@@ -178,7 +180,7 @@ export function aggregate2(dashboardItem, bucketFields, dateFilter) {
|
|
|
178
180
|
// Convert the object to an array and format the spend amounts
|
|
179
181
|
const aggregatedArray = Object.keys(aggregation).length
|
|
180
182
|
? Object.keys(aggregation)
|
|
181
|
-
.map(date => ({
|
|
183
|
+
.map((date) => ({
|
|
182
184
|
[timePeriod]: date,
|
|
183
185
|
[dashboardItem.yAxisFields[0].field]: aggregation[date][dashboardItem.yAxisFields[0].field].toFixed(2),
|
|
184
186
|
}))
|
|
@@ -202,6 +204,7 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
202
204
|
: 'month';
|
|
203
205
|
const rows = dashboardItem.rows;
|
|
204
206
|
const compareRows = dashboardItem.compareRows;
|
|
207
|
+
const fields = dashboardItem.fields || dashboardItem.columns;
|
|
205
208
|
const xAxisLabel = timePeriod;
|
|
206
209
|
const xAxisField = timePeriod;
|
|
207
210
|
if (!rows.length) {
|
|
@@ -211,23 +214,23 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
211
214
|
//TODO: allow comparison for nonbucketed
|
|
212
215
|
return { ...dashboardItem, bucketedRows: [] };
|
|
213
216
|
}
|
|
214
|
-
if (getPostgresBasicType(
|
|
217
|
+
if (getPostgresBasicType(fields.find((field) => field.name === bucketFields[0].field)) === 'string') {
|
|
215
218
|
const stringField = bucketFields[0].field;
|
|
216
219
|
const aggregation = {};
|
|
217
|
-
rows.forEach(row => {
|
|
220
|
+
rows.forEach((row) => {
|
|
218
221
|
const strValue = row[stringField];
|
|
219
222
|
if (!aggregation[strValue]) {
|
|
220
223
|
aggregation[strValue] = {};
|
|
221
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
224
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
222
225
|
aggregation[strValue][yAxisField.field] = 0;
|
|
223
226
|
});
|
|
224
227
|
}
|
|
225
228
|
// Sum up the amounts (or any other field) for each unique string
|
|
226
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
229
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
227
230
|
aggregation[strValue][yAxisField.field] += parseFloat(row[yAxisField.field] ?? '0.0');
|
|
228
231
|
});
|
|
229
232
|
});
|
|
230
|
-
const aggregatedArray = Object.keys(aggregation).map(key => {
|
|
233
|
+
const aggregatedArray = Object.keys(aggregation).map((key) => {
|
|
231
234
|
return {
|
|
232
235
|
[stringField]: key,
|
|
233
236
|
...aggregation[key],
|
|
@@ -240,7 +243,7 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
240
243
|
bucketedRows: aggregatedArray,
|
|
241
244
|
};
|
|
242
245
|
}
|
|
243
|
-
else if (getPostgresBasicType(dashboardItem.fields.find(field => field.name === bucketFields[0].field)) === 'date') {
|
|
246
|
+
else if (getPostgresBasicType(dashboardItem.fields.find((field) => field.name === bucketFields[0].field)) === 'date') {
|
|
244
247
|
const dateField = bucketFields[0].field;
|
|
245
248
|
let interval;
|
|
246
249
|
let xAxisFormat;
|
|
@@ -290,13 +293,13 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
290
293
|
const endDate = dateFilter?.endDate || new Date();
|
|
291
294
|
while (iteratedDate <= endDate) {
|
|
292
295
|
aggregation[iteratedDate] = {};
|
|
293
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
296
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
294
297
|
aggregation[iteratedDate][yAxisField.field] = 0;
|
|
295
298
|
});
|
|
296
299
|
iteratedDate = add(iteratedDate, interval);
|
|
297
300
|
}
|
|
298
301
|
// TODO MAKE WORK WITH MULTIPLE Y AXIS FIELDS
|
|
299
|
-
rows.forEach(row => {
|
|
302
|
+
rows.forEach((row) => {
|
|
300
303
|
const date = parse(row[dateField], 'yyyy-MM-dd', new Date());
|
|
301
304
|
let formattedDate;
|
|
302
305
|
switch (timePeriod) {
|
|
@@ -321,19 +324,19 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
321
324
|
}
|
|
322
325
|
if (!aggregation[formattedDate]) {
|
|
323
326
|
aggregation[formattedDate] = {};
|
|
324
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
327
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
325
328
|
aggregation[formattedDate][yAxisField.field] = 0;
|
|
326
329
|
});
|
|
327
330
|
}
|
|
328
331
|
// Sum the amounts for each field and period
|
|
329
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
332
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
330
333
|
aggregation[formattedDate][yAxisField.field] += parseFloat(row[yAxisField.field]);
|
|
331
334
|
});
|
|
332
335
|
});
|
|
333
336
|
// Convert the object to an array and format the spend amounts
|
|
334
337
|
const aggregatedArray = Object.keys(aggregation).length
|
|
335
338
|
? Object.keys(aggregation)
|
|
336
|
-
.map(date => ({
|
|
339
|
+
.map((date) => ({
|
|
337
340
|
[timePeriod]: date,
|
|
338
341
|
[dashboardItem.yAxisFields[0].field]: aggregation[date][dashboardItem.yAxisFields[0].field].toFixed(2),
|
|
339
342
|
}))
|
|
@@ -343,11 +346,11 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
343
346
|
dateFilter.comparison &&
|
|
344
347
|
dateFilter.comparisonRange.value !== 'NO_COMPARISON' &&
|
|
345
348
|
dashboardItem.compareRows) {
|
|
346
|
-
const offset = COMPARISON_OPTIONS.find(option => {
|
|
349
|
+
const offset = COMPARISON_OPTIONS.find((option) => {
|
|
347
350
|
return option.value === dateFilter.comparisonRange.value;
|
|
348
351
|
})?.offset;
|
|
349
|
-
aggregatedArray.forEach(row => {
|
|
350
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
352
|
+
aggregatedArray.forEach((row) => {
|
|
353
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
351
354
|
row[yAxisField.field + '2'] = 0;
|
|
352
355
|
});
|
|
353
356
|
row[xAxisField + '2'] = sub(new Date(row[timePeriod]), offset).toISOString();
|
|
@@ -379,8 +382,8 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
379
382
|
}
|
|
380
383
|
// Sum the amounts for each field and period
|
|
381
384
|
if (bucketFields?.length) {
|
|
382
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
383
|
-
const correctBucketIndex = aggregatedArray.findIndex(row => {
|
|
385
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
386
|
+
const correctBucketIndex = aggregatedArray.findIndex((row) => {
|
|
384
387
|
return row[timePeriod] === formattedDate;
|
|
385
388
|
});
|
|
386
389
|
if (correctBucketIndex >= 0) {
|
|
@@ -397,7 +400,7 @@ export function aggregate(dashboardItem, bucketFields, dateFilter) {
|
|
|
397
400
|
});
|
|
398
401
|
}
|
|
399
402
|
else {
|
|
400
|
-
dashboardItem.yAxisFields.forEach(yAxisField => {
|
|
403
|
+
dashboardItem.yAxisFields.forEach((yAxisField) => {
|
|
401
404
|
if (aggregatedArray.length - 1 >= index) {
|
|
402
405
|
if (!aggregatedArray[index][yAxisField.field + '2']) {
|
|
403
406
|
aggregatedArray[index][yAxisField.field + '2'] = 0;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function capitalize(text: string): string;
|
|
2
|
+
export declare function depluralize(text: string): string;
|
|
3
|
+
export declare function snakeCaseToTitleCase(str: string): string;
|
|
4
|
+
export declare function removeDoubleQuotes(str: string): string;
|
|
5
|
+
//# sourceMappingURL=textProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/textProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,UAa/C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,UAK7C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function capitalize(text) {
|
|
2
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
3
|
+
}
|
|
4
|
+
export function depluralize(text) {
|
|
5
|
+
if (text.endsWith("ies")) {
|
|
6
|
+
return text.slice(0, -3) + "y";
|
|
7
|
+
}
|
|
8
|
+
if (text.endsWith("s")) {
|
|
9
|
+
return text.slice(0, -1);
|
|
10
|
+
}
|
|
11
|
+
return text;
|
|
12
|
+
}
|
|
13
|
+
export function snakeCaseToTitleCase(str) {
|
|
14
|
+
if (!str) {
|
|
15
|
+
return str;
|
|
16
|
+
}
|
|
17
|
+
return str
|
|
18
|
+
.toString()
|
|
19
|
+
.split(/_| /)
|
|
20
|
+
.map((word) => word === 'id'
|
|
21
|
+
? 'ID'
|
|
22
|
+
: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
23
|
+
.join(' ');
|
|
24
|
+
}
|
|
25
|
+
export function removeDoubleQuotes(str) {
|
|
26
|
+
if (!str) {
|
|
27
|
+
return str;
|
|
28
|
+
}
|
|
29
|
+
return str.replace(/"/g, '');
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAgDlE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function getPostgresBasicType(field) {
|
|
2
|
+
let format;
|
|
3
|
+
// first check if column.dataTypeID exists
|
|
4
|
+
if ('dataTypeID' in field) {
|
|
5
|
+
switch (field.dataTypeID) {
|
|
6
|
+
case 20: // int8
|
|
7
|
+
case 21: // int2
|
|
8
|
+
case 23: // int4
|
|
9
|
+
case 700: // float4
|
|
10
|
+
case 701: // float8
|
|
11
|
+
case 1700: // numeric
|
|
12
|
+
format = 'number';
|
|
13
|
+
break;
|
|
14
|
+
case 1082: // date
|
|
15
|
+
case 1083: // time
|
|
16
|
+
case 1184: // timestamptz
|
|
17
|
+
case 1114: // timestamp
|
|
18
|
+
format = 'date';
|
|
19
|
+
break;
|
|
20
|
+
case 1043: // varchar
|
|
21
|
+
default:
|
|
22
|
+
format = 'string';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (field.fieldType) {
|
|
26
|
+
// if column.dataTypeID doesn't exist, check column.fieldType
|
|
27
|
+
switch (field.fieldType) {
|
|
28
|
+
case 'int8':
|
|
29
|
+
case 'int2':
|
|
30
|
+
case 'int4':
|
|
31
|
+
case 'float4':
|
|
32
|
+
case 'float8':
|
|
33
|
+
case 'numeric':
|
|
34
|
+
format = 'number';
|
|
35
|
+
break;
|
|
36
|
+
case 'date':
|
|
37
|
+
case 'time':
|
|
38
|
+
case 'timestamptz':
|
|
39
|
+
case 'timestamp':
|
|
40
|
+
format = 'date';
|
|
41
|
+
break;
|
|
42
|
+
case 'varchar':
|
|
43
|
+
default:
|
|
44
|
+
format = 'string';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return format || 'string';
|
|
48
|
+
}
|