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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/HiDatePicker/HiDatePicker.js +37 -12
  3. package/HiDatePicker/HiDateRangePicker.js +71 -57
  4. package/HiDatePicker/HiDateRangeSelector.js +34 -20
  5. package/HiDatePicker/stylesheet.js +32 -17
  6. package/HiSelect/HiSelect.js +489 -607
  7. package/HiSelect/index.js +41 -3
  8. package/HiSelectableList/HiSelectableList.js +68 -3
  9. package/HiSelectableList/HiSelectableListItem.js +22 -10
  10. package/README.md +15 -0
  11. package/es/HiDatePicker/HiDatePicker.js +30 -10
  12. package/es/HiDatePicker/HiDateRangePicker.js +38 -21
  13. package/es/HiDatePicker/HiDateRangeSelector.js +24 -13
  14. package/es/HiDatePicker/stylesheet.js +32 -17
  15. package/es/{HiSelectNew → HiSelect}/HiNestedSelect.js +1 -1
  16. package/es/{HiSelectNew → HiSelect}/HiNestedSelectContent.js +1 -1
  17. package/es/HiSelect/HiSelect.js +441 -564
  18. package/es/{HiSelectNew → HiSelect}/HiSelectContent.js +1 -1
  19. package/es/HiSelect/index.js +4 -1
  20. package/es/HiSelectableList/HiSelectableList.js +65 -4
  21. package/es/HiSelectableList/HiSelectableListItem.js +18 -10
  22. package/es/styles/createPalette.js +1 -1
  23. package/es/utils/helpers.js +9 -1
  24. package/index.es.js +1 -1
  25. package/index.js +1 -1
  26. package/package.json +1 -1
  27. package/styles/createPalette.js +1 -1
  28. package/umd/hipay-material-ui.development.js +7860 -7749
  29. package/umd/hipay-material-ui.production.min.js +2 -2
  30. package/utils/helpers.js +9 -1
  31. package/HiSelect/SelectInput.js +0 -369
  32. package/HiSelectNew/HiSelect.js +0 -929
  33. package/HiSelectNew/HiSelectField.js +0 -146
  34. package/HiSelectNew/index.js +0 -69
  35. package/es/HiSelect/SelectInput.js +0 -321
  36. package/es/HiSelectNew/HiSelect.js +0 -852
  37. package/es/HiSelectNew/HiSelectField.js +0 -111
  38. package/es/HiSelectNew/index.js +0 -6
  39. /package/{HiSelectNew → HiSelect}/HiDynamicSelect.js +0 -0
  40. /package/{HiSelectNew → HiSelect}/HiDynamicSelectField.js +0 -0
  41. /package/{HiSelectNew → HiSelect}/HiNestedSelect.js +0 -0
  42. /package/{HiSelectNew → HiSelect}/HiNestedSelectContent.js +0 -0
  43. /package/{HiSelectNew → HiSelect}/HiNestedSelectField.js +0 -0
  44. /package/{HiSelectNew → HiSelect}/HiSelectContent.js +0 -0
  45. /package/{HiSelectNew → HiSelect}/HiSelectInput.js +0 -0
  46. /package/es/{HiSelectNew → HiSelect}/HiDynamicSelect.js +0 -0
  47. /package/es/{HiSelectNew → HiSelect}/HiDynamicSelectField.js +0 -0
  48. /package/es/{HiSelectNew → HiSelect}/HiNestedSelectField.js +0 -0
  49. /package/es/{HiSelectNew → HiSelect}/HiSelectInput.js +0 -0
package/HiSelect/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
+
3
5
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
6
 
5
7
  Object.defineProperty(exports, "__esModule", {
@@ -11,16 +13,46 @@ Object.defineProperty(exports, "default", {
11
13
  return _HiSelect.default;
12
14
  }
13
15
  });
16
+ Object.defineProperty(exports, "HiNestedSelect", {
17
+ enumerable: true,
18
+ get: function get() {
19
+ return _HiNestedSelect.default;
20
+ }
21
+ });
14
22
  Object.defineProperty(exports, "HiSelectField", {
15
23
  enumerable: true,
16
24
  get: function get() {
17
25
  return _HiSelectField.default;
18
26
  }
19
27
  });
20
- Object.defineProperty(exports, "SelectInput", {
28
+ Object.defineProperty(exports, "HiSelectInput", {
29
+ enumerable: true,
30
+ get: function get() {
31
+ return _HiSelectInput.default;
32
+ }
33
+ });
34
+ Object.defineProperty(exports, "HiSelectContent", {
35
+ enumerable: true,
36
+ get: function get() {
37
+ return _HiSelectContent.default;
38
+ }
39
+ });
40
+ Object.defineProperty(exports, "HiNestedSelectContent", {
41
+ enumerable: true,
42
+ get: function get() {
43
+ return _HiNestedSelectContent.default;
44
+ }
45
+ });
46
+ Object.defineProperty(exports, "findFinalItemRecursively", {
47
+ enumerable: true,
48
+ get: function get() {
49
+ return _HiNestedSelectContent.findFinalItemRecursively;
50
+ }
51
+ });
52
+ Object.defineProperty(exports, "getRecursiveFinalItemIdList", {
21
53
  enumerable: true,
22
54
  get: function get() {
23
- return _SelectInput.default;
55
+ return _HiNestedSelectContent.getRecursiveFinalItemIdList;
24
56
  }
25
57
  });
26
58
  Object.defineProperty(exports, "HiSuggestSelect", {
@@ -38,9 +70,15 @@ Object.defineProperty(exports, "HiSuggestSelectField", {
38
70
 
39
71
  var _HiSelect = _interopRequireDefault(require("./HiSelect"));
40
72
 
73
+ var _HiNestedSelect = _interopRequireDefault(require("./HiNestedSelect"));
74
+
41
75
  var _HiSelectField = _interopRequireDefault(require("./HiSelectField"));
42
76
 
43
- var _SelectInput = _interopRequireDefault(require("./SelectInput"));
77
+ var _HiSelectInput = _interopRequireDefault(require("./HiSelectInput"));
78
+
79
+ var _HiSelectContent = _interopRequireDefault(require("./HiSelectContent"));
80
+
81
+ var _HiNestedSelectContent = _interopRequireWildcard(require("./HiNestedSelectContent"));
44
82
 
45
83
  var _HiSuggestSelect = _interopRequireDefault(require("./HiSuggestSelect"));
46
84
 
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = exports.styles = void 0;
9
9
 
10
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
+
10
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
13
 
12
14
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
@@ -33,6 +35,8 @@ var _HiSelectableListItem = _interopRequireDefault(require("./HiSelectableListIt
33
35
 
34
36
  var _helpers = require("../utils/helpers");
35
37
 
38
+ var _keycode = _interopRequireDefault(require("keycode"));
39
+
36
40
  var styles = function styles() {
37
41
  return {
38
42
  root: {
@@ -42,6 +46,8 @@ var styles = function styles() {
42
46
  };
43
47
  /**
44
48
  * Construit une liste d'item sélectionnable (avec checkbox)
49
+ * - la navigation au clavier est gérée par l'event KeyDown
50
+ * - le premier focus est géré sur le DidMount
45
51
  */
46
52
 
47
53
 
@@ -71,6 +77,23 @@ function (_React$PureComponent) {
71
77
  };
72
78
  };
73
79
 
80
+ _this.handleKeyDown = function (event) {
81
+ var nextItem;
82
+ var key = (0, _keycode.default)(event);
83
+
84
+ if (key === 'down') {
85
+ event.preventDefault();
86
+ nextItem = (0, _helpers.getNextItemSelectable)(document.activeElement, 'down');
87
+ } else if (key === 'up') {
88
+ event.preventDefault();
89
+ nextItem = (0, _helpers.getNextItemSelectable)(document.activeElement, 'up');
90
+ }
91
+
92
+ if (nextItem) {
93
+ nextItem.focus();
94
+ }
95
+ };
96
+
74
97
  _this.buildRecursiveListItem = function (item) {
75
98
  var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
76
99
  var _this$props = _this.props,
@@ -103,7 +126,8 @@ function (_React$PureComponent) {
103
126
  onKeyDown: onKeyDown,
104
127
  onKeyUp: onKeyUp,
105
128
  selected: selectedItemIdList.includes(item.id) // item props override upper props (disabled, hideCheckbox, icon, level...)
106
-
129
+ ,
130
+ item: item
107
131
  }, item)), item.children && item.children.length > 0 && item.children.filter(function (subItem) {
108
132
  return !(subItem.displayed === false);
109
133
  }).map(function (subItem) {
@@ -112,6 +136,10 @@ function (_React$PureComponent) {
112
136
  };
113
137
 
114
138
  _this.compareItem = function (a, b) {
139
+ if (_this.props.comparItemFunc) {
140
+ return _this.props.comparItemFunc(a, b);
141
+ }
142
+
115
143
  if (a.label === undefined || b.label === undefined) {
116
144
  return 0;
117
145
  }
@@ -133,6 +161,24 @@ function (_React$PureComponent) {
133
161
  }
134
162
 
135
163
  (0, _createClass2.default)(HiSelectableList, [{
164
+ key: "componentDidMount",
165
+ value: function componentDidMount() {
166
+ if (this.props.overlay && this.props.overlay.getElementsByTagName('li')[0]) {
167
+ var item = this.props.overlay.getElementsByTagName('li')[0];
168
+ var value = (0, _typeof2.default)(this.props.value) === 'object' ? this.props.value[0] : this.props.value;
169
+
170
+ if (value) {
171
+ if (typeof this.props.value[0] === 'string') {
172
+ item = this.props.overlay.getElementsByTagName('li')[value];
173
+ } else if (typeof this.props.value[0] === 'number') {
174
+ item = this.props.overlay.getElementsByTagName('li')[value - 1];
175
+ }
176
+ }
177
+
178
+ item.focus();
179
+ }
180
+ }
181
+ }, {
136
182
  key: "render",
137
183
  value: function render() {
138
184
  var _this2 = this;
@@ -147,7 +193,11 @@ function (_React$PureComponent) {
147
193
  }
148
194
 
149
195
  return _react.default.createElement(_List.default, {
150
- className: classes.root
196
+ className: classes.root,
197
+ onKeyDown: this.handleKeyDown,
198
+ innerRef: function innerRef(el) {
199
+ _this2.el = el;
200
+ }
151
201
  }, itemList.filter(function (item) {
152
202
  return !(item.displayed === false);
153
203
  }) // don't remove if undefined
@@ -184,6 +234,11 @@ HiSelectableList.propTypes = process.env.NODE_ENV !== "production" ? {
184
234
  */
185
235
  classes: _propTypes.default.object,
186
236
 
237
+ /**
238
+ * Fonction de comparaison utilisée pour les tris
239
+ */
240
+ comparItemFunc: _propTypes.default.func,
241
+
187
242
  /**
188
243
  * Désactive la listes
189
244
  */
@@ -222,6 +277,11 @@ HiSelectableList.propTypes = process.env.NODE_ENV !== "production" ? {
222
277
  */
223
278
  onSelect: _propTypes.default.func.isRequired,
224
279
 
280
+ /**
281
+ * Overlay récupéré au niveau de la div précédant le HiSelectInput
282
+ */
283
+ overlay: _propTypes.default.object,
284
+
225
285
  /**
226
286
  * Liste des id des éléments sélectionnés
227
287
  */
@@ -235,7 +295,12 @@ HiSelectableList.propTypes = process.env.NODE_ENV !== "production" ? {
235
295
  /**
236
296
  * Liste des éléments à placer en premier, peu import le tri
237
297
  */
238
- sortAppendList: _propTypes.default.array
298
+ sortAppendList: _propTypes.default.array,
299
+
300
+ /**
301
+ * Value(s) du select
302
+ */
303
+ value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array])
239
304
  } : {};
240
305
 
241
306
  var _default = (0, _withStyles.default)(styles, {
@@ -47,6 +47,8 @@ var _helpers = require("../utils/helpers");
47
47
 
48
48
  var _pure = _interopRequireDefault(require("recompose/pure"));
49
49
 
50
+ var _keycode = _interopRequireDefault(require("keycode"));
51
+
50
52
  var PureListSubheader = (0, _pure.default)(_ListSubheader.default);
51
53
  var PureListItem = (0, _pure.default)(_ListItem.default);
52
54
 
@@ -98,9 +100,6 @@ var styles = function styles(theme) {
98
100
  cursor: 'default',
99
101
  opacity: 'inherit'
100
102
  },
101
- selected: {
102
- backgroundColor: theme.palette.action.selected
103
- },
104
103
  pinned: {
105
104
  display: 'inherit',
106
105
  marginRight: 8,
@@ -198,6 +197,7 @@ var styles = function styles(theme) {
198
197
  };
199
198
  /**
200
199
  * Construit un élément de liste sélectionnable (avec checkbox)
200
+ * - la sélection/déséclection d'un item est géré avec KeyDown
201
201
  */
202
202
 
203
203
 
@@ -222,6 +222,20 @@ function (_React$PureComponent) {
222
222
  };
223
223
  };
224
224
 
225
+ _this.handleKeyDown = function (item) {
226
+ return function (event) {
227
+ var key = (0, _keycode.default)(event);
228
+
229
+ if (key === 'space' || key === 'enter') {
230
+ event.preventDefault();
231
+
232
+ if (item) {
233
+ _this.props.onSelect(null, item);
234
+ }
235
+ }
236
+ };
237
+ };
238
+
225
239
  _this.state = {
226
240
  hover: false
227
241
  };
@@ -292,8 +306,6 @@ function (_React$PureComponent) {
292
306
  fallbackImage = _this$props2.fallbackImage,
293
307
  hideCheckbox = _this$props2.hideCheckbox,
294
308
  onSelect = _this$props2.onSelect,
295
- onKeyDown = _this$props2.onKeyDown,
296
- onKeyUp = _this$props2.onKeyUp,
297
309
  indeterminate = _this$props2.indeterminate,
298
310
  indeterminateIcon = _this$props2.indeterminateIcon,
299
311
  icon = _this$props2.icon,
@@ -309,7 +321,8 @@ function (_React$PureComponent) {
309
321
  secondaryLabel = _this$props2.secondaryLabel,
310
322
  thin = _this$props2.thin,
311
323
  type = _this$props2.type,
312
- color = _this$props2.color; // Return simple loader list item
324
+ color = _this$props2.color,
325
+ item = _this$props2.item; // Return simple loader list item
313
326
 
314
327
  if (type === 'loader') {
315
328
  return _react.default.createElement(_ListItem.default, null, _react.default.createElement(_HiLoader.default, {
@@ -335,14 +348,13 @@ function (_React$PureComponent) {
335
348
  classes: {
336
349
  root: classes.root
337
350
  },
338
- className: (0, _classnames.default)(classes.listItem, classes.listItemHover, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.selected, selected), (0, _defineProperty2.default)(_classNames, classes.thin, thin), (0, _defineProperty2.default)(_classNames, classes.pinned, pinned), (0, _defineProperty2.default)(_classNames, classes.inline, secondaryInline), (0, _defineProperty2.default)(_classNames, classes.listItemWithoutSecondaryInline, !secondaryInline), (0, _defineProperty2.default)(_classNames, classes.listItemInlineWithInfoWithoutSecondary, secondaryInline && info && !secondaryLabel), _classNames)),
351
+ className: (0, _classnames.default)(classes.listItem, classes.listItemHover, (_classNames = {}, (0, _defineProperty2.default)(_classNames, classes.disabled, disabled), (0, _defineProperty2.default)(_classNames, classes.thin, thin), (0, _defineProperty2.default)(_classNames, classes.pinned, pinned), (0, _defineProperty2.default)(_classNames, classes.inline, secondaryInline), (0, _defineProperty2.default)(_classNames, classes.listItemWithoutSecondaryInline, !secondaryInline), (0, _defineProperty2.default)(_classNames, classes.listItemInlineWithInfoWithoutSecondary, secondaryInline && info && !secondaryLabel), _classNames)),
339
352
  disabled: disabled
340
353
  }, disabled || {
341
354
  onClick: onSelect,
342
355
  onMouseEnter: this.setHover(true),
343
356
  onMouseLeave: this.setHover(false),
344
- onKeyDown: onKeyDown,
345
- onKeyUp: onKeyUp
357
+ onKeyDown: this.handleKeyDown(item)
346
358
  }, {
347
359
  style: {
348
360
  paddingLeft: "".concat(paddingLeft + level * 32, "px")
@@ -350,7 +362,7 @@ function (_React$PureComponent) {
350
362
  }), _react.default.createElement("div", {
351
363
  className: (0, _classnames.default)(classes.labelContent, (0, _defineProperty2.default)({}, classes.labelWithoutSecondaryInline, !secondaryInline || !secondaryLabel && !info))
352
364
  }, !hideCheckbox && !pinned && _react.default.createElement(_HiCheckbox.default, {
353
- tabIndex: onKeyDown ? '-1' : 0,
365
+ tabIndex: 0,
354
366
  classes: {
355
367
  root: !secondaryInline ? classes.checkboxWithSecondaryInline : classes.checkbox
356
368
  },
package/README.md CHANGED
@@ -78,6 +78,18 @@ https://reactjs.org/docs/reconciliation.html
78
78
  - Attention aux refs et aux mutations
79
79
  ex: ne pas passer une arrow fonction directement dans les props d'un composant. Même pour y inclure un index ou une valeur contextuelle !
80
80
 
81
+ #### Gestion des événements clavier
82
+
83
+ - **Evénement capturé** : on part sur le _KeyDown_, c'est le seul à capturer toutes les touches du clavier ([source](https://www.w3schools.com/jsref/event_onkeypress.asp))
84
+
85
+ - **Capturing** : il s'agit de la première phase par laquelle passe un événement lors de sa capture, durant celle-ci, il descend dans l’arborescence HTML en partant de l'élément racine (en React : Parent => Enfant, on peut le capturer avec _onKeyDownCapture_)
86
+
87
+ - **Bubbling** : c'est la deuxième phase par laquelle passe un événement et celle capturée par défaut lorsque l'on fait un _onKeyDown_. A ce moment, l'événement remonte vers l'élément HTML racine (en React : Enfant => Parent)
88
+
89
+ - **PreventDefault** : on l'utilisera à chaque fois qu'il faudra éviter un comportement par défaut du navigateur.
90
+
91
+ - **StopPropagation** : il permet de stopper la capture dès qu'il est appelé. Couplé au Capturing on peut, par exemple, éviter qu'un événement soit capturé dans un composant enfant.
92
+
81
93
  ## Contribuer
82
94
 
83
95
  #### A savoir
@@ -300,3 +312,6 @@ au lieu de
300
312
  Attention aux index.js.
301
313
  La bonne syntaxe est :
302
314
  export { default as MyComponente } from './MyComponente';
315
+
316
+
317
+ [source]: https://www.w3schools.com/jsref/event_onkeypress.asp
@@ -3,6 +3,7 @@ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProper
3
3
  import _extends from "@babel/runtime/helpers/extends";
4
4
  import React from 'react';
5
5
  import PropTypes from 'prop-types';
6
+ import moment from 'moment-timezone';
6
7
  import MomentLocaleUtils from 'react-day-picker/moment';
7
8
  import HiLocaleUtils from './hiLocaleUtils';
8
9
  import DayPickerInput from 'react-day-picker/DayPickerInput';
@@ -20,9 +21,18 @@ import styles from './stylesheet';
20
21
  class HiDatePicker extends React.Component {
21
22
  constructor(props) {
22
23
  super();
24
+
25
+ this.handleKeyDown = name => event => {
26
+ if (event.key === 'Escape' && !event.shiftKey) {
27
+ this.datePickerInput.hideDayPicker();
28
+ event.stopPropagation();
29
+ }
30
+ };
31
+
32
+ const today = moment().tz(props.timezoneName);
23
33
  this.state = {
24
34
  openedPanel: 'calendar',
25
- currentMonth: props.value ? props.value : new Date()
35
+ currentMonth: props.value ? props.value : new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
26
36
  }; // this.formatDate = this.formatDate.bind(this);
27
37
 
28
38
  this.handleCalendarClick = this.handleCalendarClick.bind(this);
@@ -46,15 +56,16 @@ class HiDatePicker extends React.Component {
46
56
  clearTimeout(this.timeout);
47
57
  }
48
58
 
49
- handleReset() {
50
- this.handleCurrentMonthChange(new Date());
51
- this.props.onReset();
52
- }
53
-
54
59
  handleInputChange(event) {
55
60
  this.props.onChange(event.target.value);
56
61
  }
57
62
 
63
+ handleReset() {
64
+ const today = moment().tz(this.props.timezoneName);
65
+ this.handleCurrentMonthChange(new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds()));
66
+ this.props.onReset();
67
+ }
68
+
58
69
  handleDayChange(day, modifiers) {
59
70
  if (day) {
60
71
  if (modifiers.selected) {
@@ -198,11 +209,12 @@ class HiDatePicker extends React.Component {
198
209
  const {
199
210
  currentMonth
200
211
  } = this.state;
212
+ const today = moment().tz(this.props.timezoneName);
201
213
 
202
214
  const effectiveDisabledDays = _objectSpread({}, disablePastDays && {
203
- before: new Date()
215
+ before: new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
204
216
  }, disableFutureDays && {
205
- after: new Date()
217
+ after: new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
206
218
  }, disabledDays);
207
219
 
208
220
  const modifiersStyles = {
@@ -229,7 +241,8 @@ class HiDatePicker extends React.Component {
229
241
  fromMonth: minimumDate,
230
242
  modifiers: {
231
243
  disabled: effectiveDisabledDays,
232
- selected: value
244
+ selected: value,
245
+ [classes.currentDay]: new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
233
246
  },
234
247
  modifiersStyles,
235
248
  month: currentMonth
@@ -248,7 +261,8 @@ class HiDatePicker extends React.Component {
248
261
  });
249
262
 
250
263
  return React.createElement("div", {
251
- className: classes.root
264
+ className: classes.root,
265
+ onKeyDown: this.handleKeyDown()
252
266
  }, React.createElement(DayPickerInput, {
253
267
  ref: el => {
254
268
  this.datePickerInput = el;
@@ -279,6 +293,7 @@ HiDatePicker.defaultProps = {
279
293
  locale: 'fr-FR',
280
294
  minimumDate: new Date(2013, 4, 1),
281
295
  // by default 1 May 2013
296
+ timezoneName: 'Europe/Paris',
282
297
  translations: {
283
298
  today: 'today'
284
299
  }
@@ -347,6 +362,11 @@ HiDatePicker.propTypes = process.env.NODE_ENV !== "production" ? {
347
362
  */
348
363
  onSubmit: PropTypes.func,
349
364
 
365
+ /**
366
+ * Timezone de l'utilisateur
367
+ */
368
+ timezoneName: PropTypes.string,
369
+
350
370
  /**
351
371
  * Traductions
352
372
  */
@@ -3,6 +3,7 @@ import _objectSpread from "@babel/runtime/helpers/objectSpread";
3
3
  import _extends from "@babel/runtime/helpers/extends";
4
4
  import React from 'react';
5
5
  import PropTypes from 'prop-types';
6
+ import moment from 'moment-timezone';
6
7
  import MomentLocaleUtils from 'react-day-picker/moment';
7
8
  import HiLocaleUtils from './hiLocaleUtils';
8
9
  import DayPickerInput from 'react-day-picker/DayPickerInput';
@@ -17,7 +18,6 @@ import NavBar from './NavBar';
17
18
  import Weekday from './Weekday';
18
19
  import { HiTextField } from '../HiForm';
19
20
  import styles from './stylesheet';
20
- import moment from 'moment';
21
21
  import HiFormControl from '../HiForm/HiFormControl';
22
22
 
23
23
  class HiDateRangePicker extends React.Component {
@@ -58,8 +58,10 @@ class HiDateRangePicker extends React.Component {
58
58
 
59
59
  this.onDayToClick = day => {
60
60
  let change = moment(day) >= moment(this.props.from);
61
+ const today = moment().tz(this.props.timezoneName);
62
+ const todayDate = new Date(today.year(), today.month(), today.date(), 23, 59, 59);
61
63
 
62
- if (change && this.props.disableFutureDays && moment(day).utc() > moment().utc().endOf('day')) {
64
+ if (change && day > todayDate) {
63
65
  change = false;
64
66
  }
65
67
 
@@ -85,11 +87,13 @@ class HiDateRangePicker extends React.Component {
85
87
 
86
88
  this.handleChange = (name, day) => {
87
89
  const {
88
- translations
90
+ translations,
91
+ timezoneName
89
92
  } = this.props;
90
93
  let date;
91
94
  let error;
92
- const now = new Date();
95
+ const today = moment().tz(timezoneName);
96
+ const now = new Date(today.year(), today.month(), today.date(), 23, 59, 59);
93
97
  const {
94
98
  minimumDate,
95
99
  disableFutureDays,
@@ -115,8 +119,8 @@ class HiDateRangePicker extends React.Component {
115
119
  error = translations.to_superior_from;
116
120
  } else if (moment(date).utc() < moment(minimumDate).utc().startOf('day')) {
117
121
  error = translations.date_inferior_min_date.replace('%s', moment(minimumDate).format(format));
118
- } else if (disableFutureDays && moment(date).utc() > moment(now).utc().endOf('day')) {
119
- error = translations.date_superior_max_date.replace('%s', moment().format(format));
122
+ } else if (disableFutureDays && date > now) {
123
+ error = translations.date_superior_max_date.replace('%s', moment().tz(timezoneName).format(format));
120
124
  }
121
125
 
122
126
  if (!this.props.enableTime) {
@@ -165,15 +169,11 @@ class HiDateRangePicker extends React.Component {
165
169
 
166
170
  this.handleReset = name => {
167
171
  this.handleChange(name, undefined);
168
- this.setState(prevState => ({
169
- keyFrom: prevState.keyFrom === 1 ? 2 : 1,
170
- keyTo: prevState.keyTo === 1 ? 2 : 1
171
- }));
172
172
  };
173
173
 
174
174
  this.handleKeyDown = name => event => {
175
175
  if (event.key === 'Tab' && !event.shiftKey) {
176
- let nodeName = document.activeElement.nodeName;
176
+ const nodeName = document.activeElement.nodeName;
177
177
 
178
178
  if (this.props[name] && nodeName === 'INPUT' && document.activeElement.nextSibling.children.length > 0) {
179
179
  document.activeElement.nextSibling.focus();
@@ -191,6 +191,14 @@ class HiDateRangePicker extends React.Component {
191
191
  document.activeElement.blur();
192
192
  }, 1);
193
193
  }
194
+ } else if (event.key === 'Escape' && !event.shiftKey) {
195
+ if (name === 'from') {
196
+ this.fromInput.hideDayPicker();
197
+ } else if (name === 'to') {
198
+ this.toInput.hideDayPicker();
199
+ }
200
+
201
+ event.stopPropagation();
194
202
  }
195
203
  };
196
204
 
@@ -276,12 +284,12 @@ class HiDateRangePicker extends React.Component {
276
284
  }, yearPickerProps, propsOverlay));
277
285
  };
278
286
 
287
+ const _today = moment().tz(this.props.timezoneName);
288
+
279
289
  this.state = {
280
- currentMonth: new Date(),
290
+ currentMonth: new Date(_today.year(), _today.month(), _today.date()),
281
291
  focusedInput: '',
282
- openedPanel: 'calendar',
283
- keyFrom: 1,
284
- keyTo: 1
292
+ openedPanel: 'calendar'
285
293
  };
286
294
  }
287
295
 
@@ -313,14 +321,17 @@ class HiDateRangePicker extends React.Component {
313
321
  errorText,
314
322
  hasSelector,
315
323
  helperIcon,
316
- helperText
324
+ helperText,
325
+ timezoneName
317
326
  } = _this$props,
318
- props = _objectWithoutProperties(_this$props, ["classes", "disabled", "disabledDays", "disableFutureDays", "enableTime", "labelFrom", "labelTo", "locale", "format", "from", "fromError", "minimumDate", "onReset", "to", "toError", "translations", "id", "staticPosition", "errorText", "hasSelector", "helperIcon", "helperText"]);
327
+ props = _objectWithoutProperties(_this$props, ["classes", "disabled", "disabledDays", "disableFutureDays", "enableTime", "labelFrom", "labelTo", "locale", "format", "from", "fromError", "minimumDate", "onReset", "to", "toError", "translations", "id", "staticPosition", "errorText", "hasSelector", "helperIcon", "helperText", "timezoneName"]);
319
328
 
320
- const now = new Date();
329
+ const today = moment().tz(timezoneName);
330
+ const now = new Date(today.year(), today.month(), today.date(), 23, 59, 59, 999);
321
331
  const modifiers = {
322
332
  start: from,
323
- end: to
333
+ end: to,
334
+ [classes.currentDay]: new Date(today.year(), today.month(), today.date())
324
335
  };
325
336
  const modifiersStyles = {
326
337
  start: {
@@ -440,7 +451,7 @@ class HiDateRangePicker extends React.Component {
440
451
  onFocus: () => this.handleDayPickerFocus('from'),
441
452
  onKeyDown: this.handleKeyDown('from')
442
453
  }, React.createElement("div", null, React.createElement(DayPickerInput, {
443
- key: this.state.keyFrom,
454
+ key: '1',
444
455
  ref: el => {
445
456
  this.fromInput = el;
446
457
  },
@@ -461,7 +472,7 @@ class HiDateRangePicker extends React.Component {
461
472
  onBlur: () => this.handleDayPickerBlur('to'),
462
473
  onKeyDown: this.handleKeyDown('to')
463
474
  }, React.createElement(DayPickerInput, {
464
- key: this.state.keyTo,
475
+ key: '1',
465
476
  ref: el => {
466
477
  this.toInput = el;
467
478
  },
@@ -505,6 +516,7 @@ HiDateRangePicker.defaultProps = {
505
516
  locale: 'fr-FR',
506
517
  minimumDate: new Date(2013, 4, 1),
507
518
  // by default 1 May 2013
519
+ timezoneName: 'Europe/Paris',
508
520
  translations: {
509
521
  today: 'today',
510
522
  hour: 'Hour',
@@ -636,6 +648,11 @@ HiDateRangePicker.propTypes = process.env.NODE_ENV !== "production" ? {
636
648
  */
637
649
  staticPosition: PropTypes.bool,
638
650
 
651
+ /**
652
+ * Timezone de l'utilisateur
653
+ */
654
+ timezoneName: PropTypes.string,
655
+
639
656
  /**
640
657
  * Date de fin sélectionnée
641
658
  */
@@ -6,7 +6,7 @@ import moment from 'moment-timezone';
6
6
  import { findDOMNode } from 'react-dom';
7
7
  import Grid from '@material-ui/core/Grid';
8
8
  import withStyles from '../styles/withStyles';
9
- import HiSelectField from '../HiSelectNew/HiSelectField';
9
+ import HiSelectField from '../HiSelect/HiSelectField';
10
10
  import HiDateRangePicker from './HiDateRangePicker';
11
11
  import HiFormControl from '../HiForm/HiFormControl';
12
12
  export function findSeparator(format) {
@@ -187,18 +187,7 @@ class HiDateRangeSelector extends React.Component {
187
187
  [name]: value,
188
188
  key: prevState.key === 1 ? 2 : 1
189
189
  }));
190
- const selectedOption = this.options.find(option => option.id === value);
191
-
192
- if (selectedOption) {
193
- this.props.onChange('from', new Date(selectedOption.from.format('YYYY-MM-DD HH:mm:ss')));
194
- this.props.onChange('to', new Date(selectedOption.to.format('YYYY-MM-DD HH:mm:ss')));
195
- this.props.onChange('fromError', false);
196
- this.props.onChange('toError', false);
197
- }
198
-
199
- if (this.props.returnSelectValue === true) {
200
- this.props.onChange('period', value);
201
- }
190
+ this.updateDates(value);
202
191
  };
203
192
 
204
193
  this.options = props.availableOptionKeys.map(key => buildDateRangeOptionByKey(key, props.translations, props.format, props.timezoneName));
@@ -226,10 +215,32 @@ class HiDateRangeSelector extends React.Component {
226
215
  }
227
216
  }
228
217
 
218
+ componentDidUpdate(prevProps) {
219
+ if (prevProps.timezoneName !== this.props.timezoneName) {
220
+ this.options = this.props.availableOptionKeys.map(key => buildDateRangeOptionByKey(key, this.props.translations, this.props.format, this.props.timezoneName));
221
+ this.updateDates(this.state.selectedPreset);
222
+ }
223
+ }
224
+
229
225
  componentWillUnmount() {
230
226
  clearTimeout(this.timeout); // TODO : supprimer ?
231
227
  }
232
228
 
229
+ updateDates(value) {
230
+ const selectedOption = this.options.find(option => option.id === value);
231
+
232
+ if (selectedOption) {
233
+ this.props.onChange('from', new Date(selectedOption.from.format('YYYY-MM-DD HH:mm:ss')));
234
+ this.props.onChange('to', new Date(selectedOption.to.format('YYYY-MM-DD HH:mm:ss')));
235
+ this.props.onChange('fromError', false);
236
+ this.props.onChange('toError', false);
237
+ }
238
+
239
+ if (this.props.returnSelectValue === true) {
240
+ this.props.onChange('period', value);
241
+ }
242
+ }
243
+
233
244
  render() {
234
245
  const _this$props = this.props,
235
246
  {