@objectstack/service-analytics 9.10.0 → 10.0.0

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.cjs CHANGED
@@ -1495,6 +1495,7 @@ var AnalyticsService = class {
1495
1495
  }
1496
1496
  this.readScopeProvider = config.getReadScope;
1497
1497
  this.relationshipResolver = config.relationshipResolver;
1498
+ this.measureCurrency = config.measureCurrency;
1498
1499
  this.labelResolver = config.labelResolver;
1499
1500
  this.draftRowsResolver = config.draftRowsResolver;
1500
1501
  if (config.datasets) {
@@ -1672,8 +1673,21 @@ var AnalyticsService = class {
1672
1673
  }
1673
1674
  throw err;
1674
1675
  }
1675
- if (this.labelResolver && selection.dimensions?.length) {
1676
- const dims = selection.dimensions.map((name) => dataset.dimensions?.find((d) => d.name === name)).filter((d) => !!d?.field).map((d) => ({ name: d.name, field: d.field, type: d.type, dateGranularity: d.dateGranularity }));
1676
+ const selectedDims = (selection.dimensions ?? []).map((name) => dataset.dimensions?.find((d) => d.name === name)).filter((d) => !!d);
1677
+ const drillDims = selectedDims.filter((d) => !!d.field && d.type !== "date");
1678
+ if (drillDims.length && result.rows.length) {
1679
+ result.object = dataset.object;
1680
+ result.dimensionFields = Object.fromEntries(
1681
+ drillDims.map((d) => [d.name, d.field])
1682
+ );
1683
+ result.drillRawRows = result.rows.map((row) => {
1684
+ const raw = {};
1685
+ for (const d of drillDims) raw[d.name] = row[d.name];
1686
+ return raw;
1687
+ });
1688
+ }
1689
+ if (this.labelResolver && selectedDims.length) {
1690
+ const dims = selectedDims.filter((d) => !!d.field).map((d) => ({ name: d.name, field: d.field, type: d.type, dateGranularity: d.dateGranularity }));
1677
1691
  if (dims.length) {
1678
1692
  try {
1679
1693
  await resolveDimensionLabels(dataset.object, dims, result.rows, this.labelResolver);
@@ -1695,6 +1709,25 @@ var AnalyticsService = class {
1695
1709
  if (!m) continue;
1696
1710
  if (f.label == null && typeof m.label === "string") f.label = m.label;
1697
1711
  if (f.format == null && m.format) f.format = m.format;
1712
+ const fc = f;
1713
+ const mc = m;
1714
+ if (fc.currency == null) {
1715
+ const meta = m.field ? this.measureCurrency?.(dataset.object, m.field) : void 0;
1716
+ const monetary = !!mc.currency || meta?.type === "currency";
1717
+ if (monetary) {
1718
+ const resolved = mc.currency ?? meta?.defaultCurrency ?? context?.currency;
1719
+ if (resolved) fc.currency = resolved;
1720
+ }
1721
+ }
1722
+ }
1723
+ }
1724
+ if (result.fields?.length && selectedDims.length) {
1725
+ const dimByName = new Map(selectedDims.map((d) => [d.name, d]));
1726
+ const dimByField = new Map(selectedDims.filter((d) => !!d.field).map((d) => [d.field, d]));
1727
+ for (const f of result.fields) {
1728
+ if (f.label != null) continue;
1729
+ const d = dimByName.get(f.name) ?? dimByField.get(f.name);
1730
+ if (d && typeof d.label === "string") f.label = d.label;
1698
1731
  }
1699
1732
  }
1700
1733
  return result;
@@ -2083,6 +2116,11 @@ var AnalyticsServicePlugin = class {
2083
2116
  coerceTemporalFilterValue,
2084
2117
  relationshipResolver,
2085
2118
  labelResolver,
2119
+ // ADR-0053 — source-field currency metadata for the measure currency chain.
2120
+ measureCurrency: (object, field) => {
2121
+ const f = dataEngine()?.getObject?.(object)?.fields?.[field];
2122
+ return f ? { type: f.type, defaultCurrency: f.currencyConfig?.defaultCurrency } : void 0;
2123
+ },
2086
2124
  draftRowsResolver
2087
2125
  };
2088
2126
  if (autoBridgedReadScope) {