@hipay/hipay-material-ui 2.0.0-beta.54 → 2.0.0-beta.56

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 (128) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/HiBreadcrumb/HiBreadcrumb.js +14 -4
  3. package/HiBreadcrumb/HiStep.js +4 -1
  4. package/HiBreadcrumb/HiStepContent.js +0 -1
  5. package/HiBreadcrumb/HiStepLabel.js +12 -4
  6. package/HiBreadcrumb/HiStepper.js +1 -1
  7. package/HiButton/HiButton.js +7 -1
  8. package/HiCell/CellIcon.js +4 -4
  9. package/HiCell/CellImage.js +28 -4
  10. package/HiCell/CellNumeric.js +1 -2
  11. package/HiCell/CellRate.js +6 -3
  12. package/HiCell/CellSentinel.js +7 -10
  13. package/HiCell/CellSentinelScore.js +4 -4
  14. package/HiCell/CellTextStyled.js +99 -0
  15. package/HiCell/index.js +9 -1
  16. package/HiChip/HiChip.js +1 -0
  17. package/HiDatePicker/Caption.js +8 -9
  18. package/HiDatePicker/HiDateRangePicker.js +37 -19
  19. package/HiDatePicker/HiDateRangeSelector.js +24 -22
  20. package/HiDatePicker/Overlays/CustomOverlayLayout.js +26 -17
  21. package/HiDatePicker/Overlays/MonthPickerOverlay.spec.js +1 -0
  22. package/HiDatePicker/Overlays/Overlay.js +15 -8
  23. package/HiDatePicker/Overlays/Overlay.spec.js +1 -0
  24. package/HiDatePicker/Overlays/TimePickerOverlay.js +2 -2
  25. package/HiDatePicker/Overlays/TimePickerOverlay.spec.js +1 -0
  26. package/HiDatePicker/Overlays/YearPickerOverlay.js +2 -4
  27. package/HiDatePicker/Overlays/YearPickerOverlay.spec.js +1 -0
  28. package/HiDatePicker/stylesheet.js +3 -2
  29. package/HiDotsStepper/HiDot.js +108 -0
  30. package/HiDotsStepper/HiDotsStepper.js +121 -0
  31. package/HiExpansionPanel/HiExpansionPanel.js +1 -1
  32. package/HiForm/HiAddressField.js +176 -0
  33. package/HiForm/HiSlider.js +352 -0
  34. package/HiForm/HiUpload.js +204 -0
  35. package/HiForm/HiUploadField.js +182 -0
  36. package/HiForm/HiUploadInput.js +459 -0
  37. package/HiForm/index.js +16 -0
  38. package/HiMap/HiMap.js +345 -0
  39. package/HiMap/HiMapExpand.js +210 -0
  40. package/HiMap/index.js +23 -0
  41. package/HiNotice/HiKPI.js +238 -0
  42. package/HiNotice/HiKPINotice.js +93 -0
  43. package/HiNotice/index.js +23 -0
  44. package/HiPdfReader/HiPdfReader.js +269 -0
  45. package/HiPdfReader/index.js +15 -0
  46. package/HiRadio/HiRadio.js +74 -0
  47. package/HiRadio/index.js +15 -0
  48. package/HiSelect/HiSelect.js +73 -84
  49. package/HiSelect/HiSuggestSelect.js +32 -5
  50. package/HiSelect/SelectInput.js +5 -0
  51. package/HiSelectNew/HiNestedSelectContent.js +5 -1
  52. package/HiSelectNew/HiSelect.js +174 -137
  53. package/HiSelectNew/HiSelectContent.js +0 -8
  54. package/HiSelectNew/HiSelectInput.js +8 -9
  55. package/HiSelectableList/HiSelectableList.js +32 -4
  56. package/HiSelectableList/HiSelectableListItem.js +62 -24
  57. package/HiTable/HiCellBuilder.js +42 -32
  58. package/HiTable/HiTableHeader.js +28 -21
  59. package/HiTable/constants.js +3 -1
  60. package/README.md +249 -98
  61. package/es/HiBreadcrumb/HiBreadcrumb.js +14 -4
  62. package/es/HiBreadcrumb/HiStep.js +4 -1
  63. package/es/HiBreadcrumb/HiStepContent.js +0 -1
  64. package/es/HiBreadcrumb/HiStepLabel.js +13 -4
  65. package/es/HiBreadcrumb/HiStepper.js +1 -1
  66. package/es/HiButton/HiButton.js +7 -0
  67. package/es/HiCell/CellIcon.js +5 -5
  68. package/es/HiCell/CellImage.js +25 -2
  69. package/es/HiCell/CellNumeric.js +1 -2
  70. package/es/HiCell/CellRate.js +6 -3
  71. package/es/HiCell/CellSentinel.js +7 -10
  72. package/es/HiCell/CellSentinelScore.js +4 -4
  73. package/es/HiCell/CellTextStyled.js +84 -0
  74. package/es/HiCell/index.js +2 -1
  75. package/es/HiChip/HiChip.js +1 -0
  76. package/es/HiDatePicker/Caption.js +7 -9
  77. package/es/HiDatePicker/HiDateRangePicker.js +41 -25
  78. package/es/HiDatePicker/HiDateRangeSelector.js +24 -22
  79. package/es/HiDatePicker/ListPicker.js +1 -1
  80. package/es/HiDatePicker/Overlays/CustomOverlayLayout.js +30 -19
  81. package/es/HiDatePicker/Overlays/MonthPickerOverlay.js +2 -2
  82. package/es/HiDatePicker/Overlays/MonthPickerOverlay.spec.js +1 -0
  83. package/es/HiDatePicker/Overlays/Overlay.js +16 -9
  84. package/es/HiDatePicker/Overlays/Overlay.spec.js +1 -0
  85. package/es/HiDatePicker/Overlays/TimePickerOverlay.js +2 -2
  86. package/es/HiDatePicker/Overlays/TimePickerOverlay.spec.js +1 -0
  87. package/es/HiDatePicker/Overlays/YearPickerOverlay.js +2 -4
  88. package/es/HiDatePicker/Overlays/YearPickerOverlay.spec.js +1 -0
  89. package/es/HiDatePicker/stylesheet.js +3 -2
  90. package/es/HiDotsStepper/HiDot.js +66 -0
  91. package/es/HiDotsStepper/HiDotsStepper.js +73 -0
  92. package/es/HiExpansionPanel/HiExpansionPanel.js +1 -1
  93. package/es/HiForm/HiAddressField.js +134 -0
  94. package/es/HiForm/HiSlider.js +302 -0
  95. package/es/HiForm/HiUpload.js +158 -0
  96. package/es/HiForm/HiUploadField.js +140 -0
  97. package/es/HiForm/HiUploadInput.js +411 -0
  98. package/es/HiForm/index.js +2 -0
  99. package/es/HiMap/HiMap.js +290 -0
  100. package/es/HiMap/HiMapExpand.js +162 -0
  101. package/es/HiMap/index.js +2 -0
  102. package/es/HiNotice/HiKPI.js +196 -0
  103. package/es/HiNotice/HiKPINotice.js +77 -0
  104. package/es/HiNotice/index.js +2 -0
  105. package/es/HiPdfReader/HiPdfReader.js +214 -0
  106. package/es/HiPdfReader/index.js +1 -0
  107. package/es/HiRadio/HiRadio.js +55 -0
  108. package/es/HiRadio/index.js +1 -0
  109. package/es/HiSelect/HiSelect.js +68 -78
  110. package/es/HiSelect/HiSuggestSelect.js +27 -6
  111. package/es/HiSelect/SelectInput.js +5 -0
  112. package/es/HiSelectNew/HiNestedSelectContent.js +5 -1
  113. package/es/HiSelectNew/HiSelect.js +156 -120
  114. package/es/HiSelectNew/HiSelectContent.js +0 -7
  115. package/es/HiSelectNew/HiSelectInput.js +8 -9
  116. package/es/HiSelectableList/HiSelectableList.js +28 -6
  117. package/es/HiSelectableList/HiSelectableListItem.js +71 -24
  118. package/es/HiTable/HiCellBuilder.js +140 -136
  119. package/es/HiTable/HiTableHeader.js +26 -18
  120. package/es/HiTable/constants.js +1 -0
  121. package/es/index.js +7 -0
  122. package/es/utils/helpers.js +1 -1
  123. package/index.es.js +8 -1
  124. package/index.js +57 -1
  125. package/package.json +6 -3
  126. package/umd/hipay-material-ui.development.js +42114 -35120
  127. package/umd/hipay-material-ui.production.min.js +2 -2
  128. package/utils/helpers.js +1 -1
@@ -70,28 +70,6 @@ class HiSelect extends React.PureComponent {
70
70
  constructor(_props) {
71
71
  super(_props);
72
72
 
73
- this.handleClick = () => {
74
- if (this.state.open) {
75
- this.handleClose();
76
- } else {
77
- this.setState({
78
- open: true
79
- });
80
- const options = this.props.options.slice();
81
- this.handleSuggestions(options);
82
-
83
- if (this.props.onClick) {
84
- this.props.onClick();
85
- } // Gestion du focus
86
-
87
-
88
- if (!this.props.searchable) {
89
- // sinon focus sur le dernier élément selectionné
90
- this.focusOnSelectedItem();
91
- }
92
- }
93
- };
94
-
95
73
  this.buildHierarchyTrees = props => {
96
74
  // Construct two associative arrays
97
75
  // hierarchy[parentId] => children
@@ -153,6 +131,61 @@ class HiSelect extends React.PureComponent {
153
131
  }, 1);
154
132
  };
155
133
 
134
+ this.handleBlur = () => {
135
+ this.setState({
136
+ focused: false
137
+ });
138
+ };
139
+
140
+ this.handleClick = () => {
141
+ if (this.state.open) {
142
+ this.handleClose();
143
+ } else {
144
+ this.setState({
145
+ open: true
146
+ });
147
+ const options = this.props.options.slice();
148
+ this.handleSuggestions(options);
149
+
150
+ if (this.props.onClick) {
151
+ this.props.onClick();
152
+ } // Gestion du focus
153
+
154
+
155
+ if (!this.props.searchable) {
156
+ // sinon focus sur le dernier élément selectionné
157
+ this.focusOnSelectedItem();
158
+ }
159
+ }
160
+ };
161
+
162
+ this.handleClickAway = event => {
163
+ // Au clic sur le bouton, on laisse le handleClick fermer le select
164
+ if (!this.selectInputElement.contains(event.target)) {
165
+ this.handleClose(event);
166
+ }
167
+ };
168
+
169
+ this.handleClose = () => {
170
+ if (this.props.onClose) {
171
+ this.props.onClose();
172
+ }
173
+
174
+ if (this.selectInputElement) {
175
+ this.selectInputElement.focus();
176
+ }
177
+
178
+ this.setState({
179
+ open: false
180
+ });
181
+ };
182
+
183
+ this.handleFocus = () => {
184
+ this.setState({
185
+ focused: true
186
+ });
187
+ };
188
+
156
189
  this.handleKeyDown = event => {
157
190
  let nextItem;
158
191
 
@@ -186,36 +219,24 @@ class HiSelect extends React.PureComponent {
186
219
  }
187
220
  };
188
221
 
189
- this.handleFocus = () => {
190
- this.setState({
191
- focused: true
192
- });
193
- };
194
-
195
- this.handleBlur = () => {
196
- this.setState({
197
- focused: false
198
- });
222
+ this.handleRequestDelete = event => {
223
+ event.stopPropagation();
224
+ this.props.onChange(this.props.name, []);
199
225
  };
200
226
 
201
- this.handleClose = () => {
202
- if (this.props.onClose) {
203
- this.props.onClose();
204
- }
205
-
206
- if (this.selectInputElement) {
207
- this.selectInputElement.focus();
227
+ this.handleReset = event => {
228
+ if (this.props.onReset) {
229
+ event.stopPropagation();
230
+ this.props.onReset(event);
208
231
  }
209
-
210
- this.setState({
211
- open: false
212
- });
213
232
  };
214
233
 
215
- this.handleClickAway = event => {
216
- // Au clic sur le bouton, on laisse le handleClick fermer le select
217
- if (!this.selectInputElement.contains(event.target)) {
218
- this.handleClose(event);
234
+ this.handleScroll = event => {
235
+ if (!this.props.loadingMoreResults && this.props.hasMore && event.target.scrollHeight - event.target.clientHeight - event.target.scrollTop < 15) {
236
+ this.props.loadMoreResults(this.state.resultsPageNumber + 1);
237
+ this.setState(prevState => ({
238
+ resultsPageNumber: prevState.resultsPageNumber + 1
239
+ }));
219
240
  }
220
241
  };
221
242
 
@@ -386,20 +407,6 @@ class HiSelect extends React.PureComponent {
386
407
  });
387
408
  };
388
409
 
389
- this.handleRequestDelete = evt => {
390
- evt.stopPropagation();
391
- this.props.onChange(this.props.name, []);
392
- };
393
-
394
- this.handleScroll = event => {
395
- if (!this.props.loadingMoreResults && this.props.hasMore && event.target.scrollHeight - event.target.clientHeight - event.target.scrollTop < 15) {
396
- this.props.loadMoreResults(this.state.resultsPageNumber + 1);
397
- this.setState(prevState => ({
398
- resultsPageNumber: prevState.resultsPageNumber + 1
399
- }));
400
- }
401
- };
402
-
403
410
  this.state = {
404
411
  open: false,
405
412
  focused: false,
@@ -455,16 +462,6 @@ class HiSelect extends React.PureComponent {
455
462
  } else if (!_props.dynamic) {
456
463
  this.state.dynamic = true;
457
464
  }
458
-
459
- this.handleSelect = this.handleSelect.bind(this);
460
- this.handleClick = this.handleClick.bind(this);
461
- this.handleClose = this.handleClose.bind(this);
462
- this.handleClickAway = this.handleClickAway.bind(this);
463
- this.handleRequestDelete = this.handleRequestDelete.bind(this);
464
- this.handleSuggestions = this.handleSuggestions.bind(this);
465
- this.handleFocus = this.handleFocus.bind(this);
466
- this.handleBlur = this.handleBlur.bind(this);
467
- this.handleScroll = this.handleScroll.bind(this);
468
465
  }
469
466
 
470
467
  componentWillReceiveProps(nextProps) {
@@ -490,13 +487,6 @@ class HiSelect extends React.PureComponent {
490
487
  }
491
488
  }
492
489
 
493
- handleReset(event) {
494
- if (this.props.onReset) {
495
- event.stopPropagation();
496
- this.props.onReset(event);
497
- }
498
- }
499
-
500
490
  render() {
501
491
  const _this$props = this.props,
502
492
  {
@@ -6,11 +6,13 @@ import PropTypes from 'prop-types';
6
6
  import { findDOMNode } from 'react-dom';
7
7
  import Grow from '@material-ui/core/Grow';
8
8
  import Paper from '@material-ui/core/Paper';
9
+ import classNames from 'classnames';
9
10
  import HiSelectableList from '../HiSelectableList';
10
11
  import HiInput from '../HiForm/HiInput';
11
12
  import { withStyles } from '../styles';
12
13
  import Popper from '@material-ui/core/Popper';
13
14
  import { getNextItemSelectable } from '../utils/helpers';
15
+ import keycode from 'keycode';
14
16
  export const styles = theme => ({
15
17
  root: {
16
18
  backgroundColor: theme.palette.background2,
@@ -28,6 +30,9 @@ export const styles = theme => ({
28
30
  borderRadius: '0px 2px',
29
31
  maxHeight: 440,
30
32
  transition: 'none'
33
+ },
34
+ alignRight: {
35
+ right: 0
31
36
  }
32
37
  });
33
38
 
@@ -60,13 +65,20 @@ class HiSuggestSelect extends React.PureComponent {
60
65
 
61
66
  this.handleKeyDown = event => {
62
67
  let nextItem;
68
+ const key = keycode(event);
63
69
 
64
- if (event.key === 'ArrowDown') {
70
+ if (key === 'down') {
71
+ event.preventDefault();
65
72
  nextItem = getNextItemSelectable(document.activeElement, 'down');
66
- } else if (event.key === 'ArrowUp') {
73
+ } else if (key === 'up') {
74
+ event.preventDefault();
67
75
  nextItem = getNextItemSelectable(document.activeElement, 'up');
68
- } else if (event.key === 'Tab') {
76
+ } else if (key === 'tab') {
69
77
  document.body.style.overflow = 'auto';
78
+ } else if (key === 'escape' || 'enter') {
79
+ event.preventDefault();
80
+ const item = this.props.options.find(elem => String(elem.id) === event.target.id);
81
+ this.handleSelect(null, item);
70
82
  }
71
83
 
72
84
  if (nextItem) {
@@ -139,9 +151,10 @@ class HiSuggestSelect extends React.PureComponent {
139
151
  showMinLength,
140
152
  showNoResults,
141
153
  onSearch,
142
- translations
154
+ translations,
155
+ align
143
156
  } = _this$props,
144
- otherProps = _objectWithoutProperties(_this$props, ["classes", "id", "loading", "showMinLength", "showNoResults", "onSearch", "translations"]);
157
+ otherProps = _objectWithoutProperties(_this$props, ["classes", "id", "loading", "showMinLength", "showNoResults", "onSearch", "translations", "align"]);
145
158
 
146
159
  const {
147
160
  focused,
@@ -188,7 +201,9 @@ class HiSuggestSelect extends React.PureComponent {
188
201
  disablePortal: true,
189
202
  anchorEl: this.textInput,
190
203
  placement: "bottom-start",
191
- className: classes.popper,
204
+ className: classNames(classes.popper, {
205
+ [classes.alignRight]: align === 'right'
206
+ }),
192
207
  open: true
193
208
  }, React.createElement(Grow, {
194
209
  in: open,
@@ -211,6 +226,7 @@ class HiSuggestSelect extends React.PureComponent {
211
226
  }
212
227
 
213
228
  HiSuggestSelect.defaultProps = {
229
+ align: 'left',
214
230
  showMinLength: false,
215
231
  showNoResults: false,
216
232
  translations: {
@@ -220,6 +236,11 @@ HiSuggestSelect.defaultProps = {
220
236
  options: []
221
237
  };
222
238
  HiSuggestSelect.propTypes = process.env.NODE_ENV !== "production" ? {
239
+ /**
240
+ * Align popper on right or left of container
241
+ */
242
+ align: PropTypes.oneOf(['left', 'right']),
243
+
223
244
  /**
224
245
  * Useful to extend the style applied to components.
225
246
  */
@@ -300,6 +300,11 @@ SelectInput.propTypes = process.env.NODE_ENV !== "production" ? {
300
300
  */
301
301
  refElement: PropTypes.func,
302
302
 
303
+ /**
304
+ * Theme object
305
+ */
306
+ theme: PropTypes.object,
307
+
303
308
  /**
304
309
  * Valeur à afficher (déjà formattée)
305
310
  */
@@ -175,7 +175,6 @@ class HiNestedSelectContent extends React.PureComponent {
175
175
 
176
176
  this.buildSelectProps = (options, value = [], search = '', loading = false) => {
177
177
  const {
178
- classes,
179
178
  disabledParent,
180
179
  hasAll,
181
180
  iconAll,
@@ -291,6 +290,11 @@ HiNestedSelectContent.propTypes = process.env.NODE_ENV !== "production" ? {
291
290
  */
292
291
  hasAll: PropTypes.bool,
293
292
 
293
+ /**
294
+ * Propriétés du composant HiSelectableList
295
+ */
296
+ hiSelectableListProps: PropTypes.object,
297
+
294
298
  /**
295
299
  * id du select
296
300
  */
@@ -15,7 +15,7 @@ import withStyles from '../styles/withStyles';
15
15
  import { getNextItemSelectable, foldAccents } from '../utils/helpers';
16
16
  import HiIcon from '../HiIcon';
17
17
  import keycode from 'keycode';
18
- import classNames from "classnames";
18
+ import classNames from 'classnames';
19
19
  export const styles = theme => ({
20
20
  root: {
21
21
  backgroundColor: theme.palette.background2,
@@ -85,6 +85,97 @@ class HiSelect extends React.PureComponent {
85
85
  constructor(props) {
86
86
  super(props);
87
87
 
88
+ this.buildSelectProps = (options, value = [], search = '', loading = false) => {
89
+ // build item list
90
+ const itemList = [...(loading ? [{
91
+ id: '_loading',
92
+ type: 'loader',
93
+ disabled: true,
94
+ centered: true,
95
+ hideCheckbox: true,
96
+ label: 'loading'
97
+ }] : []), // simple one level filter on label
98
+ ...(search !== '' ? [...options.filter(item => item.label && foldAccents(item.label.toString().toLowerCase()).search(foldAccents(search.toLowerCase())) !== -1)] : [...(this.props.hasAll ? [_objectSpread({
99
+ id: '_all',
100
+ label: this.props.translations.all
101
+ }, this.props.iconAll && {
102
+ type: 'icon',
103
+ icon: this.props.iconAll
104
+ })] : []), ...options])];
105
+ return {
106
+ itemList,
107
+ inputValue: this.buildInputValue(options, value, loading)
108
+ };
109
+ };
110
+
111
+ this.buildInputValue = (options, value = [], loading = false) => {
112
+ const {
113
+ classes,
114
+ hasAll,
115
+ translations,
116
+ type
117
+ } = this.props; // build input value
118
+
119
+ let inputValue;
120
+
121
+ if (loading && value.length === 1) {
122
+ inputValue = translations.one_item_selected;
123
+ } else if (hasAll && options.length === value.length) {
124
+ inputValue = translations.all;
125
+ value.unshift('_all');
126
+ } else if (value.length > 1) {
127
+ inputValue = translations.n_items_selected.replace('%s', value.length);
128
+ } else if (value.length === 1) {
129
+ const item = options.find(o => o.id === value[0]);
130
+
131
+ if (item === undefined) {
132
+ inputValue = translations.one_item_selected;
133
+ } else if (type === 'icon' || item.type === 'icon') {
134
+ inputValue = React.createElement("span", {
135
+ className: classes.selectIconLabel
136
+ }, React.createElement(HiIcon, {
137
+ className: classes.labelIcon,
138
+ icon: item.icon
139
+ }), item.label);
140
+ } else if (type === 'image' || item.type === 'image') {
141
+ inputValue = React.createElement("span", {
142
+ className: classes.selectIconLabel
143
+ }, React.createElement("img", {
144
+ className: classes.labelImg,
145
+ src: item.img,
146
+ alt: item.label
147
+ }), item.label);
148
+ } else {
149
+ inputValue = item.label;
150
+ }
151
+ }
152
+
153
+ return inputValue;
154
+ };
155
+
156
+ this.focusOnFirstItem = () => {
157
+ const overlay = findDOMNode(this.overlay);
158
+ setTimeout(() => {
159
+ const item = overlay.getElementsByTagName('li')[0];
160
+ item.focus();
161
+ }, 1);
162
+ };
163
+
164
+ this.getInputElement = el => {
165
+ this.searchField = el;
166
+
167
+ if (this.props.inputRef) {
168
+ this.props.inputRef(this.searchField);
169
+ }
170
+ };
171
+
172
+ this.handleBlur = () => {
173
+ this.handleSearchReset();
174
+ this.setState({
175
+ focused: false
176
+ });
177
+ };
178
+
88
179
  this.handleClick = () => {
89
180
  if (this.state.open) {
90
181
  this.handleClose();
@@ -96,20 +187,58 @@ class HiSelect extends React.PureComponent {
96
187
  if (this.props.onClick) this.props.onClick(); // Gestion du focus
97
188
 
98
189
  if (!this.props.searchable) {
99
- // sinon focus sur le premier élément de la liste
100
- this.focusOnFirstItem();
190
+ // Sinon focus sur l'élément sélectionné
191
+ this.focusOnSelectedItem(this.props.value);
101
192
  }
102
193
  }
103
194
  };
104
195
 
105
- this.focusOnFirstItem = () => {
196
+ this.focusOnSelectedItem = selectedValue => {
106
197
  const overlay = findDOMNode(this.overlay);
107
198
  setTimeout(() => {
108
- const item = overlay.getElementsByTagName('li')[0];
109
- item.focus();
199
+ // On initialise au premier élément pour être sûr de ne pas se retrouver avec un focus of undefined
200
+ let item = overlay.getElementsByTagName('li')[0];
201
+
202
+ if (selectedValue && typeof selectedValue === 'string') {
203
+ item = overlay.getElementsByTagName('li')[selectedValue];
204
+ } else if (selectedValue && typeof selectedValue === 'number') {
205
+ item = overlay.getElementsByTagName('li')[selectedValue - 1];
206
+ }
207
+
208
+ if (item) {
209
+ item.focus();
210
+ }
110
211
  }, 1);
111
212
  };
112
213
 
214
+ this.handleClickAway = event => {
215
+ // Au clic sur le bouton, on laisse le handleClick fermer le select
216
+ if (!this.inputEl.contains(event.target)) {
217
+ this.handleClose(event);
218
+ }
219
+ };
220
+
221
+ this.handleClose = () => {
222
+ this.handleSearchReset();
223
+ this.setState({
224
+ open: false
225
+ });
226
+
227
+ if (this.props.onClose) {
228
+ this.props.onClose();
229
+ }
230
+
231
+ if (this.inputEl) {
232
+ this.inputEl.focus();
233
+ }
234
+ };
235
+
236
+ this.handleFocus = () => {
237
+ this.setState({
238
+ focused: true
239
+ });
240
+ };
241
+
113
242
  this.handleKeyDown = event => {
114
243
  let nextItem;
115
244
  const key = keycode(event);
@@ -149,36 +278,9 @@ class HiSelect extends React.PureComponent {
149
278
  }
150
279
  };
151
280
 
152
- this.handleFocus = () => {
153
- this.setState({
154
- focused: true
155
- });
156
- };
157
-
158
- this.handleBlur = () => {
159
- this.setState({
160
- focused: false
161
- });
162
- };
163
-
164
- this.handleClose = () => {
165
- this.setState({
166
- open: false
167
- });
168
-
169
- if (this.props.onClose) {
170
- this.props.onClose();
171
- }
172
-
173
- if (this.inputEl) {
174
- this.inputEl.focus();
175
- }
176
- };
177
-
178
- this.handleClickAway = event => {
179
- // Au clic sur le bouton, on laisse le handleClick fermer le select
180
- if (!this.inputEl.contains(event.target)) {
181
- this.handleClose(event);
281
+ this.handleScroll = e => {
282
+ if (e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop < 15) {
283
+ this.props.onScrollReachBottom();
182
284
  }
183
285
  };
184
286
 
@@ -244,12 +346,6 @@ class HiSelect extends React.PureComponent {
244
346
  }
245
347
  };
246
348
 
247
- this.handleScroll = e => {
248
- if (e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop < 15) {
249
- this.props.onScrollReachBottom();
250
- }
251
- };
252
-
253
349
  this.handleSearch = (e, inputValue) => {
254
350
  const searchValue = inputValue && e.target.value ? inputValue : e.target.value;
255
351
 
@@ -270,74 +366,6 @@ class HiSelect extends React.PureComponent {
270
366
  }, '');
271
367
  };
272
368
 
273
- this.buildSelectProps = (options, value = [], search = '', loading = false) => {
274
- // build item list
275
- const itemList = [...(loading ? [{
276
- id: '_loading',
277
- type: 'loader',
278
- disabled: true,
279
- centered: true,
280
- hideCheckbox: true,
281
- label: 'loading'
282
- }] : []), // simple one level filter on label
283
- ...(search !== '' ? [...options.filter(item => item.label && foldAccents(item.label.toString().toLowerCase()).search(foldAccents(search.toLowerCase())) !== -1)] : [...(this.props.hasAll ? [_objectSpread({
284
- id: '_all',
285
- label: this.props.translations.all
286
- }, this.props.iconAll && {
287
- type: 'icon',
288
- icon: this.props.iconAll
289
- })] : []), ...options])];
290
- return {
291
- itemList,
292
- inputValue: this.buildInputValue(options, value, loading)
293
- };
294
- };
295
-
296
- this.buildInputValue = (options, value = [], loading = false) => {
297
- const {
298
- classes,
299
- hasAll,
300
- translations,
301
- type
302
- } = this.props; // build input value
303
-
304
- let inputValue;
305
-
306
- if (loading && value.length === 1) {
307
- inputValue = translations.one_item_selected;
308
- } else if (hasAll && options.length === value.length) {
309
- inputValue = translations.all;
310
- value.unshift('_all');
311
- } else if (value.length > 1) {
312
- inputValue = translations.n_items_selected.replace('%s', value.length);
313
- } else if (value.length === 1) {
314
- const item = options.find(o => o.id === value[0]);
315
-
316
- if (item === undefined) {
317
- inputValue = translations.one_item_selected;
318
- } else if (type === 'icon' || item.type === 'icon') {
319
- inputValue = React.createElement("span", {
320
- className: classes.selectIconLabel
321
- }, React.createElement(HiIcon, {
322
- className: classes.labelIcon,
323
- icon: item.icon
324
- }), item.label);
325
- } else if (type === 'image' || item.type === 'image') {
326
- inputValue = React.createElement("span", {
327
- className: classes.selectIconLabel
328
- }, React.createElement("img", {
329
- className: classes.labelImg,
330
- src: item.img,
331
- alt: item.label
332
- }), item.label);
333
- } else {
334
- inputValue = item.label;
335
- }
336
- }
337
-
338
- return inputValue;
339
- };
340
-
341
369
  this.state = {
342
370
  open: false,
343
371
  focused: false,
@@ -365,14 +393,15 @@ class HiSelect extends React.PureComponent {
365
393
 
366
394
  return null;
367
395
  }
396
+ /**
397
+ * Build itemList & inputValue from select props
398
+ * @param options
399
+ * @param value
400
+ * @param search
401
+ * @param loading
402
+ * @returns {{itemList: *[], inputValue: *}}
403
+ */
368
404
 
369
- getInputElement(el) {
370
- this.searchField = el;
371
-
372
- if (this.props.inputRef) {
373
- this.props.inputRef(this.searchField);
374
- }
375
- }
376
405
 
377
406
  render() {
378
407
  const {
@@ -387,6 +416,7 @@ class HiSelect extends React.PureComponent {
387
416
  value,
388
417
  multiple,
389
418
  translations,
419
+ hiSearchInputProps,
390
420
  hiSelectableListProps,
391
421
  hiSelectInputProps,
392
422
  id,
@@ -446,7 +476,7 @@ class HiSelect extends React.PureComponent {
446
476
  }
447
477
  }, React.createElement(Paper, {
448
478
  className: classes.paper
449
- }, !!searchable && React.createElement(HiInput, {
479
+ }, !!searchable && React.createElement(HiInput, _extends({
450
480
  value: searchValue,
451
481
  autoFocus: true,
452
482
  inputRef: this.getInputElement,
@@ -456,7 +486,7 @@ class HiSelect extends React.PureComponent {
456
486
  placeholder: translations.search,
457
487
  startAdornment: 'search',
458
488
  tabIndex: 0
459
- }), startAdornment, React.createElement(Scrollbars, _extends({
489
+ }, hiSearchInputProps)), startAdornment, React.createElement(Scrollbars, _extends({
460
490
  ref: contentEl => {
461
491
  this.optionsContent = contentEl;
462
492
  },
@@ -522,6 +552,7 @@ HiSelect.defaultProps = {
522
552
  hasAll: false,
523
553
  hiSelectableListProps: {},
524
554
  hiSelectInputProps: {},
555
+ hiSearchInputProps: {},
525
556
  multiple: false,
526
557
  placeholder: '',
527
558
  searchable: false,
@@ -576,7 +607,12 @@ HiSelect.propTypes = process.env.NODE_ENV !== "production" ? {
576
607
  hasAll: PropTypes.bool,
577
608
 
578
609
  /**
579
- * Override HiSelectableList props (
610
+ * Override HiInput props (for search)
611
+ */
612
+ hiSearchInputProps: PropTypes.object,
613
+
614
+ /**
615
+ * Override HiSelectableList props
580
616
  */
581
617
  hiSelectableListProps: PropTypes.object,
582
618
 
@@ -7,7 +7,6 @@ import HiSelectableList from '../HiSelectableList';
7
7
  import HiInput from '../HiForm/HiInput';
8
8
  import withStyles from '../styles/withStyles';
9
9
  import { getNextItemSelectable, foldAccents } from '../utils/helpers';
10
- import HiIcon from '../HiIcon';
11
10
  import keycode from 'keycode';
12
11
  export const styles = theme => ({
13
12
  labelIcon: {
@@ -243,9 +242,6 @@ class HiSelectContent extends React.PureComponent {
243
242
 
244
243
  render() {
245
244
  const {
246
- classes,
247
- disabled,
248
- error,
249
245
  loading,
250
246
  options,
251
247
  searchable,
@@ -254,10 +250,7 @@ class HiSelectContent extends React.PureComponent {
254
250
  multiple,
255
251
  translations,
256
252
  hiSelectableListProps,
257
- hiSelectInputProps,
258
- id,
259
253
  onScrollReachBottom,
260
- onSubmit,
261
254
  startAdornment,
262
255
  searchValue = this.state.searchValue,
263
256
  buildSelectProps = this.buildSelectProps,