@quillsql/react 2.12.26 → 2.12.28

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 (139) hide show
  1. package/dist/cjs/Chart.d.ts +17 -2
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +137 -90
  4. package/dist/cjs/ChartBuilder.d.ts +3 -3
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +30 -23
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +66 -26
  9. package/dist/cjs/Context.d.ts +1 -0
  10. package/dist/cjs/Context.d.ts.map +1 -1
  11. package/dist/cjs/Context.js +17 -2
  12. package/dist/cjs/Dashboard.d.ts +6 -1
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +3 -1
  15. package/dist/cjs/ReportBuilder.d.ts +1 -1
  16. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.js +12 -10
  18. package/dist/cjs/SQLEditor.d.ts +10 -1
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +27 -3
  21. package/dist/cjs/Table.d.ts +15 -1
  22. package/dist/cjs/Table.d.ts.map +1 -1
  23. package/dist/cjs/Table.js +143 -59
  24. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  25. package/dist/cjs/components/Chart/ChartTooltip.js +5 -4
  26. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  27. package/dist/cjs/components/Dashboard/DashboardFilter.js +1 -1
  28. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  29. package/dist/cjs/components/Dashboard/DataLoader.js +52 -15
  30. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  31. package/dist/cjs/components/Dashboard/MetricComponent.js +7 -1
  32. package/dist/cjs/components/Dashboard/TableComponent.d.ts +16 -2
  33. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  34. package/dist/cjs/components/Dashboard/TableComponent.js +2 -14
  35. package/dist/cjs/components/QuillTable.d.ts +2 -2
  36. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  37. package/dist/cjs/components/QuillTable.js +7 -5
  38. package/dist/cjs/components/UiComponents.d.ts +3 -3
  39. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  40. package/dist/cjs/components/UiComponents.js +4 -4
  41. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +16 -1
  42. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  43. package/dist/cjs/internals/ReportBuilder/PivotModal.js +155 -80
  44. package/dist/cjs/utils/constants.d.ts +2 -0
  45. package/dist/cjs/utils/constants.d.ts.map +1 -0
  46. package/dist/cjs/utils/constants.js +4 -0
  47. package/dist/cjs/utils/dashboard.d.ts +1 -0
  48. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  49. package/dist/cjs/utils/dashboard.js +46 -97
  50. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  51. package/dist/cjs/utils/dataFetcher.js +56 -13
  52. package/dist/cjs/utils/dates.d.ts +8 -0
  53. package/dist/cjs/utils/dates.d.ts.map +1 -1
  54. package/dist/cjs/utils/dates.js +34 -1
  55. package/dist/cjs/utils/filterProcessing.d.ts +2 -0
  56. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  57. package/dist/cjs/utils/filterProcessing.js +129 -1
  58. package/dist/cjs/utils/logging.d.ts +2 -0
  59. package/dist/cjs/utils/logging.d.ts.map +1 -0
  60. package/dist/cjs/utils/logging.js +10 -0
  61. package/dist/cjs/utils/pivotConstructor.d.ts +6 -0
  62. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -0
  63. package/dist/cjs/utils/pivotConstructor.js +87 -0
  64. package/dist/cjs/utils/queryConstructor.d.ts +2 -1
  65. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  66. package/dist/cjs/utils/queryConstructor.js +46 -11
  67. package/dist/cjs/utils/tableProcessing.d.ts +22 -0
  68. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  69. package/dist/cjs/utils/tableProcessing.js +87 -1
  70. package/dist/esm/Chart.d.ts +17 -2
  71. package/dist/esm/Chart.d.ts.map +1 -1
  72. package/dist/esm/Chart.js +140 -93
  73. package/dist/esm/ChartBuilder.d.ts +3 -3
  74. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  75. package/dist/esm/ChartBuilder.js +30 -23
  76. package/dist/esm/ChartEditor.d.ts.map +1 -1
  77. package/dist/esm/ChartEditor.js +66 -26
  78. package/dist/esm/Context.d.ts +1 -0
  79. package/dist/esm/Context.d.ts.map +1 -1
  80. package/dist/esm/Context.js +16 -1
  81. package/dist/esm/Dashboard.d.ts +6 -1
  82. package/dist/esm/Dashboard.d.ts.map +1 -1
  83. package/dist/esm/Dashboard.js +3 -1
  84. package/dist/esm/ReportBuilder.d.ts +1 -1
  85. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  86. package/dist/esm/ReportBuilder.js +13 -11
  87. package/dist/esm/SQLEditor.d.ts +10 -1
  88. package/dist/esm/SQLEditor.d.ts.map +1 -1
  89. package/dist/esm/SQLEditor.js +27 -3
  90. package/dist/esm/Table.d.ts +15 -1
  91. package/dist/esm/Table.d.ts.map +1 -1
  92. package/dist/esm/Table.js +146 -62
  93. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  94. package/dist/esm/components/Chart/ChartTooltip.js +5 -4
  95. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  96. package/dist/esm/components/Dashboard/DashboardFilter.js +1 -1
  97. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  98. package/dist/esm/components/Dashboard/DataLoader.js +52 -15
  99. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  100. package/dist/esm/components/Dashboard/MetricComponent.js +7 -1
  101. package/dist/esm/components/Dashboard/TableComponent.d.ts +16 -2
  102. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  103. package/dist/esm/components/Dashboard/TableComponent.js +2 -14
  104. package/dist/esm/components/QuillTable.d.ts +2 -2
  105. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  106. package/dist/esm/components/QuillTable.js +7 -5
  107. package/dist/esm/components/UiComponents.d.ts +3 -3
  108. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  109. package/dist/esm/components/UiComponents.js +4 -4
  110. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +16 -1
  111. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  112. package/dist/esm/internals/ReportBuilder/PivotModal.js +153 -80
  113. package/dist/esm/utils/constants.d.ts +2 -0
  114. package/dist/esm/utils/constants.d.ts.map +1 -0
  115. package/dist/esm/utils/constants.js +1 -0
  116. package/dist/esm/utils/dashboard.d.ts +1 -0
  117. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  118. package/dist/esm/utils/dashboard.js +45 -97
  119. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  120. package/dist/esm/utils/dataFetcher.js +56 -13
  121. package/dist/esm/utils/dates.d.ts +8 -0
  122. package/dist/esm/utils/dates.d.ts.map +1 -1
  123. package/dist/esm/utils/dates.js +31 -0
  124. package/dist/esm/utils/filterProcessing.d.ts +2 -0
  125. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  126. package/dist/esm/utils/filterProcessing.js +126 -0
  127. package/dist/esm/utils/logging.d.ts +2 -0
  128. package/dist/esm/utils/logging.d.ts.map +1 -0
  129. package/dist/esm/utils/logging.js +6 -0
  130. package/dist/esm/utils/pivotConstructor.d.ts +6 -0
  131. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
  132. package/dist/esm/utils/pivotConstructor.js +83 -0
  133. package/dist/esm/utils/queryConstructor.d.ts +2 -1
  134. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  135. package/dist/esm/utils/queryConstructor.js +44 -10
  136. package/dist/esm/utils/tableProcessing.d.ts +22 -0
  137. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  138. package/dist/esm/utils/tableProcessing.js +85 -1
  139. package/package.json +1 -1
@@ -18,29 +18,42 @@ export function generateDistinctQuery(stringFields, query) {
18
18
  const distinctQuery = distinctQueries.join(' UNION ALL ');
19
19
  return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
20
20
  }
21
- export function generatePivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval) {
21
+ export function generateMinMaxRangeQueries(columnFields, query, databaseType) {
22
+ const distinctQueries = columnFields.map((field) => {
23
+ const wrappedField = ['postgresql', 'snowflake'].includes(databaseType.toLowerCase())
24
+ ? `"${field}"`
25
+ : field;
26
+ return `SELECT '${field}' AS field, MIN(${wrappedField}) AS min_range, MAX(${wrappedField}) AS max_range FROM querytable`;
27
+ });
28
+ const distinctQuery = distinctQueries.join(' UNION ALL ');
29
+ return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
30
+ }
31
+ export function generatePivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval, distinctStrings) {
22
32
  if (!isValidPivot(pivot)) {
23
33
  return undefined;
24
34
  }
25
- if (!pivot.rowField) {
26
- return undefined;
27
- }
28
35
  if (pivot.columnField) {
29
- return create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval);
36
+ return create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval, distinctStrings);
30
37
  }
31
- return create1DPivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
38
+ if (pivot.rowField) {
39
+ return create1DPivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
40
+ }
41
+ return createAggregationValuePivot(pivot, itemQueries);
32
42
  }
33
- function create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval) {
43
+ function create2DPivotQuery(pivot, itemQueries, rows, dateBucket, comparisonInterval, distinctStrings) {
34
44
  if (!pivot || !pivot.columnField) {
35
45
  return undefined;
36
46
  }
37
47
  // @ts-ignore
38
48
  const columnValues = rows.map((row) => row[pivot.columnField]);
39
- const distinctColumnValues = Array.from(new Set(columnValues)).filter((value) => value !== undefined && value !== null);
49
+ const distinctColumnValues = distinctStrings
50
+ ? distinctStrings
51
+ : Array.from(new Set(columnValues)).filter((value) => value !== undefined && value !== null);
40
52
  if (distinctColumnValues.length === 0) {
41
53
  return undefined;
42
54
  }
43
- if (pivot.rowFieldType === 'string') {
55
+ if (['string', 'varchar'].includes(pivot.rowFieldType) ||
56
+ !pivot.rowFieldType) {
44
57
  return create2DStringPivotQuery(pivot, itemQueries, distinctColumnValues);
45
58
  }
46
59
  return create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBucket, comparisonInterval);
@@ -90,7 +103,8 @@ function create2DDatePivotQuery(pivot, itemQueries, distinctColumnValues, dateBu
90
103
  ${joinQuery} ORDER BY qt."${pivot.rowField}"`;
91
104
  }
92
105
  function create1DPivotQuery(pivot, itemQueries, dateBucket = 'month', comparisonInterval) {
93
- if (pivot.rowFieldType === 'string') {
106
+ if (['string', 'varchar'].includes(pivot.rowFieldType) ||
107
+ !pivot.rowFieldType) {
94
108
  return create1DStringPivotQuery(pivot, itemQueries);
95
109
  }
96
110
  return create1DDatePivotQuery(pivot, itemQueries, dateBucket, comparisonInterval);
@@ -127,3 +141,23 @@ function create1DDatePivotQuery(pivot, itemQueries, dateBucket = 'month', compar
127
141
  SELECT * FROM quill_qt_agg qt
128
142
  ${joinQuery} ORDER BY qt."${pivot.rowField}"`;
129
143
  }
144
+ function createAggregationValuePivot(pivot, itemQueries) {
145
+ let aggregationType = processAggType(pivot.aggregationType);
146
+ if (pivot.aggregationType === 'count') {
147
+ aggregationType = 'COUNT';
148
+ }
149
+ if (!pivot.valueField)
150
+ return undefined;
151
+ const compareCTE = itemQueries[1]
152
+ ? `, quill_ct as (${itemQueries[1]?.replaceAll(';', '')})`
153
+ : '';
154
+ const compareAggregation = itemQueries[1]
155
+ ? `, quill_ct_cw as (SELECT ${aggregationType}(${pivot.valueField}) as comparison_${pivot.valueField} FROM quill_ct)`
156
+ : '';
157
+ const joinQuery = itemQueries[1] ? `CROSS JOIN quill_ct_cw ct` : '';
158
+ return `WITH quill_qt AS (${itemQueries[0]?.replaceAll(';', '')}),
159
+ quill_qt_agg AS (SELECT ${aggregationType}(${pivot.valueField}) as ${pivot.valueField} FROM quill_qt)
160
+ ${compareCTE} ${compareAggregation}
161
+ SELECT * FROM quill_qt_agg qt
162
+ ${joinQuery}`;
163
+ }
@@ -1,8 +1,30 @@
1
+ import { QuillReport } from '../Dashboard';
1
2
  import { Column } from '../models/Columns';
3
+ export interface AdditionalProcessing {
4
+ sort?: {
5
+ field: string;
6
+ direction: string;
7
+ };
8
+ page?: {
9
+ currentPage: number;
10
+ rowsPerPage: number;
11
+ };
12
+ }
2
13
  export declare const hasColumnAlias: (columns: Column[], referencedColumns: string[]) => boolean;
3
14
  export declare const getUniqueValuesByColumns: (columns: Column[], query: string, rows: any, client: any, customFields: any[]) => Promise<{
4
15
  [column: string]: {
5
16
  [value: string]: boolean;
6
17
  };
7
18
  } | null>;
19
+ export declare const getDateRangeByColumns: (columns: Column[], query: string, client: any, customFields: any[]) => Promise<{
20
+ [column: string]: {
21
+ dateRange: {
22
+ start: Date;
23
+ end: Date;
24
+ };
25
+ };
26
+ } | null>;
27
+ export declare const getPaginatedRows: (report: QuillReport, client: any, processing?: any, filters?: any, customFields?: any) => Promise<{
28
+ [field: string]: any;
29
+ }>;
8
30
  //# sourceMappingURL=tableProcessing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,qBACE,MAAM,EAAE,KAC1B,OAUF,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAC1B,MAAM,EAAE,SACV,MAAM,QACP,GAAG,UACD,GAAG,gBACG,GAAG,EAAE;;;;SA6DpB,CAAC"}
1
+ {"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAS3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,qBACE,MAAM,EAAE,KAC1B,OAUF,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAC1B,MAAM,EAAE,SACV,MAAM,QACP,GAAG,UACD,GAAG,gBACG,GAAG,EAAE;;;;SA6DpB,CAAC;AAkDF,eAAO,MAAM,qBAAqB,YACvB,MAAM,EAAE,SACV,MAAM,UACL,GAAG,gBACG,GAAG,EAAE;;mBAEY;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,GAAG,EAAE,IAAI,CAAA;SAAE;;SAc1D,CAAC;AAqDF,eAAO,MAAM,gBAAgB,WACnB,WAAW,UACX,GAAG,eACE,GAAG,YACN,GAAG,iBACE,GAAG;;EA4CnB,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { getData } from './dataFetcher';
2
- import { generateDistinctQuery } from './queryConstructor';
2
+ import { processFilterErrorList } from './errorProcessing';
3
+ import { mergeComparisonRange } from './merge';
4
+ import { generateDistinctQuery, generateMinMaxRangeQueries, } from './queryConstructor';
3
5
  export const hasColumnAlias = (columns, referencedColumns) => {
4
6
  if (!referencedColumns) {
5
7
  return true;
@@ -92,3 +94,85 @@ const fetchDistinctStrings = async (query, client, customFields) => {
92
94
  return null;
93
95
  }
94
96
  };
97
+ export const getDateRangeByColumns = async (columns, query, client, customFields) => {
98
+ const columnNames = columns.map((column) => column.field);
99
+ const distinctValueQuery = generateMinMaxRangeQueries(columnNames, query, client.databaseType);
100
+ const dateRanges = await fetchDateRanges(distinctValueQuery, client, customFields);
101
+ return dateRanges;
102
+ };
103
+ const fetchDateRanges = async (query, client, customFields) => {
104
+ try {
105
+ const hostedBody = {
106
+ metadata: {
107
+ query,
108
+ task: 'query',
109
+ orgId: client.customerId || '*',
110
+ clientId: client.publicKey,
111
+ databaseType: client?.databaseType,
112
+ customFieldsByTable: customFields,
113
+ },
114
+ };
115
+ const cloudBody = { query };
116
+ const data = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
117
+ if (data.errorMessage) {
118
+ return null;
119
+ }
120
+ const results = data.rows.reduce((acc, currentValue) => {
121
+ acc[currentValue.field] = {
122
+ dateRange: {
123
+ start: new Date(currentValue.min_range),
124
+ end: new Date(currentValue.max_range),
125
+ },
126
+ };
127
+ return acc;
128
+ }, {});
129
+ return results;
130
+ }
131
+ catch (e) {
132
+ console.error(e);
133
+ return null;
134
+ }
135
+ };
136
+ export const getPaginatedRows = async (report, client, processing, filters, customFields) => {
137
+ let updatedProcessing = { ...processing };
138
+ if (processing && processing.sort && !updatedProcessing.page) {
139
+ updatedProcessing.page = {};
140
+ updatedProcessing.page.currentPage = 0;
141
+ }
142
+ const minimalFilters = Object.values(filters).length
143
+ ? Object.values(filters).map((filter) => {
144
+ const newFilter = { ...filter };
145
+ if (newFilter.filterType === 'date_range') {
146
+ delete newFilter['field'];
147
+ delete newFilter['options'];
148
+ delete newFilter['selectedValue'];
149
+ }
150
+ return newFilter;
151
+ })
152
+ : [];
153
+ const hostedBody = {
154
+ metadata: {
155
+ dashboardItemId: report.id,
156
+ orgId: client?.customerId || '*',
157
+ task: 'item',
158
+ filters: minimalFilters,
159
+ clientId: client?.publicKey,
160
+ databaseType: client?.databaseType,
161
+ additionalProcessing: updatedProcessing,
162
+ forcePagination: true,
163
+ customFields,
164
+ },
165
+ };
166
+ const cloudBody = {
167
+ id: report.id,
168
+ filters: [],
169
+ };
170
+ const resp = await getData(client, 'itempost', 'omit', hostedBody, cloudBody);
171
+ processFilterErrorList(resp);
172
+ if (resp && resp.name !== 'error') {
173
+ if (resp.compareRows) {
174
+ mergeComparisonRange(resp);
175
+ }
176
+ }
177
+ return resp.rows;
178
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/react",
3
- "version": "2.12.26",
3
+ "version": "2.12.28",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/esm/index.js",