@datarailsshared/dr_renderer 1.5.202 → 1.5.214

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datarailsshared/dr_renderer",
3
- "version": "1.5.202",
3
+ "version": "1.5.214",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -0,0 +1,7 @@
1
+ import valueFormatter = require("./value.formatter");
2
+ import stackLabelsFormatter = require("./stack-labels.formatter");
3
+ export let getAggregatorPercentageValueIfRequired: typeof valueFormatter.getAggregatorPercentageValueIfRequired;
4
+ export let getRelatedValue: typeof valueFormatter.getRelatedValue;
5
+ export let isAbsoluteValue: typeof valueFormatter.isAbsoluteValue;
6
+ export let createStackLabelsFormatter: typeof stackLabelsFormatter.createStackLabelsFormatter;
7
+ export let createBarStackLabelsFormatter: typeof stackLabelsFormatter.createBarStackLabelsFormatter;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Chart Formatters
3
+ *
4
+ * This module provides formatter functions used by Highcharts renderers
5
+ * for data labels, stack labels, and value formatting.
6
+ *
7
+ * @module @datarailsshared/dr_renderer/charts/formatters
8
+ */
9
+
10
+ const valueFormatter = require('./value.formatter');
11
+ const stackLabelsFormatter = require('./stack-labels.formatter');
12
+
13
+ module.exports = {
14
+ // Value formatter
15
+ getAggregatorPercentageValueIfRequired: valueFormatter.getAggregatorPercentageValueIfRequired,
16
+ getRelatedValue: valueFormatter.getRelatedValue,
17
+ isAbsoluteValue: valueFormatter.isAbsoluteValue,
18
+
19
+ // Stack labels formatters
20
+ createStackLabelsFormatter: stackLabelsFormatter.createStackLabelsFormatter,
21
+ createBarStackLabelsFormatter: stackLabelsFormatter.createBarStackLabelsFormatter,
22
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Creates a Highcharts stackLabels formatter for stacked column charts.
3
+ * Reads totals from the pivot model via `pivotData.getAggregator` instead of
4
+ * relying on Highcharts' `this.total`, which can exclude segments too small to render.
5
+ * Supports `present_total`, `hide_subtotals`, and `show_percentage` label options.
6
+ *
7
+ * @param {{ getAggregator: (rowKey: Array, colKey: Array) => { sum: number, format: (value: number, flag: boolean) => string, value: () => number } | null, colKeys: Array<Array> }} pivotData - The pivot data model.
8
+ * @param {{ label?: { present_total?: boolean, hide_subtotals?: boolean, show_percentage?: boolean } } | null} additionOptions - Chart label options.
9
+ * @returns {function(): string} A Highcharts stackLabels formatter function (bound to Highcharts stack context with `this.x` and `this.isNegative`).
10
+ */
11
+ export function createStackLabelsFormatter(pivotData: {
12
+ getAggregator: (rowKey: any[], colKey: any[]) => {
13
+ sum: number;
14
+ format: (value: number, flag: boolean) => string;
15
+ value: () => number;
16
+ } | null;
17
+ colKeys: Array<any[]>;
18
+ }, additionOptions: {
19
+ label?: {
20
+ present_total?: boolean;
21
+ hide_subtotals?: boolean;
22
+ show_percentage?: boolean;
23
+ };
24
+ } | null): () => string;
25
+ /**
26
+ * Creates a Highcharts stackLabels formatter for stacked bar charts.
27
+ * Uses `pivotData.getAggregator` for accurate totals instead of Highcharts' `this.total`.
28
+ * Always displays the formatted total — does not support `present_total`, `hide_subtotals`,
29
+ * or `show_percentage` options as these are not available for bar stacked charts.
30
+ *
31
+ * @param {{ getAggregator: (rowKey: Array, colKey: Array) => { sum: number, format: (value: number, flag: boolean) => string } | null, colKeys: Array<Array> }} pivotData - The pivot data model.
32
+ * @returns {function(): string} A Highcharts stackLabels formatter function (bound to Highcharts stack context with `this.x` and `this.isNegative`).
33
+ */
34
+ export function createBarStackLabelsFormatter(pivotData: {
35
+ getAggregator: (rowKey: any[], colKey: any[]) => {
36
+ sum: number;
37
+ format: (value: number, flag: boolean) => string;
38
+ } | null;
39
+ colKeys: Array<any[]>;
40
+ }): () => string;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Creates a Highcharts stackLabels formatter for stacked column charts.
3
+ * Reads totals from the pivot model via `pivotData.getAggregator` instead of
4
+ * relying on Highcharts' `this.total`, which can exclude segments too small to render.
5
+ * Supports `present_total`, `hide_subtotals`, and `show_percentage` label options.
6
+ *
7
+ * @param {{ getAggregator: (rowKey: Array, colKey: Array) => { sum: number, format: (value: number, flag: boolean) => string, value: () => number } | null, colKeys: Array<Array> }} pivotData - The pivot data model.
8
+ * @param {{ label?: { present_total?: boolean, hide_subtotals?: boolean, show_percentage?: boolean } } | null} additionOptions - Chart label options.
9
+ * @returns {function(): string} A Highcharts stackLabels formatter function (bound to Highcharts stack context with `this.x` and `this.isNegative`).
10
+ */
11
+ function createStackLabelsFormatter(pivotData, additionOptions) {
12
+ return function () {
13
+ const showTotal = additionOptions && additionOptions.label && additionOptions.label.present_total;
14
+ const hideSubtotals = additionOptions && additionOptions.label && additionOptions.label.hide_subtotals;
15
+ const showTotalsPercentage = additionOptions && additionOptions.label && additionOptions.label.show_percentage;
16
+
17
+ if (!hideSubtotals || showTotal) {
18
+ const agg = pivotData.getAggregator([], pivotData.colKeys[this.x]);
19
+
20
+ if (agg && agg.sum) {
21
+ const isNeedToDisplayLabel = agg.sum > 0 && !this.isNegative || agg.sum < 0 && this.isNegative;
22
+
23
+ if (isNeedToDisplayLabel) {
24
+ const subtotalValue = agg.sum;
25
+ let percentages = '';
26
+
27
+ if (showTotalsPercentage) {
28
+ const aggTotal = pivotData.getAggregator([], []);
29
+ const aggTotalValue = aggTotal.value();
30
+ percentages = aggTotalValue ? ' (' + Math.round(subtotalValue / aggTotalValue * 100) + '%)' : '';
31
+ }
32
+ return (showTotal ? agg.format(subtotalValue, true) : '') + percentages;
33
+ }
34
+ }
35
+ }
36
+ return '';
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Creates a Highcharts stackLabels formatter for stacked bar charts.
42
+ * Uses `pivotData.getAggregator` for accurate totals instead of Highcharts' `this.total`.
43
+ * Always displays the formatted total — does not support `present_total`, `hide_subtotals`,
44
+ * or `show_percentage` options as these are not available for bar stacked charts.
45
+ *
46
+ * @param {{ getAggregator: (rowKey: Array, colKey: Array) => { sum: number, format: (value: number, flag: boolean) => string } | null, colKeys: Array<Array> }} pivotData - The pivot data model.
47
+ * @returns {function(): string} A Highcharts stackLabels formatter function (bound to Highcharts stack context with `this.x` and `this.isNegative`).
48
+ */
49
+ function createBarStackLabelsFormatter(pivotData) {
50
+ return function () {
51
+ const agg = pivotData.getAggregator([], pivotData.colKeys[this.x]);
52
+
53
+ if (agg && agg.sum) {
54
+ const isNeedToDisplayLabel = agg.sum > 0 && !this.isNegative || agg.sum < 0 && this.isNegative;
55
+
56
+ if (isNeedToDisplayLabel) {
57
+ return agg.format(agg.sum, true);
58
+ }
59
+ }
60
+ return '';
61
+ };
62
+ }
63
+
64
+ module.exports = {
65
+ createStackLabelsFormatter,
66
+ createBarStackLabelsFormatter
67
+ };
@@ -8,12 +8,12 @@ function getAggregatorPercentageValueIfRequired(value, render_options, data, row
8
8
  const baseRowKey = data && data.rowKeys && data.rowKeys.length ? data.rowKeys[0] : null;
9
9
  const currentColKey = colKey ? colKey : [];
10
10
  const agg = data && baseRowKey ? data.getAggregator(baseRowKey, currentColKey) : null;
11
-
11
+
12
12
  if (isPercentage && isVariance && baseRowKey && agg) {
13
13
  if (deltaColumn && isAbsoluteValue(deltaColumn.formula)) {
14
14
  value = getRelatedValue(value, agg.value());
15
15
  }
16
-
16
+
17
17
  return Math.round(value * 100) + '%';
18
18
  }
19
19
 
@@ -30,7 +30,7 @@ function getRelatedValue(value, baseValue) {
30
30
  function isAbsoluteValue(formula) {
31
31
  if (!formula)
32
32
  return false;
33
-
33
+
34
34
  return !lodash.includes(formula.replace(/\s+/g, ''), '/');
35
35
  };
36
36
 
@@ -38,4 +38,4 @@ module.exports = {
38
38
  getAggregatorPercentageValueIfRequired,
39
39
  getRelatedValue,
40
40
  isAbsoluteValue
41
- };
41
+ };
@@ -4,7 +4,8 @@ const { DrGaugeChart, GAUGE_OPTIONS_DEFAULT } = require('./charts/dr_gauge_chart
4
4
  const { DrDonutChart } = require('./charts/dr_donut_chart');
5
5
  const seriesPointStylesHelper = require('./seriesPointStyles-helper');
6
6
  const smartQueriesHelper = require('./smart_queries_helper');
7
- const valueFormatter = require('./value.formatter');
7
+ const valueFormatter = require('./charts/formatters/value.formatter');
8
+ const { createStackLabelsFormatter, createBarStackLabelsFormatter } = require('./charts/formatters/stack-labels.formatter');
8
9
  const { DrGaugeCategoriesSummaryChart } = require("./charts/dr_gauge_categories_summary_chart");
9
10
  const {
10
11
  TooMuchDataError,
@@ -124,7 +125,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
124
125
 
125
126
  /**
126
127
  * Handles errors that occur during pivot renderer processing.
127
- *
128
+ *
128
129
  * @param {Error} err - The error that occurred during pivot rendering
129
130
  * @param {boolean} onlyOptions - If true, logs the error and returns empty options object instead of throwing
130
131
  * @param {Error} fallbackError - The fallback error to throw when onlyOptions is false and err is not a BaseRendererError
@@ -2974,7 +2975,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2974
2975
  zoomType: additionOptions && additionOptions.chart && additionOptions.chart.zoom_type ? additionOptions.chart.zoom_type : 'None',
2975
2976
  events: {
2976
2977
  'drilldown': function (e) {
2977
- highchartsRenderer.modifyEventPointForDrilldown(e);
2978
+ !highchartsRenderer.environment.preventDrilldownEventMutation && highchartsRenderer.modifyEventPointForDrilldown(e);
2978
2979
  if (drilldownFunc)
2979
2980
  drilldownFunc(e, this, "drilldown");
2980
2981
 
@@ -3092,7 +3093,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3092
3093
  zoomType: 'x',
3093
3094
  events: {
3094
3095
  'drilldown': function (e) {
3095
- highchartsRenderer.modifyEventPointForDrilldown(e);
3096
+ !highchartsRenderer.environment.preventDrilldownEventMutation && highchartsRenderer.modifyEventPointForDrilldown(e);
3096
3097
  if (drilldownFunc)
3097
3098
  drilldownFunc(e, this, "drilldown");
3098
3099
 
@@ -3117,32 +3118,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3117
3118
  },
3118
3119
  stackLabels: {
3119
3120
  enabled: additionOptions && additionOptions.label ? additionOptions.label.show : true,
3120
- formatter: function () {
3121
- const showTotal = additionOptions && additionOptions.label && additionOptions.label.present_total;
3122
- const hideSubtotals = additionOptions && additionOptions.label && additionOptions.label.hide_subtotals;
3123
- const showTotalsPercentage = additionOptions && additionOptions.label && additionOptions.label.show_percentage;
3124
-
3125
- if (!hideSubtotals || showTotal) {
3126
- const agg = pivotData.getAggregator([], pivotData.colKeys[this.x]);
3127
-
3128
- if (agg && agg.sum) {
3129
- const isNeedToDisplayLabel = agg.sum > 0 && !this.isNegative || agg.sum < 0 && this.isNegative;
3130
-
3131
- if (isNeedToDisplayLabel) {
3132
- const subtotalValue = agg.sum;
3133
- let percentages = '';
3134
-
3135
- if (showTotalsPercentage) {
3136
- const aggTotal = pivotData.getAggregator([], []);
3137
- const aggTotalValue = aggTotal.value();
3138
- percentages = aggTotalValue ? ' (' + Math.round(subtotalValue/aggTotalValue * 100) + '%)' : '';
3139
- }
3140
- return (showTotal ? agg.format(subtotalValue, true) : '') + percentages;
3141
- }
3142
- }
3143
- }
3144
- return '';
3145
- },
3121
+ formatter: createStackLabelsFormatter(pivotData, additionOptions),
3146
3122
  style: highchartsRenderer.getDataLabelsStyle(additionOptions),
3147
3123
  },
3148
3124
  labels: {
@@ -3435,21 +3411,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3435
3411
  highchartsRenderer.getDataLabelsStyle(additionOptions)
3436
3412
  );
3437
3413
 
3438
- const stackLabelsFormatter = function() {
3439
- return function() {
3440
- if (this.total) {
3441
- var total = parseFloat(this.total);
3442
- var agg = pivotData.getAggregator([], []);
3443
- if (agg) {
3444
- return agg.format(total, true);
3445
- } else {
3446
- return total.toLocaleString();
3447
- }
3448
- }
3449
- return '';
3450
- }
3451
- }
3452
-
3453
3414
  const dataLabelsFormatter = function() {
3454
3415
  return function() {
3455
3416
  const deltaColumnName = lodash.get(opts, 'chartOptions.delta_column.name', '');
@@ -3475,7 +3436,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3475
3436
  },
3476
3437
  stackLabels: {
3477
3438
  enabled: additionOptions && additionOptions.label && !isVarianceOnly ? additionOptions.label.show : false,
3478
- formatter: stackLabelsFormatter.call(this),
3439
+ formatter: createBarStackLabelsFormatter(pivotData),
3479
3440
  style: labelStyle
3480
3441
  },
3481
3442
  labels: {
@@ -5895,12 +5856,12 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5895
5856
  if (opt.isUpdatingPointStylesOnClick) {
5896
5857
  opt.drillDownListFunc = (e) => {
5897
5858
  seriesPointStylesHelper.setSeriesPointStylesOnClick(e);
5898
- highchartsRenderer.modifyEventPointForDrilldown(e);
5859
+ !highchartsRenderer.environment.preventDrilldownEventMutation && highchartsRenderer.modifyEventPointForDrilldown(e);
5899
5860
  drillDownListFunc(e);
5900
5861
  };
5901
5862
  } else {
5902
5863
  opt.drillDownListFunc = (e) => {
5903
- highchartsRenderer.modifyEventPointForDrilldown(e);
5864
+ !highchartsRenderer.environment.preventDrilldownEventMutation && highchartsRenderer.modifyEventPointForDrilldown(e);
5904
5865
  drillDownListFunc(e);
5905
5866
  };
5906
5867
  }
package/src/index.d.ts CHANGED
@@ -75,5 +75,9 @@ export type EnvironmentOptions = {
75
75
  * - Allow custom gauge goal title
76
76
  */
77
77
  enableGaugeDynamicGoal?: boolean | undefined;
78
+ /**
79
+ * - Prevents reassignment of point.name & series.name to their initialName during drilldown avoiding conflicts between formatted and unformatted names
80
+ */
81
+ preventDrilldownEventMutation?: boolean | undefined;
78
82
  };
79
83
  export { DataFormatter, options, RendererErrorCodes, BaseRendererError, TooMuchDataError, NoDataError, DataConflictError, GaugeConfigurationError, GenericRenderingError, GenericComputationalError, GraphTableRenderer, FREEZE_PANES_MODES };
package/src/index.js CHANGED
@@ -23,6 +23,7 @@ const freezePanes = require('./pivot-table/freeze-panes');
23
23
  * @property {boolean} [fiscal_year_back] - Fiscal year direction
24
24
  * @property {boolean} [enableStackedPercentCharts] - Enable stacked percent charts
25
25
  * @property {boolean} [enableGaugeDynamicGoal] - Allow custom gauge goal title
26
+ * @property {boolean} [preventDrilldownEventMutation] - Prevents reassignment of point.name & series.name to their initialName during drilldown avoiding conflicts between formatted and unformatted names
26
27
  */
27
28
 
28
29
  let dr_render_factory = {};
package/tsconfig.json CHANGED
@@ -15,6 +15,7 @@
15
15
  "./src/index.js",
16
16
  "./src/graph-table-renderer.js",
17
17
  "./src/errors.js",
18
+ "./src/charts/formatters/**/*.js",
18
19
  "./src/options/**/*.js",
19
20
  "./src/pivot-table/freeze-panes/**/*.js"
20
21
  ],