@quillsql/react 2.11.23 → 2.11.25

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 (203) hide show
  1. package/dist/cjs/Chart.d.ts +16 -0
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +34 -18
  4. package/dist/cjs/ChartBuilder.d.ts +55 -2
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +232 -212
  7. package/dist/cjs/ChartEditor.d.ts +49 -2
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +3 -3
  10. package/dist/cjs/Dashboard.d.ts +5 -1
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +42 -18
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  16. package/dist/cjs/ReportBuilder.d.ts +57 -2
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +962 -684
  19. package/dist/cjs/SQLEditor.d.ts +83 -2
  20. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  21. package/dist/cjs/SQLEditor.js +10 -2
  22. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  23. package/dist/cjs/components/Chart/BarChart.js +8 -6
  24. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  25. package/dist/cjs/components/Chart/BarList.js +0 -153
  26. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  27. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  28. package/dist/cjs/components/Chart/ChartError.js +13 -7
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  30. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  31. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  32. package/dist/cjs/components/Chart/LineChart.d.ts +6 -2
  33. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  34. package/dist/cjs/components/Chart/LineChart.js +35 -34
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  37. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  39. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  40. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  41. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  42. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  43. package/dist/cjs/components/QuillSelect.js +1 -1
  44. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  45. package/dist/cjs/components/QuillTable.js +11 -12
  46. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  47. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  48. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  53. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  55. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  56. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  58. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  59. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  61. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  62. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  64. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  65. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  67. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  69. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  70. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  71. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  73. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  74. package/dist/cjs/components/UiComponents.d.ts +34 -4
  75. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  76. package/dist/cjs/components/UiComponents.js +165 -68
  77. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  78. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  80. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  81. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  84. package/dist/cjs/internals/ReportBuilder/PivotModal.js +442 -282
  85. package/dist/cjs/utils/axisFormatter.js +3 -3
  86. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  87. package/dist/cjs/utils/getDomain.js +3 -0
  88. package/dist/cjs/utils/merge.d.ts.map +1 -1
  89. package/dist/cjs/utils/merge.js +2 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  91. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  92. package/dist/cjs/utils/pivotProcessing.js +177 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  94. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  95. package/dist/cjs/utils/queryConstructor.js +11 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  97. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  98. package/dist/cjs/utils/tableProcessing.js +84 -0
  99. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  100. package/dist/cjs/utils/valueFormatter.js +40 -8
  101. package/dist/esm/Chart.d.ts +16 -0
  102. package/dist/esm/Chart.d.ts.map +1 -1
  103. package/dist/esm/Chart.js +35 -19
  104. package/dist/esm/ChartBuilder.d.ts +55 -2
  105. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  106. package/dist/esm/ChartBuilder.js +234 -214
  107. package/dist/esm/ChartEditor.d.ts +49 -2
  108. package/dist/esm/ChartEditor.d.ts.map +1 -1
  109. package/dist/esm/ChartEditor.js +4 -4
  110. package/dist/esm/Dashboard.d.ts +5 -1
  111. package/dist/esm/Dashboard.d.ts.map +1 -1
  112. package/dist/esm/Dashboard.js +21 -20
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  114. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  115. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  116. package/dist/esm/ReportBuilder.d.ts +57 -2
  117. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  118. package/dist/esm/ReportBuilder.js +964 -687
  119. package/dist/esm/SQLEditor.d.ts +83 -2
  120. package/dist/esm/SQLEditor.d.ts.map +1 -1
  121. package/dist/esm/SQLEditor.js +11 -3
  122. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarChart.js +8 -6
  124. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  125. package/dist/esm/components/Chart/BarList.js +0 -153
  126. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  127. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  128. package/dist/esm/components/Chart/ChartError.js +13 -7
  129. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  130. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  131. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  132. package/dist/esm/components/Chart/LineChart.d.ts +6 -2
  133. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  134. package/dist/esm/components/Chart/LineChart.js +35 -34
  135. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  136. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  137. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  138. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  139. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  141. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  142. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  143. package/dist/esm/components/QuillSelect.js +1 -1
  144. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  145. package/dist/esm/components/QuillTable.js +11 -12
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  147. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  148. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  149. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  150. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  152. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  153. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  154. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  155. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  156. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  157. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  158. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  159. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  160. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  161. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  162. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  163. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  164. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  165. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  166. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  167. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  169. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  170. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  171. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  172. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  173. package/dist/esm/components/ReportBuilder/util.js +3 -0
  174. package/dist/esm/components/UiComponents.d.ts +34 -4
  175. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  176. package/dist/esm/components/UiComponents.js +155 -66
  177. package/dist/esm/hooks/useQuill.d.ts +1 -0
  178. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  180. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  181. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  182. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  183. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  184. package/dist/esm/internals/ReportBuilder/PivotModal.js +443 -284
  185. package/dist/esm/utils/axisFormatter.js +3 -3
  186. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  187. package/dist/esm/utils/getDomain.js +3 -0
  188. package/dist/esm/utils/merge.d.ts.map +1 -1
  189. package/dist/esm/utils/merge.js +2 -0
  190. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  191. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  192. package/dist/esm/utils/pivotProcessing.js +170 -0
  193. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  194. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  195. package/dist/esm/utils/queryConstructor.js +7 -0
  196. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  197. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  198. package/dist/esm/utils/tableProcessing.js +80 -0
  199. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  200. package/dist/esm/utils/valueFormatter.js +41 -9
  201. package/package.json +1 -1
  202. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  203. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -20,10 +20,10 @@ const axisFormatter = ({ value, field, fields, }) => {
20
20
  const HANDLERS = {
21
21
  percent: formatPercent,
22
22
  dollar_amount: formatDollarAmount,
23
- dollar_cents: formatDollarCents,
23
+ dollar_cents: formatDollarAmount, // no cents for axis format
24
24
  whole_number: formatWholeNumber,
25
- one_decimal_place: formatOneDecimalPlace,
26
- two_decimal_places: formatTwoDecimalPlaces,
25
+ one_decimal_place: formatWholeNumber, // no decimals for axis format
26
+ two_decimal_places: formatWholeNumber, // no decimals for axis format
27
27
  string: formatString,
28
28
  yyyy: format_YYYY,
29
29
  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"}
@@ -26,6 +26,9 @@ function getDomain(data, fields) {
26
26
  if (minValue === 0 && maxValue === 0) {
27
27
  return [0, 1];
28
28
  }
29
+ if (minValue === Infinity && maxValue === -Infinity) {
30
+ return [0, 1];
31
+ }
29
32
  return fuzzyRound(Math.min(minValue, 0), maxValue);
30
33
  }
31
34
  exports.default = getDomain;
@@ -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"}
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mergeComparisonRange = void 0;
4
4
  function mergeComparisonRange(resp) {
5
+ if (resp.chartType === "table")
6
+ return;
5
7
  mergeForwards(resp);
6
8
  // mergeBackwards(resp); // uncomment to switch back and forth
7
9
  }
@@ -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,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanPivot = exports.getPossiblePivotFieldOptions = exports.isValidPivot = exports.pivotToSql = void 0;
4
+ const ChartBuilder_1 = require("../ChartBuilder");
5
+ const ast_1 = require("../components/ReportBuilder/ast");
6
+ const util_1 = require("../components/ReportBuilder/util");
7
+ function pivotToSql(pivot, query, client) {
8
+ const processedAggType = pivot.aggregationType?.toLowerCase() === 'average'
9
+ ? 'avg'
10
+ : pivot.aggregationType?.toLowerCase();
11
+ if ((!pivot.rowField && pivot.valueField && processedAggType) ||
12
+ (!pivot.valueField && pivot.rowField && processedAggType === 'count')) {
13
+ // table aggregation
14
+ return {
15
+ query: `with
16
+ prePivotQuery as (${query})
17
+ SELECT ${processedAggType}(${pivot.valueField ?? pivot.rowField}) FROM prePivotQuery`,
18
+ };
19
+ }
20
+ else if (!pivot.columnField &&
21
+ processedAggType &&
22
+ pivot.rowField &&
23
+ pivot.valueField) {
24
+ // 1-d pivot
25
+ return {
26
+ query: `with
27
+ prePivotQuery as (${query})
28
+ SELECT ${pivot.rowField}, ${processedAggType}(${pivot.valueField}) FROM prePivotQuery GROUP BY ${pivot.rowField}`,
29
+ };
30
+ }
31
+ else if (pivot.columnField &&
32
+ pivot.rowField &&
33
+ pivot.valueField &&
34
+ processedAggType) {
35
+ // 2-d pivot
36
+ const sqlQuery = createPivotSqlQuery(pivot.rowField, pivot.columnField, pivot.valueField, processedAggType, query);
37
+ return {
38
+ preQueries: [sqlQuery],
39
+ query: '',
40
+ runQueryConfig: { getPivotQuery: true },
41
+ };
42
+ }
43
+ return undefined;
44
+ }
45
+ exports.pivotToSql = pivotToSql;
46
+ function createPivotSqlQuery(rowField, columnField, valueField, aggregationType, query) {
47
+ // const sqlAggregationType = convertToSqlAggregationType(aggregationType);
48
+ return `with querytable as (${query}),
49
+ DistinctProducts as (
50
+ select distinct
51
+ ${columnField}
52
+ from
53
+ querytable
54
+ ),
55
+ DynamicSQL as (
56
+ select
57
+ string_agg(
58
+ concat(
59
+ '${aggregationType}(CASE WHEN ${columnField} = ''',
60
+ replace(${columnField}, '''', ''''''),
61
+ ''' THEN ${valueField} ELSE 0 END) AS ',
62
+ concat(concat('"', replace(${columnField}, ' ', '_')), '"')
63
+ ),
64
+ ',
65
+ '
66
+ ) as sql_part
67
+ from
68
+ DistinctProducts
69
+ ),
70
+ FinalQuery as (
71
+ select
72
+ concat(
73
+ 'WITH querytable as (${query}) SELECT ${rowField}, ',
74
+ sql_part,
75
+ '
76
+ FROM querytable
77
+ GROUP BY ${rowField}
78
+ ORDER BY ${rowField}'
79
+ ) as query
80
+ from
81
+ DynamicSQL
82
+ )
83
+ select
84
+ query
85
+ from
86
+ FinalQuery;`;
87
+ }
88
+ function isValidPivot(pivot) {
89
+ if (pivot.rowField && pivot.aggregationType === 'count') {
90
+ return true;
91
+ }
92
+ else if (pivot.rowField && pivot.valueField && pivot.aggregationType) {
93
+ return true;
94
+ }
95
+ else if (pivot.valueField && pivot.aggregationType) {
96
+ return true;
97
+ }
98
+ else if (pivot.rowField &&
99
+ pivot.columnField &&
100
+ pivot.valueField &&
101
+ pivot.aggregationType) {
102
+ return true;
103
+ }
104
+ return false;
105
+ }
106
+ exports.isValidPivot = isValidPivot;
107
+ function getPossiblePivotFieldOptions(columns, uniqueValues) {
108
+ let rowFields = [];
109
+ let columnFields = [];
110
+ let valueFields = [];
111
+ for (let column of columns) {
112
+ // row fields can be dates or strings
113
+ if (column.format === 'date' ||
114
+ column.fieldType === 'date' ||
115
+ ChartBuilder_1.dateFormatOptions.includes(column.format)) {
116
+ rowFields.push(column.field);
117
+ }
118
+ // column fields can be strings
119
+ if (column.format === 'string') {
120
+ const possibleValues = uniqueValues ? uniqueValues[column.field] : 0;
121
+ const isNullValuesOnly = !possibleValues ||
122
+ (Object.keys(possibleValues).length === 1 &&
123
+ Object.keys(possibleValues)[0] === 'null');
124
+ if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
125
+ columnFields.push(column.field);
126
+ }
127
+ if (!isNullValuesOnly && Object.keys(possibleValues).length <= 36) {
128
+ rowFields.push(column.field);
129
+ }
130
+ }
131
+ // value fields can be numbers
132
+ if (column.format === 'whole_number' ||
133
+ ChartBuilder_1.numberFormatOptions.includes(column.format) ||
134
+ (0, ast_1.isNumericColumnType)(column.fieldType)) {
135
+ if (!(0, util_1.isIdColumn)(column.field)) {
136
+ valueFields.push(column.field);
137
+ }
138
+ }
139
+ }
140
+ return {
141
+ rowFields,
142
+ columnFields,
143
+ valueFields,
144
+ };
145
+ }
146
+ exports.getPossiblePivotFieldOptions = getPossiblePivotFieldOptions;
147
+ function cleanPivot(pivot, possibleColumns) {
148
+ if (possibleColumns.columnFields.length === 0 &&
149
+ possibleColumns.rowFields.length === 0 &&
150
+ possibleColumns.valueFields.length === 0) {
151
+ return pivot;
152
+ }
153
+ // Swap row field and column field if the AI put a date field as the column field
154
+ if (pivot.columnField &&
155
+ !possibleColumns.columnFields.includes(pivot.columnField)) {
156
+ if (possibleColumns.rowFields.includes(pivot.columnField)) {
157
+ const rowField = pivot.rowField;
158
+ pivot.rowField = pivot.columnField;
159
+ pivot.columnField = possibleColumns.columnFields.includes(rowField)
160
+ ? rowField
161
+ : undefined;
162
+ }
163
+ }
164
+ if (pivot.rowField && !possibleColumns.rowFields.includes(pivot.rowField)) {
165
+ pivot.rowField = '';
166
+ }
167
+ if (pivot.valueField &&
168
+ !possibleColumns.valueFields.includes(pivot.valueField)) {
169
+ pivot.valueField = '';
170
+ }
171
+ if (pivot.columnField &&
172
+ !possibleColumns.columnFields.includes(pivot.columnField)) {
173
+ pivot.columnField = undefined;
174
+ }
175
+ return pivot;
176
+ }
177
+ exports.cleanPivot = cleanPivot;
@@ -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,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateDistinctQuery = void 0;
4
+ function generateDistinctQuery(stringFields, query) {
5
+ const distinctQueries = stringFields.map((field) => {
6
+ return `SELECT '${field}' AS field, ARRAY_AGG(DISTINCT ${field}) AS string_values FROM querytable`;
7
+ });
8
+ const distinctQuery = distinctQueries.join(' UNION ALL ');
9
+ return `WITH querytable AS (${query.replace(';', '')}) ` + distinctQuery;
10
+ }
11
+ exports.generateDistinctQuery = generateDistinctQuery;
@@ -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,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUniqueValuesByColumns = void 0;
4
+ const dataFetcher_1 = require("./dataFetcher");
5
+ const queryConstructor_1 = require("./queryConstructor");
6
+ const getUniqueValuesByColumns = async (columns, query, rows, client) => {
7
+ const stringNames = columns.map(
8
+ // @ts-ignore
9
+ (column) => column.name || column.field);
10
+ const uniqueValues = {};
11
+ if (!client.databaseType ||
12
+ client.databaseType.toLowerCase() === 'bigquery') {
13
+ if (rows.length === 0) {
14
+ const hostedBody = {
15
+ metadata: {
16
+ query: query,
17
+ task: 'query',
18
+ orgId: client.customerId || '*',
19
+ clientId: client.publicKey,
20
+ databaseType: client?.databaseType,
21
+ },
22
+ };
23
+ const cloudBody = { query };
24
+ const data = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
25
+ if (data.errorMessage) {
26
+ return null;
27
+ }
28
+ rows = data.rows;
29
+ }
30
+ for (const column of columns) {
31
+ const values = Array.from(
32
+ //@ts-ignore
33
+ new Set(rows.map((row) => row[column.name || column.field])));
34
+ // @ts-ignore
35
+ uniqueValues[column.name || column.field] = values.reduce((result, value) => {
36
+ result[value] = false;
37
+ return result;
38
+ }, {});
39
+ }
40
+ }
41
+ else {
42
+ const distinctValueQuery = (0, queryConstructor_1.generateDistinctQuery)(stringNames, query);
43
+ const distinctStrings = await fetchDistinctStrings(distinctValueQuery, client);
44
+ for (const column of distinctStrings) {
45
+ uniqueValues[column.column] = column.values;
46
+ }
47
+ }
48
+ return uniqueValues;
49
+ };
50
+ exports.getUniqueValuesByColumns = getUniqueValuesByColumns;
51
+ const fetchDistinctStrings = async (query, client) => {
52
+ try {
53
+ const hostedBody = {
54
+ metadata: {
55
+ query,
56
+ task: 'query',
57
+ orgId: client.customerId || '*',
58
+ clientId: client.publicKey,
59
+ databaseType: client?.databaseType,
60
+ },
61
+ };
62
+ const cloudBody = { query };
63
+ const data = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
64
+ if (data.errorMessage) {
65
+ return null;
66
+ }
67
+ const results = data.rows.map((columnInfo) => {
68
+ const column = columnInfo.field;
69
+ if (!columnInfo.string_values) {
70
+ return { column, values: {} };
71
+ }
72
+ const values = columnInfo.string_values.reduce((result, value) => {
73
+ result[value] = false;
74
+ return result;
75
+ }, {});
76
+ return { column, values };
77
+ });
78
+ return results;
79
+ }
80
+ catch (e) {
81
+ console.error(e);
82
+ return null;
83
+ }
84
+ };
@@ -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"}
@@ -54,8 +54,6 @@ const valueFormatter = ({ value, field, fields }) => {
54
54
  };
55
55
  exports.valueFormatter = valueFormatter;
56
56
  const quillFormat = ({ value, format, }) => {
57
- if (value === undefined || value === null)
58
- return '';
59
57
  const HANDLERS = {
60
58
  percent: formatPercent,
61
59
  dollar_amount: formatDollarAmount,
@@ -67,6 +65,7 @@ const quillFormat = ({ value, format, }) => {
67
65
  yyyy: format_YYYY,
68
66
  MMM_yyyy: format_MMM_yyyy,
69
67
  MMM_dd_yyyy: format_MMM_dd_yyyy,
68
+ MMM_dd: format_MMM_dd,
70
69
  hh_ap_pm: format_hh_ap_pm,
71
70
  'MMM_dd-MMM_dd': format_MMM_dd_MMM_dd,
72
71
  'MMM_dd_hh:mm_ap_pm': format_MMM_dd_hh_mm_ap_pm,
@@ -78,6 +77,7 @@ const quillFormat = ({ value, format, }) => {
78
77
  // if bigquery date type, we have to pull the value out of the json
79
78
  if (exports.DATE_FORMAT_TYPES.includes(formatType) &&
80
79
  typeof value === 'object' &&
80
+ value &&
81
81
  value.value) {
82
82
  return HANDLERS[formatType](value.value);
83
83
  }
@@ -93,6 +93,9 @@ exports.quillFormat = quillFormat;
93
93
  * Formats the value as a string using the built-in converstion.
94
94
  */
95
95
  const formatString = (value) => {
96
+ if (!value) {
97
+ return 'null';
98
+ }
96
99
  if (typeof value === 'object') {
97
100
  return JSON.stringify(value);
98
101
  }
@@ -192,6 +195,7 @@ const _getUTCDateHelper = (value, fmt) => {
192
195
  const format_YYYY = (value) => _getUTCDateHelper(value, 'yyyy');
193
196
  const format_MMM_yyyy = (value) => _getUTCDateHelper(value, 'MMM yyyy');
194
197
  const format_hh_ap_pm = (value) => _getUTCDateHelper(value, 'hh:mm aa');
198
+ const format_MMM_dd = (value) => _getUTCDateHelper(value, 'MMM dd');
195
199
  const format_MMM_dd_yyyy = (value) => {
196
200
  return _getUTCDateHelper(value, 'dd MMM yyyy');
197
201
  };
@@ -243,6 +247,26 @@ function parseNumber(value) {
243
247
  }
244
248
  // Moved this out of parseNumber for perf reasons
245
249
  const localeFormatter = Intl.NumberFormat(typeof navigator !== 'undefined' ? navigator.language : 'en-US');
250
+ const FORMATS = [
251
+ 'dd MMM yyyy',
252
+ 'yyyy-mm-dd',
253
+ 'MMM yyyy',
254
+ 'MMM do h a',
255
+ 'MMM do h:mm a',
256
+ ];
257
+ function isValidDate(dateString) {
258
+ const date = getValidDate(dateString);
259
+ if (date)
260
+ return true;
261
+ // Try parsing as native date object
262
+ const d = new Date(dateString);
263
+ return !isNaN(d.getTime());
264
+ // return FORMATS.some((fmt) => isValid(parse(d, fmt, new Date())));
265
+ }
266
+ function getValidDate(dateString) {
267
+ const dates = FORMATS.map((fmt) => (0, date_fns_1.parse)(dateString, fmt, new Date()));
268
+ return dates.find((date) => (0, date_fns_1.isValid)(date));
269
+ }
246
270
  const compareValues = (a, b, column) => {
247
271
  const valueA = a[column];
248
272
  const valueB = b[column];
@@ -266,16 +290,24 @@ const compareValues = (a, b, column) => {
266
290
  else if (valueB === undefined) {
267
291
  return 1; // ValueB is undefined, consider it smaller
268
292
  }
293
+ // For dates
294
+ if (isValidDate(valueA) && isValidDate(valueB)) {
295
+ const dateA = new Date(valueA);
296
+ const dateB = new Date(valueB);
297
+ if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
298
+ return dateA.getTime() - dateB.getTime();
299
+ }
300
+ // Handle edge case for AM/PM date formats
301
+ const date1 = getValidDate(valueA);
302
+ const date2 = getValidDate(valueB);
303
+ if (date1 && date2) {
304
+ return date1.getTime() - date2.getTime();
305
+ }
306
+ }
269
307
  // For numbers
270
308
  if (!isNaN(parseNumber(valueA)) && !isNaN(parseNumber(valueB))) {
271
309
  return parseNumber(valueA) - parseNumber(valueB);
272
310
  }
273
- // For dates
274
- const dateA = new Date(valueA);
275
- const dateB = new Date(valueB);
276
- if (!isNaN(dateA.getTime()) && !isNaN(dateB.getTime())) {
277
- return dateA.getTime() - dateB.getTime();
278
- }
279
311
  // For strings
280
312
  return valueA.localeCompare(valueB);
281
313
  };
@@ -58,6 +58,18 @@ export interface ChartProps {
58
58
  * Whether to hide the cartesian grid lines.
59
59
  */
60
60
  hideCartesianGrid?: boolean;
61
+ /**
62
+ * Whether to hide the horizontal cartesian grid lines (default: false).
63
+ */
64
+ hideHorizontalCartesianGrid?: boolean;
65
+ /**
66
+ * Whether to hide the vertical cartesian grid lines (default: true).
67
+ */
68
+ hideVerticalCartesianGrid?: boolean;
69
+ /**
70
+ * Whether to hide the all but the first of the X-Axis ticks (default: false).
71
+ */
72
+ hideSubsequentXAxisTicks?: boolean;
61
73
  /**
62
74
  * Whether the date range filter has been disabled.
63
75
  */
@@ -67,6 +79,10 @@ export interface ChartProps {
67
79
  * charts (as opposed to the default solid line).
68
80
  */
69
81
  comparisonLineStyle?: 'solid' | 'dashed';
82
+ /**
83
+ * Whether the cartesian grid lines show as dashed lines (default: solid).
84
+ */
85
+ cartesianGridLineStyle?: 'solid' | 'dashed';
70
86
  /**
71
87
  * An optional function that takes a dashboard item and theme and returns a
72
88
  * map of keys used in that dashboard item to the colors they should use.
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgB7C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAgGjD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,WAQhE;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH,CAAC;AAeF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC;IAE7B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAEzC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,iBAAiB,CAAC,EAAE,CAClB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,YAAY,CAAC;IAElB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CAsC/B,CAAC;AAyiBF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgB7C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAsGjD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,WAQhE;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH,CAAC;AAeF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC;IAE7B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;OAEG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAEzC;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE5C;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,iBAAiB,CAAC,EAAE,CAClB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,UAAU,KACd,YAAY,CAAC;IAElB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,4CA2C/B,CAAC;AAulBF,eAAe,KAAK,CAAC"}
package/dist/esm/Chart.js CHANGED
@@ -8,7 +8,7 @@ import { ClientContext, DashboardContext, DashboardFiltersContext, } from './Con
8
8
  import QuillTable from './components/QuillTable';
9
9
  import { getData } from './utils/dataFetcher';
10
10
  import { generatePivotTable, generatePivotTableYAxis, } from './internals/ReportBuilder/PivotModal';
11
- import { valueFormatter } from './utils/valueFormatter';
11
+ import { DATE_FORMAT_TYPES, valueFormatter } from './utils/valueFormatter';
12
12
  import LineChart from './components/Chart/LineChart';
13
13
  import BarChart from './components/Chart/BarChart';
14
14
  import { mergeComparisonRange } from './utils/merge';
@@ -18,6 +18,7 @@ import { COMPARISON_OPTIONS } from './DateRangePicker/dateRangePickerUtils';
18
18
  import { quillFormat } from './utils/valueFormatter';
19
19
  import { downloadCSV } from './utils/csv';
20
20
  import useTheme from './hooks/useTheme';
21
+ const MAX_ROWS_FOR_GENERIC_TABLE = 300;
21
22
  // @ts-ignore
22
23
  function sumByKey(arr, key) {
23
24
  // @ts-ignore
@@ -102,7 +103,8 @@ const Chart = (props) => {
102
103
  // Cast the props to the internal version so we can use the inherited types.
103
104
  let data = props;
104
105
  if ('config' in data) {
105
- return (_jsx(ChartDisplay, { ...data, error: data.config.rows ? undefined : 'No rows found', loading: Boolean(!data.config), isComparison: Boolean(data?.config?.compareRows?.length) }));
106
+ const isLoading = Boolean(!data.config);
107
+ return (_jsx(ChartDisplay, { ...data, error: isLoading || data.config?.rows ? undefined : 'No rows found', loading: isLoading, isComparison: Boolean(data?.config?.compareRows?.length) }));
106
108
  }
107
109
  const theme = useTheme();
108
110
  const chartColors = useMemo(() => {
@@ -112,9 +114,9 @@ const Chart = (props) => {
112
114
  ? theme.chartColors
113
115
  : ['#4E80EE', '#E14F62', '#55B5A6', '#E9A23B', '#6466E9', '#55B685'];
114
116
  }, [data.colors]);
115
- return (_jsx(ChartUpdater, { chartId: data.chartId, className: data.className, containerStyle: data.containerStyle, colors: chartColors, isAnimationActive: data.isAnimationActive, hideXAxis: data.hideXAxis, hideYAxis: data.hideYAxis, hideCartesianGrid: data.hideCartesianGrid, hideDateRangeFilter: data.hideDateRangeFilter, comparisonLineStyle: data.comparisonLineStyle, mapColorsToFields: data.mapColorsToFields ?? fallbackMapColorsToFields }));
117
+ return (_jsx(ChartUpdater, { chartId: data.chartId, className: data.className, containerStyle: data.containerStyle, colors: chartColors, isAnimationActive: data.isAnimationActive, hideXAxis: data.hideXAxis, hideYAxis: data.hideYAxis, hideCartesianGrid: data.hideCartesianGrid, hideHorizontalCartesianGrid: data.hideHorizontalCartesianGrid, hideVerticalCartesianGrid: data.hideVerticalCartesianGrid, hideSubsequentXAxisTicks: data.hideSubsequentXAxisTicks, hideDateRangeFilter: data.hideDateRangeFilter, cartesianGridLineStyle: data.cartesianGridLineStyle, comparisonLineStyle: data.comparisonLineStyle, mapColorsToFields: data.mapColorsToFields ?? fallbackMapColorsToFields }));
116
118
  };
117
- const ChartUpdater = ({ colors, chartId, className, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, hideDateRangeFilter, mapColorsToFields, }) => {
119
+ const ChartUpdater = ({ colors, chartId, className, containerStyle, isAnimationActive, hideXAxis, hideYAxis, hideCartesianGrid, hideHorizontalCartesianGrid = false, hideVerticalCartesianGrid = true, hideSubsequentXAxisTicks = false, cartesianGridLineStyle = 'solid', comparisonLineStyle, hideDateRangeFilter = false, mapColorsToFields, }) => {
118
120
  const { dispatch, dashboard } = useContext(DashboardContext);
119
121
  const { dashboardFilters } = useContext(DashboardFiltersContext);
120
122
  const [initialLoad, setInitialLoad] = useState(true);
@@ -191,9 +193,9 @@ const ChartUpdater = ({ colors, chartId, className, containerStyle, isAnimationA
191
193
  setInitialLoad(false);
192
194
  getChartOptions();
193
195
  }, [dashboardFilters, client, chartId]);
194
- return (_jsx(ChartDisplay, { config: dashboard[chartId], colors: colors, className: className, containerStyle: containerStyle, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, isAnimationActive: isAnimationActive, isComparison: isComparison, loading: loading || initialLoad, error: error, colorMap: colorMap }));
196
+ return (_jsx(ChartDisplay, { config: dashboard[chartId], colors: colors, className: className, containerStyle: containerStyle, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, hideHorizontalCartesianGrid: hideHorizontalCartesianGrid, hideVerticalCartesianGrid: hideVerticalCartesianGrid, hideSubsequentXAxisTicks: hideSubsequentXAxisTicks, cartesianGridLineStyle: cartesianGridLineStyle, hideDateRangeFilter: hideDateRangeFilter, comparisonLineStyle: comparisonLineStyle, isAnimationActive: isAnimationActive, isComparison: isComparison, loading: loading || initialLoad, error: error, colorMap: colorMap }));
195
197
  };
196
- const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hideYAxis, hideCartesianGrid, comparisonLineStyle, isAnimationActive, loading = false, error = undefined, isComparison = false, colorMap, }) => {
198
+ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hideYAxis, hideCartesianGrid, hideDateRangeFilter = false, hideHorizontalCartesianGrid = false, hideVerticalCartesianGrid = true, hideSubsequentXAxisTicks = false, cartesianGridLineStyle = 'solid', comparisonLineStyle, isAnimationActive, loading = false, error = undefined, isComparison = false, colorMap, }) => {
197
199
  const { dashboardFilters } = useContext(DashboardFiltersContext);
198
200
  const theme = useTheme();
199
201
  const chartColors = useMemo(() => {
@@ -203,7 +205,8 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
203
205
  ? theme.chartColors
204
206
  : ['#4E80EE', '#E14F62', '#55B5A6', '#E9A23B', '#6466E9', '#55B685'];
205
207
  }, [colors]);
206
- const dateFilter = Object.values(dashboardFilters).find((filter) => filter.filterType == 'date_range');
208
+ const dateFilter = !hideDateRangeFilter &&
209
+ Object.values(dashboardFilters).find((filter) => filter.filterType == 'date_range');
207
210
  const isPivot = config?.pivot;
208
211
  const pivotTable = useMemo(() => {
209
212
  const pivot = config?.pivot;
@@ -234,10 +237,15 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
234
237
  if (error) {
235
238
  return _jsx(ChartError, { className: className, containerStyle: containerStyle });
236
239
  }
240
+ else if (!pivotTable &&
241
+ config &&
242
+ config.rows &&
243
+ config.rows.length > MAX_ROWS_FOR_GENERIC_TABLE) {
244
+ return (_jsx(ChartError, { className: className, containerStyle: containerStyle, label: "Charts can only display 100 rows. Please add a pivot or modify the query." }));
245
+ }
237
246
  else if (!config || loading) {
238
- return _jsx(ChartSkeleton, { className: className, containerStyle: containerStyle });
247
+ return (_jsx(ChartSkeleton, { className: className, containerStyle: containerStyle }));
239
248
  }
240
- // TODO: Figure out if we can use ?? to coalesce these into the variable.
241
249
  const chartTypes = [config?.chartType];
242
250
  if (chartTypes.includes('pie')) {
243
251
  const rows = pivotTable ? pivotTable.rows : config.rows;
@@ -299,13 +307,18 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
299
307
  const yAxisFields = pivotTableYAxis
300
308
  ? pivotTableYAxis
301
309
  : config.yAxisFields;
302
- if (isComparison && yAxisFields.length == 1) {
303
- const sampleField = yAxisFields[0];
304
- yAxisFields[yAxisFields.length] = {
305
- ...sampleField,
306
- field: `comparison_${sampleField?.field}`,
307
- label: `comparison ${sampleField?.label}`,
308
- };
310
+ if (yAxisFields.length === 1) {
311
+ if (yAxisFields[0].label === '' && config.yAxisFields.length === 1) {
312
+ yAxisFields[0].label = config.yAxisFields[0].label;
313
+ }
314
+ if (isComparison) {
315
+ const sampleField = yAxisFields[0];
316
+ yAxisFields[yAxisFields.length] = {
317
+ ...sampleField,
318
+ field: `comparison_${sampleField?.field}`,
319
+ label: `comparison ${sampleField?.label}`,
320
+ };
321
+ }
309
322
  }
310
323
  const data = (pivotTable ? pivotTable.rows : config.rows)
311
324
  // filter out any rows with a comparison key but no corresponding primary
@@ -366,7 +379,7 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
366
379
  gap: 4,
367
380
  alignItems: 'baseline',
368
381
  marginRight: 'auto',
369
- }, children: [_jsx("span", { children: data.rows?.length > 0 &&
382
+ }, children: [_jsx("span", { children: rows?.length > 0 &&
370
383
  valueFormatter({
371
384
  value: rows[0][data.xAxisField] ?? 0,
372
385
  field: data.xAxisField,
@@ -422,7 +435,10 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
422
435
  // Autofill the line chart with two zero values, so they form a line at 0.0
423
436
  // when there are no rows on the config.
424
437
  let lineChartData = data;
425
- if (dateFilter && (!data || data.length === 0)) {
438
+ const xAxisFieldFormat = config.columns.find((col) => col.field === config.xAxisField)?.format;
439
+ if (dateFilter &&
440
+ DATE_FORMAT_TYPES.includes(xAxisFieldFormat) &&
441
+ (!data || data.length === 0)) {
426
442
  const xAxis = config.xAxisField;
427
443
  const yAxis = yAxisFields[0]?.field;
428
444
  const format = config.columns.find((c) => c.field === xAxis).format;
@@ -433,6 +449,6 @@ const ChartDisplay = ({ config, colors, className, containerStyle, hideXAxis, hi
433
449
  { [xAxis]: endDate, [yAxis]: '0' },
434
450
  ];
435
451
  }
436
- return (_jsx(LineChart, { colors: chartColors, colorMap: colorMap, yAxisFields: yAxisFields, data: lineChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: config.xAxisFormat, containerStyle: containerStyle, className: className, theme: theme, comparison: dateFilter?.comparison, isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle ?? 'solid' }));
452
+ return (_jsx(LineChart, { colors: chartColors, colorMap: colorMap, yAxisFields: yAxisFields, data: lineChartData, xAxisField: config.xAxisField, xAxisLabel: config.xAxisLabel, xAxisFormat: config.xAxisFormat, containerStyle: containerStyle, className: className, theme: theme, comparison: dateFilter?.comparison, isAnimationActive: isAnimationActive, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, hideHorizontalCartesianGrid: hideHorizontalCartesianGrid, hideVerticalCartesianGrid: hideVerticalCartesianGrid, hideSubsequentXAxisTicks: hideSubsequentXAxisTicks, cartesianGridLineStyle: cartesianGridLineStyle ?? 'solid', comparisonLineStyle: comparisonLineStyle ?? 'solid' }));
437
453
  };
438
454
  export default Chart;