@datarailsshared/dr_renderer 1.2.211-dragons → 1.2.213-rocket

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.211-dragons",
3
+ "version": "1.2.213-rocket",
4
4
  "description": "DataRails charts and tables renderer",
5
5
  "keywords": [
6
6
  "datarails",
@@ -2421,14 +2421,8 @@ let initDRPivotTable = function($, window, document) {
2421
2421
  if (colAttrs.length > 0 && colKeys.length > 0) {
2422
2422
  colHeaders = processKeys(colKeys, "pvtColLabel", 'cols', colAttrs);
2423
2423
  }
2424
- var tableClasses = ['pvtTable'];
2425
- if (opts.chartOptions.table_options.use_new_table_design) {
2426
- tableClasses.push('newPvtTable');
2427
- }
2428
- if (!pivotData.aggregator().uniq) {
2429
- tableClasses.push('numbers-to-right');
2430
- }
2431
- result = createElement("table", tableClasses.join(' ') , null, {
2424
+ var tableClasses = useNewUx && opts.chartOptions.table_options.use_new_table_design ? 'pvtTable newPvtTable' : 'pvtTable';
2425
+ result = createElement("table", tableClasses , null, {
2432
2426
  style: "display: none;"
2433
2427
  });
2434
2428
 
@@ -87,10 +87,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
87
87
  EXCEL_VIEWER: 'excel_viewer',
88
88
  };
89
89
 
90
- highchartsRenderer.VIRTUAL_FIELDS = {
91
- WATERFALL_VARIANCE: 'DR_WATERFALL_VARIANCE',
92
- };
93
-
94
90
  highchartsRenderer.highcharts_theme = {
95
91
  "colors": highchartsRenderer.defaults_colors,
96
92
  "chart": {
@@ -1343,11 +1339,15 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1343
1339
  return chart_series;
1344
1340
  }
1345
1341
 
1346
- highchartsRenderer.ptCreateWaterfallBreakdownSeries = function (pivotData, additionOptions, opts) {
1342
+ highchartsRenderer.ptCreateWaterfallBreakdownSeries = function (pivotData, onlyNumbers, additionOptions, opts) {
1347
1343
  const colorOptions = opts.breakdown_options.colors;
1348
- const chart_series = [];
1349
- const row_n_keys = pivotData.getRowKeys();
1350
- const col_n_keys = pivotData.getColKeys();
1344
+ var chart_series = [],
1345
+ row_n_keys = pivotData.getRowKeys(),
1346
+ col_n_keys = pivotData.getColKeys();
1347
+
1348
+ if (row_n_keys.length === 0) {
1349
+ row_n_keys.push([]);
1350
+ }
1351
1351
 
1352
1352
  let resultObject = {
1353
1353
  data: [],
@@ -1363,48 +1363,60 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
1363
1363
  };
1364
1364
  resultObject = highchartsRenderer.getDataLabelsOptions(additionOptions, resultObject);
1365
1365
 
1366
+ const breakdownValues = [];
1366
1367
  lodash.forEach(col_n_keys, function(col_n_value, col_index) {
1368
+ breakdownValues.push([]);
1369
+ lodash.forEach(row_n_keys, function (row_n_value, row_index) {
1370
+ var agg = pivotData.getAggregator(row_n_value, col_n_value);
1371
+ var val = agg.value();
1367
1372
 
1368
- const totalColumnValue = pivotData.getAggregator([], col_n_value).value();
1369
- const nextTotalColumnKey = col_n_keys[col_index + 1];
1370
- const nextTotalColumnValue = nextTotalColumnKey ? pivotData.getAggregator([], nextTotalColumnKey).value() : null;
1371
- resultObject.data.push({
1372
- y: totalColumnValue,
1373
- name: lodash.unescape(col_n_value).replace('DR_Others', highchartsRenderer.getOthersName(opts)),
1374
- isSum: !!col_index,
1375
- isTotal: true,
1376
- color: colorOptions.total,
1377
- });
1373
+ if (val != null && $.isNumeric(val)) {
1374
+ val = parseFloat(val);
1375
+ } else if (onlyNumbers) {
1376
+ val = NaN;
1377
+ } else {
1378
+ val = 0;
1379
+ }
1378
1380
 
1379
- if (col_index !== col_n_keys.length - 1) {
1380
- lodash.forEach(row_n_keys, function (row_n_value) {
1381
- const agg = pivotData.getAggregator(row_n_value, col_n_value);
1382
- let val = agg.value();
1381
+ breakdownValues[col_index][row_index] = val;
1383
1382
 
1384
- val = $.isNumeric(val) ? parseFloat(val) : 0;
1385
- if (val) {
1386
- const tmoobj = {};
1387
- const key = lodash.isArray(row_n_value) ? row_n_value[0] : row_n_value;
1388
- tmoobj.name = lodash.unescape(key);
1383
+ if (col_index) {
1384
+ const value = val - breakdownValues[col_index - 1][row_index];
1389
1385
 
1386
+ if (value) {
1387
+ var tmoobj = {};
1388
+ var key = row_n_value;
1389
+ if (lodash.isArray(row_n_value)) {
1390
+ key = row_n_value[0];
1391
+ }
1392
+ tmoobj.name = lodash.unescape(key);
1393
+
1390
1394
  if (tmoobj.name) {
1391
1395
  tmoobj.name = tmoobj.name.replace('DR_Others', highchartsRenderer.getOthersName(opts));
1392
1396
  }
1397
+
1393
1398
  if (lodash.isEmpty(String(tmoobj.name))) {
1394
1399
  tmoobj.name = lodash.unescape(col_n_value);
1395
1400
  tmoobj.visible = false;
1396
1401
  }
1397
-
1398
- tmoobj.y = val;
1402
+ tmoobj.y = value;
1399
1403
  tmoobj.colKeys = [lodash.unescape(col_n_keys[col_index - 1]), lodash.unescape(col_n_value)];
1400
1404
  resultObject.data.push(tmoobj);
1401
1405
  }
1406
+ }
1407
+ });
1402
1408
 
1403
- });
1404
- }
1409
+ resultObject.data.push({
1410
+ y: pivotData.colTotals[col_n_value].sum,
1411
+ name: lodash.unescape(col_n_value).replace('DR_Others', highchartsRenderer.getOthersName(opts)),
1412
+ isSum: !!col_index,
1413
+ isTotal: true,
1414
+ color: colorOptions.total,
1415
+ });
1405
1416
  });
1406
1417
 
1407
1418
  chart_series.push(resultObject);
1419
+
1408
1420
  opts.chart_series = [];
1409
1421
  if (!lodash.isEqual(row_n_keys, EMPTY_ROW_N_KEYS)) {
1410
1422
  chart_series.forEach(series => {
@@ -3178,8 +3190,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3178
3190
  ? opts.chartOptions
3179
3191
  : highchartsRenderer.getDefaultValueForChart(highchartsRenderer.CHART_TYPES.WATERFALL_BREAKDOWN);
3180
3192
 
3181
- pivotData.colKeys = lodash.map(lodash.keys(pivotData.colTotals), key => [key]);
3182
-
3183
3193
  chartOptions.chart = {
3184
3194
  type: 'waterfall',
3185
3195
  zoomType: additionOptions && additionOptions.chart && additionOptions.chart.zoom_type ? additionOptions.chart.zoom_type : 'None',
@@ -3230,7 +3240,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
3230
3240
  chartOptions.colors = opts.paletteOptions.dashboardPalette.colors;
3231
3241
  }
3232
3242
  chartOptions.series = highchartsRenderer
3233
- .ptCreateWaterfallBreakdownSeries(pivotData, additionOptions, opts);
3243
+ .ptCreateWaterfallBreakdownSeries(pivotData, null, additionOptions, opts);
3234
3244
 
3235
3245
  chartOptions = highchartsRenderer.prepareAxisX(chartOptions, additionOptions, pivotData.getColKeys());
3236
3246
  chartOptions.plotOptions = {
@@ -4366,7 +4376,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4366
4376
  title: 'Data Conflict',
4367
4377
  text: `Please adjust your dashboard's reference date and filter selections as \
4368
4378
  the quantity of data doesn't match the chart's ${ minCategories }-${ maxCategories } value limit.`,
4369
- class: uniqueCategories.length < minCategories ? 'waterfall-nodata' : 'waterfall-too-much-data',
4379
+ class: 'nodata',
4370
4380
  }
4371
4381
  return highchartsRenderer.getNoDataResult(options.rendererOptions, true);
4372
4382
  }
@@ -4955,28 +4965,12 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
4955
4965
  }
4956
4966
  });
4957
4967
 
4958
- // add virtual fields to rows if required
4959
- let rows = widgetOptions.rows;
4960
- if (!lodash.get(widgetOptions, 'rows.length') && widgetOptions.options.breakdown_options) {
4961
- rows = [
4962
- {
4963
- id: -1,
4964
- name: highchartsRenderer.VIRTUAL_FIELDS.WATERFALL_VARIANCE,
4965
- type: 'Text',
4966
- },
4967
- ];
4968
- }
4969
-
4970
4968
  // fill rows fields
4971
- lodash.forEach(rows, function (valObj) {
4972
- if (lodash.includes(highchartsRenderer.VIRTUAL_FIELDS, valObj.name)) {
4973
- legendFields.push(valObj);
4974
- } else {
4975
- fieldOb = lodash.find(fields, {id: valObj.id});
4976
- if (fieldOb) {
4977
- legendFields.push(fieldOb);
4978
- lodash.remove(fields, {id: fieldOb.id});
4979
- }
4969
+ lodash.forEach(widgetOptions.rows, function (valObj) {
4970
+ fieldOb = lodash.find(fields, {id: valObj.id});
4971
+ if (fieldOb) {
4972
+ legendFields.push(fieldOb);
4973
+ lodash.remove(fields, {id: fieldOb.id});
4980
4974
  }
4981
4975
  });
4982
4976
 
@@ -5103,22 +5097,71 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
5103
5097
  highchartsRenderer.addTemplateDataToCalcModel = function (selectedTemplate, calcModelOptions) {
5104
5098
  highchartsRenderer.setWidgetFieldsToTemplate(selectedTemplate);
5105
5099
 
5106
- var fields = highchartsRenderer.objectCopyJsonMethod(selectedTemplate.widget_fields);
5107
- var fieldOb;
5108
- var selectedFields = [];
5100
+ const scenarioName = 'scenario';
5101
+ const fields = highchartsRenderer.objectCopyJsonMethod(selectedTemplate.fields);
5102
+ const fieldScenarioAlias = _.find(fields, field => (field.alias || '').toLowerCase() === scenarioName)
5103
+ const fieldScenario = _.find(fields, field => (field.name || '').toLowerCase() === scenarioName)
5104
+ const filters = calcModelOptions.config && calcModelOptions.config.filters;
5109
5105
 
5110
- // fill selected fields
5111
- lodash.forEach(calcModelOptions.fields, function (valObj) {
5112
- fieldOb = lodash.find(fields, {id: valObj.id});
5113
- if (fieldOb) {
5114
- selectedFields.push(fieldOb);
5115
- lodash.remove(fields, {id: fieldOb.id});
5106
+ const filterFields = [];
5107
+ const valueFields = [];
5108
+ const dateFields = [];
5109
+ const dataTypeFields = [];
5110
+ const dataSeriesFields = [];
5111
+
5112
+ let scenarioField = lodash.get(calcModelOptions, 'config.scenario', undefined) || fieldScenarioAlias || fieldScenario;
5113
+ let fieldOb;
5114
+
5115
+ const fillData = (fieldsArr, destinationArr) => {
5116
+ lodash.forEach(fieldsArr, function (valObj) {
5117
+ fieldOb = lodash.find(fields, { id: valObj.id });
5118
+ if (fieldOb) {
5119
+ destinationArr.push(fieldOb);
5120
+ lodash.remove(fields, { id: fieldOb.id });
5121
+ }
5122
+ });
5123
+ }
5124
+
5125
+ lodash.forEach(filters, function (filterObj) {
5126
+ fieldOb = lodash.find(fields, { id: filterObj.id });
5127
+ if (fieldOb && filterObj.values && filterObj.values.datetype && filterObj.values.datetype === 'list') {
5128
+ filterObj.values = filterObj.values.val
5129
+ } else if (fieldOb && filterObj.values && filterObj.values.datetype && filterObj.values.datetype !== 'list') {
5130
+ fieldOb.values = filterObj.values;
5131
+ } else if (fieldOb && filterObj.values && filterObj.values.type === 'advanced') {
5132
+ fieldOb.values = filterObj.values;
5133
+ }
5134
+ if (fieldOb && filterObj.values && filterObj.values instanceof Array) {
5135
+ if (filterObj.is_excluded == true) {
5136
+ fieldOb.excludes = filterObj.values;
5137
+ } else {
5138
+ fieldOb.includes = filterObj.values;
5139
+ }
5140
+ }
5141
+ if (filterObj.allow_nulls && fieldOb) {
5142
+ fieldOb.allow_nulls = filterObj.allow_nulls;
5116
5143
  }
5117
5144
  });
5118
5145
 
5146
+ const storedGroupByFields = lodash.get(calcModelOptions, 'config.group_by', []);
5147
+ const storedDateFields = [lodash.get(calcModelOptions, 'config.date_field', undefined)].filter(f => !!f);
5148
+ const storedAggFields = [lodash.get(calcModelOptions, 'config.agg_field', undefined)].filter(f => !!f);
5149
+ const storedDataTypeFields = [lodash.get(calcModelOptions, 'config.data_type_field', undefined)].filter(f => !!f);
5150
+
5151
+ fillData(storedGroupByFields, dataSeriesFields);
5152
+ fillData(storedDateFields, dateFields);
5153
+ fillData(storedAggFields, valueFields);
5154
+ fillData(storedDataTypeFields, dataTypeFields);
5155
+ fillData(filters, filterFields);
5156
+
5119
5157
  calcModelOptions.pivot = {
5120
5158
  fieldsArray: fields,
5121
- selectedFieldsArray: selectedFields
5159
+ selectedFieldsArray: dataSeriesFields,
5160
+ filtersArray: filterFields,
5161
+ scenarioField,
5162
+ dateFields,
5163
+ dataTypeFields,
5164
+ valueFields
5122
5165
  };
5123
5166
  }
5124
5167
 
@@ -7944,7 +7987,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
7944
7987
  };
7945
7988
 
7946
7989
  highchartsRenderer.createDateFromString = function (dateString, format) {
7947
- if (!(format && highchartsRenderer.isDateFormat(dateString, format) || highchartsRenderer.isDate(dateString))) {
7990
+ if ((format && !highchartsRenderer.isDateFormat(dateString, format)) || !highchartsRenderer.isDate(dateString)) {
7948
7991
  return null;
7949
7992
  }
7950
7993
  const utcDate = format
@@ -8098,7 +8141,6 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8098
8141
  filter.is_excluded = false;
8099
8142
  } else {
8100
8143
  filter = highchartsRenderer.createDrillDownFilterObject(widget, widget.cols[0], colKey[0]);
8101
- filters.push(filter);
8102
8144
  }
8103
8145
  filter.values = [];
8104
8146
  for (let i = 0; i < colKey.length; i++) {
@@ -8701,7 +8743,7 @@ let getHighchartsRenderer = function ($, document, Highcharts, default_colors, h
8701
8743
  rows = [];
8702
8744
  } else {
8703
8745
  rows = cols;
8704
- cols = [point.colKeys[1]];
8746
+ cols = [];
8705
8747
  }
8706
8748
  return { rows, cols };
8707
8749
  }
@@ -28,6 +28,8 @@ let initNovixRenderer = function($, window, document, Handsontable){
28
28
  const delim = " , ";
29
29
  const subtotal = "subtotalDatarailsPlaceholder";
30
30
  const replaceValue = "SubTotals";
31
+ const useNewUx = document.ReportHippo && document.ReportHippo && document.ReportHippo.user &&
32
+ document.ReportHippo.user.organization.settings && document.ReportHippo.user.organization.settings.use_new_ux;
31
33
 
32
34
  $.pivotUtilities.novix_renderers = {
33
35
 
@@ -887,14 +889,9 @@ let initNovixRenderer = function($, window, document, Handsontable){
887
889
 
888
890
  // inject the widgetId to the class name so we can separate the tables by it
889
891
  // look for the search side on line 653 "opts.$el.find(".widget-id-" + opts.widgetId);"
890
- var tableClasses = ['novixPivot', `widget-id-${opts.widgetId}`];
891
- if (opts.chartOptions.table_options.use_new_table_design) {
892
- tableClasses.push('handsontable-new');
893
- }
894
- if (!pvtData.aggregator().uniq) {
895
- tableClasses.push('numbers-to-right');
896
- }
897
- return `<div class='${tableClasses.join(' ')}' style='overflow:auto'></div>`;
892
+ return `<div class='novixPivot widget-id-${opts.widgetId} ${
893
+ useNewUx && opts.chartOptions.table_options.use_new_table_design ? 'handsontable-new' : ''
894
+ }' style='overflow:auto'></div>`;
898
895
  }
899
896
 
900
897
  };
package/src/pivot.css CHANGED
@@ -29,6 +29,9 @@ table.pvtTable tbody tr th > i {
29
29
  font-size: 10px;
30
30
  }
31
31
 
32
+ table.pvtTable .pvtColLabel {text-align: center;}
33
+ table.pvtTable .pvtTotalLabel {text-align: right;}
34
+
32
35
  table.pvtTable tbody tr td {
33
36
  color: #3D3D3D;
34
37
  padding: 5px;
@@ -260,6 +263,11 @@ table.pvtTable.newPvtTable tbody tr td.rowTotal {
260
263
  background-color: #dfe6ec !important;
261
264
  border-color: #ffffff !important;
262
265
  }
266
+ table.pvtTable.newPvtTable .pvtColLabel,
267
+ table.pvtTable.newPvtTable .pvtTotalLabel,
268
+ table.pvtTable.newPvtTable .pvtTotalLabel.rowTotal {
269
+ text-align: left;
270
+ }
263
271
 
264
272
  table.pvtTable.newPvtTable tbody tr th .fa {
265
273
  padding: 2px;
@@ -400,27 +408,3 @@ table.pvtTable.newPvtTable tbody tr td:hover:after {
400
408
  top: 4px;
401
409
  font-size: 12px;
402
410
  }
403
-
404
-
405
- /* Table cells alignment */
406
- table.pvtTable .pvtColLabel {text-align: center;}
407
- table.pvtTable .pvtTotalLabel {text-align: right;}
408
-
409
- table.pvtTable.newPvtTable .pvtColLabel,
410
- table.pvtTable.newPvtTable .pvtTotalLabel,
411
- table.pvtTable.newPvtTable .pvtTotalLabel.rowTotal {
412
- text-align: left;
413
- }
414
-
415
- table.pvtTable thead tr th.pvtColLabel,
416
- table.pvtTable thead tr th.pvtTotalLabel {
417
- text-align: center !important;
418
- }
419
-
420
- table.pvtTable.numbers-to-right tbody tr td.pvtVal,
421
- table.pvtTable.numbers-to-right tbody tr td.rowTotal.rowTotal,
422
- table.pvtTable.numbers-to-right tbody tr td.pvtGrandTotal {
423
- text-align: right !important;
424
- padding-right: 9px;
425
- line-height: 15px;
426
- }