@sis-cc/dotstatsuite-visions 7.23.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -113,7 +113,7 @@ var DataHeader = function DataHeader(_ref5) {
113
113
  title = _ref5.title,
114
114
  _ref5$subtitle = _ref5.subtitle,
115
115
  subtitle = _ref5$subtitle === undefined ? [] : _ref5$subtitle,
116
- uprs = _ref5.uprs,
116
+ combinations = _ref5.combinations,
117
117
  disclaimer = _ref5.disclaimer,
118
118
  sideProps = _ref5.sideProps,
119
119
  SideIcon = _ref5.SideIcon,
@@ -129,12 +129,19 @@ var DataHeader = function DataHeader(_ref5) {
129
129
  var isWidthLess = R.lt(width);
130
130
  var classes = useStyles({ isWidthLess: isWidthLess });
131
131
 
132
- var reducedContent = getReducedContent({ isWidthLess: isWidthLess, title: title, subtitle: subtitle, uprs: uprs, disclaimer: disclaimer });
132
+ var reducedContent = getReducedContent({
133
+ isWidthLess: isWidthLess,
134
+ title: title,
135
+ subtitle: subtitle,
136
+ combinations: combinations,
137
+ disclaimer: disclaimer
138
+ });
133
139
 
134
140
  var theme = useTheme();
135
141
  var iconColor = R.path(['mixins', 'dataHeader', 'icon', 'color'], theme);
136
142
 
137
143
  var subtitleLength = R.length(subtitle);
144
+ var combinationsLength = R.length(combinations);
138
145
 
139
146
  return React.createElement(
140
147
  'div',
@@ -185,11 +192,32 @@ var DataHeader = function DataHeader(_ref5) {
185
192
  );
186
193
  }))(subtitle)
187
194
  ),
188
- isWidthUp(T4_BREAKPOINTS.xs3) && uprs && React.createElement(
189
- Typography,
190
- { className: classes.subtitle, 'data-testid': 'data-header-units' },
191
- React.createElement(Title, { header: uprs.header }),
192
- uprs.label
195
+ isWidthUp(T4_BREAKPOINTS.xs3) && combinations && R.not(R.isEmpty(combinations)) && React.createElement(
196
+ 'div',
197
+ { className: classes.wrapperSubtitle },
198
+ R.pipe(R.addIndex(R.map)(function (comb, index) {
199
+ return React.createElement(
200
+ 'div',
201
+ {
202
+ key: 'combination-' + index,
203
+ className: classes.subtitle,
204
+ 'data-testid': 'data-header-combination',
205
+ 'aria-label': comb.header
206
+ },
207
+ React.createElement(Title, { header: comb.header }),
208
+ React.createElement(
209
+ Typography,
210
+ { variant: 'inherit' },
211
+ comb.label
212
+ ),
213
+ R.not(R.isEmpty(R.propOr([], 'flags', comb))) && React.createElement(Flags, { classes: classes, content: R.prop('flags', comb) }),
214
+ R.lt(index + 1, combinationsLength) && React.createElement(
215
+ 'svg',
216
+ { width: '24', height: '8' },
217
+ React.createElement('circle', { cx: '12', cy: '4', r: '3', stroke: iconColor, fill: iconColor })
218
+ )
219
+ );
220
+ }))(combinations)
193
221
  ),
194
222
  isWidthUp(T4_BREAKPOINTS.xs3) && disclaimer && React.createElement(
195
223
  Typography,
@@ -232,10 +260,10 @@ DataHeader.propTypes = process.env.NODE_ENV !== "production" ? {
232
260
  }))
233
261
  }))
234
262
  })),
235
- uprs: PropTypes.shape({
263
+ combinations: PropTypes.arrayOf(PropTypes.shape({
236
264
  header: PropTypes.string,
237
265
  label: PropTypes.string
238
- }),
266
+ })),
239
267
  sideProps: PropTypes.object,
240
268
  SideIcon: PropTypes.func,
241
269
  disclaimer: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
@@ -10,13 +10,13 @@ import SubHeader from './subHeader';
10
10
  import Section from './section';
11
11
  import Cell from './cell';
12
12
 
13
- /*
14
- * Accessibility.
15
- * Do not use "TableHead" from Material-ui.
16
- * Material-ui, add "scope" attribute for accessibility, "scope" attribute can break screen reader if use with headers.
17
- * Child from TableHead will inherit a "scope" that we don't want. (not possible to turn off)
18
- * We are using "headers" attribute because the table is too complexe to use "scope".
19
- */
13
+ /*
14
+ * Accessibility.
15
+ * Do not use "TableHead" from Material-ui.
16
+ * Material-ui, add "scope" attribute for accessibility, "scope" attribute can break screen reader if use with headers.
17
+ * Child from TableHead will inherit a "scope" that we don't want. (not possible to turn off)
18
+ * We are using "headers" attribute because the table is too complexe to use "scope".
19
+ */
20
20
 
21
21
  var useStyles = makeStyles(function (theme) {
22
22
  return {
@@ -41,7 +41,7 @@ export var getEnhancedValuesHeaderData = function getEnhancedValuesHeaderData(da
41
41
  // mix merge and transpose for performance
42
42
  R.reduce(function (acc, cells) {
43
43
  R.addIndex(R.forEach)(function (cell, rowIndex) {
44
- var cellId = R.path(['value', 'id'], cell);
44
+ var cellId = R.has('values', cell) ? R.pipe(R.prop('values'), R.pluck('id'), R.join(','))(cell) : R.path(['value', 'id'], cell);
45
45
  var topCell = rowIndex > 0 ? R.pipe(R.nth(rowIndex - 1), R.last)(acc) : null;
46
46
  var cellKey = R.isNil(topCell) ? cellId : topCell.key + '-' + cellId;
47
47
 
@@ -49,7 +49,7 @@ export var getEnhancedValuesHeaderData = function getEnhancedValuesHeaderData(da
49
49
  if (R.prop('key', leftCell) === cellKey && rowIndex !== colLength - 1) {
50
50
  acc = R.over(R.lensIndex(rowIndex), R.over(R.lensIndex(-1), R.evolve({ spanCount: R.add(1) })))(acc);
51
51
  } else {
52
- acc = R.over(R.lensIndex(rowIndex), R.append(_extends({}, R.propOr({}, 'value', cell), { key: cellKey, spanCount: 1 })))(acc);
52
+ acc = R.over(R.lensIndex(rowIndex), R.append(_extends({}, R.pick(['value', 'values'], cell), { key: cellKey, spanCount: 1 })))(acc);
53
53
  }
54
54
  })(cells);
55
55
  return acc;
@@ -72,7 +72,9 @@ var TableHtml5 = function TableHtml5(_ref) {
72
72
  SideIcon = _ref.SideIcon,
73
73
  _ref$testId = _ref.testId,
74
74
  testId = _ref$testId === undefined ? 'vis-table' : _ref$testId,
75
- HTMLRenderer = _ref.HTMLRenderer;
75
+ HTMLRenderer = _ref.HTMLRenderer,
76
+ _ref$labelAccessor = _ref.labelAccessor,
77
+ labelAccessor = _ref$labelAccessor === undefined ? R.prop('name') : _ref$labelAccessor;
76
78
 
77
79
  var classes = useStyles();
78
80
 
@@ -109,7 +111,8 @@ var TableHtml5 = function TableHtml5(_ref) {
109
111
 
110
112
  var isSingleObs = R.hasPath(['', '', '', 0], cells);
111
113
  if (isSingleObs) return React.createElement(Cell, _extends({
112
- HTMLRenderer: HTMLRenderer
114
+ HTMLRenderer: HTMLRenderer,
115
+ labelAccessor: labelAccessor
113
116
  }, R.pathOr({}, ['', '', '', 0], cells), {
114
117
  cellHandler: cellHandler,
115
118
  isOne: true
@@ -136,7 +139,8 @@ var TableHtml5 = function TableHtml5(_ref) {
136
139
  valuesHeaderData: valuesHeaderData,
137
140
  xLayoutDataLength: xLayoutDataLength,
138
141
  subHeadCellsWidth: subHeadCellsWidth,
139
- HTMLRenderer: HTMLRenderer
142
+ HTMLRenderer: HTMLRenderer,
143
+ labelAccessor: labelAccessor
140
144
  }),
141
145
  React.createElement(SubHeader, {
142
146
  headerData: headerData,
@@ -145,7 +149,8 @@ var TableHtml5 = function TableHtml5(_ref) {
145
149
  SideIcon: SideIcon,
146
150
  ref: subHeadCellsRef,
147
151
  subHeadCellsWidth: subHeadCellsWidth,
148
- HTMLRenderer: HTMLRenderer
152
+ HTMLRenderer: HTMLRenderer,
153
+ labelAccessor: labelAccessor
149
154
  })
150
155
  ),
151
156
  mapIndexed(function (section, index) {
@@ -163,7 +168,8 @@ var TableHtml5 = function TableHtml5(_ref) {
163
168
  activeCellHandler: activeCellHandler,
164
169
  SideIcon: SideIcon,
165
170
  subHeadCellsWidth: subHeadCellsWidth,
166
- HTMLRenderer: HTMLRenderer
171
+ HTMLRenderer: HTMLRenderer,
172
+ labelAccessor: labelAccessor
167
173
  });
168
174
  }, sectionsData)
169
175
  );
@@ -178,7 +184,8 @@ TableHtml5.propTypes = process.env.NODE_ENV !== "production" ? {
178
184
  activeCellIds: PropTypes.object,
179
185
  SideIcon: PropTypes.func,
180
186
  testId: PropTypes.string,
181
- HTMLRenderer: PropTypes.func
187
+ HTMLRenderer: PropTypes.func,
188
+ labelAccessor: PropTypes.func
182
189
  } : {};
183
190
 
184
191
  export default TableHtml5;
@@ -62,7 +62,8 @@ var Cell = function Cell(_ref) {
62
62
  isHighlight = _ref.isHighlight,
63
63
  sideProps = _ref.sideProps,
64
64
  SideIcon = _ref.SideIcon,
65
- HTMLRenderer = _ref.HTMLRenderer;
65
+ HTMLRenderer = _ref.HTMLRenderer,
66
+ labelAccessor = _ref.labelAccessor;
66
67
 
67
68
  var classes = useStyles();
68
69
  var isRtl = getIsRtl(useTheme());
@@ -93,7 +94,7 @@ var Cell = function Cell(_ref) {
93
94
  tabIndex: 0
94
95
  },
95
96
  !R.isNil(SideIcon) && React.createElement(SideIcon, { sideProps: sideProps, className: classes.value }),
96
- hasFlag && React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags }),
97
+ hasFlag && React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags, labelAccessor: labelAccessor }),
97
98
  uiValue
98
99
  );
99
100
  };
@@ -111,7 +112,8 @@ Cell.propTypes = process.env.NODE_ENV !== "production" ? {
111
112
  activeCellHandler: PropTypes.func,
112
113
  sideProps: PropTypes.object,
113
114
  SideIcon: PropTypes.func,
114
- HTMLRenderer: PropTypes.func
115
+ HTMLRenderer: PropTypes.func,
116
+ labelAccessor: PropTypes.func
115
117
  } : {};
116
118
 
117
119
  export default Cell;
@@ -8,6 +8,7 @@ import { makeStyles } from '@material-ui/core/styles';
8
8
  import Typography from '@material-ui/core/Typography';
9
9
  import Tooltip from '@material-ui/core/Tooltip';
10
10
  import { Asterisk } from '../';
11
+ import { getValue } from './utils';
11
12
 
12
13
  var useStyles = makeStyles(function (theme) {
13
14
  return {
@@ -45,7 +46,8 @@ var Flags = function Flags(_ref) {
45
46
  var _ref$flags = _ref.flags,
46
47
  flags = _ref$flags === undefined ? [] : _ref$flags,
47
48
  isHeader = _ref.isHeader,
48
- HTMLRenderer = _ref.HTMLRenderer;
49
+ HTMLRenderer = _ref.HTMLRenderer,
50
+ labelAccessor = _ref.labelAccessor;
49
51
 
50
52
  var classes = useStyles();
51
53
  var noFlags = R.isNil(flags) || R.isEmpty(flags);
@@ -55,23 +57,27 @@ var Flags = function Flags(_ref) {
55
57
  var codedIcons = R.pipe(R.reduce(function (acc, flag) {
56
58
  return R.when(R.always(R.has('code', flag)), R.append(flag.code))(acc);
57
59
  }, []), R.join(','))(flags);
60
+
61
+ var labels = R.map(function (flag) {
62
+ var value = getValue(labelAccessor)(flag);
63
+ return labelAccessor(flag) + ': ' + value.label;
64
+ }, flags);
58
65
  var content = React.createElement(
59
66
  'ul',
60
67
  { 'data-testid': 'cell-flags-footnotes-content', className: classes.content },
61
- R.addIndex(R.map)(function (_ref2, index) {
62
- var label = _ref2.label;
68
+ R.addIndex(R.map)(function (label, index) {
63
69
  return React.createElement(
64
70
  'li',
65
71
  { key: index },
66
72
  R.is(Function, HTMLRenderer) ? React.createElement(HTMLRenderer, { html: label }) : label
67
73
  );
68
- }, flags)
74
+ }, labels)
69
75
  );
70
76
  return React.createElement(
71
77
  Tooltip,
72
78
  {
73
79
  tabIndex: 0,
74
- 'aria-label': R.pipe(R.pluck('label'), R.join(', '))(flags),
80
+ 'aria-label': R.join(', ', labels),
75
81
  'aria-hidden': false,
76
82
  title: content,
77
83
  placement: 'top'
@@ -96,10 +102,7 @@ var Flags = function Flags(_ref) {
96
102
  React.createElement(
97
103
  Typography,
98
104
  { variant: 'srOnly' },
99
- '* ' + R.addIndex(R.map)(function (_ref3) {
100
- var label = _ref3.label;
101
- return label;
102
- }, flags)
105
+ '* ' + labels
103
106
  )
104
107
  )
105
108
  )
@@ -109,7 +112,8 @@ var Flags = function Flags(_ref) {
109
112
  Flags.propTypes = process.env.NODE_ENV !== "production" ? {
110
113
  flags: PropTypes.array,
111
114
  isHeader: PropTypes.bool,
112
- HTMLRenderer: PropTypes.func
115
+ HTMLRenderer: PropTypes.func,
116
+ labelAccessor: PropTypes.func
113
117
  } : {};
114
118
 
115
119
  export default Flags;
@@ -8,6 +8,7 @@ import TableCell from '@material-ui/core/TableCell';
8
8
  import TableRow from '@material-ui/core/TableRow';
9
9
  import Flags from './flags';
10
10
  import { getIsRtl } from '../utils';
11
+ import { getValue } from './utils';
11
12
 
12
13
  var useStyles = makeStyles(function (theme) {
13
14
  return {
@@ -54,7 +55,8 @@ var Header = function Header(_ref) {
54
55
  valuesHeaderData = _ref.valuesHeaderData,
55
56
  xLayoutDataLength = _ref.xLayoutDataLength,
56
57
  subHeadCellsWidth = _ref.subHeadCellsWidth,
57
- HTMLRenderer = _ref.HTMLRenderer;
58
+ HTMLRenderer = _ref.HTMLRenderer,
59
+ labelAccessor = _ref.labelAccessor;
58
60
 
59
61
  var classes = useStyles();
60
62
  var theme = useTheme();
@@ -91,22 +93,23 @@ var Header = function Header(_ref) {
91
93
  React.createElement(
92
94
  Typography,
93
95
  { variant: 'body1', className: classes.cellLabelHeader },
94
- R.path([0, 'data', index, 'dimension', 'label'], headerData),
95
- React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true })
96
+ R.pipe(R.path([0, 'data', index, 'dimension']), labelAccessor)(headerData),
97
+ React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true, labelAccessor: labelAccessor })
96
98
  )
97
99
  )
98
100
  ),
99
101
  mapIndexed(function (headerItem, idx) {
100
102
  var _cx;
101
103
 
102
- var flags = R.prop('flags', headerItem);
103
- var hierarchySpace = R.pipe(R.pathOr([], ['parents']), R.when(R.isNil, R.always([])), R.length, R.times(function () {
104
+ var value = getValue(labelAccessor)(headerItem);
105
+ var flags = R.propOr([], 'flags', value);
106
+ var hierarchySpace = R.pipe(R.propOr([], 'parents'), R.length, R.times(function () {
104
107
  return '·';
105
- }))(headerItem);
108
+ }))(value);
106
109
  return React.createElement(
107
110
  TableCell,
108
111
  {
109
- key: R.prop('id', headerItem) + '-' + idx,
112
+ key: R.prop('id', value) + '-' + idx,
110
113
  component: 'th',
111
114
  className: cx(classes.tableHeadCell, (_cx = {}, _cx[classes.topCell] = R.not(R.isEmpty(flags)), _cx)),
112
115
  id: idx + '_' + index,
@@ -134,8 +137,8 @@ var Header = function Header(_ref) {
134
137
  },
135
138
  variant: 'body1'
136
139
  },
137
- R.prop('label', headerItem),
138
- React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true })
140
+ R.prop('label', value),
141
+ React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true, labelAccessor: labelAccessor })
139
142
  )
140
143
  )
141
144
  );
@@ -149,7 +152,8 @@ Header.propTypes = process.env.NODE_ENV !== "production" ? {
149
152
  valuesHeaderData: PropTypes.array,
150
153
  xLayoutDataLength: PropTypes.number,
151
154
  subHeadCellsWidth: PropTypes.array,
152
- HTMLRenderer: PropTypes.func
155
+ HTMLRenderer: PropTypes.func,
156
+ labelAccessor: PropTypes.func
153
157
  } : {};
154
158
 
155
159
  export default Header;
@@ -13,6 +13,7 @@ import { isTimePeriodDimension } from '@sis-cc/dotstatsuite-sdmxjs';
13
13
  import SectionHeader from './sectionHeader';
14
14
  import Cell from './cell';
15
15
  import { getLight, getIsRtl } from '../utils';
16
+ import { getValue } from './utils';
16
17
  import Flags from './flags';
17
18
 
18
19
  var useStyles = makeStyles(function (theme) {
@@ -77,7 +78,8 @@ var Section = function Section(_ref) {
77
78
  nbColumnsByRows = _ref.nbColumnsByRows,
78
79
  SideIcon = _ref.SideIcon,
79
80
  subHeadCellsWidth = _ref.subHeadCellsWidth,
80
- HTMLRenderer = _ref.HTMLRenderer;
81
+ HTMLRenderer = _ref.HTMLRenderer,
82
+ labelAccessor = _ref.labelAccessor;
81
83
 
82
84
  var classes = useStyles();
83
85
  var currentSection = R.path([0, 'key'], section);
@@ -96,7 +98,8 @@ var Section = function Section(_ref) {
96
98
  xLayoutDataLength: xLayoutDataLength,
97
99
  headerHeight: headerHeight,
98
100
  SideIcon: SideIcon,
99
- HTMLRenderer: HTMLRenderer
101
+ HTMLRenderer: HTMLRenderer,
102
+ labelAccessor: labelAccessor
100
103
  }),
101
104
  R.addIndex(R.map)(function (sectionbody, rowIndex) {
102
105
  var _cx2;
@@ -111,15 +114,16 @@ var Section = function Section(_ref) {
111
114
  mapIndexed(function (cell, index) {
112
115
  var _cx;
113
116
 
114
- var flags = R.path(['value', 'flags'], cell);
117
+ var value = getValue(labelAccessor)(cell);
118
+ var flags = R.prop('flags', value);
115
119
  var id = rowIndex + '_' + rowId + '_' + index;
116
120
 
117
121
  // special space is used for hierarchy U+2007    
118
- var hierarchySpace = R.pipe(R.pathOr([], ['value', 'parents']), R.when(R.isNil, R.always([])), R.length,
122
+ var hierarchySpace = R.pipe(R.propOr([], 'parents'), R.when(R.isNil, R.always([])), R.length,
119
123
  // eslint-disable-next-line no-irregular-whitespace
120
124
  R.times(function () {
121
125
  return '·  ';
122
- }))(cell);
126
+ }))(value);
123
127
 
124
128
  return React.createElement(
125
129
  TableCell,
@@ -142,8 +146,8 @@ var Section = function Section(_ref) {
142
146
  React.createElement(
143
147
  Typography,
144
148
  { variant: 'body1', tabIndex: 0 },
145
- R.path(['value', 'label'], cell),
146
- React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: flags })
149
+ R.prop('label', value),
150
+ React.createElement(Flags, { HTMLRenderer: HTMLRenderer, labelAccessor: labelAccessor, flags: flags })
147
151
  )
148
152
  )
149
153
  );
@@ -158,7 +162,7 @@ var Section = function Section(_ref) {
158
162
  'div',
159
163
  { className: classes.flagContainer },
160
164
  !R.isNil(SideIcon) && React.createElement(SideIcon, { sideProps: R.prop('sideProps', sectionbody) }),
161
- React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: R.prop('flags', sectionbody) })
165
+ React.createElement(Flags, { HTMLRenderer: HTMLRenderer, labelAccessor: labelAccessor, flags: R.prop('flags', sectionbody) })
162
166
  )
163
167
  ),
164
168
  mapIndexed(function (item, columnIndex) {
@@ -174,6 +178,7 @@ var Section = function Section(_ref) {
174
178
  headers: rowIds + ' ' + columnIds + ' ' + currentSection,
175
179
  cellHandler: cellHandler,
176
180
  HTMLRenderer: HTMLRenderer,
181
+ labelAccessor: labelAccessor,
177
182
  SideIcon: SideIcon,
178
183
  isActive: isActive,
179
184
  isHighlight: R.any(R.identity)([R.prop(rowId)(activeCellIds), R.prop(columnIndex)(activeCellIds)]),
@@ -204,7 +209,8 @@ Section.propTypes = process.env.NODE_ENV !== "production" ? {
204
209
  maxColumns: PropTypes.number,
205
210
  SideIcon: PropTypes.func,
206
211
  subHeadCellsWidth: PropTypes.arrayOf(PropTypes.number),
207
- HTMLRenderer: PropTypes.func
212
+ HTMLRenderer: PropTypes.func,
213
+ labelAccessor: PropTypes.func
208
214
  } : {};
209
215
 
210
216
  export default Section;
@@ -9,6 +9,7 @@ import TableCell from '@material-ui/core/TableCell';
9
9
  import TableRow from '@material-ui/core/TableRow';
10
10
  import Flags from './flags';
11
11
  import { getDark, getIsRtl } from '../utils';
12
+ import { getValue } from './utils';
12
13
 
13
14
  var useStyles = makeStyles(function (theme) {
14
15
  return {
@@ -59,7 +60,8 @@ var SectionHeader = function SectionHeader(_ref) {
59
60
  xLayoutDataLength = _ref.xLayoutDataLength,
60
61
  headerHeight = _ref.headerHeight,
61
62
  SideIcon = _ref.SideIcon,
62
- HTMLRenderer = _ref.HTMLRenderer;
63
+ HTMLRenderer = _ref.HTMLRenderer,
64
+ labelAccessor = _ref.labelAccessor;
63
65
 
64
66
  var classes = useStyles();
65
67
  var theme = useTheme();
@@ -99,6 +101,7 @@ var SectionHeader = function SectionHeader(_ref) {
99
101
  className: cx(classes.stickyHeaderSection, classes.leftLabelPosition, classes.sectionLabelsContainer)
100
102
  },
101
103
  mapIndexed(function (sectionHeader, index) {
104
+ var value = getValue(labelAccessor)(sectionHeader);
102
105
  return React.createElement(
103
106
  Fragment,
104
107
  { key: index },
@@ -114,24 +117,29 @@ var SectionHeader = function SectionHeader(_ref) {
114
117
  'data-testid': 'section-dim',
115
118
  'aria-label': R.path(['dimension', 'id'], sectionHeader)
116
119
  },
117
- R.path(['dimension', 'label'], sectionHeader),
120
+ R.pipe(R.prop('dimension'), labelAccessor)(sectionHeader),
118
121
  ':'
119
122
  ),
120
123
  React.createElement(
121
124
  Typography,
122
125
  { noWrap: true, variant: 'body1', component: 'span', tabIndex: 0 },
123
- R.path(['value', 'label'], sectionHeader)
126
+ R.prop('label', value)
124
127
  ),
125
128
  React.createElement(Flags, {
126
129
  HTMLRenderer: HTMLRenderer,
127
- flags: R.path(['value', 'flags'], sectionHeader)
130
+ labelAccessor: labelAccessor,
131
+ flags: R.prop('flags', value)
128
132
  })
129
133
  );
130
134
  }, R.path([0, 'data'], section)),
131
135
  React.createElement(
132
136
  'span',
133
137
  null,
134
- React.createElement(Flags, { HTMLRenderer: HTMLRenderer, flags: R.path([0, 'flags'], section) })
138
+ React.createElement(Flags, {
139
+ HTMLRenderer: HTMLRenderer,
140
+ flags: R.path([0, 'flags'], section),
141
+ labelAccessor: labelAccessor
142
+ })
135
143
  )
136
144
  )
137
145
  )
@@ -153,7 +161,8 @@ SectionHeader.propTypes = process.env.NODE_ENV !== "production" ? {
153
161
  xLayoutDataLength: PropTypes.number,
154
162
  headerHeight: PropTypes.number,
155
163
  SideIcon: PropTypes.func,
156
- HTMLRenderer: PropTypes.func
164
+ HTMLRenderer: PropTypes.func,
165
+ labelAccessor: PropTypes.func
157
166
  } : {};
158
167
 
159
168
  export default SectionHeader;
@@ -52,7 +52,8 @@ var SubHeader = React.forwardRef(function (_ref, refs) {
52
52
  activeCellIds = _ref.activeCellIds,
53
53
  subHeadCellsWidth = _ref.subHeadCellsWidth,
54
54
  SideIcon = _ref.SideIcon,
55
- HTMLRenderer = _ref.HTMLRenderer;
55
+ HTMLRenderer = _ref.HTMLRenderer,
56
+ labelAccessor = _ref.labelAccessor;
56
57
 
57
58
  var classes = useStyles();
58
59
  var theme = useTheme();
@@ -83,8 +84,9 @@ var SubHeader = React.forwardRef(function (_ref, refs) {
83
84
  React.createElement(
84
85
  Typography,
85
86
  { variant: 'body1', tabIndex: 0, className: classes.label },
86
- R.path(['dimension', 'label'], rowItem),
87
+ R.pipe(R.prop('dimension'), labelAccessor)(rowItem),
87
88
  React.createElement(Flags, {
89
+ labelAccessor: labelAccessor,
88
90
  HTMLRenderer: HTMLRenderer,
89
91
  flags: R.path(['dimension', 'flags'], rowItem)
90
92
  })
@@ -106,7 +108,7 @@ var SubHeader = React.forwardRef(function (_ref, refs) {
106
108
  className: cx(classes.fillerCell, (_cx = {}, _cx[classes.highlight] = R.prop(index)(activeCellIds), _cx))
107
109
  },
108
110
  !R.isNil(SideIcon) && React.createElement(SideIcon, { sideProps: R.prop('sideProps', item) }),
109
- React.createElement(Flags, { flags: R.prop('flags', item) })
111
+ React.createElement(Flags, { flags: R.prop('flags', item), labelAccessor: labelAccessor, HTMLRenderer: HTMLRenderer })
110
112
  );
111
113
  }, headerData)
112
114
  );
@@ -118,7 +120,8 @@ SubHeader.propTypes = process.env.NODE_ENV !== "production" ? {
118
120
  xLayoutData: PropTypes.array,
119
121
  SideIcon: PropTypes.func,
120
122
  subHeadCellsWidth: PropTypes.arrayOf(PropTypes.number),
121
- HTMLRenderer: PropTypes.func
123
+ HTMLRenderer: PropTypes.func,
124
+ labelAccessor: PropTypes.func
122
125
  } : {};
123
126
 
124
127
  export default SubHeader;
@@ -0,0 +1,22 @@
1
+ import * as R from 'ramda';
2
+
3
+ var getLabel = function getLabel(labelAccessor) {
4
+ return function (value) {
5
+ return R.pipe(R.propOr([], 'missingParents'), R.map(labelAccessor), R.append(labelAccessor(value)), R.join(' > '))(value);
6
+ };
7
+ };
8
+
9
+ export var getValue = function getValue(labelAccessor) {
10
+ return function (item) {
11
+ return R.has('values', item) ? R.reduce(function (acc, val) {
12
+ return {
13
+ id: R.isEmpty(acc.id) ? val.id : acc.id + ', ' + val.id,
14
+ label: R.isEmpty(acc.label) ? getLabel(labelAccessor)(val) : acc.label + ', ' + getLabel(labelAccessor)(val),
15
+ flags: R.concat(acc.flags, val.flags || []),
16
+ parents: R.concat(acc.parents, val.parents || [])
17
+ };
18
+ }, { id: '', label: '', flags: [], parents: [] }, R.prop('values', item)) : R.pipe(R.prop('value'), function (val) {
19
+ return R.assoc('label', getLabel(labelAccessor)(val), val);
20
+ })(item);
21
+ };
22
+ };
@@ -152,7 +152,7 @@ var DataHeader = function DataHeader(_ref5) {
152
152
  title = _ref5.title,
153
153
  _ref5$subtitle = _ref5.subtitle,
154
154
  subtitle = _ref5$subtitle === undefined ? [] : _ref5$subtitle,
155
- uprs = _ref5.uprs,
155
+ combinations = _ref5.combinations,
156
156
  disclaimer = _ref5.disclaimer,
157
157
  sideProps = _ref5.sideProps,
158
158
  SideIcon = _ref5.SideIcon,
@@ -168,12 +168,19 @@ var DataHeader = function DataHeader(_ref5) {
168
168
  var isWidthLess = R.lt(width);
169
169
  var classes = useStyles({ isWidthLess: isWidthLess });
170
170
 
171
- var reducedContent = (0, _utils.getReducedContent)({ isWidthLess: isWidthLess, title: title, subtitle: subtitle, uprs: uprs, disclaimer: disclaimer });
171
+ var reducedContent = (0, _utils.getReducedContent)({
172
+ isWidthLess: isWidthLess,
173
+ title: title,
174
+ subtitle: subtitle,
175
+ combinations: combinations,
176
+ disclaimer: disclaimer
177
+ });
172
178
 
173
179
  var theme = (0, _styles.useTheme)();
174
180
  var iconColor = R.path(['mixins', 'dataHeader', 'icon', 'color'], theme);
175
181
 
176
182
  var subtitleLength = R.length(subtitle);
183
+ var combinationsLength = R.length(combinations);
177
184
 
178
185
  return _react2.default.createElement(
179
186
  'div',
@@ -224,11 +231,32 @@ var DataHeader = function DataHeader(_ref5) {
224
231
  );
225
232
  }))(subtitle)
226
233
  ),
227
- isWidthUp(_theme.T4_BREAKPOINTS.xs3) && uprs && _react2.default.createElement(
228
- _Typography2.default,
229
- { className: classes.subtitle, 'data-testid': 'data-header-units' },
230
- _react2.default.createElement(_Title2.default, { header: uprs.header }),
231
- uprs.label
234
+ isWidthUp(_theme.T4_BREAKPOINTS.xs3) && combinations && R.not(R.isEmpty(combinations)) && _react2.default.createElement(
235
+ 'div',
236
+ { className: classes.wrapperSubtitle },
237
+ R.pipe(R.addIndex(R.map)(function (comb, index) {
238
+ return _react2.default.createElement(
239
+ 'div',
240
+ {
241
+ key: 'combination-' + index,
242
+ className: classes.subtitle,
243
+ 'data-testid': 'data-header-combination',
244
+ 'aria-label': comb.header
245
+ },
246
+ _react2.default.createElement(_Title2.default, { header: comb.header }),
247
+ _react2.default.createElement(
248
+ _Typography2.default,
249
+ { variant: 'inherit' },
250
+ comb.label
251
+ ),
252
+ R.not(R.isEmpty(R.propOr([], 'flags', comb))) && _react2.default.createElement(_Flags2.default, { classes: classes, content: R.prop('flags', comb) }),
253
+ R.lt(index + 1, combinationsLength) && _react2.default.createElement(
254
+ 'svg',
255
+ { width: '24', height: '8' },
256
+ _react2.default.createElement('circle', { cx: '12', cy: '4', r: '3', stroke: iconColor, fill: iconColor })
257
+ )
258
+ );
259
+ }))(combinations)
232
260
  ),
233
261
  isWidthUp(_theme.T4_BREAKPOINTS.xs3) && disclaimer && _react2.default.createElement(
234
262
  _Typography2.default,
@@ -271,10 +299,10 @@ DataHeader.propTypes = process.env.NODE_ENV !== "production" ? {
271
299
  }))
272
300
  }))
273
301
  })),
274
- uprs: _propTypes2.default.shape({
302
+ combinations: _propTypes2.default.arrayOf(_propTypes2.default.shape({
275
303
  header: _propTypes2.default.string,
276
304
  label: _propTypes2.default.string
277
- }),
305
+ })),
278
306
  sideProps: _propTypes2.default.object,
279
307
  SideIcon: _propTypes2.default.func,
280
308
  disclaimer: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element]),
@@ -43,13 +43,13 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
43
43
 
44
44
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
45
45
 
46
- /*
47
- * Accessibility.
48
- * Do not use "TableHead" from Material-ui.
49
- * Material-ui, add "scope" attribute for accessibility, "scope" attribute can break screen reader if use with headers.
50
- * Child from TableHead will inherit a "scope" that we don't want. (not possible to turn off)
51
- * We are using "headers" attribute because the table is too complexe to use "scope".
52
- */
46
+ /*
47
+ * Accessibility.
48
+ * Do not use "TableHead" from Material-ui.
49
+ * Material-ui, add "scope" attribute for accessibility, "scope" attribute can break screen reader if use with headers.
50
+ * Child from TableHead will inherit a "scope" that we don't want. (not possible to turn off)
51
+ * We are using "headers" attribute because the table is too complexe to use "scope".
52
+ */
53
53
 
54
54
  var useStyles = (0, _styles.makeStyles)(function (theme) {
55
55
  return {
@@ -74,7 +74,7 @@ var getEnhancedValuesHeaderData = exports.getEnhancedValuesHeaderData = function
74
74
  // mix merge and transpose for performance
75
75
  R.reduce(function (acc, cells) {
76
76
  R.addIndex(R.forEach)(function (cell, rowIndex) {
77
- var cellId = R.path(['value', 'id'], cell);
77
+ var cellId = R.has('values', cell) ? R.pipe(R.prop('values'), R.pluck('id'), R.join(','))(cell) : R.path(['value', 'id'], cell);
78
78
  var topCell = rowIndex > 0 ? R.pipe(R.nth(rowIndex - 1), R.last)(acc) : null;
79
79
  var cellKey = R.isNil(topCell) ? cellId : topCell.key + '-' + cellId;
80
80
 
@@ -82,7 +82,7 @@ var getEnhancedValuesHeaderData = exports.getEnhancedValuesHeaderData = function
82
82
  if (R.prop('key', leftCell) === cellKey && rowIndex !== colLength - 1) {
83
83
  acc = R.over(R.lensIndex(rowIndex), R.over(R.lensIndex(-1), R.evolve({ spanCount: R.add(1) })))(acc);
84
84
  } else {
85
- acc = R.over(R.lensIndex(rowIndex), R.append(_extends({}, R.propOr({}, 'value', cell), { key: cellKey, spanCount: 1 })))(acc);
85
+ acc = R.over(R.lensIndex(rowIndex), R.append(_extends({}, R.pick(['value', 'values'], cell), { key: cellKey, spanCount: 1 })))(acc);
86
86
  }
87
87
  })(cells);
88
88
  return acc;
@@ -105,7 +105,9 @@ var TableHtml5 = function TableHtml5(_ref) {
105
105
  SideIcon = _ref.SideIcon,
106
106
  _ref$testId = _ref.testId,
107
107
  testId = _ref$testId === undefined ? 'vis-table' : _ref$testId,
108
- HTMLRenderer = _ref.HTMLRenderer;
108
+ HTMLRenderer = _ref.HTMLRenderer,
109
+ _ref$labelAccessor = _ref.labelAccessor,
110
+ labelAccessor = _ref$labelAccessor === undefined ? R.prop('name') : _ref$labelAccessor;
109
111
 
110
112
  var classes = useStyles();
111
113
 
@@ -142,7 +144,8 @@ var TableHtml5 = function TableHtml5(_ref) {
142
144
 
143
145
  var isSingleObs = R.hasPath(['', '', '', 0], cells);
144
146
  if (isSingleObs) return _react2.default.createElement(_cell2.default, _extends({
145
- HTMLRenderer: HTMLRenderer
147
+ HTMLRenderer: HTMLRenderer,
148
+ labelAccessor: labelAccessor
146
149
  }, R.pathOr({}, ['', '', '', 0], cells), {
147
150
  cellHandler: cellHandler,
148
151
  isOne: true
@@ -169,7 +172,8 @@ var TableHtml5 = function TableHtml5(_ref) {
169
172
  valuesHeaderData: valuesHeaderData,
170
173
  xLayoutDataLength: xLayoutDataLength,
171
174
  subHeadCellsWidth: subHeadCellsWidth,
172
- HTMLRenderer: HTMLRenderer
175
+ HTMLRenderer: HTMLRenderer,
176
+ labelAccessor: labelAccessor
173
177
  }),
174
178
  _react2.default.createElement(_subHeader2.default, {
175
179
  headerData: headerData,
@@ -178,7 +182,8 @@ var TableHtml5 = function TableHtml5(_ref) {
178
182
  SideIcon: SideIcon,
179
183
  ref: subHeadCellsRef,
180
184
  subHeadCellsWidth: subHeadCellsWidth,
181
- HTMLRenderer: HTMLRenderer
185
+ HTMLRenderer: HTMLRenderer,
186
+ labelAccessor: labelAccessor
182
187
  })
183
188
  ),
184
189
  mapIndexed(function (section, index) {
@@ -196,7 +201,8 @@ var TableHtml5 = function TableHtml5(_ref) {
196
201
  activeCellHandler: activeCellHandler,
197
202
  SideIcon: SideIcon,
198
203
  subHeadCellsWidth: subHeadCellsWidth,
199
- HTMLRenderer: HTMLRenderer
204
+ HTMLRenderer: HTMLRenderer,
205
+ labelAccessor: labelAccessor
200
206
  });
201
207
  }, sectionsData)
202
208
  );
@@ -211,7 +217,8 @@ TableHtml5.propTypes = process.env.NODE_ENV !== "production" ? {
211
217
  activeCellIds: _propTypes2.default.object,
212
218
  SideIcon: _propTypes2.default.func,
213
219
  testId: _propTypes2.default.string,
214
- HTMLRenderer: _propTypes2.default.func
220
+ HTMLRenderer: _propTypes2.default.func,
221
+ labelAccessor: _propTypes2.default.func
215
222
  } : {};
216
223
 
217
224
  exports.default = TableHtml5;
@@ -92,7 +92,8 @@ var Cell = function Cell(_ref) {
92
92
  isHighlight = _ref.isHighlight,
93
93
  sideProps = _ref.sideProps,
94
94
  SideIcon = _ref.SideIcon,
95
- HTMLRenderer = _ref.HTMLRenderer;
95
+ HTMLRenderer = _ref.HTMLRenderer,
96
+ labelAccessor = _ref.labelAccessor;
96
97
 
97
98
  var classes = useStyles();
98
99
  var isRtl = (0, _utils.getIsRtl)((0, _styles.useTheme)());
@@ -123,7 +124,7 @@ var Cell = function Cell(_ref) {
123
124
  tabIndex: 0
124
125
  },
125
126
  !R.isNil(SideIcon) && _react2.default.createElement(SideIcon, { sideProps: sideProps, className: classes.value }),
126
- hasFlag && _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags }),
127
+ hasFlag && _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags, labelAccessor: labelAccessor }),
127
128
  uiValue
128
129
  );
129
130
  };
@@ -141,7 +142,8 @@ Cell.propTypes = process.env.NODE_ENV !== "production" ? {
141
142
  activeCellHandler: _propTypes2.default.func,
142
143
  sideProps: _propTypes2.default.object,
143
144
  SideIcon: _propTypes2.default.func,
144
- HTMLRenderer: _propTypes2.default.func
145
+ HTMLRenderer: _propTypes2.default.func,
146
+ labelAccessor: _propTypes2.default.func
145
147
  } : {};
146
148
 
147
149
  exports.default = Cell;
@@ -32,6 +32,8 @@ var _Tooltip2 = _interopRequireDefault(_Tooltip);
32
32
 
33
33
  var _ = require('../');
34
34
 
35
+ var _utils = require('./utils');
36
+
35
37
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
36
38
 
37
39
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -72,7 +74,8 @@ var Flags = function Flags(_ref) {
72
74
  var _ref$flags = _ref.flags,
73
75
  flags = _ref$flags === undefined ? [] : _ref$flags,
74
76
  isHeader = _ref.isHeader,
75
- HTMLRenderer = _ref.HTMLRenderer;
77
+ HTMLRenderer = _ref.HTMLRenderer,
78
+ labelAccessor = _ref.labelAccessor;
76
79
 
77
80
  var classes = useStyles();
78
81
  var noFlags = R.isNil(flags) || R.isEmpty(flags);
@@ -82,23 +85,27 @@ var Flags = function Flags(_ref) {
82
85
  var codedIcons = R.pipe(R.reduce(function (acc, flag) {
83
86
  return R.when(R.always(R.has('code', flag)), R.append(flag.code))(acc);
84
87
  }, []), R.join(','))(flags);
88
+
89
+ var labels = R.map(function (flag) {
90
+ var value = (0, _utils.getValue)(labelAccessor)(flag);
91
+ return labelAccessor(flag) + ': ' + value.label;
92
+ }, flags);
85
93
  var content = _react2.default.createElement(
86
94
  'ul',
87
95
  { 'data-testid': 'cell-flags-footnotes-content', className: classes.content },
88
- R.addIndex(R.map)(function (_ref2, index) {
89
- var label = _ref2.label;
96
+ R.addIndex(R.map)(function (label, index) {
90
97
  return _react2.default.createElement(
91
98
  'li',
92
99
  { key: index },
93
100
  R.is(Function, HTMLRenderer) ? _react2.default.createElement(HTMLRenderer, { html: label }) : label
94
101
  );
95
- }, flags)
102
+ }, labels)
96
103
  );
97
104
  return _react2.default.createElement(
98
105
  _Tooltip2.default,
99
106
  {
100
107
  tabIndex: 0,
101
- 'aria-label': R.pipe(R.pluck('label'), R.join(', '))(flags),
108
+ 'aria-label': R.join(', ', labels),
102
109
  'aria-hidden': false,
103
110
  title: content,
104
111
  placement: 'top'
@@ -123,10 +130,7 @@ var Flags = function Flags(_ref) {
123
130
  _react2.default.createElement(
124
131
  _Typography2.default,
125
132
  { variant: 'srOnly' },
126
- '* ' + R.addIndex(R.map)(function (_ref3) {
127
- var label = _ref3.label;
128
- return label;
129
- }, flags)
133
+ '* ' + labels
130
134
  )
131
135
  )
132
136
  )
@@ -136,7 +140,8 @@ var Flags = function Flags(_ref) {
136
140
  Flags.propTypes = process.env.NODE_ENV !== "production" ? {
137
141
  flags: _propTypes2.default.array,
138
142
  isHeader: _propTypes2.default.bool,
139
- HTMLRenderer: _propTypes2.default.func
143
+ HTMLRenderer: _propTypes2.default.func,
144
+ labelAccessor: _propTypes2.default.func
140
145
  } : {};
141
146
 
142
147
  exports.default = Flags;
@@ -38,6 +38,8 @@ var _flags2 = _interopRequireDefault(_flags);
38
38
 
39
39
  var _utils = require('../utils');
40
40
 
41
+ var _utils2 = require('./utils');
42
+
41
43
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
42
44
 
43
45
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -87,7 +89,8 @@ var Header = function Header(_ref) {
87
89
  valuesHeaderData = _ref.valuesHeaderData,
88
90
  xLayoutDataLength = _ref.xLayoutDataLength,
89
91
  subHeadCellsWidth = _ref.subHeadCellsWidth,
90
- HTMLRenderer = _ref.HTMLRenderer;
92
+ HTMLRenderer = _ref.HTMLRenderer,
93
+ labelAccessor = _ref.labelAccessor;
91
94
 
92
95
  var classes = useStyles();
93
96
  var theme = (0, _styles.useTheme)();
@@ -124,22 +127,23 @@ var Header = function Header(_ref) {
124
127
  _react2.default.createElement(
125
128
  _Typography2.default,
126
129
  { variant: 'body1', className: classes.cellLabelHeader },
127
- R.path([0, 'data', index, 'dimension', 'label'], headerData),
128
- _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true })
130
+ R.pipe(R.path([0, 'data', index, 'dimension']), labelAccessor)(headerData),
131
+ _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true, labelAccessor: labelAccessor })
129
132
  )
130
133
  )
131
134
  ),
132
135
  mapIndexed(function (headerItem, idx) {
133
136
  var _cx;
134
137
 
135
- var flags = R.prop('flags', headerItem);
136
- var hierarchySpace = R.pipe(R.pathOr([], ['parents']), R.when(R.isNil, R.always([])), R.length, R.times(function () {
138
+ var value = (0, _utils2.getValue)(labelAccessor)(headerItem);
139
+ var flags = R.propOr([], 'flags', value);
140
+ var hierarchySpace = R.pipe(R.propOr([], 'parents'), R.length, R.times(function () {
137
141
  return '·';
138
- }))(headerItem);
142
+ }))(value);
139
143
  return _react2.default.createElement(
140
144
  _TableCell2.default,
141
145
  {
142
- key: R.prop('id', headerItem) + '-' + idx,
146
+ key: R.prop('id', value) + '-' + idx,
143
147
  component: 'th',
144
148
  className: (0, _classnames2.default)(classes.tableHeadCell, (_cx = {}, _cx[classes.topCell] = R.not(R.isEmpty(flags)), _cx)),
145
149
  id: idx + '_' + index,
@@ -167,8 +171,8 @@ var Header = function Header(_ref) {
167
171
  },
168
172
  variant: 'body1'
169
173
  },
170
- R.prop('label', headerItem),
171
- _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true })
174
+ R.prop('label', value),
175
+ _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags, isHeader: true, labelAccessor: labelAccessor })
172
176
  )
173
177
  )
174
178
  );
@@ -182,7 +186,8 @@ Header.propTypes = process.env.NODE_ENV !== "production" ? {
182
186
  valuesHeaderData: _propTypes2.default.array,
183
187
  xLayoutDataLength: _propTypes2.default.number,
184
188
  subHeadCellsWidth: _propTypes2.default.array,
185
- HTMLRenderer: _propTypes2.default.func
189
+ HTMLRenderer: _propTypes2.default.func,
190
+ labelAccessor: _propTypes2.default.func
186
191
  } : {};
187
192
 
188
193
  exports.default = Header;
@@ -50,6 +50,8 @@ var _cell2 = _interopRequireDefault(_cell);
50
50
 
51
51
  var _utils = require('../utils');
52
52
 
53
+ var _utils2 = require('./utils');
54
+
53
55
  var _flags = require('./flags');
54
56
 
55
57
  var _flags2 = _interopRequireDefault(_flags);
@@ -120,7 +122,8 @@ var Section = function Section(_ref) {
120
122
  nbColumnsByRows = _ref.nbColumnsByRows,
121
123
  SideIcon = _ref.SideIcon,
122
124
  subHeadCellsWidth = _ref.subHeadCellsWidth,
123
- HTMLRenderer = _ref.HTMLRenderer;
125
+ HTMLRenderer = _ref.HTMLRenderer,
126
+ labelAccessor = _ref.labelAccessor;
124
127
 
125
128
  var classes = useStyles();
126
129
  var currentSection = R.path([0, 'key'], section);
@@ -139,7 +142,8 @@ var Section = function Section(_ref) {
139
142
  xLayoutDataLength: xLayoutDataLength,
140
143
  headerHeight: headerHeight,
141
144
  SideIcon: SideIcon,
142
- HTMLRenderer: HTMLRenderer
145
+ HTMLRenderer: HTMLRenderer,
146
+ labelAccessor: labelAccessor
143
147
  }),
144
148
  R.addIndex(R.map)(function (sectionbody, rowIndex) {
145
149
  var _cx2;
@@ -154,15 +158,16 @@ var Section = function Section(_ref) {
154
158
  mapIndexed(function (cell, index) {
155
159
  var _cx;
156
160
 
157
- var flags = R.path(['value', 'flags'], cell);
161
+ var value = (0, _utils2.getValue)(labelAccessor)(cell);
162
+ var flags = R.prop('flags', value);
158
163
  var id = rowIndex + '_' + rowId + '_' + index;
159
164
 
160
165
  // special space is used for hierarchy U+2007    
161
- var hierarchySpace = R.pipe(R.pathOr([], ['value', 'parents']), R.when(R.isNil, R.always([])), R.length,
166
+ var hierarchySpace = R.pipe(R.propOr([], 'parents'), R.when(R.isNil, R.always([])), R.length,
162
167
  // eslint-disable-next-line no-irregular-whitespace
163
168
  R.times(function () {
164
169
  return '·  ';
165
- }))(cell);
170
+ }))(value);
166
171
 
167
172
  return _react2.default.createElement(
168
173
  _TableCell2.default,
@@ -185,8 +190,8 @@ var Section = function Section(_ref) {
185
190
  _react2.default.createElement(
186
191
  _Typography2.default,
187
192
  { variant: 'body1', tabIndex: 0 },
188
- R.path(['value', 'label'], cell),
189
- _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: flags })
193
+ R.prop('label', value),
194
+ _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, labelAccessor: labelAccessor, flags: flags })
190
195
  )
191
196
  )
192
197
  );
@@ -201,7 +206,7 @@ var Section = function Section(_ref) {
201
206
  'div',
202
207
  { className: classes.flagContainer },
203
208
  !R.isNil(SideIcon) && _react2.default.createElement(SideIcon, { sideProps: R.prop('sideProps', sectionbody) }),
204
- _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: R.prop('flags', sectionbody) })
209
+ _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, labelAccessor: labelAccessor, flags: R.prop('flags', sectionbody) })
205
210
  )
206
211
  ),
207
212
  mapIndexed(function (item, columnIndex) {
@@ -217,6 +222,7 @@ var Section = function Section(_ref) {
217
222
  headers: rowIds + ' ' + columnIds + ' ' + currentSection,
218
223
  cellHandler: cellHandler,
219
224
  HTMLRenderer: HTMLRenderer,
225
+ labelAccessor: labelAccessor,
220
226
  SideIcon: SideIcon,
221
227
  isActive: isActive,
222
228
  isHighlight: R.any(R.identity)([R.prop(rowId)(activeCellIds), R.prop(columnIndex)(activeCellIds)]),
@@ -247,7 +253,8 @@ Section.propTypes = process.env.NODE_ENV !== "production" ? {
247
253
  maxColumns: _propTypes2.default.number,
248
254
  SideIcon: _propTypes2.default.func,
249
255
  subHeadCellsWidth: _propTypes2.default.arrayOf(_propTypes2.default.number),
250
- HTMLRenderer: _propTypes2.default.func
256
+ HTMLRenderer: _propTypes2.default.func,
257
+ labelAccessor: _propTypes2.default.func
251
258
  } : {};
252
259
 
253
260
  exports.default = Section;
@@ -42,6 +42,8 @@ var _flags2 = _interopRequireDefault(_flags);
42
42
 
43
43
  var _utils = require('../utils');
44
44
 
45
+ var _utils2 = require('./utils');
46
+
45
47
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
46
48
 
47
49
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -95,7 +97,8 @@ var SectionHeader = function SectionHeader(_ref) {
95
97
  xLayoutDataLength = _ref.xLayoutDataLength,
96
98
  headerHeight = _ref.headerHeight,
97
99
  SideIcon = _ref.SideIcon,
98
- HTMLRenderer = _ref.HTMLRenderer;
100
+ HTMLRenderer = _ref.HTMLRenderer,
101
+ labelAccessor = _ref.labelAccessor;
99
102
 
100
103
  var classes = useStyles();
101
104
  var theme = (0, _styles.useTheme)();
@@ -135,6 +138,7 @@ var SectionHeader = function SectionHeader(_ref) {
135
138
  className: (0, _classnames2.default)(classes.stickyHeaderSection, classes.leftLabelPosition, classes.sectionLabelsContainer)
136
139
  },
137
140
  mapIndexed(function (sectionHeader, index) {
141
+ var value = (0, _utils2.getValue)(labelAccessor)(sectionHeader);
138
142
  return _react2.default.createElement(
139
143
  _react.Fragment,
140
144
  { key: index },
@@ -150,24 +154,29 @@ var SectionHeader = function SectionHeader(_ref) {
150
154
  'data-testid': 'section-dim',
151
155
  'aria-label': R.path(['dimension', 'id'], sectionHeader)
152
156
  },
153
- R.path(['dimension', 'label'], sectionHeader),
157
+ R.pipe(R.prop('dimension'), labelAccessor)(sectionHeader),
154
158
  ':'
155
159
  ),
156
160
  _react2.default.createElement(
157
161
  _Typography2.default,
158
162
  { noWrap: true, variant: 'body1', component: 'span', tabIndex: 0 },
159
- R.path(['value', 'label'], sectionHeader)
163
+ R.prop('label', value)
160
164
  ),
161
165
  _react2.default.createElement(_flags2.default, {
162
166
  HTMLRenderer: HTMLRenderer,
163
- flags: R.path(['value', 'flags'], sectionHeader)
167
+ labelAccessor: labelAccessor,
168
+ flags: R.prop('flags', value)
164
169
  })
165
170
  );
166
171
  }, R.path([0, 'data'], section)),
167
172
  _react2.default.createElement(
168
173
  'span',
169
174
  null,
170
- _react2.default.createElement(_flags2.default, { HTMLRenderer: HTMLRenderer, flags: R.path([0, 'flags'], section) })
175
+ _react2.default.createElement(_flags2.default, {
176
+ HTMLRenderer: HTMLRenderer,
177
+ flags: R.path([0, 'flags'], section),
178
+ labelAccessor: labelAccessor
179
+ })
171
180
  )
172
181
  )
173
182
  )
@@ -189,7 +198,8 @@ SectionHeader.propTypes = process.env.NODE_ENV !== "production" ? {
189
198
  xLayoutDataLength: _propTypes2.default.number,
190
199
  headerHeight: _propTypes2.default.number,
191
200
  SideIcon: _propTypes2.default.func,
192
- HTMLRenderer: _propTypes2.default.func
201
+ HTMLRenderer: _propTypes2.default.func,
202
+ labelAccessor: _propTypes2.default.func
193
203
  } : {};
194
204
 
195
205
  exports.default = SectionHeader;
@@ -85,7 +85,8 @@ var SubHeader = _react2.default.forwardRef(function (_ref, refs) {
85
85
  activeCellIds = _ref.activeCellIds,
86
86
  subHeadCellsWidth = _ref.subHeadCellsWidth,
87
87
  SideIcon = _ref.SideIcon,
88
- HTMLRenderer = _ref.HTMLRenderer;
88
+ HTMLRenderer = _ref.HTMLRenderer,
89
+ labelAccessor = _ref.labelAccessor;
89
90
 
90
91
  var classes = useStyles();
91
92
  var theme = (0, _styles.useTheme)();
@@ -116,8 +117,9 @@ var SubHeader = _react2.default.forwardRef(function (_ref, refs) {
116
117
  _react2.default.createElement(
117
118
  _Typography2.default,
118
119
  { variant: 'body1', tabIndex: 0, className: classes.label },
119
- R.path(['dimension', 'label'], rowItem),
120
+ R.pipe(R.prop('dimension'), labelAccessor)(rowItem),
120
121
  _react2.default.createElement(_flags2.default, {
122
+ labelAccessor: labelAccessor,
121
123
  HTMLRenderer: HTMLRenderer,
122
124
  flags: R.path(['dimension', 'flags'], rowItem)
123
125
  })
@@ -139,7 +141,7 @@ var SubHeader = _react2.default.forwardRef(function (_ref, refs) {
139
141
  className: (0, _classnames2.default)(classes.fillerCell, (_cx = {}, _cx[classes.highlight] = R.prop(index)(activeCellIds), _cx))
140
142
  },
141
143
  !R.isNil(SideIcon) && _react2.default.createElement(SideIcon, { sideProps: R.prop('sideProps', item) }),
142
- _react2.default.createElement(_flags2.default, { flags: R.prop('flags', item) })
144
+ _react2.default.createElement(_flags2.default, { flags: R.prop('flags', item), labelAccessor: labelAccessor, HTMLRenderer: HTMLRenderer })
143
145
  );
144
146
  }, headerData)
145
147
  );
@@ -151,7 +153,8 @@ SubHeader.propTypes = process.env.NODE_ENV !== "production" ? {
151
153
  xLayoutData: _propTypes2.default.array,
152
154
  SideIcon: _propTypes2.default.func,
153
155
  subHeadCellsWidth: _propTypes2.default.arrayOf(_propTypes2.default.number),
154
- HTMLRenderer: _propTypes2.default.func
156
+ HTMLRenderer: _propTypes2.default.func,
157
+ labelAccessor: _propTypes2.default.func
155
158
  } : {};
156
159
 
157
160
  exports.default = SubHeader;
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ exports.__esModule = true;
4
+ exports.getValue = undefined;
5
+
6
+ var _ramda = require('ramda');
7
+
8
+ var R = _interopRequireWildcard(_ramda);
9
+
10
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
11
+
12
+ var getLabel = function getLabel(labelAccessor) {
13
+ return function (value) {
14
+ return R.pipe(R.propOr([], 'missingParents'), R.map(labelAccessor), R.append(labelAccessor(value)), R.join(' > '))(value);
15
+ };
16
+ };
17
+
18
+ var getValue = exports.getValue = function getValue(labelAccessor) {
19
+ return function (item) {
20
+ return R.has('values', item) ? R.reduce(function (acc, val) {
21
+ return {
22
+ id: R.isEmpty(acc.id) ? val.id : acc.id + ', ' + val.id,
23
+ label: R.isEmpty(acc.label) ? getLabel(labelAccessor)(val) : acc.label + ', ' + getLabel(labelAccessor)(val),
24
+ flags: R.concat(acc.flags, val.flags || []),
25
+ parents: R.concat(acc.parents, val.parents || [])
26
+ };
27
+ }, { id: '', label: '', flags: [], parents: [] }, R.prop('values', item)) : R.pipe(R.prop('value'), function (val) {
28
+ return R.assoc('label', getLabel(labelAccessor)(val), val);
29
+ })(item);
30
+ };
31
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sis-cc/dotstatsuite-visions",
3
- "version": "7.23.0",
3
+ "version": "8.0.0",
4
4
  "description": "Library of visual components",
5
5
  "author": "OECD",
6
6
  "homepage": "https://visions-qa.siscc.org/#o",