@hrforte/react-pivottable 2.2.1 → 2.2.2

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.
@@ -28,7 +28,8 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
28
28
 
29
29
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
30
30
 
31
- function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
31
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /* eslint-disable no-inline-comments */
32
+
32
33
 
33
34
  // helper function for setting row/col-span in pivotTableRenderer
34
35
  var spanSize = function spanSize(arr, i, j) {
@@ -64,24 +65,31 @@ var spanSize = function spanSize(arr, i, j) {
64
65
  return len;
65
66
  };
66
67
 
67
- // ==> Calculate the positions for GroupSegments <==
68
- function buildHeaderGroupSegments(rowAttrs, rowGroupConfig) {
69
- var attrToGroup = {};
68
+ // ==> Build a lookup: name -> group label <==
69
+ // `match` can contain row attribute names, the synthetic 'Values' column
70
+ // (aggregations displayed as rows) and aggregation names/labels
71
+ // (aggregations displayed as columns).
72
+ function buildGroupLookup(rowGroupConfig) {
73
+ var lookup = {};
70
74
  (rowGroupConfig || []).forEach(function (_ref) {
71
75
  var label = _ref.label,
72
76
  match = _ref.match;
73
77
 
74
78
  match.forEach(function (name) {
75
- attrToGroup[name] = label;
79
+ lookup[name] = label;
76
80
  });
77
81
  });
82
+ return lookup;
83
+ }
84
+
85
+ // ==> Calculate the positions for GroupSegments <==
86
+ function buildHeaderGroupSegments(attrs, rowGroupConfig) {
87
+ var lookup = buildGroupLookup(rowGroupConfig);
78
88
 
79
89
  // Mỗi attribute luôn là 1 segment riêng — không gộp colSpan nữa,
80
90
  // để label nhóm (vd "AAA") hiện lặp lại trên từng cột con.
81
- return rowAttrs.map(function (name) {
82
- // eslint-disable-next-line no-undefined
83
- var group = attrToGroup[name] !== undefined ? attrToGroup[name] : null;
84
- return { group: group, span: 1 };
91
+ return attrs.map(function (name) {
92
+ return { group: lookup[name] || null, span: 1 };
85
93
  });
86
94
  }
87
95
 
@@ -369,16 +377,15 @@ function makeRenderer() {
369
377
  var shouldRenderRowHeaderPlaceholder = rowAttrsToRender.length !== 0;
370
378
 
371
379
  // --- Row group header (rowGroupConfig) ---
380
+ // `match` may reference row attribute names, 'Values' (aggregations shown
381
+ // as rows) and aggregation names/labels (aggregations shown as columns).
382
+ // Every column gets its own <th>, so the group label is repeated on each.
372
383
  var rowGroupConfig = this.props.rowGroupConfig;
373
384
  var hasHeaderGroup = Boolean(rowGroupConfig && rowGroupConfig.length);
374
- var headerGroupSegments = hasHeaderGroup ? buildHeaderGroupSegments(rowAttrs, rowGroupConfig) : [];
375
- // extraSpan accounts for the synthetic "Values" column added when there
376
- // are multiple aggregators shown as rows; it isn't part of any group.
377
- var headerGroupExtraSpan = rowAttrsToRender.length - rowAttrs.length;
385
+ var groupLookup = buildGroupLookup(rowGroupConfig);
386
+ var headerGroupSegments = hasHeaderGroup ? buildHeaderGroupSegments(rowAttrsToRender, rowGroupConfig) : [];
378
387
  var renderGroupSegments = function renderGroupSegments(rowSpan) {
379
- var extraSpan = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
380
-
381
- var cells = headerGroupSegments.map(function (seg, idx) {
388
+ return headerGroupSegments.map(function (seg, idx) {
382
389
  return _react2.default.createElement(
383
390
  'th',
384
391
  {
@@ -391,10 +398,6 @@ function makeRenderer() {
391
398
  seg.group || ''
392
399
  );
393
400
  });
394
- if (extraSpan > 0) {
395
- cells.push(_react2.default.createElement('th', { key: 'hgSegExtra', colSpan: extraSpan, rowSpan: rowSpan }));
396
- }
397
- return cells;
398
401
  };
399
402
  // --- End row group header ---
400
403
 
@@ -408,7 +411,7 @@ function makeRenderer() {
408
411
  // The "No." header cell is rendered in the first header row and spans
409
412
  // every header row, so the repeated header rows (column attributes,
410
413
  // aggregator labels, row group labels) stay aligned with the body.
411
- var numberColumnHeaderRowSpan = colAttrsToRender.length + (renderedAggregationHeaderRow ? 1 : 0) + (rowAttrsToRender.length !== 0 && !renderedAggregationHeaderRow ? 1 : 0) + (hasHeaderGroup && colAttrsToRender.length === 0 && rowAttrsToRender.length !== 0 ? 1 : 0);
414
+ var numberColumnHeaderRowSpan = colAttrsToRender.length + (renderedAggregationHeaderRow ? 1 : 0) + (rowAttrsToRender.length !== 0 && !renderedAggregationHeaderRow ? 1 : 0) + (hasHeaderGroup && colAttrsToRender.length === 0 && rowAttrsToRender.length !== 0 ? 1 : 0) + (renderedAggregationHeaderRow && hasHeaderGroup ? 1 : 0);
412
415
  var numberColumnInGroupRow = hasHeaderGroup && colAttrsToRender.length === 0 && rowAttrsToRender.length !== 0;
413
416
  var renderNumberHeaderCell = function renderNumberHeaderCell() {
414
417
  var rowSpan = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : numberColumnHeaderRowSpan;
@@ -566,6 +569,46 @@ function makeRenderer() {
566
569
  aggregationNameLookup[agg.key] = agg.aggregatorName;
567
570
  });
568
571
 
572
+ // Lookup aggregationKey -> aggregation definition (to read `vals`)
573
+ var aggregationByKey = {};
574
+ aggregations.forEach(function (agg) {
575
+ aggregationByKey[agg.key] = agg;
576
+ });
577
+
578
+ // Find the group label for an aggregation. rowGroupConfig `match` is
579
+ // compared against the aggregation's `vals` (the field names it works
580
+ // on, e.g. ['Employee Ref']). Falls back to label / aggregatorName.
581
+ var getAggregationGroup = function getAggregationGroup(aggregationKey) {
582
+ var agg = aggregationByKey[aggregationKey];
583
+ if (!agg) {
584
+ return null;
585
+ }
586
+ var vals = Array.isArray(agg.vals) ? agg.vals : [];
587
+ for (var k = 0; k < vals.length; k++) {
588
+ if (groupLookup[vals[k]]) {
589
+ return groupLookup[vals[k]];
590
+ }
591
+ }
592
+ return groupLookup[agg.label] || groupLookup[agg.aggregatorName] || null;
593
+ };
594
+
595
+ // Group label cells for the aggregation columns (column aggregation mode).
596
+ // Each column renders its own <th>, so the label repeats on every column.
597
+ var renderAggregatorGroupCells = function renderAggregatorGroupCells() {
598
+ return columnMeta.map(function (colMeta, idx) {
599
+ var group = getAggregationGroup(colMeta.aggregationKey);
600
+ return _react2.default.createElement(
601
+ 'th',
602
+ {
603
+ key: 'aggGrp' + idx
604
+ // eslint-disable-next-line no-undefined
605
+ , style: group ? groupLabelStyle : undefined
606
+ },
607
+ group || ''
608
+ );
609
+ });
610
+ };
611
+
569
612
  // Helper function to get cell style with conditional formatting
570
613
  var getCellStyle = function getCellStyle(value) {
571
614
  var heatmapStyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -778,7 +821,7 @@ function makeRenderer() {
778
821
  'tr',
779
822
  { key: 'colAttr' + j },
780
823
  hasNumberColumn && j === 0 && renderNumberHeaderCell(),
781
- shouldRenderRowHeaderPlaceholder && (isColumnAggregationMode || j === 0) && !(isColumnAggregationMode && hasColumnAttributes && rowAttrsToRender.length === 1) && (hasHeaderGroup && j === 0 && !isColumnAggregationMode ? renderGroupSegments(colAttrsToRender.length, headerGroupExtraSpan) : _react2.default.createElement('th', {
824
+ shouldRenderRowHeaderPlaceholder && (isColumnAggregationMode || j === 0) && !(isColumnAggregationMode && hasColumnAttributes && rowAttrsToRender.length === 1) && (hasHeaderGroup && j === 0 && !isColumnAggregationMode ? renderGroupSegments(colAttrsToRender.length) : _react2.default.createElement('th', {
782
825
  colSpan: isColumnAggregationMode && hasColumnAttributes ? rowAttrsToRender.length - 1 : rowAttrsToRender.length,
783
826
  rowSpan: isColumnAggregationMode && hasColumnAttributes ? 1 : colAttrsToRender.length
784
827
  })),
@@ -817,12 +860,18 @@ function makeRenderer() {
817
860
  )
818
861
  );
819
862
  }),
863
+ isColumnAggregationMode && hasColumnAttributes && hasHeaderGroup && _react2.default.createElement(
864
+ 'tr',
865
+ null,
866
+ renderGroupSegments(1),
867
+ renderAggregatorGroupCells()
868
+ ),
820
869
  hasHeaderGroup && colAttrsToRender.length === 0 && rowAttrsToRender.length !== 0 && _react2.default.createElement(
821
870
  'tr',
822
871
  null,
823
872
  hasNumberColumn && renderNumberHeaderCell(),
824
- renderGroupSegments(1, headerGroupExtraSpan),
825
- _react2.default.createElement('th', null)
873
+ renderGroupSegments(1),
874
+ isColumnAggregationMode ? renderAggregatorGroupCells() : _react2.default.createElement('th', null)
826
875
  ),
827
876
  isColumnAggregationMode && hasColumnAttributes && _react2.default.createElement(
828
877
  'tr',
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TableRenderers.jsx"],"names":["applyCellFormatting","spanSize","arr","i","j","x","asc","end","noDraw","len","length","asc1","end1","stop","buildHeaderGroupSegments","rowAttrs","rowGroupConfig","attrToGroup","forEach","label","match","name","map","group","undefined","span","groupLabelStyle","textAlign","redColorScaleGenerator","values","min","Math","apply","max","nonRed","round","backgroundColor","evaluateCondition","value","condition","type","conditionValue","numValue","parseFloat","numConditionValue","isNaN","trim","valueStr","String","conditionValueStr","toLowerCase","includes","valueStr2","conditionValueStr2","getConditionalFormattingStyle","conditionalFormatting","Array","isArray","rules","rule","style","Object","assign","mergeStyles","styles","filter","s","containsSpecialCharacters","str","trimmed","pureNumericPattern","test","shouldSkipFormattingForAggregation","aggregatorName","skipFormattingAggregations","cellFormatting","defaultFormatter","isNumeric","isFinite","hasFormattingRules","some","format","numericValue","matchingRule","formatter","digitsAfterDecimal","decimalPlaces","thousandsSep","decimalSep","prefix","suffix","showOriginal","makeRenderer","opts","TableRenderer","pivotData","PivotData","props","colAttrs","cols","rows","aggregations","getAggregations","primaryAggregation","getPrimaryAggregation","hasMultipleAggregators","tableOptions","aggregationDisplayMode","isColumnAggregationMode","rowAttrsToRender","concat","colAttrsToRender","hasColumnAttributes","showTotalsColumn","shouldRenderRowHeaderPlaceholder","hasHeaderGroup","Boolean","headerGroupSegments","headerGroupExtraSpan","renderGroupSegments","rowSpan","extraSpan","cells","seg","idx","push","showNumericalOrder","hasNumberColumn","numberColumnLabel","renderedAggregationHeaderRow","numberColumnHeaderRowSpan","numberColumnInGroupRow","renderNumberHeaderCell","rowKeys","getRowKeys","baseRowKeys","renderedRows","reduce","acc","rowKey","displayKey","agg","actualKey","aggregationKey","key","rowKeyValues","r","colKeys","getColKeys","baseColKeys","columnMeta","colKey","colKeyValues","col","renderAggregatorHeaderCells","colMeta","aggIndex","colSpan","valueCellColors","rowTotalColors","colTotalColors","heatmapMode","colorScaleGenerator","tableColorScaleGenerator","rowTotalValues","getAggregator","colTotalValues","allValues","c","colorScale","v","rowColorScales","rowValues","colColorScales","colValues","aggregationNameLookup","getCellStyle","heatmapStyle","conditionalStyle","formatCellValue","aggregator","bind","formatLabel","txt","parsed","formatRowLabel","index","isLastElement","rowAttrsLength","getClickHandler","clickCallback","filters","keys","attr","e","handleColSort","stopPropagation","onColSort","currentSort","colSorts","nextSort","handleRowSort","onRowSort","rowSorts","getSortButton","isCol","handleSort","sortIcon","colSortIcons","DEFAULT","rowSortIcons","totalRowAggregations","totalsLabelText","formattedColLabel","isRowAttr","rowMeta","totalAggregator","formattedTxt","aggregationKeyForCell","grandTotalAggregator","totalLabel","totalValue","React","PureComponent","defaultProps","propTypes","PropTypes","func","object","objectOf","oneOf","arrayOf","shape","string","isRequired","ASC","DESC","node","bool","TSVExportRenderer","safeRowKeys","safeColKeys","rowEntries","headerRow","slice","join","result","row","entry","unshift","width","window","innerWidth","height","innerHeight","Table"],"mappings":"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","file":"TableRenderers.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport {PivotData, numberFormat} from './Utilities';\n\n// helper function for setting row/col-span in pivotTableRenderer\nconst spanSize = function(arr, i, j) {\n let x;\n if (i !== 0) {\n let asc, end;\n let noDraw = true;\n for (\n x = 0, end = j, asc = end >= 0;\n asc ? x <= end : x >= end;\n asc ? x++ : x--\n ) {\n if (arr[i - 1][x] !== arr[i][x]) {\n noDraw = false;\n }\n }\n if (noDraw) {\n return -1;\n }\n }\n let len = 0;\n while (i + len < arr.length) {\n let asc1, end1;\n let stop = false;\n for (\n x = 0, end1 = j, asc1 = end1 >= 0;\n asc1 ? x <= end1 : x >= end1;\n asc1 ? x++ : x--\n ) {\n if (arr[i][x] !== arr[i + len][x]) {\n stop = true;\n }\n }\n if (stop) {\n break;\n }\n len++;\n }\n return len;\n};\n\n// ==> Calculate the positions for GroupSegments <==\nfunction buildHeaderGroupSegments(rowAttrs, rowGroupConfig) {\n const attrToGroup = {};\n (rowGroupConfig || []).forEach(({label, match}) => {\n match.forEach(name => {\n attrToGroup[name] = label;\n });\n });\n\n // Mỗi attribute luôn là 1 segment riêng — không gộp colSpan nữa,\n // để label nhóm (vd \"AAA\") hiện lặp lại trên từng cột con.\n return rowAttrs.map(name => {\n // eslint-disable-next-line no-undefined\n const group = attrToGroup[name] !== undefined ? attrToGroup[name] : null;\n return {group, span: 1};\n });\n}\n\n// Style cho ô có nhãn nhóm trong group header\nconst groupLabelStyle = {\n textAlign: 'center',\n};\n\nfunction redColorScaleGenerator(values) {\n const min = Math.min.apply(Math, values);\n const max = Math.max.apply(Math, values);\n return x => {\n // eslint-disable-next-line no-magic-numbers\n const nonRed = 255 - Math.round((255 * (x - min)) / (max - min));\n return {backgroundColor: `rgb(255,${nonRed},${nonRed})`};\n };\n}\n\n// Conditional formatting evaluation function\nfunction evaluateCondition(value, condition) {\n if (!condition || !condition.type) {\n return false;\n }\n\n const {type, value: conditionValue} = condition;\n const numValue = typeof value === 'number' ? value : parseFloat(value);\n const numConditionValue =\n typeof conditionValue === 'number'\n ? conditionValue\n : parseFloat(conditionValue);\n\n switch (type) {\n case 'greaterThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue > numConditionValue\n );\n case 'lessThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue < numConditionValue\n );\n case 'greaterThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue >= numConditionValue\n );\n case 'lessThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue <= numConditionValue\n );\n case 'equal':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value === conditionValue;\n }\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue === numConditionValue\n );\n case 'notEqual':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value !== conditionValue;\n }\n return (\n isNaN(numValue) ||\n isNaN(numConditionValue) ||\n numValue !== numConditionValue\n );\n case 'empty':\n // Check for null, undefined, empty string, whitespace-only strings, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n if (typeof value === 'number') {\n return isNaN(value);\n }\n return false;\n case 'notEmpty':\n // Check that value is not null, undefined, empty/whitespace string, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim() !== '';\n }\n if (typeof value === 'number') {\n return !isNaN(value);\n }\n // Other types (boolean, object, etc.) are considered not empty\n return true;\n // eslint-disable-next-line no-case-declarations\n case 'contains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr = String(value || '');\n const conditionValueStr = String(conditionValue || '');\n if (valueStr && conditionValueStr) {\n return valueStr.toLowerCase().includes(conditionValueStr.toLowerCase());\n }\n return false;\n // eslint-disable-next-line no-case-declarations\n case 'notContains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr2 = String(value || '');\n const conditionValueStr2 = String(conditionValue || '');\n if (valueStr2 && conditionValueStr2) {\n return !valueStr2\n .toLowerCase()\n .includes(conditionValueStr2.toLowerCase());\n }\n return true;\n default:\n return false;\n }\n}\n\n// Apply conditional formatting rules to a value\nfunction getConditionalFormattingStyle(value, conditionalFormatting) {\n if (!conditionalFormatting || !Array.isArray(conditionalFormatting.rules)) {\n return {};\n }\n\n // Evaluate rules in order, return first matching rule's style\n for (const rule of conditionalFormatting.rules) {\n if (evaluateCondition(value, rule.condition)) {\n // Return a copy of the style object to avoid mutations\n return rule.style ? Object.assign({}, rule.style) : {};\n }\n }\n\n return {};\n}\n\n// Merge styles, with conditional formatting taking precedence\nfunction mergeStyles(...styles) {\n return Object.assign({}, ...styles.filter(s => s && typeof s === 'object'));\n}\n\n// Helper function to check if a string contains special characters (like -, /, etc.)\n// This prevents formatting of date strings or formatted strings\n// Only pure numeric strings (with optional decimal point and minus sign) should be formatted\nfunction containsSpecialCharacters(str) {\n if (typeof str !== 'string') {\n return false;\n }\n const trimmed = str.trim();\n // Check if string contains any special characters that indicate it's not a raw number\n // Allow: digits, decimal point, minus sign at start, plus sign at start, spaces\n // Disallow: hyphens in middle, slashes, and other special characters\n const pureNumericPattern = /^-?\\d*\\.?\\d+$/;\n return !pureNumericPattern.test(trimmed);\n}\n\n// Helper function to check if an aggregation should skip formatting\n// Aggregations like Count, First, Last should not be formatted\n// Aggregations like Sum, Average should be formatted\nfunction shouldSkipFormattingForAggregation(aggregatorName) {\n if (!aggregatorName) {\n return false;\n }\n\n const name = aggregatorName.toLowerCase();\n // Skip formatting for these aggregation types\n const skipFormattingAggregations = [\n 'count',\n 'count unique values',\n 'list unique values',\n 'first',\n 'last',\n 'minimum',\n 'maximum',\n ];\n return skipFormattingAggregations.includes(name);\n}\n\n// Apply cell formatting rules to a value\nexport function applyCellFormatting(\n value,\n cellFormatting,\n defaultFormatter,\n aggregatorName = null\n) {\n // Don't format if aggregation type should skip formatting (e.g., Count, First, Last)\n // Only use defaultFormatter if value is numeric, otherwise return as-is\n const isNumeric =\n (typeof value === 'number' && !isNaN(value) && isFinite(value)) ||\n (typeof value === 'string' &&\n value.trim() !== '' &&\n !containsSpecialCharacters(value) &&\n !isNaN(parseFloat(value)) &&\n isFinite(parseFloat(value)));\n if (shouldSkipFormattingForAggregation(aggregatorName)) {\n if (isNumeric && defaultFormatter) {\n return defaultFormatter(value);\n }\n // Return raw value for non-numeric values (dates, strings, etc.)\n return value;\n }\n\n // If no cellFormatting rules, always use default formatter to return to original format\n // This ensures values return to their original format when cellFormatting is cleared\n // Check for all possible cases: null, undefined, empty object, empty rules array\n const hasFormattingRules =\n cellFormatting &&\n typeof cellFormatting === 'object' &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0 &&\n cellFormatting.rules.some(rule => rule && rule.format);\n\n if (!hasFormattingRules) {\n // When cellFormatting rules are cleared, return the raw value (not formatted)\n // This ensures all cells (regular, Totals, Aggregation) return to their original unformatted state\n // Return the raw numeric value for numbers, or the value as-is for other types\n if (isNumeric) {\n // Return raw numeric value without any formatting\n if (typeof value === 'number') {\n return value;\n }\n // For string numbers, return the parsed numeric value\n return parseFloat(value);\n }\n // For non-numeric values (dates, strings, etc.), return as-is\n return value;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n // Only check this when cellFormatting rules exist\n if (containsSpecialCharacters(value)) {\n return defaultFormatter ? defaultFormatter(value) : String(value);\n }\n\n // Check if value is a number - only apply custom formatting to raw numbers\n // Handle both number type and string numbers (e.g., \"123.45\")\n // Exclude strings with special characters from formatting\n let numericValue = value;\n\n // Convert string numbers to actual numbers for formatting\n if (isNumeric && typeof value === 'string') {\n numericValue = parseFloat(value);\n }\n\n // Use the first rule (all rules apply to all values)\n const matchingRule = cellFormatting.rules[0];\n\n // If we found a matching rule and value is numeric, apply its formatting\n if (matchingRule && matchingRule.format && isNumeric) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal: 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep: 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal: 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n\n // Not numeric or no matching rule, use default formatter\n return defaultFormatter ? defaultFormatter(value) : String(value);\n}\n\nfunction makeRenderer(opts = {}) {\n class TableRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const colAttrs = pivotData.props.cols;\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const primaryAggregation = pivotData.getPrimaryAggregation();\n const hasMultipleAggregators = aggregations.length > 1;\n const tableOptions = this.props.tableOptions || {};\n const aggregationDisplayMode =\n tableOptions.aggregationDisplayMode === 'column' ? 'column' : 'row';\n const isColumnAggregationMode =\n aggregationDisplayMode === 'column' && hasMultipleAggregators;\n const rowAttrsToRender =\n hasMultipleAggregators && !isColumnAggregationMode\n ? rowAttrs.concat(['Values'])\n : rowAttrs;\n const colAttrsToRender = colAttrs;\n const hasColumnAttributes = colAttrsToRender.length > 0;\n const showTotalsColumn = !isColumnAggregationMode;\n const shouldRenderRowHeaderPlaceholder = rowAttrsToRender.length !== 0;\n\n // --- Row group header (rowGroupConfig) ---\n const rowGroupConfig = this.props.rowGroupConfig;\n const hasHeaderGroup = Boolean(rowGroupConfig && rowGroupConfig.length);\n const headerGroupSegments = hasHeaderGroup\n ? buildHeaderGroupSegments(rowAttrs, rowGroupConfig)\n : [];\n // extraSpan accounts for the synthetic \"Values\" column added when there\n // are multiple aggregators shown as rows; it isn't part of any group.\n const headerGroupExtraSpan = rowAttrsToRender.length - rowAttrs.length;\n const renderGroupSegments = (rowSpan, extraSpan = 0) => {\n const cells = headerGroupSegments.map((seg, idx) => (\n <th\n key={`hgSeg${idx}`}\n colSpan={seg.span}\n rowSpan={rowSpan}\n // eslint-disable-next-line no-undefined\n style={seg.group ? groupLabelStyle : undefined}\n >\n {seg.group || ''}\n </th>\n ));\n if (extraSpan > 0) {\n cells.push(\n <th key=\"hgSegExtra\" colSpan={extraSpan} rowSpan={rowSpan} />\n );\n }\n return cells;\n };\n // --- End row group header ---\n\n // --- Optional \"No.\" column (showNumericalOrder) ---\n // When enabled every data row is prefixed with its 1-based index, in a\n // column labelled \"No.\" placed before the row attribute columns.\n const showNumericalOrder = Boolean(this.props.showNumericalOrder);\n const hasNumberColumn =\n showNumericalOrder &&\n (rowAttrsToRender.length !== 0 || colAttrsToRender.length !== 0);\n const numberColumnLabel = 'No.';\n const renderedAggregationHeaderRow =\n isColumnAggregationMode && hasColumnAttributes;\n // The \"No.\" header cell is rendered in the first header row and spans\n // every header row, so the repeated header rows (column attributes,\n // aggregator labels, row group labels) stay aligned with the body.\n const numberColumnHeaderRowSpan =\n colAttrsToRender.length +\n (renderedAggregationHeaderRow ? 1 : 0) +\n (rowAttrsToRender.length !== 0 && !renderedAggregationHeaderRow\n ? 1\n : 0) +\n (hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0\n ? 1\n : 0);\n const numberColumnInGroupRow =\n hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0;\n const renderNumberHeaderCell = (rowSpan = numberColumnHeaderRowSpan) => (\n <th className=\"pvtAxisLabel pvtRowNumber\" rowSpan={rowSpan}>\n {numberColumnLabel}\n </th>\n );\n // --- End \"No.\" column ---\n\n const rowKeys = pivotData.getRowKeys();\n const baseRowKeys =\n hasMultipleAggregators &&\n !isColumnAggregationMode &&\n rowKeys.length === 0\n ? [[]]\n : rowKeys;\n const renderedRows =\n hasMultipleAggregators && !isColumnAggregationMode\n ? baseRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({\n displayKey: rowKey.concat([agg.label || agg.aggregatorName]),\n actualKey: rowKey,\n aggregationKey: agg.key,\n });\n });\n return acc;\n }, [])\n : baseRowKeys.map(rowKey => ({\n displayKey: rowKey,\n actualKey: rowKey,\n aggregationKey: primaryAggregation.key,\n }));\n const rowKeyValues = renderedRows.map(r => r.displayKey);\n const colKeys = pivotData.getColKeys();\n const baseColKeys =\n isColumnAggregationMode && colKeys.length === 0 ? [[]] : colKeys;\n const columnMeta = isColumnAggregationMode\n ? baseColKeys.reduce((acc, colKey) => {\n aggregations.forEach(agg => {\n acc.push({\n displayKey: colKey.concat([agg.label || agg.aggregatorName]),\n actualKey: colKey,\n aggregationKey: agg.key,\n });\n });\n return acc;\n }, [])\n : colKeys.map(colKey => ({\n displayKey: colKey,\n actualKey: colKey,\n aggregationKey: primaryAggregation.key,\n }));\n const colKeyValues = columnMeta.map(col => col.displayKey);\n\n const renderAggregatorHeaderCells = () =>\n columnMeta.map((colMeta, idx) => {\n const label = colMeta.displayKey[colMeta.displayKey.length - 1] || '';\n // Calculate colspan/rowspan so aggregator headers line up with column groups\n // aggregator index is the last element in displayKey (after column attrs)\n const aggIndex = colAttrsToRender.length;\n // When there are column attributes, each aggregator should appear once per column group,\n // so each aggregator header should have colSpan = 1.\n // When there are no column attributes, use spanSize to merge identical aggregator labels.\n let colSpan;\n if (hasColumnAttributes) {\n // Each aggregator appears once per column group, so colSpan is always 1\n // This ensures aggregator headers are listed in each column group and align\n // correctly with the column groups above (which have colSpan = number of aggregators)\n colSpan = 1;\n } else {\n // Use spanSize to merge identical aggregator labels when there are no column attributes\n colSpan = spanSize(colKeyValues, idx, aggIndex);\n // If spanSize returned -1 it means this cell is merged into a previous one\n if (colSpan === -1) {\n return null;\n }\n }\n\n // When there are column attributes, rowSpan should account for the row header row\n // When there are no column attributes, rowSpan is 1\n const rowSpan =\n hasColumnAttributes && rowAttrsToRender.length !== 0 ? 1 : 1;\n\n return (\n <th\n className=\"pvtColLabel\"\n key={`agg-label-${idx}`}\n colSpan={colSpan}\n rowSpan={rowSpan}\n >\n {label}\n </th>\n );\n });\n\n let valueCellColors = () => {};\n let rowTotalColors = () => {};\n let colTotalColors = () => {};\n if (opts.heatmapMode && !hasMultipleAggregators) {\n const colorScaleGenerator = this.props.tableColorScaleGenerator;\n const rowTotalValues = colKeys.map(x =>\n pivotData.getAggregator([], x, primaryAggregation.key).value()\n );\n rowTotalColors = colorScaleGenerator(rowTotalValues);\n const colTotalValues = rowKeys.map(x =>\n pivotData.getAggregator(x, [], primaryAggregation.key).value()\n );\n colTotalColors = colorScaleGenerator(colTotalValues);\n\n if (opts.heatmapMode === 'full') {\n const allValues = [];\n rowKeys.map(r =>\n colKeys.map(c =>\n allValues.push(\n pivotData.getAggregator(r, c, primaryAggregation.key).value()\n )\n )\n );\n const colorScale = colorScaleGenerator(allValues);\n valueCellColors = (r, c, v) => colorScale(v);\n } else if (opts.heatmapMode === 'row') {\n const rowColorScales = {};\n rowKeys.map(r => {\n const rowValues = colKeys.map(x =>\n pivotData.getAggregator(r, x, primaryAggregation.key).value()\n );\n rowColorScales[r] = colorScaleGenerator(rowValues);\n });\n valueCellColors = (r, c, v) => rowColorScales[r](v);\n } else if (opts.heatmapMode === 'col') {\n const colColorScales = {};\n colKeys.map(c => {\n const colValues = rowKeys.map(x =>\n pivotData.getAggregator(x, c, primaryAggregation.key).value()\n );\n colColorScales[c] = colorScaleGenerator(colValues);\n });\n valueCellColors = (r, c, v) => colColorScales[c](v);\n }\n }\n\n // Get conditional formatting from tableOptions\n const conditionalFormatting = tableOptions.conditionalFormatting || null;\n\n // Get cell formatting from tableOptions\n const cellFormatting = tableOptions.cellFormatting || null;\n\n // Create lookup map from aggregationKey to aggregatorName\n const aggregationNameLookup = {};\n aggregations.forEach(agg => {\n aggregationNameLookup[agg.key] = agg.aggregatorName;\n });\n\n // Helper function to get cell style with conditional formatting\n const getCellStyle = (value, heatmapStyle = {}) => {\n const conditionalStyle = getConditionalFormattingStyle(\n value,\n conditionalFormatting\n );\n return mergeStyles(heatmapStyle, conditionalStyle);\n };\n\n // Helper function to format cell value with cell formatting rules\n const formatCellValue = (value, aggregator, aggregationKey) => {\n const aggregatorName = aggregationKey\n ? aggregationNameLookup[aggregationKey]\n : null;\n\n return applyCellFormatting(\n value,\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregatorName\n );\n };\n\n // Helper function to format label text if it's numeric\n // Used for both row and column labels\n const formatLabel = txt => {\n // Check if txt is numeric (number or numeric string)\n // Also exclude 'null' string which is used for missing values\n if (txt === 'null' || txt === null || typeof txt === 'undefined') {\n return txt;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n if (containsSpecialCharacters(txt)) {\n return txt;\n }\n\n // Check if txt is numeric (number or numeric string)\n // A string is numeric if it can be parsed as a finite number\n // Exclude strings with special characters from formatting\n let isNumeric = false;\n let numericValue = null;\n\n if (typeof txt === 'number') {\n isNumeric = !isNaN(txt) && isFinite(txt);\n if (isNumeric) {\n numericValue = txt;\n }\n } else if (\n typeof txt === 'string' &&\n txt.trim() !== '' &&\n txt !== 'null' &&\n !containsSpecialCharacters(txt)\n ) {\n const parsed = parseFloat(txt.trim());\n isNumeric = !isNaN(parsed) && isFinite(parsed);\n if (isNumeric) {\n numericValue = parsed;\n }\n }\n\n if (\n isNumeric &&\n numericValue !== null &&\n cellFormatting &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0\n ) {\n const matchingRule = cellFormatting.rules[0];\n if (matchingRule && matchingRule.format) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal:\n 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep:\n 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal:\n 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n }\n\n // Not numeric or no formatting rules, return as-is\n return txt;\n };\n\n // Helper function to format row label text if it's numeric\n // Only formats if it's a numeric value, not aggregation labels\n const formatRowLabel = (\n txt,\n index,\n isLastElement,\n hasMultipleAggregators,\n rowAttrsLength\n ) => {\n // Don't format the last element if it's an aggregation label (when multiple aggregators)\n // The last element is an aggregation label only if:\n // 1. There are multiple aggregators\n // 2. AND it's beyond the row attributes (index >= rowAttrsLength)\n if (\n hasMultipleAggregators &&\n isLastElement &&\n index >= rowAttrsLength\n ) {\n return txt;\n }\n\n return formatLabel(txt);\n };\n\n const getClickHandler =\n tableOptions && tableOptions.clickCallback\n ? (value, rowValues, colValues) => {\n const filters = {};\n for (const i of Object.keys(colAttrs || {})) {\n const attr = colAttrs[i];\n if (colValues[i] !== null) {\n filters[attr] = colValues[i];\n }\n }\n for (const i of Object.keys(rowAttrs || {})) {\n const attr = rowAttrs[i];\n if (rowValues[i] !== null) {\n filters[attr] = rowValues[i];\n }\n }\n return e =>\n tableOptions.clickCallback(e, value, filters, pivotData);\n }\n : null;\n\n const handleColSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onColSort) {\n const currentSort = this.props.colSorts && this.props.colSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onColSort(attr, nextSort);\n }\n };\n\n const handleRowSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onRowSort) {\n const currentSort = this.props.rowSorts && this.props.rowSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onRowSort(attr, nextSort);\n }\n };\n\n const getSortButton = (attr, isCol) => {\n const currentSort = isCol\n ? this.props.colSorts && this.props.colSorts[attr]\n : this.props.rowSorts && this.props.rowSorts[attr];\n const handleSort = isCol ? handleColSort : handleRowSort;\n let sortIcon = '';\n if (currentSort !== null) {\n if (isCol) {\n sortIcon =\n this.props.colSortIcons[currentSort] ||\n this.props.colSortIcons.DEFAULT;\n } else {\n sortIcon =\n this.props.rowSortIcons[currentSort] ||\n this.props.rowSortIcons.DEFAULT;\n }\n }\n return (\n <button\n type=\"button\"\n className=\"pvtSortButton\"\n onClick={e => handleSort(attr, e)}\n title={\n currentSort === 'ASC'\n ? 'Sort Descending'\n : currentSort === 'DESC'\n ? 'Clear Sort'\n : 'Sort Ascending'\n }\n >\n {sortIcon}\n </button>\n );\n };\n\n const totalRowAggregations = isColumnAggregationMode\n ? [primaryAggregation]\n : hasMultipleAggregators\n ? aggregations\n : [primaryAggregation];\n const totalsLabelText = 'Totals';\n\n return (\n <table className=\"pvtTable\">\n <thead>\n {colAttrsToRender.map(function(c, j) {\n return (\n <tr key={`colAttr${j}`}>\n {hasNumberColumn && j === 0 && renderNumberHeaderCell()}\n {shouldRenderRowHeaderPlaceholder &&\n (isColumnAggregationMode || j === 0) &&\n !(\n isColumnAggregationMode &&\n hasColumnAttributes &&\n rowAttrsToRender.length === 1\n ) &&\n (hasHeaderGroup && j === 0 && !isColumnAggregationMode ? (\n renderGroupSegments(\n colAttrsToRender.length,\n headerGroupExtraSpan\n )\n ) : (\n <th\n colSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? rowAttrsToRender.length - 1\n : rowAttrsToRender.length\n }\n rowSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? 1\n : colAttrsToRender.length\n }\n />\n ))}\n {c ? (\n <th className=\"pvtAxisLabel\">\n {c}\n {colAttrs.includes(c) && getSortButton(c, true)}\n </th>\n ) : null}\n {colKeyValues.map(function(colKey, i) {\n const x = spanSize(colKeyValues, i, j);\n\n if (x === -1) {\n return null;\n }\n\n const formattedColLabel = formatLabel(colKey[j]);\n return (\n <th\n className=\"pvtColLabel\"\n key={`colKey${i}`}\n colSpan={x}\n rowSpan={\n j === colAttrsToRender.length - 1 &&\n rowAttrsToRender.length !== 0 &&\n !isColumnAggregationMode\n ? 2\n : 1\n }\n >\n {formattedColLabel}\n </th>\n );\n })}\n\n {showTotalsColumn && j === 0 && (\n <th\n className=\"pvtTotalLabel\"\n rowSpan={\n colAttrsToRender.length +\n (rowAttrsToRender.length === 0 ? 0 : 1)\n }\n >\n {totalsLabelText}\n </th>\n )}\n </tr>\n );\n })}\n\n {hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0 && (\n <tr>\n {hasNumberColumn && renderNumberHeaderCell()}\n {renderGroupSegments(1, headerGroupExtraSpan)}\n <th />\n </tr>\n )}\n\n {isColumnAggregationMode && hasColumnAttributes && (\n <tr>\n {rowAttrsToRender.length !== 0 &&\n rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr-agg-${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {renderAggregatorHeaderCells()}\n </tr>\n )}\n\n {rowAttrsToRender.length !== 0 &&\n !(isColumnAggregationMode && hasColumnAttributes) && (\n <tr>\n {hasNumberColumn &&\n colAttrsToRender.length === 0 &&\n !numberColumnInGroupRow &&\n renderNumberHeaderCell()}\n {rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {isColumnAggregationMode && !hasColumnAttributes\n ? renderAggregatorHeaderCells()\n : null}\n {showTotalsColumn && (\n <th className=\"pvtTotalLabel\">\n {colAttrs.length === 0 ? totalsLabelText : null}\n </th>\n )}\n </tr>\n )}\n </thead>\n\n <tbody>\n {renderedRows.map(function(rowMeta, i) {\n const totalAggregator = pivotData.getAggregator(\n rowMeta.actualKey,\n [],\n rowMeta.aggregationKey\n );\n const displayKey = rowMeta.displayKey;\n return (\n <tr key={`rowKeyRow${i}`}>\n {hasNumberColumn && (\n <th className=\"pvtRowNumber\" key={`rowNumber${i}`}>\n {i + 1}\n </th>\n )}\n {displayKey.map(function(txt, j) {\n const x = spanSize(rowKeyValues, i, j);\n if (x === -1) {\n return null;\n }\n const isLastElement = j === displayKey.length - 1;\n const formattedTxt = formatRowLabel(\n txt,\n j,\n isLastElement,\n hasMultipleAggregators,\n rowAttrs.length\n );\n return (\n <th\n key={`rowKeyLabel${i}-${j}`}\n className=\"pvtRowLabel\"\n rowSpan={x}\n colSpan={\n showTotalsColumn &&\n j === rowAttrsToRender.length - 1 &&\n colAttrsToRender.length !== 0\n ? 2\n : 1\n }\n >\n {formattedTxt}\n </th>\n );\n })}\n {columnMeta.map(function(colMeta, j) {\n const aggregationKeyForCell = isColumnAggregationMode\n ? colMeta.aggregationKey\n : rowMeta.aggregationKey;\n const aggregator = pivotData.getAggregator(\n rowMeta.actualKey,\n colMeta.actualKey,\n aggregationKeyForCell\n );\n const value = aggregator.value();\n const heatmapStyle =\n valueCellColors(\n rowMeta.actualKey,\n colMeta.actualKey,\n value\n ) || {};\n return (\n <td\n className=\"pvtVal\"\n key={`pvtVal${i}-${j}`}\n onClick={\n getClickHandler &&\n getClickHandler(\n value,\n rowMeta.actualKey,\n colMeta.actualKey\n )\n }\n style={getCellStyle(value, heatmapStyle)}\n >\n {formatCellValue(\n value,\n aggregator,\n aggregationKeyForCell\n )}\n </td>\n );\n })}\n {showTotalsColumn && (\n <td\n className=\"pvtTotal\"\n onClick={\n getClickHandler &&\n getClickHandler(\n totalAggregator.value(),\n rowMeta.actualKey,\n [null]\n )\n }\n style={getCellStyle(\n totalAggregator.value(),\n colTotalColors(totalAggregator.value()) || {}\n )}\n >\n {formatCellValue(\n totalAggregator.value(),\n totalAggregator,\n rowMeta.aggregationKey\n )}\n </td>\n )}\n </tr>\n );\n })}\n\n {totalRowAggregations.map(function(agg) {\n const grandTotalAggregator = pivotData.getAggregator(\n [],\n [],\n isColumnAggregationMode ? primaryAggregation.key : agg.key\n );\n const totalLabel =\n hasMultipleAggregators && !isColumnAggregationMode\n ? `Totals – ${agg.label || agg.aggregatorName}`\n : totalsLabelText;\n return (\n <tr key={`totalRow-${agg.key}`}>\n <th\n className=\"pvtTotalLabel\"\n colSpan={\n rowAttrsToRender.length +\n (colAttrs.length === 0 ||\n (isColumnAggregationMode && hasColumnAttributes)\n ? 0\n : 1) +\n (hasNumberColumn ? 1 : 0)\n }\n >\n {totalLabel}\n </th>\n\n {columnMeta.map(function(colMeta, i) {\n const totalAggregator = pivotData.getAggregator(\n [],\n colMeta.actualKey,\n isColumnAggregationMode ? colMeta.aggregationKey : agg.key\n );\n const totalValue = totalAggregator.value();\n return (\n <td\n className=\"pvtTotal\"\n key={`total${agg.key}-${i}`}\n onClick={\n getClickHandler &&\n getClickHandler(totalValue, [null], colMeta.actualKey)\n }\n style={getCellStyle(\n totalValue,\n rowTotalColors(totalValue) || {}\n )}\n >\n {formatCellValue(totalValue, totalAggregator, agg.key)}\n </td>\n );\n })}\n\n {showTotalsColumn && (\n <td\n onClick={\n getClickHandler &&\n getClickHandler(\n grandTotalAggregator.value(),\n [null],\n [null]\n )\n }\n className=\"pvtGrandTotal\"\n style={getCellStyle(grandTotalAggregator.value(), {})}\n >\n {formatCellValue(\n grandTotalAggregator.value(),\n grandTotalAggregator,\n isColumnAggregationMode\n ? primaryAggregation.key\n : agg.key\n )}\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n\n TableRenderer.defaultProps = PivotData.defaultProps;\n TableRenderer.propTypes = PivotData.propTypes;\n TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;\n TableRenderer.defaultProps.tableOptions = {};\n TableRenderer.defaultProps.colSorts = {};\n TableRenderer.defaultProps.rowSorts = {};\n TableRenderer.defaultProps.rowGroupConfig = null;\n TableRenderer.propTypes.tableColorScaleGenerator = PropTypes.func;\n TableRenderer.propTypes.tableOptions = PropTypes.object;\n TableRenderer.propTypes.colSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.rowSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.onColSort = PropTypes.func;\n TableRenderer.propTypes.onRowSort = PropTypes.func;\n TableRenderer.propTypes.rowGroupConfig = PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string.isRequired,\n match: PropTypes.arrayOf(PropTypes.string).isRequired,\n })\n );\n TableRenderer.defaultProps.colSortIcons = {\n ASC: '→',\n DESC: '←',\n DEFAULT: '↔',\n };\n TableRenderer.defaultProps.rowSortIcons = {\n ASC: '↑',\n DESC: '↓',\n DEFAULT: '⇅',\n };\n TableRenderer.propTypes.colSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n TableRenderer.propTypes.rowSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n // When true, a \"No.\" column with the 1-based index of each data row is\n // rendered before the row attribute columns.\n TableRenderer.defaultProps.showNumericalOrder = false;\n TableRenderer.propTypes.showNumericalOrder = PropTypes.bool;\n return TableRenderer;\n}\n\nclass TSVExportRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const hasMultipleAggregators = aggregations.length > 1;\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const safeRowKeys = rowKeys.length === 0 ? [[]] : rowKeys;\n const safeColKeys = colKeys.length === 0 ? [[]] : colKeys;\n\n const rowEntries = hasMultipleAggregators\n ? safeRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({rowKey, aggregationKey: agg.key, label: agg.label});\n });\n return acc;\n }, [])\n : safeRowKeys.map(rowKey => ({\n rowKey,\n aggregationKey: aggregations[0].key,\n label: aggregations[0].label || aggregations[0].aggregatorName,\n }));\n\n const headerRow = rowAttrs.slice();\n if (hasMultipleAggregators) {\n headerRow.push('Values');\n }\n if (safeColKeys.length === 1 && safeColKeys[0].length === 0) {\n headerRow.push(\n hasMultipleAggregators\n ? 'Value'\n : aggregations[0].label || aggregations[0].aggregatorName\n );\n } else {\n safeColKeys.map(c => headerRow.push(c.join('-')));\n }\n\n const result = rowEntries.map(entry => {\n const row = entry.rowKey.map(x => x);\n if (hasMultipleAggregators) {\n row.push(entry.label || '');\n }\n safeColKeys.map(colKey => {\n const v = pivotData\n .getAggregator(entry.rowKey, colKey, entry.aggregationKey)\n .value();\n row.push(v ? v : '');\n });\n return row;\n });\n\n result.unshift(headerRow);\n\n return (\n <textarea\n value={result.map(r => r.join('\\t')).join('\\n')}\n style={{width: window.innerWidth / 2, height: window.innerHeight / 2}}\n readOnly={true}\n />\n );\n }\n}\n\nTSVExportRenderer.defaultProps = PivotData.defaultProps;\nTSVExportRenderer.propTypes = PivotData.propTypes;\n\nexport default {\n Table: makeRenderer(),\n 'Table Heatmap': makeRenderer({heatmapMode: 'full'}),\n 'Table Col Heatmap': makeRenderer({heatmapMode: 'col'}),\n 'Table Row Heatmap': makeRenderer({heatmapMode: 'row'}),\n 'Exportable TSV': TSVExportRenderer,\n};\n"]}
1
+ {"version":3,"sources":["../src/TableRenderers.jsx"],"names":["applyCellFormatting","spanSize","arr","i","j","x","asc","end","noDraw","len","length","asc1","end1","stop","buildGroupLookup","rowGroupConfig","lookup","forEach","label","match","name","buildHeaderGroupSegments","attrs","map","group","span","groupLabelStyle","textAlign","redColorScaleGenerator","values","min","Math","apply","max","nonRed","round","backgroundColor","evaluateCondition","value","condition","type","conditionValue","numValue","parseFloat","numConditionValue","isNaN","undefined","trim","valueStr","String","conditionValueStr","toLowerCase","includes","valueStr2","conditionValueStr2","getConditionalFormattingStyle","conditionalFormatting","Array","isArray","rules","rule","style","Object","assign","mergeStyles","styles","filter","s","containsSpecialCharacters","str","trimmed","pureNumericPattern","test","shouldSkipFormattingForAggregation","aggregatorName","skipFormattingAggregations","cellFormatting","defaultFormatter","isNumeric","isFinite","hasFormattingRules","some","format","numericValue","matchingRule","formatter","digitsAfterDecimal","decimalPlaces","thousandsSep","decimalSep","prefix","suffix","showOriginal","makeRenderer","opts","TableRenderer","pivotData","PivotData","props","colAttrs","cols","rowAttrs","rows","aggregations","getAggregations","primaryAggregation","getPrimaryAggregation","hasMultipleAggregators","tableOptions","aggregationDisplayMode","isColumnAggregationMode","rowAttrsToRender","concat","colAttrsToRender","hasColumnAttributes","showTotalsColumn","shouldRenderRowHeaderPlaceholder","hasHeaderGroup","Boolean","groupLookup","headerGroupSegments","renderGroupSegments","seg","idx","rowSpan","showNumericalOrder","hasNumberColumn","numberColumnLabel","renderedAggregationHeaderRow","numberColumnHeaderRowSpan","numberColumnInGroupRow","renderNumberHeaderCell","rowKeys","getRowKeys","baseRowKeys","renderedRows","reduce","acc","rowKey","push","displayKey","agg","actualKey","aggregationKey","key","rowKeyValues","r","colKeys","getColKeys","baseColKeys","columnMeta","colKey","colKeyValues","col","renderAggregatorHeaderCells","colMeta","aggIndex","colSpan","valueCellColors","rowTotalColors","colTotalColors","heatmapMode","colorScaleGenerator","tableColorScaleGenerator","rowTotalValues","getAggregator","colTotalValues","allValues","c","colorScale","v","rowColorScales","rowValues","colColorScales","colValues","aggregationNameLookup","aggregationByKey","getAggregationGroup","vals","k","renderAggregatorGroupCells","getCellStyle","heatmapStyle","conditionalStyle","formatCellValue","aggregator","bind","formatLabel","txt","parsed","formatRowLabel","index","isLastElement","rowAttrsLength","getClickHandler","clickCallback","filters","keys","attr","e","handleColSort","stopPropagation","onColSort","currentSort","colSorts","nextSort","handleRowSort","onRowSort","rowSorts","getSortButton","isCol","handleSort","sortIcon","colSortIcons","DEFAULT","rowSortIcons","totalRowAggregations","totalsLabelText","formattedColLabel","isRowAttr","rowMeta","totalAggregator","formattedTxt","aggregationKeyForCell","grandTotalAggregator","totalLabel","totalValue","React","PureComponent","defaultProps","propTypes","PropTypes","func","object","objectOf","oneOf","arrayOf","shape","string","isRequired","ASC","DESC","node","bool","TSVExportRenderer","safeRowKeys","safeColKeys","rowEntries","headerRow","slice","join","result","row","entry","unshift","width","window","innerWidth","height","innerHeight","Table"],"mappings":"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","file":"TableRenderers.js","sourcesContent":["/* eslint-disable no-inline-comments */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {PivotData, numberFormat} from './Utilities';\n\n// helper function for setting row/col-span in pivotTableRenderer\nconst spanSize = function(arr, i, j) {\n let x;\n if (i !== 0) {\n let asc, end;\n let noDraw = true;\n for (\n x = 0, end = j, asc = end >= 0;\n asc ? x <= end : x >= end;\n asc ? x++ : x--\n ) {\n if (arr[i - 1][x] !== arr[i][x]) {\n noDraw = false;\n }\n }\n if (noDraw) {\n return -1;\n }\n }\n let len = 0;\n while (i + len < arr.length) {\n let asc1, end1;\n let stop = false;\n for (\n x = 0, end1 = j, asc1 = end1 >= 0;\n asc1 ? x <= end1 : x >= end1;\n asc1 ? x++ : x--\n ) {\n if (arr[i][x] !== arr[i + len][x]) {\n stop = true;\n }\n }\n if (stop) {\n break;\n }\n len++;\n }\n return len;\n};\n\n// ==> Build a lookup: name -> group label <==\n// `match` can contain row attribute names, the synthetic 'Values' column\n// (aggregations displayed as rows) and aggregation names/labels\n// (aggregations displayed as columns).\nfunction buildGroupLookup(rowGroupConfig) {\n const lookup = {};\n (rowGroupConfig || []).forEach(({label, match}) => {\n match.forEach(name => {\n lookup[name] = label;\n });\n });\n return lookup;\n}\n\n// ==> Calculate the positions for GroupSegments <==\nfunction buildHeaderGroupSegments(attrs, rowGroupConfig) {\n const lookup = buildGroupLookup(rowGroupConfig);\n\n // Mỗi attribute luôn là 1 segment riêng — không gộp colSpan nữa,\n // để label nhóm (vd \"AAA\") hiện lặp lại trên từng cột con.\n return attrs.map(name => ({group: lookup[name] || null, span: 1}));\n}\n\n// Style cho ô có nhãn nhóm trong group header\nconst groupLabelStyle = {\n textAlign: 'center',\n};\n\nfunction redColorScaleGenerator(values) {\n const min = Math.min.apply(Math, values);\n const max = Math.max.apply(Math, values);\n return x => {\n // eslint-disable-next-line no-magic-numbers\n const nonRed = 255 - Math.round((255 * (x - min)) / (max - min));\n return {backgroundColor: `rgb(255,${nonRed},${nonRed})`};\n };\n}\n\n// Conditional formatting evaluation function\nfunction evaluateCondition(value, condition) {\n if (!condition || !condition.type) {\n return false;\n }\n\n const {type, value: conditionValue} = condition;\n const numValue = typeof value === 'number' ? value : parseFloat(value);\n const numConditionValue =\n typeof conditionValue === 'number'\n ? conditionValue\n : parseFloat(conditionValue);\n\n switch (type) {\n case 'greaterThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue > numConditionValue\n );\n case 'lessThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue < numConditionValue\n );\n case 'greaterThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue >= numConditionValue\n );\n case 'lessThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue <= numConditionValue\n );\n case 'equal':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value === conditionValue;\n }\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue === numConditionValue\n );\n case 'notEqual':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value !== conditionValue;\n }\n return (\n isNaN(numValue) ||\n isNaN(numConditionValue) ||\n numValue !== numConditionValue\n );\n case 'empty':\n // Check for null, undefined, empty string, whitespace-only strings, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n if (typeof value === 'number') {\n return isNaN(value);\n }\n return false;\n case 'notEmpty':\n // Check that value is not null, undefined, empty/whitespace string, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim() !== '';\n }\n if (typeof value === 'number') {\n return !isNaN(value);\n }\n // Other types (boolean, object, etc.) are considered not empty\n return true;\n // eslint-disable-next-line no-case-declarations\n case 'contains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr = String(value || '');\n const conditionValueStr = String(conditionValue || '');\n if (valueStr && conditionValueStr) {\n return valueStr.toLowerCase().includes(conditionValueStr.toLowerCase());\n }\n return false;\n // eslint-disable-next-line no-case-declarations\n case 'notContains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr2 = String(value || '');\n const conditionValueStr2 = String(conditionValue || '');\n if (valueStr2 && conditionValueStr2) {\n return !valueStr2\n .toLowerCase()\n .includes(conditionValueStr2.toLowerCase());\n }\n return true;\n default:\n return false;\n }\n}\n\n// Apply conditional formatting rules to a value\nfunction getConditionalFormattingStyle(value, conditionalFormatting) {\n if (!conditionalFormatting || !Array.isArray(conditionalFormatting.rules)) {\n return {};\n }\n\n // Evaluate rules in order, return first matching rule's style\n for (const rule of conditionalFormatting.rules) {\n if (evaluateCondition(value, rule.condition)) {\n // Return a copy of the style object to avoid mutations\n return rule.style ? Object.assign({}, rule.style) : {};\n }\n }\n\n return {};\n}\n\n// Merge styles, with conditional formatting taking precedence\nfunction mergeStyles(...styles) {\n return Object.assign({}, ...styles.filter(s => s && typeof s === 'object'));\n}\n\n// Helper function to check if a string contains special characters (like -, /, etc.)\n// This prevents formatting of date strings or formatted strings\n// Only pure numeric strings (with optional decimal point and minus sign) should be formatted\nfunction containsSpecialCharacters(str) {\n if (typeof str !== 'string') {\n return false;\n }\n const trimmed = str.trim();\n // Check if string contains any special characters that indicate it's not a raw number\n // Allow: digits, decimal point, minus sign at start, plus sign at start, spaces\n // Disallow: hyphens in middle, slashes, and other special characters\n const pureNumericPattern = /^-?\\d*\\.?\\d+$/;\n return !pureNumericPattern.test(trimmed);\n}\n\n// Helper function to check if an aggregation should skip formatting\n// Aggregations like Count, First, Last should not be formatted\n// Aggregations like Sum, Average should be formatted\nfunction shouldSkipFormattingForAggregation(aggregatorName) {\n if (!aggregatorName) {\n return false;\n }\n\n const name = aggregatorName.toLowerCase();\n // Skip formatting for these aggregation types\n const skipFormattingAggregations = [\n 'count',\n 'count unique values',\n 'list unique values',\n 'first',\n 'last',\n 'minimum',\n 'maximum',\n ];\n return skipFormattingAggregations.includes(name);\n}\n\n// Apply cell formatting rules to a value\nexport function applyCellFormatting(\n value,\n cellFormatting,\n defaultFormatter,\n aggregatorName = null\n) {\n // Don't format if aggregation type should skip formatting (e.g., Count, First, Last)\n // Only use defaultFormatter if value is numeric, otherwise return as-is\n const isNumeric =\n (typeof value === 'number' && !isNaN(value) && isFinite(value)) ||\n (typeof value === 'string' &&\n value.trim() !== '' &&\n !containsSpecialCharacters(value) &&\n !isNaN(parseFloat(value)) &&\n isFinite(parseFloat(value)));\n if (shouldSkipFormattingForAggregation(aggregatorName)) {\n if (isNumeric && defaultFormatter) {\n return defaultFormatter(value);\n }\n // Return raw value for non-numeric values (dates, strings, etc.)\n return value;\n }\n\n // If no cellFormatting rules, always use default formatter to return to original format\n // This ensures values return to their original format when cellFormatting is cleared\n // Check for all possible cases: null, undefined, empty object, empty rules array\n const hasFormattingRules =\n cellFormatting &&\n typeof cellFormatting === 'object' &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0 &&\n cellFormatting.rules.some(rule => rule && rule.format);\n\n if (!hasFormattingRules) {\n // When cellFormatting rules are cleared, return the raw value (not formatted)\n // This ensures all cells (regular, Totals, Aggregation) return to their original unformatted state\n // Return the raw numeric value for numbers, or the value as-is for other types\n if (isNumeric) {\n // Return raw numeric value without any formatting\n if (typeof value === 'number') {\n return value;\n }\n // For string numbers, return the parsed numeric value\n return parseFloat(value);\n }\n // For non-numeric values (dates, strings, etc.), return as-is\n return value;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n // Only check this when cellFormatting rules exist\n if (containsSpecialCharacters(value)) {\n return defaultFormatter ? defaultFormatter(value) : String(value);\n }\n\n // Check if value is a number - only apply custom formatting to raw numbers\n // Handle both number type and string numbers (e.g., \"123.45\")\n // Exclude strings with special characters from formatting\n let numericValue = value;\n\n // Convert string numbers to actual numbers for formatting\n if (isNumeric && typeof value === 'string') {\n numericValue = parseFloat(value);\n }\n\n // Use the first rule (all rules apply to all values)\n const matchingRule = cellFormatting.rules[0];\n\n // If we found a matching rule and value is numeric, apply its formatting\n if (matchingRule && matchingRule.format && isNumeric) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal: 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep: 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal: 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n\n // Not numeric or no matching rule, use default formatter\n return defaultFormatter ? defaultFormatter(value) : String(value);\n}\n\nfunction makeRenderer(opts = {}) {\n class TableRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const colAttrs = pivotData.props.cols;\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const primaryAggregation = pivotData.getPrimaryAggregation();\n const hasMultipleAggregators = aggregations.length > 1;\n const tableOptions = this.props.tableOptions || {};\n const aggregationDisplayMode =\n tableOptions.aggregationDisplayMode === 'column' ? 'column' : 'row';\n const isColumnAggregationMode =\n aggregationDisplayMode === 'column' && hasMultipleAggregators;\n const rowAttrsToRender =\n hasMultipleAggregators && !isColumnAggregationMode\n ? rowAttrs.concat(['Values'])\n : rowAttrs;\n const colAttrsToRender = colAttrs;\n const hasColumnAttributes = colAttrsToRender.length > 0;\n const showTotalsColumn = !isColumnAggregationMode;\n const shouldRenderRowHeaderPlaceholder = rowAttrsToRender.length !== 0;\n\n // --- Row group header (rowGroupConfig) ---\n // `match` may reference row attribute names, 'Values' (aggregations shown\n // as rows) and aggregation names/labels (aggregations shown as columns).\n // Every column gets its own <th>, so the group label is repeated on each.\n const rowGroupConfig = this.props.rowGroupConfig;\n const hasHeaderGroup = Boolean(rowGroupConfig && rowGroupConfig.length);\n const groupLookup = buildGroupLookup(rowGroupConfig);\n const headerGroupSegments = hasHeaderGroup\n ? buildHeaderGroupSegments(rowAttrsToRender, rowGroupConfig)\n : [];\n const renderGroupSegments = rowSpan =>\n headerGroupSegments.map((seg, idx) => (\n <th\n key={`hgSeg${idx}`}\n colSpan={seg.span}\n rowSpan={rowSpan}\n // eslint-disable-next-line no-undefined\n style={seg.group ? groupLabelStyle : undefined}\n >\n {seg.group || ''}\n </th>\n ));\n // --- End row group header ---\n\n // --- Optional \"No.\" column (showNumericalOrder) ---\n // When enabled every data row is prefixed with its 1-based index, in a\n // column labelled \"No.\" placed before the row attribute columns.\n const showNumericalOrder = Boolean(this.props.showNumericalOrder);\n const hasNumberColumn =\n showNumericalOrder &&\n (rowAttrsToRender.length !== 0 || colAttrsToRender.length !== 0);\n const numberColumnLabel = 'No.';\n const renderedAggregationHeaderRow =\n isColumnAggregationMode && hasColumnAttributes;\n // The \"No.\" header cell is rendered in the first header row and spans\n // every header row, so the repeated header rows (column attributes,\n // aggregator labels, row group labels) stay aligned with the body.\n const numberColumnHeaderRowSpan =\n colAttrsToRender.length +\n (renderedAggregationHeaderRow ? 1 : 0) +\n (rowAttrsToRender.length !== 0 && !renderedAggregationHeaderRow\n ? 1\n : 0) +\n (hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0\n ? 1\n : 0) +\n (renderedAggregationHeaderRow && hasHeaderGroup ? 1 : 0);\n const numberColumnInGroupRow =\n hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0;\n const renderNumberHeaderCell = (rowSpan = numberColumnHeaderRowSpan) => (\n <th className=\"pvtAxisLabel pvtRowNumber\" rowSpan={rowSpan}>\n {numberColumnLabel}\n </th>\n );\n // --- End \"No.\" column ---\n\n const rowKeys = pivotData.getRowKeys();\n const baseRowKeys =\n hasMultipleAggregators &&\n !isColumnAggregationMode &&\n rowKeys.length === 0\n ? [[]]\n : rowKeys;\n const renderedRows =\n hasMultipleAggregators && !isColumnAggregationMode\n ? baseRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({\n displayKey: rowKey.concat([agg.label || agg.aggregatorName]),\n actualKey: rowKey,\n aggregationKey: agg.key,\n });\n });\n return acc;\n }, [])\n : baseRowKeys.map(rowKey => ({\n displayKey: rowKey,\n actualKey: rowKey,\n aggregationKey: primaryAggregation.key,\n }));\n const rowKeyValues = renderedRows.map(r => r.displayKey);\n const colKeys = pivotData.getColKeys();\n const baseColKeys =\n isColumnAggregationMode && colKeys.length === 0 ? [[]] : colKeys;\n const columnMeta = isColumnAggregationMode\n ? baseColKeys.reduce((acc, colKey) => {\n aggregations.forEach(agg => {\n acc.push({\n displayKey: colKey.concat([agg.label || agg.aggregatorName]),\n actualKey: colKey,\n aggregationKey: agg.key,\n });\n });\n return acc;\n }, [])\n : colKeys.map(colKey => ({\n displayKey: colKey,\n actualKey: colKey,\n aggregationKey: primaryAggregation.key,\n }));\n const colKeyValues = columnMeta.map(col => col.displayKey);\n\n const renderAggregatorHeaderCells = () =>\n columnMeta.map((colMeta, idx) => {\n const label = colMeta.displayKey[colMeta.displayKey.length - 1] || '';\n // Calculate colspan/rowspan so aggregator headers line up with column groups\n // aggregator index is the last element in displayKey (after column attrs)\n const aggIndex = colAttrsToRender.length;\n // When there are column attributes, each aggregator should appear once per column group,\n // so each aggregator header should have colSpan = 1.\n // When there are no column attributes, use spanSize to merge identical aggregator labels.\n let colSpan;\n if (hasColumnAttributes) {\n // Each aggregator appears once per column group, so colSpan is always 1\n // This ensures aggregator headers are listed in each column group and align\n // correctly with the column groups above (which have colSpan = number of aggregators)\n colSpan = 1;\n } else {\n // Use spanSize to merge identical aggregator labels when there are no column attributes\n colSpan = spanSize(colKeyValues, idx, aggIndex);\n // If spanSize returned -1 it means this cell is merged into a previous one\n if (colSpan === -1) {\n return null;\n }\n }\n\n // When there are column attributes, rowSpan should account for the row header row\n // When there are no column attributes, rowSpan is 1\n const rowSpan =\n hasColumnAttributes && rowAttrsToRender.length !== 0 ? 1 : 1;\n\n return (\n <th\n className=\"pvtColLabel\"\n key={`agg-label-${idx}`}\n colSpan={colSpan}\n rowSpan={rowSpan}\n >\n {label}\n </th>\n );\n });\n\n let valueCellColors = () => {};\n let rowTotalColors = () => {};\n let colTotalColors = () => {};\n if (opts.heatmapMode && !hasMultipleAggregators) {\n const colorScaleGenerator = this.props.tableColorScaleGenerator;\n const rowTotalValues = colKeys.map(x =>\n pivotData.getAggregator([], x, primaryAggregation.key).value()\n );\n rowTotalColors = colorScaleGenerator(rowTotalValues);\n const colTotalValues = rowKeys.map(x =>\n pivotData.getAggregator(x, [], primaryAggregation.key).value()\n );\n colTotalColors = colorScaleGenerator(colTotalValues);\n\n if (opts.heatmapMode === 'full') {\n const allValues = [];\n rowKeys.map(r =>\n colKeys.map(c =>\n allValues.push(\n pivotData.getAggregator(r, c, primaryAggregation.key).value()\n )\n )\n );\n const colorScale = colorScaleGenerator(allValues);\n valueCellColors = (r, c, v) => colorScale(v);\n } else if (opts.heatmapMode === 'row') {\n const rowColorScales = {};\n rowKeys.map(r => {\n const rowValues = colKeys.map(x =>\n pivotData.getAggregator(r, x, primaryAggregation.key).value()\n );\n rowColorScales[r] = colorScaleGenerator(rowValues);\n });\n valueCellColors = (r, c, v) => rowColorScales[r](v);\n } else if (opts.heatmapMode === 'col') {\n const colColorScales = {};\n colKeys.map(c => {\n const colValues = rowKeys.map(x =>\n pivotData.getAggregator(x, c, primaryAggregation.key).value()\n );\n colColorScales[c] = colorScaleGenerator(colValues);\n });\n valueCellColors = (r, c, v) => colColorScales[c](v);\n }\n }\n\n // Get conditional formatting from tableOptions\n const conditionalFormatting = tableOptions.conditionalFormatting || null;\n\n // Get cell formatting from tableOptions\n const cellFormatting = tableOptions.cellFormatting || null;\n\n // Create lookup map from aggregationKey to aggregatorName\n const aggregationNameLookup = {};\n aggregations.forEach(agg => {\n aggregationNameLookup[agg.key] = agg.aggregatorName;\n });\n\n // Lookup aggregationKey -> aggregation definition (to read `vals`)\n const aggregationByKey = {};\n aggregations.forEach(agg => {\n aggregationByKey[agg.key] = agg;\n });\n\n // Find the group label for an aggregation. rowGroupConfig `match` is\n // compared against the aggregation's `vals` (the field names it works\n // on, e.g. ['Employee Ref']). Falls back to label / aggregatorName.\n const getAggregationGroup = aggregationKey => {\n const agg = aggregationByKey[aggregationKey];\n if (!agg) {\n return null;\n }\n const vals = Array.isArray(agg.vals) ? agg.vals : [];\n for (let k = 0; k < vals.length; k++) {\n if (groupLookup[vals[k]]) {\n return groupLookup[vals[k]];\n }\n }\n return (\n groupLookup[agg.label] || groupLookup[agg.aggregatorName] || null\n );\n };\n\n // Group label cells for the aggregation columns (column aggregation mode).\n // Each column renders its own <th>, so the label repeats on every column.\n const renderAggregatorGroupCells = () =>\n columnMeta.map((colMeta, idx) => {\n const group = getAggregationGroup(colMeta.aggregationKey);\n return (\n <th\n key={`aggGrp${idx}`}\n // eslint-disable-next-line no-undefined\n style={group ? groupLabelStyle : undefined}\n >\n {group || ''}\n </th>\n );\n });\n\n // Helper function to get cell style with conditional formatting\n const getCellStyle = (value, heatmapStyle = {}) => {\n const conditionalStyle = getConditionalFormattingStyle(\n value,\n conditionalFormatting\n );\n return mergeStyles(heatmapStyle, conditionalStyle);\n };\n\n // Helper function to format cell value with cell formatting rules\n const formatCellValue = (value, aggregator, aggregationKey) => {\n const aggregatorName = aggregationKey\n ? aggregationNameLookup[aggregationKey]\n : null;\n\n return applyCellFormatting(\n value,\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregatorName\n );\n };\n\n // Helper function to format label text if it's numeric\n // Used for both row and column labels\n const formatLabel = txt => {\n // Check if txt is numeric (number or numeric string)\n // Also exclude 'null' string which is used for missing values\n if (txt === 'null' || txt === null || typeof txt === 'undefined') {\n return txt;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n if (containsSpecialCharacters(txt)) {\n return txt;\n }\n\n // Check if txt is numeric (number or numeric string)\n // A string is numeric if it can be parsed as a finite number\n // Exclude strings with special characters from formatting\n let isNumeric = false;\n let numericValue = null;\n\n if (typeof txt === 'number') {\n isNumeric = !isNaN(txt) && isFinite(txt);\n if (isNumeric) {\n numericValue = txt;\n }\n } else if (\n typeof txt === 'string' &&\n txt.trim() !== '' &&\n txt !== 'null' &&\n !containsSpecialCharacters(txt)\n ) {\n const parsed = parseFloat(txt.trim());\n isNumeric = !isNaN(parsed) && isFinite(parsed);\n if (isNumeric) {\n numericValue = parsed;\n }\n }\n\n if (\n isNumeric &&\n numericValue !== null &&\n cellFormatting &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0\n ) {\n const matchingRule = cellFormatting.rules[0];\n if (matchingRule && matchingRule.format) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal:\n 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep:\n 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal:\n 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n }\n\n // Not numeric or no formatting rules, return as-is\n return txt;\n };\n\n // Helper function to format row label text if it's numeric\n // Only formats if it's a numeric value, not aggregation labels\n const formatRowLabel = (\n txt,\n index,\n isLastElement,\n hasMultipleAggregators,\n rowAttrsLength\n ) => {\n // Don't format the last element if it's an aggregation label (when multiple aggregators)\n // The last element is an aggregation label only if:\n // 1. There are multiple aggregators\n // 2. AND it's beyond the row attributes (index >= rowAttrsLength)\n if (\n hasMultipleAggregators &&\n isLastElement &&\n index >= rowAttrsLength\n ) {\n return txt;\n }\n\n return formatLabel(txt);\n };\n\n const getClickHandler =\n tableOptions && tableOptions.clickCallback\n ? (value, rowValues, colValues) => {\n const filters = {};\n for (const i of Object.keys(colAttrs || {})) {\n const attr = colAttrs[i];\n if (colValues[i] !== null) {\n filters[attr] = colValues[i];\n }\n }\n for (const i of Object.keys(rowAttrs || {})) {\n const attr = rowAttrs[i];\n if (rowValues[i] !== null) {\n filters[attr] = rowValues[i];\n }\n }\n return e =>\n tableOptions.clickCallback(e, value, filters, pivotData);\n }\n : null;\n\n const handleColSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onColSort) {\n const currentSort = this.props.colSorts && this.props.colSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onColSort(attr, nextSort);\n }\n };\n\n const handleRowSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onRowSort) {\n const currentSort = this.props.rowSorts && this.props.rowSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onRowSort(attr, nextSort);\n }\n };\n\n const getSortButton = (attr, isCol) => {\n const currentSort = isCol\n ? this.props.colSorts && this.props.colSorts[attr]\n : this.props.rowSorts && this.props.rowSorts[attr];\n const handleSort = isCol ? handleColSort : handleRowSort;\n let sortIcon = '';\n if (currentSort !== null) {\n if (isCol) {\n sortIcon =\n this.props.colSortIcons[currentSort] ||\n this.props.colSortIcons.DEFAULT;\n } else {\n sortIcon =\n this.props.rowSortIcons[currentSort] ||\n this.props.rowSortIcons.DEFAULT;\n }\n }\n return (\n <button\n type=\"button\"\n className=\"pvtSortButton\"\n onClick={e => handleSort(attr, e)}\n title={\n currentSort === 'ASC'\n ? 'Sort Descending'\n : currentSort === 'DESC'\n ? 'Clear Sort'\n : 'Sort Ascending'\n }\n >\n {sortIcon}\n </button>\n );\n };\n\n const totalRowAggregations = isColumnAggregationMode\n ? [primaryAggregation]\n : hasMultipleAggregators\n ? aggregations\n : [primaryAggregation];\n const totalsLabelText = 'Totals';\n\n return (\n <table className=\"pvtTable\">\n <thead>\n {colAttrsToRender.map(function(c, j) {\n return (\n <tr key={`colAttr${j}`}>\n {hasNumberColumn && j === 0 && renderNumberHeaderCell()}\n {shouldRenderRowHeaderPlaceholder &&\n (isColumnAggregationMode || j === 0) &&\n !(\n isColumnAggregationMode &&\n hasColumnAttributes &&\n rowAttrsToRender.length === 1\n ) &&\n (hasHeaderGroup && j === 0 && !isColumnAggregationMode ? (\n renderGroupSegments(colAttrsToRender.length)\n ) : (\n <th\n colSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? rowAttrsToRender.length - 1\n : rowAttrsToRender.length\n }\n rowSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? 1\n : colAttrsToRender.length\n }\n />\n ))}\n {c ? (\n <th className=\"pvtAxisLabel\">\n {c}\n {colAttrs.includes(c) && getSortButton(c, true)}\n </th>\n ) : null}\n {colKeyValues.map(function(colKey, i) {\n const x = spanSize(colKeyValues, i, j);\n\n if (x === -1) {\n return null;\n }\n\n const formattedColLabel = formatLabel(colKey[j]);\n return (\n <th\n className=\"pvtColLabel\"\n key={`colKey${i}`}\n colSpan={x}\n rowSpan={\n j === colAttrsToRender.length - 1 &&\n rowAttrsToRender.length !== 0 &&\n !isColumnAggregationMode\n ? 2\n : 1\n }\n >\n {formattedColLabel}\n </th>\n );\n })}\n\n {showTotalsColumn && j === 0 && (\n <th\n className=\"pvtTotalLabel\"\n rowSpan={\n colAttrsToRender.length +\n (rowAttrsToRender.length === 0 ? 0 : 1)\n }\n >\n {totalsLabelText}\n </th>\n )}\n </tr>\n );\n })}\n\n {/* Group row for the aggregation columns, placed right above the\n aggregator label row (column mode with column attributes) */}\n {isColumnAggregationMode && hasColumnAttributes && hasHeaderGroup && (\n <tr>\n {renderGroupSegments(1)}\n {renderAggregatorGroupCells()}\n </tr>\n )}\n\n {/* Group row when there are no column attributes */}\n {hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0 && (\n <tr>\n {hasNumberColumn && renderNumberHeaderCell()}\n {renderGroupSegments(1)}\n {isColumnAggregationMode ? (\n renderAggregatorGroupCells()\n ) : (\n <th />\n )}\n </tr>\n )}\n\n {isColumnAggregationMode && hasColumnAttributes && (\n <tr>\n {rowAttrsToRender.length !== 0 &&\n rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr-agg-${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {renderAggregatorHeaderCells()}\n </tr>\n )}\n\n {rowAttrsToRender.length !== 0 &&\n !(isColumnAggregationMode && hasColumnAttributes) && (\n <tr>\n {hasNumberColumn &&\n colAttrsToRender.length === 0 &&\n !numberColumnInGroupRow &&\n renderNumberHeaderCell()}\n {rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {isColumnAggregationMode && !hasColumnAttributes\n ? renderAggregatorHeaderCells()\n : null}\n {showTotalsColumn && (\n <th className=\"pvtTotalLabel\">\n {colAttrs.length === 0 ? totalsLabelText : null}\n </th>\n )}\n </tr>\n )}\n </thead>\n\n <tbody>\n {renderedRows.map(function(rowMeta, i) {\n const totalAggregator = pivotData.getAggregator(\n rowMeta.actualKey,\n [],\n rowMeta.aggregationKey\n );\n const displayKey = rowMeta.displayKey;\n return (\n <tr key={`rowKeyRow${i}`}>\n {hasNumberColumn && (\n <th className=\"pvtRowNumber\" key={`rowNumber${i}`}>\n {i + 1}\n </th>\n )}\n {displayKey.map(function(txt, j) {\n const x = spanSize(rowKeyValues, i, j);\n if (x === -1) {\n return null;\n }\n const isLastElement = j === displayKey.length - 1;\n const formattedTxt = formatRowLabel(\n txt,\n j,\n isLastElement,\n hasMultipleAggregators,\n rowAttrs.length\n );\n return (\n <th\n key={`rowKeyLabel${i}-${j}`}\n className=\"pvtRowLabel\"\n rowSpan={x}\n colSpan={\n showTotalsColumn &&\n j === rowAttrsToRender.length - 1 &&\n colAttrsToRender.length !== 0\n ? 2\n : 1\n }\n >\n {formattedTxt}\n </th>\n );\n })}\n {columnMeta.map(function(colMeta, j) {\n const aggregationKeyForCell = isColumnAggregationMode\n ? colMeta.aggregationKey\n : rowMeta.aggregationKey;\n const aggregator = pivotData.getAggregator(\n rowMeta.actualKey,\n colMeta.actualKey,\n aggregationKeyForCell\n );\n const value = aggregator.value();\n const heatmapStyle =\n valueCellColors(\n rowMeta.actualKey,\n colMeta.actualKey,\n value\n ) || {};\n return (\n <td\n className=\"pvtVal\"\n key={`pvtVal${i}-${j}`}\n onClick={\n getClickHandler &&\n getClickHandler(\n value,\n rowMeta.actualKey,\n colMeta.actualKey\n )\n }\n style={getCellStyle(value, heatmapStyle)}\n >\n {formatCellValue(\n value,\n aggregator,\n aggregationKeyForCell\n )}\n </td>\n );\n })}\n {showTotalsColumn && (\n <td\n className=\"pvtTotal\"\n onClick={\n getClickHandler &&\n getClickHandler(\n totalAggregator.value(),\n rowMeta.actualKey,\n [null]\n )\n }\n style={getCellStyle(\n totalAggregator.value(),\n colTotalColors(totalAggregator.value()) || {}\n )}\n >\n {formatCellValue(\n totalAggregator.value(),\n totalAggregator,\n rowMeta.aggregationKey\n )}\n </td>\n )}\n </tr>\n );\n })}\n\n {totalRowAggregations.map(function(agg) {\n const grandTotalAggregator = pivotData.getAggregator(\n [],\n [],\n isColumnAggregationMode ? primaryAggregation.key : agg.key\n );\n const totalLabel =\n hasMultipleAggregators && !isColumnAggregationMode\n ? `Totals – ${agg.label || agg.aggregatorName}`\n : totalsLabelText;\n return (\n <tr key={`totalRow-${agg.key}`}>\n <th\n className=\"pvtTotalLabel\"\n colSpan={\n rowAttrsToRender.length +\n (colAttrs.length === 0 ||\n (isColumnAggregationMode && hasColumnAttributes)\n ? 0\n : 1) +\n (hasNumberColumn ? 1 : 0)\n }\n >\n {totalLabel}\n </th>\n\n {columnMeta.map(function(colMeta, i) {\n const totalAggregator = pivotData.getAggregator(\n [],\n colMeta.actualKey,\n isColumnAggregationMode ? colMeta.aggregationKey : agg.key\n );\n const totalValue = totalAggregator.value();\n return (\n <td\n className=\"pvtTotal\"\n key={`total${agg.key}-${i}`}\n onClick={\n getClickHandler &&\n getClickHandler(totalValue, [null], colMeta.actualKey)\n }\n style={getCellStyle(\n totalValue,\n rowTotalColors(totalValue) || {}\n )}\n >\n {formatCellValue(totalValue, totalAggregator, agg.key)}\n </td>\n );\n })}\n\n {showTotalsColumn && (\n <td\n onClick={\n getClickHandler &&\n getClickHandler(\n grandTotalAggregator.value(),\n [null],\n [null]\n )\n }\n className=\"pvtGrandTotal\"\n style={getCellStyle(grandTotalAggregator.value(), {})}\n >\n {formatCellValue(\n grandTotalAggregator.value(),\n grandTotalAggregator,\n isColumnAggregationMode\n ? primaryAggregation.key\n : agg.key\n )}\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n\n TableRenderer.defaultProps = PivotData.defaultProps;\n TableRenderer.propTypes = PivotData.propTypes;\n TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;\n TableRenderer.defaultProps.tableOptions = {};\n TableRenderer.defaultProps.colSorts = {};\n TableRenderer.defaultProps.rowSorts = {};\n TableRenderer.defaultProps.rowGroupConfig = null;\n TableRenderer.propTypes.tableColorScaleGenerator = PropTypes.func;\n TableRenderer.propTypes.tableOptions = PropTypes.object;\n TableRenderer.propTypes.colSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.rowSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.onColSort = PropTypes.func;\n TableRenderer.propTypes.onRowSort = PropTypes.func;\n TableRenderer.propTypes.rowGroupConfig = PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string.isRequired,\n match: PropTypes.arrayOf(PropTypes.string).isRequired,\n })\n );\n TableRenderer.defaultProps.colSortIcons = {\n ASC: '→',\n DESC: '←',\n DEFAULT: '↔',\n };\n TableRenderer.defaultProps.rowSortIcons = {\n ASC: '↑',\n DESC: '↓',\n DEFAULT: '⇅',\n };\n TableRenderer.propTypes.colSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n TableRenderer.propTypes.rowSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n // When true, a \"No.\" column with the 1-based index of each data row is\n // rendered before the row attribute columns.\n TableRenderer.defaultProps.showNumericalOrder = false;\n TableRenderer.propTypes.showNumericalOrder = PropTypes.bool;\n return TableRenderer;\n}\n\nclass TSVExportRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const hasMultipleAggregators = aggregations.length > 1;\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const safeRowKeys = rowKeys.length === 0 ? [[]] : rowKeys;\n const safeColKeys = colKeys.length === 0 ? [[]] : colKeys;\n\n const rowEntries = hasMultipleAggregators\n ? safeRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({rowKey, aggregationKey: agg.key, label: agg.label});\n });\n return acc;\n }, [])\n : safeRowKeys.map(rowKey => ({\n rowKey,\n aggregationKey: aggregations[0].key,\n label: aggregations[0].label || aggregations[0].aggregatorName,\n }));\n\n const headerRow = rowAttrs.slice();\n if (hasMultipleAggregators) {\n headerRow.push('Values');\n }\n if (safeColKeys.length === 1 && safeColKeys[0].length === 0) {\n headerRow.push(\n hasMultipleAggregators\n ? 'Value'\n : aggregations[0].label || aggregations[0].aggregatorName\n );\n } else {\n safeColKeys.map(c => headerRow.push(c.join('-')));\n }\n\n const result = rowEntries.map(entry => {\n const row = entry.rowKey.map(x => x);\n if (hasMultipleAggregators) {\n row.push(entry.label || '');\n }\n safeColKeys.map(colKey => {\n const v = pivotData\n .getAggregator(entry.rowKey, colKey, entry.aggregationKey)\n .value();\n row.push(v ? v : '');\n });\n return row;\n });\n\n result.unshift(headerRow);\n\n return (\n <textarea\n value={result.map(r => r.join('\\t')).join('\\n')}\n style={{width: window.innerWidth / 2, height: window.innerHeight / 2}}\n readOnly={true}\n />\n );\n }\n}\n\nTSVExportRenderer.defaultProps = PivotData.defaultProps;\nTSVExportRenderer.propTypes = PivotData.propTypes;\n\nexport default {\n Table: makeRenderer(),\n 'Table Heatmap': makeRenderer({heatmapMode: 'full'}),\n 'Table Col Heatmap': makeRenderer({heatmapMode: 'col'}),\n 'Table Row Heatmap': makeRenderer({heatmapMode: 'row'}),\n 'Exportable TSV': TSVExportRenderer,\n};\n"]}
@@ -175,7 +175,7 @@ describe(' PivotTableUI showProcessing', function () {
175
175
 
176
176
  // Wait out the dispatch debounce so the request reaches the worker.
177
177
  return actAsync(function () {
178
- return wait(80);
178
+ return wait(_pivotCompute.WORKER_DEBOUNCE_MS + 50);
179
179
  }).then(function () {
180
180
  var worker = workerInstances[0];
181
181
  expect(worker).toBeDefined();