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.mjs CHANGED
@@ -224,7 +224,7 @@ var isNumber = (str) => {
224
224
  return /^\d+$/.test(str);
225
225
  };
226
226
 
227
- // src/Constants/constants.ts
227
+ // src/Constants/visualizationConstants.ts
228
228
  var TABLE_TYPES = [
229
229
  "pivot_table",
230
230
  "pivot_column",
@@ -336,1093 +336,1413 @@ var AGG_TYPES = [
336
336
  var MAX_LEGEND_LABELS = 22;
337
337
  var MIN_HISTOGRAM_SAMPLE = 20;
338
338
 
339
- // src/Constants/enums.ts
340
- var TimestampFormats = /* @__PURE__ */ ((TimestampFormats2) => {
341
- TimestampFormats2["epoch"] = "EPOCH";
342
- TimestampFormats2["iso8601"] = "ISO8601";
343
- return TimestampFormats2;
344
- })(TimestampFormats || {});
345
- var PrecisionTypes = /* @__PURE__ */ ((PrecisionTypes2) => {
346
- PrecisionTypes2["DAY"] = "DAY";
347
- PrecisionTypes2["MONTH"] = "MONTH";
348
- PrecisionTypes2["YEAR"] = "YEAR";
349
- PrecisionTypes2["WEEK"] = "WEEK";
350
- PrecisionTypes2["QUARTER"] = "QUARTER";
351
- PrecisionTypes2["DATE_HOUR"] = "DATE_HOUR";
352
- PrecisionTypes2["DATE_MINUTE"] = "DATE_MINUTE";
353
- PrecisionTypes2["HOUR"] = "HOUR";
354
- PrecisionTypes2["MINUTE"] = "MINUTE";
355
- return PrecisionTypes2;
356
- })(PrecisionTypes || {});
357
- var NumberColumnTypes = /* @__PURE__ */ ((NumberColumnTypes2) => {
358
- NumberColumnTypes2["CURRENCY"] = "DOLLAR_AMT";
359
- NumberColumnTypes2["QUANTITY"] = "QUANTITY";
360
- NumberColumnTypes2["RATIO"] = "RATIO";
361
- NumberColumnTypes2["PERCENT"] = "PERCENT";
362
- return NumberColumnTypes2;
363
- })(NumberColumnTypes || {});
364
- var NumberColumnTypeDisplayNames = /* @__PURE__ */ ((NumberColumnTypeDisplayNames2) => {
365
- NumberColumnTypeDisplayNames2["DOLLAR_AMT"] = "Currency";
366
- NumberColumnTypeDisplayNames2["QUANTITY"] = "Quantity";
367
- NumberColumnTypeDisplayNames2["RATIO"] = "Ratio";
368
- NumberColumnTypeDisplayNames2["PERCENT"] = "Percent";
369
- return NumberColumnTypeDisplayNames2;
370
- })(NumberColumnTypeDisplayNames || {});
371
-
372
- // src/Constants/defaults.ts
373
- var authenticationDefault = {
374
- token: void 0,
375
- apiKey: void 0,
376
- domain: void 0,
377
- dprKey: void 0,
378
- dprDomain: void 0
379
- };
380
- var dataFormattingDefault = {
381
- timestampFormat: "ISO8601" /* iso8601 */,
382
- currencyCode: "USD",
383
- languageCode: "en-US",
384
- currencyDecimals: 2,
385
- quantityDecimals: 2,
386
- ratioDecimals: 4,
387
- comparisonDisplay: "PERCENT",
388
- monthYearFormat: "MMMM YYYY",
389
- dayMonthYearFormat: "ll"
390
- };
391
- var autoQLConfigDefault = {
392
- debug: false,
393
- test: false,
394
- enableAutocomplete: true,
395
- enableQueryInterpretation: true,
396
- enableQueryValidation: true,
397
- enableQuerySuggestions: true,
398
- enableColumnVisibilityManager: true,
399
- enableDrilldowns: true,
400
- enableNotifications: false,
401
- enableCSVDownload: true,
402
- enableReportProblem: true
403
- };
404
- var dataConfigDefault = {
405
- stringColumnIndices: [],
406
- numberColumnIndices: [],
407
- stringColumnIndex: 0,
408
- legendColumnIndex: void 0,
409
- numberColumnIndex: 1
410
- };
411
- var getAuthentication = (prop = {}) => {
412
- return {
413
- ...authenticationDefault,
414
- ...prop
415
- };
416
- };
417
- var getDataFormatting = (prop = {}) => {
418
- return {
419
- ...dataFormattingDefault,
420
- ...prop
421
- };
339
+ // src/HelperFns/arrayHelpers.ts
340
+ import isEqual from "lodash.isequal";
341
+ var invertArray = (array) => {
342
+ const numRows = array.length;
343
+ const numColumns = array[0].length;
344
+ const invertedArray = [];
345
+ for (let i = 0; i < numColumns; i++) {
346
+ invertedArray[i] = [];
347
+ for (let j = 0; j < numRows; j++) {
348
+ if (array[j][i])
349
+ invertedArray[i][j] = array[j][i];
350
+ }
351
+ }
352
+ return invertedArray;
422
353
  };
423
- var getAutoQLConfig = (prop = {}) => {
424
- return {
425
- ...autoQLConfigDefault,
426
- ...prop
427
- };
354
+ var functionsEqual = (a, b) => {
355
+ return (a == null ? void 0 : a.toString()) == (b == null ? void 0 : b.toString());
428
356
  };
429
- var getDataConfig = (prop = {}) => {
430
- return {
431
- ...dataConfigDefault,
432
- ...prop
433
- };
357
+ var isObject = (obj) => {
358
+ return typeof obj === "object" && !Array.isArray(obj) && obj !== null && obj !== void 0;
434
359
  };
435
-
436
- // src/HelperFns/dataFormattingHelpers.ts
437
- var formatStringDateWithPrecision = (value, col) => {
438
- if (!value) {
439
- return void 0;
360
+ var deepEqual = (objA, objB) => {
361
+ const lodashIsEqual = isEqual(objA, objB);
362
+ if (lodashIsEqual) {
363
+ return true;
440
364
  }
441
- let formattedValue = value;
442
- try {
443
- switch (col.precision) {
444
- case "DOW": {
445
- formattedValue = formatDOW(value, col);
446
- break;
447
- }
448
- case "HOUR": {
449
- const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
450
- if (dayjsTime.isValid()) {
451
- formattedValue = dayjsTime.format("h:00A");
452
- }
453
- break;
454
- }
455
- case "MINUTE": {
456
- const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
457
- if (dayjsTime.isValid()) {
458
- formattedValue = dayjsTime.format("h:mmA");
459
- }
460
- break;
461
- }
462
- case "MONTH": {
463
- formattedValue = value;
464
- break;
465
- }
466
- default: {
467
- formattedValue = value;
468
- break;
365
+ const objAIsObject = isObject(objA);
366
+ const objBIsObject = isObject(objB);
367
+ if (!objAIsObject || !objBIsObject) {
368
+ return lodashIsEqual;
369
+ }
370
+ const keysA = Object.keys(objA);
371
+ const keysB = Object.keys(objB);
372
+ if (keysA.length !== keysB.length) {
373
+ return false;
374
+ }
375
+ for (let i = 0; i < keysA.length; i++) {
376
+ if (typeof objA[keysA[i]] === "function" && typeof objB[keysA[i]] === "function") {
377
+ if (!functionsEqual(objA[keysA[i]], objB[keysA[i]])) {
378
+ return false;
469
379
  }
380
+ } else if (!Object.hasOwnProperty.call(objB, keysA[i]) || !isEqual(objA[keysA[i]], objB[keysA[i]])) {
381
+ return false;
470
382
  }
471
- return formattedValue;
472
- } catch (error) {
473
- console.error(error);
474
- return value;
475
383
  }
384
+ return true;
476
385
  };
477
- var formatStringDate = (value, config = dataFormattingDefault) => {
478
- var _a;
479
- if (!value) {
480
- return void 0;
481
- }
482
- if (value && typeof value === "string") {
483
- const dateArray = value.split("-");
484
- const year = dateArray == null ? void 0 : dateArray[0];
485
- const day = dateArray == null ? void 0 : dateArray[2];
486
- let month;
487
- let week;
488
- if ((_a = dateArray == null ? void 0 : dateArray[1]) == null ? void 0 : _a.includes("W")) {
489
- week = dateArray == null ? void 0 : dateArray[1];
490
- } else {
491
- month = dateArray == null ? void 0 : dateArray[1];
492
- }
493
- const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
494
- const dayJSObj = dayjsWithPlugins_default.utc(value).utc();
495
- if (!dayJSObj.isValid()) {
496
- return value;
497
- }
498
- let date = value;
499
- if (day) {
500
- date = dayJSObj.format(dayMonthYearFormat);
501
- } else if (month) {
502
- date = dayJSObj.format(monthYearFormat);
503
- } else if (week) {
504
- } else if (year) {
505
- date = year;
386
+ var difference = (objA, objB) => {
387
+ const diff = [];
388
+ Object.keys(Object.assign({}, objA, objB)).forEach((key) => {
389
+ if (typeof objA[key] === "function" && typeof objB[key] === "function") {
390
+ if (!functionsEqual(objA[key], objB[key])) {
391
+ diff.push({
392
+ key,
393
+ objA: objA[key],
394
+ objB: objB[key]
395
+ });
396
+ }
397
+ } else if (!Object.is(objA[key], objB[key])) {
398
+ diff.push({
399
+ key,
400
+ objA: objA[key],
401
+ objB: objB[key]
402
+ });
506
403
  }
507
- return date;
508
- }
509
- return value;
404
+ });
405
+ return diff;
510
406
  };
511
- var formatDateType = (element, column, config = dataFormattingDefault) => {
512
- if (isNumber(element)) {
513
- return formatEpochDate(element, column, config);
407
+ var rotateArray = (array, n) => {
408
+ const rotated = [...array];
409
+ n = n % array.length;
410
+ if (n < 0)
411
+ n = array.length + n;
412
+ for (let i = 0; i < n; i++) {
413
+ rotated.unshift(rotated.pop());
514
414
  }
515
- return formatISODateWithPrecision(element, column, config);
415
+ return rotated;
516
416
  };
517
- var formatDateStringType = (element, column, config = dataFormattingDefault) => {
518
- if (!column) {
519
- return element;
520
- }
521
- if (column.precision) {
522
- return formatStringDateWithPrecision(element, column);
523
- }
524
- return formatStringDate(element, config);
417
+ var onlyUnique = (value, index, self) => {
418
+ return self.indexOf(value) === index;
525
419
  };
526
- var formatISODateWithPrecision = (value, col, config = dataFormattingDefault) => {
527
- if (!value) {
528
- return void 0;
529
- }
530
- if (!col) {
531
- return value;
420
+ var makeEmptyArray = (w, h, value = "") => {
421
+ var arr = [];
422
+ for (let i = 0; i < h; i++) {
423
+ arr[i] = [];
424
+ for (let j = 0; j < w; j++) {
425
+ arr[i][j] = value;
426
+ }
532
427
  }
533
- const precision = col.precision;
534
- const { dayMonthYearFormat, monthYearFormat } = getDataFormatting(config);
535
- const dateDayJS = dayjsWithPlugins_default.utc(value).utc();
536
- if (!dateDayJS.isValid()) {
537
- return value;
428
+ return arr;
429
+ };
430
+
431
+ // src/HelperFns/displayTypeHelpers.ts
432
+ var isChartType = (type) => CHART_TYPES.includes(type);
433
+ var isTableType = (type) => TABLE_TYPES.includes(type);
434
+ var isDisplayTypeValid = (response, displayType, dataLength, pivotDataLength, columns, isDataLimited) => {
435
+ var _a, _b;
436
+ const supportedDisplayTypes = getSupportedDisplayTypes({
437
+ response,
438
+ columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
439
+ dataLength,
440
+ pivotDataLength,
441
+ isDataLimited
442
+ });
443
+ const isValid = displayType && supportedDisplayTypes.includes(displayType);
444
+ return isValid;
445
+ };
446
+ var shouldPlotMultiSeries = (columns) => {
447
+ if (isAggregation(columns)) {
448
+ return false;
538
449
  }
539
- let date = dateDayJS.format(dayMonthYearFormat);
450
+ const multiSeriesIndex = columns.findIndex((col) => col.multi_series === true);
451
+ return multiSeriesIndex >= 0;
452
+ };
453
+ var supportsPieChart = (columns, chartData) => {
454
+ if (shouldPlotMultiSeries(columns)) {
455
+ return false;
456
+ }
457
+ if (chartData) {
458
+ return chartData.length < 7;
459
+ }
460
+ return true;
461
+ };
462
+ var supports2DCharts = (columns, dataLength) => {
463
+ if (dataLength <= 1) {
464
+ return false;
465
+ }
466
+ const { amountOfNumberColumns, amountOfStringColumns } = getColumnTypeAmounts(columns);
467
+ return amountOfNumberColumns > 0 && amountOfStringColumns > 0;
468
+ };
469
+ var supportsRegularPivotTable = (columns, dataLength, data) => {
470
+ var _a, _b;
471
+ if (dataLength <= 1) {
472
+ return false;
473
+ }
474
+ const groupbyColumns = getGroupableColumns(columns);
475
+ const hasTwoGroupables = (groupbyColumns == null ? void 0 : groupbyColumns.length) === 2;
476
+ if (!hasTwoGroupables) {
477
+ return false;
478
+ }
479
+ const visibleColumns = getVisibleColumns(columns);
480
+ const groupbyColumn1 = columns[groupbyColumns[0]];
481
+ const groupbyColumn2 = columns[groupbyColumns[1]];
482
+ if (!groupbyColumn1.is_visible || !groupbyColumn2.is_visible || !((visibleColumns == null ? void 0 : visibleColumns.length) >= 3)) {
483
+ return false;
484
+ }
485
+ const column1Data = (data == null ? void 0 : data.map((row) => {
486
+ return row[groupbyColumns[0]];
487
+ })) ?? [];
488
+ const column2Data = (data == null ? void 0 : data.map((row) => {
489
+ return row[groupbyColumns[1]];
490
+ })) ?? [];
491
+ const uniqueData1Length = ((_a = column1Data == null ? void 0 : column1Data.filter(onlyUnique)) == null ? void 0 : _a.length) ?? 0;
492
+ const uniqueData2Length = ((_b = column2Data == null ? void 0 : column2Data.filter(onlyUnique)) == null ? void 0 : _b.length) ?? 0;
493
+ if (uniqueData1Length > MAX_LEGEND_LABELS && uniqueData2Length > MAX_LEGEND_LABELS) {
494
+ console.debug(
495
+ `Info: Pivot table will not be supported since there are too many unique fields. The calculated dimensions would be: ${uniqueData1Length} x ${uniqueData2Length}`
496
+ );
497
+ return false;
498
+ }
499
+ return true;
500
+ };
501
+ var supportsDatePivotTable = (columns) => {
502
+ var _a;
503
+ const dateColumnIndex = columns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
504
+ const dateColumn = columns[dateColumnIndex];
505
+ return dateColumn && ((_a = dateColumn == null ? void 0 : dateColumn.display_name) == null ? void 0 : _a.toLowerCase().includes("month")) && (columns == null ? void 0 : columns.length) === 2;
506
+ };
507
+ var isSingleValueResponse = (response) => {
508
+ var _a, _b, _c, _d, _e, _f;
509
+ if (!response) {
510
+ return false;
511
+ }
512
+ const rows = (_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.rows;
513
+ const columns = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.columns;
514
+ const referenceID = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.reference_id;
515
+ const hasNoData = rows && !(rows == null ? void 0 : rows.length);
516
+ const hasOneColumn = (columns == null ? void 0 : columns.length) === 1;
517
+ if (hasNoData && hasOneColumn && referenceID === "1.1.211") {
518
+ return true;
519
+ }
520
+ const oneRowAndColumn = (rows == null ? void 0 : rows.length) === 1 && ((_f = rows[0]) == null ? void 0 : _f.length) === 1;
521
+ if (oneRowAndColumn) {
522
+ return true;
523
+ }
524
+ return false;
525
+ };
526
+ var getSupportedDisplayTypes = ({
527
+ response,
528
+ columns,
529
+ dataLength,
530
+ pivotDataLength,
531
+ isDataLimited
532
+ } = {}) => {
533
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
540
534
  try {
541
- switch (precision) {
542
- case "DAY" /* DAY */: {
543
- break;
544
- }
545
- case "WEEK" /* WEEK */: {
546
- const dateJSStart = dateDayJS.startOf("week").format("MMM D");
547
- const dateJSEnd = dateDayJS.endOf("week").format("MMM D");
548
- const week = dateDayJS.week();
549
- const year = dateDayJS.format("YYYY");
550
- date = `${dateJSStart} - ${dateJSEnd}, ${year} (Week ${week})`;
551
- break;
535
+ if (!((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.display_type)) {
536
+ return [];
537
+ }
538
+ const displayType = response.data.data.display_type;
539
+ if (displayType === "suggestion" || displayType === "help" || displayType === "html") {
540
+ return [displayType];
541
+ }
542
+ const rows = ((_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.rows) ?? [];
543
+ const allColumns = columns || ((_f = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.data) == null ? void 0 : _f.columns);
544
+ const visibleColumns = getVisibleColumns(allColumns);
545
+ if (!(visibleColumns == null ? void 0 : visibleColumns.length)) {
546
+ return ["text"];
547
+ }
548
+ if (isSingleValueResponse(response)) {
549
+ return ["single-value"];
550
+ }
551
+ if (!(rows == null ? void 0 : rows.length)) {
552
+ return ["table"];
553
+ }
554
+ const maxRowsForPieChart = 10;
555
+ const numRows = dataLength ?? rows.length;
556
+ let pivotDataHasLength = true;
557
+ const pivotDataLengthProvided = pivotDataLength !== void 0 && pivotDataLength !== null;
558
+ if (pivotDataLengthProvided) {
559
+ pivotDataHasLength = !!pivotDataLength;
560
+ }
561
+ if (supportsRegularPivotTable(visibleColumns, numRows, (_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.rows)) {
562
+ const supportedDisplayTypes = ["table"];
563
+ if (!isDataLimited) {
564
+ supportedDisplayTypes.push("pivot_table");
552
565
  }
553
- case "MONTH" /* MONTH */: {
554
- date = dateDayJS.format(monthYearFormat);
555
- break;
566
+ if (
567
+ // Comment out for now so chart row count doesnt change display type
568
+ // numRows <= maxRowsForPivot &&
569
+ pivotDataHasLength
570
+ ) {
571
+ supportedDisplayTypes.push("stacked_column", "stacked_bar", "column", "bar", "bubble", "heatmap");
572
+ if (hasDateColumn(visibleColumns)) {
573
+ supportedDisplayTypes.push("stacked_line", "line");
574
+ }
556
575
  }
557
- case "QUARTER" /* QUARTER */: {
558
- const quarter = dateDayJS.quarter();
559
- const year = dateDayJS.format("YYYY");
560
- date = `${year}-Q${quarter}`;
561
- break;
576
+ return supportedDisplayTypes;
577
+ } else if (supports2DCharts(visibleColumns, numRows)) {
578
+ const supportedDisplayTypes = ["table", "column", "bar"];
579
+ if (numRows > MIN_HISTOGRAM_SAMPLE) {
580
+ supportedDisplayTypes.push("histogram");
562
581
  }
563
- case "YEAR" /* YEAR */: {
564
- date = dateDayJS.format("YYYY");
565
- break;
582
+ if (hasDateColumn(visibleColumns)) {
583
+ supportedDisplayTypes.push("line");
566
584
  }
567
- case "DATE_HOUR" /* DATE_HOUR */: {
568
- date = dateDayJS.format(`${dayMonthYearFormat} h:00A`);
569
- break;
585
+ if (numRows > 1 && numRows <= maxRowsForPieChart) {
586
+ supportedDisplayTypes.push("pie");
570
587
  }
571
- case "DATE_MINUTE" /* DATE_MINUTE */: {
572
- date = dateDayJS.format(`${dayMonthYearFormat} h:mmA`);
573
- break;
588
+ const { amountOfNumberColumns } = getColumnTypeAmounts(visibleColumns);
589
+ if (amountOfNumberColumns > 1) {
590
+ supportedDisplayTypes.push("column_line");
591
+ supportedDisplayTypes.push("scatterplot");
574
592
  }
575
- default: {
576
- break;
593
+ if (!isDataLimited && supportsDatePivotTable(visibleColumns)) {
594
+ const dateColumnIndex = visibleColumns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
595
+ const dateColumn = visibleColumns[dateColumnIndex];
596
+ const data = (_j = (_i = response == null ? void 0 : response.data) == null ? void 0 : _i.data) == null ? void 0 : _j.rows;
597
+ const uniqueYears = [];
598
+ data.forEach((row) => {
599
+ const year = formatElement({
600
+ element: row[dateColumnIndex],
601
+ column: dateColumn,
602
+ config: getDataFormatting({ monthYearFormat: "YYYY", dayMonthYearFormat: "YYYY" })
603
+ });
604
+ if (!uniqueYears.includes(year)) {
605
+ uniqueYears.push(year);
606
+ }
607
+ });
608
+ if (uniqueYears.length > 1) {
609
+ supportedDisplayTypes.push("pivot_table");
610
+ }
577
611
  }
612
+ return supportedDisplayTypes;
578
613
  }
579
- return date;
614
+ return ["table"];
580
615
  } catch (error) {
581
616
  console.error(error);
617
+ return ["table"];
582
618
  }
583
619
  };
584
- var formatEpochDate = (value, col, config = dataFormattingDefault) => {
585
- if (!value) {
586
- return void 0;
620
+ var getFirstChartDisplayType = (supportedDisplayTypes, fallback) => {
621
+ const chartType = supportedDisplayTypes.find((displayType) => isChartType(displayType));
622
+ if (chartType) {
623
+ return chartType;
587
624
  }
588
- if (!col) {
589
- return value;
625
+ return fallback;
626
+ };
627
+ var getDefaultDisplayType = (response, defaultToChart, columns, dataLength, pivotDataLength, preferredDisplayType, isDataLimited = false) => {
628
+ var _a, _b, _c, _d, _e, _f, _g, _h;
629
+ const supportedDisplayTypes = getSupportedDisplayTypes({
630
+ response,
631
+ columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
632
+ dataLength,
633
+ pivotDataLength,
634
+ isDataLimited
635
+ });
636
+ if (preferredDisplayType && supportedDisplayTypes.includes(preferredDisplayType)) {
637
+ return preferredDisplayType;
590
638
  }
591
- try {
592
- const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
593
- const year = "YYYY";
594
- const monthYear = monthYearFormat;
595
- const dayMonthYear = dayMonthYearFormat;
596
- const title = col.title;
597
- let dayJSObj;
598
- if (isNaN(parseFloat(value))) {
599
- dayJSObj = dayjsWithPlugins_default.utc(value).utc();
600
- } else {
601
- dayJSObj = dayjsWithPlugins_default.unix(value).utc();
602
- }
603
- if (!dayJSObj.isValid()) {
604
- return value;
605
- }
606
- let date = dayJSObj.format(dayMonthYear);
607
- if (isNaN(parseFloat(value))) {
608
- if (title && title.toLowerCase().includes("year")) {
609
- date = dayJSObj.format(year);
610
- } else if (title && title.toLowerCase().includes("month")) {
611
- date = dayJSObj.format(monthYear);
612
- }
613
- date = dayJSObj.format(dayMonthYear);
614
- } else if (title && title.toLowerCase().includes("year")) {
615
- date = dayJSObj.format(year);
616
- } else if (title && title.toLowerCase().includes("month")) {
617
- date = dayJSObj.format(monthYear);
618
- }
619
- return date;
620
- } catch (error) {
621
- console.error(error);
622
- return value;
639
+ const responseDisplayType = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.display_type;
640
+ if (supportedDisplayTypes.includes(preferredDisplayType)) {
641
+ return preferredDisplayType;
623
642
  }
624
- };
625
- var formatDOW = (value, col) => {
626
- let dowStyle = col.dow_style;
627
- if (!dowStyle) {
628
- dowStyle = "NUM_1_MON";
643
+ if (responseDisplayType === "suggestion" || responseDisplayType === "help" || responseDisplayType === "html") {
644
+ return responseDisplayType;
629
645
  }
630
- let formattedValue = value;
631
- let weekdayNumber = Number(value);
632
- switch (dowStyle) {
633
- case "NUM_1_MON": {
634
- const weekdays = WEEKDAY_NAMES_MON;
635
- const index = weekdayNumber - 1;
636
- if (index >= 0) {
637
- formattedValue = weekdays[index];
638
- } else {
639
- console.warn(`dow style is NUM_1_MON but the value could not be converted to a number: ${value}`);
640
- }
641
- break;
642
- }
643
- case "NUM_1_SUN": {
644
- const weekdays = WEEKDAY_NAMES_SUN;
645
- const index = weekdayNumber - 1;
646
- if (index >= 0) {
647
- formattedValue = weekdays[index];
648
- } else {
649
- console.warn(`dow style is NUM_1_SUN but the value could not be converted to a number: ${value}`);
650
- }
651
- break;
652
- }
653
- case "NUM_0_MON": {
654
- const weekdays = WEEKDAY_NAMES_MON;
655
- if (weekdayNumber >= 0) {
656
- formattedValue = weekdays[weekdayNumber];
657
- } else {
658
- console.warn(`dow style is NUM_0_MON but the value could not be converted to a number: ${value}`);
659
- }
660
- break;
661
- }
662
- case "NUM_0_SUN": {
663
- const weekdays = WEEKDAY_NAMES_SUN;
664
- if (weekdayNumber >= 0) {
665
- formattedValue = weekdays[weekdayNumber];
666
- } else {
667
- console.warn(`dow style is NUM_0_SUN but the value could not be converted to a number: ${value}`);
668
- }
669
- break;
670
- }
671
- case "ALPHA_MON":
672
- case "ALPHA_SUN": {
673
- const weekday = WEEKDAY_NAMES_MON.find((weekday2) => weekday2.toLowerCase().includes(value.trim().toLowerCase()));
674
- if (weekday) {
675
- formattedValue = weekday;
676
- } else {
677
- console.warn(`dow style is ALPHA but the value could not be matched to a weekday name: ${value}`);
678
- }
679
- break;
680
- }
681
- default: {
682
- console.warn(`could not format dow value. dow_style was not recognized: ${col.dow_style}`);
683
- break;
684
- }
646
+ if (supportedDisplayTypes.length === 1) {
647
+ return supportedDisplayTypes[0];
685
648
  }
686
- return formattedValue;
687
- };
688
- var dateStringSortFnWithoutPrecision = (a, b) => {
689
- if (a.includes("-W")) {
690
- const aDateYear = a.substring(0, 4);
691
- const bDateYear = b.substring(0, 4);
692
- if (aDateYear !== bDateYear) {
693
- return aDateYear - bDateYear;
694
- } else {
695
- const aDateWeek = a.substring(6, 8);
696
- const bDateWeek = b.substring(6, 8);
697
- return aDateWeek - bDateWeek;
698
- }
699
- } else if (WEEKDAY_NAMES_MON.includes(a.trim())) {
700
- const aDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(a.trim().toLowerCase()));
701
- const bDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(b.trim().toLowerCase()));
702
- let sortValue = a - b;
703
- if (aDayIndex >= 0 && bDayIndex >= 0) {
704
- sortValue = aDayIndex - bDayIndex;
705
- }
706
- return sortValue;
707
- } else if (MONTH_NAMES.includes(a.trim())) {
708
- const aMonthIndex = MONTH_NAMES.findIndex((m) => m === a.trim());
709
- const bMonthIndex = MONTH_NAMES.findIndex((m) => m === b.trim());
710
- if (aMonthIndex >= 0 && bMonthIndex >= 0) {
711
- return bMonthIndex - aMonthIndex;
649
+ if (supportedDisplayTypes.includes("pivot_table")) {
650
+ let displayType = "pivot_table";
651
+ if (defaultToChart) {
652
+ 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";
712
653
  }
713
- return a - b;
714
- } else if (SEASON_NAMES.includes(a.substr(0, 2))) {
715
- const aSeasonIndex = SEASON_NAMES.findIndex((s) => s === a.substr(0, 2));
716
- const bSeasonIndex = SEASON_NAMES.findIndex((s) => s === b.substr(0, 2));
717
- const aYear = Number(a.substr(2));
718
- const bYear = Number(b.substr(2));
719
- if (aYear === bYear) {
720
- return aSeasonIndex - bSeasonIndex;
654
+ return displayType;
655
+ }
656
+ if (!responseDisplayType && hasData(response) || responseDisplayType === "data") {
657
+ let displayType = "table";
658
+ if (defaultToChart) {
659
+ displayType = isAggregation((_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.columns) ? getFirstChartDisplayType(supportedDisplayTypes, "table") : "table";
721
660
  }
722
- return aYear - bYear;
661
+ return displayType;
723
662
  }
724
- return a - b;
663
+ return "text";
725
664
  };
726
- var dateStringSortFn = (a, b, col) => {
727
- if (typeof a !== "string" || typeof b !== "string" || !col) {
728
- return a - b;
729
- }
730
- const aTrimmed = a.trim();
731
- const bTrimmed = b.trim();
732
- switch (col.precision) {
733
- case "DOW": {
734
- const dowStyle = col.dow_style ?? "ALPHA_MON";
735
- let aIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
736
- let bIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
737
- if (dowStyle === "ALPHA_SUN") {
738
- aIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
739
- bIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
740
- }
741
- return aIndex - bIndex;
742
- }
743
- case "HOUR":
744
- case "MINUTE": {
745
- const aDayjsTime = dayjsWithPlugins_default.utc(aTrimmed, "THH:mm:ss.SSSZ").utc();
746
- const bDayjsTime = dayjsWithPlugins_default.utc(bTrimmed, "THH:mm:ss.SSSZ").utc();
747
- return aDayjsTime.unix() - bDayjsTime.unix();
748
- }
749
- case "MONTH": {
750
- MONTH_NAMES;
751
- const aMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === aTrimmed.toLowerCase());
752
- const bMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === bTrimmed.toLowerCase());
753
- return aMonthIndex - bMonthIndex;
754
- }
755
- default: {
756
- return dateStringSortFnWithoutPrecision(aTrimmed, bTrimmed);
757
- }
665
+ var hasData = (response) => {
666
+ var _a, _b, _c;
667
+ if (!response) {
668
+ return false;
758
669
  }
670
+ 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;
759
671
  };
760
- var dateSortFn = (a, b, col, isTable) => {
672
+
673
+ // src/HelperFns/dataAlertHelpers.ts
674
+ var getDayLocalStartDate = ({ timeObj, timezone: timezone2, daysToAdd = 0 }) => {
761
675
  try {
762
- if (!a && !b) {
763
- return 0;
764
- } else if (!a && b) {
765
- return 1;
766
- } else if (a && !b || !col) {
767
- return -1;
768
- }
769
- let aDate = Number(a);
770
- let bDate = Number(b);
771
- let sortValue = aDate - bDate;
772
- if (isNaN(aDate) || isNaN(bDate)) {
773
- if (col.type === "DATE_STRING") {
774
- sortValue = dateStringSortFn(a, b, col);
775
- } else {
776
- sortValue = dayjsWithPlugins_default.utc(a).unix() - dayjsWithPlugins_default.utc(b).unix();
777
- }
778
- }
779
- if (isTable && col.precision === "DOW") {
780
- sortValue = -1 * sortValue;
676
+ const now = dayjsWithPlugins_default().tz(timezone2);
677
+ let nextCycle = now.startOf("minute").set("hour", timeObj.hour24).set("minute", timeObj.minute);
678
+ if (nextCycle.valueOf() < now.valueOf()) {
679
+ nextCycle = nextCycle.add(1, "day");
781
680
  }
782
- return sortValue;
681
+ const nextCycleFormatted = nextCycle.add(daysToAdd, "days").format("YYYY-MM-DD[T]HH:mm:00");
682
+ return nextCycleFormatted;
783
683
  } catch (error) {
784
684
  console.error(error);
785
- return -1;
685
+ return;
786
686
  }
787
687
  };
788
- var sortDataByDate = (data, tableColumns, sortDirection = "desc", isTable) => {
688
+ var getWeekLocalStartDate = ({ weekDay, timeObj, timezone: timezone2 }) => {
789
689
  try {
790
- if (!data || typeof data !== "object") {
791
- throw new Error("Could not sort data by date - no data supplied");
792
- }
793
- const dateColumnIndex = getDateColumnIndex(tableColumns);
794
- const dateColumn = tableColumns[dateColumnIndex];
795
- if (dateColumnIndex >= 0) {
796
- let multiplier = sortDirection === "desc" ? -1 : 1;
797
- const sortedData = [...data].sort(
798
- (a, b) => multiplier * dateSortFn(a[dateColumnIndex], b[dateColumnIndex], dateColumn, isTable)
799
- );
800
- return sortedData;
801
- }
690
+ const now = dayjsWithPlugins_default().tz(timezone2);
691
+ const weekdayNumber = WEEKDAY_NAMES_SUN.findIndex((day) => weekDay.toLowerCase() === day.toLowerCase());
692
+ const nextWeekday = now.day(weekdayNumber).startOf("minute");
693
+ const nextWeekdayWithTime = nextWeekday.hour(timeObj.hour24).minute(timeObj.minute);
694
+ if (nextWeekdayWithTime.valueOf() < now.valueOf()) {
695
+ return nextWeekdayWithTime.add(1, "week").format("YYYY-MM-DD[T]HH:mm:00");
696
+ }
697
+ return nextWeekdayWithTime.format("YYYY-MM-DD[T]HH:mm:00");
802
698
  } catch (error) {
803
699
  console.error(error);
700
+ return;
804
701
  }
805
- return data;
806
702
  };
807
- var formatElement = ({
808
- element,
809
- column,
810
- config = dataFormattingDefault,
811
- htmlElement,
812
- isChart = false
813
- }) => {
703
+ var getMonthLocalStartDate = ({ monthDay, timeObj, timezone: timezone2 }) => {
814
704
  try {
815
- let formattedElement = element;
816
- const { currencyCode, languageCode, currencyDecimals, quantityDecimals, ratioDecimals } = getDataFormatting(config);
817
- let type = column == null ? void 0 : column.type;
818
- if (isChart && ["count", "deviation", "variance"].includes(column == null ? void 0 : column.aggType)) {
819
- type = "QUANTITY";
820
- }
821
- if (column) {
822
- switch (type) {
823
- case "STRING": {
824
- break;
825
- }
826
- case "DOLLAR_AMT": {
827
- const elementNumber = parseFloat(`${element}`);
828
- if (!isNaN(elementNumber)) {
829
- const currency = currencyCode || "USD";
830
- const validatedCurrencyDecimals = currencyDecimals || currencyDecimals === 0 ? currencyDecimals : void 0;
831
- try {
832
- formattedElement = new Intl.NumberFormat(languageCode, {
833
- style: "currency",
834
- currency: `${currency}`,
835
- minimumFractionDigits: validatedCurrencyDecimals,
836
- maximumFractionDigits: validatedCurrencyDecimals
837
- }).format(elementNumber);
838
- } catch (error) {
839
- console.error(error);
840
- formattedElement = new Intl.NumberFormat(languageCode, {
841
- style: "currency",
842
- currency: "USD",
843
- minimumFractionDigits: validatedCurrencyDecimals,
844
- maximumFractionDigits: validatedCurrencyDecimals
845
- }).format(elementNumber);
846
- }
847
- }
848
- break;
849
- }
850
- case "QUANTITY": {
851
- const validatedQuantityDecimals = !isNaN(quantityDecimals) ? quantityDecimals : 2;
852
- const elementNumber = parseFloat(`${element}`);
853
- if (!isNaN(elementNumber)) {
854
- const numDecimals = elementNumber % 1 !== 0 ? validatedQuantityDecimals : 0;
855
- formattedElement = new Intl.NumberFormat(languageCode, {
856
- minimumFractionDigits: numDecimals,
857
- maximumFractionDigits: numDecimals
858
- }).format(elementNumber);
859
- }
860
- break;
861
- }
862
- case "DATE": {
863
- formattedElement = formatDateType(element, column, config);
864
- break;
865
- }
866
- case "DATE_STRING": {
867
- formattedElement = formatDateStringType(element, column, config);
868
- break;
869
- }
870
- case "RATIO": {
871
- const numDecimals = !isNaN(ratioDecimals) ? ratioDecimals : 4;
872
- const elementNumber = parseFloat(`${element}`);
873
- if (!isNaN(elementNumber)) {
874
- formattedElement = new Intl.NumberFormat(languageCode, {
875
- minimumFractionDigits: numDecimals,
876
- maximumFractionDigits: numDecimals
877
- }).format(elementNumber);
878
- }
879
- break;
880
- }
881
- case "PERCENT": {
882
- const elementNumber = parseFloat(`${element}`);
883
- if (!isNaN(elementNumber)) {
884
- const p = elementNumber / 100;
885
- formattedElement = new Intl.NumberFormat(languageCode, {
886
- style: "percent",
887
- minimumFractionDigits: 2,
888
- maximumFractionDigits: 2
889
- }).format(p);
890
- if (htmlElement) {
891
- if (elementNumber < 0) {
892
- htmlElement.classList.add("comparison-value-negative");
893
- } else if (elementNumber > 0) {
894
- htmlElement.classList.add("comparison-value-positive");
895
- }
896
- }
897
- }
898
- break;
899
- }
900
- default: {
901
- break;
902
- }
903
- }
904
- }
905
- return formattedElement;
705
+ const now = dayjsWithPlugins_default().tz(timezone2);
706
+ let nextMonthStr;
707
+ if (monthDay === "LAST") {
708
+ nextMonthStr = now.endOf("month").startOf("day").format("ll HH:mm");
709
+ } else if (monthDay === "FIRST") {
710
+ nextMonthStr = now.add(1, "month").startOf("month").format("ll HH:mm");
711
+ }
712
+ const nextMonth = dayjsWithPlugins_default.tz(nextMonthStr, timezone2);
713
+ const nextMonthWithTime = nextMonth.hour(timeObj.hour24).minute(timeObj.minute);
714
+ return nextMonthWithTime.format("YYYY-MM-DD[T]HH:mm:00");
906
715
  } catch (error) {
907
716
  console.error(error);
908
- return element;
717
+ return;
909
718
  }
910
719
  };
911
- var getNumberFormatConfig = (d, scale) => {
912
- var _a, _b;
913
- let minimumFractionDigits = 0;
914
- let maximumFractionDigits = 0;
915
- let notation;
916
- 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]);
917
- const smallDomain = domainRange && domainRange < 10;
918
- const absValue = Math.abs(d);
919
- if (smallDomain) {
920
- minimumFractionDigits = 2;
921
- maximumFractionDigits = 2;
922
- } else if (absValue >= 1e3) {
923
- notation = "compact";
924
- if (absValue > 1e9) {
925
- maximumFractionDigits = 3;
926
- } else if (absValue > 1e6) {
927
- maximumFractionDigits = 2;
928
- } else if (absValue > 1e3) {
929
- maximumFractionDigits = 1;
930
- }
720
+
721
+ // src/Constants/dataAlertConstants.ts
722
+ var CUSTOM_TYPE = "CUSTOM";
723
+ var PROJECT_TYPE = "PROJECT";
724
+ var PERIODIC_TYPE = "PERIODIC";
725
+ var CONTINUOUS_TYPE = "CONTINUOUS";
726
+ var SCHEDULED_TYPE = "SCHEDULED";
727
+ var COMPARE_TYPE = "COMPARE";
728
+ var EXISTS_TYPE = "EXISTS";
729
+ var NUMBER_TERM_TYPE = "CONSTANT";
730
+ var QUERY_TERM_TYPE = "QUERY";
731
+ var GROUP_TERM_TYPE = "GROUP";
732
+ var DEFAULT_EVALUATION_FREQUENCY = 5;
733
+ var DATA_ALERT_STATUSES = {
734
+ ACTIVE: "ACTIVE",
735
+ // currently running
736
+ RETRY: "RETRY",
737
+ // currently being retried because of an error, no action required yet
738
+ WAITING: "WAITING",
739
+ // active but triggered already and waiting for the reset period to end
740
+ INACTIVE: "INACTIVE",
741
+ // either not running OR it is a prototype (can not be run)
742
+ EVALUATION_ERROR: "EVALUATION_ERROR",
743
+ // expression evaluation resulted in an error
744
+ DATA_RETURN_ERROR: "DATA_RETURN_ERROR",
745
+ // expression evaluation was successful, but data return query failed
746
+ GENERAL_ERROR: "GENERAL_ERROR"
747
+ // every thing else that doesnt fall into a category above
748
+ };
749
+ var DATA_ALERT_ENABLED_STATUSES = [
750
+ DATA_ALERT_STATUSES.ACTIVE,
751
+ DATA_ALERT_STATUSES.RETRY,
752
+ DATA_ALERT_STATUSES.WAITING
753
+ ];
754
+ var DATA_ALERT_OPERATORS = {
755
+ GREATER_THAN: {
756
+ displayName: `
757
+ <span>
758
+ Is <strong>greater</strong> than
759
+ </span>
760
+ `,
761
+ symbol: ">",
762
+ conditionText: "exceeds",
763
+ conditionTextPast: "exceeded"
764
+ },
765
+ GREATER_THAN_EQUAL_TO: {
766
+ displayName: `
767
+ <span>
768
+ Is <strong>greater</strong> than <strong>or equal</strong> to
769
+ </span>
770
+ `,
771
+ symbol: ">=",
772
+ conditionText: "is equal to or exceeds",
773
+ conditionTextPast: "was equal to or exceeded"
774
+ },
775
+ LESS_THAN: {
776
+ displayName: `
777
+ <span>
778
+ Is <strong>less</strong> than
779
+ </span>
780
+ `,
781
+ symbol: "<",
782
+ conditionText: "falls below",
783
+ conditionTextPast: "fell below"
784
+ },
785
+ LESS_THAN_EQUAL_TO: {
786
+ displayName: `
787
+ <span>
788
+ Is <strong>less</strong> than <strong>or equal</strong> to
789
+ </span>
790
+ `,
791
+ symbol: "<=",
792
+ conditionText: "is equal to or falls below",
793
+ conditionTextPast: "was equal to or fell below"
794
+ },
795
+ EQUAL_TO: {
796
+ displayName: `
797
+ <span>
798
+ Is <strong>equal</strong> to
799
+ </span>
800
+ `,
801
+ symbol: "=",
802
+ conditionText: "equals",
803
+ conditionTextPast: "was equal to"
804
+ }
805
+ /* Not using this for now. Uncomment to enable later if desired
806
+ NOT_EQUAL_TO: {
807
+ displayName: (
808
+ <span>
809
+ Is <strong>not equal</strong> to
810
+ </span>
811
+ ),
812
+ symbol: '!=',
813
+ conditionText: 'does not equal',
814
+ conditionTextPast: 'was not equal to',
815
+ }, */
816
+ /* These are additions term condition values
817
+ They can be used to create more complex condition groups
818
+ EXISTS: {},
819
+ NOT_EXISTS: {},
820
+ AND: {},
821
+ OR: {},
822
+ TERMINATOR: {} */
823
+ };
824
+ var DATA_ALERT_CONDITION_TYPES = {
825
+ [COMPARE_TYPE]: {
826
+ displayName: "When a specific condition is met"
827
+ },
828
+ [EXISTS_TYPE]: {
829
+ displayName: "If new data is detected"
931
830
  }
932
- return { minimumFractionDigits, maximumFractionDigits, notation };
933
831
  };
934
- var formatChartLabel = ({ d, scale, column, dataFormatting, maxLabelWidth }) => {
935
- if (d === null) {
936
- return {
937
- fullWidthLabel: "Untitled Category",
938
- formattedLabel: "Untitled Category"
939
- };
940
- }
941
- const col = column ?? (scale == null ? void 0 : scale.column);
942
- if (!col || !col.type) {
943
- return {
944
- fullWidthLabel: d,
945
- formattedLabel: d
946
- };
832
+ var DATA_ALERT_FREQUENCY_TYPE_OPTIONS = {
833
+ [SCHEDULED_TYPE]: {
834
+ label: "at the following times:",
835
+ listLabel: "at the following times"
836
+ },
837
+ [CONTINUOUS_TYPE]: {
838
+ label: "right away.",
839
+ listLabel: "right away"
840
+ }
841
+ };
842
+ var SCHEDULE_INTERVAL_OPTIONS = {
843
+ DAY: {
844
+ displayName: `
845
+ <span>
846
+ Every <strong>day</strong>
847
+ </span>
848
+ `,
849
+ getLocalStartDate: getDayLocalStartDate
850
+ },
851
+ WEEK: {
852
+ displayName: `
853
+ <span>
854
+ Every <strong>week</strong>
855
+ </span>
856
+ `,
857
+ getLocalStartDate: getWeekLocalStartDate
858
+ },
859
+ MONTH: {
860
+ displayName: `
861
+ <span>
862
+ Every <strong>month</strong>
863
+ </span>
864
+ `,
865
+ getLocalStartDate: getMonthLocalStartDate
866
+ }
867
+ // Not supporting for now
868
+ // YEAR: {
869
+ // displayName: (
870
+ // <span>
871
+ // Every <strong>year</strong>
872
+ // </span>
873
+ // ),
874
+ // displayText: 'Scheduled yearly',
875
+ // },
876
+ };
877
+ var SCHEDULE_FREQUENCY_OPTIONS = {
878
+ DAY: {
879
+ displayText: "Scheduled daily"
880
+ },
881
+ WEEK: {
882
+ displayText: "Scheduled weekly"
883
+ },
884
+ MONTH: {
885
+ displayText: "Scheduled for the 1st of every month"
886
+ },
887
+ MONTH_LAST_DAY: {
888
+ displayText: "Scheduled for the end of every month"
889
+ },
890
+ YEAR: {
891
+ displayText: "Scheduled yearly"
892
+ }
893
+ };
894
+ var RESET_PERIOD_OPTIONS = {
895
+ DAY: {
896
+ displayName: `
897
+ <span>
898
+ At most <strong>once a day</strong>
899
+ </span>
900
+ `,
901
+ displayText: "At most once a day"
902
+ },
903
+ WEEK: {
904
+ displayName: `
905
+ <span>
906
+ At most <strong>once a week</strong>
907
+ </span>
908
+ `,
909
+ displayText: "At most once a week"
910
+ },
911
+ MONTH: {
912
+ displayName: `
913
+ <span>
914
+ At most <strong>once a month</strong>
915
+ </span>
916
+ `,
917
+ displayText: "At most once a month"
918
+ },
919
+ // Not supporting for now
920
+ // YEAR: {
921
+ // displayName: (
922
+ // <span>
923
+ // At most <strong>once a year</strong>
924
+ // </span>
925
+ // ),
926
+ // displayText: 'At most once a year'
927
+ // },
928
+ NONE: {
929
+ displayName: `
930
+ <span>
931
+ <strong>Every time</strong> new data is detected
932
+ </span>
933
+ `,
934
+ displayText: "Continuous"
935
+ }
936
+ };
937
+ var MONTH_DAY_SELECT_OPTIONS = {
938
+ FIRST: `
939
+ <span>
940
+ on the <strong>first day</strong>
941
+ </span>
942
+ `,
943
+ LAST: `
944
+ <span>
945
+ on the <strong>last day</strong>
946
+ </span>
947
+ `
948
+ };
949
+ var EVALUATION_FREQUENCY_OPTIONS = {
950
+ 1: {
951
+ value: 1,
952
+ label: "1 min"
953
+ },
954
+ 2: {
955
+ value: 2,
956
+ label: "2 mins"
957
+ },
958
+ 3: {
959
+ value: 3,
960
+ label: "3 mins"
961
+ },
962
+ 5: {
963
+ value: 5,
964
+ label: "5 mins",
965
+ listLabel: `
966
+ <span>
967
+ 5 mins <em>(Recommended)</em>
968
+ </span>
969
+ `
970
+ },
971
+ 10: {
972
+ value: 10,
973
+ label: "10 mins"
974
+ },
975
+ 30: {
976
+ value: 30,
977
+ label: "30 mins"
978
+ },
979
+ 60: {
980
+ value: 60,
981
+ label: "60 mins"
947
982
  }
948
- const config = (scale == null ? void 0 : scale.dataFormatting) ?? dataFormatting;
949
- const { currencyCode, languageCode } = config;
950
- let type = col.type;
951
- if ((scale == null ? void 0 : scale.units) === "none") {
952
- type = "QUANTITY";
983
+ };
984
+
985
+ // src/Constants/queryConstants.ts
986
+ var DEFAULT_SOURCE = "widgets";
987
+
988
+ // src/Constants/enums.ts
989
+ var TimestampFormats = /* @__PURE__ */ ((TimestampFormats2) => {
990
+ TimestampFormats2["epoch"] = "EPOCH";
991
+ TimestampFormats2["iso8601"] = "ISO8601";
992
+ return TimestampFormats2;
993
+ })(TimestampFormats || {});
994
+ var PrecisionTypes = /* @__PURE__ */ ((PrecisionTypes2) => {
995
+ PrecisionTypes2["DAY"] = "DAY";
996
+ PrecisionTypes2["MONTH"] = "MONTH";
997
+ PrecisionTypes2["YEAR"] = "YEAR";
998
+ PrecisionTypes2["WEEK"] = "WEEK";
999
+ PrecisionTypes2["QUARTER"] = "QUARTER";
1000
+ PrecisionTypes2["DATE_HOUR"] = "DATE_HOUR";
1001
+ PrecisionTypes2["DATE_MINUTE"] = "DATE_MINUTE";
1002
+ PrecisionTypes2["HOUR"] = "HOUR";
1003
+ PrecisionTypes2["MINUTE"] = "MINUTE";
1004
+ return PrecisionTypes2;
1005
+ })(PrecisionTypes || {});
1006
+ var NumberColumnTypes = /* @__PURE__ */ ((NumberColumnTypes2) => {
1007
+ NumberColumnTypes2["CURRENCY"] = "DOLLAR_AMT";
1008
+ NumberColumnTypes2["QUANTITY"] = "QUANTITY";
1009
+ NumberColumnTypes2["RATIO"] = "RATIO";
1010
+ NumberColumnTypes2["PERCENT"] = "PERCENT";
1011
+ return NumberColumnTypes2;
1012
+ })(NumberColumnTypes || {});
1013
+ var NumberColumnTypeDisplayNames = /* @__PURE__ */ ((NumberColumnTypeDisplayNames2) => {
1014
+ NumberColumnTypeDisplayNames2["DOLLAR_AMT"] = "Currency";
1015
+ NumberColumnTypeDisplayNames2["QUANTITY"] = "Quantity";
1016
+ NumberColumnTypeDisplayNames2["RATIO"] = "Ratio";
1017
+ NumberColumnTypeDisplayNames2["PERCENT"] = "Percent";
1018
+ return NumberColumnTypeDisplayNames2;
1019
+ })(NumberColumnTypeDisplayNames || {});
1020
+ var DataExplorerTypes = /* @__PURE__ */ ((DataExplorerTypes2) => {
1021
+ DataExplorerTypes2["SUBJECT_TYPE"] = "subject";
1022
+ DataExplorerTypes2["VL_TYPE"] = "VL";
1023
+ return DataExplorerTypes2;
1024
+ })(DataExplorerTypes || {});
1025
+
1026
+ // src/Constants/defaults.ts
1027
+ var authenticationDefault = {
1028
+ token: void 0,
1029
+ apiKey: void 0,
1030
+ domain: void 0,
1031
+ dprKey: void 0,
1032
+ dprDomain: void 0
1033
+ };
1034
+ var dataFormattingDefault = {
1035
+ timestampFormat: "ISO8601" /* iso8601 */,
1036
+ currencyCode: "USD",
1037
+ languageCode: "en-US",
1038
+ currencyDecimals: 2,
1039
+ quantityDecimals: 2,
1040
+ ratioDecimals: 4,
1041
+ comparisonDisplay: "PERCENT",
1042
+ monthYearFormat: "MMMM YYYY",
1043
+ dayMonthYearFormat: "ll"
1044
+ };
1045
+ var autoQLConfigDefault = {
1046
+ debug: false,
1047
+ test: false,
1048
+ enableAutocomplete: true,
1049
+ enableQueryInterpretation: true,
1050
+ enableQueryValidation: true,
1051
+ enableQuerySuggestions: true,
1052
+ enableColumnVisibilityManager: true,
1053
+ enableDrilldowns: true,
1054
+ enableNotifications: false,
1055
+ enableCSVDownload: true,
1056
+ enableReportProblem: true
1057
+ };
1058
+ var dataConfigDefault = {
1059
+ stringColumnIndices: [],
1060
+ numberColumnIndices: [],
1061
+ stringColumnIndex: 0,
1062
+ legendColumnIndex: void 0,
1063
+ numberColumnIndex: 1
1064
+ };
1065
+ var getAuthentication = (prop = {}) => {
1066
+ return {
1067
+ ...authenticationDefault,
1068
+ ...prop
1069
+ };
1070
+ };
1071
+ var getDataFormatting = (prop = {}) => {
1072
+ return {
1073
+ ...dataFormattingDefault,
1074
+ ...prop
1075
+ };
1076
+ };
1077
+ var getAutoQLConfig = (prop = {}) => {
1078
+ return {
1079
+ ...autoQLConfigDefault,
1080
+ ...prop
1081
+ };
1082
+ };
1083
+ var getDataConfig = (prop = {}) => {
1084
+ return {
1085
+ ...dataConfigDefault,
1086
+ ...prop
1087
+ };
1088
+ };
1089
+
1090
+ // src/HelperFns/dataFormattingHelpers.ts
1091
+ var formatStringDateWithPrecision = (value, col) => {
1092
+ if (!value) {
1093
+ return void 0;
953
1094
  }
954
- const { minimumFractionDigits, maximumFractionDigits, notation } = getNumberFormatConfig(d, scale);
955
- let formattedLabel = d;
956
- if (scale == null ? void 0 : scale.showLabelDecimals) {
957
- formattedLabel = formatElement({
958
- element: d,
959
- column: column ?? (scale == null ? void 0 : scale.column),
960
- config: dataFormatting,
961
- isChart: true
962
- });
963
- } else {
964
- switch (type) {
965
- case "STRING": {
1095
+ let formattedValue = value;
1096
+ try {
1097
+ switch (col.precision) {
1098
+ case "DOW": {
1099
+ formattedValue = formatDOW(value, col);
966
1100
  break;
967
1101
  }
968
- case "DOLLAR_AMT": {
969
- if (Number(d) || Number(d) === 0) {
970
- const style = "currency";
971
- const currency = currencyCode || "USD";
972
- const currencyConfig = {
973
- style,
974
- minimumFractionDigits,
975
- maximumFractionDigits,
976
- notation
977
- };
978
- try {
979
- formattedLabel = new Intl.NumberFormat(languageCode, {
980
- ...currencyConfig,
981
- currency
982
- }).format(d);
983
- } catch (error) {
984
- console.error(error);
985
- formattedLabel = new Intl.NumberFormat(languageCode, {
986
- ...currencyConfig,
987
- currency: "USD"
988
- }).format(d);
989
- }
1102
+ case "HOUR": {
1103
+ const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1104
+ if (dayjsTime.isValid()) {
1105
+ formattedValue = dayjsTime.format("h:00A");
990
1106
  }
991
1107
  break;
992
1108
  }
993
- case "QUANTITY": {
994
- if (!isNaN(parseFloat(d))) {
995
- formattedLabel = new Intl.NumberFormat(languageCode, {
996
- minimumFractionDigits,
997
- maximumFractionDigits,
998
- notation
999
- }).format(d);
1109
+ case "MINUTE": {
1110
+ const dayjsTime = dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1111
+ if (dayjsTime.isValid()) {
1112
+ formattedValue = dayjsTime.format("h:mmA");
1000
1113
  }
1001
1114
  break;
1002
1115
  }
1003
- case "DATE": {
1004
- formattedLabel = formatDateType(d, col, config);
1005
- break;
1006
- }
1007
- case "DATE_STRING": {
1008
- formattedLabel = formatDateStringType(d, col, config);
1009
- break;
1010
- }
1011
- case "PERCENT": {
1012
- if (Number(d) || Number(d) === 0) {
1013
- const p = Number(d) / 100;
1014
- formattedLabel = new Intl.NumberFormat(languageCode, {
1015
- style: "percent",
1016
- minimumFractionDigits: 1,
1017
- maximumFractionDigits: 1
1018
- }).format(p);
1019
- }
1116
+ case "MONTH": {
1117
+ formattedValue = value;
1020
1118
  break;
1021
1119
  }
1022
1120
  default: {
1121
+ formattedValue = value;
1023
1122
  break;
1024
1123
  }
1025
1124
  }
1026
- }
1027
- const fullWidthLabel = formattedLabel;
1028
- if (typeof formattedLabel === "string" && maxLabelWidth && formattedLabel.length > maxLabelWidth) {
1029
- formattedLabel = `${formattedLabel.substring(0, maxLabelWidth)}...`;
1030
- }
1031
- return { fullWidthLabel, formattedLabel };
1032
- };
1033
- var getCurrencySymbol = (dataFormatting = dataFormattingDefault) => {
1034
- var _a;
1035
- try {
1036
- const { currencyCode, languageCode } = getDataFormatting(dataFormatting);
1037
- const formattedParts = new Intl.NumberFormat(languageCode, {
1038
- style: "currency",
1039
- currency: currencyCode
1040
- }).formatToParts(0);
1041
- const symbol = (_a = formattedParts.find((part) => (part == null ? void 0 : part.type) === "currency")) == null ? void 0 : _a.value;
1042
- return symbol;
1125
+ return formattedValue;
1043
1126
  } catch (error) {
1044
1127
  console.error(error);
1045
- return;
1128
+ return value;
1046
1129
  }
1047
1130
  };
1048
- var getDayjsObjForStringType = (value, col) => {
1131
+ var formatStringDate = (value, config = dataFormattingDefault) => {
1132
+ var _a;
1049
1133
  if (!value) {
1050
1134
  return void 0;
1051
1135
  }
1052
- try {
1053
- switch (col.precision) {
1054
- case "DOW": {
1055
- return void 0;
1056
- }
1057
- case "HOUR":
1058
- case "MINUTE": {
1059
- return dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1060
- }
1061
- case "MONTH": {
1062
- return void 0;
1063
- }
1064
- default: {
1065
- return void 0;
1066
- }
1067
- }
1068
- } catch (error) {
1069
- console.error(error);
1070
- return void 0;
1071
- }
1072
- };
1073
- var getDayJSObj = ({ value, column }) => {
1074
- if (column.type === "DATE_STRING") {
1075
- return getDayjsObjForStringType(value, column);
1076
- }
1077
- if (isNumber(value)) {
1078
- return dayjsWithPlugins_default.unix(value).utc();
1079
- }
1080
- return dayjsWithPlugins_default.utc(value).utc();
1081
- };
1082
- var getEpochFromDate = (date, precision, precisionFrame) => {
1083
- if (date == null ? void 0 : date.getTime) {
1084
- if (precision && precisionFrame === "start") {
1085
- return dayjsWithPlugins_default(date).utc().startOf(precision).valueOf();
1086
- } else if (precision && precisionFrame === "end") {
1087
- return dayjsWithPlugins_default(date).utc().endOf(precision).valueOf();
1088
- }
1089
- return date.getTime();
1090
- }
1091
- return;
1092
- };
1093
-
1094
- // src/HelperFns/arrayHelpers.ts
1095
- import isEqual from "lodash.isequal";
1096
- var invertArray = (array) => {
1097
- const numRows = array.length;
1098
- const numColumns = array[0].length;
1099
- const invertedArray = [];
1100
- for (let i = 0; i < numColumns; i++) {
1101
- invertedArray[i] = [];
1102
- for (let j = 0; j < numRows; j++) {
1103
- if (array[j][i])
1104
- invertedArray[i][j] = array[j][i];
1136
+ if (value && typeof value === "string") {
1137
+ const dateArray = value.split("-");
1138
+ const year = dateArray == null ? void 0 : dateArray[0];
1139
+ const day = dateArray == null ? void 0 : dateArray[2];
1140
+ let month;
1141
+ let week;
1142
+ if ((_a = dateArray == null ? void 0 : dateArray[1]) == null ? void 0 : _a.includes("W")) {
1143
+ week = dateArray == null ? void 0 : dateArray[1];
1144
+ } else {
1145
+ month = dateArray == null ? void 0 : dateArray[1];
1105
1146
  }
1106
- }
1107
- return invertedArray;
1108
- };
1109
- var functionsEqual = (a, b) => {
1110
- return (a == null ? void 0 : a.toString()) == (b == null ? void 0 : b.toString());
1111
- };
1112
- var isObject = (obj) => {
1113
- return typeof obj === "object" && !Array.isArray(obj) && obj !== null && obj !== void 0;
1114
- };
1115
- var deepEqual = (objA, objB) => {
1116
- const lodashIsEqual = isEqual(objA, objB);
1117
- if (lodashIsEqual) {
1118
- return true;
1119
- }
1120
- const objAIsObject = isObject(objA);
1121
- const objBIsObject = isObject(objB);
1122
- if (!objAIsObject || !objBIsObject) {
1123
- return lodashIsEqual;
1124
- }
1125
- const keysA = Object.keys(objA);
1126
- const keysB = Object.keys(objB);
1127
- if (keysA.length !== keysB.length) {
1128
- return false;
1129
- }
1130
- for (let i = 0; i < keysA.length; i++) {
1131
- if (typeof objA[keysA[i]] === "function" && typeof objB[keysA[i]] === "function") {
1132
- if (!functionsEqual(objA[keysA[i]], objB[keysA[i]])) {
1133
- return false;
1134
- }
1135
- } else if (!Object.hasOwnProperty.call(objB, keysA[i]) || !isEqual(objA[keysA[i]], objB[keysA[i]])) {
1136
- return false;
1147
+ const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
1148
+ const dayJSObj = dayjsWithPlugins_default.utc(value).utc();
1149
+ if (!dayJSObj.isValid()) {
1150
+ return value;
1137
1151
  }
1138
- }
1139
- return true;
1140
- };
1141
- var difference = (objA, objB) => {
1142
- const diff = [];
1143
- Object.keys(Object.assign({}, objA, objB)).forEach((key) => {
1144
- if (typeof objA[key] === "function" && typeof objB[key] === "function") {
1145
- if (!functionsEqual(objA[key], objB[key])) {
1146
- diff.push({
1147
- key,
1148
- objA: objA[key],
1149
- objB: objB[key]
1150
- });
1151
- }
1152
- } else if (!Object.is(objA[key], objB[key])) {
1153
- diff.push({
1154
- key,
1155
- objA: objA[key],
1156
- objB: objB[key]
1157
- });
1152
+ let date = value;
1153
+ if (day) {
1154
+ date = dayJSObj.format(dayMonthYearFormat);
1155
+ } else if (month) {
1156
+ date = dayJSObj.format(monthYearFormat);
1157
+ } else if (week) {
1158
+ } else if (year) {
1159
+ date = year;
1158
1160
  }
1159
- });
1160
- return diff;
1161
- };
1162
- var rotateArray = (array, n) => {
1163
- const rotated = [...array];
1164
- n = n % array.length;
1165
- if (n < 0)
1166
- n = array.length + n;
1167
- for (let i = 0; i < n; i++) {
1168
- rotated.unshift(rotated.pop());
1161
+ return date;
1169
1162
  }
1170
- return rotated;
1171
- };
1172
- var onlyUnique = (value, index, self) => {
1173
- return self.indexOf(value) === index;
1163
+ return value;
1174
1164
  };
1175
- var makeEmptyArray = (w, h, value = "") => {
1176
- var arr = [];
1177
- for (let i = 0; i < h; i++) {
1178
- arr[i] = [];
1179
- for (let j = 0; j < w; j++) {
1180
- arr[i][j] = value;
1181
- }
1165
+ var formatDateType = (element, column, config = dataFormattingDefault) => {
1166
+ if (isNumber(element)) {
1167
+ return formatEpochDate(element, column, config);
1182
1168
  }
1183
- return arr;
1184
- };
1185
-
1186
- // src/HelperFns/displayTypeHelpers.ts
1187
- var isChartType = (type) => CHART_TYPES.includes(type);
1188
- var isTableType = (type) => TABLE_TYPES.includes(type);
1189
- var isDisplayTypeValid = (response, displayType, dataLength, pivotDataLength, columns, isDataLimited) => {
1190
- var _a, _b;
1191
- const supportedDisplayTypes = getSupportedDisplayTypes({
1192
- response,
1193
- columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
1194
- dataLength,
1195
- pivotDataLength,
1196
- isDataLimited
1197
- });
1198
- const isValid = displayType && supportedDisplayTypes.includes(displayType);
1199
- return isValid;
1169
+ return formatISODateWithPrecision(element, column, config);
1200
1170
  };
1201
- var shouldPlotMultiSeries = (columns) => {
1202
- if (isAggregation(columns)) {
1203
- return false;
1171
+ var formatDateStringType = (element, column, config = dataFormattingDefault) => {
1172
+ if (!column) {
1173
+ return element;
1204
1174
  }
1205
- const multiSeriesIndex = columns.findIndex((col) => col.multi_series === true);
1206
- return multiSeriesIndex >= 0;
1175
+ if (column.precision) {
1176
+ return formatStringDateWithPrecision(element, column);
1177
+ }
1178
+ return formatStringDate(element, config);
1207
1179
  };
1208
- var supportsPieChart = (columns, chartData) => {
1209
- if (shouldPlotMultiSeries(columns)) {
1210
- return false;
1180
+ var formatISODateWithPrecision = (value, col, config = dataFormattingDefault) => {
1181
+ if (!value) {
1182
+ return void 0;
1211
1183
  }
1212
- if (chartData) {
1213
- return chartData.length < 7;
1184
+ if (!col) {
1185
+ return value;
1214
1186
  }
1215
- return true;
1216
- };
1217
- var supports2DCharts = (columns, dataLength) => {
1218
- if (dataLength <= 1) {
1219
- return false;
1187
+ const precision = col.precision;
1188
+ const { dayMonthYearFormat, monthYearFormat } = getDataFormatting(config);
1189
+ const dateDayJS = dayjsWithPlugins_default.utc(value).utc();
1190
+ if (!dateDayJS.isValid()) {
1191
+ return value;
1220
1192
  }
1221
- const { amountOfNumberColumns, amountOfStringColumns } = getColumnTypeAmounts(columns);
1222
- return amountOfNumberColumns > 0 && amountOfStringColumns > 0;
1223
- };
1224
- var supportsRegularPivotTable = (columns, dataLength, data) => {
1225
- var _a, _b;
1226
- if (dataLength <= 1) {
1227
- return false;
1193
+ let date = dateDayJS.format(dayMonthYearFormat);
1194
+ try {
1195
+ switch (precision) {
1196
+ case "DAY" /* DAY */: {
1197
+ break;
1198
+ }
1199
+ case "WEEK" /* WEEK */: {
1200
+ const dateJSStart = dateDayJS.startOf("week").format("MMM D");
1201
+ const dateJSEnd = dateDayJS.endOf("week").format("MMM D");
1202
+ const week = dateDayJS.week();
1203
+ const year = dateDayJS.format("YYYY");
1204
+ date = `${dateJSStart} - ${dateJSEnd}, ${year} (Week ${week})`;
1205
+ break;
1206
+ }
1207
+ case "MONTH" /* MONTH */: {
1208
+ date = dateDayJS.format(monthYearFormat);
1209
+ break;
1210
+ }
1211
+ case "QUARTER" /* QUARTER */: {
1212
+ const quarter = dateDayJS.quarter();
1213
+ const year = dateDayJS.format("YYYY");
1214
+ date = `${year}-Q${quarter}`;
1215
+ break;
1216
+ }
1217
+ case "YEAR" /* YEAR */: {
1218
+ date = dateDayJS.format("YYYY");
1219
+ break;
1220
+ }
1221
+ case "DATE_HOUR" /* DATE_HOUR */: {
1222
+ date = dateDayJS.format(`${dayMonthYearFormat} h:00A`);
1223
+ break;
1224
+ }
1225
+ case "DATE_MINUTE" /* DATE_MINUTE */: {
1226
+ date = dateDayJS.format(`${dayMonthYearFormat} h:mmA`);
1227
+ break;
1228
+ }
1229
+ default: {
1230
+ break;
1231
+ }
1232
+ }
1233
+ return date;
1234
+ } catch (error) {
1235
+ console.error(error);
1228
1236
  }
1229
- const groupbyColumns = getGroupableColumns(columns);
1230
- const hasTwoGroupables = (groupbyColumns == null ? void 0 : groupbyColumns.length) === 2;
1231
- if (!hasTwoGroupables) {
1232
- return false;
1237
+ };
1238
+ var formatEpochDate = (value, col, config = dataFormattingDefault) => {
1239
+ if (!value) {
1240
+ return void 0;
1233
1241
  }
1234
- const visibleColumns = getVisibleColumns(columns);
1235
- const groupbyColumn1 = columns[groupbyColumns[0]];
1236
- const groupbyColumn2 = columns[groupbyColumns[1]];
1237
- if (!groupbyColumn1.is_visible || !groupbyColumn2.is_visible || !((visibleColumns == null ? void 0 : visibleColumns.length) >= 3)) {
1238
- return false;
1242
+ if (!col) {
1243
+ return value;
1239
1244
  }
1240
- const column1Data = (data == null ? void 0 : data.map((row) => {
1241
- return row[groupbyColumns[0]];
1242
- })) ?? [];
1243
- const column2Data = (data == null ? void 0 : data.map((row) => {
1244
- return row[groupbyColumns[1]];
1245
- })) ?? [];
1246
- const uniqueData1Length = ((_a = column1Data == null ? void 0 : column1Data.filter(onlyUnique)) == null ? void 0 : _a.length) ?? 0;
1247
- const uniqueData2Length = ((_b = column2Data == null ? void 0 : column2Data.filter(onlyUnique)) == null ? void 0 : _b.length) ?? 0;
1248
- if (uniqueData1Length > MAX_LEGEND_LABELS && uniqueData2Length > MAX_LEGEND_LABELS) {
1249
- console.debug(
1250
- `Info: Pivot table will not be supported since there are too many unique fields. The calculated dimensions would be: ${uniqueData1Length} x ${uniqueData2Length}`
1251
- );
1252
- return false;
1245
+ try {
1246
+ const { monthYearFormat, dayMonthYearFormat } = getDataFormatting(config);
1247
+ const year = "YYYY";
1248
+ const monthYear = monthYearFormat;
1249
+ const dayMonthYear = dayMonthYearFormat;
1250
+ const title = col.title;
1251
+ let dayJSObj;
1252
+ if (isNaN(parseFloat(value))) {
1253
+ dayJSObj = dayjsWithPlugins_default.utc(value).utc();
1254
+ } else {
1255
+ dayJSObj = dayjsWithPlugins_default.unix(value).utc();
1256
+ }
1257
+ if (!dayJSObj.isValid()) {
1258
+ return value;
1259
+ }
1260
+ let date = dayJSObj.format(dayMonthYear);
1261
+ if (isNaN(parseFloat(value))) {
1262
+ if (title && title.toLowerCase().includes("year")) {
1263
+ date = dayJSObj.format(year);
1264
+ } else if (title && title.toLowerCase().includes("month")) {
1265
+ date = dayJSObj.format(monthYear);
1266
+ }
1267
+ date = dayJSObj.format(dayMonthYear);
1268
+ } else if (title && title.toLowerCase().includes("year")) {
1269
+ date = dayJSObj.format(year);
1270
+ } else if (title && title.toLowerCase().includes("month")) {
1271
+ date = dayJSObj.format(monthYear);
1272
+ }
1273
+ return date;
1274
+ } catch (error) {
1275
+ console.error(error);
1276
+ return value;
1253
1277
  }
1254
- return true;
1255
1278
  };
1256
- var supportsDatePivotTable = (columns) => {
1257
- var _a;
1258
- const dateColumnIndex = columns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
1259
- const dateColumn = columns[dateColumnIndex];
1260
- return dateColumn && ((_a = dateColumn == null ? void 0 : dateColumn.display_name) == null ? void 0 : _a.toLowerCase().includes("month")) && (columns == null ? void 0 : columns.length) === 2;
1279
+ var formatDOW = (value, col) => {
1280
+ let dowStyle = col.dow_style;
1281
+ if (!dowStyle) {
1282
+ dowStyle = "NUM_1_MON";
1283
+ }
1284
+ let formattedValue = value;
1285
+ let weekdayNumber = Number(value);
1286
+ switch (dowStyle) {
1287
+ case "NUM_1_MON": {
1288
+ const weekdays = WEEKDAY_NAMES_MON;
1289
+ const index = weekdayNumber - 1;
1290
+ if (index >= 0) {
1291
+ formattedValue = weekdays[index];
1292
+ } else {
1293
+ console.warn(`dow style is NUM_1_MON but the value could not be converted to a number: ${value}`);
1294
+ }
1295
+ break;
1296
+ }
1297
+ case "NUM_1_SUN": {
1298
+ const weekdays = WEEKDAY_NAMES_SUN;
1299
+ const index = weekdayNumber - 1;
1300
+ if (index >= 0) {
1301
+ formattedValue = weekdays[index];
1302
+ } else {
1303
+ console.warn(`dow style is NUM_1_SUN but the value could not be converted to a number: ${value}`);
1304
+ }
1305
+ break;
1306
+ }
1307
+ case "NUM_0_MON": {
1308
+ const weekdays = WEEKDAY_NAMES_MON;
1309
+ if (weekdayNumber >= 0) {
1310
+ formattedValue = weekdays[weekdayNumber];
1311
+ } else {
1312
+ console.warn(`dow style is NUM_0_MON but the value could not be converted to a number: ${value}`);
1313
+ }
1314
+ break;
1315
+ }
1316
+ case "NUM_0_SUN": {
1317
+ const weekdays = WEEKDAY_NAMES_SUN;
1318
+ if (weekdayNumber >= 0) {
1319
+ formattedValue = weekdays[weekdayNumber];
1320
+ } else {
1321
+ console.warn(`dow style is NUM_0_SUN but the value could not be converted to a number: ${value}`);
1322
+ }
1323
+ break;
1324
+ }
1325
+ case "ALPHA_MON":
1326
+ case "ALPHA_SUN": {
1327
+ const weekday = WEEKDAY_NAMES_MON.find((weekday2) => weekday2.toLowerCase().includes(value.trim().toLowerCase()));
1328
+ if (weekday) {
1329
+ formattedValue = weekday;
1330
+ } else {
1331
+ console.warn(`dow style is ALPHA but the value could not be matched to a weekday name: ${value}`);
1332
+ }
1333
+ break;
1334
+ }
1335
+ default: {
1336
+ console.warn(`could not format dow value. dow_style was not recognized: ${col.dow_style}`);
1337
+ break;
1338
+ }
1339
+ }
1340
+ return formattedValue;
1261
1341
  };
1262
- var isSingleValueResponse = (response) => {
1263
- var _a, _b, _c, _d, _e, _f;
1264
- if (!response) {
1265
- return false;
1342
+ var dateStringSortFnWithoutPrecision = (a, b) => {
1343
+ if (a.includes("-W")) {
1344
+ const aDateYear = a.substring(0, 4);
1345
+ const bDateYear = b.substring(0, 4);
1346
+ if (aDateYear !== bDateYear) {
1347
+ return aDateYear - bDateYear;
1348
+ } else {
1349
+ const aDateWeek = a.substring(6, 8);
1350
+ const bDateWeek = b.substring(6, 8);
1351
+ return aDateWeek - bDateWeek;
1352
+ }
1353
+ } else if (WEEKDAY_NAMES_MON.includes(a.trim())) {
1354
+ const aDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(a.trim().toLowerCase()));
1355
+ const bDayIndex = WEEKDAY_NAMES_MON.findIndex((d) => d.toLowerCase().includes(b.trim().toLowerCase()));
1356
+ let sortValue = a - b;
1357
+ if (aDayIndex >= 0 && bDayIndex >= 0) {
1358
+ sortValue = aDayIndex - bDayIndex;
1359
+ }
1360
+ return sortValue;
1361
+ } else if (MONTH_NAMES.includes(a.trim())) {
1362
+ const aMonthIndex = MONTH_NAMES.findIndex((m) => m === a.trim());
1363
+ const bMonthIndex = MONTH_NAMES.findIndex((m) => m === b.trim());
1364
+ if (aMonthIndex >= 0 && bMonthIndex >= 0) {
1365
+ return bMonthIndex - aMonthIndex;
1366
+ }
1367
+ return a - b;
1368
+ } else if (SEASON_NAMES.includes(a.substr(0, 2))) {
1369
+ const aSeasonIndex = SEASON_NAMES.findIndex((s) => s === a.substr(0, 2));
1370
+ const bSeasonIndex = SEASON_NAMES.findIndex((s) => s === b.substr(0, 2));
1371
+ const aYear = Number(a.substr(2));
1372
+ const bYear = Number(b.substr(2));
1373
+ if (aYear === bYear) {
1374
+ return aSeasonIndex - bSeasonIndex;
1375
+ }
1376
+ return aYear - bYear;
1266
1377
  }
1267
- const rows = (_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.rows;
1268
- const columns = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.columns;
1269
- const referenceID = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.reference_id;
1270
- const hasNoData = rows && !(rows == null ? void 0 : rows.length);
1271
- const hasOneColumn = (columns == null ? void 0 : columns.length) === 1;
1272
- if (hasNoData && hasOneColumn && referenceID === "1.1.211") {
1273
- return true;
1378
+ return a - b;
1379
+ };
1380
+ var dateStringSortFn = (a, b, col) => {
1381
+ if (typeof a !== "string" || typeof b !== "string" || !col) {
1382
+ return a - b;
1274
1383
  }
1275
- const oneRowAndColumn = (rows == null ? void 0 : rows.length) === 1 && ((_f = rows[0]) == null ? void 0 : _f.length) === 1;
1276
- if (oneRowAndColumn) {
1277
- return true;
1384
+ const aTrimmed = a.trim();
1385
+ const bTrimmed = b.trim();
1386
+ switch (col.precision) {
1387
+ case "DOW": {
1388
+ const dowStyle = col.dow_style ?? "ALPHA_MON";
1389
+ let aIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
1390
+ let bIndex = WEEKDAY_NAMES_MON.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
1391
+ if (dowStyle === "ALPHA_SUN") {
1392
+ aIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(aTrimmed.toLowerCase()));
1393
+ bIndex = WEEKDAY_NAMES_SUN.findIndex((dow) => dow.toLowerCase().includes(bTrimmed.toLowerCase()));
1394
+ }
1395
+ return aIndex - bIndex;
1396
+ }
1397
+ case "HOUR":
1398
+ case "MINUTE": {
1399
+ const aDayjsTime = dayjsWithPlugins_default.utc(aTrimmed, "THH:mm:ss.SSSZ").utc();
1400
+ const bDayjsTime = dayjsWithPlugins_default.utc(bTrimmed, "THH:mm:ss.SSSZ").utc();
1401
+ return aDayjsTime.unix() - bDayjsTime.unix();
1402
+ }
1403
+ case "MONTH": {
1404
+ MONTH_NAMES;
1405
+ const aMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === aTrimmed.toLowerCase());
1406
+ const bMonthIndex = MONTH_NAMES.findIndex((m) => m.toLowerCase() === bTrimmed.toLowerCase());
1407
+ return aMonthIndex - bMonthIndex;
1408
+ }
1409
+ default: {
1410
+ return dateStringSortFnWithoutPrecision(aTrimmed, bTrimmed);
1411
+ }
1278
1412
  }
1279
- return false;
1280
1413
  };
1281
- var getSupportedDisplayTypes = ({
1282
- response,
1283
- columns,
1284
- dataLength,
1285
- pivotDataLength,
1286
- isDataLimited
1287
- } = {}) => {
1288
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1414
+ var dateSortFn = (a, b, col, isTable) => {
1289
1415
  try {
1290
- if (!((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.display_type)) {
1291
- return [];
1416
+ if (!a && !b) {
1417
+ return 0;
1418
+ } else if (!a && b) {
1419
+ return 1;
1420
+ } else if (a && !b || !col) {
1421
+ return -1;
1292
1422
  }
1293
- const displayType = response.data.data.display_type;
1294
- if (displayType === "suggestion" || displayType === "help" || displayType === "html") {
1295
- return [displayType];
1423
+ let aDate = Number(a);
1424
+ let bDate = Number(b);
1425
+ let sortValue = aDate - bDate;
1426
+ if (isNaN(aDate) || isNaN(bDate)) {
1427
+ if (col.type === "DATE_STRING") {
1428
+ sortValue = dateStringSortFn(a, b, col);
1429
+ } else {
1430
+ sortValue = dayjsWithPlugins_default.utc(a).unix() - dayjsWithPlugins_default.utc(b).unix();
1431
+ }
1296
1432
  }
1297
- const rows = ((_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.rows) ?? [];
1298
- const allColumns = columns || ((_f = (_e = response == null ? void 0 : response.data) == null ? void 0 : _e.data) == null ? void 0 : _f.columns);
1299
- const visibleColumns = getVisibleColumns(allColumns);
1300
- if (!(visibleColumns == null ? void 0 : visibleColumns.length)) {
1301
- return ["text"];
1433
+ if (isTable && col.precision === "DOW") {
1434
+ sortValue = -1 * sortValue;
1302
1435
  }
1303
- if (isSingleValueResponse(response)) {
1304
- return ["single-value"];
1436
+ return sortValue;
1437
+ } catch (error) {
1438
+ console.error(error);
1439
+ return -1;
1440
+ }
1441
+ };
1442
+ var sortDataByDate = (data, tableColumns, sortDirection = "desc", isTable) => {
1443
+ try {
1444
+ if (!data || typeof data !== "object") {
1445
+ throw new Error("Could not sort data by date - no data supplied");
1305
1446
  }
1306
- if (!(rows == null ? void 0 : rows.length)) {
1307
- return ["table"];
1447
+ const dateColumnIndex = getDateColumnIndex(tableColumns);
1448
+ const dateColumn = tableColumns[dateColumnIndex];
1449
+ if (dateColumnIndex >= 0) {
1450
+ let multiplier = sortDirection === "desc" ? -1 : 1;
1451
+ const sortedData = [...data].sort(
1452
+ (a, b) => multiplier * dateSortFn(a[dateColumnIndex], b[dateColumnIndex], dateColumn, isTable)
1453
+ );
1454
+ return sortedData;
1308
1455
  }
1309
- const maxRowsForPieChart = 10;
1310
- const numRows = dataLength ?? rows.length;
1311
- let pivotDataHasLength = true;
1312
- const pivotDataLengthProvided = pivotDataLength !== void 0 && pivotDataLength !== null;
1313
- if (pivotDataLengthProvided) {
1314
- pivotDataHasLength = !!pivotDataLength;
1456
+ } catch (error) {
1457
+ console.error(error);
1458
+ }
1459
+ return data;
1460
+ };
1461
+ var formatElement = ({
1462
+ element,
1463
+ column,
1464
+ config = dataFormattingDefault,
1465
+ htmlElement,
1466
+ isChart = false
1467
+ }) => {
1468
+ try {
1469
+ let formattedElement = element;
1470
+ const { currencyCode, languageCode, currencyDecimals, quantityDecimals, ratioDecimals } = getDataFormatting(config);
1471
+ let type = column == null ? void 0 : column.type;
1472
+ if (isChart && ["count", "deviation", "variance"].includes(column == null ? void 0 : column.aggType)) {
1473
+ type = "QUANTITY";
1474
+ }
1475
+ if (column) {
1476
+ switch (type) {
1477
+ case "STRING": {
1478
+ break;
1479
+ }
1480
+ case "DOLLAR_AMT": {
1481
+ const elementNumber = parseFloat(`${element}`);
1482
+ if (!isNaN(elementNumber)) {
1483
+ const currency = currencyCode || "USD";
1484
+ const validatedCurrencyDecimals = currencyDecimals || currencyDecimals === 0 ? currencyDecimals : void 0;
1485
+ try {
1486
+ formattedElement = new Intl.NumberFormat(languageCode, {
1487
+ style: "currency",
1488
+ currency: `${currency}`,
1489
+ minimumFractionDigits: validatedCurrencyDecimals,
1490
+ maximumFractionDigits: validatedCurrencyDecimals
1491
+ }).format(elementNumber);
1492
+ } catch (error) {
1493
+ console.error(error);
1494
+ formattedElement = new Intl.NumberFormat(languageCode, {
1495
+ style: "currency",
1496
+ currency: "USD",
1497
+ minimumFractionDigits: validatedCurrencyDecimals,
1498
+ maximumFractionDigits: validatedCurrencyDecimals
1499
+ }).format(elementNumber);
1500
+ }
1501
+ }
1502
+ break;
1503
+ }
1504
+ case "QUANTITY": {
1505
+ const validatedQuantityDecimals = !isNaN(quantityDecimals) ? quantityDecimals : 2;
1506
+ const elementNumber = parseFloat(`${element}`);
1507
+ if (!isNaN(elementNumber)) {
1508
+ const numDecimals = elementNumber % 1 !== 0 ? validatedQuantityDecimals : 0;
1509
+ formattedElement = new Intl.NumberFormat(languageCode, {
1510
+ minimumFractionDigits: numDecimals,
1511
+ maximumFractionDigits: numDecimals
1512
+ }).format(elementNumber);
1513
+ }
1514
+ break;
1515
+ }
1516
+ case "DATE": {
1517
+ formattedElement = formatDateType(element, column, config);
1518
+ break;
1519
+ }
1520
+ case "DATE_STRING": {
1521
+ formattedElement = formatDateStringType(element, column, config);
1522
+ break;
1523
+ }
1524
+ case "RATIO": {
1525
+ const numDecimals = !isNaN(ratioDecimals) ? ratioDecimals : 4;
1526
+ const elementNumber = parseFloat(`${element}`);
1527
+ if (!isNaN(elementNumber)) {
1528
+ formattedElement = new Intl.NumberFormat(languageCode, {
1529
+ minimumFractionDigits: numDecimals,
1530
+ maximumFractionDigits: numDecimals
1531
+ }).format(elementNumber);
1532
+ }
1533
+ break;
1534
+ }
1535
+ case "PERCENT": {
1536
+ const elementNumber = parseFloat(`${element}`);
1537
+ if (!isNaN(elementNumber)) {
1538
+ const p = elementNumber / 100;
1539
+ formattedElement = new Intl.NumberFormat(languageCode, {
1540
+ style: "percent",
1541
+ minimumFractionDigits: 2,
1542
+ maximumFractionDigits: 2
1543
+ }).format(p);
1544
+ if (htmlElement) {
1545
+ if (elementNumber < 0) {
1546
+ htmlElement.classList.add("comparison-value-negative");
1547
+ } else if (elementNumber > 0) {
1548
+ htmlElement.classList.add("comparison-value-positive");
1549
+ }
1550
+ }
1551
+ }
1552
+ break;
1553
+ }
1554
+ default: {
1555
+ break;
1556
+ }
1557
+ }
1558
+ }
1559
+ return formattedElement;
1560
+ } catch (error) {
1561
+ console.error(error);
1562
+ return element;
1563
+ }
1564
+ };
1565
+ var getNumberFormatConfig = (d, scale) => {
1566
+ var _a, _b;
1567
+ let minimumFractionDigits = 0;
1568
+ let maximumFractionDigits = 0;
1569
+ let notation;
1570
+ 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]);
1571
+ const smallDomain = domainRange && domainRange < 10;
1572
+ const absValue = Math.abs(d);
1573
+ if (smallDomain) {
1574
+ minimumFractionDigits = 2;
1575
+ maximumFractionDigits = 2;
1576
+ } else if (absValue >= 1e3) {
1577
+ notation = "compact";
1578
+ if (absValue > 1e9) {
1579
+ maximumFractionDigits = 3;
1580
+ } else if (absValue > 1e6) {
1581
+ maximumFractionDigits = 2;
1582
+ } else if (absValue > 1e3) {
1583
+ maximumFractionDigits = 1;
1315
1584
  }
1316
- if (supportsRegularPivotTable(visibleColumns, numRows, (_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.rows)) {
1317
- const supportedDisplayTypes = ["table"];
1318
- if (!isDataLimited) {
1319
- supportedDisplayTypes.push("pivot_table");
1585
+ }
1586
+ return { minimumFractionDigits, maximumFractionDigits, notation };
1587
+ };
1588
+ var formatChartLabel = ({ d, scale, column, dataFormatting, maxLabelWidth }) => {
1589
+ if (d === null) {
1590
+ return {
1591
+ fullWidthLabel: "Untitled Category",
1592
+ formattedLabel: "Untitled Category"
1593
+ };
1594
+ }
1595
+ const col = column ?? (scale == null ? void 0 : scale.column);
1596
+ if (!col || !col.type) {
1597
+ return {
1598
+ fullWidthLabel: d,
1599
+ formattedLabel: d
1600
+ };
1601
+ }
1602
+ const config = (scale == null ? void 0 : scale.dataFormatting) ?? dataFormatting;
1603
+ const { currencyCode, languageCode } = config;
1604
+ let type = col.type;
1605
+ if ((scale == null ? void 0 : scale.units) === "none") {
1606
+ type = "QUANTITY";
1607
+ }
1608
+ const { minimumFractionDigits, maximumFractionDigits, notation } = getNumberFormatConfig(d, scale);
1609
+ let formattedLabel = d;
1610
+ if (scale == null ? void 0 : scale.showLabelDecimals) {
1611
+ formattedLabel = formatElement({
1612
+ element: d,
1613
+ column: column ?? (scale == null ? void 0 : scale.column),
1614
+ config: dataFormatting,
1615
+ isChart: true
1616
+ });
1617
+ } else {
1618
+ switch (type) {
1619
+ case "STRING": {
1620
+ break;
1320
1621
  }
1321
- if (
1322
- // Comment out for now so chart row count doesnt change display type
1323
- // numRows <= maxRowsForPivot &&
1324
- pivotDataHasLength
1325
- ) {
1326
- supportedDisplayTypes.push("stacked_column", "stacked_bar", "column", "bar", "bubble", "heatmap");
1327
- if (hasDateColumn(visibleColumns)) {
1328
- supportedDisplayTypes.push("stacked_line", "line");
1622
+ case "DOLLAR_AMT": {
1623
+ if (Number(d) || Number(d) === 0) {
1624
+ const style = "currency";
1625
+ const currency = currencyCode || "USD";
1626
+ const currencyConfig = {
1627
+ style,
1628
+ minimumFractionDigits,
1629
+ maximumFractionDigits,
1630
+ notation
1631
+ };
1632
+ try {
1633
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1634
+ ...currencyConfig,
1635
+ currency
1636
+ }).format(d);
1637
+ } catch (error) {
1638
+ console.error(error);
1639
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1640
+ ...currencyConfig,
1641
+ currency: "USD"
1642
+ }).format(d);
1643
+ }
1329
1644
  }
1645
+ break;
1330
1646
  }
1331
- return supportedDisplayTypes;
1332
- } else if (supports2DCharts(visibleColumns, numRows)) {
1333
- const supportedDisplayTypes = ["table", "column", "bar"];
1334
- if (numRows > MIN_HISTOGRAM_SAMPLE) {
1335
- supportedDisplayTypes.push("histogram");
1336
- }
1337
- if (hasDateColumn(visibleColumns)) {
1338
- supportedDisplayTypes.push("line");
1647
+ case "QUANTITY": {
1648
+ if (!isNaN(parseFloat(d))) {
1649
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1650
+ minimumFractionDigits,
1651
+ maximumFractionDigits,
1652
+ notation
1653
+ }).format(d);
1654
+ }
1655
+ break;
1339
1656
  }
1340
- if (numRows > 1 && numRows <= maxRowsForPieChart) {
1341
- supportedDisplayTypes.push("pie");
1657
+ case "DATE": {
1658
+ formattedLabel = formatDateType(d, col, config);
1659
+ break;
1342
1660
  }
1343
- const { amountOfNumberColumns } = getColumnTypeAmounts(visibleColumns);
1344
- if (amountOfNumberColumns > 1) {
1345
- supportedDisplayTypes.push("column_line");
1346
- supportedDisplayTypes.push("scatterplot");
1661
+ case "DATE_STRING": {
1662
+ formattedLabel = formatDateStringType(d, col, config);
1663
+ break;
1347
1664
  }
1348
- if (!isDataLimited && supportsDatePivotTable(visibleColumns)) {
1349
- const dateColumnIndex = visibleColumns.findIndex((col) => col.type === "DATE" || col.type === "DATE_STRING");
1350
- const dateColumn = visibleColumns[dateColumnIndex];
1351
- const data = (_j = (_i = response == null ? void 0 : response.data) == null ? void 0 : _i.data) == null ? void 0 : _j.rows;
1352
- const uniqueYears = [];
1353
- data.forEach((row) => {
1354
- const year = formatElement({
1355
- element: row[dateColumnIndex],
1356
- column: dateColumn,
1357
- config: getDataFormatting({ monthYearFormat: "YYYY", dayMonthYearFormat: "YYYY" })
1358
- });
1359
- if (!uniqueYears.includes(year)) {
1360
- uniqueYears.push(year);
1361
- }
1362
- });
1363
- if (uniqueYears.length > 1) {
1364
- supportedDisplayTypes.push("pivot_table");
1665
+ case "PERCENT": {
1666
+ if (Number(d) || Number(d) === 0) {
1667
+ const p = Number(d) / 100;
1668
+ formattedLabel = new Intl.NumberFormat(languageCode, {
1669
+ style: "percent",
1670
+ minimumFractionDigits: 1,
1671
+ maximumFractionDigits: 1
1672
+ }).format(p);
1365
1673
  }
1674
+ break;
1675
+ }
1676
+ default: {
1677
+ break;
1366
1678
  }
1367
- return supportedDisplayTypes;
1368
1679
  }
1369
- return ["table"];
1370
- } catch (error) {
1371
- console.error(error);
1372
- return ["table"];
1373
1680
  }
1374
- };
1375
- var getFirstChartDisplayType = (supportedDisplayTypes, fallback) => {
1376
- const chartType = supportedDisplayTypes.find((displayType) => isChartType(displayType));
1377
- if (chartType) {
1378
- return chartType;
1681
+ const fullWidthLabel = formattedLabel;
1682
+ if (typeof formattedLabel === "string" && maxLabelWidth && formattedLabel.length > maxLabelWidth) {
1683
+ formattedLabel = `${formattedLabel.substring(0, maxLabelWidth)}...`;
1379
1684
  }
1380
- return fallback;
1685
+ return { fullWidthLabel, formattedLabel };
1381
1686
  };
1382
- var getDefaultDisplayType = (response, defaultToChart, columns, dataLength, pivotDataLength, preferredDisplayType, isDataLimited = false) => {
1383
- var _a, _b, _c, _d, _e, _f, _g, _h;
1384
- const supportedDisplayTypes = getSupportedDisplayTypes({
1385
- response,
1386
- columns: columns ?? ((_b = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.columns),
1387
- dataLength,
1388
- pivotDataLength,
1389
- isDataLimited
1390
- });
1391
- if (preferredDisplayType && supportedDisplayTypes.includes(preferredDisplayType)) {
1392
- return preferredDisplayType;
1393
- }
1394
- const responseDisplayType = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.display_type;
1395
- if (supportedDisplayTypes.includes(preferredDisplayType)) {
1396
- return preferredDisplayType;
1397
- }
1398
- if (responseDisplayType === "suggestion" || responseDisplayType === "help" || responseDisplayType === "html") {
1399
- return responseDisplayType;
1687
+ var getCurrencySymbol = (dataFormatting = dataFormattingDefault) => {
1688
+ var _a;
1689
+ try {
1690
+ const { currencyCode, languageCode } = getDataFormatting(dataFormatting);
1691
+ const formattedParts = new Intl.NumberFormat(languageCode, {
1692
+ style: "currency",
1693
+ currency: currencyCode
1694
+ }).formatToParts(0);
1695
+ const symbol = (_a = formattedParts.find((part) => (part == null ? void 0 : part.type) === "currency")) == null ? void 0 : _a.value;
1696
+ return symbol;
1697
+ } catch (error) {
1698
+ console.error(error);
1699
+ return;
1400
1700
  }
1401
- if (supportedDisplayTypes.length === 1) {
1402
- return supportedDisplayTypes[0];
1701
+ };
1702
+ var getDayjsObjForStringType = (value, col) => {
1703
+ if (!value) {
1704
+ return void 0;
1403
1705
  }
1404
- if (supportedDisplayTypes.includes("pivot_table")) {
1405
- let displayType = "pivot_table";
1406
- if (defaultToChart) {
1407
- 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";
1706
+ try {
1707
+ switch (col.precision) {
1708
+ case "DOW": {
1709
+ return void 0;
1710
+ }
1711
+ case "HOUR":
1712
+ case "MINUTE": {
1713
+ return dayjsWithPlugins_default.utc(value, "THH:mm:ss.SSSZ").utc();
1714
+ }
1715
+ case "MONTH": {
1716
+ return void 0;
1717
+ }
1718
+ default: {
1719
+ return void 0;
1720
+ }
1408
1721
  }
1409
- return displayType;
1722
+ } catch (error) {
1723
+ console.error(error);
1724
+ return void 0;
1410
1725
  }
1411
- if (!responseDisplayType && hasData(response) || responseDisplayType === "data") {
1412
- let displayType = "table";
1413
- if (defaultToChart) {
1414
- displayType = isAggregation((_h = (_g = response == null ? void 0 : response.data) == null ? void 0 : _g.data) == null ? void 0 : _h.columns) ? getFirstChartDisplayType(supportedDisplayTypes, "table") : "table";
1415
- }
1416
- return displayType;
1726
+ };
1727
+ var getDayJSObj = ({ value, column }) => {
1728
+ if (column.type === "DATE_STRING") {
1729
+ return getDayjsObjForStringType(value, column);
1417
1730
  }
1418
- return "text";
1731
+ if (isNumber(value)) {
1732
+ return dayjsWithPlugins_default.unix(value).utc();
1733
+ }
1734
+ return dayjsWithPlugins_default.utc(value).utc();
1419
1735
  };
1420
- var hasData = (response) => {
1421
- var _a, _b, _c;
1422
- if (!response) {
1423
- return false;
1736
+ var getEpochFromDate = (date, precision, precisionFrame) => {
1737
+ if (date == null ? void 0 : date.getTime) {
1738
+ if (precision && precisionFrame === "start") {
1739
+ return dayjsWithPlugins_default(date).utc().startOf(precision).valueOf();
1740
+ } else if (precision && precisionFrame === "end") {
1741
+ return dayjsWithPlugins_default(date).utc().endOf(precision).valueOf();
1742
+ }
1743
+ return date.getTime();
1424
1744
  }
1425
- 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;
1745
+ return;
1426
1746
  };
1427
1747
 
1428
1748
  // src/HelperFns/domHelpers.ts
@@ -2281,7 +2601,8 @@ var getLinearScale = ({
2281
2601
  const config = getDataFormatting(dataFormatting);
2282
2602
  const colIndices = columnIndices ?? [columnIndex];
2283
2603
  const scaleRange = range ?? getRangeForAxis({ axis, height, width });
2284
- const axisColumns = (colIndices == null ? void 0 : colIndices.map((index) => columns[index])) ?? [];
2604
+ const axisColumns = (colIndices == null ? void 0 : colIndices.map((index) => columns == null ? void 0 : columns[index])) ?? [];
2605
+ console.log({ axisColumns });
2285
2606
  const axisTitle = title ?? getLinearAxisTitle({
2286
2607
  numberColumns: axisColumns,
2287
2608
  aggregated
@@ -2291,7 +2612,7 @@ var getLinearScale = ({
2291
2612
  scale.minValue = domainFinal[0];
2292
2613
  scale.maxValue = domainFinal[1];
2293
2614
  scale.columnIndex = columnIndex;
2294
- scale.column = columns[columnIndex];
2615
+ scale.column = columns == null ? void 0 : columns[columnIndex];
2295
2616
  scale.fields = axisColumns;
2296
2617
  scale.dataFormatting = config;
2297
2618
  scale.hasDropdown = hasDropdown ?? enableAxisDropdown;
@@ -2620,26 +2941,61 @@ var mergeBboxes = (boundingBoxes) => {
2620
2941
  return void 0;
2621
2942
  }
2622
2943
  };
2944
+
2945
+ // src/errorMessages.ts
2946
+ 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.";
2947
+ 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.";
2948
+ 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.";
2949
+ 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.";
2950
+ var REQUEST_CANCELLED_ERROR = "Request cancelled";
2623
2951
  export {
2624
2952
  AGG_TYPES,
2625
2953
  CHART_TYPES,
2954
+ COMPARE_TYPE,
2955
+ CONTINUOUS_TYPE,
2956
+ CUSTOM_TYPE,
2957
+ DATA_ALERT_CONDITION_TYPES,
2958
+ DATA_ALERT_ENABLED_STATUSES,
2959
+ DATA_ALERT_FREQUENCY_TYPE_OPTIONS,
2960
+ DATA_ALERT_OPERATORS,
2961
+ DATA_ALERT_STATUSES,
2626
2962
  DATE_ONLY_CHART_TYPES,
2627
2963
  DAYJS_PRECISION_FORMATS,
2628
2964
  DEFAULT_AGG_TYPE,
2629
2965
  DEFAULT_DATA_PAGE_SIZE,
2966
+ DEFAULT_EVALUATION_FREQUENCY,
2967
+ DEFAULT_SOURCE,
2630
2968
  DOUBLE_AXIS_CHART_TYPES,
2631
2969
  DOW_STYLES,
2970
+ DataExplorerTypes,
2632
2971
  DateUTC,
2972
+ EVALUATION_FREQUENCY_OPTIONS,
2973
+ EXISTS_TYPE,
2974
+ GENERAL_ERROR,
2975
+ GENERAL_HTML_ERROR,
2976
+ GENERAL_QUERY_ERROR,
2977
+ GROUP_TERM_TYPE,
2633
2978
  MAX_DATA_PAGE_SIZE,
2634
2979
  MAX_LEGEND_LABELS,
2635
2980
  MIN_HISTOGRAM_SAMPLE,
2981
+ MONTH_DAY_SELECT_OPTIONS,
2636
2982
  MONTH_NAMES,
2983
+ NUMBER_TERM_TYPE,
2637
2984
  NumberColumnTypeDisplayNames,
2638
2985
  NumberColumnTypes,
2986
+ PERIODIC_TYPE,
2987
+ PROJECT_TYPE,
2639
2988
  PrecisionTypes,
2989
+ QUERY_TERM_TYPE,
2990
+ REQUEST_CANCELLED_ERROR,
2991
+ RESET_PERIOD_OPTIONS,
2992
+ SCHEDULED_TYPE,
2993
+ SCHEDULE_FREQUENCY_OPTIONS,
2994
+ SCHEDULE_INTERVAL_OPTIONS,
2640
2995
  SEASON_NAMES,
2641
2996
  TABLE_TYPES,
2642
2997
  TimestampFormats,
2998
+ UNAUTHENTICATED_ERROR,
2643
2999
  WEEKDAY_NAMES_MON,
2644
3000
  WEEKDAY_NAMES_SUN,
2645
3001
  animateInputText,