autoql-fe-utils 1.0.1 → 1.0.2

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.
package/dist/index.js CHANGED
@@ -31,23 +31,51 @@ var src_exports = {};
31
31
  __export(src_exports, {
32
32
  AGG_TYPES: () => AGG_TYPES,
33
33
  CHART_TYPES: () => CHART_TYPES,
34
+ COMPARE_TYPE: () => COMPARE_TYPE,
35
+ CONTINUOUS_TYPE: () => CONTINUOUS_TYPE,
36
+ CUSTOM_TYPE: () => CUSTOM_TYPE,
37
+ DATA_ALERT_CONDITION_TYPES: () => DATA_ALERT_CONDITION_TYPES,
38
+ DATA_ALERT_ENABLED_STATUSES: () => DATA_ALERT_ENABLED_STATUSES,
39
+ DATA_ALERT_FREQUENCY_TYPE_OPTIONS: () => DATA_ALERT_FREQUENCY_TYPE_OPTIONS,
40
+ DATA_ALERT_OPERATORS: () => DATA_ALERT_OPERATORS,
41
+ DATA_ALERT_STATUSES: () => DATA_ALERT_STATUSES,
34
42
  DATE_ONLY_CHART_TYPES: () => DATE_ONLY_CHART_TYPES,
35
43
  DAYJS_PRECISION_FORMATS: () => DAYJS_PRECISION_FORMATS,
36
44
  DEFAULT_AGG_TYPE: () => DEFAULT_AGG_TYPE,
37
45
  DEFAULT_DATA_PAGE_SIZE: () => DEFAULT_DATA_PAGE_SIZE,
46
+ DEFAULT_EVALUATION_FREQUENCY: () => DEFAULT_EVALUATION_FREQUENCY,
47
+ DEFAULT_SOURCE: () => DEFAULT_SOURCE,
38
48
  DOUBLE_AXIS_CHART_TYPES: () => DOUBLE_AXIS_CHART_TYPES,
39
49
  DOW_STYLES: () => DOW_STYLES,
50
+ DataExplorerTypes: () => DataExplorerTypes,
40
51
  DateUTC: () => DateUTC,
52
+ EVALUATION_FREQUENCY_OPTIONS: () => EVALUATION_FREQUENCY_OPTIONS,
53
+ EXISTS_TYPE: () => EXISTS_TYPE,
54
+ GENERAL_ERROR: () => GENERAL_ERROR,
55
+ GENERAL_HTML_ERROR: () => GENERAL_HTML_ERROR,
56
+ GENERAL_QUERY_ERROR: () => GENERAL_QUERY_ERROR,
57
+ GROUP_TERM_TYPE: () => GROUP_TERM_TYPE,
41
58
  MAX_DATA_PAGE_SIZE: () => MAX_DATA_PAGE_SIZE,
42
59
  MAX_LEGEND_LABELS: () => MAX_LEGEND_LABELS,
43
60
  MIN_HISTOGRAM_SAMPLE: () => MIN_HISTOGRAM_SAMPLE,
61
+ MONTH_DAY_SELECT_OPTIONS: () => MONTH_DAY_SELECT_OPTIONS,
44
62
  MONTH_NAMES: () => MONTH_NAMES,
63
+ NUMBER_TERM_TYPE: () => NUMBER_TERM_TYPE,
45
64
  NumberColumnTypeDisplayNames: () => NumberColumnTypeDisplayNames,
46
65
  NumberColumnTypes: () => NumberColumnTypes,
66
+ PERIODIC_TYPE: () => PERIODIC_TYPE,
67
+ PROJECT_TYPE: () => PROJECT_TYPE,
47
68
  PrecisionTypes: () => PrecisionTypes,
69
+ QUERY_TERM_TYPE: () => QUERY_TERM_TYPE,
70
+ REQUEST_CANCELLED_ERROR: () => REQUEST_CANCELLED_ERROR,
71
+ RESET_PERIOD_OPTIONS: () => RESET_PERIOD_OPTIONS,
72
+ SCHEDULED_TYPE: () => SCHEDULED_TYPE,
73
+ SCHEDULE_FREQUENCY_OPTIONS: () => SCHEDULE_FREQUENCY_OPTIONS,
74
+ SCHEDULE_INTERVAL_OPTIONS: () => SCHEDULE_INTERVAL_OPTIONS,
48
75
  SEASON_NAMES: () => SEASON_NAMES,
49
76
  TABLE_TYPES: () => TABLE_TYPES,
50
77
  TimestampFormats: () => TimestampFormats,
78
+ UNAUTHENTICATED_ERROR: () => UNAUTHENTICATED_ERROR,
51
79
  WEEKDAY_NAMES_MON: () => WEEKDAY_NAMES_MON,
52
80
  WEEKDAY_NAMES_SUN: () => WEEKDAY_NAMES_SUN,
53
81
  animateInputText: () => animateInputText,
@@ -380,7 +408,7 @@ var isNumber = (str) => {
380
408
  return /^\d+$/.test(str);
381
409
  };
382
410
 
383
- // src/Constants/constants.ts
411
+ // src/Constants/visualizationConstants.ts
384
412
  var TABLE_TYPES = [
385
413
  "pivot_table",
386
414
  "pivot_column",
@@ -492,1093 +520,1413 @@ var AGG_TYPES = [
492
520
  var MAX_LEGEND_LABELS = 22;
493
521
  var MIN_HISTOGRAM_SAMPLE = 20;
494
522
 
495
- // src/Constants/enums.ts
496
- var TimestampFormats = /* @__PURE__ */ ((TimestampFormats2) => {
497
- TimestampFormats2["epoch"] = "EPOCH";
498
- TimestampFormats2["iso8601"] = "ISO8601";
499
- return TimestampFormats2;
500
- })(TimestampFormats || {});
501
- var PrecisionTypes = /* @__PURE__ */ ((PrecisionTypes2) => {
502
- PrecisionTypes2["DAY"] = "DAY";
503
- PrecisionTypes2["MONTH"] = "MONTH";
504
- PrecisionTypes2["YEAR"] = "YEAR";
505
- PrecisionTypes2["WEEK"] = "WEEK";
506
- PrecisionTypes2["QUARTER"] = "QUARTER";
507
- PrecisionTypes2["DATE_HOUR"] = "DATE_HOUR";
508
- PrecisionTypes2["DATE_MINUTE"] = "DATE_MINUTE";
509
- PrecisionTypes2["HOUR"] = "HOUR";
510
- PrecisionTypes2["MINUTE"] = "MINUTE";
511
- return PrecisionTypes2;
512
- })(PrecisionTypes || {});
513
- var NumberColumnTypes = /* @__PURE__ */ ((NumberColumnTypes2) => {
514
- NumberColumnTypes2["CURRENCY"] = "DOLLAR_AMT";
515
- NumberColumnTypes2["QUANTITY"] = "QUANTITY";
516
- NumberColumnTypes2["RATIO"] = "RATIO";
517
- NumberColumnTypes2["PERCENT"] = "PERCENT";
518
- return NumberColumnTypes2;
519
- })(NumberColumnTypes || {});
520
- var NumberColumnTypeDisplayNames = /* @__PURE__ */ ((NumberColumnTypeDisplayNames2) => {
521
- NumberColumnTypeDisplayNames2["DOLLAR_AMT"] = "Currency";
522
- NumberColumnTypeDisplayNames2["QUANTITY"] = "Quantity";
523
- NumberColumnTypeDisplayNames2["RATIO"] = "Ratio";
524
- NumberColumnTypeDisplayNames2["PERCENT"] = "Percent";
525
- return NumberColumnTypeDisplayNames2;
526
- })(NumberColumnTypeDisplayNames || {});
527
-
528
- // src/Constants/defaults.ts
529
- var authenticationDefault = {
530
- token: void 0,
531
- apiKey: void 0,
532
- domain: void 0,
533
- dprKey: void 0,
534
- dprDomain: void 0
535
- };
536
- var dataFormattingDefault = {
537
- timestampFormat: "ISO8601" /* iso8601 */,
538
- currencyCode: "USD",
539
- languageCode: "en-US",
540
- currencyDecimals: 2,
541
- quantityDecimals: 2,
542
- ratioDecimals: 4,
543
- comparisonDisplay: "PERCENT",
544
- monthYearFormat: "MMMM YYYY",
545
- dayMonthYearFormat: "ll"
546
- };
547
- var autoQLConfigDefault = {
548
- debug: false,
549
- test: false,
550
- enableAutocomplete: true,
551
- enableQueryInterpretation: true,
552
- enableQueryValidation: true,
553
- enableQuerySuggestions: true,
554
- enableColumnVisibilityManager: true,
555
- enableDrilldowns: true,
556
- enableNotifications: false,
557
- enableCSVDownload: true,
558
- enableReportProblem: true
559
- };
560
- var dataConfigDefault = {
561
- stringColumnIndices: [],
562
- numberColumnIndices: [],
563
- stringColumnIndex: 0,
564
- legendColumnIndex: void 0,
565
- numberColumnIndex: 1
566
- };
567
- var getAuthentication = (prop = {}) => {
568
- return {
569
- ...authenticationDefault,
570
- ...prop
571
- };
572
- };
573
- var getDataFormatting = (prop = {}) => {
574
- return {
575
- ...dataFormattingDefault,
576
- ...prop
577
- };
523
+ // src/HelperFns/arrayHelpers.ts
524
+ var import_lodash = __toESM(require("lodash.isequal"));
525
+ var invertArray = (array) => {
526
+ const numRows = array.length;
527
+ const numColumns = array[0].length;
528
+ const invertedArray = [];
529
+ for (let i = 0; i < numColumns; i++) {
530
+ invertedArray[i] = [];
531
+ for (let j = 0; j < numRows; j++) {
532
+ if (array[j][i])
533
+ invertedArray[i][j] = array[j][i];
534
+ }
535
+ }
536
+ return invertedArray;
578
537
  };
579
- var getAutoQLConfig = (prop = {}) => {
580
- return {
581
- ...autoQLConfigDefault,
582
- ...prop
583
- };
538
+ var functionsEqual = (a, b) => {
539
+ return (a == null ? void 0 : a.toString()) == (b == null ? void 0 : b.toString());
584
540
  };
585
- var getDataConfig = (prop = {}) => {
586
- return {
587
- ...dataConfigDefault,
588
- ...prop
589
- };
541
+ var isObject = (obj) => {
542
+ return typeof obj === "object" && !Array.isArray(obj) && obj !== null && obj !== void 0;
590
543
  };
591
-
592
- // src/HelperFns/dataFormattingHelpers.ts
593
- var formatStringDateWithPrecision = (value, col) => {
594
- if (!value) {
595
- return void 0;
544
+ var deepEqual = (objA, objB) => {
545
+ const lodashIsEqual = (0, import_lodash.default)(objA, objB);
546
+ if (lodashIsEqual) {
547
+ return true;
596
548
  }
597
- let formattedValue = value;
598
- try {
599
- switch (col.precision) {
600
- case "DOW": {
601
- formattedValue = formatDOW(value, col);
602
- break;
603
- }
604
- case "HOUR": {
605
- const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
606
- if (dayjsTime.isValid()) {
607
- formattedValue = dayjsTime.format("h:00A");
608
- }
609
- break;
610
- }
611
- case "MINUTE": {
612
- const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
613
- if (dayjsTime.isValid()) {
614
- formattedValue = dayjsTime.format("h:mmA");
615
- }
616
- break;
617
- }
618
- case "MONTH": {
619
- formattedValue = value;
620
- break;
621
- }
622
- default: {
623
- formattedValue = value;
624
- break;
549
+ const objAIsObject = isObject(objA);
550
+ const objBIsObject = isObject(objB);
551
+ if (!objAIsObject || !objBIsObject) {
552
+ return lodashIsEqual;
553
+ }
554
+ const keysA = Object.keys(objA);
555
+ const keysB = Object.keys(objB);
556
+ if (keysA.length !== keysB.length) {
557
+ return false;
558
+ }
559
+ for (let i = 0; i < keysA.length; i++) {
560
+ if (typeof objA[keysA[i]] === "function" && typeof objB[keysA[i]] === "function") {
561
+ if (!functionsEqual(objA[keysA[i]], objB[keysA[i]])) {
562
+ return false;
625
563
  }
564
+ } else if (!Object.hasOwnProperty.call(objB, keysA[i]) || !(0, import_lodash.default)(objA[keysA[i]], objB[keysA[i]])) {
565
+ return false;
626
566
  }
627
- return formattedValue;
628
- } catch (error) {
629
- console.error(error);
630
- return value;
631
567
  }
568
+ return true;
632
569
  };
633
- var formatStringDate = (value, config = dataFormattingDefault) => {
634
- var _a;
635
- if (!value) {
636
- return void 0;
637
- }
638
- if (value && typeof value === "string") {
639
- const dateArray = value.split("-");
640
- const year = dateArray == null ? void 0 : dateArray[0];
641
- const day = dateArray == null ? void 0 : dateArray[2];
642
- let month;
643
- let week;
644
- if ((_a = dateArray == null ? void 0 : dateArray[1]) == null ? void 0 : _a.includes("W")) {
645
- week = dateArray == null ? void 0 : dateArray[1];
646
- } else {
647
- month = dateArray == null ? void 0 : dateArray[1];
648
- }
649
- const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
650
- const dayJSObj = dayjsWithPlugins_default.utc(value).utc();
651
- if (!dayJSObj.isValid()) {
652
- return value;
653
- }
654
- let date = value;
655
- if (day) {
656
- date = dayJSObj.format(dayMonthYearFormat);
657
- } else if (month) {
658
- date = dayJSObj.format(monthYearFormat);
659
- } else if (week) {
660
- } else if (year) {
661
- date = year;
570
+ var difference = (objA, objB) => {
571
+ const diff = [];
572
+ Object.keys(Object.assign({}, objA, objB)).forEach((key) => {
573
+ if (typeof objA[key] === "function" && typeof objB[key] === "function") {
574
+ if (!functionsEqual(objA[key], objB[key])) {
575
+ diff.push({
576
+ key,
577
+ objA: objA[key],
578
+ objB: objB[key]
579
+ });
580
+ }
581
+ } else if (!Object.is(objA[key], objB[key])) {
582
+ diff.push({
583
+ key,
584
+ objA: objA[key],
585
+ objB: objB[key]
586
+ });
662
587
  }
663
- return date;
664
- }
665
- return value;
588
+ });
589
+ return diff;
666
590
  };
667
- var formatDateType = (element, column, config = dataFormattingDefault) => {
668
- if (isNumber(element)) {
669
- return formatEpochDate(element, column, config);
591
+ var rotateArray = (array, n) => {
592
+ const rotated = [...array];
593
+ n = n % array.length;
594
+ if (n < 0)
595
+ n = array.length + n;
596
+ for (let i = 0; i < n; i++) {
597
+ rotated.unshift(rotated.pop());
670
598
  }
671
- return formatISODateWithPrecision(element, column, config);
599
+ return rotated;
672
600
  };
673
- var formatDateStringType = (element, column, config = dataFormattingDefault) => {
674
- if (!column) {
675
- return element;
676
- }
677
- if (column.precision) {
678
- return formatStringDateWithPrecision(element, column);
679
- }
680
- return formatStringDate(element, config);
601
+ var onlyUnique = (value, index, self) => {
602
+ return self.indexOf(value) === index;
681
603
  };
682
- var formatISODateWithPrecision = (value, col, config = dataFormattingDefault) => {
683
- if (!value) {
684
- return void 0;
685
- }
686
- if (!col) {
687
- return value;
604
+ var makeEmptyArray = (w, h, value = "") => {
605
+ var arr = [];
606
+ for (let i = 0; i < h; i++) {
607
+ arr[i] = [];
608
+ for (let j = 0; j < w; j++) {
609
+ arr[i][j] = value;
610
+ }
688
611
  }
689
- const precision = col.precision;
690
- const { dayMonthYearFormat, monthYearFormat } = getDataFormatting(config);
691
- const dateDayJS = dayjsWithPlugins_default.utc(value).utc();
692
- if (!dateDayJS.isValid()) {
693
- return value;
612
+ return arr;
613
+ };
614
+
615
+ // src/HelperFns/displayTypeHelpers.ts
616
+ var isChartType = (type) => CHART_TYPES.includes(type);
617
+ var isTableType = (type) => TABLE_TYPES.includes(type);
618
+ var isDisplayTypeValid = (response, displayType, dataLength, pivotDataLength, columns, isDataLimited) => {
619
+ var _a, _b;
620
+ const supportedDisplayTypes = getSupportedDisplayTypes({
621
+ response,
622
+ columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
623
+ dataLength,
624
+ pivotDataLength,
625
+ isDataLimited
626
+ });
627
+ const isValid = displayType && supportedDisplayTypes.includes(displayType);
628
+ return isValid;
629
+ };
630
+ var shouldPlotMultiSeries = (columns) => {
631
+ if (isAggregation(columns)) {
632
+ return false;
694
633
  }
695
- let date = dateDayJS.format(dayMonthYearFormat);
634
+ const multiSeriesIndex = columns.findIndex((col) => col.multi_series === true);
635
+ return multiSeriesIndex >= 0;
636
+ };
637
+ var supportsPieChart = (columns, chartData) => {
638
+ if (shouldPlotMultiSeries(columns)) {
639
+ return false;
640
+ }
641
+ if (chartData) {
642
+ return chartData.length < 7;
643
+ }
644
+ return true;
645
+ };
646
+ var supports2DCharts = (columns, dataLength) => {
647
+ if (dataLength <= 1) {
648
+ return false;
649
+ }
650
+ const { amountOfNumberColumns, amountOfStringColumns } = getColumnTypeAmounts(columns);
651
+ return amountOfNumberColumns > 0 && amountOfStringColumns > 0;
652
+ };
653
+ var supportsRegularPivotTable = (columns, dataLength, data) => {
654
+ var _a, _b;
655
+ if (dataLength <= 1) {
656
+ return false;
657
+ }
658
+ const groupbyColumns = getGroupableColumns(columns);
659
+ const hasTwoGroupables = (groupbyColumns == null ? void 0 : groupbyColumns.length) === 2;
660
+ if (!hasTwoGroupables) {
661
+ return false;
662
+ }
663
+ const visibleColumns = getVisibleColumns(columns);
664
+ const groupbyColumn1 = columns[groupbyColumns[0]];
665
+ const groupbyColumn2 = columns[groupbyColumns[1]];
666
+ if (!groupbyColumn1.is_visible || !groupbyColumn2.is_visible || !((visibleColumns == null ? void 0 : visibleColumns.length) >= 3)) {
667
+ return false;
668
+ }
669
+ const column1Data = (data == null ? void 0 : data.map((row) => {
670
+ return row[groupbyColumns[0]];
671
+ })) ?? [];
672
+ const column2Data = (data == null ? void 0 : data.map((row) => {
673
+ return row[groupbyColumns[1]];
674
+ })) ?? [];
675
+ const uniqueData1Length = ((_a = column1Data == null ? void 0 : column1Data.filter(onlyUnique)) == null ? void 0 : _a.length) ?? 0;
676
+ const uniqueData2Length = ((_b = column2Data == null ? void 0 : column2Data.filter(onlyUnique)) == null ? void 0 : _b.length) ?? 0;
677
+ if (uniqueData1Length > MAX_LEGEND_LABELS && uniqueData2Length > MAX_LEGEND_LABELS) {
678
+ console.debug(
679
+ `Info: Pivot table will not be supported since there are too many unique fields. The calculated dimensions would be: ${uniqueData1Length} x ${uniqueData2Length}`
680
+ );
681
+ return false;
682
+ }
683
+ return true;
684
+ };
685
+ var supportsDatePivotTable = (columns) => {
686
+ var _a;
687
+ const dateColumnIndex = columns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
688
+ const dateColumn = columns[dateColumnIndex];
689
+ return dateColumn && ((_a = dateColumn == null ? void 0 : dateColumn.display_name) == null ? void 0 : _a.toLowerCase().includes("month")) && (columns == null ? void 0 : columns.length) === 2;
690
+ };
691
+ var isSingleValueResponse = (response) => {
692
+ var _a, _b, _c, _d, _e, _f;
693
+ if (!response) {
694
+ return false;
695
+ }
696
+ const rows = (_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.rows;
697
+ const columns = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.columns;
698
+ const referenceID = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.reference_id;
699
+ const hasNoData = rows && !(rows == null ? void 0 : rows.length);
700
+ const hasOneColumn = (columns == null ? void 0 : columns.length) === 1;
701
+ if (hasNoData && hasOneColumn && referenceID === "1.1.211") {
702
+ return true;
703
+ }
704
+ const oneRowAndColumn = (rows == null ? void 0 : rows.length) === 1 && ((_f = rows[0]) == null ? void 0 : _f.length) === 1;
705
+ if (oneRowAndColumn) {
706
+ return true;
707
+ }
708
+ return false;
709
+ };
710
+ var getSupportedDisplayTypes = ({
711
+ response,
712
+ columns,
713
+ dataLength,
714
+ pivotDataLength,
715
+ isDataLimited
716
+ } = {}) => {
717
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
696
718
  try {
697
- switch (precision) {
698
- case "DAY" /* DAY */: {
699
- break;
700
- }
701
- case "WEEK" /* WEEK */: {
702
- const dateJSStart = dateDayJS.startOf("week").format("MMM D");
703
- const dateJSEnd = dateDayJS.endOf("week").format("MMM D");
704
- const week = dateDayJS.week();
705
- const year = dateDayJS.format("YYYY");
706
- date = `${dateJSStart} - ${dateJSEnd}, ${year} (Week ${week})`;
707
- break;
719
+ if (!((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.display_type)) {
720
+ return [];
721
+ }
722
+ const displayType = response.data.data.display_type;
723
+ if (displayType === "suggestion" || displayType === "help" || displayType === "html") {
724
+ return [displayType];
725
+ }
726
+ const rows = ((_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.rows) ?? [];
727
+ const allColumns = columns || ((_f = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.data) == null ? void 0 : _f.columns);
728
+ const visibleColumns = getVisibleColumns(allColumns);
729
+ if (!(visibleColumns == null ? void 0 : visibleColumns.length)) {
730
+ return ["text"];
731
+ }
732
+ if (isSingleValueResponse(response)) {
733
+ return ["single-value"];
734
+ }
735
+ if (!(rows == null ? void 0 : rows.length)) {
736
+ return ["table"];
737
+ }
738
+ const maxRowsForPieChart = 10;
739
+ const numRows = dataLength ?? rows.length;
740
+ let pivotDataHasLength = true;
741
+ const pivotDataLengthProvided = pivotDataLength !== void 0 && pivotDataLength !== null;
742
+ if (pivotDataLengthProvided) {
743
+ pivotDataHasLength = !!pivotDataLength;
744
+ }
745
+ if (supportsRegularPivotTable(visibleColumns, numRows, (_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.rows)) {
746
+ const supportedDisplayTypes = ["table"];
747
+ if (!isDataLimited) {
748
+ supportedDisplayTypes.push("pivot_table");
708
749
  }
709
- case "MONTH" /* MONTH */: {
710
- date = dateDayJS.format(monthYearFormat);
711
- break;
750
+ if (
751
+ // Comment out for now so chart row count doesnt change display type
752
+ // numRows <= maxRowsForPivot &&
753
+ pivotDataHasLength
754
+ ) {
755
+ supportedDisplayTypes.push("stacked_column", "stacked_bar", "column", "bar", "bubble", "heatmap");
756
+ if (hasDateColumn(visibleColumns)) {
757
+ supportedDisplayTypes.push("stacked_line", "line");
758
+ }
712
759
  }
713
- case "QUARTER" /* QUARTER */: {
714
- const quarter = dateDayJS.quarter();
715
- const year = dateDayJS.format("YYYY");
716
- date = `${year}-Q${quarter}`;
717
- break;
760
+ return supportedDisplayTypes;
761
+ } else if (supports2DCharts(visibleColumns, numRows)) {
762
+ const supportedDisplayTypes = ["table", "column", "bar"];
763
+ if (numRows > MIN_HISTOGRAM_SAMPLE) {
764
+ supportedDisplayTypes.push("histogram");
718
765
  }
719
- case "YEAR" /* YEAR */: {
720
- date = dateDayJS.format("YYYY");
721
- break;
766
+ if (hasDateColumn(visibleColumns)) {
767
+ supportedDisplayTypes.push("line");
722
768
  }
723
- case "DATE_HOUR" /* DATE_HOUR */: {
724
- date = dateDayJS.format(`${dayMonthYearFormat} h:00A`);
725
- break;
769
+ if (numRows > 1 && numRows <= maxRowsForPieChart) {
770
+ supportedDisplayTypes.push("pie");
726
771
  }
727
- case "DATE_MINUTE" /* DATE_MINUTE */: {
728
- date = dateDayJS.format(`${dayMonthYearFormat} h:mmA`);
729
- break;
772
+ const { amountOfNumberColumns } = getColumnTypeAmounts(visibleColumns);
773
+ if (amountOfNumberColumns > 1) {
774
+ supportedDisplayTypes.push("column_line");
775
+ supportedDisplayTypes.push("scatterplot");
730
776
  }
731
- default: {
732
- break;
777
+ if (!isDataLimited && supportsDatePivotTable(visibleColumns)) {
778
+ const dateColumnIndex = visibleColumns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
779
+ const dateColumn = visibleColumns[dateColumnIndex];
780
+ const data = (_j = (_i = response == null ? void 0 : response.data) == null ? void 0 : _i.data) == null ? void 0 : _j.rows;
781
+ const uniqueYears = [];
782
+ data.forEach((row) => {
783
+ const year = formatElement({
784
+ element: row[dateColumnIndex],
785
+ column: dateColumn,
786
+ config: getDataFormatting({ monthYearFormat: "YYYY", dayMonthYearFormat: "YYYY" })
787
+ });
788
+ if (!uniqueYears.includes(year)) {
789
+ uniqueYears.push(year);
790
+ }
791
+ });
792
+ if (uniqueYears.length > 1) {
793
+ supportedDisplayTypes.push("pivot_table");
794
+ }
733
795
  }
796
+ return supportedDisplayTypes;
734
797
  }
735
- return date;
798
+ return ["table"];
736
799
  } catch (error) {
737
800
  console.error(error);
801
+ return ["table"];
738
802
  }
739
803
  };
740
- var formatEpochDate = (value, col, config = dataFormattingDefault) => {
741
- if (!value) {
742
- return void 0;
804
+ var getFirstChartDisplayType = (supportedDisplayTypes, fallback) => {
805
+ const chartType = supportedDisplayTypes.find((displayType) => isChartType(displayType));
806
+ if (chartType) {
807
+ return chartType;
743
808
  }
744
- if (!col) {
745
- return value;
809
+ return fallback;
810
+ };
811
+ var getDefaultDisplayType = (response, defaultToChart, columns, dataLength, pivotDataLength, preferredDisplayType, isDataLimited = false) => {
812
+ var _a, _b, _c, _d, _e, _f, _g, _h;
813
+ const supportedDisplayTypes = getSupportedDisplayTypes({
814
+ response,
815
+ columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
816
+ dataLength,
817
+ pivotDataLength,
818
+ isDataLimited
819
+ });
820
+ if (preferredDisplayType && supportedDisplayTypes.includes(preferredDisplayType)) {
821
+ return preferredDisplayType;
746
822
  }
747
- try {
748
- const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
749
- const year = "YYYY";
750
- const monthYear = monthYearFormat;
751
- const dayMonthYear = dayMonthYearFormat;
752
- const title = col.title;
753
- let dayJSObj;
754
- if (isNaN(parseFloat(value))) {
755
- dayJSObj = dayjsWithPlugins_default.utc(value).utc();
756
- } else {
757
- dayJSObj = dayjsWithPlugins_default.unix(value).utc();
758
- }
759
- if (!dayJSObj.isValid()) {
760
- return value;
761
- }
762
- let date = dayJSObj.format(dayMonthYear);
763
- if (isNaN(parseFloat(value))) {
764
- if (title && title.toLowerCase().includes("year")) {
765
- date = dayJSObj.format(year);
766
- } else if (title && title.toLowerCase().includes("month")) {
767
- date = dayJSObj.format(monthYear);
768
- }
769
- date = dayJSObj.format(dayMonthYear);
770
- } else if (title && title.toLowerCase().includes("year")) {
771
- date = dayJSObj.format(year);
772
- } else if (title && title.toLowerCase().includes("month")) {
773
- date = dayJSObj.format(monthYear);
774
- }
775
- return date;
776
- } catch (error) {
777
- console.error(error);
778
- return value;
823
+ const responseDisplayType = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.display_type;
824
+ if (supportedDisplayTypes.includes(preferredDisplayType)) {
825
+ return preferredDisplayType;
779
826
  }
780
- };
781
- var formatDOW = (value, col) => {
782
- let dowStyle = col.dow_style;
783
- if (!dowStyle) {
784
- dowStyle = "NUM_1_MON";
827
+ if (responseDisplayType === "suggestion" || responseDisplayType === "help" || responseDisplayType === "html") {
828
+ return responseDisplayType;
785
829
  }
786
- let formattedValue = value;
787
- let weekdayNumber = Number(value);
788
- switch (dowStyle) {
789
- case "NUM_1_MON": {
790
- const weekdays = WEEKDAY_NAMES_MON;
791
- const index = weekdayNumber - 1;
792
- if (index >= 0) {
793
- formattedValue = weekdays[index];
794
- } else {
795
- console.warn(`dow style is NUM_1_MON but the value could not be converted to a number: ${value}`);
796
- }
797
- break;
798
- }
799
- case "NUM_1_SUN": {
800
- const weekdays = WEEKDAY_NAMES_SUN;
801
- const index = weekdayNumber - 1;
802
- if (index >= 0) {
803
- formattedValue = weekdays[index];
804
- } else {
805
- console.warn(`dow style is NUM_1_SUN but the value could not be converted to a number: ${value}`);
806
- }
807
- break;
808
- }
809
- case "NUM_0_MON": {
810
- const weekdays = WEEKDAY_NAMES_MON;
811
- if (weekdayNumber >= 0) {
812
- formattedValue = weekdays[weekdayNumber];
813
- } else {
814
- console.warn(`dow style is NUM_0_MON but the value could not be converted to a number: ${value}`);
815
- }
816
- break;
817
- }
818
- case "NUM_0_SUN": {
819
- const weekdays = WEEKDAY_NAMES_SUN;
820
- if (weekdayNumber >= 0) {
821
- formattedValue = weekdays[weekdayNumber];
822
- } else {
823
- console.warn(`dow style is NUM_0_SUN but the value could not be converted to a number: ${value}`);
824
- }
825
- break;
826
- }
827
- case "ALPHA_MON":
828
- case "ALPHA_SUN": {
829
- const weekday = WEEKDAY_NAMES_MON.find((weekday2) => weekday2.toLowerCase().includes(value.trim().toLowerCase()));
830
- if (weekday) {
831
- formattedValue = weekday;
832
- } else {
833
- console.warn(`dow style is ALPHA but the value could not be matched to a weekday name: ${value}`);
834
- }
835
- break;
836
- }
837
- default: {
838
- console.warn(`could not format dow value. dow_style was not recognized: ${col.dow_style}`);
839
- break;
840
- }
830
+ if (supportedDisplayTypes.length === 1) {
831
+ return supportedDisplayTypes[0];
841
832
  }
842
- return formattedValue;
843
- };
844
- var dateStringSortFnWithoutPrecision = (a, b) => {
845
- if (a.includes("-W")) {
846
- const aDateYear = a.substring(0, 4);
847
- const bDateYear = b.substring(0, 4);
848
- if (aDateYear !== bDateYear) {
849
- return aDateYear - bDateYear;
850
- } else {
851
- const aDateWeek = a.substring(6, 8);
852
- const bDateWeek = b.substring(6, 8);
853
- return aDateWeek - bDateWeek;
854
- }
855
- } else if (WEEKDAY_NAMES_MON.includes(a.trim())) {
856
- const aDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(a.trim().toLowerCase()));
857
- const bDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(b.trim().toLowerCase()));
858
- let sortValue = a - b;
859
- if (aDayIndex >= 0 && bDayIndex >= 0) {
860
- sortValue = aDayIndex - bDayIndex;
861
- }
862
- return sortValue;
863
- } else if (MONTH_NAMES.includes(a.trim())) {
864
- const aMonthIndex = MONTH_NAMES.findIndex((m) => m === a.trim());
865
- const bMonthIndex = MONTH_NAMES.findIndex((m) => m === b.trim());
866
- if (aMonthIndex >= 0 && bMonthIndex >= 0) {
867
- return bMonthIndex - aMonthIndex;
833
+ if (supportedDisplayTypes.includes("pivot_table")) {
834
+ let displayType = "pivot_table";
835
+ if (defaultToChart) {
836
+ displayType = isAggregation((_f = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.data) == null ? void 0 : _f.columns) ? getFirstChartDisplayType(supportedDisplayTypes, "pivot_table") : "pivot_table";
868
837
  }
869
- return a - b;
870
- } else if (SEASON_NAMES.includes(a.substr(0, 2))) {
871
- const aSeasonIndex = SEASON_NAMES.findIndex((s) => s === a.substr(0, 2));
872
- const bSeasonIndex = SEASON_NAMES.findIndex((s) => s === b.substr(0, 2));
873
- const aYear = Number(a.substr(2));
874
- const bYear = Number(b.substr(2));
875
- if (aYear === bYear) {
876
- return aSeasonIndex - bSeasonIndex;
838
+ return displayType;
839
+ }
840
+ if (!responseDisplayType && hasData(response) || responseDisplayType === "data") {
841
+ let displayType = "table";
842
+ if (defaultToChart) {
843
+ displayType = isAggregation((_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.columns) ? getFirstChartDisplayType(supportedDisplayTypes, "table") : "table";
877
844
  }
878
- return aYear - bYear;
845
+ return displayType;
879
846
  }
880
- return a - b;
847
+ return "text";
881
848
  };
882
- var dateStringSortFn = (a, b, col) => {
883
- if (typeof a !== "string" || typeof b !== "string" || !col) {
884
- return a - b;
885
- }
886
- const aTrimmed = a.trim();
887
- const bTrimmed = b.trim();
888
- switch (col.precision) {
889
- case "DOW": {
890
- const dowStyle = col.dow_style ?? "ALPHA_MON";
891
- let aIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
892
- let bIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
893
- if (dowStyle === "ALPHA_SUN") {
894
- aIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
895
- bIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
896
- }
897
- return aIndex - bIndex;
898
- }
899
- case "HOUR":
900
- case "MINUTE": {
901
- const aDayjsTime = dayjsWithPlugins_default.utc(aTrimmed, "THH:mm:ss.SSSZ").utc();
902
- const bDayjsTime = dayjsWithPlugins_default.utc(bTrimmed, "THH:mm:ss.SSSZ").utc();
903
- return aDayjsTime.unix() - bDayjsTime.unix();
904
- }
905
- case "MONTH": {
906
- MONTH_NAMES;
907
- const aMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === aTrimmed.toLowerCase());
908
- const bMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === bTrimmed.toLowerCase());
909
- return aMonthIndex - bMonthIndex;
910
- }
911
- default: {
912
- return dateStringSortFnWithoutPrecision(aTrimmed, bTrimmed);
913
- }
849
+ var hasData = (response) => {
850
+ var _a, _b, _c;
851
+ if (!response) {
852
+ return false;
914
853
  }
854
+ return (_c = (_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.rows) == null ? void 0 : _c.length;
915
855
  };
916
- var dateSortFn = (a, b, col, isTable) => {
856
+
857
+ // src/HelperFns/dataAlertHelpers.ts
858
+ var getDayLocalStartDate = ({ timeObj, timezone: timezone2, daysToAdd = 0 }) => {
917
859
  try {
918
- if (!a && !b) {
919
- return 0;
920
- } else if (!a && b) {
921
- return 1;
922
- } else if (a && !b || !col) {
923
- return -1;
924
- }
925
- let aDate = Number(a);
926
- let bDate = Number(b);
927
- let sortValue = aDate - bDate;
928
- if (isNaN(aDate) || isNaN(bDate)) {
929
- if (col.type === "DATE_STRING") {
930
- sortValue = dateStringSortFn(a, b, col);
931
- } else {
932
- sortValue = dayjsWithPlugins_default.utc(a).unix() - dayjsWithPlugins_default.utc(b).unix();
933
- }
934
- }
935
- if (isTable && col.precision === "DOW") {
936
- sortValue = -1 * sortValue;
860
+ const now = dayjsWithPlugins_default().tz(timezone2);
861
+ let nextCycle = now.startOf("minute").set("hour", timeObj.hour24).set("minute", timeObj.minute);
862
+ if (nextCycle.valueOf() < now.valueOf()) {
863
+ nextCycle = nextCycle.add(1, "day");
937
864
  }
938
- return sortValue;
865
+ const nextCycleFormatted = nextCycle.add(daysToAdd, "days").format("YYYY-MM-DD[T]HH:mm:00");
866
+ return nextCycleFormatted;
939
867
  } catch (error) {
940
868
  console.error(error);
941
- return -1;
869
+ return;
942
870
  }
943
871
  };
944
- var sortDataByDate = (data, tableColumns, sortDirection = "desc", isTable) => {
872
+ var getWeekLocalStartDate = ({ weekDay, timeObj, timezone: timezone2 }) => {
945
873
  try {
946
- if (!data || typeof data !== "object") {
947
- throw new Error("Could not sort data by date - no data supplied");
948
- }
949
- const dateColumnIndex = getDateColumnIndex(tableColumns);
950
- const dateColumn = tableColumns[dateColumnIndex];
951
- if (dateColumnIndex >= 0) {
952
- let multiplier = sortDirection === "desc" ? -1 : 1;
953
- const sortedData = [...data].sort(
954
- (a, b) => multiplier * dateSortFn(a[dateColumnIndex], b[dateColumnIndex], dateColumn, isTable)
955
- );
956
- return sortedData;
957
- }
874
+ const now = dayjsWithPlugins_default().tz(timezone2);
875
+ const weekdayNumber = WEEKDAY_NAMES_SUN.findIndex((day) => weekDay.toLowerCase() === day.toLowerCase());
876
+ const nextWeekday = now.day(weekdayNumber).startOf("minute");
877
+ const nextWeekdayWithTime = nextWeekday.hour(timeObj.hour24).minute(timeObj.minute);
878
+ if (nextWeekdayWithTime.valueOf() < now.valueOf()) {
879
+ return nextWeekdayWithTime.add(1, "week").format("YYYY-MM-DD[T]HH:mm:00");
880
+ }
881
+ return nextWeekdayWithTime.format("YYYY-MM-DD[T]HH:mm:00");
958
882
  } catch (error) {
959
883
  console.error(error);
884
+ return;
960
885
  }
961
- return data;
962
886
  };
963
- var formatElement = ({
964
- element,
965
- column,
966
- config = dataFormattingDefault,
967
- htmlElement,
968
- isChart = false
969
- }) => {
887
+ var getMonthLocalStartDate = ({ monthDay, timeObj, timezone: timezone2 }) => {
970
888
  try {
971
- let formattedElement = element;
972
- const { currencyCode, languageCode, currencyDecimals, quantityDecimals, ratioDecimals } = getDataFormatting(config);
973
- let type = column == null ? void 0 : column.type;
974
- if (isChart && ["count", "deviation", "variance"].includes(column == null ? void 0 : column.aggType)) {
975
- type = "QUANTITY";
976
- }
977
- if (column) {
978
- switch (type) {
979
- case "STRING": {
980
- break;
981
- }
982
- case "DOLLAR_AMT": {
983
- const elementNumber = parseFloat(`${element}`);
984
- if (!isNaN(elementNumber)) {
985
- const currency = currencyCode || "USD";
986
- const validatedCurrencyDecimals = currencyDecimals || currencyDecimals === 0 ? currencyDecimals : void 0;
987
- try {
988
- formattedElement = new Intl.NumberFormat(languageCode, {
989
- style: "currency",
990
- currency: `${currency}`,
991
- minimumFractionDigits: validatedCurrencyDecimals,
992
- maximumFractionDigits: validatedCurrencyDecimals
993
- }).format(elementNumber);
994
- } catch (error) {
995
- console.error(error);
996
- formattedElement = new Intl.NumberFormat(languageCode, {
997
- style: "currency",
998
- currency: "USD",
999
- minimumFractionDigits: validatedCurrencyDecimals,
1000
- maximumFractionDigits: validatedCurrencyDecimals
1001
- }).format(elementNumber);
1002
- }
1003
- }
1004
- break;
1005
- }
1006
- case "QUANTITY": {
1007
- const validatedQuantityDecimals = !isNaN(quantityDecimals) ? quantityDecimals : 2;
1008
- const elementNumber = parseFloat(`${element}`);
1009
- if (!isNaN(elementNumber)) {
1010
- const numDecimals = elementNumber % 1 !== 0 ? validatedQuantityDecimals : 0;
1011
- formattedElement = new Intl.NumberFormat(languageCode, {
1012
- minimumFractionDigits: numDecimals,
1013
- maximumFractionDigits: numDecimals
1014
- }).format(elementNumber);
1015
- }
1016
- break;
1017
- }
1018
- case "DATE": {
1019
- formattedElement = formatDateType(element, column, config);
1020
- break;
1021
- }
1022
- case "DATE_STRING": {
1023
- formattedElement = formatDateStringType(element, column, config);
1024
- break;
1025
- }
1026
- case "RATIO": {
1027
- const numDecimals = !isNaN(ratioDecimals) ? ratioDecimals : 4;
1028
- const elementNumber = parseFloat(`${element}`);
1029
- if (!isNaN(elementNumber)) {
1030
- formattedElement = new Intl.NumberFormat(languageCode, {
1031
- minimumFractionDigits: numDecimals,
1032
- maximumFractionDigits: numDecimals
1033
- }).format(elementNumber);
1034
- }
1035
- break;
1036
- }
1037
- case "PERCENT": {
1038
- const elementNumber = parseFloat(`${element}`);
1039
- if (!isNaN(elementNumber)) {
1040
- const p = elementNumber / 100;
1041
- formattedElement = new Intl.NumberFormat(languageCode, {
1042
- style: "percent",
1043
- minimumFractionDigits: 2,
1044
- maximumFractionDigits: 2
1045
- }).format(p);
1046
- if (htmlElement) {
1047
- if (elementNumber < 0) {
1048
- htmlElement.classList.add("comparison-value-negative");
1049
- } else if (elementNumber > 0) {
1050
- htmlElement.classList.add("comparison-value-positive");
1051
- }
1052
- }
1053
- }
1054
- break;
1055
- }
1056
- default: {
1057
- break;
1058
- }
1059
- }
1060
- }
1061
- return formattedElement;
889
+ const now = dayjsWithPlugins_default().tz(timezone2);
890
+ let nextMonthStr;
891
+ if (monthDay === "LAST") {
892
+ nextMonthStr = now.endOf("month").startOf("day").format("ll HH:mm");
893
+ } else if (monthDay === "FIRST") {
894
+ nextMonthStr = now.add(1, "month").startOf("month").format("ll HH:mm");
895
+ }
896
+ const nextMonth = dayjsWithPlugins_default.tz(nextMonthStr, timezone2);
897
+ const nextMonthWithTime = nextMonth.hour(timeObj.hour24).minute(timeObj.minute);
898
+ return nextMonthWithTime.format("YYYY-MM-DD[T]HH:mm:00");
1062
899
  } catch (error) {
1063
900
  console.error(error);
1064
- return element;
901
+ return;
1065
902
  }
1066
903
  };
1067
- var getNumberFormatConfig = (d, scale) => {
1068
- var _a, _b;
1069
- let minimumFractionDigits = 0;
1070
- let maximumFractionDigits = 0;
1071
- let notation;
1072
- const domainRange = ((_a = scale == null ? void 0 : scale.domain()) == null ? void 0 : _a[1]) - ((_b = scale == null ? void 0 : scale.domain()) == null ? void 0 : _b[0]);
1073
- const smallDomain = domainRange && domainRange < 10;
1074
- const absValue = Math.abs(d);
1075
- if (smallDomain) {
1076
- minimumFractionDigits = 2;
1077
- maximumFractionDigits = 2;
1078
- } else if (absValue >= 1e3) {
1079
- notation = "compact";
1080
- if (absValue > 1e9) {
1081
- maximumFractionDigits = 3;
1082
- } else if (absValue > 1e6) {
1083
- maximumFractionDigits = 2;
1084
- } else if (absValue > 1e3) {
1085
- maximumFractionDigits = 1;
1086
- }
904
+
905
+ // src/Constants/dataAlertConstants.ts
906
+ var CUSTOM_TYPE = "CUSTOM";
907
+ var PROJECT_TYPE = "PROJECT";
908
+ var PERIODIC_TYPE = "PERIODIC";
909
+ var CONTINUOUS_TYPE = "CONTINUOUS";
910
+ var SCHEDULED_TYPE = "SCHEDULED";
911
+ var COMPARE_TYPE = "COMPARE";
912
+ var EXISTS_TYPE = "EXISTS";
913
+ var NUMBER_TERM_TYPE = "CONSTANT";
914
+ var QUERY_TERM_TYPE = "QUERY";
915
+ var GROUP_TERM_TYPE = "GROUP";
916
+ var DEFAULT_EVALUATION_FREQUENCY = 5;
917
+ var DATA_ALERT_STATUSES = {
918
+ ACTIVE: "ACTIVE",
919
+ // currently running
920
+ RETRY: "RETRY",
921
+ // currently being retried because of an error, no action required yet
922
+ WAITING: "WAITING",
923
+ // active but triggered already and waiting for the reset period to end
924
+ INACTIVE: "INACTIVE",
925
+ // either not running OR it is a prototype (can not be run)
926
+ EVALUATION_ERROR: "EVALUATION_ERROR",
927
+ // expression evaluation resulted in an error
928
+ DATA_RETURN_ERROR: "DATA_RETURN_ERROR",
929
+ // expression evaluation was successful, but data return query failed
930
+ GENERAL_ERROR: "GENERAL_ERROR"
931
+ // every thing else that doesnt fall into a category above
932
+ };
933
+ var DATA_ALERT_ENABLED_STATUSES = [
934
+ DATA_ALERT_STATUSES.ACTIVE,
935
+ DATA_ALERT_STATUSES.RETRY,
936
+ DATA_ALERT_STATUSES.WAITING
937
+ ];
938
+ var DATA_ALERT_OPERATORS = {
939
+ GREATER_THAN: {
940
+ displayName: `
941
+ <span>
942
+ Is <strong>greater</strong> than
943
+ </span>
944
+ `,
945
+ symbol: ">",
946
+ conditionText: "exceeds",
947
+ conditionTextPast: "exceeded"
948
+ },
949
+ GREATER_THAN_EQUAL_TO: {
950
+ displayName: `
951
+ <span>
952
+ Is <strong>greater</strong> than <strong>or equal</strong> to
953
+ </span>
954
+ `,
955
+ symbol: ">=",
956
+ conditionText: "is equal to or exceeds",
957
+ conditionTextPast: "was equal to or exceeded"
958
+ },
959
+ LESS_THAN: {
960
+ displayName: `
961
+ <span>
962
+ Is <strong>less</strong> than
963
+ </span>
964
+ `,
965
+ symbol: "<",
966
+ conditionText: "falls below",
967
+ conditionTextPast: "fell below"
968
+ },
969
+ LESS_THAN_EQUAL_TO: {
970
+ displayName: `
971
+ <span>
972
+ Is <strong>less</strong> than <strong>or equal</strong> to
973
+ </span>
974
+ `,
975
+ symbol: "<=",
976
+ conditionText: "is equal to or falls below",
977
+ conditionTextPast: "was equal to or fell below"
978
+ },
979
+ EQUAL_TO: {
980
+ displayName: `
981
+ <span>
982
+ Is <strong>equal</strong> to
983
+ </span>
984
+ `,
985
+ symbol: "=",
986
+ conditionText: "equals",
987
+ conditionTextPast: "was equal to"
988
+ }
989
+ /* Not using this for now. Uncomment to enable later if desired
990
+ NOT_EQUAL_TO: {
991
+ displayName: (
992
+ <span>
993
+ Is <strong>not equal</strong> to
994
+ </span>
995
+ ),
996
+ symbol: '!=',
997
+ conditionText: 'does not equal',
998
+ conditionTextPast: 'was not equal to',
999
+ }, */
1000
+ /* These are additions term condition values
1001
+ They can be used to create more complex condition groups
1002
+ EXISTS: {},
1003
+ NOT_EXISTS: {},
1004
+ AND: {},
1005
+ OR: {},
1006
+ TERMINATOR: {} */
1007
+ };
1008
+ var DATA_ALERT_CONDITION_TYPES = {
1009
+ [COMPARE_TYPE]: {
1010
+ displayName: "When a specific condition is met"
1011
+ },
1012
+ [EXISTS_TYPE]: {
1013
+ displayName: "If new data is detected"
1087
1014
  }
1088
- return { minimumFractionDigits, maximumFractionDigits, notation };
1089
1015
  };
1090
- var formatChartLabel = ({ d, scale, column, dataFormatting, maxLabelWidth }) => {
1091
- if (d === null) {
1092
- return {
1093
- fullWidthLabel: "Untitled Category",
1094
- formattedLabel: "Untitled Category"
1095
- };
1096
- }
1097
- const col = column ?? (scale == null ? void 0 : scale.column);
1098
- if (!col || !col.type) {
1099
- return {
1100
- fullWidthLabel: d,
1101
- formattedLabel: d
1102
- };
1016
+ var DATA_ALERT_FREQUENCY_TYPE_OPTIONS = {
1017
+ [SCHEDULED_TYPE]: {
1018
+ label: "at the following times:",
1019
+ listLabel: "at the following times"
1020
+ },
1021
+ [CONTINUOUS_TYPE]: {
1022
+ label: "right away.",
1023
+ listLabel: "right away"
1024
+ }
1025
+ };
1026
+ var SCHEDULE_INTERVAL_OPTIONS = {
1027
+ DAY: {
1028
+ displayName: `
1029
+ <span>
1030
+ Every <strong>day</strong>
1031
+ </span>
1032
+ `,
1033
+ getLocalStartDate: getDayLocalStartDate
1034
+ },
1035
+ WEEK: {
1036
+ displayName: `
1037
+ <span>
1038
+ Every <strong>week</strong>
1039
+ </span>
1040
+ `,
1041
+ getLocalStartDate: getWeekLocalStartDate
1042
+ },
1043
+ MONTH: {
1044
+ displayName: `
1045
+ <span>
1046
+ Every <strong>month</strong>
1047
+ </span>
1048
+ `,
1049
+ getLocalStartDate: getMonthLocalStartDate
1050
+ }
1051
+ // Not supporting for now
1052
+ // YEAR: {
1053
+ // displayName: (
1054
+ // <span>
1055
+ // Every <strong>year</strong>
1056
+ // </span>
1057
+ // ),
1058
+ // displayText: 'Scheduled yearly',
1059
+ // },
1060
+ };
1061
+ var SCHEDULE_FREQUENCY_OPTIONS = {
1062
+ DAY: {
1063
+ displayText: "Scheduled daily"
1064
+ },
1065
+ WEEK: {
1066
+ displayText: "Scheduled weekly"
1067
+ },
1068
+ MONTH: {
1069
+ displayText: "Scheduled for the 1st of every month"
1070
+ },
1071
+ MONTH_LAST_DAY: {
1072
+ displayText: "Scheduled for the end of every month"
1073
+ },
1074
+ YEAR: {
1075
+ displayText: "Scheduled yearly"
1076
+ }
1077
+ };
1078
+ var RESET_PERIOD_OPTIONS = {
1079
+ DAY: {
1080
+ displayName: `
1081
+ <span>
1082
+ At most <strong>once a day</strong>
1083
+ </span>
1084
+ `,
1085
+ displayText: "At most once a day"
1086
+ },
1087
+ WEEK: {
1088
+ displayName: `
1089
+ <span>
1090
+ At most <strong>once a week</strong>
1091
+ </span>
1092
+ `,
1093
+ displayText: "At most once a week"
1094
+ },
1095
+ MONTH: {
1096
+ displayName: `
1097
+ <span>
1098
+ At most <strong>once a month</strong>
1099
+ </span>
1100
+ `,
1101
+ displayText: "At most once a month"
1102
+ },
1103
+ // Not supporting for now
1104
+ // YEAR: {
1105
+ // displayName: (
1106
+ // <span>
1107
+ // At most <strong>once a year</strong>
1108
+ // </span>
1109
+ // ),
1110
+ // displayText: 'At most once a year'
1111
+ // },
1112
+ NONE: {
1113
+ displayName: `
1114
+ <span>
1115
+ <strong>Every time</strong> new data is detected
1116
+ </span>
1117
+ `,
1118
+ displayText: "Continuous"
1119
+ }
1120
+ };
1121
+ var MONTH_DAY_SELECT_OPTIONS = {
1122
+ FIRST: `
1123
+ <span>
1124
+ on the <strong>first day</strong>
1125
+ </span>
1126
+ `,
1127
+ LAST: `
1128
+ <span>
1129
+ on the <strong>last day</strong>
1130
+ </span>
1131
+ `
1132
+ };
1133
+ var EVALUATION_FREQUENCY_OPTIONS = {
1134
+ 1: {
1135
+ value: 1,
1136
+ label: "1 min"
1137
+ },
1138
+ 2: {
1139
+ value: 2,
1140
+ label: "2 mins"
1141
+ },
1142
+ 3: {
1143
+ value: 3,
1144
+ label: "3 mins"
1145
+ },
1146
+ 5: {
1147
+ value: 5,
1148
+ label: "5 mins",
1149
+ listLabel: `
1150
+ <span>
1151
+ 5 mins <em>(Recommended)</em>
1152
+ </span>
1153
+ `
1154
+ },
1155
+ 10: {
1156
+ value: 10,
1157
+ label: "10 mins"
1158
+ },
1159
+ 30: {
1160
+ value: 30,
1161
+ label: "30 mins"
1162
+ },
1163
+ 60: {
1164
+ value: 60,
1165
+ label: "60 mins"
1103
1166
  }
1104
- const config = (scale == null ? void 0 : scale.dataFormatting) ?? dataFormatting;
1105
- const { currencyCode, languageCode } = config;
1106
- let type = col.type;
1107
- if ((scale == null ? void 0 : scale.units) === "none") {
1108
- type = "QUANTITY";
1167
+ };
1168
+
1169
+ // src/Constants/queryConstants.ts
1170
+ var DEFAULT_SOURCE = "widgets";
1171
+
1172
+ // src/Constants/enums.ts
1173
+ var TimestampFormats = /* @__PURE__ */ ((TimestampFormats2) => {
1174
+ TimestampFormats2["epoch"] = "EPOCH";
1175
+ TimestampFormats2["iso8601"] = "ISO8601";
1176
+ return TimestampFormats2;
1177
+ })(TimestampFormats || {});
1178
+ var PrecisionTypes = /* @__PURE__ */ ((PrecisionTypes2) => {
1179
+ PrecisionTypes2["DAY"] = "DAY";
1180
+ PrecisionTypes2["MONTH"] = "MONTH";
1181
+ PrecisionTypes2["YEAR"] = "YEAR";
1182
+ PrecisionTypes2["WEEK"] = "WEEK";
1183
+ PrecisionTypes2["QUARTER"] = "QUARTER";
1184
+ PrecisionTypes2["DATE_HOUR"] = "DATE_HOUR";
1185
+ PrecisionTypes2["DATE_MINUTE"] = "DATE_MINUTE";
1186
+ PrecisionTypes2["HOUR"] = "HOUR";
1187
+ PrecisionTypes2["MINUTE"] = "MINUTE";
1188
+ return PrecisionTypes2;
1189
+ })(PrecisionTypes || {});
1190
+ var NumberColumnTypes = /* @__PURE__ */ ((NumberColumnTypes2) => {
1191
+ NumberColumnTypes2["CURRENCY"] = "DOLLAR_AMT";
1192
+ NumberColumnTypes2["QUANTITY"] = "QUANTITY";
1193
+ NumberColumnTypes2["RATIO"] = "RATIO";
1194
+ NumberColumnTypes2["PERCENT"] = "PERCENT";
1195
+ return NumberColumnTypes2;
1196
+ })(NumberColumnTypes || {});
1197
+ var NumberColumnTypeDisplayNames = /* @__PURE__ */ ((NumberColumnTypeDisplayNames2) => {
1198
+ NumberColumnTypeDisplayNames2["DOLLAR_AMT"] = "Currency";
1199
+ NumberColumnTypeDisplayNames2["QUANTITY"] = "Quantity";
1200
+ NumberColumnTypeDisplayNames2["RATIO"] = "Ratio";
1201
+ NumberColumnTypeDisplayNames2["PERCENT"] = "Percent";
1202
+ return NumberColumnTypeDisplayNames2;
1203
+ })(NumberColumnTypeDisplayNames || {});
1204
+ var DataExplorerTypes = /* @__PURE__ */ ((DataExplorerTypes2) => {
1205
+ DataExplorerTypes2["SUBJECT_TYPE"] = "subject";
1206
+ DataExplorerTypes2["VL_TYPE"] = "VL";
1207
+ return DataExplorerTypes2;
1208
+ })(DataExplorerTypes || {});
1209
+
1210
+ // src/Constants/defaults.ts
1211
+ var authenticationDefault = {
1212
+ token: void 0,
1213
+ apiKey: void 0,
1214
+ domain: void 0,
1215
+ dprKey: void 0,
1216
+ dprDomain: void 0
1217
+ };
1218
+ var dataFormattingDefault = {
1219
+ timestampFormat: "ISO8601" /* iso8601 */,
1220
+ currencyCode: "USD",
1221
+ languageCode: "en-US",
1222
+ currencyDecimals: 2,
1223
+ quantityDecimals: 2,
1224
+ ratioDecimals: 4,
1225
+ comparisonDisplay: "PERCENT",
1226
+ monthYearFormat: "MMMM YYYY",
1227
+ dayMonthYearFormat: "ll"
1228
+ };
1229
+ var autoQLConfigDefault = {
1230
+ debug: false,
1231
+ test: false,
1232
+ enableAutocomplete: true,
1233
+ enableQueryInterpretation: true,
1234
+ enableQueryValidation: true,
1235
+ enableQuerySuggestions: true,
1236
+ enableColumnVisibilityManager: true,
1237
+ enableDrilldowns: true,
1238
+ enableNotifications: false,
1239
+ enableCSVDownload: true,
1240
+ enableReportProblem: true
1241
+ };
1242
+ var dataConfigDefault = {
1243
+ stringColumnIndices: [],
1244
+ numberColumnIndices: [],
1245
+ stringColumnIndex: 0,
1246
+ legendColumnIndex: void 0,
1247
+ numberColumnIndex: 1
1248
+ };
1249
+ var getAuthentication = (prop = {}) => {
1250
+ return {
1251
+ ...authenticationDefault,
1252
+ ...prop
1253
+ };
1254
+ };
1255
+ var getDataFormatting = (prop = {}) => {
1256
+ return {
1257
+ ...dataFormattingDefault,
1258
+ ...prop
1259
+ };
1260
+ };
1261
+ var getAutoQLConfig = (prop = {}) => {
1262
+ return {
1263
+ ...autoQLConfigDefault,
1264
+ ...prop
1265
+ };
1266
+ };
1267
+ var getDataConfig = (prop = {}) => {
1268
+ return {
1269
+ ...dataConfigDefault,
1270
+ ...prop
1271
+ };
1272
+ };
1273
+
1274
+ // src/HelperFns/dataFormattingHelpers.ts
1275
+ var formatStringDateWithPrecision = (value, col) => {
1276
+ if (!value) {
1277
+ return void 0;
1109
1278
  }
1110
- const { minimumFractionDigits, maximumFractionDigits, notation } = getNumberFormatConfig(d, scale);
1111
- let formattedLabel = d;
1112
- if (scale == null ? void 0 : scale.showLabelDecimals) {
1113
- formattedLabel = formatElement({
1114
- element: d,
1115
- column: column ?? (scale == null ? void 0 : scale.column),
1116
- config: dataFormatting,
1117
- isChart: true
1118
- });
1119
- } else {
1120
- switch (type) {
1121
- case "STRING": {
1279
+ let formattedValue = value;
1280
+ try {
1281
+ switch (col.precision) {
1282
+ case "DOW": {
1283
+ formattedValue = formatDOW(value, col);
1122
1284
  break;
1123
1285
  }
1124
- case "DOLLAR_AMT": {
1125
- if (Number(d) || Number(d) === 0) {
1126
- const style = "currency";
1127
- const currency = currencyCode || "USD";
1128
- const currencyConfig = {
1129
- style,
1130
- minimumFractionDigits,
1131
- maximumFractionDigits,
1132
- notation
1133
- };
1134
- try {
1135
- formattedLabel = new Intl.NumberFormat(languageCode, {
1136
- ...currencyConfig,
1137
- currency
1138
- }).format(d);
1139
- } catch (error) {
1140
- console.error(error);
1141
- formattedLabel = new Intl.NumberFormat(languageCode, {
1142
- ...currencyConfig,
1143
- currency: "USD"
1144
- }).format(d);
1145
- }
1286
+ case "HOUR": {
1287
+ const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1288
+ if (dayjsTime.isValid()) {
1289
+ formattedValue = dayjsTime.format("h:00A");
1146
1290
  }
1147
1291
  break;
1148
1292
  }
1149
- case "QUANTITY": {
1150
- if (!isNaN(parseFloat(d))) {
1151
- formattedLabel = new Intl.NumberFormat(languageCode, {
1152
- minimumFractionDigits,
1153
- maximumFractionDigits,
1154
- notation
1155
- }).format(d);
1293
+ case "MINUTE": {
1294
+ const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1295
+ if (dayjsTime.isValid()) {
1296
+ formattedValue = dayjsTime.format("h:mmA");
1156
1297
  }
1157
1298
  break;
1158
1299
  }
1159
- case "DATE": {
1160
- formattedLabel = formatDateType(d, col, config);
1161
- break;
1162
- }
1163
- case "DATE_STRING": {
1164
- formattedLabel = formatDateStringType(d, col, config);
1165
- break;
1166
- }
1167
- case "PERCENT": {
1168
- if (Number(d) || Number(d) === 0) {
1169
- const p = Number(d) / 100;
1170
- formattedLabel = new Intl.NumberFormat(languageCode, {
1171
- style: "percent",
1172
- minimumFractionDigits: 1,
1173
- maximumFractionDigits: 1
1174
- }).format(p);
1175
- }
1300
+ case "MONTH": {
1301
+ formattedValue = value;
1176
1302
  break;
1177
1303
  }
1178
1304
  default: {
1305
+ formattedValue = value;
1179
1306
  break;
1180
1307
  }
1181
1308
  }
1182
- }
1183
- const fullWidthLabel = formattedLabel;
1184
- if (typeof formattedLabel === "string" && maxLabelWidth && formattedLabel.length > maxLabelWidth) {
1185
- formattedLabel = `${formattedLabel.substring(0, maxLabelWidth)}...`;
1186
- }
1187
- return { fullWidthLabel, formattedLabel };
1188
- };
1189
- var getCurrencySymbol = (dataFormatting = dataFormattingDefault) => {
1190
- var _a;
1191
- try {
1192
- const { currencyCode, languageCode } = getDataFormatting(dataFormatting);
1193
- const formattedParts = new Intl.NumberFormat(languageCode, {
1194
- style: "currency",
1195
- currency: currencyCode
1196
- }).formatToParts(0);
1197
- const symbol = (_a = formattedParts.find((part) => (part == null ? void 0 : part.type) === "currency")) == null ? void 0 : _a.value;
1198
- return symbol;
1309
+ return formattedValue;
1199
1310
  } catch (error) {
1200
1311
  console.error(error);
1201
- return;
1312
+ return value;
1202
1313
  }
1203
1314
  };
1204
- var getDayjsObjForStringType = (value, col) => {
1315
+ var formatStringDate = (value, config = dataFormattingDefault) => {
1316
+ var _a;
1205
1317
  if (!value) {
1206
1318
  return void 0;
1207
1319
  }
1208
- try {
1209
- switch (col.precision) {
1210
- case "DOW": {
1211
- return void 0;
1212
- }
1213
- case "HOUR":
1214
- case "MINUTE": {
1215
- return dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1216
- }
1217
- case "MONTH": {
1218
- return void 0;
1219
- }
1220
- default: {
1221
- return void 0;
1222
- }
1223
- }
1224
- } catch (error) {
1225
- console.error(error);
1226
- return void 0;
1227
- }
1228
- };
1229
- var getDayJSObj = ({ value, column }) => {
1230
- if (column.type === "DATE_STRING") {
1231
- return getDayjsObjForStringType(value, column);
1232
- }
1233
- if (isNumber(value)) {
1234
- return dayjsWithPlugins_default.unix(value).utc();
1235
- }
1236
- return dayjsWithPlugins_default.utc(value).utc();
1237
- };
1238
- var getEpochFromDate = (date, precision, precisionFrame) => {
1239
- if (date == null ? void 0 : date.getTime) {
1240
- if (precision && precisionFrame === "start") {
1241
- return dayjsWithPlugins_default(date).utc().startOf(precision).valueOf();
1242
- } else if (precision && precisionFrame === "end") {
1243
- return dayjsWithPlugins_default(date).utc().endOf(precision).valueOf();
1244
- }
1245
- return date.getTime();
1246
- }
1247
- return;
1248
- };
1249
-
1250
- // src/HelperFns/arrayHelpers.ts
1251
- var import_lodash = __toESM(require("lodash.isequal"));
1252
- var invertArray = (array) => {
1253
- const numRows = array.length;
1254
- const numColumns = array[0].length;
1255
- const invertedArray = [];
1256
- for (let i = 0; i < numColumns; i++) {
1257
- invertedArray[i] = [];
1258
- for (let j = 0; j < numRows; j++) {
1259
- if (array[j][i])
1260
- invertedArray[i][j] = array[j][i];
1320
+ if (value && typeof value === "string") {
1321
+ const dateArray = value.split("-");
1322
+ const year = dateArray == null ? void 0 : dateArray[0];
1323
+ const day = dateArray == null ? void 0 : dateArray[2];
1324
+ let month;
1325
+ let week;
1326
+ if ((_a = dateArray == null ? void 0 : dateArray[1]) == null ? void 0 : _a.includes("W")) {
1327
+ week = dateArray == null ? void 0 : dateArray[1];
1328
+ } else {
1329
+ month = dateArray == null ? void 0 : dateArray[1];
1261
1330
  }
1262
- }
1263
- return invertedArray;
1264
- };
1265
- var functionsEqual = (a, b) => {
1266
- return (a == null ? void 0 : a.toString()) == (b == null ? void 0 : b.toString());
1267
- };
1268
- var isObject = (obj) => {
1269
- return typeof obj === "object" && !Array.isArray(obj) && obj !== null && obj !== void 0;
1270
- };
1271
- var deepEqual = (objA, objB) => {
1272
- const lodashIsEqual = (0, import_lodash.default)(objA, objB);
1273
- if (lodashIsEqual) {
1274
- return true;
1275
- }
1276
- const objAIsObject = isObject(objA);
1277
- const objBIsObject = isObject(objB);
1278
- if (!objAIsObject || !objBIsObject) {
1279
- return lodashIsEqual;
1280
- }
1281
- const keysA = Object.keys(objA);
1282
- const keysB = Object.keys(objB);
1283
- if (keysA.length !== keysB.length) {
1284
- return false;
1285
- }
1286
- for (let i = 0; i < keysA.length; i++) {
1287
- if (typeof objA[keysA[i]] === "function" && typeof objB[keysA[i]] === "function") {
1288
- if (!functionsEqual(objA[keysA[i]], objB[keysA[i]])) {
1289
- return false;
1290
- }
1291
- } else if (!Object.hasOwnProperty.call(objB, keysA[i]) || !(0, import_lodash.default)(objA[keysA[i]], objB[keysA[i]])) {
1292
- return false;
1331
+ const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
1332
+ const dayJSObj = dayjsWithPlugins_default.utc(value).utc();
1333
+ if (!dayJSObj.isValid()) {
1334
+ return value;
1293
1335
  }
1294
- }
1295
- return true;
1296
- };
1297
- var difference = (objA, objB) => {
1298
- const diff = [];
1299
- Object.keys(Object.assign({}, objA, objB)).forEach((key) => {
1300
- if (typeof objA[key] === "function" && typeof objB[key] === "function") {
1301
- if (!functionsEqual(objA[key], objB[key])) {
1302
- diff.push({
1303
- key,
1304
- objA: objA[key],
1305
- objB: objB[key]
1306
- });
1307
- }
1308
- } else if (!Object.is(objA[key], objB[key])) {
1309
- diff.push({
1310
- key,
1311
- objA: objA[key],
1312
- objB: objB[key]
1313
- });
1336
+ let date = value;
1337
+ if (day) {
1338
+ date = dayJSObj.format(dayMonthYearFormat);
1339
+ } else if (month) {
1340
+ date = dayJSObj.format(monthYearFormat);
1341
+ } else if (week) {
1342
+ } else if (year) {
1343
+ date = year;
1314
1344
  }
1315
- });
1316
- return diff;
1317
- };
1318
- var rotateArray = (array, n) => {
1319
- const rotated = [...array];
1320
- n = n % array.length;
1321
- if (n < 0)
1322
- n = array.length + n;
1323
- for (let i = 0; i < n; i++) {
1324
- rotated.unshift(rotated.pop());
1345
+ return date;
1325
1346
  }
1326
- return rotated;
1327
- };
1328
- var onlyUnique = (value, index, self) => {
1329
- return self.indexOf(value) === index;
1347
+ return value;
1330
1348
  };
1331
- var makeEmptyArray = (w, h, value = "") => {
1332
- var arr = [];
1333
- for (let i = 0; i < h; i++) {
1334
- arr[i] = [];
1335
- for (let j = 0; j < w; j++) {
1336
- arr[i][j] = value;
1337
- }
1349
+ var formatDateType = (element, column, config = dataFormattingDefault) => {
1350
+ if (isNumber(element)) {
1351
+ return formatEpochDate(element, column, config);
1338
1352
  }
1339
- return arr;
1340
- };
1341
-
1342
- // src/HelperFns/displayTypeHelpers.ts
1343
- var isChartType = (type) => CHART_TYPES.includes(type);
1344
- var isTableType = (type) => TABLE_TYPES.includes(type);
1345
- var isDisplayTypeValid = (response, displayType, dataLength, pivotDataLength, columns, isDataLimited) => {
1346
- var _a, _b;
1347
- const supportedDisplayTypes = getSupportedDisplayTypes({
1348
- response,
1349
- columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
1350
- dataLength,
1351
- pivotDataLength,
1352
- isDataLimited
1353
- });
1354
- const isValid = displayType && supportedDisplayTypes.includes(displayType);
1355
- return isValid;
1353
+ return formatISODateWithPrecision(element, column, config);
1356
1354
  };
1357
- var shouldPlotMultiSeries = (columns) => {
1358
- if (isAggregation(columns)) {
1359
- return false;
1355
+ var formatDateStringType = (element, column, config = dataFormattingDefault) => {
1356
+ if (!column) {
1357
+ return element;
1360
1358
  }
1361
- const multiSeriesIndex = columns.findIndex((col) => col.multi_series === true);
1362
- return multiSeriesIndex >= 0;
1359
+ if (column.precision) {
1360
+ return formatStringDateWithPrecision(element, column);
1361
+ }
1362
+ return formatStringDate(element, config);
1363
1363
  };
1364
- var supportsPieChart = (columns, chartData) => {
1365
- if (shouldPlotMultiSeries(columns)) {
1366
- return false;
1364
+ var formatISODateWithPrecision = (value, col, config = dataFormattingDefault) => {
1365
+ if (!value) {
1366
+ return void 0;
1367
1367
  }
1368
- if (chartData) {
1369
- return chartData.length < 7;
1368
+ if (!col) {
1369
+ return value;
1370
1370
  }
1371
- return true;
1372
- };
1373
- var supports2DCharts = (columns, dataLength) => {
1374
- if (dataLength <= 1) {
1375
- return false;
1371
+ const precision = col.precision;
1372
+ const { dayMonthYearFormat, monthYearFormat } = getDataFormatting(config);
1373
+ const dateDayJS = dayjsWithPlugins_default.utc(value).utc();
1374
+ if (!dateDayJS.isValid()) {
1375
+ return value;
1376
1376
  }
1377
- const { amountOfNumberColumns, amountOfStringColumns } = getColumnTypeAmounts(columns);
1378
- return amountOfNumberColumns > 0 && amountOfStringColumns > 0;
1379
- };
1380
- var supportsRegularPivotTable = (columns, dataLength, data) => {
1381
- var _a, _b;
1382
- if (dataLength <= 1) {
1383
- return false;
1377
+ let date = dateDayJS.format(dayMonthYearFormat);
1378
+ try {
1379
+ switch (precision) {
1380
+ case "DAY" /* DAY */: {
1381
+ break;
1382
+ }
1383
+ case "WEEK" /* WEEK */: {
1384
+ const dateJSStart = dateDayJS.startOf("week").format("MMM D");
1385
+ const dateJSEnd = dateDayJS.endOf("week").format("MMM D");
1386
+ const week = dateDayJS.week();
1387
+ const year = dateDayJS.format("YYYY");
1388
+ date = `${dateJSStart} - ${dateJSEnd}, ${year} (Week ${week})`;
1389
+ break;
1390
+ }
1391
+ case "MONTH" /* MONTH */: {
1392
+ date = dateDayJS.format(monthYearFormat);
1393
+ break;
1394
+ }
1395
+ case "QUARTER" /* QUARTER */: {
1396
+ const quarter = dateDayJS.quarter();
1397
+ const year = dateDayJS.format("YYYY");
1398
+ date = `${year}-Q${quarter}`;
1399
+ break;
1400
+ }
1401
+ case "YEAR" /* YEAR */: {
1402
+ date = dateDayJS.format("YYYY");
1403
+ break;
1404
+ }
1405
+ case "DATE_HOUR" /* DATE_HOUR */: {
1406
+ date = dateDayJS.format(`${dayMonthYearFormat} h:00A`);
1407
+ break;
1408
+ }
1409
+ case "DATE_MINUTE" /* DATE_MINUTE */: {
1410
+ date = dateDayJS.format(`${dayMonthYearFormat} h:mmA`);
1411
+ break;
1412
+ }
1413
+ default: {
1414
+ break;
1415
+ }
1416
+ }
1417
+ return date;
1418
+ } catch (error) {
1419
+ console.error(error);
1384
1420
  }
1385
- const groupbyColumns = getGroupableColumns(columns);
1386
- const hasTwoGroupables = (groupbyColumns == null ? void 0 : groupbyColumns.length) === 2;
1387
- if (!hasTwoGroupables) {
1388
- return false;
1421
+ };
1422
+ var formatEpochDate = (value, col, config = dataFormattingDefault) => {
1423
+ if (!value) {
1424
+ return void 0;
1389
1425
  }
1390
- const visibleColumns = getVisibleColumns(columns);
1391
- const groupbyColumn1 = columns[groupbyColumns[0]];
1392
- const groupbyColumn2 = columns[groupbyColumns[1]];
1393
- if (!groupbyColumn1.is_visible || !groupbyColumn2.is_visible || !((visibleColumns == null ? void 0 : visibleColumns.length) >= 3)) {
1394
- return false;
1426
+ if (!col) {
1427
+ return value;
1395
1428
  }
1396
- const column1Data = (data == null ? void 0 : data.map((row) => {
1397
- return row[groupbyColumns[0]];
1398
- })) ?? [];
1399
- const column2Data = (data == null ? void 0 : data.map((row) => {
1400
- return row[groupbyColumns[1]];
1401
- })) ?? [];
1402
- const uniqueData1Length = ((_a = column1Data == null ? void 0 : column1Data.filter(onlyUnique)) == null ? void 0 : _a.length) ?? 0;
1403
- const uniqueData2Length = ((_b = column2Data == null ? void 0 : column2Data.filter(onlyUnique)) == null ? void 0 : _b.length) ?? 0;
1404
- if (uniqueData1Length > MAX_LEGEND_LABELS && uniqueData2Length > MAX_LEGEND_LABELS) {
1405
- console.debug(
1406
- `Info: Pivot table will not be supported since there are too many unique fields. The calculated dimensions would be: ${uniqueData1Length} x ${uniqueData2Length}`
1407
- );
1408
- return false;
1429
+ try {
1430
+ const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
1431
+ const year = "YYYY";
1432
+ const monthYear = monthYearFormat;
1433
+ const dayMonthYear = dayMonthYearFormat;
1434
+ const title = col.title;
1435
+ let dayJSObj;
1436
+ if (isNaN(parseFloat(value))) {
1437
+ dayJSObj = dayjsWithPlugins_default.utc(value).utc();
1438
+ } else {
1439
+ dayJSObj = dayjsWithPlugins_default.unix(value).utc();
1440
+ }
1441
+ if (!dayJSObj.isValid()) {
1442
+ return value;
1443
+ }
1444
+ let date = dayJSObj.format(dayMonthYear);
1445
+ if (isNaN(parseFloat(value))) {
1446
+ if (title && title.toLowerCase().includes("year")) {
1447
+ date = dayJSObj.format(year);
1448
+ } else if (title && title.toLowerCase().includes("month")) {
1449
+ date = dayJSObj.format(monthYear);
1450
+ }
1451
+ date = dayJSObj.format(dayMonthYear);
1452
+ } else if (title && title.toLowerCase().includes("year")) {
1453
+ date = dayJSObj.format(year);
1454
+ } else if (title && title.toLowerCase().includes("month")) {
1455
+ date = dayJSObj.format(monthYear);
1456
+ }
1457
+ return date;
1458
+ } catch (error) {
1459
+ console.error(error);
1460
+ return value;
1409
1461
  }
1410
- return true;
1411
1462
  };
1412
- var supportsDatePivotTable = (columns) => {
1413
- var _a;
1414
- const dateColumnIndex = columns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
1415
- const dateColumn = columns[dateColumnIndex];
1416
- return dateColumn && ((_a = dateColumn == null ? void 0 : dateColumn.display_name) == null ? void 0 : _a.toLowerCase().includes("month")) && (columns == null ? void 0 : columns.length) === 2;
1463
+ var formatDOW = (value, col) => {
1464
+ let dowStyle = col.dow_style;
1465
+ if (!dowStyle) {
1466
+ dowStyle = "NUM_1_MON";
1467
+ }
1468
+ let formattedValue = value;
1469
+ let weekdayNumber = Number(value);
1470
+ switch (dowStyle) {
1471
+ case "NUM_1_MON": {
1472
+ const weekdays = WEEKDAY_NAMES_MON;
1473
+ const index = weekdayNumber - 1;
1474
+ if (index >= 0) {
1475
+ formattedValue = weekdays[index];
1476
+ } else {
1477
+ console.warn(`dow style is NUM_1_MON but the value could not be converted to a number: ${value}`);
1478
+ }
1479
+ break;
1480
+ }
1481
+ case "NUM_1_SUN": {
1482
+ const weekdays = WEEKDAY_NAMES_SUN;
1483
+ const index = weekdayNumber - 1;
1484
+ if (index >= 0) {
1485
+ formattedValue = weekdays[index];
1486
+ } else {
1487
+ console.warn(`dow style is NUM_1_SUN but the value could not be converted to a number: ${value}`);
1488
+ }
1489
+ break;
1490
+ }
1491
+ case "NUM_0_MON": {
1492
+ const weekdays = WEEKDAY_NAMES_MON;
1493
+ if (weekdayNumber >= 0) {
1494
+ formattedValue = weekdays[weekdayNumber];
1495
+ } else {
1496
+ console.warn(`dow style is NUM_0_MON but the value could not be converted to a number: ${value}`);
1497
+ }
1498
+ break;
1499
+ }
1500
+ case "NUM_0_SUN": {
1501
+ const weekdays = WEEKDAY_NAMES_SUN;
1502
+ if (weekdayNumber >= 0) {
1503
+ formattedValue = weekdays[weekdayNumber];
1504
+ } else {
1505
+ console.warn(`dow style is NUM_0_SUN but the value could not be converted to a number: ${value}`);
1506
+ }
1507
+ break;
1508
+ }
1509
+ case "ALPHA_MON":
1510
+ case "ALPHA_SUN": {
1511
+ const weekday = WEEKDAY_NAMES_MON.find((weekday2) => weekday2.toLowerCase().includes(value.trim().toLowerCase()));
1512
+ if (weekday) {
1513
+ formattedValue = weekday;
1514
+ } else {
1515
+ console.warn(`dow style is ALPHA but the value could not be matched to a weekday name: ${value}`);
1516
+ }
1517
+ break;
1518
+ }
1519
+ default: {
1520
+ console.warn(`could not format dow value. dow_style was not recognized: ${col.dow_style}`);
1521
+ break;
1522
+ }
1523
+ }
1524
+ return formattedValue;
1417
1525
  };
1418
- var isSingleValueResponse = (response) => {
1419
- var _a, _b, _c, _d, _e, _f;
1420
- if (!response) {
1421
- return false;
1526
+ var dateStringSortFnWithoutPrecision = (a, b) => {
1527
+ if (a.includes("-W")) {
1528
+ const aDateYear = a.substring(0, 4);
1529
+ const bDateYear = b.substring(0, 4);
1530
+ if (aDateYear !== bDateYear) {
1531
+ return aDateYear - bDateYear;
1532
+ } else {
1533
+ const aDateWeek = a.substring(6, 8);
1534
+ const bDateWeek = b.substring(6, 8);
1535
+ return aDateWeek - bDateWeek;
1536
+ }
1537
+ } else if (WEEKDAY_NAMES_MON.includes(a.trim())) {
1538
+ const aDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(a.trim().toLowerCase()));
1539
+ const bDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(b.trim().toLowerCase()));
1540
+ let sortValue = a - b;
1541
+ if (aDayIndex >= 0 && bDayIndex >= 0) {
1542
+ sortValue = aDayIndex - bDayIndex;
1543
+ }
1544
+ return sortValue;
1545
+ } else if (MONTH_NAMES.includes(a.trim())) {
1546
+ const aMonthIndex = MONTH_NAMES.findIndex((m) => m === a.trim());
1547
+ const bMonthIndex = MONTH_NAMES.findIndex((m) => m === b.trim());
1548
+ if (aMonthIndex >= 0 && bMonthIndex >= 0) {
1549
+ return bMonthIndex - aMonthIndex;
1550
+ }
1551
+ return a - b;
1552
+ } else if (SEASON_NAMES.includes(a.substr(0, 2))) {
1553
+ const aSeasonIndex = SEASON_NAMES.findIndex((s) => s === a.substr(0, 2));
1554
+ const bSeasonIndex = SEASON_NAMES.findIndex((s) => s === b.substr(0, 2));
1555
+ const aYear = Number(a.substr(2));
1556
+ const bYear = Number(b.substr(2));
1557
+ if (aYear === bYear) {
1558
+ return aSeasonIndex - bSeasonIndex;
1559
+ }
1560
+ return aYear - bYear;
1422
1561
  }
1423
- const rows = (_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.rows;
1424
- const columns = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.columns;
1425
- const referenceID = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.reference_id;
1426
- const hasNoData = rows && !(rows == null ? void 0 : rows.length);
1427
- const hasOneColumn = (columns == null ? void 0 : columns.length) === 1;
1428
- if (hasNoData && hasOneColumn && referenceID === "1.1.211") {
1429
- return true;
1562
+ return a - b;
1563
+ };
1564
+ var dateStringSortFn = (a, b, col) => {
1565
+ if (typeof a !== "string" || typeof b !== "string" || !col) {
1566
+ return a - b;
1430
1567
  }
1431
- const oneRowAndColumn = (rows == null ? void 0 : rows.length) === 1 && ((_f = rows[0]) == null ? void 0 : _f.length) === 1;
1432
- if (oneRowAndColumn) {
1433
- return true;
1568
+ const aTrimmed = a.trim();
1569
+ const bTrimmed = b.trim();
1570
+ switch (col.precision) {
1571
+ case "DOW": {
1572
+ const dowStyle = col.dow_style ?? "ALPHA_MON";
1573
+ let aIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
1574
+ let bIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
1575
+ if (dowStyle === "ALPHA_SUN") {
1576
+ aIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
1577
+ bIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
1578
+ }
1579
+ return aIndex - bIndex;
1580
+ }
1581
+ case "HOUR":
1582
+ case "MINUTE": {
1583
+ const aDayjsTime = dayjsWithPlugins_default.utc(aTrimmed, "THH:mm:ss.SSSZ").utc();
1584
+ const bDayjsTime = dayjsWithPlugins_default.utc(bTrimmed, "THH:mm:ss.SSSZ").utc();
1585
+ return aDayjsTime.unix() - bDayjsTime.unix();
1586
+ }
1587
+ case "MONTH": {
1588
+ MONTH_NAMES;
1589
+ const aMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === aTrimmed.toLowerCase());
1590
+ const bMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === bTrimmed.toLowerCase());
1591
+ return aMonthIndex - bMonthIndex;
1592
+ }
1593
+ default: {
1594
+ return dateStringSortFnWithoutPrecision(aTrimmed, bTrimmed);
1595
+ }
1434
1596
  }
1435
- return false;
1436
1597
  };
1437
- var getSupportedDisplayTypes = ({
1438
- response,
1439
- columns,
1440
- dataLength,
1441
- pivotDataLength,
1442
- isDataLimited
1443
- } = {}) => {
1444
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1598
+ var dateSortFn = (a, b, col, isTable) => {
1445
1599
  try {
1446
- if (!((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.display_type)) {
1447
- return [];
1600
+ if (!a && !b) {
1601
+ return 0;
1602
+ } else if (!a && b) {
1603
+ return 1;
1604
+ } else if (a && !b || !col) {
1605
+ return -1;
1448
1606
  }
1449
- const displayType = response.data.data.display_type;
1450
- if (displayType === "suggestion" || displayType === "help" || displayType === "html") {
1451
- return [displayType];
1607
+ let aDate = Number(a);
1608
+ let bDate = Number(b);
1609
+ let sortValue = aDate - bDate;
1610
+ if (isNaN(aDate) || isNaN(bDate)) {
1611
+ if (col.type === "DATE_STRING") {
1612
+ sortValue = dateStringSortFn(a, b, col);
1613
+ } else {
1614
+ sortValue = dayjsWithPlugins_default.utc(a).unix() - dayjsWithPlugins_default.utc(b).unix();
1615
+ }
1452
1616
  }
1453
- const rows = ((_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.rows) ?? [];
1454
- const allColumns = columns || ((_f = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.data) == null ? void 0 : _f.columns);
1455
- const visibleColumns = getVisibleColumns(allColumns);
1456
- if (!(visibleColumns == null ? void 0 : visibleColumns.length)) {
1457
- return ["text"];
1617
+ if (isTable && col.precision === "DOW") {
1618
+ sortValue = -1 * sortValue;
1458
1619
  }
1459
- if (isSingleValueResponse(response)) {
1460
- return ["single-value"];
1620
+ return sortValue;
1621
+ } catch (error) {
1622
+ console.error(error);
1623
+ return -1;
1624
+ }
1625
+ };
1626
+ var sortDataByDate = (data, tableColumns, sortDirection = "desc", isTable) => {
1627
+ try {
1628
+ if (!data || typeof data !== "object") {
1629
+ throw new Error("Could not sort data by date - no data supplied");
1461
1630
  }
1462
- if (!(rows == null ? void 0 : rows.length)) {
1463
- return ["table"];
1631
+ const dateColumnIndex = getDateColumnIndex(tableColumns);
1632
+ const dateColumn = tableColumns[dateColumnIndex];
1633
+ if (dateColumnIndex >= 0) {
1634
+ let multiplier = sortDirection === "desc" ? -1 : 1;
1635
+ const sortedData = [...data].sort(
1636
+ (a, b) => multiplier * dateSortFn(a[dateColumnIndex], b[dateColumnIndex], dateColumn, isTable)
1637
+ );
1638
+ return sortedData;
1464
1639
  }
1465
- const maxRowsForPieChart = 10;
1466
- const numRows = dataLength ?? rows.length;
1467
- let pivotDataHasLength = true;
1468
- const pivotDataLengthProvided = pivotDataLength !== void 0 && pivotDataLength !== null;
1469
- if (pivotDataLengthProvided) {
1470
- pivotDataHasLength = !!pivotDataLength;
1640
+ } catch (error) {
1641
+ console.error(error);
1642
+ }
1643
+ return data;
1644
+ };
1645
+ var formatElement = ({
1646
+ element,
1647
+ column,
1648
+ config = dataFormattingDefault,
1649
+ htmlElement,
1650
+ isChart = false
1651
+ }) => {
1652
+ try {
1653
+ let formattedElement = element;
1654
+ const { currencyCode, languageCode, currencyDecimals, quantityDecimals, ratioDecimals } = getDataFormatting(config);
1655
+ let type = column == null ? void 0 : column.type;
1656
+ if (isChart && ["count", "deviation", "variance"].includes(column == null ? void 0 : column.aggType)) {
1657
+ type = "QUANTITY";
1658
+ }
1659
+ if (column) {
1660
+ switch (type) {
1661
+ case "STRING": {
1662
+ break;
1663
+ }
1664
+ case "DOLLAR_AMT": {
1665
+ const elementNumber = parseFloat(`${element}`);
1666
+ if (!isNaN(elementNumber)) {
1667
+ const currency = currencyCode || "USD";
1668
+ const validatedCurrencyDecimals = currencyDecimals || currencyDecimals === 0 ? currencyDecimals : void 0;
1669
+ try {
1670
+ formattedElement = new Intl.NumberFormat(languageCode, {
1671
+ style: "currency",
1672
+ currency: `${currency}`,
1673
+ minimumFractionDigits: validatedCurrencyDecimals,
1674
+ maximumFractionDigits: validatedCurrencyDecimals
1675
+ }).format(elementNumber);
1676
+ } catch (error) {
1677
+ console.error(error);
1678
+ formattedElement = new Intl.NumberFormat(languageCode, {
1679
+ style: "currency",
1680
+ currency: "USD",
1681
+ minimumFractionDigits: validatedCurrencyDecimals,
1682
+ maximumFractionDigits: validatedCurrencyDecimals
1683
+ }).format(elementNumber);
1684
+ }
1685
+ }
1686
+ break;
1687
+ }
1688
+ case "QUANTITY": {
1689
+ const validatedQuantityDecimals = !isNaN(quantityDecimals) ? quantityDecimals : 2;
1690
+ const elementNumber = parseFloat(`${element}`);
1691
+ if (!isNaN(elementNumber)) {
1692
+ const numDecimals = elementNumber % 1 !== 0 ? validatedQuantityDecimals : 0;
1693
+ formattedElement = new Intl.NumberFormat(languageCode, {
1694
+ minimumFractionDigits: numDecimals,
1695
+ maximumFractionDigits: numDecimals
1696
+ }).format(elementNumber);
1697
+ }
1698
+ break;
1699
+ }
1700
+ case "DATE": {
1701
+ formattedElement = formatDateType(element, column, config);
1702
+ break;
1703
+ }
1704
+ case "DATE_STRING": {
1705
+ formattedElement = formatDateStringType(element, column, config);
1706
+ break;
1707
+ }
1708
+ case "RATIO": {
1709
+ const numDecimals = !isNaN(ratioDecimals) ? ratioDecimals : 4;
1710
+ const elementNumber = parseFloat(`${element}`);
1711
+ if (!isNaN(elementNumber)) {
1712
+ formattedElement = new Intl.NumberFormat(languageCode, {
1713
+ minimumFractionDigits: numDecimals,
1714
+ maximumFractionDigits: numDecimals
1715
+ }).format(elementNumber);
1716
+ }
1717
+ break;
1718
+ }
1719
+ case "PERCENT": {
1720
+ const elementNumber = parseFloat(`${element}`);
1721
+ if (!isNaN(elementNumber)) {
1722
+ const p = elementNumber / 100;
1723
+ formattedElement = new Intl.NumberFormat(languageCode, {
1724
+ style: "percent",
1725
+ minimumFractionDigits: 2,
1726
+ maximumFractionDigits: 2
1727
+ }).format(p);
1728
+ if (htmlElement) {
1729
+ if (elementNumber < 0) {
1730
+ htmlElement.classList.add("comparison-value-negative");
1731
+ } else if (elementNumber > 0) {
1732
+ htmlElement.classList.add("comparison-value-positive");
1733
+ }
1734
+ }
1735
+ }
1736
+ break;
1737
+ }
1738
+ default: {
1739
+ break;
1740
+ }
1741
+ }
1742
+ }
1743
+ return formattedElement;
1744
+ } catch (error) {
1745
+ console.error(error);
1746
+ return element;
1747
+ }
1748
+ };
1749
+ var getNumberFormatConfig = (d, scale) => {
1750
+ var _a, _b;
1751
+ let minimumFractionDigits = 0;
1752
+ let maximumFractionDigits = 0;
1753
+ let notation;
1754
+ const domainRange = ((_a = scale == null ? void 0 : scale.domain()) == null ? void 0 : _a[1]) - ((_b = scale == null ? void 0 : scale.domain()) == null ? void 0 : _b[0]);
1755
+ const smallDomain = domainRange && domainRange < 10;
1756
+ const absValue = Math.abs(d);
1757
+ if (smallDomain) {
1758
+ minimumFractionDigits = 2;
1759
+ maximumFractionDigits = 2;
1760
+ } else if (absValue >= 1e3) {
1761
+ notation = "compact";
1762
+ if (absValue > 1e9) {
1763
+ maximumFractionDigits = 3;
1764
+ } else if (absValue > 1e6) {
1765
+ maximumFractionDigits = 2;
1766
+ } else if (absValue > 1e3) {
1767
+ maximumFractionDigits = 1;
1471
1768
  }
1472
- if (supportsRegularPivotTable(visibleColumns, numRows, (_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.rows)) {
1473
- const supportedDisplayTypes = ["table"];
1474
- if (!isDataLimited) {
1475
- supportedDisplayTypes.push("pivot_table");
1769
+ }
1770
+ return { minimumFractionDigits, maximumFractionDigits, notation };
1771
+ };
1772
+ var formatChartLabel = ({ d, scale, column, dataFormatting, maxLabelWidth }) => {
1773
+ if (d === null) {
1774
+ return {
1775
+ fullWidthLabel: "Untitled Category",
1776
+ formattedLabel: "Untitled Category"
1777
+ };
1778
+ }
1779
+ const col = column ?? (scale == null ? void 0 : scale.column);
1780
+ if (!col || !col.type) {
1781
+ return {
1782
+ fullWidthLabel: d,
1783
+ formattedLabel: d
1784
+ };
1785
+ }
1786
+ const config = (scale == null ? void 0 : scale.dataFormatting) ?? dataFormatting;
1787
+ const { currencyCode, languageCode } = config;
1788
+ let type = col.type;
1789
+ if ((scale == null ? void 0 : scale.units) === "none") {
1790
+ type = "QUANTITY";
1791
+ }
1792
+ const { minimumFractionDigits, maximumFractionDigits, notation } = getNumberFormatConfig(d, scale);
1793
+ let formattedLabel = d;
1794
+ if (scale == null ? void 0 : scale.showLabelDecimals) {
1795
+ formattedLabel = formatElement({
1796
+ element: d,
1797
+ column: column ?? (scale == null ? void 0 : scale.column),
1798
+ config: dataFormatting,
1799
+ isChart: true
1800
+ });
1801
+ } else {
1802
+ switch (type) {
1803
+ case "STRING": {
1804
+ break;
1476
1805
  }
1477
- if (
1478
- // Comment out for now so chart row count doesnt change display type
1479
- // numRows <= maxRowsForPivot &&
1480
- pivotDataHasLength
1481
- ) {
1482
- supportedDisplayTypes.push("stacked_column", "stacked_bar", "column", "bar", "bubble", "heatmap");
1483
- if (hasDateColumn(visibleColumns)) {
1484
- supportedDisplayTypes.push("stacked_line", "line");
1806
+ case "DOLLAR_AMT": {
1807
+ if (Number(d) || Number(d) === 0) {
1808
+ const style = "currency";
1809
+ const currency = currencyCode || "USD";
1810
+ const currencyConfig = {
1811
+ style,
1812
+ minimumFractionDigits,
1813
+ maximumFractionDigits,
1814
+ notation
1815
+ };
1816
+ try {
1817
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1818
+ ...currencyConfig,
1819
+ currency
1820
+ }).format(d);
1821
+ } catch (error) {
1822
+ console.error(error);
1823
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1824
+ ...currencyConfig,
1825
+ currency: "USD"
1826
+ }).format(d);
1827
+ }
1485
1828
  }
1829
+ break;
1486
1830
  }
1487
- return supportedDisplayTypes;
1488
- } else if (supports2DCharts(visibleColumns, numRows)) {
1489
- const supportedDisplayTypes = ["table", "column", "bar"];
1490
- if (numRows > MIN_HISTOGRAM_SAMPLE) {
1491
- supportedDisplayTypes.push("histogram");
1492
- }
1493
- if (hasDateColumn(visibleColumns)) {
1494
- supportedDisplayTypes.push("line");
1831
+ case "QUANTITY": {
1832
+ if (!isNaN(parseFloat(d))) {
1833
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1834
+ minimumFractionDigits,
1835
+ maximumFractionDigits,
1836
+ notation
1837
+ }).format(d);
1838
+ }
1839
+ break;
1495
1840
  }
1496
- if (numRows > 1 && numRows <= maxRowsForPieChart) {
1497
- supportedDisplayTypes.push("pie");
1841
+ case "DATE": {
1842
+ formattedLabel = formatDateType(d, col, config);
1843
+ break;
1498
1844
  }
1499
- const { amountOfNumberColumns } = getColumnTypeAmounts(visibleColumns);
1500
- if (amountOfNumberColumns > 1) {
1501
- supportedDisplayTypes.push("column_line");
1502
- supportedDisplayTypes.push("scatterplot");
1845
+ case "DATE_STRING": {
1846
+ formattedLabel = formatDateStringType(d, col, config);
1847
+ break;
1503
1848
  }
1504
- if (!isDataLimited && supportsDatePivotTable(visibleColumns)) {
1505
- const dateColumnIndex = visibleColumns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
1506
- const dateColumn = visibleColumns[dateColumnIndex];
1507
- const data = (_j = (_i = response == null ? void 0 : response.data) == null ? void 0 : _i.data) == null ? void 0 : _j.rows;
1508
- const uniqueYears = [];
1509
- data.forEach((row) => {
1510
- const year = formatElement({
1511
- element: row[dateColumnIndex],
1512
- column: dateColumn,
1513
- config: getDataFormatting({ monthYearFormat: "YYYY", dayMonthYearFormat: "YYYY" })
1514
- });
1515
- if (!uniqueYears.includes(year)) {
1516
- uniqueYears.push(year);
1517
- }
1518
- });
1519
- if (uniqueYears.length > 1) {
1520
- supportedDisplayTypes.push("pivot_table");
1849
+ case "PERCENT": {
1850
+ if (Number(d) || Number(d) === 0) {
1851
+ const p = Number(d) / 100;
1852
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1853
+ style: "percent",
1854
+ minimumFractionDigits: 1,
1855
+ maximumFractionDigits: 1
1856
+ }).format(p);
1521
1857
  }
1858
+ break;
1859
+ }
1860
+ default: {
1861
+ break;
1522
1862
  }
1523
- return supportedDisplayTypes;
1524
1863
  }
1525
- return ["table"];
1526
- } catch (error) {
1527
- console.error(error);
1528
- return ["table"];
1529
1864
  }
1530
- };
1531
- var getFirstChartDisplayType = (supportedDisplayTypes, fallback) => {
1532
- const chartType = supportedDisplayTypes.find((displayType) => isChartType(displayType));
1533
- if (chartType) {
1534
- return chartType;
1865
+ const fullWidthLabel = formattedLabel;
1866
+ if (typeof formattedLabel === "string" && maxLabelWidth && formattedLabel.length > maxLabelWidth) {
1867
+ formattedLabel = `${formattedLabel.substring(0, maxLabelWidth)}...`;
1535
1868
  }
1536
- return fallback;
1869
+ return { fullWidthLabel, formattedLabel };
1537
1870
  };
1538
- var getDefaultDisplayType = (response, defaultToChart, columns, dataLength, pivotDataLength, preferredDisplayType, isDataLimited = false) => {
1539
- var _a, _b, _c, _d, _e, _f, _g, _h;
1540
- const supportedDisplayTypes = getSupportedDisplayTypes({
1541
- response,
1542
- columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
1543
- dataLength,
1544
- pivotDataLength,
1545
- isDataLimited
1546
- });
1547
- if (preferredDisplayType && supportedDisplayTypes.includes(preferredDisplayType)) {
1548
- return preferredDisplayType;
1549
- }
1550
- const responseDisplayType = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.display_type;
1551
- if (supportedDisplayTypes.includes(preferredDisplayType)) {
1552
- return preferredDisplayType;
1553
- }
1554
- if (responseDisplayType === "suggestion" || responseDisplayType === "help" || responseDisplayType === "html") {
1555
- return responseDisplayType;
1871
+ var getCurrencySymbol = (dataFormatting = dataFormattingDefault) => {
1872
+ var _a;
1873
+ try {
1874
+ const { currencyCode, languageCode } = getDataFormatting(dataFormatting);
1875
+ const formattedParts = new Intl.NumberFormat(languageCode, {
1876
+ style: "currency",
1877
+ currency: currencyCode
1878
+ }).formatToParts(0);
1879
+ const symbol = (_a = formattedParts.find((part) => (part == null ? void 0 : part.type) === "currency")) == null ? void 0 : _a.value;
1880
+ return symbol;
1881
+ } catch (error) {
1882
+ console.error(error);
1883
+ return;
1556
1884
  }
1557
- if (supportedDisplayTypes.length === 1) {
1558
- return supportedDisplayTypes[0];
1885
+ };
1886
+ var getDayjsObjForStringType = (value, col) => {
1887
+ if (!value) {
1888
+ return void 0;
1559
1889
  }
1560
- if (supportedDisplayTypes.includes("pivot_table")) {
1561
- let displayType = "pivot_table";
1562
- if (defaultToChart) {
1563
- displayType = isAggregation((_f = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.data) == null ? void 0 : _f.columns) ? getFirstChartDisplayType(supportedDisplayTypes, "pivot_table") : "pivot_table";
1890
+ try {
1891
+ switch (col.precision) {
1892
+ case "DOW": {
1893
+ return void 0;
1894
+ }
1895
+ case "HOUR":
1896
+ case "MINUTE": {
1897
+ return dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1898
+ }
1899
+ case "MONTH": {
1900
+ return void 0;
1901
+ }
1902
+ default: {
1903
+ return void 0;
1904
+ }
1564
1905
  }
1565
- return displayType;
1906
+ } catch (error) {
1907
+ console.error(error);
1908
+ return void 0;
1566
1909
  }
1567
- if (!responseDisplayType && hasData(response) || responseDisplayType === "data") {
1568
- let displayType = "table";
1569
- if (defaultToChart) {
1570
- displayType = isAggregation((_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.columns) ? getFirstChartDisplayType(supportedDisplayTypes, "table") : "table";
1571
- }
1572
- return displayType;
1910
+ };
1911
+ var getDayJSObj = ({ value, column }) => {
1912
+ if (column.type === "DATE_STRING") {
1913
+ return getDayjsObjForStringType(value, column);
1573
1914
  }
1574
- return "text";
1915
+ if (isNumber(value)) {
1916
+ return dayjsWithPlugins_default.unix(value).utc();
1917
+ }
1918
+ return dayjsWithPlugins_default.utc(value).utc();
1575
1919
  };
1576
- var hasData = (response) => {
1577
- var _a, _b, _c;
1578
- if (!response) {
1579
- return false;
1920
+ var getEpochFromDate = (date, precision, precisionFrame) => {
1921
+ if (date == null ? void 0 : date.getTime) {
1922
+ if (precision && precisionFrame === "start") {
1923
+ return dayjsWithPlugins_default(date).utc().startOf(precision).valueOf();
1924
+ } else if (precision && precisionFrame === "end") {
1925
+ return dayjsWithPlugins_default(date).utc().endOf(precision).valueOf();
1926
+ }
1927
+ return date.getTime();
1580
1928
  }
1581
- return (_c = (_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.rows) == null ? void 0 : _c.length;
1929
+ return;
1582
1930
  };
1583
1931
 
1584
1932
  // src/HelperFns/domHelpers.ts
@@ -2437,7 +2785,8 @@ var getLinearScale = ({
2437
2785
  const config = getDataFormatting(dataFormatting);
2438
2786
  const colIndices = columnIndices ?? [columnIndex];
2439
2787
  const scaleRange = range ?? getRangeForAxis({ axis, height, width });
2440
- const axisColumns = (colIndices == null ? void 0 : colIndices.map((index) => columns[index])) ?? [];
2788
+ const axisColumns = (colIndices == null ? void 0 : colIndices.map((index) => columns == null ? void 0 : columns[index])) ?? [];
2789
+ console.log({ axisColumns });
2441
2790
  const axisTitle = title ?? getLinearAxisTitle({
2442
2791
  numberColumns: axisColumns,
2443
2792
  aggregated
@@ -2447,7 +2796,7 @@ var getLinearScale = ({
2447
2796
  scale.minValue = domainFinal[0];
2448
2797
  scale.maxValue = domainFinal[1];
2449
2798
  scale.columnIndex = columnIndex;
2450
- scale.column = columns[columnIndex];
2799
+ scale.column = columns == null ? void 0 : columns[columnIndex];
2451
2800
  scale.fields = axisColumns;
2452
2801
  scale.dataFormatting = config;
2453
2802
  scale.hasDropdown = hasDropdown ?? enableAxisDropdown;
@@ -2776,27 +3125,62 @@ var mergeBboxes = (boundingBoxes) => {
2776
3125
  return void 0;
2777
3126
  }
2778
3127
  };
3128
+
3129
+ // src/errorMessages.ts
3130
+ var GENERAL_ERROR = "Uh oh, Our system is experiencing an unexpected error. We're aware of this issue and are working to fix it as soon as possible.";
3131
+ var GENERAL_QUERY_ERROR = "Internal Service Error: Our system is experiencing an unexpected error. We're aware of this issue and are working to fix it as soon as possible.";
3132
+ var GENERAL_HTML_ERROR = "Internal Service Error: Our system is experiencing an unexpected error. We're aware of this issue and are working to fix it as soon as possible.";
3133
+ var UNAUTHENTICATED_ERROR = "Uh oh.. It looks like you don't have access to this resource. Please double check that all required authentication fields are correct.";
3134
+ var REQUEST_CANCELLED_ERROR = "Request cancelled";
2779
3135
  // Annotate the CommonJS export names for ESM import in node:
2780
3136
  0 && (module.exports = {
2781
3137
  AGG_TYPES,
2782
3138
  CHART_TYPES,
3139
+ COMPARE_TYPE,
3140
+ CONTINUOUS_TYPE,
3141
+ CUSTOM_TYPE,
3142
+ DATA_ALERT_CONDITION_TYPES,
3143
+ DATA_ALERT_ENABLED_STATUSES,
3144
+ DATA_ALERT_FREQUENCY_TYPE_OPTIONS,
3145
+ DATA_ALERT_OPERATORS,
3146
+ DATA_ALERT_STATUSES,
2783
3147
  DATE_ONLY_CHART_TYPES,
2784
3148
  DAYJS_PRECISION_FORMATS,
2785
3149
  DEFAULT_AGG_TYPE,
2786
3150
  DEFAULT_DATA_PAGE_SIZE,
3151
+ DEFAULT_EVALUATION_FREQUENCY,
3152
+ DEFAULT_SOURCE,
2787
3153
  DOUBLE_AXIS_CHART_TYPES,
2788
3154
  DOW_STYLES,
3155
+ DataExplorerTypes,
2789
3156
  DateUTC,
3157
+ EVALUATION_FREQUENCY_OPTIONS,
3158
+ EXISTS_TYPE,
3159
+ GENERAL_ERROR,
3160
+ GENERAL_HTML_ERROR,
3161
+ GENERAL_QUERY_ERROR,
3162
+ GROUP_TERM_TYPE,
2790
3163
  MAX_DATA_PAGE_SIZE,
2791
3164
  MAX_LEGEND_LABELS,
2792
3165
  MIN_HISTOGRAM_SAMPLE,
3166
+ MONTH_DAY_SELECT_OPTIONS,
2793
3167
  MONTH_NAMES,
3168
+ NUMBER_TERM_TYPE,
2794
3169
  NumberColumnTypeDisplayNames,
2795
3170
  NumberColumnTypes,
3171
+ PERIODIC_TYPE,
3172
+ PROJECT_TYPE,
2796
3173
  PrecisionTypes,
3174
+ QUERY_TERM_TYPE,
3175
+ REQUEST_CANCELLED_ERROR,
3176
+ RESET_PERIOD_OPTIONS,
3177
+ SCHEDULED_TYPE,
3178
+ SCHEDULE_FREQUENCY_OPTIONS,
3179
+ SCHEDULE_INTERVAL_OPTIONS,
2797
3180
  SEASON_NAMES,
2798
3181
  TABLE_TYPES,
2799
3182
  TimestampFormats,
3183
+ UNAUTHENTICATED_ERROR,
2800
3184
  WEEKDAY_NAMES_MON,
2801
3185
  WEEKDAY_NAMES_SUN,
2802
3186
  animateInputText,