@datarailsshared/dr_renderer 1.2.53 → 1.2.57

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.2.53",
3
+ "version": "1.2.57",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -133,75 +133,88 @@ let initDRPivotTable = function($, window, document) {
133
133
  return key;
134
134
  };
135
135
 
136
- let newProcessKey = function (record, totals, keys, attrs, getAggregator) {
137
- var addKey, attr, flatKey, k, key, len, ref;
138
- key = [];
139
- addKey = false;
140
- for (k = 0, len = attrs.length; k < len; k++) {
141
- attr = attrs[k];
142
- if (record.hasOwnProperty(attr)) {
143
- key.push((ref = record[attr]));
144
- flatKey = key.join(delim);
145
- }
146
- if (totals[flatKey] && totals[flatKey].isChangeable) {
147
- continue;
148
- }
149
- if (!flatKey) return [];
150
- if (!totals[flatKey]) {
151
- totals[flatKey] = getAggregator(key.slice());
152
- addKey = true;
153
- } else {
154
- totals[flatKey] = getAggregator(key.slice());
155
- totals[flatKey].push(record);
156
- }
157
- }
158
- if (addKey && key.length === attrs.length) {
159
- keys.push(key);
160
- }
161
- return key;
162
- };
163
-
164
136
  DRPivotData.prototype.processRecord = function(record, useTotalsCalculation) {
165
- var colKey, fColKey, fRowKey, flatColKey, flatRowKey, i, j, k, m, n, ref, results, rowKey;
166
- rowKey = [];
167
- colKey = [];
168
137
  if (useTotalsCalculation) {
169
- rowKey = newProcessKey(record, this.rowTotals, this.rowKeys, this.rowAttrs, (function(_this) {
138
+ if (!this.notFirst) {
139
+ this.keysLength = Object.keys(record).length - 1;
140
+ this.notFirst = true;
141
+ }
142
+ let getRowAggregator = (function(_this) {
170
143
  return function(key) {
171
144
  return _this.aggregator(_this, key, []);
172
145
  };
173
- })(this));
174
- colKey = newProcessKey(record, this.colTotals, this.colKeys, this.colAttrs, (function(_this) {
146
+ })(this);
147
+ let getColAggregator = (function(_this) {
175
148
  return function(key) {
176
149
  return _this.aggregator(_this, [], key);
177
150
  };
178
- })(this));
151
+ })(this);
179
152
 
180
- if (!colKey.length && !rowKey.length) {
181
- this.allTotal.push(record);
153
+ let rowKey = [];
154
+ for (k = 0; k < this.rowAttrs.length; k++) {
155
+ let attr = this.rowAttrs[k];
156
+ if (record.hasOwnProperty(attr)) {
157
+ rowKey.push((ref = record[attr]) != null ? ref : "null");
158
+ }
182
159
  }
183
- if (!colKey.length && rowKey.length) {
184
- this.rowTotals[rowKey.join(delim)].push(record);
185
- this.rowTotals[rowKey.join(delim)].isChangeable = true;
160
+
161
+ let colKey = [];
162
+ for (k = 0; k < this.colAttrs.length; k++) {
163
+ let attr = this.colAttrs[k];
164
+ if (record.hasOwnProperty(attr)) {
165
+ colKey.push((ref = record[attr]) != null ? ref : "null");
166
+ }
186
167
  }
187
- if (!rowKey.length && colKey.length) {
188
- this.colTotals[colKey.join(delim)].push(record);
189
- this.colTotals[colKey.join(delim)].isChangeable = true;
168
+
169
+ let flatRowKey = rowKey.join(delim);
170
+ let flatColKey = colKey.join(delim);
171
+
172
+ if (this.keysLength === rowKey.length + colKey.length) {
173
+ if (!this.rowKeys.some(rKey => rKey.join(delim) === flatRowKey)) {
174
+ this.rowKeys.push(rowKey);
175
+ }
176
+ if (!this.colKeys.some(cKey => cKey.join(delim) === flatColKey)) {
177
+ this.colKeys.push(colKey);
178
+ }
190
179
  }
191
- } else {
192
- this.allTotal.push(record);
193
- rowKey = processKey(record, this.rowTotals, this.rowKeys, this.rowAttrs, (function(_this) {
194
- return function(key) {
195
- return _this.aggregator(_this, key, []);
196
- };
197
- })(this));
198
- colKey = processKey(record, this.colTotals, this.colKeys, this.colAttrs, (function(_this) {
199
- return function(key) {
200
- return _this.aggregator(_this, [], key);
201
- };
202
- })(this));
180
+
181
+ if (!colKey.length && !rowKey.length) {
182
+ this.allTotal.push(record);
183
+ } else if (!colKey.length && rowKey.length) {
184
+ if (!this.rowTotals[flatRowKey]) {
185
+ this.rowTotals[flatRowKey] = getRowAggregator(rowKey.slice());
186
+ this.rowTotals[flatRowKey].push(record);
187
+ }
188
+ } else if (!rowKey.length && colKey.length) {
189
+ if (!this.colTotals[flatColKey]) {
190
+ this.colTotals[flatColKey] = getColAggregator(rowKey.slice());
191
+ this.colTotals[flatColKey].push(record);
192
+ }
193
+ } else {
194
+ if (!this.tree[flatRowKey]) {
195
+ this.tree[flatRowKey] = {};
196
+ }
197
+ this.tree[flatRowKey][flatColKey] = this.aggregator(this, rowKey, colKey);
198
+ this.tree[flatRowKey][flatColKey].push(record);
199
+ }
200
+ return;
203
201
  }
204
202
 
203
+ var colKey, fColKey, fRowKey, flatColKey, flatRowKey, i, j, k, m, n, ref, results, rowKey;
204
+ rowKey = [];
205
+ colKey = [];
206
+ this.allTotal.push(record);
207
+ rowKey = processKey(record, this.rowTotals, this.rowKeys, this.rowAttrs, (function(_this) {
208
+ return function(key) {
209
+ return _this.aggregator(_this, key, []);
210
+ };
211
+ })(this));
212
+ colKey = processKey(record, this.colTotals, this.colKeys, this.colAttrs, (function(_this) {
213
+ return function(key) {
214
+ return _this.aggregator(_this, [], key);
215
+ };
216
+ })(this));
217
+
205
218
  m = rowKey.length - 1;
206
219
  n = colKey.length - 1;
207
220
  if (m < 0 || n < 0) {
@@ -891,14 +891,12 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
891
891
  return chartOptions;
892
892
  };
893
893
 
894
- highchartsRenderer.ptCreateBasicLineSeries = function (pivotData, colors, onlyNumbers, isUniqueVals, additionOptions) {
894
+ // Generate series for charts functions
895
+ highchartsRenderer.ptCreateBasicLineSeries = function (pivotData, colors, onlyNumbers, isUniqueVals, additionOptions, opts, chartOptions) {
895
896
  var chart_series = [],
896
897
  row_n_keys = pivotData.getRowKeys(),
897
898
  col_n_keys = pivotData.getColKeys();
898
899
 
899
- var num_cols = col_n_keys.length;
900
- var num_rows = row_n_keys.length;
901
-
902
900
  var has_delta = false;
903
901
  if (additionOptions && lodash.has(additionOptions, "delta_column.field") && additionOptions.delta_column.field == "series") {
904
902
  has_delta = true;
@@ -909,16 +907,23 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
909
907
 
910
908
  var i = 0;
911
909
  var variat_serias = null;
910
+ const n = col_n_keys.length;
911
+ const xSum = (1 + n) / 2 * n;
912
+ const trendSerieses = [];
912
913
 
913
914
  lodash.forEach(row_n_keys, function (row_n_value) {
914
915
  var ob = {};
916
+ let ySum = 0;
917
+ let xySum = 0;
918
+ let squareXSum = 0;
915
919
  ob.data = [];
916
920
  if (row_n_value && row_n_value.length > 0)
917
921
  ob.name = row_n_value.join(highchartsRenderer.delimer);
918
922
 
919
- lodash.forEach(col_n_keys, function (col_n_value) {
923
+ lodash.forEach(col_n_keys, function (col_n_value, index) {
920
924
  var agg = pivotData.getAggregator(row_n_value, col_n_value);
921
925
  var val = agg.value();
926
+
922
927
  if (isUniqueVals && agg.uniq)
923
928
  val = agg.uniq.join('<br>');
924
929
 
@@ -937,6 +942,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
937
942
  else
938
943
  val = 0;
939
944
  }
945
+
946
+ xySum += Number(val) * (index + 1);
947
+ ySum += Number(val);
948
+ squareXSum += (index + 1) * (index + 1);
940
949
  ob.data.push(val);
941
950
  });
942
951
 
@@ -950,8 +959,27 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
950
959
  }
951
960
 
952
961
  chart_series.push(ob);
962
+
963
+ if (opts.trendLine) {
964
+ const a = ((ySum * squareXSum) - (xSum * xySum)) / ((n * squareXSum) - (xSum * xSum));
965
+ const b = ((n * xySum) - (xSum* ySum)) / ((n * squareXSum) - (xSum * xSum));
966
+
967
+ const trendSeries = lodash.clone(chart_series[chart_series.length - 1]);
968
+ trendSeries.name = 'Trend Line (' + trendSeries.name + ')';
969
+ trendSeries.dashStyle = 'shortdot';
970
+ trendSeries.type = 'line';
971
+ trendSeries.data = trendSeries.data.map((el, index) => a + b * (index + 1));
972
+
973
+ if (colors && colors[i]) {
974
+ trendSeries.color = colors[i];
975
+ }
976
+
977
+ trendSerieses.push(trendSeries);
978
+ }
979
+
953
980
  i++;
954
981
  });
982
+ const ethalonSeries = chart_series[chart_series.length - 1];
955
983
 
956
984
  if (has_delta && additionOptions && additionOptions.delta_column.only_variant) {
957
985
  if (variat_serias)
@@ -970,30 +998,54 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
970
998
  }
971
999
  }
972
1000
 
1001
+ chart_series = [...chart_series, ...trendSerieses]
1002
+
1003
+ if (opts.total) {
1004
+ const newSeries = lodash.clone(ethalonSeries);
1005
+ if (opts.totalSeriesSettings) {
1006
+ newSeries.yAxis = opts.totalSeriesSettings.secondaryAxis ? 1 : undefined;
1007
+ }
1008
+ newSeries.name = 'Total';
1009
+ newSeries.data = [];
1010
+ col_n_keys.forEach(columnKey => {
1011
+ let totalKey = columnKey;
1012
+ if (lodash.isArray(columnKey)) {
1013
+ totalKey = totalKey.join(' , ');
1014
+ }
1015
+ newSeries.data.push(pivotData.colTotals[totalKey].sum);
1016
+ })
1017
+
1018
+ chart_series.push(newSeries);
1019
+ }
1020
+
1021
+ highchartsRenderer.moveSeriesToSecondYAxisIfNeeded(chart_series, pivotData, chartOptions, additionOptions, opts, opts.total && opts.totalSeriesSettings && opts.totalSeriesSettings.secondaryAxis);
1022
+
973
1023
  return chart_series;
974
1024
  };
975
1025
 
976
-
977
- highchartsRenderer.ptCreateColumnSeries = function (pivotData, colors, onlyNumbers, isUniqueVals, isNotDrilldown, additionOptions) {
1026
+ highchartsRenderer.ptCreateColumnSeries = function (pivotData, colors, onlyNumbers, isUniqueVals, isNotDrilldown, additionOptions, opts, chartOptions, chartType) {
978
1027
  var chart_series = [],
979
1028
  row_n_keys = pivotData.getRowKeys(),
980
1029
  col_n_keys = pivotData.getColKeys();
981
- var num_cols = col_n_keys.length;
982
- var num_rows = row_n_keys.length;
983
1030
 
984
1031
  var has_delta = false;
985
1032
  if (additionOptions && lodash.has(additionOptions, "delta_column.field") && additionOptions.delta_column.field == "series") {
986
1033
  has_delta = true;
987
1034
  }
988
1035
 
989
-
990
1036
  if (row_n_keys.length == 0)
991
1037
  row_n_keys.push([]);
992
1038
 
993
1039
  var i = 0;
994
1040
  var variat_serias = null;
1041
+ const n = col_n_keys.length;
1042
+ const xSum = (1 + n) / 2 * n;
1043
+ const trendSerieses = [];
995
1044
 
996
1045
  lodash.forEach(row_n_keys, function (row_n_value) {
1046
+ let ySum = 0;
1047
+ let xySum = 0;
1048
+ let squareXSum = 0;
997
1049
  var ob = {};
998
1050
  ob.data = [];
999
1051
  if (row_n_value && row_n_value.length > 0)
@@ -1006,7 +1058,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1006
1058
  style: highchartsRenderer.getDataLabelsStyle(additionOptions)
1007
1059
  }
1008
1060
 
1009
- lodash.forEach(col_n_keys, function (col_n_value) {
1061
+ lodash.forEach(col_n_keys, function (col_n_value, index) {
1010
1062
  var agg = pivotData.getAggregator(row_n_value, col_n_value);
1011
1063
  var val = agg.value();
1012
1064
 
@@ -1040,6 +1092,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1040
1092
  if (!isNotDrilldown)
1041
1093
  tmoobj.drilldown = true;
1042
1094
 
1095
+ xySum += Number(val) * (index + 1);
1096
+ ySum += Number(val);
1097
+ squareXSum += (index + 1) * (index + 1);
1043
1098
  ob.data.push(tmoobj);
1044
1099
  });
1045
1100
 
@@ -1053,9 +1108,29 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1053
1108
  }
1054
1109
 
1055
1110
  chart_series.push(ob);
1111
+
1112
+
1113
+ if (opts.trendLine) {
1114
+ const a = ((ySum * squareXSum) - (xSum * xySum)) / ((n * squareXSum) - (xSum * xSum));
1115
+ const b = ((n * xySum) - (xSum* ySum)) / ((n * squareXSum) - (xSum * xSum));
1116
+
1117
+ const trendSeries = lodash.clone(chart_series[chart_series.length - 1]);
1118
+ trendSeries.name = 'Trend Line (' + trendSeries.name + ')';
1119
+ trendSeries.dashStyle = 'shortdot';
1120
+ trendSeries.type = 'line';
1121
+ trendSeries.data = trendSeries.data.map((data, index) => ({name: data.name, y: a + b * (index + 1)}));
1122
+
1123
+ if (colors && colors[i]) {
1124
+ trendSeries.color = colors[i];
1125
+ }
1126
+
1127
+ trendSerieses.push(trendSeries);
1128
+ }
1056
1129
  i++;
1057
1130
  });
1058
1131
 
1132
+ const ethalonSeries = chart_series[chart_series.length - 1];
1133
+
1059
1134
  if (has_delta && additionOptions.delta_column.only_variant) {
1060
1135
  if (variat_serias)
1061
1136
  return [variat_serias];
@@ -1064,18 +1139,75 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1064
1139
  }
1065
1140
  }
1066
1141
 
1142
+ let weights = { line: 2,spline: 3 ,area:-2, areaspline: -1, scatter:4, column: 1 };
1143
+
1144
+ if (opts.comboOptions && chartType.includes('combo')) {
1145
+ chart_series.forEach((series, seriesIndex) => {
1146
+ const savedSeriesOption = lodash.find(opts.comboOptions.seriesOptions, {series: series.name});
1147
+ if (savedSeriesOption) {
1148
+ highchartsRenderer.setChartTypeBySeriesType(savedSeriesOption.chartType, series);
1149
+ } else if (seriesIndex === chart_series.length - 1 && !has_delta) {
1150
+ series.type = 'line';
1151
+ }
1152
+ });
1153
+ }
1154
+
1155
+ chart_series = [...chart_series, ...trendSerieses]
1156
+
1157
+ if (opts.total) {
1158
+ const totalSeries = lodash.clone(ethalonSeries);
1159
+ if (opts.totalSeriesSettings) {
1160
+ if (chartType.includes('combo')) {
1161
+ highchartsRenderer.setChartTypeBySeriesType(opts.totalSeriesSettings.chartType, totalSeries);
1162
+ }
1163
+
1164
+ totalSeries.yAxis = opts.totalSeriesSettings.secondaryAxis ? 1 : undefined;
1165
+ }
1166
+ totalSeries.name = 'Total';
1167
+ totalSeries.data = [];
1168
+ col_n_keys.forEach(columnKey => {
1169
+ let key = columnKey;
1170
+ let totalKey = columnKey;
1171
+ if (lodash.isArray(columnKey)) {
1172
+ key = columnKey[0];
1173
+ totalKey = totalKey.join(' , ');
1174
+ }
1175
+ totalSeries.data.push({name: lodash.unescape(key), y: pivotData.colTotals[totalKey].sum});
1176
+ });
1177
+
1178
+ chart_series.push(totalSeries);
1179
+ }
1180
+
1181
+ highchartsRenderer.moveSeriesToSecondYAxisIfNeeded(chart_series, pivotData, chartOptions, additionOptions, opts, opts.total && opts.totalSeriesSettings && opts.totalSeriesSettings.secondaryAxis);
1182
+
1183
+ chart_series.sort((a,b) => {
1184
+ return (weights[a.type] || 0) > (weights[b.type] || 0) ? 1 : (weights[a.type] || 0) < (weights[b.type] || 0) ? -1 : 0
1185
+ });
1186
+
1067
1187
  return chart_series;
1068
- };
1188
+ }
1189
+
1190
+ highchartsRenderer.setChartTypeBySeriesType = function (type, series) {
1191
+ const types = {
1192
+ 'line-chart': 'line',
1193
+ 'line-chart-smooth': 'spline',
1194
+ 'area-chart': 'area',
1195
+ 'area-chart-smooth': 'areaspline',
1196
+ 'scatter-chart': 'scatter',
1197
+ }
1198
+
1199
+ if (type === 'column-chart' || type === 'column-chart-stacked') {
1200
+ delete series.type;
1201
+ } else {
1202
+ series.type = types[type]
1203
+ }
1204
+ }
1069
1205
 
1070
1206
  highchartsRenderer.getVariantSeries = function (series, delta_column_options) {
1071
1207
  const varianceColor = delta_column_options.color || highchartsRenderer.variance_color || Highcharts.getOptions().colors[7];
1072
1208
  series.name = delta_column_options.name.replace('_', '');
1073
1209
  series.color = varianceColor;
1074
1210
 
1075
- if (!delta_column_options.only_variant && !delta_column_options.same_yaxis) {
1076
- series.yAxis = 1;
1077
- }
1078
-
1079
1211
  if (delta_column_options.point_click_event) {
1080
1212
  series.allowPointSelect = true;
1081
1213
  series.point = {
@@ -1103,9 +1235,9 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1103
1235
  series.marker = {
1104
1236
  lineColor: varianceColor
1105
1237
  };
1106
- } else if (delta_column_options.chart == 'column') {
1238
+ } else if (delta_column_options.chart == 'column' || delta_column_options.chart == 'combo') {
1107
1239
  series.type = 'column';
1108
- } else {
1240
+ } else if (delta_column_options.chart == '' || delta_column_options == 'scatter-chart') {
1109
1241
  series.type = 'spline';
1110
1242
  series.lineWidth = 0;
1111
1243
  series.lineColor = varianceColor;
@@ -1145,11 +1277,20 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1145
1277
  }
1146
1278
  };
1147
1279
  }
1280
+ else if (delta_column_options.chart == 'area') {
1281
+ series.color = varianceColor;
1282
+ series.type = 'area'
1283
+ } else if (delta_column_options.chart == 'areaspline') {
1284
+ series.color = varianceColor;
1285
+ series.type = 'areaspline'
1286
+ } else if (delta_column_options.chart == 'spline') {
1287
+ series.color = varianceColor;
1288
+ series.type = 'spline'
1289
+ }
1148
1290
  return series;
1149
1291
  }
1150
1292
 
1151
-
1152
- highchartsRenderer.ptCreateSeriesToDrillDownChart = function (pivotData) {
1293
+ highchartsRenderer.ptCreateSeriesToDrillDownChart = function (pivotData, chartOptions, additionOptions, opts) {
1153
1294
  var pie_series = [];
1154
1295
 
1155
1296
  var col_n_keys = pivotData.getColKeys();
@@ -1180,13 +1321,15 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1180
1321
  pie_series.push(ob);
1181
1322
  });
1182
1323
 
1324
+ highchartsRenderer.moveSeriesToSecondYAxisIfNeeded(pie_series, pivotData, chartOptions, additionOptions, opts);
1325
+
1183
1326
  return ([{
1184
1327
  colorByPoint: true,
1185
1328
  data: pie_series
1186
1329
  }]);
1187
1330
  };
1188
1331
 
1189
- highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart = function (pivotData) {
1332
+ highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart = function (pivotData, chartOptions, additionOptions, opts) {
1190
1333
 
1191
1334
  var pie_drill_down_series = [],
1192
1335
  row_n_keys = pivotData.getRowKeys(),
@@ -1224,12 +1367,60 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1224
1367
  }
1225
1368
  });
1226
1369
 
1370
+ highchartsRenderer.moveSeriesToSecondYAxisIfNeeded(pie_drill_down_series, pivotData, chartOptions, additionOptions, opts);
1227
1371
 
1228
1372
  return ({
1229
1373
  series: pie_drill_down_series
1230
1374
  });
1231
1375
  };
1232
1376
 
1377
+ highchartsRenderer.moveSeriesToSecondYAxisIfNeeded = function(chartSeries, pivotData, chartOptions, additionOptions, opts, forceAddSecondaryAxis) {
1378
+ if (!opts || !opts.comboOptions) {
1379
+ return;
1380
+ }
1381
+
1382
+ let addSecondYAxis = false;
1383
+ lodash.forEach(chartSeries, function (series) {
1384
+ let sOptions = lodash.find(opts.comboOptions.seriesOptions, function(sOptions) {
1385
+ return sOptions.series === series.name || sOptions.series.replace('_', '') === series.name
1386
+ });
1387
+ if (sOptions && sOptions.secondaryAxis) {
1388
+ series.yAxis = 1;
1389
+ addSecondYAxis = true;
1390
+ }
1391
+ });
1392
+
1393
+ if (addSecondYAxis || forceAddSecondaryAxis) {
1394
+ highchartsRenderer.addSecondYAxis(pivotData, chartOptions, additionOptions, opts);
1395
+ }
1396
+ }
1397
+
1398
+ highchartsRenderer.addSecondYAxis = function (pivotData, chartOptions, additionOptions, opts) {
1399
+ const varianceColor = (additionOptions && additionOptions.delta_column.color) || (highchartsRenderer && highchartsRenderer.variance_color) || Highcharts.getOptions().colors[7];
1400
+ let labels_formatter = opts.comboOptions.secondaryAxisSettings.is_percentage ?
1401
+ highchartsRenderer.persantageValueLabelsFormatter(pivotData, opts) :
1402
+ highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts);
1403
+
1404
+ chartOptions.yAxis = [chartOptions.yAxis];
1405
+ chartOptions.yAxis[1] = {
1406
+ min: !isNaN(parseInt(opts.comboOptions.secondaryAxisSettings.min)) ? opts.comboOptions.secondaryAxisSettings.min : null,
1407
+ max: !isNaN(parseInt(opts.comboOptions.secondaryAxisSettings.max)) ? opts.comboOptions.secondaryAxisSettings.max : null,
1408
+ title: {
1409
+ text: opts.comboOptions.secondaryAxisSettings.name,
1410
+ style: {
1411
+ color: varianceColor
1412
+ }
1413
+ },
1414
+ labels: {
1415
+ formatter: labels_formatter,
1416
+ style: {
1417
+ color: varianceColor
1418
+ }
1419
+ },
1420
+ opposite: true
1421
+ }
1422
+ };
1423
+
1233
1424
  highchartsRenderer.ptRenderBasicPie = function (pivotData, opts) {
1234
1425
  var chartOptions = {};
1235
1426
  var additionOptions = opts.chartOptions ? opts.chartOptions : highchartsRenderer.getDefaultValueForChart('pie-chart');
@@ -1409,7 +1600,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1409
1600
  }
1410
1601
 
1411
1602
  chartOptions.xAxis = {categories: pivotData.getColKeys()};
1412
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, true);
1603
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, true, null, null, opts, chartOptions);
1413
1604
 
1414
1605
  var total = [];
1415
1606
  lodash.forEach(chartOptions.series, function (obj) {
@@ -1550,7 +1741,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1550
1741
 
1551
1742
 
1552
1743
  chartOptions.xAxis = {categories: pivotData.getColKeys()};
1553
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, true);
1744
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, true, null, null, opts, chartOptions);
1554
1745
 
1555
1746
  var total = [];
1556
1747
  lodash.forEach(chartOptions.series, function (obj) {
@@ -1644,7 +1835,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1644
1835
  };
1645
1836
  var uniqueVals = kpioptions.value.value == "Unique";
1646
1837
 
1647
- let temp_series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, true, uniqueVals);
1838
+ let temp_series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, true, uniqueVals, null, opts, chartOptions);
1648
1839
 
1649
1840
  var total = [];
1650
1841
  lodash.forEach(temp_series, function (obj) {
@@ -1764,12 +1955,12 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1764
1955
  if (useNewUx) {
1765
1956
  chartOptions.tooltip.borderColor = '#fff';
1766
1957
  }
1767
- chartOptions.series = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData);
1958
+ chartOptions.series = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData, chartOptions, additionOptions, opts);
1768
1959
  chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, 1, false, true);
1769
1960
  if (drilldownFunc)
1770
1961
  chartOptions.drilldown = {}
1771
1962
  else
1772
- chartOptions.drilldown = highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart(pivotData);
1963
+ chartOptions.drilldown = highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart(pivotData, chartOptions, additionOptions, opts);
1773
1964
 
1774
1965
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
1775
1966
 
@@ -1826,7 +2017,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1826
2017
  formatter: highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts)
1827
2018
  }
1828
2019
  };
1829
- highchartsRenderer.addSecondYAxisIfNeed(pivotData, chartOptions, additionOptions, opts);
1830
2020
 
1831
2021
  chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, rowAttrs.length, true);
1832
2022
 
@@ -1871,7 +2061,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1871
2061
  }
1872
2062
  };
1873
2063
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
1874
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, additionOptions);
2064
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, additionOptions, opts, chartOptions);
1875
2065
 
1876
2066
  highchartsRenderer.handleGridLines(additionOptions, chartOptions)
1877
2067
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
@@ -1902,8 +2092,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1902
2092
  }
1903
2093
  };
1904
2094
 
1905
- highchartsRenderer.addSecondYAxisIfNeed(pivotData, chartOptions, additionOptions, opts);
1906
-
1907
2095
  chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, rowAttrs.length, true);
1908
2096
 
1909
2097
  chartOptions.plotOptions = {
@@ -1950,7 +2138,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1950
2138
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
1951
2139
 
1952
2140
  var colors = ['#ff0202', '#b3060e', '#70000a'];
1953
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, colors, null, null, additionOptions);
2141
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, colors, null, null, additionOptions, opts, chartOptions);
1954
2142
 
1955
2143
  highchartsRenderer.handleGridLines(additionOptions, chartOptions)
1956
2144
 
@@ -1972,34 +2160,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1972
2160
 
1973
2161
  }
1974
2162
 
1975
- highchartsRenderer.addSecondYAxisIfNeed = function (pivotData, chartOptions, additionOptions, opts) {
1976
- if (additionOptions && additionOptions.delta_column && additionOptions.delta_column.field == "series") {
1977
- chartOptions.yAxis = [chartOptions.yAxis];
1978
-
1979
- let labels_formatter = highchartsRenderer.defaultValueLabelsFormatter(pivotData, opts);
1980
- if (additionOptions.delta_column.is_percentage) {
1981
- labels_formatter = highchartsRenderer.persantageValueLabelsFormatter(pivotData, opts);
1982
- }
1983
-
1984
- const varianceColor = additionOptions.delta_column.color || highchartsRenderer.variance_color || Highcharts.getOptions().colors[7];
1985
- chartOptions.yAxis[1] = {
1986
- title: {
1987
- text: additionOptions.delta_column.name.replace('_', ''),
1988
- style: {
1989
- color: varianceColor
1990
- }
1991
- },
1992
- labels: {
1993
- formatter: labels_formatter,
1994
- style: {
1995
- color: varianceColor
1996
- }
1997
- },
1998
- opposite: true
1999
- }
2000
- }
2001
- };
2002
-
2003
2163
  highchartsRenderer.ptRenderSpLine = function (pivotData, opts) {
2004
2164
  var chartOptions = {};
2005
2165
  var rowAttrs = pivotData.rowAttrs;
@@ -2025,8 +2185,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2025
2185
  }
2026
2186
  };
2027
2187
 
2028
- highchartsRenderer.addSecondYAxisIfNeed(pivotData, chartOptions, additionOptions, opts);
2029
-
2030
2188
  chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, rowAttrs.length, true);
2031
2189
 
2032
2190
  chartOptions.plotOptions = {
@@ -2068,7 +2226,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2068
2226
  }
2069
2227
  };
2070
2228
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2071
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, additionOptions);
2229
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, additionOptions, opts, chartOptions);
2072
2230
 
2073
2231
  highchartsRenderer.handleGridLines(additionOptions, chartOptions);
2074
2232
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
@@ -2116,7 +2274,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2116
2274
  }
2117
2275
  };
2118
2276
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2119
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData);
2277
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, null, opts, chartOptions);
2120
2278
 
2121
2279
  highchartsRenderer.handleGridLines(additionOptions, chartOptions);
2122
2280
 
@@ -2213,14 +2371,14 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2213
2371
  },
2214
2372
  lineWidth: 0
2215
2373
  };
2216
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData);
2374
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, null, opts, chartOptions);
2217
2375
 
2218
2376
  chartOptions.legend = highchartsRenderer.getOptionsForLegends(additionOptions, rowAttrs.length, false);
2219
2377
 
2220
2378
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
2221
2379
  };
2222
2380
 
2223
- highchartsRenderer.ptRenderColumn = function (pivotData, opts, drilldownFunc) {
2381
+ highchartsRenderer.ptRenderColumn = function (pivotData, opts, drilldownFunc, chartType) {
2224
2382
  var chartOptions = {};
2225
2383
  var rowAttrs = pivotData.rowAttrs;
2226
2384
  var colAttrs = pivotData.colAttrs;
@@ -2275,8 +2433,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2275
2433
  }
2276
2434
  };
2277
2435
 
2278
- highchartsRenderer.addSecondYAxisIfNeed(pivotData, chartOptions, additionOptions, opts);
2279
-
2280
2436
  chartOptions.tooltip = {
2281
2437
  formatter: highchartsRenderer.defaultFormatterToTooltip(pivotData, opts),
2282
2438
  shadow: highchartsRenderer.tooltipShadow,
@@ -2290,7 +2446,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2290
2446
  highchartsRenderer.handleGridLines(additionOptions, chartOptions);
2291
2447
 
2292
2448
  var isNotDrilldown = !(colAttrs && colAttrs.length > 1);
2293
- chartOptions.series = highchartsRenderer.ptCreateColumnSeries(pivotData, null, null, null, isNotDrilldown, additionOptions);
2449
+ if (lodash.get(opts, 'paletteOptions.widgetPalette', null)) {
2450
+ const mc_palette = lodash.find(lodash.get(opts.paletteOptions, 'monochromePalettes', []), { selected: true });
2451
+ chartOptions.colors = mc_palette ? mc_palette.colors : opts.paletteOptions.widgetPalette;
2452
+ } else if (lodash.get(opts, 'paletteOptions.dashboardPalette.colors', null)) {
2453
+ chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
2454
+ }
2455
+ chartOptions.series = highchartsRenderer.ptCreateColumnSeries(pivotData, chartOptions.colors, null, null, isNotDrilldown, additionOptions, opts, chartOptions, chartType);
2294
2456
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2295
2457
  chartOptions.plotOptions = {
2296
2458
  column: {
@@ -2327,7 +2489,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2327
2489
  return highchartsRenderer.ptCreateElementAndDraw(chartOptions, opts);
2328
2490
  };
2329
2491
 
2330
- highchartsRenderer.ptRenderStackedColumn = function (pivotData, opts, drilldownFunc) {
2492
+ highchartsRenderer.ptRenderStackedColumn = function (pivotData, opts, drilldownFunc, chartType) {
2331
2493
  var chartOptions = {};
2332
2494
  var rowAttrs = pivotData.rowAttrs;
2333
2495
  var additionOptions = opts.chartOptions ? opts.chartOptions : highchartsRenderer.getDefaultValueForChart('column-chart-stacked');
@@ -2458,7 +2620,13 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2458
2620
  };
2459
2621
  //chartOptions.xAxis = { categories: pivotData.getColKeys() };
2460
2622
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2461
- chartOptions.series = highchartsRenderer.ptCreateColumnSeries(pivotData, null, null, true, true);
2623
+ if (lodash.get(opts, 'paletteOptions.widgetPalette', null)) {
2624
+ const mc_palette = lodash.find(lodash.get(opts.paletteOptions, 'monochromePalettes', []), { selected: true });
2625
+ chartOptions.colors = mc_palette ? mc_palette.colors : opts.paletteOptions.widgetPalette;
2626
+ } else if (lodash.get(opts, 'paletteOptions.dashboardPalette.colors', null)) {
2627
+ chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
2628
+ }
2629
+ chartOptions.series = highchartsRenderer.ptCreateColumnSeries(pivotData, chartOptions.colors, null, true, true, additionOptions, opts, chartOptions, chartType);
2462
2630
  //chartOptions.drilldown = {}
2463
2631
 
2464
2632
  highchartsRenderer.handleGridLines(additionOptions, chartOptions)
@@ -2535,11 +2703,11 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2535
2703
 
2536
2704
  chartOptions.xAxis = {type: 'category'};
2537
2705
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2538
- chartOptions.series = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData);
2706
+ chartOptions.series = highchartsRenderer.ptCreateSeriesToDrillDownChart(pivotData, chartOptions, additionOptions, opts);
2539
2707
  //if (drilldownFunc)
2540
2708
  // chartOptions.drilldown = {}
2541
2709
  //else
2542
- chartOptions.drilldown = highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart(pivotData);
2710
+ chartOptions.drilldown = highchartsRenderer.ptCreateDrillDownSeriesToDrilldownChart(pivotData, chartOptions, additionOptions, opts);
2543
2711
 
2544
2712
  highchartsRenderer.handleGridLines(additionOptions, chartOptions)
2545
2713
 
@@ -2610,7 +2778,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2610
2778
  }
2611
2779
  };
2612
2780
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2613
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData);
2781
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, null, opts, chartOptions);
2614
2782
 
2615
2783
  highchartsRenderer.handleGridLines(additionOptions, chartOptions)
2616
2784
 
@@ -2724,7 +2892,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2724
2892
  }
2725
2893
  };
2726
2894
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
2727
- chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData);
2895
+ chartOptions.series = highchartsRenderer.ptCreateBasicLineSeries(pivotData, null, null, null, null, opts, chartOptions);
2728
2896
 
2729
2897
  highchartsRenderer.handleGridLines(additionOptions, chartOptions)
2730
2898
 
@@ -2813,6 +2981,18 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2813
2981
  return format;
2814
2982
  }
2815
2983
 
2984
+ highchartsRenderer.isRowKeyShouldBePercentage = function(render_options, rowKey) {
2985
+ if (render_options && render_options.comboOptions && render_options.comboOptions.secondaryAxisSettings &&
2986
+ render_options.comboOptions.secondaryAxisSettings.is_percentage) {
2987
+ const rowKeyString = rowKey.join(highchartsRenderer.delimer);
2988
+ const rowKeyOptions = lodash.find(render_options.comboOptions.seriesOptions, {series: rowKeyString});
2989
+ if (rowKeyOptions && rowKeyOptions.secondaryAxis) {
2990
+ return true;
2991
+ }
2992
+ }
2993
+ return false;
2994
+ }
2995
+
2816
2996
  highchartsRenderer.ignoreIfCalculatedValue = function(data, rowKey, colKey, record, associatedFields, renderOptions, isGraph) {
2817
2997
  var eliminate = renderOptions && renderOptions.chartOptions && renderOptions.chartOptions.table_options &&
2818
2998
  renderOptions.chartOptions.table_options.eliminate_calc_totals && !_.isEmpty(associatedFields) && !isGraph;
@@ -2832,17 +3012,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2832
3012
 
2833
3013
  highchartsRenderer.rhPivotCount = function (arg, widget_values_format, is_graph, render_options, calculated_info) {
2834
3014
  var attr = arg[0];
2835
- var has_variants_persentage = false;
2836
- var variant_name = '';
2837
-
2838
- if (render_options && render_options.chartOptions &&
2839
- render_options.chartOptions.delta_column &&
2840
- render_options.chartOptions.delta_column.field === 'series' &&
2841
- render_options.chartOptions.delta_column.is_percentage) {
2842
- has_variants_persentage = true;
2843
- variant_name = render_options.chartOptions.delta_column.name;
2844
- }
2845
-
2846
3015
  return function (data, rowKey, colKey) {
2847
3016
  return {
2848
3017
  sum: 0,
@@ -2864,10 +3033,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2864
3033
  this.formats = lodash.uniq(this.formats);
2865
3034
  }
2866
3035
 
2867
- if (has_variants_persentage) {
2868
- if (rowKey == variant_name || lodash.includes(rowKey, variant_name)) {
2869
- this.widget_values_format = "#,###%";
2870
- }
3036
+ if (highchartsRenderer.isRowKeyShouldBePercentage(render_options, rowKey)) {
3037
+ this.widget_values_format = "#,###%";
2871
3038
  }
2872
3039
 
2873
3040
  if (highchartsRenderer.ignoreIfCalculatedValue(data, rowKey, colKey, record, calculated_info.associated_fields, render_options, is_graph)) {
@@ -2987,17 +3154,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
2987
3154
  };
2988
3155
 
2989
3156
  highchartsRenderer.rhPivotAggregatorSum = function (arg, widget_values_format, is_graph, render_options, calculated_info) {
2990
- var attr;
2991
- attr = arg[0];
2992
- var has_variants_persentage = false;
2993
- var variant_name = '';
2994
- if (render_options && render_options.chartOptions &&
2995
- render_options.chartOptions.delta_column &&
2996
- render_options.chartOptions.delta_column.field == "series" &&
2997
- render_options.chartOptions.delta_column.is_percentage) {
2998
- has_variants_persentage = true;
2999
- variant_name = render_options.chartOptions.delta_column.name;
3000
- }
3157
+ var attr = arg[0];
3001
3158
  return function (data, rowKey, colKey) {
3002
3159
  return {
3003
3160
  sum: 0,
@@ -3030,10 +3187,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3030
3187
  this.formats = lodash.uniq(this.formats);
3031
3188
  }
3032
3189
 
3033
- if (has_variants_persentage) {
3034
- if (rowKey == variant_name || lodash.includes(rowKey, variant_name)) {
3035
- this.widget_values_format = "#,###%";
3036
- }
3190
+ if (highchartsRenderer.isRowKeyShouldBePercentage(render_options, rowKey)) {
3191
+ this.widget_values_format = "#,###%";
3037
3192
  }
3038
3193
 
3039
3194
  if (highchartsRenderer.ignoreIfCalculatedValue(data, rowKey, colKey, record, calculated_info.associated_fields, render_options, is_graph)) {
@@ -3087,17 +3242,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3087
3242
  };
3088
3243
 
3089
3244
  highchartsRenderer.rhPivotAggregatorMin = function (arg, widget_values_format, is_graph, render_options, calculated_info) {
3090
- var attr;
3091
- attr = arg[0];
3092
- var has_variants_persentage = false;
3093
- var variant_name = '';
3094
- if (render_options && render_options.chartOptions &&
3095
- render_options.chartOptions.delta_column &&
3096
- render_options.chartOptions.delta_column.field == "series" &&
3097
- render_options.chartOptions.delta_column.is_percentage) {
3098
- has_variants_persentage = true;
3099
- variant_name = render_options.chartOptions.delta_column.name;
3100
- }
3245
+ var attr = arg[0];
3101
3246
  return function (data, rowKey, colKey) {
3102
3247
  return {
3103
3248
  val: null,
@@ -3131,10 +3276,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3131
3276
  this.formats = lodash.uniq(this.formats);
3132
3277
  }
3133
3278
 
3134
- if (has_variants_persentage) {
3135
- if (rowKey == variant_name || lodash.includes(rowKey, variant_name)) {
3136
- this.widget_values_format = "#,###%";
3137
- }
3279
+ if (highchartsRenderer.isRowKeyShouldBePercentage(render_options, rowKey)) {
3280
+ this.widget_values_format = "#,###%";
3138
3281
  }
3139
3282
 
3140
3283
  if (highchartsRenderer.ignoreIfCalculatedValue(data, rowKey, colKey, record, calculated_info.associated_fields, render_options, is_graph)) {
@@ -3185,17 +3328,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3185
3328
  };
3186
3329
 
3187
3330
  highchartsRenderer.rhPivotAggregatorMax = function (arg, widget_values_format, is_graph, render_options, calculated_info) {
3188
- var attr;
3189
- attr = arg[0];
3190
- var has_variants_persentage = false;
3191
- var variant_name = '';
3192
- if (render_options && render_options.chartOptions &&
3193
- render_options.chartOptions.delta_column &&
3194
- render_options.chartOptions.delta_column.field == "series" &&
3195
- render_options.chartOptions.delta_column.is_percentage) {
3196
- has_variants_persentage = true;
3197
- variant_name = render_options.chartOptions.delta_column.name;
3198
- }
3331
+ var attr = arg[0];
3199
3332
  return function (data, rowKey, colKey) {
3200
3333
  return {
3201
3334
  val: null,
@@ -3229,10 +3362,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3229
3362
  this.formats = lodash.uniq(this.formats);
3230
3363
  }
3231
3364
 
3232
- if (has_variants_persentage) {
3233
- if (rowKey == variant_name || lodash.includes(rowKey, variant_name)) {
3234
- this.widget_values_format = "#,###%";
3235
- }
3365
+ if (highchartsRenderer.isRowKeyShouldBePercentage(render_options, rowKey)) {
3366
+ this.widget_values_format = "#,###%";
3236
3367
  }
3237
3368
 
3238
3369
  if (highchartsRenderer.ignoreIfCalculatedValue(data, rowKey, colKey, record, calculated_info.associated_fields, render_options, is_graph)) {
@@ -3283,17 +3414,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3283
3414
  };
3284
3415
 
3285
3416
  highchartsRenderer.rhPivotAggregatorAverage = function (arg, widget_values_format, is_graph, render_options, calculated_info) {
3286
- var attr;
3287
- attr = arg[0];
3288
- var has_variants_persentage = false;
3289
- var variant_name = '';
3290
- if (render_options && render_options.chartOptions &&
3291
- render_options.chartOptions.delta_column &&
3292
- render_options.chartOptions.delta_column.field == "series" &&
3293
- render_options.chartOptions.delta_column.is_percentage) {
3294
- has_variants_persentage = true;
3295
- variant_name = render_options.chartOptions.delta_column.name;
3296
- }
3417
+ var attr = arg[0];
3297
3418
  return function (data, rowKey, colKey) {
3298
3419
  return {
3299
3420
  sum: 0,
@@ -3328,10 +3449,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3328
3449
  this.formats = lodash.uniq(this.formats);
3329
3450
  }
3330
3451
 
3331
- if (has_variants_persentage) {
3332
- if (rowKey == variant_name || lodash.includes(rowKey, variant_name)) {
3333
- this.widget_values_format = "#,###%";
3334
- }
3452
+ if (highchartsRenderer.isRowKeyShouldBePercentage(render_options, rowKey)) {
3453
+ this.widget_values_format = "#,###%";
3335
3454
  }
3336
3455
 
3337
3456
  if (highchartsRenderer.ignoreIfCalculatedValue(data, rowKey, colKey, record, calculated_info.associated_fields, render_options, is_graph)) {
@@ -4279,6 +4398,50 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4279
4398
  delete options.chartOptions.label;
4280
4399
  }
4281
4400
  }
4401
+
4402
+ if (!options.comboOptions) {
4403
+ options.comboOptions = {
4404
+ secondaryAxisSettings: {
4405
+ name: 'Secondary Axis',
4406
+ max: null,
4407
+ min: null,
4408
+ is_percentage: false,
4409
+ },
4410
+ seriesOptions: []
4411
+ }
4412
+ if (options.chartOptions.delta_column && options.chartOptions.delta_column.field === 'series') {
4413
+ let deltaColumnSeries = {
4414
+ series: options.chartOptions.delta_column.name,
4415
+ secondaryAxis: !options.chartOptions.delta_column.same_yaxis,
4416
+ };
4417
+ switch (options.chartOptions.delta_column.chart) {
4418
+ case 'line':
4419
+ deltaColumnSeries.chartType = 'line-chart';
4420
+ break;
4421
+ case 'spline':
4422
+ deltaColumnSeries.chartType = 'line-chart-smooth';
4423
+ break;
4424
+ case 'area':
4425
+ deltaColumnSeries.chartType = 'area-chart';
4426
+ break;
4427
+ case 'areaspline':
4428
+ deltaColumnSeries.chartType = 'area-chart-smooth';
4429
+ break;
4430
+ case 'scatter':
4431
+ deltaColumnSeries.chartType = 'scatter-chart';
4432
+ break;
4433
+ case 'column':
4434
+ deltaColumnSeries.chartType = 'column-chart';
4435
+ break;
4436
+ default:
4437
+ deltaColumnSeries.chartType = 'scatter-chart';
4438
+ break;
4439
+ }
4440
+ options.comboOptions.seriesOptions.push(deltaColumnSeries);
4441
+ options.comboOptions.secondaryAxisSettings.name = options.chartOptions.delta_column.name.replace('_', '');
4442
+ options.comboOptions.secondaryAxisSettings.is_percentage = options.chartOptions.delta_column.is_percentage;
4443
+ }
4444
+ }
4282
4445
  };
4283
4446
 
4284
4447
  highchartsRenderer.addPivotOptions = function (selectedTemplateWOData, widgetOptions, drilldownFunction, drillDownListFunction) {
@@ -4386,6 +4549,60 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4386
4549
  exTableOptions.pivot.calculatedValues = highchartsRenderer.objectCopyJsonMethod(exTableOptions.calculated_values || []);
4387
4550
  };
4388
4551
 
4552
+ highchartsRenderer.addTemplateDataToDynamicRangeOptions = function (selectedTemplate, dynamicRangeOptions) {
4553
+ highchartsRenderer.setWidgetFieldsToTemplate(selectedTemplate);
4554
+
4555
+ var fields = highchartsRenderer.objectCopyJsonMethod(selectedTemplate.widget_fields);
4556
+ var fieldOb;
4557
+ var filterFields = [];
4558
+ var selectedFields = [];
4559
+
4560
+ lodash.forEach(dynamicRangeOptions.filters, function (filterObj) {
4561
+ fieldOb = lodash.find(fields, {id: filterObj.field});
4562
+ if (fieldOb && filterObj.values && filterObj.values.datetype && filterObj.values.datetype === 'list') {
4563
+ filterObj.values = filterObj.values.val
4564
+ } else if (fieldOb && filterObj.values && filterObj.values.datetype && filterObj.values.datetype !== 'list') {
4565
+ fieldOb.values = filterObj.values;
4566
+ } else if (fieldOb && filterObj.values && filterObj.values.type === 'advanced') {
4567
+ fieldOb.values = filterObj.values;
4568
+ }
4569
+ if (fieldOb && filterObj.values && filterObj.values instanceof Array) {
4570
+ if (filterObj.is_excluded == true) {
4571
+ fieldOb.excludes = filterObj.values;
4572
+ } else {
4573
+ fieldOb.includes = filterObj.values;
4574
+ }
4575
+ }
4576
+ if (filterObj.allow_nulls && fieldOb) {
4577
+ fieldOb.allow_nulls = filterObj.allow_nulls;
4578
+ }
4579
+ });
4580
+
4581
+ // fill selected fields
4582
+ lodash.forEach(dynamicRangeOptions.fields, function (valObj) {
4583
+ fieldOb = lodash.find(fields, {id: valObj.field});
4584
+ if (fieldOb) {
4585
+ selectedFields.push(fieldOb);
4586
+ lodash.remove(fields, {id: fieldOb.id});
4587
+ }
4588
+ });
4589
+
4590
+ // fill filter fields
4591
+ lodash.forEach(dynamicRangeOptions.filters, function (valObj) {
4592
+ fieldOb = lodash.find(fields, {id: valObj.field});
4593
+ if (fieldOb) {
4594
+ filterFields.push(fieldOb);
4595
+ lodash.remove(fields, {id: fieldOb.id});
4596
+ }
4597
+ });
4598
+
4599
+ dynamicRangeOptions.pivot = {};
4600
+ dynamicRangeOptions.pivot.fieldsArray = fields;
4601
+ dynamicRangeOptions.pivot.selectedFieldsArray = selectedFields;
4602
+ dynamicRangeOptions.pivot.filtersArray = filterFields;
4603
+ dynamicRangeOptions.pivot.calculatedValues = highchartsRenderer.objectCopyJsonMethod(dynamicRangeOptions.calculated_values || []);
4604
+ }
4605
+
4389
4606
  highchartsRenderer.addTemplateDataToFunctionOptions = function (selectedTemplate, functionOptions) {
4390
4607
  highchartsRenderer.setWidgetFieldsToTemplate(selectedTemplate);
4391
4608
 
@@ -5360,7 +5577,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5360
5577
  element_options: [
5361
5578
  {label: 'Markers', value: ''},
5362
5579
  {label: 'Line', value: 'line'},
5580
+ {label: 'Smooth Line', value: 'spline'},
5363
5581
  {label: 'Column', value: 'column'},
5582
+ {label: 'Area', value: 'area'},
5583
+ {label: 'Smooth Area', value: 'areaspline'},
5364
5584
  ],
5365
5585
  default_value: ''
5366
5586
  }, {
@@ -5372,7 +5592,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5372
5592
  element_type: 'checkbox',
5373
5593
  element_label: 'Same yAxis',
5374
5594
  value_name: 'same_yaxis',
5375
- default_value: false
5595
+ default_value: false,
5596
+ hidden: true,
5376
5597
  }, {
5377
5598
  element_type: 'checkbox',
5378
5599
  element_label: 'Same xAxis',
@@ -5382,7 +5603,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5382
5603
  element_type: 'checkbox',
5383
5604
  element_label: 'Percentage',
5384
5605
  value_name: 'is_percentage',
5385
- default_value: false
5606
+ default_value: false,
5607
+ hidden: true,
5386
5608
  }, {
5387
5609
  element_type: 'checkbox',
5388
5610
  element_label: 'Sort by variance',
@@ -5433,7 +5655,10 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5433
5655
  element_options: [
5434
5656
  {label: 'Markers', value: ''},
5435
5657
  {label: 'Line', value: 'line'},
5658
+ {label: 'Smooth Line', value: 'spline'},
5436
5659
  {label: 'Column', value: 'column'},
5660
+ {label: 'Area', value: 'area'},
5661
+ {label: 'Smooth Area', value: 'areaspline'},
5437
5662
  ],
5438
5663
  default_value: ''
5439
5664
  }, {
@@ -5445,7 +5670,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5445
5670
  element_type: 'checkbox',
5446
5671
  element_label: 'Same yAxis',
5447
5672
  value_name: 'same_yaxis',
5448
- default_value: false
5673
+ default_value: false,
5674
+ hidden: true,
5449
5675
  }, {
5450
5676
  element_type: 'checkbox',
5451
5677
  element_label: 'Same xAxis',
@@ -5455,7 +5681,8 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5455
5681
  element_type: 'checkbox',
5456
5682
  element_label: 'Percentage',
5457
5683
  value_name: 'is_percentage',
5458
- default_value: false
5684
+ default_value: false,
5685
+ hidden: true,
5459
5686
  }, {
5460
5687
  element_type: 'checkbox',
5461
5688
  element_label: 'Sort by variance',
@@ -5532,6 +5759,39 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5532
5759
  };
5533
5760
 
5534
5761
  highchartsRenderer.chartsTypesInfo = {
5762
+ 'combo-chart': {
5763
+ name: 'Combo Chart ',
5764
+ label: 'Combo Chart ',
5765
+ title: 'Allows for multiple chart display formats in one widget',
5766
+ description: 'For example, Revenue and Cost of goods sold as clomuns, and Gross margin as a line',
5767
+ axisName: 'X - Axis',
5768
+ legendName: 'Data series',
5769
+ startedMessage: 'To add multiple chart types, click on “Combo Chart Options“. A Secondary Axis is available in this chart',
5770
+ axisTooltipTitle: 'Drag one or more fields here to create your x-axis.',
5771
+ legendTooltipTitle: 'Click to display these data series as line or area charts',
5772
+ },
5773
+ 'combo-column-chart': {
5774
+ name: 'Column Combo Chart ',
5775
+ label: 'Column Chart',
5776
+ title: 'Allows for multiple chart display formats in one widget',
5777
+ description: 'For example, Revenue and Cost of goods sold as clomuns, and Gross margin as a line',
5778
+ axisName: 'X - Axis',
5779
+ legendName: 'Data series',
5780
+ startedMessage: 'To add multiple chart types, click on “Combo Chart Options“. A Secondary Axis is available in this chart.',
5781
+ axisTooltipTitle: 'Drag one or more fields here to create your x-axis.',
5782
+ legendTooltipTitle: 'Click to display these data series as line or area charts.',
5783
+ },
5784
+ 'combo-stacked-chart': {
5785
+ name: 'Stacked Column Combo Chart ',
5786
+ label: 'Stacked Column',
5787
+ title: 'Allows for multiple chart display formats in one widget.',
5788
+ description: 'For example, different department stacked clomuns, and average as a line.',
5789
+ axisName: 'X - Axis',
5790
+ legendName: 'Data series',
5791
+ startedMessage: 'To add multiple chart types, click on “Combo Chart Options“. A Secondary Axis is available in this chart.',
5792
+ axisTooltipTitle: 'Drag one or more fields here to create your x-axis.',
5793
+ legendTooltipTitle: 'Click to display these data series as line or area charts.',
5794
+ },
5535
5795
  'line-chart': {
5536
5796
  name: 'Line chart',
5537
5797
  label: 'Line Chart',
@@ -5769,6 +6029,53 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5769
6029
  }
5770
6030
  ]
5771
6031
  },
6032
+ {
6033
+ type: 'combo',
6034
+ name: 'Combo',
6035
+ class: 'combo-chart',
6036
+ subtypes: [{
6037
+ type: 'combo-column-chart',
6038
+ name: highchartsRenderer.chartsTypesInfo['combo-column-chart'].name,
6039
+ class: 'combo-column-chart',
6040
+ render: highchartsRenderer.ptRenderColumn,
6041
+ suboptions: [
6042
+ highchartsRenderer.suboptions["default_show"],
6043
+ highchartsRenderer.suboptions["axisY"],
6044
+ highchartsRenderer.suboptions["axisX"],
6045
+ highchartsRenderer.suboptions["tooltips"],
6046
+ highchartsRenderer.suboptions["label"],
6047
+ highchartsRenderer.suboptions["subtitle"],
6048
+ highchartsRenderer.suboptions["table_options"],
6049
+ highchartsRenderer.suboptions["chart"],
6050
+ highchartsRenderer.suboptions["negative_number_format"],
6051
+ highchartsRenderer.suboptions["delta_column_for_drill_down"],
6052
+ highchartsRenderer.suboptions["error_policy"],
6053
+ highchartsRenderer.suboptions["from_version"],
6054
+ highchartsRenderer.suboptions["legends"],
6055
+ ],
6056
+ },
6057
+ {
6058
+ type: 'combo-stacked-chart',
6059
+ name: highchartsRenderer.chartsTypesInfo['combo-stacked-chart'].name,
6060
+ class: 'combo-stacked-chart',
6061
+ render: highchartsRenderer.ptRenderStackedColumn,
6062
+ suboptions: [
6063
+ highchartsRenderer.suboptions["default_show"],
6064
+ highchartsRenderer.suboptions["axisY"],
6065
+ highchartsRenderer.suboptions["axisX"],
6066
+ highchartsRenderer.suboptions["tooltips"],
6067
+ highchartsRenderer.suboptions["label_with_percentage"],
6068
+ highchartsRenderer.suboptions["subtitle"],
6069
+ highchartsRenderer.suboptions["table_options"],
6070
+ highchartsRenderer.suboptions["chart_grid"],
6071
+ highchartsRenderer.suboptions["delta_column"],
6072
+ highchartsRenderer.suboptions["error_policy"],
6073
+ highchartsRenderer.suboptions["from_version"],
6074
+ highchartsRenderer.suboptions["legends"],
6075
+ ]
6076
+ }
6077
+ ]
6078
+ },
5772
6079
  {
5773
6080
  type: 'area',
5774
6081
  name: 'Area',
@@ -6684,7 +6991,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
6684
6991
  var datesFields = [];
6685
6992
  datesFields = lodash.filter(widget.rows, element => element.type == 'Date');
6686
6993
  datesFields = datesFields.concat(lodash.filter(widget.cols, element => element.type == 'Date'));
6687
-
6994
+
6688
6995
  const isCustomSorting = widget.options.sortingFields && Array.isArray(widget.options.sortingFields) && widget.options.sortingFields.length > 0;
6689
6996
  if (isCustomSorting) {
6690
6997
  lodash.forEach(datesFields, function (field) {
@@ -7047,7 +7354,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7047
7354
  itemMarginTop: 2,
7048
7355
  };
7049
7356
  const none = {
7050
- enabled: false,
7357
+ enabled: false,
7051
7358
  };
7052
7359
 
7053
7360
  if (additionOptions.legends_position && additionOptions.legends_position.value) {