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

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.
@@ -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",