@hipay/hipay-material-ui 2.0.0-beta.60 → 2.0.0-beta.62

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/HiDatePicker/HiDatePicker.js +37 -12
  3. package/HiDatePicker/HiDateRangePicker.js +71 -57
  4. package/HiDatePicker/HiDateRangeSelector.js +34 -20
  5. package/HiDatePicker/stylesheet.js +32 -17
  6. package/HiSelect/HiSelect.js +489 -607
  7. package/HiSelect/index.js +41 -3
  8. package/HiSelectableList/HiSelectableList.js +68 -3
  9. package/HiSelectableList/HiSelectableListItem.js +22 -10
  10. package/README.md +15 -0
  11. package/es/HiDatePicker/HiDatePicker.js +30 -10
  12. package/es/HiDatePicker/HiDateRangePicker.js +38 -21
  13. package/es/HiDatePicker/HiDateRangeSelector.js +24 -13
  14. package/es/HiDatePicker/stylesheet.js +32 -17
  15. package/es/{HiSelectNew → HiSelect}/HiNestedSelect.js +1 -1
  16. package/es/{HiSelectNew → HiSelect}/HiNestedSelectContent.js +1 -1
  17. package/es/HiSelect/HiSelect.js +441 -564
  18. package/es/{HiSelectNew → HiSelect}/HiSelectContent.js +1 -1
  19. package/es/HiSelect/index.js +4 -1
  20. package/es/HiSelectableList/HiSelectableList.js +65 -4
  21. package/es/HiSelectableList/HiSelectableListItem.js +18 -10
  22. package/es/styles/createPalette.js +1 -1
  23. package/es/utils/helpers.js +9 -1
  24. package/index.es.js +1 -1
  25. package/index.js +1 -1
  26. package/package.json +1 -1
  27. package/styles/createPalette.js +1 -1
  28. package/umd/hipay-material-ui.development.js +7860 -7749
  29. package/umd/hipay-material-ui.production.min.js +2 -2
  30. package/utils/helpers.js +9 -1
  31. package/HiSelect/SelectInput.js +0 -369
  32. package/HiSelectNew/HiSelect.js +0 -929
  33. package/HiSelectNew/HiSelectField.js +0 -146
  34. package/HiSelectNew/index.js +0 -69
  35. package/es/HiSelect/SelectInput.js +0 -321
  36. package/es/HiSelectNew/HiSelect.js +0 -852
  37. package/es/HiSelectNew/HiSelectField.js +0 -111
  38. package/es/HiSelectNew/index.js +0 -6
  39. /package/{HiSelectNew → HiSelect}/HiDynamicSelect.js +0 -0
  40. /package/{HiSelectNew → HiSelect}/HiDynamicSelectField.js +0 -0
  41. /package/{HiSelectNew → HiSelect}/HiNestedSelect.js +0 -0
  42. /package/{HiSelectNew → HiSelect}/HiNestedSelectContent.js +0 -0
  43. /package/{HiSelectNew → HiSelect}/HiNestedSelectField.js +0 -0
  44. /package/{HiSelectNew → HiSelect}/HiSelectContent.js +0 -0
  45. /package/{HiSelectNew → HiSelect}/HiSelectInput.js +0 -0
  46. /package/es/{HiSelectNew → HiSelect}/HiDynamicSelect.js +0 -0
  47. /package/es/{HiSelectNew → HiSelect}/HiDynamicSelectField.js +0 -0
  48. /package/es/{HiSelectNew → HiSelect}/HiNestedSelectField.js +0 -0
  49. /package/es/{HiSelectNew → HiSelect}/HiSelectInput.js +0 -0
@@ -5,14 +5,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.styles = exports.INFINITESCROLL_ERROR_MESSAGE = void 0;
8
+ exports.default = exports.styles = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
12
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
13
 
14
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
-
16
14
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
15
 
18
16
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
@@ -23,43 +21,39 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
23
21
 
24
22
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
25
23
 
24
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
25
+
26
26
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
27
27
 
28
28
  var _react = _interopRequireDefault(require("react"));
29
29
 
30
30
  var _propTypes = _interopRequireDefault(require("prop-types"));
31
31
 
32
- var _classnames = _interopRequireDefault(require("classnames"));
32
+ var _reactCustomScrollbars = _interopRequireDefault(require("react-custom-scrollbars"));
33
33
 
34
34
  var _Grow = _interopRequireDefault(require("@material-ui/core/Grow"));
35
35
 
36
- var _reactDom = require("react-dom");
37
-
38
- var _reactCustomScrollbars = _interopRequireDefault(require("react-custom-scrollbars"));
39
-
40
36
  var _Paper = _interopRequireDefault(require("@material-ui/core/Paper"));
41
37
 
42
- var _ClickAwayListener = _interopRequireDefault(require("@material-ui/core/ClickAwayListener"));
43
-
44
38
  var _Popper = _interopRequireDefault(require("@material-ui/core/Popper"));
45
39
 
46
- var _HiSelectableList = _interopRequireDefault(require("../HiSelectableList"));
40
+ var _ClickAwayListener = _interopRequireDefault(require("@material-ui/core/ClickAwayListener"));
47
41
 
48
- var _HiSearchField = _interopRequireDefault(require("../HiForm/HiSearchField"));
42
+ var _HiSelectableList = _interopRequireDefault(require("../HiSelectableList"));
49
43
 
50
- var _SelectInput = _interopRequireDefault(require("./SelectInput"));
44
+ var _HiInput = _interopRequireDefault(require("../HiForm/HiInput"));
51
45
 
52
- var _HiChip = _interopRequireDefault(require("../HiChip/HiChip"));
46
+ var _HiSelectInput = _interopRequireDefault(require("./HiSelectInput"));
53
47
 
54
- var _styles = require("../styles");
48
+ var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
55
49
 
56
50
  var _helpers = require("../utils/helpers");
57
51
 
58
52
  var _HiIcon = _interopRequireDefault(require("../HiIcon"));
59
53
 
60
- // @inheritedComponent Input
61
- var INFINITESCROLL_ERROR_MESSAGE = 'La propriété "loadMoreResults" est obligatoire si la prop "infiniteScroll" est à true';
62
- exports.INFINITESCROLL_ERROR_MESSAGE = INFINITESCROLL_ERROR_MESSAGE;
54
+ var _keycode = _interopRequireDefault(require("keycode"));
55
+
56
+ var _classnames = _interopRequireDefault(require("classnames"));
63
57
 
64
58
  var styles = function styles(theme) {
65
59
  return {
@@ -75,14 +69,24 @@ var styles = function styles(theme) {
75
69
  popperWidth: {
76
70
  width: '100% !important'
77
71
  },
72
+ popperRightAlign: {
73
+ right: 0,
74
+ left: 'unset!important'
75
+ },
78
76
  paper: {
79
77
  borderRadius: '0px 2px',
80
- maxHeight: 440,
78
+ maxHeight: 480,
81
79
  transition: 'none !important'
82
80
  },
83
81
  labelIcon: {
84
82
  marginRight: 10
85
83
  },
84
+ labelImg: {
85
+ height: 18,
86
+ width: 'auto',
87
+ margin: '0 4px',
88
+ verticalAlign: 'middle'
89
+ },
86
90
  selectIconLabel: (0, _extends2.default)({
87
91
  whiteSpace: 'nowrap',
88
92
  overflow: 'hidden',
@@ -91,9 +95,27 @@ var styles = function styles(theme) {
91
95
  }, theme.typography.b1, {
92
96
  display: 'inline-flex',
93
97
  width: '100%'
94
- })
98
+ }),
99
+ selectImgLabel: (0, _extends2.default)({
100
+ whiteSpace: 'nowrap',
101
+ overflow: 'hidden',
102
+ textOverflow: 'ellipsis',
103
+ paddingRight: 16
104
+ }, theme.typography.b1, {
105
+ display: 'inline-flex',
106
+ width: '100%'
107
+ }),
108
+ separator: {
109
+ borderTop: "1px solid ".concat(theme.palette.input.bottomLine)
110
+ }
95
111
  };
96
112
  };
113
+
114
+ exports.styles = styles;
115
+
116
+ function filterValue(item, search) {
117
+ return search === '' || (0, _helpers.foldAccents)(item.label.toString().toLowerCase()).search((0, _helpers.foldAccents)(search.toLowerCase())) !== -1;
118
+ }
97
119
  /**
98
120
  *
99
121
  * Utilisé pour tous types de selects dans les formulaires.
@@ -102,90 +124,129 @@ var styles = function styles(theme) {
102
124
  * - avec / sans barre de recherche
103
125
  * - avec / sans option "All"
104
126
  * - prise en compte du type des éléments (text, image, icon, ...)
127
+ * - les actions du clavier son capturés avec KeyDown
105
128
  *
106
129
  * Ce composant réuni les sous-composants
107
- * - SelectInput : affiche l'élément dans le formulaire
108
- * - HiSearchField : intègre une barre de recherche dans le Popper,
109
- * il filtre la liste des suggestions
130
+ * - HiSelectInput : affiche l'élément dans le formulaire
131
+ * - HiSearchField : intègre une barre de recherche dans le Popper, il filtre la liste des suggestions
110
132
  * - HiSelectableList : affiche la liste des suggestions selon le type des éléments
111
133
  */
112
134
 
113
135
 
114
- exports.styles = styles;
115
-
116
136
  var HiSelect =
117
137
  /*#__PURE__*/
118
138
  function (_React$PureComponent) {
119
139
  (0, _inherits2.default)(HiSelect, _React$PureComponent);
120
140
 
121
- function HiSelect(_props) {
141
+ function HiSelect(props) {
122
142
  var _this;
123
143
 
124
144
  (0, _classCallCheck2.default)(this, HiSelect);
125
- _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(HiSelect).call(this, _props));
126
-
127
- _this.buildHierarchyTrees = function (props) {
128
- // Construct two associative arrays
129
- // hierarchy[parentId] => children
130
- // hierarchySelected[parentId] => selected children
131
- var hierarchy = {};
132
- var hierarchySelected = {};
133
- var value = props.value || [];
134
- if (!Array.isArray(value)) value = [props.value];
135
- props.options.forEach(function (option) {
136
- if (option.hasChildren === true && !hierarchy.hasOwnProperty(option.id)) {
137
- hierarchy[option.id] = [];
138
- hierarchySelected[option.id] = [];
139
- } else if (option.hasOwnProperty('parentId')) {
140
- hierarchy[option.parentId].push(option.id);
141
-
142
- if (value.includes(option.id)) {
143
- hierarchySelected[option.parentId].push(option.id);
144
- }
145
- }
146
- });
145
+ _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(HiSelect).call(this, props));
146
+
147
+ _this.buildSelectProps = function (options) {
148
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
149
+ var search = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
150
+ var loading = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
151
+ // build item list
152
+ var itemList = [].concat((0, _toConsumableArray2.default)(loading ? [{
153
+ id: '_loading',
154
+ type: 'loader',
155
+ disabled: true,
156
+ centered: true,
157
+ hideCheckbox: true,
158
+ label: 'loading'
159
+ }] : []), (0, _toConsumableArray2.default)(search !== '' ? (0, _toConsumableArray2.default)(options.filter(function (item) {
160
+ return _this.props.filterFunc(item, search);
161
+ })) : [].concat((0, _toConsumableArray2.default)(_this.props.hasAll ? [(0, _extends2.default)({
162
+ id: '_all',
163
+ label: _this.props.translations.all
164
+ }, _this.props.iconAll && {
165
+ type: 'icon',
166
+ icon: _this.props.iconAll
167
+ })] : []), (0, _toConsumableArray2.default)(options))));
147
168
  return {
148
- hierarchy: hierarchy,
149
- hierarchySelected: hierarchySelected
169
+ itemList: itemList,
170
+ inputValue: _this.buildInputValue(options, value, loading)
150
171
  };
151
172
  };
152
173
 
153
- _this.focusOnSelectedItem = function () {
154
- // On récupère la div parent "overlay"
155
- var overlay = (0, _reactDom.findDOMNode)(_this.overlay);
156
- var multiple = _this.props.multiple;
157
- var value = _this.props.value;
158
- var selectedIdList = Array.isArray(value) ? value : [value];
159
- setTimeout(function () {
160
- var focused = false; // Si un ou plusieurs items sont selectionnés, on focus sur le dernier
161
-
162
- if (selectedIdList.length > 0) {
163
- var itemSelected = overlay.querySelector("[data-id=\"".concat(selectedIdList[selectedIdList.length - 1], "\"]"));
164
-
165
- if (itemSelected && itemSelected.parentElement.tagName === 'LI') {
166
- itemSelected.parentElement.focus();
167
- focused = true;
168
- }
169
- } // Si pas d'item selectionné, ou pas visible (en cas de recherche), focus sur le premier
174
+ _this.buildInputValue = function (options) {
175
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
176
+ var loading = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
177
+ var _this$props = _this.props,
178
+ classes = _this$props.classes,
179
+ hasAll = _this$props.hasAll,
180
+ translations = _this$props.translations,
181
+ type = _this$props.type; // build input value
182
+
183
+ var inputValue;
184
+
185
+ if (loading && value.length === 1) {
186
+ inputValue = translations.one_item_selected;
187
+ } else if (hasAll && options.length === value.length) {
188
+ inputValue = translations.all;
189
+ value.unshift('_all');
190
+ } else if (value.length > 1) {
191
+ inputValue = translations.n_items_selected.replace('%s', value.length);
192
+ } else if (value.length === 1) {
193
+ var item = options.find(function (o) {
194
+ return o.id === value[0];
195
+ });
170
196
 
197
+ if (item === undefined) {
198
+ inputValue = translations.one_item_selected;
199
+ } else if (type === 'icon' || item.type === 'icon') {
200
+ inputValue = _react.default.createElement("span", {
201
+ className: classes.selectIconLabel
202
+ }, _react.default.createElement(_HiIcon.default, {
203
+ className: classes.labelIcon,
204
+ icon: item.icon
205
+ }), item.label);
206
+ } else if (type === 'image' || item.type === 'image') {
207
+ inputValue = _react.default.createElement("span", {
208
+ className: classes.selectIconLabel
209
+ }, _react.default.createElement("img", {
210
+ className: classes.labelImg,
211
+ src: item.img,
212
+ alt: item.label,
213
+ onError: function onError(e) {
214
+ if (item.fallbackImage) {
215
+ e.target.src = "".concat(item.fallbackImage);
216
+ } else {
217
+ e.target.style.display = 'none';
218
+ }
219
+ }
220
+ }), item.label);
221
+ } else {
222
+ inputValue = item.label;
223
+ }
224
+ }
171
225
 
172
- if (selectedIdList.length === 0 || !focused) {
173
- // On recupère tous les items
174
- var items = overlay.getElementsByTagName('li');
175
- var itemToFocus = items[0]; // Si select multiple, et qu'au moins un selectionné, focus sur le 2e item
226
+ return inputValue;
227
+ };
176
228
 
177
- if (multiple && selectedIdList.length > 0) {
178
- itemToFocus = items[1];
179
- }
229
+ _this.focusOnFirstItem = function () {
230
+ if (_this.overlay && _this.overlay.getElementsByTagName('li')[0]) {
231
+ setTimeout(function () {
232
+ var item = _this.overlay.getElementsByTagName('li')[0];
180
233
 
181
- if (itemToFocus) {
182
- itemToFocus.focus();
183
- }
184
- }
185
- }, 1);
234
+ item.focus();
235
+ }, 1);
236
+ }
237
+ };
238
+
239
+ _this.getInputElement = function (el) {
240
+ _this.searchField = el;
241
+
242
+ if (_this.props.inputRef) {
243
+ _this.props.inputRef(_this.searchField);
244
+ }
186
245
  };
187
246
 
188
247
  _this.handleBlur = function () {
248
+ _this.handleSearchReset();
249
+
189
250
  _this.setState({
190
251
  focused: false
191
252
  });
@@ -199,41 +260,57 @@ function (_React$PureComponent) {
199
260
  open: true
200
261
  });
201
262
 
202
- var options = _this.props.options.slice();
203
-
204
- _this.handleSuggestions(options);
205
-
206
- if (_this.props.onClick) {
207
- _this.props.onClick();
208
- } // Gestion du focus
263
+ _this.handleSuggestions(_this.props.options);
209
264
 
265
+ if (_this.props.onClick) _this.props.onClick(); // Gestion du focus
210
266
 
211
267
  if (!_this.props.searchable) {
212
- // sinon focus sur le dernier élément selectionné
213
- _this.focusOnSelectedItem();
268
+ // Sinon focus sur l'élément sélectionné
269
+ _this.focusOnSelectedItem(_this.props.value);
214
270
  }
215
271
  }
216
272
  };
217
273
 
274
+ _this.focusOnSelectedItem = function (selectedValue) {
275
+ if (_this.overlay && _this.overlay.getElementsByTagName('li')[0]) {
276
+ setTimeout(function () {
277
+ // On initialise au premier élément pour être sûr de ne pas se retrouver avec un focus of undefined
278
+ var item = _this.overlay.getElementsByTagName('li')[0];
279
+
280
+ if (selectedValue && typeof selectedValue === 'string') {
281
+ item = _this.overlay.getElementsByTagName('li')[selectedValue];
282
+ } else if (selectedValue && typeof selectedValue === 'number') {
283
+ item = _this.overlay.getElementsByTagName('li')[selectedValue - 1];
284
+ }
285
+
286
+ if (item) {
287
+ item.focus();
288
+ }
289
+ }, 1);
290
+ }
291
+ };
292
+
218
293
  _this.handleClickAway = function (event) {
219
294
  // Au clic sur le bouton, on laisse le handleClick fermer le select
220
- if (!_this.selectInputElement.contains(event.target)) {
295
+ if (!_this.inputEl.contains(event.target)) {
221
296
  _this.handleClose(event);
222
297
  }
223
298
  };
224
299
 
225
300
  _this.handleClose = function () {
301
+ _this.handleSearchReset();
302
+
303
+ _this.setState({
304
+ open: false
305
+ });
306
+
226
307
  if (_this.props.onClose) {
227
308
  _this.props.onClose();
228
309
  }
229
310
 
230
- if (_this.selectInputElement) {
231
- _this.selectInputElement.focus();
311
+ if (_this.inputEl) {
312
+ _this.inputEl.focus();
232
313
  }
233
-
234
- _this.setState({
235
- open: false
236
- });
237
314
  };
238
315
 
239
316
  _this.handleFocus = function () {
@@ -242,428 +319,238 @@ function (_React$PureComponent) {
242
319
  });
243
320
  };
244
321
 
245
- _this.handleKeyDown = function (event) {
246
- var nextItem;
247
-
248
- if (event.key === 'ArrowDown') {
249
- nextItem = (0, _helpers.getNextItemSelectable)(document.activeElement, 'down');
250
- } else if (event.key === 'ArrowUp') {
251
- nextItem = (0, _helpers.getNextItemSelectable)(document.activeElement, 'up');
252
- } else if (event.key === 'Tab' || event.key === 'Escape') {
253
- /* if (!this.props.staticPosition) {
254
- document.body.style.overflow = 'auto';
255
- } */
256
- _this.setState({
257
- open: false
258
- });
259
- }
322
+ _this.handleKeyDownCapture = function (event) {
323
+ var key = (0, _keycode.default)(event);
260
324
 
261
- if (nextItem) {
262
- nextItem.focus();
263
- }
264
- };
325
+ if (key === 'enter') {
326
+ if (_this.state.open) {
327
+ if (_this.props.multiple) {
328
+ event.stopPropagation();
265
329
 
266
- _this.handleKeyDownSearch = function (event) {
267
- if (_this.overlay && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
268
- _this.focusOnSelectedItem();
269
- } else if (event.key === 'Enter' && _this.props.onSubmit) {
270
- _this.props.onSubmit(event);
271
- } else if (event.key === 'Tab' || event.key === 'Escape') {
272
- _this.setState({
273
- open: false
274
- });
330
+ _this.handleClose();
331
+ }
332
+ }
275
333
  }
276
334
  };
277
335
 
278
- _this.handleRequestDelete = function (event) {
279
- event.stopPropagation();
336
+ _this.handleKeyDown = function (event) {
337
+ var key = (0, _keycode.default)(event);
280
338
 
281
- _this.props.onChange(_this.props.name, []);
282
- };
339
+ if (key === 'esc') {
340
+ event.preventDefault();
283
341
 
284
- _this.handleReset = function (event) {
285
- if (_this.props.onReset) {
286
- event.stopPropagation();
342
+ _this.handleClose();
343
+ } else if (key === 'enter') {
344
+ if (_this.state.open) {
345
+ if (_this.props.multiple) {
346
+ _this.handleClose();
347
+ }
348
+ }
349
+ } else if (key === 'space') {
350
+ event.preventDefault();
287
351
 
288
- _this.props.onReset(event);
352
+ if (_this.state.open) {
353
+ if (!_this.props.multiple) {
354
+ _this.setState({
355
+ open: false
356
+ });
357
+ }
358
+ } else {
359
+ _this.setState({
360
+ open: true
361
+ });
362
+ }
363
+ } else if (key === 'tab') {
364
+ _this.handleClose();
289
365
  }
290
366
  };
291
367
 
292
- _this.handleScroll = function (event) {
293
- if (!_this.props.loadingMoreResults && _this.props.hasMore && event.target.scrollHeight - event.target.clientHeight - event.target.scrollTop < 15) {
294
- _this.props.loadMoreResults(_this.state.resultsPageNumber + 1);
368
+ _this.handleKeyDownSearch = function (event) {
369
+ var key = (0, _keycode.default)(event);
295
370
 
296
- _this.setState(function (prevState) {
297
- return {
298
- resultsPageNumber: prevState.resultsPageNumber + 1
299
- };
371
+ if (_this.overlay && (key === 'down' || key === 'up')) {
372
+ _this.focusOnFirstItem();
373
+ } else if (_this.overlay && key === 'esc' || key === 'enter') {
374
+ event.preventDefault();
375
+
376
+ _this.handleClose();
377
+ } else if (key === 'tab') {
378
+ _this.setState({
379
+ open: false
300
380
  });
301
381
  }
302
382
  };
303
383
 
304
- _this.handleSelect = function (event, item) {
305
- var _this$props = _this.props,
306
- multiple = _this$props.multiple,
307
- value = _this$props.value,
308
- onChange = _this$props.onChange,
309
- options = _this$props.options,
310
- hierarchic = _this$props.hierarchic,
311
- pinnedItem = _this$props.pinnedItem;
312
- var _this$state = _this.state,
313
- hierarchySelected = _this$state.hierarchySelected,
314
- hierarchy = _this$state.hierarchy,
315
- nbOptions = _this$state.nbOptions;
316
- var hiSelected = (0, _extends2.default)({}, hierarchySelected);
317
-
318
- if (multiple) {
319
- var valueList = value;
384
+ _this.handleScroll = function (e) {
385
+ if (e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop < 15) {
386
+ _this.props.onScrollReachBottom();
387
+ }
388
+ };
320
389
 
321
- if (item.id === '_all') {
322
- if (valueList.length === nbOptions) {
323
- valueList = [];
390
+ _this.handleSelect = function (event, item) {
391
+ var _this$props2 = _this.props,
392
+ hasAll = _this$props2.hasAll,
393
+ multiple = _this$props2.multiple,
394
+ onChange = _this$props2.onChange,
395
+ options = _this$props2.options,
396
+ value = _this$props2.value;
324
397
 
325
- if (hierarchic) {
326
- // if hierarchic select => empty associative array of selected children
327
- Object.keys(hiSelected).forEach(function (key) {
328
- hiSelected[key] = [];
329
- });
330
- }
331
- } else {
332
- options.forEach(function (option) {
333
- if (option.hasChildren !== true && !valueList.includes(option.id) && option.id !== '_all') {
334
- valueList.push(option.id);
335
- } else if (option.hasChildren === true) {
336
- // if hierarchic select => fill associative array of selected children
337
- hiSelected[option.id] = hierarchy[option.id];
338
- }
339
- });
340
- }
341
- } else if (valueList.includes(item.id) || item.hasChildren === true && hierarchySelected[item.id].length === hierarchy[item.id].length) {
342
- // item déjà sélectionné => on le déselectionne
343
- if (item.hasChildren !== true) {
344
- valueList = valueList.filter(function (val) {
345
- return val !== item.id;
346
- });
347
- }
398
+ if (!multiple) {
399
+ // single value
400
+ _this.handleClose();
348
401
 
349
- if (item.hasChildren === true) {
350
- // remove all children
351
- valueList = valueList.filter(function (val) {
352
- return !_this.state.hierarchy[item.id].includes(val);
353
- });
354
- hiSelected[item.id] = [];
355
- } else if (item.hasOwnProperty('parentId')) {
356
- // Si item est un enfant on l'enlève du tableau associatif des
357
- // elmts sélectionnés
358
- hiSelected[item.parentId].splice(hiSelected[item.parentId].indexOf(item.id), 1);
359
- }
402
+ onChange(event, item.id, item);
403
+ } else if (hasAll && item.id === '_all') {
404
+ if (value.length === options.length) {
405
+ // unselect _all options
406
+ onChange(event, [], item);
360
407
  } else {
361
- if (pinnedItem && item.id === pinnedItem.id) {
362
- Object.keys(hiSelected).map(function (parentItemId) {
363
- hiSelected[parentItemId] = [];
364
- return true;
365
- });
366
- valueList = [item.id];
367
- } else {
368
- // item non sélectionné => on le sélectionne
369
- if (item.hasChildren !== true) valueList.push(item.id);
370
-
371
- if (pinnedItem && valueList.includes(pinnedItem.id)) {
372
- valueList.splice(valueList.indexOf(pinnedItem.id), 1);
373
- }
374
- }
375
-
376
- if (item.hasChildren === true) {
377
- // Si item parent => on ajoute tous les enfants
378
- // Ou on les supprime s'ils sont déjà tous sélectionnés (dans une liste filtrée)
379
- var idsInSuggestions = [];
380
-
381
- _this.state.suggestions.forEach(function (suggestion) {
382
- if (_this.state.hierarchy[item.id].includes(suggestion.id)) {
383
- idsInSuggestions.push(suggestion.id);
384
- }
385
- }); // if(hierarchySelected[item.id].length > 0) {}
386
-
387
-
388
- var allChildrenSuggestionsSelected = true;
389
- idsInSuggestions.forEach(function (id) {
390
- if (!hierarchySelected[item.id].includes(id)) {
391
- allChildrenSuggestionsSelected = false;
392
- }
393
- });
394
-
395
- if (allChildrenSuggestionsSelected === true) {
396
- // On supprime les enfants car déjà tous sélectionnés
397
- idsInSuggestions.forEach(function (id) {
398
- valueList.splice(valueList.indexOf(id), 1);
399
- hiSelected[item.id].splice(hiSelected[item.id].indexOf(id), 1);
400
- });
401
- } else {
402
- // On ajoute tous les enfants filtrés au éléments sélectionnés
403
- valueList = (0, _helpers.arrayUnique)(valueList.concat(idsInSuggestions));
404
- hiSelected[item.id] = (0, _helpers.arrayUnique)(hiSelected[item.id].concat(idsInSuggestions));
405
- }
406
-
407
- _this.setState({
408
- hierarchySelected: hiSelected
409
- });
410
- } else if (item.hasOwnProperty('parentId')) {
411
- // Si item est un enfant on l'ajoute du tableau associatif des
412
- // elmts sélectionnés
413
- hiSelected[item.parentId].push(item.id);
414
- }
408
+ // select _all options
409
+ onChange(event, options.map(function (option) {
410
+ return option.id;
411
+ }), item);
415
412
  }
416
-
417
- _this.setState({
418
- hierarchySelected: hiSelected
419
- });
420
-
421
- onChange(event, valueList, item);
413
+ } else if (value.includes(item.id)) {
414
+ // unselect item
415
+ onChange(event, value.filter(function (id) {
416
+ return id !== item.id;
417
+ }), item);
422
418
  } else {
423
- onChange(event, item.id, item);
424
-
425
- _this.handleClose();
419
+ onChange(event, [].concat((0, _toConsumableArray2.default)(value), [item.id]), item);
426
420
  }
427
421
  };
428
422
 
429
423
  _this.handleSuggestions = function (suggestions) {
430
- var _this$props2 = _this.props,
431
- options = _this$props2.options,
432
- hasAll = _this$props2.hasAll,
433
- iconAll = _this$props2.iconAll,
434
- translations = _this$props2.translations,
435
- multiple = _this$props2.multiple;
424
+ var _this$props3 = _this.props,
425
+ hasAll = _this$props3.hasAll,
426
+ iconAll = _this$props3.iconAll,
427
+ translations = _this$props3.translations;
436
428
 
437
429
  if (suggestions.length === 0) {
438
- // Handle No Result
439
- // FIX to remove all item
440
- suggestions = [];
441
- suggestions.push({
442
- id: '_no_result',
443
- type: 'text',
444
- disabled: true,
445
- centered: true,
446
- checkbox: false,
447
- label: translations.no_result_match
430
+ // Add '_no_result' suggestion
431
+ _this.setState(function (prevState) {
432
+ return (0, _extends2.default)({}, prevState, {
433
+ suggestions: [{
434
+ id: '_no_result',
435
+ type: 'text',
436
+ disabled: true,
437
+ centered: true,
438
+ hideCheckbox: true,
439
+ label: translations.no_result_match
440
+ }]
441
+ });
448
442
  });
449
- } else if (hasAll && suggestions.length > 0 && suggestions.length === options.length && multiple === true) {
450
- // Handle 'All'
451
- if (suggestions.filter(function (suggestion) {
452
- return suggestion.id === '_all';
453
- }).length === 0) {
454
- var allItem = {
443
+ } else {
444
+ _this.setState({
445
+ suggestions: [].concat((0, _toConsumableArray2.default)(hasAll ? [(0, _extends2.default)({
455
446
  id: '_all',
456
- icon: iconAll,
457
447
  label: translations.all
458
- };
448
+ }, iconAll && {
449
+ type: 'icon',
450
+ icon: iconAll
451
+ })] : []), (0, _toConsumableArray2.default)(suggestions))
452
+ });
453
+ }
454
+ };
459
455
 
460
- if (iconAll !== false) {
461
- allItem.type = 'icon';
462
- }
456
+ _this.handleSearch = function (e, inputValue) {
457
+ var searchValue = inputValue && e.target.value ? inputValue : e.target.value;
463
458
 
464
- suggestions.unshift(allItem);
465
- }
459
+ if (_this.props.onSearch) {
460
+ _this.props.onSearch(e, searchValue);
461
+ } else {
462
+ _this.setState({
463
+ searchValue: searchValue
464
+ });
466
465
  }
466
+ };
467
467
 
468
- _this.setState({
469
- suggestions: suggestions
470
- });
468
+ _this.handleSearchReset = function () {
469
+ _this.handleSearch({
470
+ target: {
471
+ value: ''
472
+ }
473
+ }, '');
471
474
  };
472
475
 
473
476
  _this.state = {
474
477
  open: false,
475
478
  focused: false,
476
- suggestions: [],
477
- hierarchySelected: {},
478
- hierarchy: {},
479
- nbOptions: 0,
480
- dynamic: _props.dynamic || false,
481
- resultsPageNumber: 1
482
- }; // Check if value is in options
483
-
484
- var valueInOptions = false;
485
- var _val = _props.value; // No options provided.
486
-
487
- if (!_props.options.length || !_val || !_val.length) {
488
- valueInOptions = true;
489
- } else {
490
- // Check if an option match value prop.
491
- _props.options.forEach(function (item) {
492
- if (!valueInOptions && _val.indexOf(item.id) !== -1) {
493
- valueInOptions = true;
494
- }
495
- });
496
-
497
- if (!valueInOptions && _props.pinnedItem) {
498
- if (_props.value.indexOf(_props.pinnedItem.id) >= 0) {
499
- valueInOptions = true;
500
- }
501
- }
502
- }
503
-
504
- if (!valueInOptions) {
505
- throw new Error('prop value provided does not match any option.');
506
- }
507
-
508
- if (_props.hierarchic === true && _props.options.length > 1) {
509
- var hierarchyTrees = _this.buildHierarchyTrees(_props);
510
-
511
- _this.state.hierarchy = hierarchyTrees.hierarchy;
512
- _this.state.hierarchySelected = hierarchyTrees.hierarchySelected;
513
- }
514
-
515
- if (_props.options.length > 0) {
516
- // Get real options number (parent & _all are not real options)
517
- var optionsLength = 0;
518
-
519
- _props.options.forEach(function (option) {
520
- if (option.hasChildren !== true && option.id !== '_all') {
521
- optionsLength += 1;
522
- }
523
- });
524
-
525
- _this.state.nbOptions = optionsLength;
526
- } else if (!_props.dynamic) {
527
- _this.state.dynamic = true;
528
- }
529
-
479
+ searchValue: props.searchValue ? undefined : '',
480
+ suggestions: props.options,
481
+ openDown: true
482
+ };
483
+ _this.handleBlur = _this.handleBlur.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
484
+ _this.handleClick = _this.handleClick.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
485
+ _this.handleClose = _this.handleClose.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
486
+ _this.handleClickAway = _this.handleClickAway.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
487
+ _this.handleFocus = _this.handleFocus.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
488
+ _this.handleSearch = _this.handleSearch.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
489
+ _this.handleSearchReset = _this.handleSearchReset.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
490
+ _this.handleSelect = _this.handleSelect.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
491
+ _this.handleSuggestions = _this.handleSuggestions.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
492
+ _this.getInputElement = _this.getInputElement.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
530
493
  return _this;
531
494
  }
532
495
 
533
496
  (0, _createClass2.default)(HiSelect, [{
534
- key: "componentWillReceiveProps",
535
- value: function componentWillReceiveProps(nextProps) {
536
- if (typeof this.props.onSearch !== 'undefined' && this.props.options && this.props.options.length > 0) {
537
- this.handleSuggestions(nextProps.options);
538
- var optionsLength = 0;
539
- nextProps.options.forEach(function (option) {
540
- if (option.hasChildren !== true && option.id !== '_all') {
541
- optionsLength += 1;
542
- }
543
- });
544
- this.setState({
545
- nbOptions: optionsLength
546
- });
547
- }
548
-
549
- if (nextProps.hierarchic === true && nextProps.options.length > 1) {
550
- var hierarchyTrees = this.buildHierarchyTrees(nextProps);
551
- this.setState({
552
- hierarchy: hierarchyTrees.hierarchy,
553
- hierarchySelected: hierarchyTrees.hierarchySelected
554
- });
497
+ key: "componentDidMount",
498
+ value: function componentDidMount() {
499
+ if (this.props.autoFocus) {
500
+ this.inputEl.focus();
555
501
  }
556
502
  }
557
503
  }, {
558
504
  key: "render",
559
505
  value: function render() {
560
- var _this2 = this;
561
-
562
- var _this$props3 = this.props,
563
- classes = _this$props3.classes,
564
- disabled = _this$props3.disabled,
565
- error = _this$props3.error,
566
- loading = _this$props3.loading,
567
- options = _this$props3.options,
568
- searchable = _this$props3.searchable,
569
- displayAsChip = _this$props3.displayAsChip,
570
- type = _this$props3.type,
571
- value = _this$props3.value,
572
- translations = _this$props3.translations,
573
- parentItemSelectable = _this$props3.parentItemSelectable,
574
- icon = _this$props3.icon,
575
- parentIcon = _this$props3.parentIcon,
576
- hoverIcon = _this$props3.hoverIcon,
577
- checkedIcon = _this$props3.checkedIcon,
578
- id = _this$props3.id,
579
- placeholder = _this$props3.placeholder,
580
- staticPosition = _this$props3.staticPosition,
581
- pinnedItem = _this$props3.pinnedItem,
582
- hasAll = _this$props3.hasAll,
583
- infiniteScroll = _this$props3.infiniteScroll,
584
- loadingMoreResults = _this$props3.loadingMoreResults,
585
- multiple = _this$props3.multiple,
586
- other = (0, _objectWithoutProperties2.default)(_this$props3, ["classes", "disabled", "error", "loading", "options", "searchable", "displayAsChip", "type", "value", "translations", "parentItemSelectable", "icon", "parentIcon", "hoverIcon", "checkedIcon", "id", "placeholder", "staticPosition", "pinnedItem", "hasAll", "infiniteScroll", "loadingMoreResults", "multiple"]);
587
- var _this$state2 = this.state,
588
- open = _this$state2.open,
589
- stateSuggestions = _this$state2.suggestions,
590
- focused = _this$state2.focused,
591
- dynamic = _this$state2.dynamic;
592
- var display = '';
593
- var selectedIdList;
594
-
595
- if (Array.isArray(value)) {
596
- selectedIdList = value;
597
- } else if (value) {
598
- selectedIdList = [value];
599
- } else {
600
- selectedIdList = [];
601
- }
602
-
603
- var suggestions = (0, _toConsumableArray2.default)(stateSuggestions);
604
-
605
- if (pinnedItem) {
606
- suggestions.unshift(pinnedItem);
607
- } // If loading
506
+ var _classNames,
507
+ _this2 = this;
508
+
509
+ var _this$props4 = this.props,
510
+ classes = _this$props4.classes,
511
+ disabled = _this$props4.disabled,
512
+ error = _this$props4.error,
513
+ loading = _this$props4.loading,
514
+ options = _this$props4.options,
515
+ searchable = _this$props4.searchable,
516
+ displayAsChip = _this$props4.displayAsChip,
517
+ type = _this$props4.type,
518
+ value = _this$props4.value,
519
+ multiple = _this$props4.multiple,
520
+ translations = _this$props4.translations,
521
+ hiSearchInputProps = _this$props4.hiSearchInputProps,
522
+ hiSelectableListProps = _this$props4.hiSelectableListProps,
523
+ hiSelectInputProps = _this$props4.hiSelectInputProps,
524
+ id = _this$props4.id,
525
+ onScrollReachBottom = _this$props4.onScrollReachBottom,
526
+ onSubmit = _this$props4.onSubmit,
527
+ placeholder = _this$props4.placeholder,
528
+ startAdornment = _this$props4.startAdornment,
529
+ staticPosition = _this$props4.staticPosition,
530
+ _this$props4$searchVa = _this$props4.searchValue,
531
+ searchValue = _this$props4$searchVa === void 0 ? this.state.searchValue : _this$props4$searchVa,
532
+ _this$props4$buildSel = _this$props4.buildSelectProps,
533
+ buildSelectProps = _this$props4$buildSel === void 0 ? this.buildSelectProps : _this$props4$buildSel;
534
+ var _this$state = this.state,
535
+ open = _this$state.open,
536
+ focused = _this$state.focused;
608
537
 
609
-
610
- if (loading && !loadingMoreResults) {
611
- suggestions.unshift({
612
- id: '_loading',
613
- type: 'loader',
614
- disabled: true,
615
- centered: true,
616
- checkbox: false,
617
- label: 'loading'
618
- });
619
- }
620
-
621
- if ((dynamic || loading) && selectedIdList.length === 1) {
622
- display = translations.one_item_selected;
623
- } else if ((this.state.nbOptions !== selectedIdList.length || !hasAll) && selectedIdList.length > 1) {
624
- display = translations.n_items_selected.replace('%s', selectedIdList.length);
625
- } else if (this.state.nbOptions === selectedIdList.length && this.state.nbOptions > 1) {
626
- display = translations.all;
627
- } else if (selectedIdList.length === 1) {
628
- var item = options.find(function (o) {
629
- return o.id === selectedIdList[0];
630
- });
631
-
632
- if (item === undefined) {
633
- display = translations.one_item_selected;
634
- } else if (type !== 'icon') {
635
- if (pinnedItem) {
636
- item = pinnedItem;
637
- }
638
-
639
- display = item.label;
640
- } else {
641
- display = _react.default.createElement("span", {
642
- className: classes.selectIconLabel
643
- }, _react.default.createElement(_HiIcon.default, {
644
- icon: item.icon,
645
- className: classes.labelIcon
646
- }), item.label);
538
+ if (multiple) {
539
+ if (!Array.isArray(value)) {
540
+ throw new Error('HiPay Material-UI: the `value` property must be an array ' + 'when using the `HiSelect` component with `multiple`.');
647
541
  }
648
542
  }
649
543
 
650
- if (displayAsChip) {
651
- var chipFilter = _react.default.createElement(_HiChip.default, {
652
- label: placeholder || display,
653
- onDelete: this.handleRequestDelete
654
- });
544
+ var selectedItemIdList = [];
655
545
 
656
- if (display) {
657
- display = chipFilter;
658
- }
546
+ if (value) {
547
+ selectedItemIdList = multiple ? (0, _toConsumableArray2.default)(value) : [value];
659
548
  }
660
549
 
661
- var popperClass = (0, _classnames.default)(classes.popper, (0, _defineProperty2.default)({}, classes.popperWidth, !this.props.containerWidth));
662
- var allSelected = false;
663
-
664
- if (selectedIdList.length === this.state.nbOptions) {
665
- allSelected = true;
666
- }
550
+ var _buildSelectProps = buildSelectProps(options, selectedItemIdList, searchValue, loading),
551
+ itemList = _buildSelectProps.itemList,
552
+ _buildSelectProps$inp = _buildSelectProps.inputValue,
553
+ inputValue = _buildSelectProps$inp === void 0 ? this.buildInputValue(options, selectedItemIdList, loading) : _buildSelectProps$inp;
667
554
 
668
555
  var popperStyle = {};
669
556
 
@@ -677,70 +564,82 @@ function (_React$PureComponent) {
677
564
  }
678
565
  }
679
566
 
680
- if (infiniteScroll && loadingMoreResults) {
681
- suggestions.push({
682
- id: '_loading',
683
- type: 'loader',
684
- disabled: true,
685
- centered: true,
686
- checkbox: false,
687
- label: 'loading'
688
- });
567
+ var popperClass = (0, _classnames.default)(classes.popper, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.popperWidth, !this.props.containerWidth), (0, _defineProperty2.default)(_classNames, classes.popperRightAlign, this.props.containerWidth && this.props.align === 'right'), _classNames));
568
+
569
+ var searchInput = function searchInput(position) {
570
+ if (searchable) {
571
+ return _react.default.createElement(_HiInput.default, (0, _extends2.default)({
572
+ value: searchValue,
573
+ autoFocus: true,
574
+ inputRef: _this2.getInputElement,
575
+ onKeyDown: _this2.handleKeyDownSearch,
576
+ onChange: _this2.handleSearch,
577
+ onReset: _this2.handleSearchReset,
578
+ placeholder: translations.search,
579
+ startAdornment: 'search',
580
+ tabIndex: 0,
581
+ className: (0, _classnames.default)((0, _defineProperty2.default)({}, classes.separator, position === 'top'))
582
+ }, hiSearchInputProps));
583
+ }
584
+
585
+ return null;
586
+ }; // Replace popper onSearch when popper displayed on top of selectButton
587
+
588
+
589
+ if (this.placement && this.placement.indexOf('top') >= 0 && !!searchable) {
590
+ // +1 for search input
591
+ var nbItems = itemList.length <= 10 ? itemList.length + 1 : 11;
592
+ popperStyle.transform = "translate3d(-1px, -".concat(nbItems * 40 + 2, "px, 0px)");
593
+ } else if (this.placement && this.placement.indexOf('top') < 0 && !!searchable) {
594
+ popperStyle.transform = 'translate3d(-1px, 40px, 0px)';
689
595
  }
690
596
 
691
- var content = _react.default.createElement(_ClickAwayListener.default, {
692
- onClickAway: this.handleClickAway
693
- }, _react.default.createElement(_Grow.default, {
694
- in: open,
695
- id: "menu-list",
696
- style: {
697
- transformOrigin: '0 0 0'
597
+ var content = function content(_ref) {
598
+ var placement = _ref.placement;
599
+
600
+ if (placement !== _this2.placement) {
601
+ _this2.placement = placement;
698
602
  }
699
- }, _react.default.createElement(_Paper.default, {
700
- className: classes.paper
701
- }, !!searchable && _react.default.createElement(_HiSearchField.default, {
702
- itemList: options,
703
- onFilteredList: this.handleSuggestions,
704
- filterPropertyList: ['label'],
705
- placeholder: translations.search,
706
- autoFocus: true,
707
- onSearch: this.props.onSearch,
708
- inputRef: function inputRef(el) {
709
- _this2.searchField = el;
710
- },
711
- onKeyDown: this.handleKeyDownSearch
712
- }), _react.default.createElement(_reactCustomScrollbars.default, {
713
- ref: function ref(contentEl) {
714
- _this2.optionsContent = contentEl;
715
- },
716
- autoHeight: true,
717
- autoHeightMax: 400,
718
- onScroll: this.handleScroll
719
- }, _react.default.createElement(_HiSelectableList.default, (0, _extends2.default)({
720
- type: type,
721
- parentItemSelectable: parentItemSelectable,
722
- itemList: suggestions,
723
- onSelect: this.handleSelect,
724
- selectedItemIdList: selectedIdList,
725
- hideCheckbox: !multiple,
726
- translations: translations,
727
- icon: icon,
728
- parentIcon: parentIcon,
729
- hoverIcon: hoverIcon,
730
- checkedIcon: checkedIcon,
731
- allSelected: allSelected,
732
- value: value,
733
- onKeyDown: this.handleKeyDown
734
- }, other))))));
603
+
604
+ return _react.default.createElement(_ClickAwayListener.default, {
605
+ onClickAway: _this2.handleClickAway
606
+ }, _react.default.createElement(_Grow.default, {
607
+ in: open,
608
+ id: "menu-list",
609
+ style: {
610
+ transformOrigin: '0 0 0'
611
+ }
612
+ }, _react.default.createElement(_Paper.default, {
613
+ className: classes.paper
614
+ }, (_this2.placement && _this2.placement.indexOf('bottom') >= 0 || staticPosition) && searchInput('bottom'), startAdornment, _react.default.createElement(_reactCustomScrollbars.default, (0, _extends2.default)({
615
+ ref: function ref(contentEl) {
616
+ _this2.optionsContent = contentEl;
617
+ },
618
+ autoHeight: true,
619
+ autoHeightMax: 430
620
+ }, onScrollReachBottom && {
621
+ onScroll: _this2.handleScroll
622
+ }), _react.default.createElement(_HiSelectableList.default, (0, _extends2.default)({
623
+ type: type,
624
+ itemList: itemList,
625
+ onSelect: _this2.handleSelect,
626
+ selectedItemIdList: selectedItemIdList,
627
+ fallbackImage: _this2.props.fallbackImage,
628
+ overlay: _this2.overlay,
629
+ value: value
630
+ }, hiSelectableListProps))), _this2.placement && _this2.placement.indexOf('top') >= 0 && !staticPosition && searchInput('top'))));
631
+ };
735
632
 
736
633
  return _react.default.createElement("div", {
737
634
  className: classes.root,
738
635
  ref: function ref(el) {
739
636
  _this2.overlay = el;
740
- }
741
- }, _react.default.createElement(_SelectInput.default, {
637
+ },
638
+ onKeyDown: this.handleKeyDown,
639
+ onKeyDownCapture: this.handleKeyDownCapture
640
+ }, _react.default.createElement(_HiSelectInput.default, (0, _extends2.default)({
742
641
  id: id,
743
- value: placeholder || display,
642
+ value: inputValue,
744
643
  open: open,
745
644
  focused: focused,
746
645
  type: type,
@@ -750,43 +649,65 @@ function (_React$PureComponent) {
750
649
  onClick: this.handleClick,
751
650
  onFocus: this.handleFocus,
752
651
  onBlur: this.handleBlur,
753
- onKeyDown: this.handleKeyDown,
652
+ onSubmit: onSubmit,
754
653
  onMouseEnter: this.props.onMouseEnter,
755
654
  onMouseLeave: this.props.onMouseLeave,
655
+ onReset: this.props.onReset,
656
+ placeholder: placeholder
657
+ }, hiSelectInputProps, {
756
658
  refElement: function refElement(el) {
757
- _this2.selectInputElement = el;
758
- },
759
- onReset: this.props.onReset
760
- }), open && staticPosition ? _react.default.createElement("div", {
761
- style: popperStyle
762
- }, content) : _react.default.createElement(_Popper.default, {
659
+ _this2.inputEl = el;
660
+ }
661
+ })), open && staticPosition ? _react.default.createElement("div", {
662
+ style: popperStyle,
663
+ className: popperClass
664
+ }, content({})) : _react.default.createElement(_Popper.default, {
763
665
  anchorEl: this.inputEl,
764
666
  placement: "bottom-start",
765
667
  open: open,
766
668
  className: popperClass,
767
- style: popperStyle,
768
- disablePortal: true
669
+ disablePortal: true,
670
+ style: popperStyle
769
671
  }, content));
770
672
  }
673
+ }], [{
674
+ key: "getDerivedStateFromProps",
675
+ value: function getDerivedStateFromProps(nextProps, prevState) {
676
+ if (nextProps.options !== prevState.suggestions) {
677
+ return (0, _extends2.default)({}, prevState, {
678
+ suggestions: nextProps.options
679
+ });
680
+ }
681
+
682
+ return null;
683
+ }
684
+ /**
685
+ * Build itemList & inputValue from select props
686
+ * @param options
687
+ * @param value
688
+ * @param search
689
+ * @param loading
690
+ * @returns {{itemList: *[], inputValue: *}}
691
+ */
692
+
771
693
  }]);
772
694
  return HiSelect;
773
695
  }(_react.default.PureComponent);
774
696
 
775
697
  HiSelect.defaultProps = {
776
- containerWidth: 0,
698
+ align: 'left',
699
+ autoFocus: false,
777
700
  disabled: false,
778
701
  displayAsChip: false,
779
- dynamic: false,
780
702
  error: false,
781
703
  hasAll: false,
782
- hasMore: false,
783
- hierarchic: false,
784
- iconAll: false,
785
- infiniteScroll: false,
786
- loadingMoreResults: false,
704
+ hiSelectableListProps: {},
705
+ hiSelectInputProps: {},
706
+ hiSearchInputProps: {},
787
707
  multiple: false,
788
- parentItemSelectable: false,
789
- type: 'text',
708
+ placeholder: '',
709
+ searchable: false,
710
+ staticPosition: false,
790
711
  translations: {
791
712
  all: 'All',
792
713
  no_result_match: 'No result match',
@@ -796,14 +717,16 @@ HiSelect.defaultProps = {
796
717
  n_children: '%s items',
797
718
  one_child: '%s item'
798
719
  },
799
- searchable: false,
800
- staticPosition: false
720
+ type: 'text',
721
+ filterFunc: filterValue
801
722
  };
802
723
  HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
724
+ align: _propTypes.default.oneOf(['left', 'right']),
725
+
803
726
  /**
804
- * Icon affiché lorsque l'item est sélectionné
727
+ * Permet de forcer le focus sur le composant
805
728
  */
806
- checkedIcon: _propTypes.default.node,
729
+ autoFocus: _propTypes.default.bool,
807
730
 
808
731
  /**
809
732
  * Useful to extend the style applied to components.
@@ -825,77 +748,56 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
825
748
  */
826
749
  displayAsChip: _propTypes.default.bool,
827
750
 
828
- /**
829
- * Option permettant de définir si les options du select sont dynamiques.
830
- * Si les options du select sont initialisées à vide, alors ce sera mis à true
831
- * automatiquement.
832
- */
833
- dynamic: _propTypes.default.bool,
834
-
835
751
  /**
836
752
  * Applique le style error
837
753
  */
838
754
  error: _propTypes.default.bool,
839
755
 
840
756
  /**
841
- * Affiche l'élément 'All'
757
+ * Chemin vers l'image à afficher par défaut si une image n'est pas trouvée
842
758
  */
843
- hasAll: _propTypes.default.bool,
759
+ fallbackImage: _propTypes.default.string,
760
+
761
+ /*
762
+ * Fonction de filtrage custom
763
+ */
764
+ filterFunc: _propTypes.default.func,
844
765
 
845
766
  /**
846
- * Indique si l'infinite scroll doit rechercher de nouveaux résultats
767
+ * Affiche l'élément 'All'
847
768
  */
848
- hasMore: _propTypes.default.bool,
769
+ hasAll: _propTypes.default.bool,
849
770
 
850
771
  /**
851
- * Les items sont hiérarchisés
772
+ * Override HiInput props (for search)
852
773
  */
853
- hierarchic: _propTypes.default.bool,
774
+ hiSearchInputProps: _propTypes.default.object,
854
775
 
855
776
  /**
856
- * Icon affiché lorsque l'item n'est pas sélectionné et qu'on le survole
777
+ * Override HiSelectableList props
857
778
  */
858
- hoverIcon: _propTypes.default.node,
779
+ hiSelectableListProps: _propTypes.default.object,
859
780
 
860
781
  /**
861
- * Icon affiché lorsque l'item n'est pas sélectionné
782
+ * Override HiSelectInput props
862
783
  */
863
- icon: _propTypes.default.node,
784
+ hiSelectInputProps: _propTypes.default.object,
864
785
 
865
786
  /**
866
787
  * Nom de l'icône
867
788
  */
868
- iconAll: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
789
+ iconAll: _propTypes.default.string,
869
790
 
870
791
  /**
871
792
  * id du select
872
793
  */
873
794
  id: _propTypes.default.string,
874
795
 
875
- /**
876
- * Infinite scroll dans le select dans le cas où il y a beaucoup de résultats à afficher
877
- * afin d'éviter un lag du navigateur
878
- */
879
- infiniteScroll: _propTypes.default.bool,
880
-
881
796
  /**
882
797
  * Ajoute un loader
883
798
  */
884
799
  loading: _propTypes.default.bool,
885
800
 
886
- /**
887
- * Ajoute un loader en bas pour l'infiniteScroll
888
- */
889
- loadingMoreResults: _propTypes.default.bool,
890
-
891
- /**
892
- * Fonction de callback appelée lorsque l'utilisateur arrive en bas de la liste des options
893
- * afin de charger les nouvelles options
894
- *
895
- * @param {int} pageNumber
896
- */
897
- loadMoreResults: _propTypes.default.func,
898
-
899
801
  /**
900
802
  * Autorise la sélection de plusieurs valeurs
901
803
  */
@@ -914,11 +816,6 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
914
816
  */
915
817
  onChange: _propTypes.default.func.isRequired,
916
818
 
917
- /**
918
- * Fonction de callback appelée click dans l'input
919
- */
920
- onClick: _propTypes.default.func,
921
-
922
819
  /**
923
820
  * Fonction de callback appelée lorsqu'on ferme le select
924
821
  */
@@ -940,18 +837,14 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
940
837
  onReset: _propTypes.default.func,
941
838
 
942
839
  /**
943
- * Fonction de callback appelée lorsqu'on écrit dans la barre de recherche
944
- * A utiliser pour les selects avec des données dynamiques
945
- *
946
- * @param {object} event
947
- * @param {string} value
840
+ * Fonction de callback appelée lorsque le scroll atteint le bas de la liste
948
841
  */
949
- onSearch: _propTypes.default.func,
842
+ onScrollReachBottom: _propTypes.default.func,
950
843
 
951
844
  /**
952
- * Fonction de callback à la pression de la touche "Entrée"
845
+ * Fonction de callback appelée lorsque le champs de recherche est utilisé
953
846
  */
954
- onSubmit: _propTypes.default.func,
847
+ onSearch: _propTypes.default.func,
955
848
 
956
849
  /**
957
850
  * Listes des options du select
@@ -959,23 +852,7 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
959
852
  options: _propTypes.default.array.isRequired,
960
853
 
961
854
  /**
962
- * Icon affiché lorsqu'un item parent n'est pas sélectionné
963
- */
964
- parentIcon: _propTypes.default.node,
965
-
966
- /**
967
- * Les items parents sont sélectionnables
968
- */
969
- parentItemSelectable: _propTypes.default.bool,
970
-
971
- /**
972
- * Item épinglé en début de liste
973
- */
974
- pinnedItem: _propTypes.default.object,
975
-
976
- /**
977
- * Placeholder affiché lorsque le select est fermé
978
- * Surcharge le placeholder par défaut
855
+ * Placeholder affiché lorsque l'input est vide
979
856
  */
980
857
  placeholder: _propTypes.default.string,
981
858
 
@@ -985,7 +862,12 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
985
862
  searchable: _propTypes.default.bool,
986
863
 
987
864
  /**
988
- * Si true, le contenu du select sera dans une div static plutot que dans une popper absolute
865
+ * Node qui s'ajoute entre la barre de recherche et la liste de résultats
866
+ */
867
+ startAdornment: _propTypes.default.object,
868
+
869
+ /**
870
+ * Si true, le contenu du select sera dans une div static plutôt que dans une popper absolute
989
871
  */
990
872
  staticPosition: _propTypes.default.bool,
991
873
 
@@ -1005,7 +887,7 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
1005
887
  value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array])
1006
888
  } : {};
1007
889
 
1008
- var _default = (0, _styles.withStyles)(styles, {
890
+ var _default = (0, _withStyles.default)(styles, {
1009
891
  hiComponent: true,
1010
892
  name: 'HmuiHiSelect'
1011
893
  })(HiSelect);