@quillsql/react 2.10.37 → 2.10.39

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.
Files changed (120) hide show
  1. package/dist/cjs/BarList.d.ts +1 -1
  2. package/dist/cjs/BarList.d.ts.map +1 -1
  3. package/dist/cjs/Chart.d.ts +2 -1
  4. package/dist/cjs/Chart.d.ts.map +1 -1
  5. package/dist/cjs/Chart.js +70 -73
  6. package/dist/cjs/ChartBuilder.d.ts +8 -4
  7. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  8. package/dist/cjs/ChartBuilder.js +206 -126
  9. package/dist/cjs/ChartEditor.js +1 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +9 -1
  12. package/dist/cjs/PieChart.d.ts +1 -0
  13. package/dist/cjs/PieChart.d.ts.map +1 -1
  14. package/dist/cjs/PieChart.js +2 -2
  15. package/dist/cjs/QuillProvider.d.ts +2 -0
  16. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  17. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  18. package/dist/cjs/SQLEditor.js +9 -0
  19. package/dist/cjs/Table.d.ts.map +1 -1
  20. package/dist/cjs/Table.js +0 -4
  21. package/dist/cjs/components/Chart/BarChart.d.ts +1 -1
  22. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  23. package/dist/cjs/components/Chart/LineChart.d.ts +2 -1
  24. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  25. package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
  26. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  27. package/dist/cjs/components/Dashboard/DataLoader.js +2 -7
  28. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
  29. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  30. package/dist/cjs/components/Dashboard/TableComponent.js +5 -21
  31. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  32. package/dist/cjs/components/QuillTable.js +5 -2
  33. package/dist/cjs/components/UiComponents.d.ts +6 -18
  34. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  35. package/dist/cjs/components/UiComponents.js +21 -3
  36. package/dist/cjs/hooks/useQuill.d.ts +1 -1
  37. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  38. package/dist/cjs/index.d.ts +3 -2
  39. package/dist/cjs/index.d.ts.map +1 -1
  40. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -1
  41. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  42. package/dist/cjs/internals/ReportBuilder/PivotList.js +9 -3
  43. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
  44. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  45. package/dist/cjs/internals/ReportBuilder/PivotModal.js +31 -28
  46. package/dist/cjs/models/Pivots.d.ts +2 -0
  47. package/dist/cjs/models/Pivots.d.ts.map +1 -0
  48. package/dist/cjs/models/Pivots.js +2 -0
  49. package/dist/cjs/models/Tables.d.ts +16 -0
  50. package/dist/cjs/models/Tables.d.ts.map +1 -0
  51. package/dist/cjs/models/Tables.js +2 -0
  52. package/dist/cjs/utils/aggregate.d.ts.map +1 -1
  53. package/dist/cjs/utils/aggregate.js +26 -23
  54. package/dist/cjs/utils/textProcessing.d.ts +5 -0
  55. package/dist/cjs/utils/textProcessing.d.ts.map +1 -0
  56. package/dist/cjs/utils/textProcessing.js +37 -0
  57. package/dist/cjs/utils/types.d.ts +4 -0
  58. package/dist/cjs/utils/types.d.ts.map +1 -0
  59. package/dist/cjs/utils/types.js +52 -0
  60. package/dist/esm/BarList.d.ts +1 -1
  61. package/dist/esm/BarList.d.ts.map +1 -1
  62. package/dist/esm/Chart.d.ts +2 -1
  63. package/dist/esm/Chart.d.ts.map +1 -1
  64. package/dist/esm/Chart.js +70 -73
  65. package/dist/esm/ChartBuilder.d.ts +8 -4
  66. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  67. package/dist/esm/ChartBuilder.js +206 -125
  68. package/dist/esm/ChartEditor.js +1 -1
  69. package/dist/esm/Dashboard.d.ts.map +1 -1
  70. package/dist/esm/Dashboard.js +9 -1
  71. package/dist/esm/PieChart.d.ts +1 -0
  72. package/dist/esm/PieChart.d.ts.map +1 -1
  73. package/dist/esm/PieChart.js +2 -2
  74. package/dist/esm/QuillProvider.d.ts +2 -0
  75. package/dist/esm/QuillProvider.d.ts.map +1 -1
  76. package/dist/esm/SQLEditor.d.ts.map +1 -1
  77. package/dist/esm/SQLEditor.js +9 -0
  78. package/dist/esm/Table.d.ts.map +1 -1
  79. package/dist/esm/Table.js +1 -5
  80. package/dist/esm/components/Chart/BarChart.d.ts +1 -1
  81. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  82. package/dist/esm/components/Chart/LineChart.d.ts +2 -1
  83. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  84. package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
  85. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  86. package/dist/esm/components/Dashboard/DataLoader.js +4 -9
  87. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
  88. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  89. package/dist/esm/components/Dashboard/TableComponent.js +5 -18
  90. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  91. package/dist/esm/components/QuillTable.js +2 -2
  92. package/dist/esm/components/UiComponents.d.ts +6 -18
  93. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  94. package/dist/esm/components/UiComponents.js +19 -2
  95. package/dist/esm/hooks/useQuill.d.ts +1 -1
  96. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  97. package/dist/esm/index.d.ts +3 -2
  98. package/dist/esm/index.d.ts.map +1 -1
  99. package/dist/esm/index.js +1 -1
  100. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -1
  101. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  102. package/dist/esm/internals/ReportBuilder/PivotList.js +9 -3
  103. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
  104. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  105. package/dist/esm/internals/ReportBuilder/PivotModal.js +28 -25
  106. package/dist/esm/models/Pivots.d.ts +2 -0
  107. package/dist/esm/models/Pivots.d.ts.map +1 -0
  108. package/dist/esm/models/Pivots.js +1 -0
  109. package/dist/esm/models/Tables.d.ts +16 -0
  110. package/dist/esm/models/Tables.d.ts.map +1 -0
  111. package/dist/esm/models/Tables.js +1 -0
  112. package/dist/esm/utils/aggregate.d.ts.map +1 -1
  113. package/dist/esm/utils/aggregate.js +26 -23
  114. package/dist/esm/utils/textProcessing.d.ts +5 -0
  115. package/dist/esm/utils/textProcessing.d.ts.map +1 -0
  116. package/dist/esm/utils/textProcessing.js +30 -0
  117. package/dist/esm/utils/types.d.ts +4 -0
  118. package/dist/esm/utils/types.d.ts.map +1 -0
  119. package/dist/esm/utils/types.js +48 -0
  120. 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, snakeCaseToTitleCase } from '../../ChartBuilder';
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, index);
139
+ selectPivot(pivot);
140
140
  setSelectedPivotType('recommended');
141
141
  }
142
142
  setIsOpen(false);
143
143
  };
144
144
  const onSelectCreatedPivot = (pivot, index) => {
145
- selectPivot(pivot, index);
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, { label: 'Row Field', id: "pivot-row-field", value: pivotRowField, onChange: (e) => {
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, theme: theme })] }), _jsxs("div", { children: [_jsx(LabelComponent, { children: "Column Field" }), _jsx(SelectComponent, { label: 'Column Field', id: "pivot-row-field", value: pivotColumnField, onChange: (e) => {
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, theme: theme })] })] }), _jsxs("div", { style: {
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, { label: 'Value Field', id: "pivot-row-field", value: pivotValueField, onChange: (e) => {
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, { label: 'Aggregation Type', id: "pivot-row-field", value: pivotAggregation, theme: theme, onChange: (e) => {
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: ['', 'sum', 'average', 'count'].map((option) => {
353
- return { label: option || 'Select', value: 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Pivots.d.ts.map
@@ -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,OA6IjE;AACD,wBAAgB,SAAS,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,EAAE,UAAU,KAAA,OAgRhE"}
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 (getPostgresBasicType(dashboardItem.fields.find(field => field.name === bucketFields[0].field)) === 'string') {
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(dashboardItem.fields.find(field => field.name === bucketFields[0].field)) === 'string') {
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,4 @@
1
+ import { Field } from '../hooks/useQuill';
2
+ import { Column } from '../models/Tables';
3
+ export declare function getPostgresBasicType(field: Field | Column): string;
4
+ //# sourceMappingURL=types.d.ts.map
@@ -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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/react",
3
- "version": "2.10.37",
3
+ "version": "2.10.39",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/esm/index.js",