@quillsql/react 2.11.23 → 2.11.24

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 (201) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +32 -16
  3. package/dist/cjs/ChartBuilder.d.ts +55 -2
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +223 -206
  6. package/dist/cjs/ChartEditor.d.ts +49 -2
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +3 -3
  9. package/dist/cjs/Dashboard.d.ts +5 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +42 -18
  12. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  15. package/dist/cjs/ReportBuilder.d.ts +57 -2
  16. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.js +969 -684
  18. package/dist/cjs/SQLEditor.d.ts +83 -2
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +10 -2
  21. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  22. package/dist/cjs/components/Chart/BarChart.js +8 -6
  23. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  24. package/dist/cjs/components/Chart/BarList.js +0 -153
  25. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  26. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  27. package/dist/cjs/components/Chart/ChartError.js +13 -7
  28. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  31. package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
  32. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  33. package/dist/cjs/components/Chart/LineChart.js +32 -31
  34. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  37. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  40. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  42. package/dist/cjs/components/QuillSelect.js +1 -1
  43. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  44. package/dist/cjs/components/QuillTable.js +11 -12
  45. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  46. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  48. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  53. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  55. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  56. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  58. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  59. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  62. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  64. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  65. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  67. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  69. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  70. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  71. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  73. package/dist/cjs/components/UiComponents.d.ts +34 -4
  74. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  75. package/dist/cjs/components/UiComponents.js +165 -68
  76. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  77. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  78. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  80. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  81. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
  84. package/dist/cjs/utils/axisFormatter.js +3 -3
  85. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  86. package/dist/cjs/utils/getDomain.js +3 -0
  87. package/dist/cjs/utils/merge.d.ts.map +1 -1
  88. package/dist/cjs/utils/merge.js +2 -0
  89. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  91. package/dist/cjs/utils/pivotProcessing.js +177 -0
  92. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  94. package/dist/cjs/utils/queryConstructor.js +11 -0
  95. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  97. package/dist/cjs/utils/tableProcessing.js +84 -0
  98. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  99. package/dist/cjs/utils/valueFormatter.js +40 -8
  100. package/dist/esm/Chart.d.ts.map +1 -1
  101. package/dist/esm/Chart.js +33 -17
  102. package/dist/esm/ChartBuilder.d.ts +55 -2
  103. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  104. package/dist/esm/ChartBuilder.js +225 -208
  105. package/dist/esm/ChartEditor.d.ts +49 -2
  106. package/dist/esm/ChartEditor.d.ts.map +1 -1
  107. package/dist/esm/ChartEditor.js +4 -4
  108. package/dist/esm/Dashboard.d.ts +5 -1
  109. package/dist/esm/Dashboard.d.ts.map +1 -1
  110. package/dist/esm/Dashboard.js +21 -20
  111. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  112. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  114. package/dist/esm/ReportBuilder.d.ts +57 -2
  115. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  116. package/dist/esm/ReportBuilder.js +971 -687
  117. package/dist/esm/SQLEditor.d.ts +83 -2
  118. package/dist/esm/SQLEditor.d.ts.map +1 -1
  119. package/dist/esm/SQLEditor.js +11 -3
  120. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  121. package/dist/esm/components/Chart/BarChart.js +8 -6
  122. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarList.js +0 -153
  124. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  125. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  126. package/dist/esm/components/Chart/ChartError.js +13 -7
  127. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  128. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  129. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  130. package/dist/esm/components/Chart/LineChart.d.ts +1 -1
  131. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  132. package/dist/esm/components/Chart/LineChart.js +32 -31
  133. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  134. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  135. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  136. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  137. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  138. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  139. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  141. package/dist/esm/components/QuillSelect.js +1 -1
  142. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  143. package/dist/esm/components/QuillTable.js +11 -12
  144. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  145. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  147. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  148. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  149. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  150. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  152. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  153. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  154. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  155. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  156. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  157. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  158. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  159. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  160. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  161. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  162. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  163. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  164. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  165. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  166. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  167. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  169. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  170. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  171. package/dist/esm/components/ReportBuilder/util.js +3 -0
  172. package/dist/esm/components/UiComponents.d.ts +34 -4
  173. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  174. package/dist/esm/components/UiComponents.js +155 -66
  175. package/dist/esm/hooks/useQuill.d.ts +1 -0
  176. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  177. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  178. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  180. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  181. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  182. package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
  183. package/dist/esm/utils/axisFormatter.js +3 -3
  184. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  185. package/dist/esm/utils/getDomain.js +3 -0
  186. package/dist/esm/utils/merge.d.ts.map +1 -1
  187. package/dist/esm/utils/merge.js +2 -0
  188. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  189. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  190. package/dist/esm/utils/pivotProcessing.js +170 -0
  191. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  192. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  193. package/dist/esm/utils/queryConstructor.js +7 -0
  194. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  195. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  196. package/dist/esm/utils/tableProcessing.js +80 -0
  197. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  198. package/dist/esm/utils/valueFormatter.js +41 -9
  199. package/package.json +1 -1
  200. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  201. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -17,10 +17,10 @@ export const axisFormatter = ({ value, field, fields, }) => {
17
17
  const HANDLERS = {
18
18
  percent: formatPercent,
19
19
  dollar_amount: formatDollarAmount,
20
- dollar_cents: formatDollarCents,
20
+ dollar_cents: formatDollarAmount, // no cents for axis format
21
21
  whole_number: formatWholeNumber,
22
- one_decimal_place: formatOneDecimalPlace,
23
- two_decimal_places: formatTwoDecimalPlaces,
22
+ one_decimal_place: formatWholeNumber, // no decimals for axis format
23
+ two_decimal_places: formatWholeNumber, // no decimals for axis format
24
24
  string: formatString,
25
25
  yyyy: format_YYYY,
26
26
  MMM_yyyy: format_MMM_yyyy,
@@ -1 +1 @@
1
- {"version":3,"file":"getDomain.d.ts","sourceRoot":"","sources":["../../../src/utils/getDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CA8BtE"}
1
+ {"version":3,"file":"getDomain.d.ts","sourceRoot":"","sources":["../../../src/utils/getDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAkCtE"}
@@ -24,6 +24,9 @@ export default function getDomain(data, fields) {
24
24
  if (minValue === 0 && maxValue === 0) {
25
25
  return [0, 1];
26
26
  }
27
+ if (minValue === Infinity && maxValue === -Infinity) {
28
+ return [0, 1];
29
+ }
27
30
  return fuzzyRound(Math.min(minValue, 0), maxValue);
28
31
  }
29
32
  // Rounds the range to 4 equally-spaced increments of nice,round numbers.
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,QAG7C"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/utils/merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,QAI7C"}
@@ -1,4 +1,6 @@
1
1
  export function mergeComparisonRange(resp) {
2
+ if (resp.chartType === "table")
3
+ return;
2
4
  mergeForwards(resp);
3
5
  // mergeBackwards(resp); // uncomment to switch back and forth
4
6
  }
@@ -0,0 +1,20 @@
1
+ import { Pivot } from '../internals/ReportBuilder/PivotModal';
2
+ export declare function pivotToSql(pivot: Pivot, query: string, client: any): {
3
+ query: string;
4
+ preQueries?: string[];
5
+ runQueryConfig?: any;
6
+ } | undefined;
7
+ export declare function isValidPivot(pivot: Pivot): boolean;
8
+ export declare function getPossiblePivotFieldOptions(columns: any, uniqueValues: {
9
+ [field: string]: any;
10
+ }): {
11
+ rowFields: string[];
12
+ columnFields: string[];
13
+ valueFields: string[];
14
+ };
15
+ export declare function cleanPivot(pivot: Pivot, possibleColumns: {
16
+ rowFields: any;
17
+ columnFields: any;
18
+ valueFields: any;
19
+ }): Pivot;
20
+ //# sourceMappingURL=pivotProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAG9D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,GAAG,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,SAAS,CAgD5E;AAmDD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,WAgBxC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EA8CvC;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE;IACf,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,GAAG,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;CAClB,GACA,KAAK,CAqCP"}
@@ -0,0 +1,170 @@
1
+ import { dateFormatOptions, numberFormatOptions } from '../ChartBuilder';
2
+ import { isNumericColumnType } from '../components/ReportBuilder/ast';
3
+ import { isIdColumn } from '../components/ReportBuilder/util';
4
+ export function pivotToSql(pivot, query, client) {
5
+ const processedAggType = pivot.aggregationType?.toLowerCase() === 'average'
6
+ ? 'avg'
7
+ : pivot.aggregationType?.toLowerCase();
8
+ if ((!pivot.rowField && pivot.valueField && processedAggType) ||
9
+ (!pivot.valueField && pivot.rowField && processedAggType === 'count')) {
10
+ // table aggregation
11
+ return {
12
+ query: `with
13
+ prePivotQuery as (${query})
14
+ SELECT ${processedAggType}(${pivot.valueField ?? pivot.rowField}) FROM prePivotQuery`,
15
+ };
16
+ }
17
+ else if (!pivot.columnField &&
18
+ processedAggType &&
19
+ pivot.rowField &&
20
+ pivot.valueField) {
21
+ // 1-d pivot
22
+ return {
23
+ query: `with
24
+ prePivotQuery as (${query})
25
+ SELECT ${pivot.rowField}, ${processedAggType}(${pivot.valueField}) FROM prePivotQuery GROUP BY ${pivot.rowField}`,
26
+ };
27
+ }
28
+ else if (pivot.columnField &&
29
+ pivot.rowField &&
30
+ pivot.valueField &&
31
+ processedAggType) {
32
+ // 2-d pivot
33
+ const sqlQuery = createPivotSqlQuery(pivot.rowField, pivot.columnField, pivot.valueField, processedAggType, query);
34
+ return {
35
+ preQueries: [sqlQuery],
36
+ query: '',
37
+ runQueryConfig: { getPivotQuery: true },
38
+ };
39
+ }
40
+ return undefined;
41
+ }
42
+ function createPivotSqlQuery(rowField, columnField, valueField, aggregationType, query) {
43
+ // const sqlAggregationType = convertToSqlAggregationType(aggregationType);
44
+ return `with querytable as (${query}),
45
+ DistinctProducts as (
46
+ select distinct
47
+ ${columnField}
48
+ from
49
+ querytable
50
+ ),
51
+ DynamicSQL as (
52
+ select
53
+ string_agg(
54
+ concat(
55
+ '${aggregationType}(CASE WHEN ${columnField} = ''',
56
+ replace(${columnField}, '''', ''''''),
57
+ ''' THEN ${valueField} ELSE 0 END) AS ',
58
+ concat(concat('"', replace(${columnField}, ' ', '_')), '"')
59
+ ),
60
+ ',
61
+ '
62
+ ) as sql_part
63
+ from
64
+ DistinctProducts
65
+ ),
66
+ FinalQuery as (
67
+ select
68
+ concat(
69
+ 'WITH querytable as (${query}) SELECT ${rowField}, ',
70
+ sql_part,
71
+ '
72
+ FROM querytable
73
+ GROUP BY ${rowField}
74
+ ORDER BY ${rowField}'
75
+ ) as query
76
+ from
77
+ DynamicSQL
78
+ )
79
+ select
80
+ query
81
+ from
82
+ FinalQuery;`;
83
+ }
84
+ export function isValidPivot(pivot) {
85
+ if (pivot.rowField && pivot.aggregationType === 'count') {
86
+ return true;
87
+ }
88
+ else if (pivot.rowField && pivot.valueField && pivot.aggregationType) {
89
+ return true;
90
+ }
91
+ else if (pivot.valueField && pivot.aggregationType) {
92
+ return true;
93
+ }
94
+ else if (pivot.rowField &&
95
+ pivot.columnField &&
96
+ pivot.valueField &&
97
+ pivot.aggregationType) {
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
103
+ let rowFields = [];
104
+ let columnFields = [];
105
+ let valueFields = [];
106
+ for (let column of columns) {
107
+ // row fields can be dates or strings
108
+ if (column.format === 'date' ||
109
+ column.fieldType === 'date' ||
110
+ dateFormatOptions.includes(column.format)) {
111
+ rowFields.push(column.field);
112
+ }
113
+ // column fields can be strings
114
+ if (column.format === 'string') {
115
+ const possibleValues = uniqueValues ? uniqueValues[column.field] : 0;
116
+ const isNullValuesOnly = !possibleValues ||
117
+ (Object.keys(possibleValues).length === 1 &&
118
+ Object.keys(possibleValues)[0] === 'null');
119
+ if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
120
+ columnFields.push(column.field);
121
+ }
122
+ if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
123
+ rowFields.push(column.field);
124
+ }
125
+ }
126
+ // value fields can be numbers
127
+ if (column.format === 'whole_number' ||
128
+ numberFormatOptions.includes(column.format) ||
129
+ isNumericColumnType(column.fieldType)) {
130
+ if (!isIdColumn(column.field)) {
131
+ valueFields.push(column.field);
132
+ }
133
+ }
134
+ }
135
+ return {
136
+ rowFields,
137
+ columnFields,
138
+ valueFields,
139
+ };
140
+ }
141
+ export function cleanPivot(pivot, possibleColumns) {
142
+ if (possibleColumns.columnFields.length === 0 &&
143
+ possibleColumns.rowFields.length === 0 &&
144
+ possibleColumns.valueFields.length === 0) {
145
+ return pivot;
146
+ }
147
+ // Swap row field and column field if the AI put a date field as the column field
148
+ if (pivot.columnField &&
149
+ !possibleColumns.columnFields.includes(pivot.columnField)) {
150
+ if (possibleColumns.rowFields.includes(pivot.columnField)) {
151
+ const rowField = pivot.rowField;
152
+ pivot.rowField = pivot.columnField;
153
+ pivot.columnField = possibleColumns.columnFields.includes(rowField)
154
+ ? rowField
155
+ : undefined;
156
+ }
157
+ }
158
+ if (pivot.rowField && !possibleColumns.rowFields.includes(pivot.rowField)) {
159
+ pivot.rowField = '';
160
+ }
161
+ if (pivot.valueField &&
162
+ !possibleColumns.valueFields.includes(pivot.valueField)) {
163
+ pivot.valueField = '';
164
+ }
165
+ if (pivot.columnField &&
166
+ !possibleColumns.columnFields.includes(pivot.columnField)) {
167
+ pivot.columnField = undefined;
168
+ }
169
+ return pivot;
170
+ }
@@ -0,0 +1,2 @@
1
+ export declare function generateDistinctQuery(stringFields: string[], query: string): string;
2
+ //# sourceMappingURL=queryConstructor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryConstructor.d.ts","sourceRoot":"","sources":["../../../src/utils/queryConstructor.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,UAQ1E"}
@@ -0,0 +1,7 @@
1
+ export function generateDistinctQuery(stringFields, query) {
2
+ const distinctQueries = stringFields.map((field) => {
3
+ return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
4
+ });
5
+ const distinctQuery = distinctQueries.join(' UNION ALL ');
6
+ return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
7
+ }
@@ -0,0 +1,7 @@
1
+ import { ColumnInfo } from '../components/ReportBuilder/schema';
2
+ export declare const getUniqueValuesByColumns: (columns: ColumnInfo[], query: string, rows: any, client: any) => Promise<{
3
+ [column: string]: {
4
+ [value: string]: boolean;
5
+ };
6
+ } | null>;
7
+ //# sourceMappingURL=tableProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/tableProcessing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAa,MAAM,oCAAoC,CAAC;AAI3E,eAAO,MAAM,wBAAwB,YAC1B,UAAU,EAAE,SACd,MAAM,QACP,GAAG,UACD,GAAG;;;;SA2DZ,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { getData } from './dataFetcher';
2
+ import { generateDistinctQuery } from './queryConstructor';
3
+ export const getUniqueValuesByColumns = async (columns, query, rows, client) => {
4
+ const stringNames = columns.map(
5
+ // @ts-ignore
6
+ (column) => column.name || column.field);
7
+ const uniqueValues = {};
8
+ if (!client.databaseType ||
9
+ client.databaseType.toLowerCase() === 'bigquery') {
10
+ if (rows.length === 0) {
11
+ const hostedBody = {
12
+ metadata: {
13
+ query: query,
14
+ task: 'query',
15
+ orgId: client.customerId || '*',
16
+ clientId: client.publicKey,
17
+ databaseType: client?.databaseType,
18
+ },
19
+ };
20
+ const cloudBody = { query };
21
+ const data = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
22
+ if (data.errorMessage) {
23
+ return null;
24
+ }
25
+ rows = data.rows;
26
+ }
27
+ for (const column of columns) {
28
+ const values = Array.from(
29
+ //@ts-ignore
30
+ new Set(rows.map((row) => row[column.name || column.field])));
31
+ // @ts-ignore
32
+ uniqueValues[column.name || column.field] = values.reduce((result, value) => {
33
+ result[value] = false;
34
+ return result;
35
+ }, {});
36
+ }
37
+ }
38
+ else {
39
+ const distinctValueQuery = generateDistinctQuery(stringNames, query);
40
+ const distinctStrings = await fetchDistinctStrings(distinctValueQuery, client);
41
+ for (const column of distinctStrings) {
42
+ uniqueValues[column.column] = column.values;
43
+ }
44
+ }
45
+ return uniqueValues;
46
+ };
47
+ const fetchDistinctStrings = async (query, client) => {
48
+ try {
49
+ const hostedBody = {
50
+ metadata: {
51
+ query,
52
+ task: 'query',
53
+ orgId: client.customerId || '*',
54
+ clientId: client.publicKey,
55
+ databaseType: client?.databaseType,
56
+ },
57
+ };
58
+ const cloudBody = { query };
59
+ const data = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
60
+ if (data.errorMessage) {
61
+ return null;
62
+ }
63
+ const results = data.rows.map((columnInfo) => {
64
+ const column = columnInfo.field;
65
+ if (!columnInfo.string_values) {
66
+ return { column, values: {} };
67
+ }
68
+ const values = columnInfo.string_values.reduce((result, value) => {
69
+ result[value] = false;
70
+ return result;
71
+ }, {});
72
+ return { column, values };
73
+ });
74
+ return results;
75
+ }
76
+ catch (e) {
77
+ console.error(e);
78
+ return null;
79
+ }
80
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/utils/valueFormatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAQ7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6BAA8B,KAAK,KAAG,MAwChE,CAAC;AAEF,eAAO,MAAM,WAAW;WAIf,GAAG;YACF,MAAM;MACZ,MAoCH,CAAC;AAyKF,eAAO,MAAM,aAAa;;;;WAGhB,MAAM,KACb,MAoCF,CAAC"}
1
+ {"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/utils/valueFormatter.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAQ7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6BAA8B,KAAK,KAAG,MAwChE,CAAC;AAEF,eAAO,MAAM,WAAW;WAIf,GAAG;YACF,MAAM;MACZ,MAoCH,CAAC;AAoMF,eAAO,MAAM,aAAa;;;;WAGhB,MAAM,KACb,MA6CF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { endOfWeek, format, getWeek, isValid, startOfWeek } from 'date-fns';
1
+ import { endOfWeek, format, getWeek, isValid, parse, startOfWeek, } from 'date-fns';
2
2
  import { utcToZonedTime } from 'date-fns-tz';
3
3
  export const DATE_FORMAT_TYPES = [
4
4
  'yyyy',
@@ -50,8 +50,6 @@ export const valueFormatter = ({ value, field, fields }) => {
50
50
  return formatString(value); // by default make this value a string
51
51
  };
52
52
  export const quillFormat = ({ value, format, }) => {
53
- if (value === undefined || value === null)
54
- return '';
55
53
  const HANDLERS = {
56
54
  percent: formatPercent,
57
55
  dollar_amount: formatDollarAmount,
@@ -63,6 +61,7 @@ export const quillFormat = ({ value, format, }) => {
63
61
  yyyy: format_YYYY,
64
62
  MMM_yyyy: format_MMM_yyyy,
65
63
  MMM_dd_yyyy: format_MMM_dd_yyyy,
64
+ MMM_dd: format_MMM_dd,
66
65
  hh_ap_pm: format_hh_ap_pm,
67
66
  'MMM_dd-MMM_dd': format_MMM_dd_MMM_dd,
68
67
  'MMM_dd_hh:mm_ap_pm': format_MMM_dd_hh_mm_ap_pm,
@@ -74,6 +73,7 @@ export const quillFormat = ({ value, format, }) => {
74
73
  // if bigquery date type, we have to pull the value out of the json
75
74
  if (DATE_FORMAT_TYPES.includes(formatType) &&
76
75
  typeof value === 'object' &&
76
+ value &&
77
77
  value.value) {
78
78
  return HANDLERS[formatType](value.value);
79
79
  }
@@ -88,6 +88,9 @@ export const quillFormat = ({ value, format, }) => {
88
88
  * Formats the value as a string using the built-in converstion.
89
89
  */
90
90
  const formatString = (value) => {
91
+ if (!value) {
92
+ return 'null';
93
+ }
91
94
  if (typeof value === 'object') {
92
95
  return JSON.stringify(value);
93
96
  }
@@ -187,6 +190,7 @@ const _getUTCDateHelper = (value, fmt) => {
187
190
  const format_YYYY = (value) => _getUTCDateHelper(value, 'yyyy');
188
191
  const format_MMM_yyyy = (value) => _getUTCDateHelper(value, 'MMM yyyy');
189
192
  const format_hh_ap_pm = (value) => _getUTCDateHelper(value, 'hh:mm aa');
193
+ const format_MMM_dd = (value) => _getUTCDateHelper(value, 'MMM dd');
190
194
  const format_MMM_dd_yyyy = (value) => {
191
195
  return _getUTCDateHelper(value, 'dd MMM yyyy');
192
196
  };
@@ -238,6 +242,26 @@ function parseNumber(value) {
238
242
  }
239
243
  // Moved this out of parseNumber for perf reasons
240
244
  const localeFormatter = Intl.NumberFormat(typeof navigator !== 'undefined' ? navigator.language : 'en-US');
245
+ const FORMATS = [
246
+ 'dd MMM yyyy',
247
+ 'yyyy-mm-dd',
248
+ 'MMM yyyy',
249
+ 'MMM do h a',
250
+ 'MMM do h:mm a',
251
+ ];
252
+ function isValidDate(dateString) {
253
+ const date = getValidDate(dateString);
254
+ if (date)
255
+ return true;
256
+ // Try parsing as native date object
257
+ const d = new Date(dateString);
258
+ return !isNaN(d.getTime());
259
+ // return FORMATS.some((fmt) => isValid(parse(d, fmt, new Date())));
260
+ }
261
+ function getValidDate(dateString) {
262
+ const dates = FORMATS.map((fmt) => parse(dateString, fmt, new Date()));
263
+ return dates.find((date) => isValid(date));
264
+ }
241
265
  export const compareValues = (a, b, column) => {
242
266
  const valueA = a[column];
243
267
  const valueB = b[column];
@@ -261,16 +285,24 @@ export const compareValues = (a, b, column) => {
261
285
  else if (valueB === undefined) {
262
286
  return 1; // ValueB is undefined, consider it smaller
263
287
  }
288
+ // For dates
289
+ if (isValidDate(valueA) && isValidDate(valueB)) {
290
+ const dateA = new Date(valueA);
291
+ const dateB = new Date(valueB);
292
+ if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
293
+ return dateA.getTime() - dateB.getTime();
294
+ }
295
+ // Handle edge case for AM/PM date formats
296
+ const date1 = getValidDate(valueA);
297
+ const date2 = getValidDate(valueB);
298
+ if (date1 && date2) {
299
+ return date1.getTime() - date2.getTime();
300
+ }
301
+ }
264
302
  // For numbers
265
303
  if (!isNaN(parseNumber(valueA)) && !isNaN(parseNumber(valueB))) {
266
304
  return parseNumber(valueA) - parseNumber(valueB);
267
305
  }
268
- // For dates
269
- const dateA = new Date(valueA);
270
- const dateB = new Date(valueB);
271
- if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
272
- return dateA.getTime() - dateB.getTime();
273
- }
274
306
  // For strings
275
307
  return valueA.localeCompare(valueB);
276
308
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/react",
3
- "version": "2.11.23",
3
+ "version": "2.11.24",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/esm/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"AddColumnPopover.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddColumnPopover.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,UAAU,EACV,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,MAAM,GACP,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,kBAAkB,EAAE,GAAG,CAAC;IACxB,qBAAqB,EAAE,GAAG,CAAC;IAC3B,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,GAAG,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,IAAI,CAAC;QACxB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,CAAA;SAAE,KAAK,GAAG,CAAC,OAAO,CAAC;KAC5E,KAAK,GAAG,CAAC,OAAO,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC;CACb,2CA8MA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AddColumnPopover.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddColumnPopover.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,UAAU,EACV,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,MAAM,GACP,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,kBAAkB,EAAE,GAAG,CAAC;IACxB,qBAAqB,EAAE,GAAG,CAAC;IAC3B,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,GAAG,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC3D,YAAY,EAAE,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,IAAI,CAAC;QACxB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,CAAA;SAAE,KAAK,GAAG,CAAC,OAAO,CAAC;KAC5E,KAAK,GAAG,CAAC,OAAO,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC;CACb,2CA8MA"}