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

Sign up to get free protection for your applications and to get access to all the features.
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,