@quillsql/react 2.11.25 → 2.11.26

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 (115) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +15 -12
  3. package/dist/cjs/ChartBuilder.d.ts +7 -20
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +25 -25
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +3 -3
  8. package/dist/cjs/Dashboard.d.ts +2 -1
  9. package/dist/cjs/Dashboard.d.ts.map +1 -1
  10. package/dist/cjs/ReportBuilder.d.ts +6 -4
  11. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  12. package/dist/cjs/ReportBuilder.js +208 -126
  13. package/dist/cjs/SQLEditor.d.ts +4 -11
  14. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  15. package/dist/cjs/SQLEditor.js +31 -97
  16. package/dist/cjs/components/Dashboard/DashboardFilter.js +1 -1
  17. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  18. package/dist/cjs/components/Dashboard/MetricComponent.js +9 -12
  19. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  20. package/dist/cjs/components/Dashboard/TableComponent.js +12 -10
  21. package/dist/cjs/components/QuillTable.d.ts +4 -1
  22. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  23. package/dist/cjs/components/QuillTable.js +1 -1
  24. package/dist/cjs/components/ReportBuilder/convert.d.ts +2 -2
  25. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +27 -24
  26. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  27. package/dist/cjs/internals/ReportBuilder/PivotList.js +9 -7
  28. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +9 -2
  29. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  30. package/dist/cjs/internals/ReportBuilder/PivotModal.js +46 -41
  31. package/dist/cjs/models/Columns.d.ts +11 -0
  32. package/dist/cjs/models/Columns.d.ts.map +1 -0
  33. package/dist/cjs/models/Columns.js +2 -0
  34. package/dist/cjs/models/Tables.d.ts +0 -8
  35. package/dist/cjs/models/Tables.d.ts.map +1 -1
  36. package/dist/cjs/utils/astProcessing.d.ts +3 -0
  37. package/dist/cjs/utils/astProcessing.d.ts.map +1 -0
  38. package/dist/cjs/utils/astProcessing.js +20 -0
  39. package/dist/cjs/utils/columnProcessing.d.ts +9 -0
  40. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -0
  41. package/dist/cjs/utils/columnProcessing.js +207 -0
  42. package/dist/cjs/utils/dashboard.js +9 -9
  43. package/dist/cjs/utils/pivotProcessing.d.ts +2 -1
  44. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  45. package/dist/cjs/utils/pivotProcessing.js +3 -8
  46. package/dist/cjs/utils/tableProcessing.d.ts +2 -2
  47. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  48. package/dist/cjs/utils/tableProcessing.js +1 -3
  49. package/dist/cjs/utils/valueFormatter.d.ts +2 -1
  50. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  51. package/dist/cjs/utils/valueFormatter.js +12 -1
  52. package/dist/esm/Chart.d.ts.map +1 -1
  53. package/dist/esm/Chart.js +15 -12
  54. package/dist/esm/ChartBuilder.d.ts +7 -20
  55. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  56. package/dist/esm/ChartBuilder.js +25 -25
  57. package/dist/esm/ChartEditor.d.ts.map +1 -1
  58. package/dist/esm/ChartEditor.js +3 -3
  59. package/dist/esm/Dashboard.d.ts +2 -1
  60. package/dist/esm/Dashboard.d.ts.map +1 -1
  61. package/dist/esm/ReportBuilder.d.ts +6 -4
  62. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  63. package/dist/esm/ReportBuilder.js +204 -122
  64. package/dist/esm/SQLEditor.d.ts +4 -11
  65. package/dist/esm/SQLEditor.d.ts.map +1 -1
  66. package/dist/esm/SQLEditor.js +30 -95
  67. package/dist/esm/components/Dashboard/DashboardFilter.js +1 -1
  68. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  69. package/dist/esm/components/Dashboard/MetricComponent.js +9 -12
  70. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  71. package/dist/esm/components/Dashboard/TableComponent.js +12 -10
  72. package/dist/esm/components/QuillTable.d.ts +4 -1
  73. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  74. package/dist/esm/components/QuillTable.js +1 -1
  75. package/dist/esm/components/ReportBuilder/convert.d.ts +2 -2
  76. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +27 -24
  77. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  78. package/dist/esm/internals/ReportBuilder/PivotList.js +9 -7
  79. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +9 -2
  80. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  81. package/dist/esm/internals/ReportBuilder/PivotModal.js +48 -43
  82. package/dist/esm/models/Columns.d.ts +11 -0
  83. package/dist/esm/models/Columns.d.ts.map +1 -0
  84. package/dist/esm/models/Columns.js +1 -0
  85. package/dist/esm/models/Tables.d.ts +0 -8
  86. package/dist/esm/models/Tables.d.ts.map +1 -1
  87. package/dist/esm/utils/astProcessing.d.ts +3 -0
  88. package/dist/esm/utils/astProcessing.d.ts.map +1 -0
  89. package/dist/esm/utils/astProcessing.js +16 -0
  90. package/dist/esm/utils/columnProcessing.d.ts +9 -0
  91. package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
  92. package/dist/esm/utils/columnProcessing.js +201 -0
  93. package/dist/esm/utils/dashboard.js +9 -9
  94. package/dist/esm/utils/pivotProcessing.d.ts +2 -1
  95. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  96. package/dist/esm/utils/pivotProcessing.js +3 -8
  97. package/dist/esm/utils/tableProcessing.d.ts +2 -2
  98. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  99. package/dist/esm/utils/tableProcessing.js +1 -3
  100. package/dist/esm/utils/valueFormatter.d.ts +2 -1
  101. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  102. package/dist/esm/utils/valueFormatter.js +11 -0
  103. package/package.json +1 -1
  104. package/dist/cjs/utils/types.d.ts +0 -4
  105. package/dist/cjs/utils/types.d.ts.map +0 -1
  106. package/dist/cjs/utils/types.js +0 -52
  107. package/dist/cjs/utils/valueFormatterCSV.d.ts +0 -17
  108. package/dist/cjs/utils/valueFormatterCSV.d.ts.map +0 -1
  109. package/dist/cjs/utils/valueFormatterCSV.js +0 -99
  110. package/dist/esm/utils/types.d.ts +0 -4
  111. package/dist/esm/utils/types.d.ts.map +0 -1
  112. package/dist/esm/utils/types.js +0 -48
  113. package/dist/esm/utils/valueFormatterCSV.d.ts +0 -17
  114. package/dist/esm/utils/valueFormatterCSV.d.ts.map +0 -1
  115. package/dist/esm/utils/valueFormatterCSV.js +0 -95
@@ -3,12 +3,12 @@ import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from '
3
3
  import { ClientContext } from '../../Context';
4
4
  import { getDataFromCloud } from '../../utils/dataFetcher';
5
5
  import { PivotList, PivotCard } from './PivotList';
6
- import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, add, } from 'date-fns';
6
+ import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, } from 'date-fns';
7
7
  import { valueFormatter } from '../../utils/valueFormatter';
8
8
  import { numberFormatOptions, dateFormatOptions } from '../../ChartBuilder';
9
9
  import { snakeCaseToTitleCase } from '../../utils/textProcessing';
10
10
  import { QuillErrorMessageComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
11
- import { isNumericColumnType, isTextColumnType, } from '../../components/ReportBuilder/ast';
11
+ import { isNumericColumnType, } from '../../components/ReportBuilder/ast';
12
12
  import { QuillCard } from '../../components/QuillCard';
13
13
  import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
14
14
  import { hashCode } from '../../utils/crypto';
@@ -43,7 +43,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
43
43
  const getDistinctValues = async () => {
44
44
  if (columns) {
45
45
  const stringColumns = columns.filter((column) => {
46
- return isTextColumnType(column.fieldType || column.format);
46
+ return column.format === 'string';
47
47
  });
48
48
  if (stringColumns.length === 0) {
49
49
  const possibleColumns = getPossiblePivotFieldOptions(columns, {});
@@ -153,15 +153,6 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
153
153
  pivotValueField,
154
154
  pivotAggregation,
155
155
  ]);
156
- useEffect(() => {
157
- setSelectedPivotIndex(-1);
158
- setSelectedPivotType('');
159
- setPivotRowField(undefined);
160
- setPivotColumnField(undefined);
161
- setPivotValueField(undefined);
162
- setPivotAggregation(undefined);
163
- setErrors([]);
164
- }, [selectedTable]);
165
156
  useEffect(() => {
166
157
  if (!initialUniqueValues) {
167
158
  return;
@@ -442,7 +433,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
442
433
  }), width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
443
434
  if (e.target.value !== 'count' &&
444
435
  pivotValueField &&
445
- !numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField)?.format)) {
436
+ !numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField).format)) {
446
437
  setPivotValueField(null);
447
438
  }
448
439
  pivotFieldChange('aggregationType', e.target.value);
@@ -563,7 +554,7 @@ function castValueToDate(value) {
563
554
  }
564
555
  return new Date(value);
565
556
  }
566
- function getRecentDate(a, b) {
557
+ function getLatestDate(a, b) {
567
558
  return a > b ? a : b;
568
559
  }
569
560
  function getEarliestDate(a, b) {
@@ -574,7 +565,7 @@ function getDateRange(dateRange, column, data) {
574
565
  const ONE_CENTURY_IN_MILLISECONDS = 100 * 365 * 24 * 60 * 60 * 1000;
575
566
  const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
576
567
  const minDate = new Date(0);
577
- if (!dateRange || !dateRange[0]) {
568
+ if (!dateRange) {
578
569
  if (data.length == 0 || !data[0][column]) {
579
570
  return { start: new Date(), end: new Date() };
580
571
  }
@@ -585,22 +576,30 @@ function getDateRange(dateRange, column, data) {
585
576
  end: firstDate || new Date(),
586
577
  };
587
578
  }
588
- let earliestDate = firstDate;
589
- let lastestDate = firstDate;
579
+ let earliestDate = undefined;
580
+ let latestDate = undefined;
581
+ for (let i = 0; i < data.length; i++) {
582
+ if (earliestDate && latestDate) {
583
+ break;
584
+ }
585
+ const value = castValueToDate(data[i][column]);
586
+ earliestDate = value && value > minDate ? value : null;
587
+ latestDate = value && value < maxDate ? value : null;
588
+ }
589
+ if (!earliestDate || !latestDate) {
590
+ return {
591
+ start: earliestDate || new Date(),
592
+ end: latestDate || new Date(),
593
+ };
594
+ }
590
595
  for (let i = 0; i < data.length; i++) {
591
596
  if (data[i][column]) {
592
597
  const value = castValueToDate(data[i][column]);
593
- if (lastestDate && lastestDate > minDate) {
594
- lastestDate = value;
595
- }
596
598
  if (value && value < maxDate) {
597
- lastestDate =
598
- lastestDate === null ? value : getRecentDate(lastestDate, value);
599
+ latestDate =
600
+ latestDate === null ? value : getLatestDate(latestDate, value);
599
601
  }
600
602
  if (value && value > minDate) {
601
- if (earliestDate && earliestDate < minDate) {
602
- earliestDate = value;
603
- }
604
603
  earliestDate =
605
604
  earliestDate === null
606
605
  ? value
@@ -609,40 +608,40 @@ function getDateRange(dateRange, column, data) {
609
608
  }
610
609
  }
611
610
  return {
612
- start: earliestDate,
613
- end: lastestDate,
611
+ start: earliestDate || new Date(),
612
+ end: latestDate || new Date(),
614
613
  };
615
614
  }
616
615
  else {
617
- return { start: dateRange[0], end: dateRange[1] };
616
+ return dateRange;
618
617
  }
619
618
  }
620
619
  function getDateBuckets(dateRange, column, data) {
621
- if (!dateRange || !dateRange[0]) {
620
+ if (!dateRange) {
622
621
  return eachMonthOfInterval(getDateRange(dateRange, column, data));
623
622
  }
624
- const dayDifference = differenceInDays(new Date(dateRange[1]), new Date(dateRange[0]));
623
+ const dayDifference = differenceInDays(dateRange.end, dateRange.start);
625
624
  return dayDifferenceToInterval(dayDifference, dateRange);
626
625
  }
627
626
  function getCompDateBuckets(dateRange, compDateRange, column, data) {
628
- if (!dateRange || !dateRange[0]) {
629
- return eachMonthOfInterval(getDateRange(dateRange, column, data));
627
+ if (!dateRange) {
628
+ return eachMonthOfInterval(getDateRange(undefined, column, data));
630
629
  }
631
- const dayDifference = differenceInDays(new Date(dateRange[1]), new Date(dateRange[0]));
630
+ const dayDifference = differenceInDays(dateRange.end, dateRange.start);
632
631
  return dayDifferenceToInterval(dayDifference, compDateRange);
633
632
  }
634
633
  function dayDifferenceToInterval(dayDifference, dateRange) {
635
634
  if (dayDifference < 14) {
636
- return eachDayOfInterval({ start: dateRange[0], end: dateRange[1] });
635
+ return eachDayOfInterval(dateRange);
637
636
  }
638
637
  else if (dayDifference < 60) {
639
- return eachWeekOfInterval({ start: dateRange[0], end: dateRange[1] }, { weekStartsOn: 1 });
638
+ return eachWeekOfInterval(dateRange, { weekStartsOn: 1 });
640
639
  }
641
640
  else if (dayDifference < 365 * 3) {
642
- return eachMonthOfInterval({ start: dateRange[0], end: dateRange[1] });
641
+ return eachMonthOfInterval(dateRange);
643
642
  }
644
643
  else {
645
- return eachYearOfInterval({ start: dateRange[0], end: dateRange[1] });
644
+ return eachYearOfInterval(dateRange);
646
645
  }
647
646
  }
648
647
  function getDateString(value, dateRange) {
@@ -707,23 +706,22 @@ const fixBigQueryData = (data = []) => {
707
706
  }
708
707
  return newData;
709
708
  };
710
- export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = null) {
709
+ export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined) {
711
710
  // If there is no rowField, aggregate on the valueField
712
711
  if (!pivot.rowField) {
713
712
  return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
714
713
  }
715
714
  // Handle edge-case for BigQuery objects.
716
715
  data = fixBigQueryData(data);
717
- if (dateRange[0] === null && dateRange[1] === null) {
718
- dateRange = [new Date(0), add(new Date(), { years: 5 })];
716
+ if (!dateRange) {
719
717
  if (isDateField(pivot.rowFieldType)) {
720
718
  dateRange = getDateRange(dateRange, pivot.rowField, data);
721
719
  }
722
720
  }
723
721
  if (!compRange ||
724
- isNullUndefinedOrInvalidDate(compRange[0]) ||
725
- isNullUndefinedOrInvalidDate(compRange[1])) {
726
- compRange = null;
722
+ isNullUndefinedOrInvalidDate(compRange.start) ||
723
+ isNullUndefinedOrInvalidDate(compRange.end)) {
724
+ compRange = undefined;
727
725
  }
728
726
  const pivotRows = [];
729
727
  const uniqueRows = (isDateField(pivot.rowFieldType)
@@ -980,6 +978,13 @@ export function generatePivotTable(pivot, data, dateRange, isComparison, rowLimi
980
978
  }
981
979
  }
982
980
  });
981
+ if (pivot.aggregationType === 'max' || pivot.aggregationType === 'min') {
982
+ for (const [key, value] of Object.entries(row)) {
983
+ if (value === '-Infinity' || value === 'Infinity') {
984
+ row[key] = null;
985
+ }
986
+ }
987
+ }
983
988
  pivotRows.push(row);
984
989
  });
985
990
  const columns = [
@@ -0,0 +1,11 @@
1
+ export interface Column {
2
+ field: string;
3
+ label: string;
4
+ format: string;
5
+ }
6
+ export interface ColumnInternal extends Column {
7
+ fieldType: string;
8
+ dataTypeID: number;
9
+ jsType: string;
10
+ }
11
+ //# sourceMappingURL=Columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Columns.d.ts","sourceRoot":"","sources":["../../../src/models/Columns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,3 @@
1
- export interface Column {
2
- label: string;
3
- field: string;
4
- name: string;
5
- displayName: string;
6
- fieldType: string;
7
- format: string;
8
- }
9
1
  export interface Table {
10
2
  }
11
3
  export interface YAxisField {
@@ -1 +1 @@
1
- {"version":3,"file":"Tables.d.ts","sourceRoot":"","sources":["../../../src/models/Tables.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;CAAG;AAEzB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"Tables.d.ts","sourceRoot":"","sources":["../../../src/models/Tables.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;CAAG;AAEzB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ import { Column } from '../models/Columns';
2
+ export declare function processStarColumn(ast: any, columns: Column[]): any;
3
+ //# sourceMappingURL=astProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/astProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAe5D"}
@@ -0,0 +1,16 @@
1
+ export function processStarColumn(ast, columns) {
2
+ if (ast.columns === '*') {
3
+ ast.columns = columns.map((column) => {
4
+ return {
5
+ type: 'expr',
6
+ expr: {
7
+ type: 'column_ref',
8
+ table: null,
9
+ column: column.field,
10
+ },
11
+ as: null,
12
+ };
13
+ });
14
+ }
15
+ return ast;
16
+ }
@@ -0,0 +1,9 @@
1
+ import { ColumnInfo } from '../components/ReportBuilder/schema';
2
+ import { Column, ColumnInternal } from '../models/Columns';
3
+ export declare function convertPostgresColumn(field: {
4
+ name: string;
5
+ dataTypeID: number;
6
+ }): ColumnInternal;
7
+ export declare function convertColumnInfoToColumnInternal(columnInfo: ColumnInfo): ColumnInternal;
8
+ export declare function convertFormatToJsType(column: Column): string;
9
+ //# sourceMappingURL=columnProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,cAAc,CAyGjB;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,GACrB,cAAc,CAShB;AAiFD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY5D"}
@@ -0,0 +1,201 @@
1
+ export function convertPostgresColumn(field) {
2
+ let format;
3
+ let fieldType;
4
+ let jsType;
5
+ switch (field.dataTypeID) {
6
+ case 16: // bool
7
+ format = 'string';
8
+ break;
9
+ case 20: // int8
10
+ case 21: // int2
11
+ case 23: // int4
12
+ format = 'whole_number';
13
+ break;
14
+ case 700: // float4
15
+ case 701: // float8
16
+ case 1700: // numeric
17
+ format = 'two_decimal_places';
18
+ break;
19
+ case 1082: // date
20
+ case 1083: // time
21
+ case 1184: // timestamptz
22
+ case 1114: // timestamp
23
+ format = 'MMM_dd_yyyy';
24
+ break;
25
+ case 1186: // interval
26
+ case 1043: // varchar
27
+ default:
28
+ format = 'string';
29
+ }
30
+ switch (field.dataTypeID) {
31
+ case 16: // boolean
32
+ fieldType = 'bool';
33
+ break;
34
+ case 20: // int8
35
+ fieldType = 'int8';
36
+ break;
37
+ case 21: // int2
38
+ fieldType = 'int2';
39
+ break;
40
+ case 23: // int4
41
+ fieldType = 'int4';
42
+ break;
43
+ case 700: // float4
44
+ fieldType = 'float4';
45
+ break;
46
+ case 701: // float8
47
+ fieldType = 'float8';
48
+ break;
49
+ case 1700: // numeric
50
+ fieldType = 'numeric';
51
+ break;
52
+ case 1082: // date
53
+ fieldType = 'date';
54
+ break;
55
+ case 1083: // time
56
+ fieldType = 'time';
57
+ break;
58
+ case 1184: // timestamptz
59
+ fieldType = 'timestamptz';
60
+ break;
61
+ case 1186: // interval
62
+ fieldType = 'interval';
63
+ break;
64
+ case 1114: // timestamp
65
+ fieldType = 'timestamp';
66
+ break;
67
+ case 1043: // varchar
68
+ default:
69
+ fieldType = 'varchar';
70
+ }
71
+ switch (field.dataTypeID) {
72
+ case 16: // boolean
73
+ jsType = 'bool';
74
+ break;
75
+ case 20: // int8
76
+ case 21: // int2
77
+ case 23: // int4
78
+ case 700: // float4
79
+ case 701: // float8
80
+ case 1700: // numeric
81
+ jsType = 'number';
82
+ break;
83
+ case 1082: // date
84
+ case 1083: // time
85
+ case 1184: // timestamptz
86
+ case 1186: // interval
87
+ case 1114: // timestamp
88
+ jsType = 'date';
89
+ break;
90
+ case 1043: // varchar
91
+ default:
92
+ jsType = 'string';
93
+ }
94
+ return {
95
+ label: field.name,
96
+ field: field.name,
97
+ format,
98
+ fieldType,
99
+ dataTypeID: field.dataTypeID,
100
+ jsType: jsType,
101
+ };
102
+ }
103
+ export function convertColumnInfoToColumnInternal(columnInfo) {
104
+ return {
105
+ label: columnInfo.name,
106
+ field: columnInfo.name,
107
+ format: fieldTypeToFormat(columnInfo.fieldType),
108
+ fieldType: columnInfo.fieldType,
109
+ dataTypeID: fieldTypeToDataTypeID(columnInfo.fieldType),
110
+ jsType: convertFieldTypeToJSType(columnInfo.fieldType),
111
+ };
112
+ }
113
+ function fieldTypeToFormat(fieldType) {
114
+ switch (fieldType) {
115
+ case 'bool':
116
+ return 'string';
117
+ case 'int8':
118
+ case 'int2':
119
+ case 'int4':
120
+ return 'whole_number';
121
+ case 'float4':
122
+ case 'float8':
123
+ case 'numeric':
124
+ return 'two_decimal_places';
125
+ case 'date':
126
+ case 'time':
127
+ case 'timestamptz':
128
+ case 'timestamp':
129
+ return 'MMM_dd_yyyy';
130
+ case 'interval':
131
+ case 'varchar':
132
+ default:
133
+ return 'string';
134
+ }
135
+ }
136
+ function fieldTypeToDataTypeID(fieldType) {
137
+ switch (fieldType) {
138
+ case 'bool':
139
+ return 16;
140
+ case 'int8':
141
+ return 20;
142
+ case 'int2':
143
+ return 21;
144
+ case 'int4':
145
+ return 23;
146
+ case 'float4':
147
+ return 700;
148
+ case 'float8':
149
+ return 701;
150
+ case 'numeric':
151
+ return 1700;
152
+ case 'date':
153
+ return 1082;
154
+ case 'time':
155
+ return 1083;
156
+ case 'timestamptz':
157
+ return 1184;
158
+ case 'timestamp':
159
+ return 1114;
160
+ case 'interval':
161
+ return 1186;
162
+ case 'varchar':
163
+ default:
164
+ return 1043;
165
+ }
166
+ }
167
+ function convertFieldTypeToJSType(fieldType) {
168
+ switch (fieldType) {
169
+ case 'bool':
170
+ return 'bool';
171
+ case 'int8':
172
+ case 'int2':
173
+ case 'int4':
174
+ case 'float4':
175
+ case 'float8':
176
+ case 'numeric':
177
+ return 'number';
178
+ case 'date':
179
+ case 'time':
180
+ case 'timestamptz':
181
+ case 'timestamp':
182
+ return 'date';
183
+ case 'interval':
184
+ case 'varchar':
185
+ default:
186
+ return 'string';
187
+ }
188
+ }
189
+ export function convertFormatToJsType(column) {
190
+ switch (column.format) {
191
+ case 'string':
192
+ return 'string';
193
+ case 'whole_number':
194
+ case 'two_decimal_places':
195
+ return 'number';
196
+ case 'MMM_dd_yyyy':
197
+ return 'date';
198
+ default:
199
+ return 'string';
200
+ }
201
+ }
@@ -117,15 +117,15 @@ function getPivotTable(itemInfo, dashboardFilters, config = undefined) {
117
117
  const data = itemInfo ? itemInfo : config;
118
118
  return pivot && data?.rows
119
119
  ? generatePivotTable(pivot, JSON.parse(JSON.stringify(data.rows)), // deep copy
120
- dateFilter?.startDate
121
- ? [dateFilter?.startDate, dateFilter?.endDate, null]
122
- : [null, null, null], Boolean(dateFilter?.comparisonRange?.startDate), -1, dateFilter?.comparisonRange?.startDate
123
- ? [
124
- dateFilter?.comparisonRange.startDate,
125
- dateFilter?.comparisonRange.endDate,
126
- null,
127
- ]
128
- : [null, null, null])
120
+ dateFilter?.startDate && dateFilter?.endDate
121
+ ? { start: dateFilter.startDate, end: dateFilter.endDate }
122
+ : undefined, Boolean(dateFilter?.comparisonRange?.startDate), -1, dateFilter?.comparisonRange?.startDate &&
123
+ dateFilter?.comparisonRange?.endDate
124
+ ? {
125
+ start: dateFilter.comparisonRange.startDate,
126
+ end: dateFilter.comparisonRange.endDate,
127
+ }
128
+ : undefined)
129
129
  : null;
130
130
  }
131
131
  /**
@@ -1,11 +1,12 @@
1
1
  import { Pivot } from '../internals/ReportBuilder/PivotModal';
2
+ import { Column } from '../models/Columns';
2
3
  export declare function pivotToSql(pivot: Pivot, query: string, client: any): {
3
4
  query: string;
4
5
  preQueries?: string[];
5
6
  runQueryConfig?: any;
6
7
  } | undefined;
7
8
  export declare function isValidPivot(pivot: Pivot): boolean;
8
- export declare function getPossiblePivotFieldOptions(columns: any, uniqueValues: {
9
+ export declare function getPossiblePivotFieldOptions(columns: Column[], uniqueValues: {
9
10
  [field: string]: any;
10
11
  }): {
11
12
  rowFields: string[];
@@ -1 +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"}
1
+ {"version":3,"file":"pivotProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/pivotProcessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAkB,MAAM,mBAAmB,CAAC;AAG3D,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,MAAM,EAAE,EACjB,YAAY,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE;;;;EAsCvC;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"}
@@ -1,6 +1,5 @@
1
- import { dateFormatOptions, numberFormatOptions } from '../ChartBuilder';
2
- import { isNumericColumnType } from '../components/ReportBuilder/ast';
3
1
  import { isIdColumn } from '../components/ReportBuilder/util';
2
+ import { DATE_FORMAT_TYPES, NUMBER_FORMAT_TYPES } from './valueFormatter';
4
3
  export function pivotToSql(pivot, query, client) {
5
4
  const processedAggType = pivot.aggregationType?.toLowerCase() === 'average'
6
5
  ? 'avg'
@@ -105,9 +104,7 @@ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
105
104
  let valueFields = [];
106
105
  for (let column of columns) {
107
106
  // row fields can be dates or strings
108
- if (column.format === 'date' ||
109
- column.fieldType === 'date' ||
110
- dateFormatOptions.includes(column.format)) {
107
+ if (DATE_FORMAT_TYPES.includes(column.format)) {
111
108
  rowFields.push(column.field);
112
109
  }
113
110
  // column fields can be strings
@@ -124,9 +121,7 @@ export function getPossiblePivotFieldOptions(columns, uniqueValues) {
124
121
  }
125
122
  }
126
123
  // value fields can be numbers
127
- if (column.format === 'whole_number' ||
128
- numberFormatOptions.includes(column.format) ||
129
- isNumericColumnType(column.fieldType)) {
124
+ if (NUMBER_FORMAT_TYPES.includes(column.format)) {
130
125
  if (!isIdColumn(column.field)) {
131
126
  valueFields.push(column.field);
132
127
  }
@@ -1,5 +1,5 @@
1
- import { ColumnInfo } from '../components/ReportBuilder/schema';
2
- export declare const getUniqueValuesByColumns: (columns: ColumnInfo[], query: string, rows: any, client: any) => Promise<{
1
+ import { Column } from '../models/Columns';
2
+ export declare const getUniqueValuesByColumns: (columns: Column[], query: string, rows: any, client: any) => Promise<{
3
3
  [column: string]: {
4
4
  [value: string]: boolean;
5
5
  };
@@ -1 +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"}
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,wBAAwB,YAC1B,MAAM,EAAE,SACV,MAAM,QACP,GAAG,UACD,GAAG;;;;SAwDZ,CAAC"}
@@ -1,9 +1,7 @@
1
1
  import { getData } from './dataFetcher';
2
2
  import { generateDistinctQuery } from './queryConstructor';
3
3
  export const getUniqueValuesByColumns = async (columns, query, rows, client) => {
4
- const stringNames = columns.map(
5
- // @ts-ignore
6
- (column) => column.name || column.field);
4
+ const stringNames = columns.map((column) => column.field);
7
5
  const uniqueValues = {};
8
6
  if (!client.databaseType ||
9
7
  client.databaseType.toLowerCase() === 'bigquery') {
@@ -1,5 +1,5 @@
1
1
  import { type AxisFormat } from '../Dashboard';
2
- type Field = {
2
+ export type Field = {
3
3
  _id: string;
4
4
  label: string;
5
5
  field: string;
@@ -11,6 +11,7 @@ type Props = {
11
11
  fields: Field[];
12
12
  };
13
13
  export declare const DATE_FORMAT_TYPES: string[];
14
+ export declare const NUMBER_FORMAT_TYPES: string[];
14
15
  /**
15
16
  * Pretty-prints the given values to their nice-looking string form.
16
17
  */
@@ -1 +1 @@
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
+ {"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,MAAM,MAAM,KAAK,GAAG;IAClB,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,eAAO,MAAM,mBAAmB,UAM/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6BAA8B,KAAK,KAAG,MAwChE,CAAC;AAEF,eAAO,MAAM,WAAW;WAIf,GAAG;YACF,MAAM;MACZ,MAwCH,CAAC;AAoMF,eAAO,MAAM,aAAa;;;;WAGhB,MAAM,KACb,MA6CF,CAAC"}
@@ -9,6 +9,13 @@ export const DATE_FORMAT_TYPES = [
9
9
  'MMM_dd_hh:mm_ap_pm',
10
10
  'wo, yyyy',
11
11
  ];
12
+ export const NUMBER_FORMAT_TYPES = [
13
+ 'whole_number',
14
+ 'one_decimal_place',
15
+ 'two_decimal_places',
16
+ 'dollar_amount',
17
+ 'dollar_cents',
18
+ ];
12
19
  /**
13
20
  * Pretty-prints the given values to their nice-looking string form.
14
21
  */
@@ -50,6 +57,10 @@ export const valueFormatter = ({ value, field, fields }) => {
50
57
  return formatString(value); // by default make this value a string
51
58
  };
52
59
  export const quillFormat = ({ value, format, }) => {
60
+ // Handle special case, if value is null and format is numeric display '-'
61
+ if (value === null && NUMBER_FORMAT_TYPES.includes(format)) {
62
+ return '-';
63
+ }
53
64
  const HANDLERS = {
54
65
  percent: formatPercent,
55
66
  dollar_amount: formatDollarAmount,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/react",
3
- "version": "2.11.25",
3
+ "version": "2.11.26",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/esm/index.js",
@@ -1,4 +0,0 @@
1
- import { Field } from '../hooks/useQuill';
2
- import { Column } from '../models/Tables';
3
- export declare function getPostgresBasicType(field: Field | Column): string;
4
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/types.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAgDlE"}