autoql-fe-utils 1.11.18 → 1.11.21

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
@@ -1179,6 +1179,7 @@ __export(index_exports, {
1179
1179
  supportsNetworkGraph: () => supportsNetworkGraph,
1180
1180
  supportsPieChart: () => supportsPieChart,
1181
1181
  supportsRegularPivotTable: () => supportsRegularPivotTable,
1182
+ supportsSankey: () => supportsSankey,
1182
1183
  svgPathD: () => svgPathD,
1183
1184
  svgToPng: () => svgToPng,
1184
1185
  titlelizeString: () => titlelizeString,
@@ -1360,6 +1361,7 @@ var DisplayTypes = /* @__PURE__ */ ((DisplayTypes2) => {
1360
1361
  DisplayTypes2["SCATTERPLOT"] = "scatterplot";
1361
1362
  DisplayTypes2["COLUMN_LINE"] = "column_line";
1362
1363
  DisplayTypes2["NETWORK_GRAPH"] = "network_graph";
1364
+ DisplayTypes2["SANKEY"] = "sankey";
1363
1365
  return DisplayTypes2;
1364
1366
  })(DisplayTypes || {});
1365
1367
  var QueryErrorTypes = /* @__PURE__ */ ((QueryErrorTypes2) => {
@@ -1561,7 +1563,8 @@ var CHART_TYPES = [
1561
1563
  "column_line" /* COLUMN_LINE */,
1562
1564
  "histogram" /* HISTOGRAM */,
1563
1565
  "scatterplot" /* SCATTERPLOT */,
1564
- "network_graph" /* NETWORK_GRAPH */
1566
+ "network_graph" /* NETWORK_GRAPH */,
1567
+ "sankey" /* SANKEY */
1565
1568
  ];
1566
1569
  var CHARTS_WITHOUT_LEGENDS = [
1567
1570
  "pie" /* PIE */,
@@ -1569,16 +1572,18 @@ var CHARTS_WITHOUT_LEGENDS = [
1569
1572
  "bubble" /* BUBBLE */,
1570
1573
  "scatterplot" /* SCATTERPLOT */,
1571
1574
  "histogram" /* HISTOGRAM */,
1572
- "network_graph" /* NETWORK_GRAPH */
1575
+ "network_graph" /* NETWORK_GRAPH */,
1576
+ "sankey" /* SANKEY */
1573
1577
  ];
1574
1578
  var CHARTS_WITHOUT_AGGREGATED_DATA = [
1575
1579
  "histogram" /* HISTOGRAM */,
1576
1580
  "scatterplot" /* SCATTERPLOT */,
1577
- "network_graph" /* NETWORK_GRAPH */
1581
+ "network_graph" /* NETWORK_GRAPH */,
1582
+ "sankey" /* SANKEY */
1578
1583
  ];
1579
1584
  var DATE_ONLY_CHART_TYPES = ["line" /* LINE */, "stacked_line" /* STACKED_LINE */];
1580
1585
  var DOUBLE_AXIS_CHART_TYPES = ["column_line" /* COLUMN_LINE */];
1581
- var CHARTS_WITHOUT_AXES = ["pie" /* PIE */, "network_graph" /* NETWORK_GRAPH */];
1586
+ var CHARTS_WITHOUT_AXES = ["pie" /* PIE */, "network_graph" /* NETWORK_GRAPH */, "sankey" /* SANKEY */];
1582
1587
  var DEFAULT_CHART_CONFIG = {
1583
1588
  isScaled: false
1584
1589
  };
@@ -2684,18 +2689,33 @@ var getUniqueYearsForColumn = (data, columns, index) => {
2684
2689
  return uniqueYears;
2685
2690
  };
2686
2691
  var supportsNetworkGraph = (data, columns) => {
2687
- if (!data || data.length < 2) return false;
2688
- if (!columns || columns.length < 2) return false;
2692
+ var _a2, _b2;
2693
+ const logUnsupportedReason = (message) => {
2694
+ console.warn(`[supportsNetworkGraph] ${message}`);
2695
+ };
2696
+ if (!data || data.length < 2) {
2697
+ logUnsupportedReason(`Insufficient rows (${(_a2 = data == null ? void 0 : data.length) != null ? _a2 : 0}). Need at least 2 rows.`);
2698
+ return false;
2699
+ }
2700
+ if (!columns || columns.length < 2) {
2701
+ logUnsupportedReason(`Insufficient columns (${(_b2 = columns == null ? void 0 : columns.length) != null ? _b2 : 0}). Need at least 2 visible columns.`);
2702
+ return false;
2703
+ }
2689
2704
  const networkColumns = findNetworkColumns(columns);
2690
- if (!networkColumns || networkColumns.sourceColumnIndex === -1 || networkColumns.targetColumnIndex === -1)
2705
+ if (!networkColumns || networkColumns.sourceColumnIndex === -1 || networkColumns.targetColumnIndex === -1) {
2706
+ logUnsupportedReason("Unable to determine source/target columns from provided metadata.");
2691
2707
  return false;
2708
+ }
2692
2709
  const { sourceColumnIndex, targetColumnIndex } = networkColumns;
2693
2710
  const sourceValues = data.map((row) => row[sourceColumnIndex]).filter(Boolean);
2694
2711
  const targetValues = data.map((row) => row[targetColumnIndex]).filter(Boolean);
2695
2712
  const uniqueSources = new Set(sourceValues);
2696
2713
  const uniqueTargets = new Set(targetValues);
2697
2714
  const totalUniqueEntities = (/* @__PURE__ */ new Set([...uniqueSources, ...uniqueTargets])).size;
2698
- if (totalUniqueEntities < 1) return false;
2715
+ if (totalUniqueEntities < 2) {
2716
+ logUnsupportedReason(`Found only ${totalUniqueEntities} unique node(s). Need at least 2.`);
2717
+ return false;
2718
+ }
2699
2719
  const sourceCounts = {};
2700
2720
  const targetCounts = {};
2701
2721
  const relationshipPairs = /* @__PURE__ */ new Set();
@@ -2709,9 +2729,18 @@ var supportsNetworkGraph = (data, columns) => {
2709
2729
  }
2710
2730
  });
2711
2731
  const actualConnections = relationshipPairs.size;
2712
- if (actualConnections === 0) return false;
2732
+ if (actualConnections === 0) {
2733
+ logUnsupportedReason("No valid source\u2192target connections detected in dataset.");
2734
+ return false;
2735
+ }
2713
2736
  const MAX_UNIQUE_ENTITIES = 5e4;
2714
- return totalUniqueEntities <= MAX_UNIQUE_ENTITIES;
2737
+ if (totalUniqueEntities > MAX_UNIQUE_ENTITIES) {
2738
+ logUnsupportedReason(
2739
+ `Too many unique nodes (${totalUniqueEntities}). Limit is ${MAX_UNIQUE_ENTITIES} for performance reasons.`
2740
+ );
2741
+ return false;
2742
+ }
2743
+ return true;
2715
2744
  };
2716
2745
  var findNetworkColumns = (columns) => {
2717
2746
  if (!columns || columns.length < 2) {
@@ -2788,6 +2817,78 @@ var findNetworkColumns = (columns) => {
2788
2817
  }
2789
2818
  return { sourceColumnIndex, targetColumnIndex, weightColumnIndex };
2790
2819
  };
2820
+ var supportsSankey = (rows, columns) => {
2821
+ var _a2, _b2;
2822
+ try {
2823
+ const logUnsupportedReason = (message) => {
2824
+ console.warn(`[supportsSankey] ${message}`);
2825
+ };
2826
+ if (!(rows == null ? void 0 : rows.length) || !(columns == null ? void 0 : columns.length)) {
2827
+ logUnsupportedReason(
2828
+ `Missing required data. rows=${(_a2 = rows == null ? void 0 : rows.length) != null ? _a2 : 0}, columns=${(_b2 = columns == null ? void 0 : columns.length) != null ? _b2 : 0}. Need at least 1 row and 3 columns.`
2829
+ );
2830
+ return false;
2831
+ }
2832
+ const { sourceColumnIndex, targetColumnIndex, weightColumnIndex } = findNetworkColumns(columns);
2833
+ if (sourceColumnIndex === -1 || targetColumnIndex === -1 || weightColumnIndex === -1) {
2834
+ logUnsupportedReason("Unable to determine source, target, and weight columns required for Sankey.");
2835
+ return false;
2836
+ }
2837
+ const uniqueNodes = /* @__PURE__ */ new Set();
2838
+ const uniqueLinks = /* @__PURE__ */ new Set();
2839
+ let skippedRows = 0;
2840
+ const normalizeNodeValue = (value) => {
2841
+ if (value === void 0 || value === null) {
2842
+ return void 0;
2843
+ }
2844
+ const sanitized = `${value}`.trim();
2845
+ return sanitized.length ? sanitized : void 0;
2846
+ };
2847
+ const toFinitePositiveNumber = (value) => {
2848
+ if (typeof value === "number") {
2849
+ return Number.isFinite(value) ? value : NaN;
2850
+ }
2851
+ if (typeof value === "string") {
2852
+ const cleaned = value.replace(/[^0-9.-]/g, "");
2853
+ if (!cleaned.length) {
2854
+ return NaN;
2855
+ }
2856
+ const parsed = Number(cleaned);
2857
+ return Number.isFinite(parsed) ? parsed : NaN;
2858
+ }
2859
+ return NaN;
2860
+ };
2861
+ for (const row of rows) {
2862
+ if (!row) {
2863
+ continue;
2864
+ }
2865
+ const source = normalizeNodeValue(row[sourceColumnIndex]);
2866
+ const target = normalizeNodeValue(row[targetColumnIndex]);
2867
+ if (!source || !target || source === target) {
2868
+ skippedRows += 1;
2869
+ continue;
2870
+ }
2871
+ const weight = toFinitePositiveNumber(row[weightColumnIndex]);
2872
+ if (!Number.isFinite(weight) || weight <= 0) {
2873
+ skippedRows += 1;
2874
+ continue;
2875
+ }
2876
+ uniqueNodes.add(source);
2877
+ uniqueNodes.add(target);
2878
+ uniqueLinks.add(`${source}__${target}`);
2879
+ }
2880
+ if (!uniqueLinks.size || uniqueNodes.size < 2) {
2881
+ logUnsupportedReason(
2882
+ `Insufficient valid flows. uniqueNodes=${uniqueNodes.size}, uniqueLinks=${uniqueLinks.size}, skippedRows=${skippedRows}.`
2883
+ );
2884
+ return false;
2885
+ }
2886
+ return true;
2887
+ } catch (error) {
2888
+ console.error("[supportsSankey] Unexpected error determining support", error);
2889
+ return false;
2890
+ }
2891
+ };
2791
2892
  var getSupportedDisplayTypes = ({
2792
2893
  response,
2793
2894
  columns,
@@ -2876,6 +2977,9 @@ var getSupportedDisplayTypes = ({
2876
2977
  if (supportsNetworkGraph(rows, visibleColumns)) {
2877
2978
  supportedDisplayTypes.push("network_graph");
2878
2979
  }
2980
+ if (supportsSankey(rows, visibleColumns)) {
2981
+ supportedDisplayTypes.push("sankey");
2982
+ }
2879
2983
  return supportedDisplayTypes;
2880
2984
  } catch (error) {
2881
2985
  console.error(error);
@@ -5383,13 +5487,20 @@ var formatElement = ({
5383
5487
  const validatedQuantityDecimals = !isNaN(quantityDecimals) ? quantityDecimals : 2;
5384
5488
  const elementNumber = parseFloat(`${element}`);
5385
5489
  if (!isNaN(elementNumber)) {
5386
- const numDecimals = elementNumber % 1 !== 0 ? validatedQuantityDecimals : 0;
5490
+ let numDecimals;
5491
+ if ((column == null ? void 0 : column.quantity_type) === "integer") {
5492
+ numDecimals = 0;
5493
+ } else if ((column == null ? void 0 : column.quantity_type) === "float") {
5494
+ numDecimals = validatedQuantityDecimals;
5495
+ } else {
5496
+ numDecimals = elementNumber % 1 !== 0 ? validatedQuantityDecimals : 0;
5497
+ }
5387
5498
  formattedElement = new Intl.NumberFormat(languageCode, {
5388
5499
  minimumFractionDigits: numDecimals,
5389
5500
  maximumFractionDigits: numDecimals
5390
5501
  }).format(elementNumber);
5391
- if (formattedElement.endsWith(".00")) {
5392
- formattedElement = formattedElement.replace(".00", "");
5502
+ if ((column == null ? void 0 : column.quantity_type) !== "float" && `${formattedElement}`.endsWith(".00")) {
5503
+ formattedElement = `${formattedElement}`.replace(".00", "");
5393
5504
  }
5394
5505
  }
5395
5506
  break;
@@ -10376,16 +10487,27 @@ var transformQueryResponse = (response, originalQueryID, isDrilldown2 = false, n
10376
10487
  }
10377
10488
  return transformedResponse;
10378
10489
  };
10490
+ var detectQuantityType = (rows, colIndex) => {
10491
+ if (!(rows == null ? void 0 : rows.length)) return "float";
10492
+ for (const row of rows) {
10493
+ const val = row == null ? void 0 : row[colIndex];
10494
+ if (val === null || val === void 0) continue;
10495
+ const num = typeof val === "number" ? val : parseFloat(val);
10496
+ if (!isNaN(num) && num % 1 !== 0) return "float";
10497
+ }
10498
+ return "integer";
10499
+ };
10379
10500
  var transformQueryResponseColumns = (response, addedColumns) => {
10380
- var _a2, _b2;
10501
+ var _a2, _b2, _c, _d;
10381
10502
  const columns = (_b2 = (_a2 = response == null ? void 0 : response.data) == null ? void 0 : _a2.data) == null ? void 0 : _b2.columns;
10503
+ const rows = (_d = (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.data) == null ? void 0 : _d.rows;
10382
10504
  if (!(columns == null ? void 0 : columns.length)) {
10383
10505
  return columns;
10384
10506
  }
10385
10507
  const isSingleValue = isSingleValueResponse(response);
10386
10508
  const transformedColumns = columns.map((col, i) => {
10387
- var _a3, _b3, _c, _d;
10388
- const dataSample = (_d = (_c = (_b3 = (_a3 = response == null ? void 0 : response.data) == null ? void 0 : _a3.data) == null ? void 0 : _b3.rows) == null ? void 0 : _c.find((row) => row[i])) == null ? void 0 : _d[i];
10509
+ var _a3;
10510
+ const dataSample = (_a3 = rows == null ? void 0 : rows.find((row) => row[i])) == null ? void 0 : _a3[i];
10389
10511
  const drilldownGroupby = getDrilldownGroupby(response, col);
10390
10512
  let additional = false;
10391
10513
  let is_timestamp = false;
@@ -10402,6 +10524,7 @@ var transformQueryResponseColumns = (response, addedColumns) => {
10402
10524
  if (isSingleValue) {
10403
10525
  is_visible = true;
10404
10526
  }
10527
+ const quantity_type = col.type === "QUANTITY" /* QUANTITY */ ? detectQuantityType(rows, i) : void 0;
10405
10528
  return new Column({
10406
10529
  ...col,
10407
10530
  field: `${i}`,
@@ -10409,7 +10532,8 @@ var transformQueryResponseColumns = (response, addedColumns) => {
10409
10532
  drilldownGroupby,
10410
10533
  additional,
10411
10534
  is_visible,
10412
- is_timestamp
10535
+ is_timestamp,
10536
+ quantity_type
10413
10537
  });
10414
10538
  });
10415
10539
  return transformedColumns;
@@ -10857,12 +10981,22 @@ var exportCSV = ({
10857
10981
  domain,
10858
10982
  apiKey,
10859
10983
  token,
10860
- csvProgressCallback
10984
+ filters,
10985
+ tableFilters,
10986
+ csvProgressCallback,
10987
+ source = DEFAULT_SOURCE,
10988
+ scope = "null"
10861
10989
  } = {}) => {
10862
10990
  if (!token || !domain || !apiKey) {
10863
10991
  return Promise.reject(new Error("Unauthenticated" /* UNAUTHENTICATED */));
10864
10992
  }
10865
10993
  const url = `${domain}/autoql/api/v1/query/${queryId}/export?key=${apiKey}`;
10994
+ const data = {
10995
+ session_filter_locks: filters,
10996
+ filters: tableFilters,
10997
+ source,
10998
+ scope
10999
+ };
10866
11000
  const config = {
10867
11001
  headers: {
10868
11002
  Authorization: `Bearer ${token}`
@@ -10875,7 +11009,7 @@ var exportCSV = ({
10875
11009
  }
10876
11010
  }
10877
11011
  };
10878
- return import_axios.default.post(url, {}, config).then((response) => Promise.resolve(response)).catch((error) => Promise.reject(error == null ? void 0 : error.response));
11012
+ return import_axios.default.post(url, data, config).then((response) => Promise.resolve(response)).catch((error) => Promise.reject(error == null ? void 0 : error.response));
10879
11013
  };
10880
11014
  var runDrilldown = ({
10881
11015
  queryID,
@@ -13706,6 +13840,7 @@ function color() {
13706
13840
  supportsNetworkGraph,
13707
13841
  supportsPieChart,
13708
13842
  supportsRegularPivotTable,
13843
+ supportsSankey,
13709
13844
  svgPathD,
13710
13845
  svgToPng,
13711
13846
  titlelizeString,