@hipay/hipay-material-ui 2.0.0-beta.57 → 2.0.0-beta.58

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,18 +10,25 @@ import DialogContentText from '@material-ui/core/DialogContentText';
10
10
  import DialogTitle from '@material-ui/core/DialogTitle';
11
11
  import { withStyles } from '../styles';
12
12
  import HiButton from '../HiButton';
13
+ import HiIcon from '../HiIcon';
13
14
  export const styles = theme => ({
14
15
  classContent: {
15
16
  fontSize: 14,
16
- lineHeight: '24px',
17
- color: '#484848'
17
+ lineHeight: '20px',
18
+ color: '#484848',
19
+ position: 'relative'
18
20
  },
19
- classPaper: {
20
- maxWidth: 300
21
+ classDialogPaper: {
22
+ minHeight: 280,
23
+ maxWidth: 280,
24
+ borderRadius: 2
21
25
  },
22
26
  classCancelButton: {
23
27
  float: 'right'
24
28
  },
29
+ classSubmitButton: {
30
+ margin: '0'
31
+ },
25
32
  classTitle: {
26
33
  fontSize: 20,
27
34
  fontFamily: theme.typography.fontFamily,
@@ -29,10 +36,20 @@ export const styles = theme => ({
29
36
  lineHeight: '24px'
30
37
  },
31
38
  classAction: {
32
- display: 'inline-block'
39
+ display: 'inline-block',
40
+ margin: '0',
41
+ padding: '0px 24px 24px 24px'
33
42
  },
34
43
  classDialogRoot: {
35
44
  backgroundColor: 'rgba(0, 0, 0, 0.28)'
45
+ },
46
+ classBackgroundIcon: {
47
+ position: 'absolute',
48
+ top: 'calc(50%)',
49
+ left: '50%',
50
+ transform: 'translate(-50%, -50%)',
51
+ color: theme.palette.background2,
52
+ flex: '1'
36
53
  }
37
54
  });
38
55
  /**
@@ -71,6 +88,8 @@ class HiAlertModal extends React.PureComponent {
71
88
  render() {
72
89
  const _this$props = this.props,
73
90
  {
91
+ backgroundIcon,
92
+ iconSize,
74
93
  classes,
75
94
  content,
76
95
  labelCancelButton,
@@ -78,19 +97,25 @@ class HiAlertModal extends React.PureComponent {
78
97
  onCancelClick,
79
98
  onSubmitClick,
80
99
  open,
100
+ cancelColor,
81
101
  submitColor,
82
102
  title
83
103
  } = _this$props,
84
- props = _objectWithoutProperties(_this$props, ["classes", "content", "labelCancelButton", "labelSubmitButton", "onCancelClick", "onSubmitClick", "open", "submitColor", "title"]);
104
+ props = _objectWithoutProperties(_this$props, ["backgroundIcon", "iconSize", "classes", "content", "labelCancelButton", "labelSubmitButton", "onCancelClick", "onSubmitClick", "open", "cancelColor", "submitColor", "title"]);
85
105
 
86
106
  return React.createElement(Dialog, _extends({
87
107
  open: open,
88
108
  onClose: this.handleOnClose,
89
109
  classes: {
90
- paper: classes.classPaper,
91
- root: classes.classDialogRoot
110
+ root: classes.classDialogRoot,
111
+ paper: classes.classDialogPaper
92
112
  }
93
- }, props), React.createElement(DialogTitle, {
113
+ }, props), backgroundIcon && React.createElement("div", {
114
+ className: classes.classBackgroundIcon
115
+ }, React.createElement(HiIcon, {
116
+ icon: backgroundIcon,
117
+ size: iconSize
118
+ })), React.createElement(DialogTitle, {
94
119
  disableTypography: true,
95
120
  classes: {
96
121
  root: classes.classTitle
@@ -103,21 +128,38 @@ class HiAlertModal extends React.PureComponent {
103
128
  classes: {
104
129
  root: classes.classAction
105
130
  }
106
- }, React.createElement(HiButton, {
131
+ }, labelSubmitButton && React.createElement(HiButton, {
132
+ classes: {
133
+ root: classes.classSubmitButton
134
+ },
107
135
  onClick: this.handleClickSubmit,
108
136
  color: submitColor
109
- }, labelSubmitButton), React.createElement(HiButton, {
137
+ }, labelSubmitButton), labelCancelButton && React.createElement(HiButton, {
110
138
  classes: {
111
139
  root: classes.classCancelButton
112
140
  },
113
141
  onClick: this.handleClickCancel,
114
- color: "neutral"
142
+ color: cancelColor
115
143
  }, labelCancelButton)));
116
144
  }
117
145
 
118
146
  }
119
147
 
148
+ HiAlertModal.defaultProps = {
149
+ cancelColor: 'neutral',
150
+ submitColor: 'primary'
151
+ };
120
152
  HiAlertModal.propTypes = process.env.NODE_ENV !== "production" ? {
153
+ /**
154
+ * Icon à mettre en fond
155
+ */
156
+ backgroundIcon: PropTypes.string,
157
+
158
+ /**
159
+ * The color of the cancel button. It supports those theme colors that make sense for this component.
160
+ */
161
+ cancelColor: PropTypes.oneOf(['default', 'inherit', 'primary', 'secondary', 'positive', 'negative', 'middle', 'neutral']),
162
+
121
163
  /**
122
164
  * Surcharge les classes du composant
123
165
  */
@@ -126,7 +168,7 @@ HiAlertModal.propTypes = process.env.NODE_ENV !== "production" ? {
126
168
  /**
127
169
  * Texte contenu dans la modal
128
170
  */
129
- content: PropTypes.string,
171
+ content: PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.node]),
130
172
 
131
173
  /**
132
174
  * Texte sur le bouton d'annulation
@@ -199,16 +199,14 @@ class HiFormControl extends React.PureComponent {
199
199
  focused: !disabled && (focused || hovered)
200
200
  }, InputLabelProps), error && errorText && React.createElement(HiIconButton, {
201
201
  className: classNames(classes.iconButton, classes.iconButtonError),
202
- onClick: this.handleHelperClick,
203
- onKeyDown: this.handleKeyDown
202
+ onClick: this.handleHelperClick
204
203
  }, React.createElement(Warning, {
205
204
  className: classNames(classes.icon)
206
205
  })), helperIcon && helperText && !error && React.createElement(HiIconButton, {
207
206
  className: classNames(classes.iconButton, classes.iconButtonInfo, {
208
207
  [classes.iconButtonInfoActive]: helperOpen
209
208
  }),
210
- onClick: this.handleHelperClick,
211
- onKeyDown: this.handleKeyDown
209
+ onClick: this.handleHelperClick
212
210
  }, React.createElement(Info, {
213
211
  className: classNames(classes.icon)
214
212
  }))), React.createElement("div", {
@@ -177,10 +177,15 @@ class HiInput extends React.PureComponent {
177
177
  // Si on click sur un élément de HiInput, on garde le focus
178
178
  // Par exemple sur l'icone reset
179
179
  if (event.relatedTarget && this.overlayNode && this.overlayNode.contains(event.relatedTarget)) {
180
- if (this.endAdornmentNode.contains(event.relatedTarget) && this.props.onBlur) {
180
+ // If blur came from erase icon => stay focused and don't call onBlur props
181
+ if (this.eraseIconNode && this.eraseIconNode.contains(event.relatedTarget)) {
182
+ event.preventDefault();
183
+ event.stopPropagation();
184
+ } else if (this.endAdornmentNode.contains(event.relatedTarget) && this.props.onBlur) {
181
185
  this.props.onBlur(event);
182
186
  }
183
187
 
188
+ event.preventDefault();
184
189
  event.stopPropagation();
185
190
  } else {
186
191
  this.setState({
@@ -201,9 +206,13 @@ class HiInput extends React.PureComponent {
201
206
  this.setState({
202
207
  focused: true
203
208
  });
204
- }
209
+ } // If focus came from erase icon => stay focused and don't call onFocus props
210
+
205
211
 
206
- if (this.props.onFocus) {
212
+ if (this.eraseIconNode && this.eraseIconNode.contains(event.relatedTarget)) {
213
+ event.preventDefault();
214
+ event.stopPropagation();
215
+ } else if (this.props.onFocus) {
207
216
  this.props.onFocus(event);
208
217
  }
209
218
  }
@@ -306,7 +315,10 @@ class HiInput extends React.PureComponent {
306
315
  label: classes.eraseButtonLabel
307
316
  },
308
317
  onClick: this.handleReset,
309
- onBlur: this.handleBlur
318
+ onBlur: this.handleBlur,
319
+ buttonRef: el => {
320
+ this.eraseIconNode = el;
321
+ }
310
322
  }, _ref);
311
323
  let endAdornment = endAdornmentProps;
312
324
 
@@ -22,7 +22,8 @@ export const styles = theme => ({
22
22
  fontSize: '80px'
23
23
  },
24
24
  inputContainer: {
25
- flex: '1'
25
+ flex: '1',
26
+ width: 'calc(100% - 88px)'
26
27
  },
27
28
  empty: {
28
29
  border: `1px solid ${theme.palette.input.bottomLine}`,
@@ -193,17 +193,13 @@ class HiSelect extends React.PureComponent {
193
193
  nextItem = getNextItemSelectable(document.activeElement, 'down');
194
194
  } else if (event.key === 'ArrowUp') {
195
195
  nextItem = getNextItemSelectable(document.activeElement, 'up');
196
- } else if (event.key === 'Tab') {
196
+ } else if (event.key === 'Tab' || event.key === 'Escape') {
197
197
  /* if (!this.props.staticPosition) {
198
198
  document.body.style.overflow = 'auto';
199
199
  } */
200
200
  this.setState({
201
201
  open: false
202
202
  });
203
- } else if (event.key === 'Escape') {
204
- this.setState({
205
- open: false
206
- });
207
203
  }
208
204
 
209
205
  if (nextItem) {
@@ -216,6 +212,10 @@ class HiSelect extends React.PureComponent {
216
212
  this.focusOnSelectedItem();
217
213
  } else if (event.key === 'Enter' && this.props.onSubmit) {
218
214
  this.props.onSubmit(event);
215
+ } else if (event.key === 'Tab' || event.key === 'Escape') {
216
+ this.setState({
217
+ open: false
218
+ });
219
219
  }
220
220
  };
221
221
 
@@ -682,6 +682,7 @@ class HiSelect extends React.PureComponent {
682
682
  onClick: this.handleClick,
683
683
  onFocus: this.handleFocus,
684
684
  onBlur: this.handleBlur,
685
+ onKeyDown: this.handleKeyDown,
685
686
  onMouseEnter: this.props.onMouseEnter,
686
687
  onMouseLeave: this.props.onMouseLeave,
687
688
  refElement: el => {
@@ -24,7 +24,8 @@ export const styles = theme => ({
24
24
  width: '100% !important',
25
25
  transform: 'none !important',
26
26
  zIndex: '9 !important',
27
- top: '100% !important'
27
+ top: '100% !important',
28
+ textOverflow: 'ellipsis'
28
29
  },
29
30
  paper: {
30
31
  borderRadius: '0px 2px',
@@ -185,6 +185,7 @@ class SelectInput extends React.PureComponent {
185
185
  className: iconClass,
186
186
  icon: "arrow_drop_down"
187
187
  })) : React.createElement(ButtonBase, {
188
+ component: "div",
188
189
  id: id,
189
190
  classes: {
190
191
  root: rootClass
@@ -6,7 +6,6 @@ import Scrollbars from 'react-custom-scrollbars';
6
6
  import Grow from '@material-ui/core/Grow';
7
7
  import Paper from '@material-ui/core/Paper';
8
8
  import Popper from '@material-ui/core/Popper';
9
- import { findDOMNode } from 'react-dom';
10
9
  import ClickAwayListener from '@material-ui/core/ClickAwayListener';
11
10
  import HiSelectableList from '../HiSelectableList';
12
11
  import HiInput from '../HiForm/HiInput';
@@ -164,11 +163,12 @@ class HiSelect extends React.PureComponent {
164
163
  };
165
164
 
166
165
  this.focusOnFirstItem = () => {
167
- const overlay = findDOMNode(this.overlay);
168
- setTimeout(() => {
169
- const item = overlay.getElementsByTagName('li')[0];
170
- item.focus();
171
- }, 1);
166
+ if (this.overlay && this.overlay.getElementsByTagName('li')[0]) {
167
+ setTimeout(() => {
168
+ const item = this.overlay.getElementsByTagName('li')[0];
169
+ item.focus();
170
+ }, 1);
171
+ }
172
172
  };
173
173
 
174
174
  this.getInputElement = el => {
@@ -204,15 +204,14 @@ class HiSelect extends React.PureComponent {
204
204
  };
205
205
 
206
206
  this.focusOnSelectedItem = selectedValue => {
207
- const overlay = findDOMNode(this.overlay);
208
207
  setTimeout(() => {
209
208
  // On initialise au premier élément pour être sûr de ne pas se retrouver avec un focus of undefined
210
- let item = overlay.getElementsByTagName('li')[0];
209
+ let item = this.overlay.getElementsByTagName('li')[0];
211
210
 
212
211
  if (selectedValue && typeof selectedValue === 'string') {
213
- item = overlay.getElementsByTagName('li')[selectedValue];
212
+ item = this.overlay.getElementsByTagName('li')[selectedValue];
214
213
  } else if (selectedValue && typeof selectedValue === 'number') {
215
- item = overlay.getElementsByTagName('li')[selectedValue - 1];
214
+ item = this.overlay.getElementsByTagName('li')[selectedValue - 1];
216
215
  }
217
216
 
218
217
  if (item) {
@@ -249,6 +248,17 @@ class HiSelect extends React.PureComponent {
249
248
  });
250
249
  };
251
250
 
251
+ this.handleKeyDownInput = event => {
252
+ const key = keycode(event);
253
+
254
+ if (key === 'down' || key === 'up') {
255
+ this.handleClick();
256
+ } else if (key === 'enter' && this.props.onSubmit) {
257
+ event.preventDefault();
258
+ this.props.onSubmit(event);
259
+ }
260
+ };
261
+
252
262
  this.handleKeyDown = event => {
253
263
  let nextItem;
254
264
  const key = keycode(event);
@@ -259,6 +269,13 @@ class HiSelect extends React.PureComponent {
259
269
  } else if (key === 'up') {
260
270
  event.preventDefault();
261
271
  nextItem = getNextItemSelectable(document.activeElement, 'up');
272
+ } else if (key === 'tab' || key === 'esc') {
273
+ this.setState({
274
+ open: false
275
+ });
276
+ } else if (key === 'space') {
277
+ // Cancel scroll
278
+ event.preventDefault();
262
279
  }
263
280
 
264
281
  if (nextItem) {
@@ -266,17 +283,57 @@ class HiSelect extends React.PureComponent {
266
283
  }
267
284
  };
268
285
 
286
+ this.getItemById = id => {
287
+ let item;
288
+
289
+ if (this.props.hasAll && String(id) === '_all') {
290
+ return {
291
+ id: '_all'
292
+ };
293
+ }
294
+
295
+ for (let i = 0; i < this.props.options.length; i += 1) {
296
+ const elem = this.props.options[i];
297
+
298
+ if (String(elem.id) === String(id)) {
299
+ item = elem;
300
+ break;
301
+ }
302
+
303
+ if (elem.children) {
304
+ for (let j = 0; j < elem.children.length; j += 1) {
305
+ if (String(elem.children[j].id) === String(id)) {
306
+ item = elem.children[j];
307
+ break;
308
+ }
309
+ }
310
+ }
311
+ }
312
+
313
+ return item;
314
+ };
315
+
269
316
  this.handleKeyUp = event => {
270
317
  const key = keycode(event);
271
318
 
272
- if (key === 'tab' || key === 'esc') {
319
+ if (key === 'esc') {
273
320
  this.setState({
274
321
  open: false
275
322
  });
276
323
  } else if (key === 'space' || key === 'enter' && !this.props.multiple) {
277
324
  event.preventDefault();
278
- const item = this.props.options.find(elem => String(elem.id) === event.target.id);
279
- this.handleSelect(null, item);
325
+ const item = this.getItemById(event.target.id);
326
+
327
+ if (item) {
328
+ // Select for nested select
329
+ if (this.props.hiSelectableListProps && this.props.hiSelectableListProps.onSelect) {
330
+ this.props.hiSelectableListProps.onSelect(null, item);
331
+ } else {
332
+ this.handleSelect(null, item);
333
+ }
334
+ } else {
335
+ console.warn(`Can not find item #${event.target.id}`);
336
+ }
280
337
  } else if (key === 'enter' && this.props.multiple) {
281
338
  event.preventDefault();
282
339
  this.handleClose();
@@ -291,6 +348,10 @@ class HiSelect extends React.PureComponent {
291
348
  } else if (this.overlay && key === 'esc' || key === 'enter') {
292
349
  event.preventDefault();
293
350
  this.handleClose();
351
+ } else if (key === 'tab') {
352
+ this.setState({
353
+ open: false
354
+ });
294
355
  }
295
356
  };
296
357
 
@@ -484,8 +545,8 @@ class HiSelect extends React.PureComponent {
484
545
  [classes.popperRightAlign]: this.props.containerWidth && this.props.align === 'right'
485
546
  });
486
547
 
487
- let searchInput = position => {
488
- if (!!searchable) {
548
+ const searchInput = position => {
549
+ if (searchable) {
489
550
  return React.createElement(HiInput, _extends({
490
551
  value: searchValue,
491
552
  autoFocus: true,
@@ -508,13 +569,13 @@ class HiSelect extends React.PureComponent {
508
569
 
509
570
  if (this.placement && this.placement.indexOf('top') >= 0 && !!searchable) {
510
571
  // +1 for search input
511
- let nbItems = itemList.length <= 10 ? itemList.length + 1 : 11;
572
+ const nbItems = itemList.length <= 10 ? itemList.length + 1 : 11;
512
573
  popperStyle.transform = `translate3d(-1px, -${nbItems * 40 + 2}px, 0px)`;
513
574
  } else if (this.placement && this.placement.indexOf('top') < 0 && !!searchable) {
514
- popperStyle.transform = `translate3d(-1px, 40px, 0px)`;
575
+ popperStyle.transform = 'translate3d(-1px, 40px, 0px)';
515
576
  }
516
577
 
517
- let content = ({
578
+ const content = ({
518
579
  placement
519
580
  }) => {
520
581
  if (placement !== this.placement) {
@@ -568,6 +629,7 @@ class HiSelect extends React.PureComponent {
568
629
  onClick: this.handleClick,
569
630
  onFocus: this.handleFocus,
570
631
  onBlur: this.handleBlur,
632
+ onKeyDown: this.handleKeyDownInput,
571
633
  onSubmit: onSubmit,
572
634
  onMouseEnter: this.props.onMouseEnter,
573
635
  onMouseLeave: this.props.onMouseLeave,
@@ -127,6 +127,7 @@ class HiSelectInput extends React.PureComponent {
127
127
 
128
128
  if (this.props.onKeyDown) {
129
129
  this.props.onKeyDown(event);
130
+ event.preventDefault();
130
131
  } else if (key === 'down' || key === 'up') {
131
132
  this.props.onClick();
132
133
  } else if (key === 'enter' && this.props.onSubmit) {
@@ -146,8 +147,12 @@ class HiSelectInput extends React.PureComponent {
146
147
  };
147
148
 
148
149
  this.handleClick = event => {
150
+ // Do not open select if press on resetIcon
149
151
  if ((!this.resetIcon || !this.resetIcon.contains(event.target)) && this.props.onClick) {
150
- this.props.onClick(event);
152
+ // Do not open select if press enter on button => submit form
153
+ if (event.type !== 'keydown' || keycode(event) !== 'enter') {
154
+ this.props.onClick(event);
155
+ }
151
156
  }
152
157
  };
153
158
 
@@ -225,6 +230,7 @@ class HiSelectInput extends React.PureComponent {
225
230
  }, value || placeholder), React.createElement(ArrowDropDownIcon, {
226
231
  className: iconClass
227
232
  })) : React.createElement(ButtonBase, {
233
+ component: "div",
228
234
  id: id,
229
235
  className: rootClass,
230
236
  onClick: this.handleClick,
@@ -5,8 +5,7 @@ import PropTypes from 'prop-types';
5
5
  import List from '@material-ui/core/List';
6
6
  import withStyles from '../styles/withStyles';
7
7
  import HiSelectableListItem from './HiSelectableListItem';
8
- import { foldAccents, getNextItemSelectable } from '../utils/helpers';
9
- import keycode from 'keycode';
8
+ import { foldAccents } from '../utils/helpers';
10
9
  export const styles = () => ({
11
10
  root: {
12
11
  padding: 0
@@ -24,31 +23,6 @@ class HiSelectableList extends React.PureComponent {
24
23
  this.props.onSelect(event, item);
25
24
  };
26
25
 
27
- this.handleKeyDown = event => {
28
- let nextItem;
29
- const key = keycode(event);
30
-
31
- if (key === 'down') {
32
- event.preventDefault();
33
- nextItem = getNextItemSelectable(document.activeElement, 'down');
34
- } else if (key === 'up') {
35
- event.preventDefault();
36
- nextItem = getNextItemSelectable(document.activeElement, 'up');
37
- } else if (key === 'space' || key === 'enter' && !this.props.multiple) {
38
- event.preventDefault();
39
- const item = this.props.options.find(elem => String(elem.id) === event.target.id);
40
- this.handleSelect(null, item);
41
- }
42
-
43
- if (nextItem) {
44
- nextItem.focus();
45
- }
46
- };
47
-
48
- this.handleKeyUp = () => {
49
- return false;
50
- };
51
-
52
26
  this.buildRecursiveListItem = (item, level = 0) => {
53
27
  const _this$props = this.props,
54
28
  {
@@ -60,8 +34,8 @@ class HiSelectableList extends React.PureComponent {
60
34
  icon,
61
35
  selectedItemIdList,
62
36
  sort,
63
- onKeyDown = this.handleKeyDown,
64
- onKeyUp = this.handleKeyUp
37
+ onKeyDown,
38
+ onKeyUp
65
39
  } = _this$props,
66
40
  others = _objectWithoutProperties(_this$props, ["checkedIcon", "disabled", "disabledItemIdList", "hideCheckbox", "hoverIcon", "icon", "selectedItemIdList", "sort", "onKeyDown", "onKeyUp"]);
67
41
 
package/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license HiPay-Material-UI v2.0.0-beta.57
1
+ /** @license HiPay-Material-UI v2.0.0-beta.58
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license HiPay-Material-UI v2.0.0-beta.57
1
+ /** @license HiPay-Material-UI v2.0.0-beta.58
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@hipay/hipay-material-ui",
3
3
  "private": false,
4
4
  "author": "HiPay PSYCHE Team",
5
- "version": "2.0.0-beta.57",
5
+ "version": "2.0.0-beta.58",
6
6
  "description": "React components that implement Google's Material Design.",
7
7
  "keywords": [
8
8
  "react",