linear-react-components-ui 0.4.76-rc.7 → 0.4.76

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.
Files changed (90) hide show
  1. package/.husky/pre-commit +2 -2
  2. package/README.md +19 -7
  3. package/lib/assets/styles/button.scss +19 -10
  4. package/lib/assets/styles/checkbox.scss +92 -70
  5. package/lib/assets/styles/commons.scss +36 -0
  6. package/lib/assets/styles/drawers.scss +22 -6
  7. package/lib/assets/styles/dropdown.scss +3 -0
  8. package/lib/assets/styles/effects.scss +20 -0
  9. package/lib/assets/styles/gridlayout.scss +2 -1
  10. package/lib/assets/styles/input.scss +21 -0
  11. package/lib/assets/styles/label.scss +9 -1
  12. package/lib/assets/styles/list.scss +8 -0
  13. package/lib/assets/styles/panel.scss +4 -1
  14. package/lib/assets/styles/radio.scss +19 -0
  15. package/lib/assets/styles/select.scss +3 -3
  16. package/lib/assets/styles/sidenav.scss +11 -1
  17. package/lib/assets/styles/skeleton.scss +48 -0
  18. package/lib/assets/styles/table.scss +17 -5
  19. package/lib/assets/styles/tabs.scss +51 -44
  20. package/lib/assets/styles/treeview.scss +9 -0
  21. package/lib/assets/styles/uitour.scss +112 -0
  22. package/lib/buttons/DefaultButton.js +7 -4
  23. package/lib/buttons/split_button/index.js +8 -4
  24. package/lib/checkbox/Label.js +1 -1
  25. package/lib/checkbox/checkbox.spec.js +16 -16
  26. package/lib/checkbox/index.js +16 -9
  27. package/lib/dialog/form/index.js +10 -3
  28. package/lib/drawer/Drawer.js +9 -5
  29. package/lib/drawer/Header.js +15 -5
  30. package/lib/dropdown/Popup.js +3 -2
  31. package/lib/form/FieldNumber.js +1 -1
  32. package/lib/form/FieldPeriod.js +1 -1
  33. package/lib/form/form.spec.js +8 -0
  34. package/lib/form/helpers.js +12 -1
  35. package/lib/form/index.js +61 -47
  36. package/lib/form/withFieldHOC.js +3 -1
  37. package/lib/icons/helper.js +8 -0
  38. package/lib/inputs/base/InputTextBase.js +40 -6
  39. package/lib/inputs/base/helpers.js +15 -3
  40. package/lib/inputs/date/Dropdown.js +3 -3
  41. package/lib/inputs/date/date.spec.js +46 -36
  42. package/lib/inputs/date/helpers.js +36 -0
  43. package/lib/inputs/date/index.js +12 -10
  44. package/lib/inputs/mask/Phone.js +10 -1
  45. package/lib/inputs/mask/imaskHOC.js +2 -1
  46. package/lib/inputs/mask/input_mask.spec.js +21 -4
  47. package/lib/inputs/search/index.js +2 -0
  48. package/lib/inputs/select/Dropdown.js +51 -61
  49. package/lib/inputs/select/helper.js +65 -2
  50. package/lib/inputs/select/multiple/index.js +8 -5
  51. package/lib/inputs/select/simple/index.js +9 -6
  52. package/lib/internals/constants.js +4 -3
  53. package/lib/internals/withTooltip.js +14 -11
  54. package/lib/labels/DefaultLabel.js +7 -4
  55. package/lib/list/Item.js +35 -9
  56. package/lib/list/helpers.js +8 -3
  57. package/lib/list/index.js +161 -13
  58. package/lib/list/list.spec.js +259 -102
  59. package/lib/menus/sidenav/NavMenuItem.js +17 -8
  60. package/lib/menus/sidenav/index.js +53 -84
  61. package/lib/menus/sidenav/popup_menu_search/index.js +25 -16
  62. package/lib/menus/sidenav/sidenav.spec.js +86 -19
  63. package/lib/panel/Header.js +4 -3
  64. package/lib/radio/index.js +9 -6
  65. package/lib/skeleton/SkeletonContainer.js +42 -0
  66. package/lib/skeleton/index.js +84 -0
  67. package/lib/table/Body.js +55 -11
  68. package/lib/table/Header.js +14 -1
  69. package/lib/table/HeaderColumn.js +26 -3
  70. package/lib/table/Row.js +18 -7
  71. package/lib/table/RowColumn.js +23 -3
  72. package/lib/table/helpers.js +11 -1
  73. package/lib/table/index.js +41 -8
  74. package/lib/tabs/Menu.js +1 -11
  75. package/lib/tabs/MenuItems.js +9 -3
  76. package/lib/tabs/index.js +78 -53
  77. package/lib/tabs/tabs.spec.js +8 -5
  78. package/lib/toolbar/ButtonBar.js +30 -24
  79. package/lib/toolbar/LabelBar.js +22 -27
  80. package/lib/toolbar/helpers.js +12 -0
  81. package/lib/toolbar/index.js +23 -12
  82. package/lib/tooltip/index.js +8 -7
  83. package/lib/treeview/Node.js +248 -203
  84. package/lib/treeview/index.js +40 -20
  85. package/lib/treeview/treeview.spec.js +18 -0
  86. package/lib/uitour/helpers.js +15 -0
  87. package/lib/uitour/index.js +271 -0
  88. package/lib/uitour/uitour.spec.js +176 -0
  89. package/package.json +1 -1
  90. package/.DS_Store +0 -0
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getFilteredMultipleDataCombo = exports.getFilteredSimpleDataCombo = exports.getDropdownItemCssClass = exports.contentClass = void 0;
6
+ exports.returnDropdownDynamicStyles = exports.getFilteredMultipleDataCombo = exports.getFilteredSimpleDataCombo = exports.getDropdownItemCssClass = exports.contentClass = void 0;
7
7
 
8
8
  var contentClass = function contentClass(props) {
9
9
  return "content ".concat(props.showClearButton ? '' : 'noclear');
@@ -42,4 +42,67 @@ var getFilteredMultipleDataCombo = function getFilteredMultipleDataCombo(_ref2)
42
42
  });
43
43
  };
44
44
 
45
- exports.getFilteredMultipleDataCombo = getFilteredMultipleDataCombo;
45
+ exports.getFilteredMultipleDataCombo = getFilteredMultipleDataCombo;
46
+
47
+ var returnDropdownPosition = function returnDropdownPosition(_ref3) {
48
+ var selectFieldRects = _ref3.selectFieldRects,
49
+ dropdownRef = _ref3.dropdownRef,
50
+ dropdownRects = _ref3.dropdownRects;
51
+ var aboveDropdown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
52
+ var DEFAULT_MARGIN_BOTTOM = 10;
53
+
54
+ if (aboveDropdown) {
55
+ return selectFieldRects.top + window.scrollY - (dropdownRef.current && dropdownRects.height) - DEFAULT_MARGIN_BOTTOM;
56
+ }
57
+
58
+ return selectFieldRects.top + window.scrollY + selectFieldRects.height;
59
+ };
60
+
61
+ var returnDropdownDynamicStyles = function returnDropdownDynamicStyles(_ref4) {
62
+ var selectFieldRef = _ref4.selectFieldRef,
63
+ dropdownMaxHeight = _ref4.dropdownMaxHeight,
64
+ dropdownRef = _ref4.dropdownRef;
65
+ var selectFieldRects = selectFieldRef.current.getBoundingClientRect();
66
+ var dropdownRects = dropdownRef.current && dropdownRef.current.getBoundingClientRect();
67
+ var dropdownBottomDistance = window.innerHeight - selectFieldRects.bottom;
68
+ var bottomOffset = 30;
69
+ var maxDropdownBottomDistance = 200;
70
+ var height = dropdownMaxHeight;
71
+ var dropdownPosition;
72
+
73
+ if (!height || height <= 0) {
74
+ if (dropdownBottomDistance < maxDropdownBottomDistance) {
75
+ height = selectFieldRects.top;
76
+ dropdownPosition = returnDropdownPosition({
77
+ selectFieldRects: selectFieldRects,
78
+ dropdownRef: dropdownRef,
79
+ dropdownRects: dropdownRects
80
+ }, true);
81
+ } else {
82
+ height = dropdownBottomDistance;
83
+ dropdownPosition = returnDropdownPosition({
84
+ selectFieldRects: selectFieldRects
85
+ });
86
+ }
87
+ } else {
88
+ maxDropdownBottomDistance = height;
89
+
90
+ if (dropdownBottomDistance < maxDropdownBottomDistance) {
91
+ dropdownPosition = returnDropdownPosition({
92
+ selectFieldRects: selectFieldRects,
93
+ dropdownRef: dropdownRef,
94
+ dropdownRects: dropdownRects
95
+ }, true);
96
+ } else {
97
+ dropdownPosition = returnDropdownPosition(selectFieldRects);
98
+ }
99
+ }
100
+
101
+ return {
102
+ maxHeight: height - bottomOffset,
103
+ top: dropdownPosition,
104
+ left: selectFieldRects.left
105
+ };
106
+ };
107
+
108
+ exports.returnDropdownDynamicStyles = returnDropdownDynamicStyles;
@@ -83,6 +83,7 @@ var MultipleSelect = /*#__PURE__*/function (_Component) {
83
83
 
84
84
  _this.componentId = "select-component".concat(_uuid["default"].v1());
85
85
  _this.componentRef = /*#__PURE__*/_react["default"].createRef();
86
+ _this.dropdownRef = /*#__PURE__*/_react["default"].createRef();
86
87
  _this.state = {
87
88
  valueFromProps: null,
88
89
  dataCombo: props.dataSource,
@@ -142,10 +143,11 @@ var MultipleSelect = /*#__PURE__*/function (_Component) {
142
143
  }, {
143
144
  key: "onClickOutside",
144
145
  value: function onClickOutside(event) {
145
- var selectWrapper = this.selectWrapper;
146
+ var selectWrapper = this.selectWrapper,
147
+ dropdownRef = this.dropdownRef;
146
148
  var target = event.target;
147
149
 
148
- if (target !== selectWrapper && !selectWrapper.contains(target)) {
150
+ if (target !== selectWrapper && !selectWrapper.contains(target) && dropdownRef.current && !dropdownRef.current.contains(target)) {
149
151
  this.setState({
150
152
  opened: false
151
153
  });
@@ -270,12 +272,12 @@ var MultipleSelect = /*#__PURE__*/function (_Component) {
270
272
 
271
273
  if (e.keyCode === constants.keyCodes.ENTER) {
272
274
  this.onSelect(selected);
273
- } else if ([constants.keyCodes.ARROW_DOWN, constants.keyCodes.ARROW_UP].includes(e.keyCode)) {
275
+ } else if ([constants.keyCodes.ARROW_UP, constants.keyCodes.ARROW_DOWN].includes(e.keyCode)) {
274
276
  var index = dataSource.findIndex(function (d) {
275
277
  return d === selected;
276
278
  });
277
279
 
278
- if (e.keyCode === constants.keyCodes.ARROW_UP) {
280
+ if (e.keyCode === constants.keyCodes.ARROW_DOWN) {
279
281
  index = index === dataSource.length - 1 ? 0 : index + 1;
280
282
  } else {
281
283
  index = index === 0 ? dataSource.length - 1 : index - 1;
@@ -363,6 +365,7 @@ var MultipleSelect = /*#__PURE__*/function (_Component) {
363
365
  handleOnUnselect: this.onUnselect
364
366
  }))), opened && /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], _extends({}, this.state, this.props, {
365
367
  selectFieldRef: this.componentRef,
368
+ dropdownRef: this.dropdownRef,
366
369
  gridWrapperStyle: gridLayout ? window.getComputedStyle(this.gridEl) : undefined,
367
370
  handleOnSelect: this.onSelect,
368
371
  handleOnFilter: this.onFilter,
@@ -397,7 +400,7 @@ Object.defineProperty(MultipleSelect, "getDerivedStateFromProps", {
397
400
  var dataCombo = remoteSearch ? dataSource : (0, _helper.getFilteredMultipleDataCombo)(_extends({}, props, state));
398
401
  return {
399
402
  dataCombo: dataCombo,
400
- selected: dataSource.length > 0 && remoteSearch ? dataSource[0] : null
403
+ selected: dataCombo.length > 0 ? dataCombo[0] : null
401
404
  };
402
405
  }
403
406
 
@@ -78,6 +78,7 @@ var SimpleSelect = /*#__PURE__*/function (_Component) {
78
78
  onDenied: undefined,
79
79
  isTyping: false
80
80
  };
81
+ _this.dropdownRef = /*#__PURE__*/_react["default"].createRef();
81
82
  _this.componentId = "select-component".concat(_uuid["default"].v1());
82
83
  _this.componentRef = /*#__PURE__*/_react["default"].createRef();
83
84
  return _this;
@@ -152,6 +153,7 @@ var SimpleSelect = /*#__PURE__*/function (_Component) {
152
153
  }))
153
154
  })), opened && /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], _extends({}, this.state, this.props, {
154
155
  selectFieldRef: this.componentRef,
156
+ dropdownRef: this.dropdownRef,
155
157
  gridWrapperStyle: gridLayout ? window.getComputedStyle(this.gridEl) : undefined,
156
158
  handleOnSelect: this.onSelect,
157
159
  handleOnFilter: this.onFilter,
@@ -172,14 +174,14 @@ Object.defineProperty(SimpleSelect, "getDerivedStateFromProps", {
172
174
  value: function value(props, state) {
173
175
  var value = props.value,
174
176
  dataSource = props.dataSource,
177
+ descriptionKey = props.descriptionKey,
175
178
  idKey = props.idKey,
176
179
  selectFirstOnEnter = props.selectFirstOnEnter,
177
- descriptionKey = props.descriptionKey,
178
180
  remoteSearch = props.remoteSearch,
179
181
  undigitable = props.undigitable;
180
182
  var current = null;
181
183
 
182
- if (value !== state.valueFromProps) {
184
+ if (value !== state.valueFromProps && dataSource.length > 0) {
183
185
  if (value !== null) {
184
186
  current = dataSource.find(function (i) {
185
187
  return i[idKey].toString().toLowerCase() === value.toString().toLowerCase();
@@ -227,10 +229,11 @@ var _initialiseProps = function _initialiseProps() {
227
229
  enumerable: true,
228
230
  writable: true,
229
231
  value: function value(event) {
230
- var selectWrapper = _this3.selectWrapper;
232
+ var selectWrapper = _this3.selectWrapper,
233
+ dropdownRef = _this3.dropdownRef;
231
234
  var target = event.target;
232
235
 
233
- if (target !== selectWrapper && !selectWrapper.contains(target)) {
236
+ if (target !== selectWrapper && !selectWrapper.contains(target) && dropdownRef.current && !dropdownRef.current.contains(target)) {
234
237
  _this3.setState({
235
238
  opened: false
236
239
  });
@@ -385,12 +388,12 @@ var _initialiseProps = function _initialiseProps() {
385
388
  e.preventDefault();
386
389
 
387
390
  _this3.onSelect(selected);
388
- } else if ([constants.keyCodes.ARROW_DOWN, constants.keyCodes.ARROW_UP].includes(e.keyCode)) {
391
+ } else if ([constants.keyCodes.ARROW_UP, constants.keyCodes.ARROW_DOWN].includes(e.keyCode)) {
389
392
  var index = dataSource.findIndex(function (d) {
390
393
  return d[idKey] === selected[idKey];
391
394
  });
392
395
 
393
- if (e.keyCode === constants.keyCodes.ARROW_UP) {
396
+ if (e.keyCode === constants.keyCodes.ARROW_DOWN) {
394
397
  index = index === dataSource.length - 1 ? 0 : index + 1;
395
398
  } else {
396
399
  index = index === 0 ? dataSource.length - 1 : index - 1;
@@ -7,9 +7,10 @@ exports.PARA_ENGANAR_O_ESLINT_JA_QUE_TENHO_SO_UMA_CONSTANTE = exports.keyCodes =
7
7
  var keyCodes = {
8
8
  TAB: 9,
9
9
  ENTER: 13,
10
- ARROW_UP: 40,
11
- ARROW_DOWN: 38,
12
- BACKSPACE: 8
10
+ ARROW_UP: 38,
11
+ ARROW_DOWN: 40,
12
+ BACKSPACE: 8,
13
+ F: 70
13
14
  };
14
15
  exports.keyCodes = keyCodes;
15
16
  var PARA_ENGANAR_O_ESLINT_JA_QUE_TENHO_SO_UMA_CONSTANTE = 1;
@@ -73,10 +73,11 @@ var withTooltip = function withTooltip(WrappedComponent) {
73
73
  tooltipDimensions = _useState8[0],
74
74
  setTooltipDimensions = _useState8[1];
75
75
 
76
- var targetElement = (0, _react.useRef)();
76
+ var targetElement = (0, _react.useRef)(null);
77
+ var tooltipElement = (0, _react.useRef)(null);
77
78
 
78
79
  var onMouseOver = function onMouseOver(e) {
79
- if (targetElement.current.contains(e.target)) {
80
+ if (targetElement && targetElement.current && targetElement.current.contains(e.target)) {
80
81
  setShowTooltip(true);
81
82
  } else setShowTooltip(false);
82
83
  };
@@ -111,14 +112,15 @@ var withTooltip = function withTooltip(WrappedComponent) {
111
112
  };
112
113
  }, []);
113
114
  (0, _react.useEffect)(function () {
114
- if (targetElement.current) {
115
+ if (targetElement.current && tooltipElement.current) {
115
116
  var width = tooltipDimensions.width,
116
117
  height = tooltipDimensions.height;
117
118
  var targetDimensions = targetElement.current.getBoundingClientRect();
118
119
  var targetVerticalCenter = (targetDimensions.top + targetDimensions.bottom) / 2;
119
- var style = "width: ".concat(width, "px");
120
- var left = targetDimensions.left + targetDimensions.width / 2 - width / 2;
121
- left = Math.min(left, document.body.clientWidth - width - space);
120
+ var tooltipClientWidth = tooltipElement.current.clientWidth;
121
+ var style = "width: ".concat(typeof width === 'string' ? width : "".concat(width, "px"));
122
+ var left = targetDimensions.left + targetDimensions.width / 2 - tooltipClientWidth / 2;
123
+ left = Math.min(left, document.body.clientWidth - tooltipClientWidth - space);
122
124
  style += "; left: ".concat(Math.max(space, left), "px");
123
125
 
124
126
  switch (tooltipPosition) {
@@ -141,17 +143,17 @@ var withTooltip = function withTooltip(WrappedComponent) {
141
143
  break;
142
144
 
143
145
  case 'left':
144
- if (targetDimensions.left < width) {
146
+ if (targetDimensions.left < tooltipClientWidth) {
145
147
  setTooltipPosition('right');
146
148
  } else {
147
149
  style += "; top: ".concat(targetVerticalCenter + window.scrollY - height / 2, "px");
148
- style += "; left: ".concat(targetDimensions.left - width - 6, "px");
150
+ style += "; left: ".concat(targetDimensions.left - tooltipClientWidth - 6, "px");
149
151
  }
150
152
 
151
153
  break;
152
154
 
153
155
  case 'right':
154
- if (window.innerWidth - targetDimensions.right < width) {
156
+ if (window.innerWidth - targetDimensions.right < tooltipClientWidth) {
155
157
  setTooltipPosition('left');
156
158
  } else {
157
159
  style += "; top: ".concat(targetVerticalCenter + window.scrollY - height / 2, "px");
@@ -166,7 +168,7 @@ var withTooltip = function withTooltip(WrappedComponent) {
166
168
 
167
169
  setTooltipStyle(style);
168
170
  }
169
- }, [tooltipDimensions, targetElement.current, tooltipPosition]);
171
+ }, [tooltipDimensions, tooltipElement.current, targetElement.current, tooltipPosition]);
170
172
  (0, _react.useEffect)(function () {
171
173
  setTooltipPosition(props.tooltipPosition);
172
174
  }, [window.scrollY, window.scrollX, window.innerWidth]);
@@ -175,6 +177,7 @@ var withTooltip = function withTooltip(WrappedComponent) {
175
177
  if (tooltip) {
176
178
  return /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
177
179
  text: tooltip,
180
+ tooltipRef: tooltipElement,
178
181
  style: tooltipStyle,
179
182
  className: tooltipPosition,
180
183
  tooltipDimensions: tooltipDimensions,
@@ -202,7 +205,7 @@ var withTooltip = function withTooltip(WrappedComponent) {
202
205
  tooltipPosition: _propTypes["default"].string
203
206
  };
204
207
  EnhancedComponent.defaultProps = {
205
- tooltipWidth: undefined,
208
+ tooltipWidth: 'auto',
206
209
  space: 20,
207
210
  tooltip: '',
208
211
  tooltipPosition: 'bottom'
@@ -48,7 +48,8 @@ var DefaultLabel = function DefaultLabel(props) {
48
48
  size = props.size,
49
49
  iconAlign = props.iconAlign,
50
50
  bordered = props.bordered,
51
- permissionAttr = props.permissionAttr;
51
+ permissionAttr = props.permissionAttr,
52
+ skeletonize = props.skeletonize;
52
53
  var options = [_permissionValidations.OPTIONS_ON_DENIED.unvisible];
53
54
 
54
55
  var _useState = (0, _react.useState)((0, _permissionValidations.actionsOnPermissionDenied)(permissionAttr, options)),
@@ -56,7 +57,7 @@ var DefaultLabel = function DefaultLabel(props) {
56
57
  onDenied = _useState2[0];
57
58
 
58
59
  var getClass = function getClass() {
59
- return "label-component ".concat(className, " ").concat(customClass, " ").concat(bordered && '-bordered', " ").concat(disabled && '-disabled', " \n ").concat(size && "-".concat(size), "\n ").concat(iconAlign && "icon-".concat(iconAlign));
60
+ return "label-component ".concat(className, " ").concat(customClass, " ").concat(bordered ? '-bordered' : '', " ").concat(disabled ? '-disabled' : '', "\n ").concat(skeletonize ? '-skeletonized' : '', "\n ").concat(size ? "-".concat(size) : '', "\n ").concat(iconAlign ? "icon-".concat(iconAlign) : '');
60
61
  };
61
62
 
62
63
  var getIcon = function getIcon() {
@@ -94,7 +95,8 @@ DefaultLabel.defaultProps = {
94
95
  style: {},
95
96
  visible: true,
96
97
  disabled: false,
97
- permissionAttr: undefined
98
+ permissionAttr: undefined,
99
+ skeletonize: false
98
100
  };
99
101
  DefaultLabel.propTypes = {
100
102
  customClass: _propTypes["default"].string,
@@ -109,7 +111,8 @@ DefaultLabel.propTypes = {
109
111
  style: _propTypes["default"].object,
110
112
  visible: _propTypes["default"].bool,
111
113
  disabled: _propTypes["default"].bool,
112
- permissionAttr: _propTypes["default"].oneOfType([_propTypes["default"].object, _propTypes["default"].arrayOf(_propTypes["default"].object)])
114
+ permissionAttr: _propTypes["default"].oneOfType([_propTypes["default"].object, _propTypes["default"].arrayOf(_propTypes["default"].object)]),
115
+ skeletonize: _propTypes["default"].bool
113
116
  };
114
117
 
115
118
  var _default = (0, _withTooltip["default"])(DefaultLabel);
package/lib/list/Item.js CHANGED
@@ -17,10 +17,12 @@ var _icons = _interopRequireDefault(require("../icons"));
17
17
 
18
18
  var _checkbox = _interopRequireDefault(require("../checkbox"));
19
19
 
20
- var _helpers = _interopRequireDefault(require("./helpers"));
20
+ var _helpers = require("./helpers");
21
21
 
22
22
  var _withDropdown = require("../dropdown/withDropdown");
23
23
 
24
+ var constants = _interopRequireWildcard(require("../internals/constants"));
25
+
24
26
  var _permissionValidations = require("../permissionValidations");
25
27
 
26
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
@@ -44,7 +46,7 @@ function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "und
44
46
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
45
47
 
46
48
  var Item = function Item(props) {
47
- var _onClick = props.onClick,
49
+ var onClick = props.onClick,
48
50
  leftIconName = props.leftIconName,
49
51
  leftIcon = props.leftIcon,
50
52
  displayCheckbox = props.displayCheckbox,
@@ -65,10 +67,13 @@ var Item = function Item(props) {
65
67
  visible = props.visible,
66
68
  permissionAttr = props.permissionAttr;
67
69
 
68
- var _useContext = (0, _react.useContext)(_helpers["default"]),
70
+ var _useContext = (0, _react.useContext)(_helpers.ListContext),
69
71
  handleSelectItem = _useContext.handleSelectItem,
70
72
  selectable = _useContext.selectable,
71
- selectedItemId = _useContext.selectedItemId;
73
+ selectedItemId = _useContext.selectedItemId,
74
+ selectedItemRef = _useContext.selectedItemRef,
75
+ skeletonize = _useContext.skeletonize,
76
+ selectOnEnter = _useContext.selectOnEnter;
72
77
 
73
78
  var dropdownContext = (0, _react.useContext)(_withDropdown.WithDropdownContext);
74
79
  var options = [_permissionValidations.OPTIONS_ON_DENIED.disabled, _permissionValidations.OPTIONS_ON_DENIED.unvisible];
@@ -77,6 +82,8 @@ var Item = function Item(props) {
77
82
  _useState2 = _slicedToArray(_useState, 1),
78
83
  onDenied = _useState2[0];
79
84
 
85
+ var history = (0, _reactRouterDom.useHistory)();
86
+
80
87
  var shouldDisable = function shouldDisable() {
81
88
  return disabled || onDenied.disabled;
82
89
  };
@@ -97,23 +104,42 @@ var Item = function Item(props) {
97
104
  return null;
98
105
  };
99
106
 
107
+ var handleOnSelectItem = function handleOnSelectItem(e) {
108
+ if (onClick !== undefined) onClick(e, itemId);
109
+ if (dropdownContext) dropdownContext.handleDropdownClose();
110
+ if (selectable) handleSelectItem(itemId, onClick);
111
+ };
112
+
113
+ var onKeyDown = (0, _react.useCallback)(function (e) {
114
+ if ([constants.keyCodes.ENTER].includes(e.keyCode) && !skeletonize) {
115
+ e.preventDefault();
116
+ handleOnSelectItem(e);
117
+ if (url) history.push(url);
118
+ }
119
+ }, [url]);
120
+
100
121
  var getProps = function getProps() {
101
122
  if (shouldDisable()) return undefined;
102
- if (_onClick === undefined && dropdownContext === undefined && !selectable) return null;
123
+ if (onClick === undefined && dropdownContext === undefined && !selectable) return null;
103
124
  return {
104
125
  onClick: function onClick(e) {
105
- if (_onClick !== undefined) _onClick(e, itemId);
106
- if (dropdownContext) dropdownContext.handleDropdownClose();
107
- if (selectable) handleSelectItem(itemId, _onClick);
126
+ handleOnSelectItem(e);
108
127
  },
109
- onKeyDown: null,
110
128
  role: 'button',
129
+ onKeyDown: selectOnEnter && onKeyDown,
111
130
  tabIndex: '0'
112
131
  };
113
132
  };
114
133
 
134
+ (0, _react.useEffect)(function () {
135
+ if (selectOnEnter) document.addEventListener('keydown', onKeyDown);
136
+ return function () {
137
+ document.removeEventListener('keydown', onKeyDown);
138
+ };
139
+ }, []);
115
140
  if (!visible || onDenied.unvisible) return null;
116
141
  return /*#__PURE__*/_react["default"].createElement("li", _extends({
142
+ ref: itemId && selectedItemId === itemId ? selectedItemRef : null,
117
143
  style: style,
118
144
  className: "item-container ".concat(hovered && 'hovered', "\n ").concat(itemId && selectedItemId === itemId ? '-activedlist' : '')
119
145
  }, getProps(), {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports["default"] = void 0;
6
+ exports.LIST_ITEMS_TYPES = exports.ListContext = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
@@ -11,5 +11,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
11
11
 
12
12
  var ListContext = /*#__PURE__*/_react["default"].createContext();
13
13
 
14
- var _default = ListContext;
15
- exports["default"] = _default;
14
+ exports.ListContext = ListContext;
15
+ var LIST_ITEMS_TYPES = {
16
+ listHeader: 'Header',
17
+ listItem: 'Item',
18
+ listSeparator: 'Separator'
19
+ };
20
+ exports.LIST_ITEMS_TYPES = LIST_ITEMS_TYPES;
package/lib/list/index.js CHANGED
@@ -33,11 +33,15 @@ var _Header = _interopRequireDefault(require("./Header"));
33
33
 
34
34
  var _Item = _interopRequireDefault(require("./Item"));
35
35
 
36
+ var constants = _interopRequireWildcard(require("../internals/constants"));
37
+
38
+ var _skeleton = _interopRequireDefault(require("../skeleton"));
39
+
36
40
  var _Separator = _interopRequireDefault(require("./Separator"));
37
41
 
38
42
  require("../assets/styles/list.scss");
39
43
 
40
- var _helpers = _interopRequireDefault(require("./helpers"));
44
+ var _helpers = require("./helpers");
41
45
 
42
46
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
43
47
 
@@ -58,37 +62,173 @@ function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "und
58
62
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
59
63
 
60
64
  var List = function List(props) {
61
- var children = props.children,
62
- customClass = props.customClass,
65
+ var customClass = props.customClass,
63
66
  condensed = props.condensed,
64
67
  transparent = props.transparent,
65
68
  style = props.style,
66
69
  selectable = props.selectable,
67
- onSelectItem = props.onSelectItem;
70
+ onSelectItem = props.onSelectItem,
71
+ skeletonize = props.skeletonize,
72
+ skeletonItens = props.skeletonItens,
73
+ skeletonHeight = props.skeletonHeight,
74
+ children = props.children,
75
+ selectOnEnter = props.selectOnEnter;
76
+ var selectedItemRef = (0, _react.useRef)(null);
77
+ var listRef = (0, _react.useRef)(null);
68
78
 
69
79
  var _useState = (0, _react.useState)(''),
70
80
  _useState2 = _slicedToArray(_useState, 2),
71
81
  selectedItemId = _useState2[0],
72
82
  setSelectedItemId = _useState2[1];
73
83
 
84
+ var _useState3 = (0, _react.useState)([]),
85
+ _useState4 = _slicedToArray(_useState3, 2),
86
+ itensId = _useState4[0],
87
+ setItensId = _useState4[1];
88
+
89
+ var _useState5 = (0, _react.useState)(children),
90
+ _useState6 = _slicedToArray(_useState5, 2),
91
+ newChildren = _useState6[0],
92
+ setNewChildren = _useState6[1];
93
+
74
94
  var contextValues = {
75
95
  selectable: selectable,
76
96
  selectedItemId: selectedItemId,
77
- handleSelectItem: function handleSelectItem(selectedId, onClick) {
78
- if (!onSelectItem && onClick) setSelectedItemId(selectedId);
79
- if (onSelectItem) onSelectItem(selectedId);
97
+ selectedItemRef: selectedItemRef,
98
+ selectOnEnter: selectOnEnter,
99
+ children: children,
100
+ skeletonize: skeletonize,
101
+ handleSelectItem: function handleSelectItem(itemId, onClick) {
102
+ if (!onSelectItem && onClick) setSelectedItemId(itemId);
103
+ if (onSelectItem) onSelectItem(itemId);
80
104
  }
81
105
  };
106
+
107
+ var onKeyDown = function onKeyDown(e) {
108
+ if ([constants.keyCodes.ARROW_DOWN, constants.keyCodes.ARROW_UP].includes(e.keyCode) && !skeletonize) {
109
+ e.preventDefault();
110
+
111
+ if (e.keyCode === constants.keyCodes.ARROW_DOWN) {
112
+ if (selectedItemId === itensId[itensId.length - 1]) {
113
+ setSelectedItemId(itensId[0]);
114
+ } else {
115
+ var index = itensId.indexOf(selectedItemId === '' ? '0' : selectedItemId);
116
+ setSelectedItemId(itensId[index + 1]);
117
+ }
118
+ } else if (e.keyCode === constants.keyCodes.ARROW_UP) {
119
+ if (selectedItemId === itensId[0]) {
120
+ setSelectedItemId(itensId[itensId.length - 1]);
121
+ } else {
122
+ var _index = itensId.indexOf(selectedItemId);
123
+
124
+ setSelectedItemId(itensId[_index - 1]);
125
+ }
126
+ }
127
+
128
+ return selectedItemRef.current && selectedItemRef.current.focus();
129
+ }
130
+
131
+ return null;
132
+ };
133
+
134
+ var getSkeleton = function getSkeleton() {
135
+ var length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
136
+ var maxSkeletonsItensExceeded = 2;
137
+ var skeletonItensCount = length > skeletonItens ? maxSkeletonsItensExceeded : Math.floor(skeletonItens / length);
138
+ var skeletonItensList = Array.from(Array(skeletonItensCount).keys());
139
+ return /*#__PURE__*/_react["default"].createElement("div", {
140
+ className: "skeleton-transparency"
141
+ }, skeletonItensList.map(function (id) {
142
+ return /*#__PURE__*/_react["default"].createElement(_Item["default"], {
143
+ key: id,
144
+ hovered: false,
145
+ style: {
146
+ pointerEvents: 'none'
147
+ }
148
+ }, /*#__PURE__*/_react["default"].createElement(_skeleton["default"], {
149
+ height: skeletonHeight,
150
+ style: {
151
+ margin: '6px 0'
152
+ }
153
+ }));
154
+ }));
155
+ };
156
+
157
+ var getNewChildren = function getNewChildren(headersChildren) {
158
+ return headersChildren.length > 0 ? headersChildren.map(function (item) {
159
+ return /*#__PURE__*/_react["default"].createElement(_react.Fragment, {
160
+ key: item.props.title
161
+ }, item, getSkeleton(headersChildren.length));
162
+ }) : /*#__PURE__*/_react["default"].createElement(_react.Fragment, null, headersChildren, getSkeleton());
163
+ };
164
+
165
+ (0, _react.useEffect)(function () {
166
+ if (selectedItemRef.current && listRef.current && listRef.current.scroll) {
167
+ var selectedItemRect = selectedItemRef.current.getBoundingClientRect();
168
+ var listRect = listRef.current.getBoundingClientRect();
169
+ var defaultScrollTop = 0;
170
+ var defaultBottomOffset = 100;
171
+
172
+ if (selectedItemRect.top - selectedItemRect.height > listRect.bottom) {
173
+ listRef.current.scroll({
174
+ top: selectedItemRect.top
175
+ });
176
+ } else if (selectedItemRect.top + selectedItemRect.height - listRect.y >= listRect.height) {
177
+ listRef.current.scroll({
178
+ top: listRef.current.scrollTop + selectedItemRect.height
179
+ });
180
+ } else if (selectedItemRect.bottom < defaultBottomOffset) {
181
+ listRef.current.scroll({
182
+ top: defaultScrollTop
183
+ });
184
+ } else {
185
+ listRef.current.scroll({
186
+ top: listRef.current.scrollTop - selectedItemRect.height
187
+ });
188
+ }
189
+ }
190
+ }, [selectedItemRef.current]);
191
+ (0, _react.useEffect)(function () {
192
+ if (!skeletonize) document.addEventListener('keydown', onKeyDown);
193
+ return function () {
194
+ document.removeEventListener('keydown', onKeyDown);
195
+ };
196
+ }, [skeletonize, selectedItemId, itensId]);
82
197
  (0, _react.useEffect)(function () {
83
- if (onSelectItem && props.selectedItemId) setSelectedItemId(props.selectedItemId);
198
+ if (onSelectItem && props.selectedItemId) {
199
+ setSelectedItemId(props.selectedItemId);
200
+ if (selectedItemRef.current) selectedItemRef.current.focus();
201
+ }
84
202
  }, [props.selectedItemId]);
85
- return /*#__PURE__*/_react["default"].createElement(_helpers["default"].Provider, {
203
+ (0, _react.useEffect)(function () {
204
+ var newItensIds = children.length > 0 ? children.map(function (item) {
205
+ return item.props && item.props.itemId;
206
+ }).filter(Boolean) : [children.props.itemId];
207
+ setItensId(newItensIds);
208
+ }, [children]);
209
+ (0, _react.useEffect)(function () {
210
+ if (skeletonize) {
211
+ var headersChildren = children.type && children.type === _helpers.LIST_ITEMS_TYPES.listHeader && children;
212
+
213
+ if (children.length > 0) {
214
+ headersChildren = children.filter(function (item) {
215
+ return item.type && item.type.name === _helpers.LIST_ITEMS_TYPES.listHeader;
216
+ });
217
+ }
218
+
219
+ setNewChildren(getNewChildren(headersChildren));
220
+ } else {
221
+ setNewChildren(children);
222
+ }
223
+ }, [skeletonize, children]);
224
+ return /*#__PURE__*/_react["default"].createElement(_helpers.ListContext.Provider, {
86
225
  value: contextValues
87
226
  }, /*#__PURE__*/_react["default"].createElement("ul", {
88
227
  "data-testid": "list-component",
89
228
  style: style,
90
- className: "list-component ".concat(condensed && '-condensed', " ").concat(customClass, " ").concat(!transparent && '-listbackground')
91
- }, children));
229
+ ref: listRef,
230
+ className: "list-component ".concat(condensed && '-condensed', "\n ").concat(customClass, " ").concat(!transparent && '-listbackground')
231
+ }, newChildren));
92
232
  };
93
233
 
94
234
  List.propTypes = {
@@ -99,7 +239,11 @@ List.propTypes = {
99
239
  selectable: _propTypes["default"].bool,
100
240
  style: _propTypes["default"].object,
101
241
  onSelectItem: _propTypes["default"].func,
102
- selectedItemId: _propTypes["default"].string
242
+ selectedItemId: _propTypes["default"].string,
243
+ skeletonize: _propTypes["default"].bool,
244
+ skeletonItens: _propTypes["default"].number,
245
+ skeletonHeight: _propTypes["default"].number,
246
+ selectOnEnter: _propTypes["default"].bool
103
247
  };
104
248
  List.defaultProps = {
105
249
  customClass: '',
@@ -108,7 +252,11 @@ List.defaultProps = {
108
252
  selectable: false,
109
253
  style: {},
110
254
  onSelectItem: undefined,
111
- selectedItemId: ''
255
+ selectedItemId: '',
256
+ skeletonize: false,
257
+ skeletonItens: 5,
258
+ skeletonHeight: 48,
259
+ selectOnEnter: false
112
260
  };
113
261
  var _default = List;
114
262
  exports["default"] = _default;