linear-react-components-ui 0.4.76-beta.31 → 0.4.76-beta.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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,169 @@ 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
+ var selectedItemRef = (0, _react.useRef)(null);
76
+ var listRef = (0, _react.useRef)(null);
68
77
 
69
78
  var _useState = (0, _react.useState)(''),
70
79
  _useState2 = _slicedToArray(_useState, 2),
71
80
  selectedItemId = _useState2[0],
72
81
  setSelectedItemId = _useState2[1];
73
82
 
83
+ var _useState3 = (0, _react.useState)([]),
84
+ _useState4 = _slicedToArray(_useState3, 2),
85
+ itensId = _useState4[0],
86
+ setItensId = _useState4[1];
87
+
88
+ var _useState5 = (0, _react.useState)(children),
89
+ _useState6 = _slicedToArray(_useState5, 2),
90
+ newChildren = _useState6[0],
91
+ setNewChildren = _useState6[1];
92
+
74
93
  var contextValues = {
75
94
  selectable: selectable,
76
95
  selectedItemId: selectedItemId,
77
- handleSelectItem: function handleSelectItem(selectedId, onClick) {
78
- if (!onSelectItem && onClick) setSelectedItemId(selectedId);
79
- if (onSelectItem) onSelectItem(selectedId);
96
+ selectedItemRef: selectedItemRef,
97
+ children: children,
98
+ skeletonize: skeletonize,
99
+ handleSelectItem: function handleSelectItem(itemId, onClick) {
100
+ if (!onSelectItem && onClick) setSelectedItemId(itemId);
101
+ if (onSelectItem) onSelectItem(itemId);
80
102
  }
81
103
  };
104
+
105
+ var onKeyDown = function onKeyDown(e) {
106
+ if ([constants.keyCodes.ARROW_DOWN, constants.keyCodes.ARROW_UP].includes(e.keyCode) && !skeletonize) {
107
+ e.preventDefault();
108
+
109
+ if (e.keyCode === constants.keyCodes.ARROW_DOWN) {
110
+ if (selectedItemId === itensId[itensId.length - 1]) {
111
+ setSelectedItemId(itensId[0]);
112
+ } else {
113
+ var index = itensId.indexOf(selectedItemId === '' ? '0' : selectedItemId);
114
+ setSelectedItemId(itensId[index + 1]);
115
+ }
116
+ } else if (e.keyCode === constants.keyCodes.ARROW_UP) {
117
+ if (selectedItemId === itensId[0]) {
118
+ setSelectedItemId(itensId[itensId.length - 1]);
119
+ } else {
120
+ var _index = itensId.indexOf(selectedItemId);
121
+
122
+ setSelectedItemId(itensId[_index - 1]);
123
+ }
124
+ }
125
+
126
+ return selectedItemRef.current && selectedItemRef.current.focus();
127
+ }
128
+
129
+ return null;
130
+ };
131
+
132
+ (0, _react.useEffect)(function () {
133
+ if (selectedItemRef.current && listRef.current && listRef.current.scroll) {
134
+ var selectedItemRect = selectedItemRef.current.getBoundingClientRect();
135
+ var listRect = listRef.current.getBoundingClientRect();
136
+ var defaultScrollTop = 0;
137
+ var defaultBottomOffset = 100;
138
+
139
+ if (selectedItemRect.top - selectedItemRect.height > listRect.bottom) {
140
+ listRef.current.scroll({
141
+ top: selectedItemRect.top
142
+ });
143
+ } else if (selectedItemRect.top + selectedItemRect.height - listRect.y >= listRect.height) {
144
+ listRef.current.scroll({
145
+ top: listRef.current.scrollTop + selectedItemRect.height
146
+ });
147
+ } else if (selectedItemRect.bottom < defaultBottomOffset) {
148
+ listRef.current.scroll({
149
+ top: defaultScrollTop
150
+ });
151
+ } else {
152
+ listRef.current.scroll({
153
+ top: listRef.current.scrollTop - selectedItemRect.height
154
+ });
155
+ }
156
+ }
157
+ }, [selectedItemRef.current]);
158
+ (0, _react.useEffect)(function () {
159
+ document.addEventListener('keydown', onKeyDown);
160
+ return function () {
161
+ document.removeEventListener('keydown', onKeyDown);
162
+ };
163
+ }, [skeletonize]);
82
164
  (0, _react.useEffect)(function () {
83
165
  if (onSelectItem && props.selectedItemId) setSelectedItemId(props.selectedItemId);
84
166
  }, [props.selectedItemId]);
85
- return /*#__PURE__*/_react["default"].createElement(_helpers["default"].Provider, {
167
+ (0, _react.useEffect)(function () {
168
+ var newItensIds = children.length > 0 ? children.map(function (item) {
169
+ return item.props && item.props.itemId;
170
+ }).filter(Boolean) : [children.props.itemId];
171
+ setItensId(newItensIds);
172
+ }, [children.length]);
173
+
174
+ var getSkeleton = function getSkeleton() {
175
+ var length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
176
+ var maxSkeletonsItensExceeded = 2;
177
+ var skeletonItensCount = length > skeletonItens ? maxSkeletonsItensExceeded : Math.floor(skeletonItens / length);
178
+ var skeletonItensList = Array.from(Array(skeletonItensCount).keys());
179
+ return /*#__PURE__*/_react["default"].createElement("div", {
180
+ className: "skeleton-transparency"
181
+ }, skeletonItensList.map(function (id) {
182
+ return /*#__PURE__*/_react["default"].createElement(_Item["default"], {
183
+ key: id,
184
+ hovered: false,
185
+ style: {
186
+ pointerEvents: 'none'
187
+ }
188
+ }, /*#__PURE__*/_react["default"].createElement(_skeleton["default"], {
189
+ height: skeletonHeight,
190
+ style: {
191
+ margin: '6px 0'
192
+ }
193
+ }));
194
+ }));
195
+ };
196
+
197
+ var getNewChildren = function getNewChildren(headersChildren) {
198
+ return headersChildren.length > 0 ? headersChildren.map(function (item) {
199
+ return /*#__PURE__*/_react["default"].createElement(_react.Fragment, {
200
+ key: item.props.title
201
+ }, item, getSkeleton(headersChildren.length));
202
+ }) : /*#__PURE__*/_react["default"].createElement(_react.Fragment, null, headersChildren, getSkeleton());
203
+ };
204
+
205
+ (0, _react.useEffect)(function () {
206
+ if (skeletonize) {
207
+ var headersChildren = children.type && children.type === _helpers.LIST_ITEMS_TYPES.listHeader && children;
208
+
209
+ if (children.length > 0) {
210
+ headersChildren = children.filter(function (item) {
211
+ return item.type && item.type.name === _helpers.LIST_ITEMS_TYPES.listHeader;
212
+ });
213
+ }
214
+
215
+ setNewChildren(getNewChildren(headersChildren));
216
+ } else {
217
+ setNewChildren(children);
218
+ }
219
+ }, [skeletonize, children.length]);
220
+ return /*#__PURE__*/_react["default"].createElement(_helpers.ListContext.Provider, {
86
221
  value: contextValues
87
222
  }, /*#__PURE__*/_react["default"].createElement("ul", {
88
223
  "data-testid": "list-component",
89
224
  style: style,
90
- className: "list-component ".concat(condensed && '-condensed', " ").concat(customClass, " ").concat(!transparent && '-listbackground')
91
- }, children));
225
+ ref: listRef,
226
+ className: "list-component ".concat(condensed && '-condensed', "\n ").concat(customClass, " ").concat(!transparent && '-listbackground')
227
+ }, newChildren));
92
228
  };
93
229
 
94
230
  List.propTypes = {
@@ -99,7 +235,10 @@ List.propTypes = {
99
235
  selectable: _propTypes["default"].bool,
100
236
  style: _propTypes["default"].object,
101
237
  onSelectItem: _propTypes["default"].func,
102
- selectedItemId: _propTypes["default"].string
238
+ selectedItemId: _propTypes["default"].string,
239
+ skeletonize: _propTypes["default"].bool,
240
+ skeletonItens: _propTypes["default"].number,
241
+ skeletonHeight: _propTypes["default"].number
103
242
  };
104
243
  List.defaultProps = {
105
244
  customClass: '',
@@ -108,7 +247,10 @@ List.defaultProps = {
108
247
  selectable: false,
109
248
  style: {},
110
249
  onSelectItem: undefined,
111
- selectedItemId: ''
250
+ selectedItemId: '',
251
+ skeletonize: false,
252
+ skeletonItens: 5,
253
+ skeletonHeight: 48
112
254
  };
113
255
  var _default = List;
114
256
  exports["default"] = _default;