@hipay/hipay-material-ui 2.0.0-beta.59 → 2.0.0-beta.61

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/HiCell/CellNumeric.js +1 -1
  3. package/HiDatePicker/HiDatePicker.js +48 -14
  4. package/HiDatePicker/HiDateRangePicker.js +119 -64
  5. package/HiDatePicker/HiDateRangeSelector.js +70 -47
  6. package/HiDatePicker/Overlays/YearPickerOverlay.js +8 -3
  7. package/HiDatePicker/stylesheet.js +32 -17
  8. package/HiForm/HiFormControl.js +26 -11
  9. package/HiForm/HiFormLabel.js +3 -1
  10. package/HiForm/HiInput.js +20 -1
  11. package/HiForm/HiUpload.js +290 -45
  12. package/HiForm/HiUploadField.js +19 -51
  13. package/HiForm/HiUploadInput.js +18 -7
  14. package/HiSelectNew/HiSelect.js +15 -16
  15. package/HiSelectableList/HiSelectableList.js +9 -0
  16. package/HiSelectableList/HiSelectableListItem.js +3 -7
  17. package/README.md +1 -1
  18. package/es/HiCell/CellNumeric.js +1 -1
  19. package/es/HiDatePicker/HiDatePicker.js +41 -12
  20. package/es/HiDatePicker/HiDateRangePicker.js +79 -28
  21. package/es/HiDatePicker/HiDateRangeSelector.js +59 -37
  22. package/es/HiDatePicker/Overlays/YearPickerOverlay.js +8 -3
  23. package/es/HiDatePicker/stylesheet.js +32 -17
  24. package/es/HiForm/HiFormControl.js +27 -11
  25. package/es/HiForm/HiFormLabel.js +3 -1
  26. package/es/HiForm/HiInput.js +19 -1
  27. package/es/HiForm/HiUpload.js +276 -35
  28. package/es/HiForm/HiUploadField.js +19 -43
  29. package/es/HiForm/HiUploadInput.js +16 -7
  30. package/es/HiSelectNew/HiSelect.js +15 -16
  31. package/es/HiSelectableList/HiSelectableList.js +9 -0
  32. package/es/HiSelectableList/HiSelectableListItem.js +3 -7
  33. package/es/styles/createPalette.js +1 -1
  34. package/es/utils/helpers.js +15 -6
  35. package/index.es.js +1 -1
  36. package/index.js +1 -1
  37. package/package.json +4 -4
  38. package/styles/createPalette.js +1 -1
  39. package/umd/hipay-material-ui.development.js +6301 -383
  40. package/umd/hipay-material-ui.production.min.js +2 -2
  41. package/utils/helpers.js +15 -5
@@ -112,6 +112,10 @@ function (_React$PureComponent) {
112
112
  };
113
113
 
114
114
  _this.compareItem = function (a, b) {
115
+ if (_this.props.comparItemFunc) {
116
+ return _this.props.comparItemFunc(a, b);
117
+ }
118
+
115
119
  if (a.label === undefined || b.label === undefined) {
116
120
  return 0;
117
121
  }
@@ -184,6 +188,11 @@ HiSelectableList.propTypes = process.env.NODE_ENV !== "production" ? {
184
188
  */
185
189
  classes: _propTypes.default.object,
186
190
 
191
+ /**
192
+ * Fonction de comparaison utilisée pour les tris
193
+ */
194
+ comparItemFunc: _propTypes.default.func,
195
+
187
196
  /**
188
197
  * Désactive la listes
189
198
  */
@@ -71,7 +71,7 @@ var styles = function styles(theme) {
71
71
  display: 'block'
72
72
  },
73
73
  '&$inline': {
74
- maxHeight: 40,
74
+ minHeight: 40,
75
75
  '& $secondaryLabel': {
76
76
  display: 'inline-block'
77
77
  }
@@ -128,7 +128,7 @@ var styles = function styles(theme) {
128
128
  '& strong': {
129
129
  fontWeight: theme.typography.fontWeightMedium
130
130
  },
131
- display: 'inline-flex'
131
+ display: 'contents'
132
132
  }),
133
133
  listItemContentSelected: {},
134
134
  label: {
@@ -158,7 +158,6 @@ var styles = function styles(theme) {
158
158
  fontSize: 12,
159
159
  textOverflow: 'ellipsis',
160
160
  textAlign: 'right',
161
- padding: '4px 0px 4px 8px',
162
161
  alignSelf: 'center'
163
162
  }),
164
163
  img: {
@@ -172,7 +171,7 @@ var styles = function styles(theme) {
172
171
  verticalAlign: 'middle'
173
172
  },
174
173
  labelContent: {
175
- display: 'flex',
174
+ display: '-webkit-flex',
176
175
  alignItems: 'center',
177
176
  maxWidth: '85%',
178
177
  '&$labelWithoutSecondaryInline': {
@@ -190,9 +189,6 @@ var styles = function styles(theme) {
190
189
  },
191
190
  '&$infosWithoutSecondaryInline': {
192
191
  paddingLeft: 28
193
- },
194
- '&$infosWithSecondaryInline': {
195
- marginTop: -8
196
192
  }
197
193
  },
198
194
  infosInlineWithoutSecondary: {},
package/README.md CHANGED
@@ -226,7 +226,7 @@ npm install -g conventional-changelog-cli
226
226
  npm install -g cz-conventional-changelog
227
227
  ```
228
228
 
229
- 1. Changer la version dans packages/hipay-material-ui/package.json
229
+ 1. Changer la version dans package.json et dans packages/hipay-material-ui/package.json
230
230
  2. Générer le fichier HI-CHANGELOG.md : ```npm run changelog```
231
231
  3. Commiter la release : ```git ci -am "chore(release): VERSION DATE```
232
232
  4. Build : ```npm run build```
@@ -25,7 +25,7 @@ class CellNumeric extends React.PureComponent {
25
25
  let title = '';
26
26
 
27
27
  if (currency) {
28
- displayedValue = formatCurrencyAmount(value, view, locale, currency);
28
+ displayedValue = formatCurrencyAmount(value, view, locale, currency, precision);
29
29
  title = formatCurrencyAmount(value, 'l', locale, currency);
30
30
  } else {
31
31
  displayedValue = formatNumber(value, view, locale, precision);
@@ -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) {
@@ -169,7 +180,8 @@ class HiDatePicker extends React.Component {
169
180
  renderYearPickerOverlay(propsOverlay) {
170
181
  const yearPickerProps = {
171
182
  value: this.state.currentMonth,
172
- onChange: this.handleCurrentMonthChange
183
+ onChange: this.handleCurrentMonthChange,
184
+ disableFutureDays: this.props.disableFutureDays
173
185
  };
174
186
  return React.createElement(YearPickerOverlay, _extends({
175
187
  key: 'year-picker-overlay'
@@ -197,11 +209,12 @@ class HiDatePicker extends React.Component {
197
209
  const {
198
210
  currentMonth
199
211
  } = this.state;
212
+ const today = moment().tz(this.props.timezoneName);
200
213
 
201
214
  const effectiveDisabledDays = _objectSpread({}, disablePastDays && {
202
- before: new Date()
215
+ before: new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
203
216
  }, disableFutureDays && {
204
- after: new Date()
217
+ after: new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
205
218
  }, disabledDays);
206
219
 
207
220
  const modifiersStyles = {
@@ -228,7 +241,8 @@ class HiDatePicker extends React.Component {
228
241
  fromMonth: minimumDate,
229
242
  modifiers: {
230
243
  disabled: effectiveDisabledDays,
231
- selected: value
244
+ selected: value,
245
+ [classes.currentDay]: new Date(today.year(), today.month(), today.date(), today.hours(), today.minutes(), today.seconds(), today.milliseconds())
232
246
  },
233
247
  modifiersStyles,
234
248
  month: currentMonth
@@ -240,11 +254,15 @@ class HiDatePicker extends React.Component {
240
254
  const inputProps = _objectSpread({}, onReset && {
241
255
  onReset: this.handleReset
242
256
  }, props, {
243
- onChange: this.handleInputChange
257
+ onChange: this.handleInputChange,
258
+ HiInputProps: {
259
+ onSubmit: this.props.onSubmit
260
+ }
244
261
  });
245
262
 
246
263
  return React.createElement("div", {
247
- className: classes.root
264
+ className: classes.root,
265
+ onKeyDown: this.handleKeyDown()
248
266
  }, React.createElement(DayPickerInput, {
249
267
  ref: el => {
250
268
  this.datePickerInput = el;
@@ -275,6 +293,7 @@ HiDatePicker.defaultProps = {
275
293
  locale: 'fr-FR',
276
294
  minimumDate: new Date(2013, 4, 1),
277
295
  // by default 1 May 2013
296
+ timezoneName: 'Europe/Paris',
278
297
  translations: {
279
298
  today: 'today'
280
299
  }
@@ -338,6 +357,16 @@ HiDatePicker.propTypes = process.env.NODE_ENV !== "production" ? {
338
357
  */
339
358
  onReset: PropTypes.func,
340
359
 
360
+ /**
361
+ * Callback lorsque l'utilisateur tape sur "Entrée"
362
+ */
363
+ onSubmit: PropTypes.func,
364
+
365
+ /**
366
+ * Timezone de l'utilisateur
367
+ */
368
+ timezoneName: PropTypes.string,
369
+
341
370
  /**
342
371
  * Traductions
343
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,10 +169,37 @@ 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
+ };
173
+
174
+ this.handleKeyDown = name => event => {
175
+ if (event.key === 'Tab' && !event.shiftKey) {
176
+ const nodeName = document.activeElement.nodeName;
177
+
178
+ if (this.props[name] && nodeName === 'INPUT' && document.activeElement.nextSibling.children.length > 0) {
179
+ document.activeElement.nextSibling.focus();
180
+ } else if (name === 'from') {
181
+ this.handleDayPickerBlur('from');
182
+ this.handleDayPickerFocus('to');
183
+ this.toInput.handleInputFocus();
184
+ setTimeout(() => {
185
+ document.getElementById(`${this.props.id}-to`).focus();
186
+ }, 1);
187
+ } else if (name === 'to') {
188
+ this.handleDayPickerBlur('to');
189
+ this.toInput.handleInputBlur(event);
190
+ setTimeout(() => {
191
+ document.activeElement.blur();
192
+ }, 1);
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();
202
+ }
172
203
  };
173
204
 
174
205
  this.openPanel = panel => {
@@ -246,19 +277,19 @@ class HiDateRangePicker extends React.Component {
246
277
  const yearPickerProps = {
247
278
  value: this.state.currentMonth,
248
279
  onChange: this.handleCurrentMonthChange,
249
- disabledFutureDays: this.props.disableFutureDays
280
+ disableFutureDays: this.props.disableFutureDays
250
281
  };
251
282
  return React.createElement(YearPickerOverlay, _extends({
252
283
  key: `${name}-year-picker-overlay`
253
284
  }, yearPickerProps, propsOverlay));
254
285
  };
255
286
 
287
+ const _today = moment().tz(this.props.timezoneName);
288
+
256
289
  this.state = {
257
- currentMonth: new Date(),
290
+ currentMonth: new Date(_today.year(), _today.month(), _today.date()),
258
291
  focusedInput: '',
259
- openedPanel: 'calendar',
260
- keyFrom: 1,
261
- keyTo: 1
292
+ openedPanel: 'calendar'
262
293
  };
263
294
  }
264
295
 
@@ -290,14 +321,17 @@ class HiDateRangePicker extends React.Component {
290
321
  errorText,
291
322
  hasSelector,
292
323
  helperIcon,
293
- helperText
324
+ helperText,
325
+ timezoneName
294
326
  } = _this$props,
295
- 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"]);
296
328
 
297
- 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);
298
331
  const modifiers = {
299
332
  start: from,
300
- end: to
333
+ end: to,
334
+ [classes.currentDay]: new Date(today.year(), today.month(), today.date())
301
335
  };
302
336
  const modifiersStyles = {
303
337
  start: {
@@ -385,7 +419,10 @@ class HiDateRangePicker extends React.Component {
385
419
  }, {
386
420
  id: `${id}-from`,
387
421
  onChange: this.handleInputChange('from'),
388
- disabled
422
+ disabled,
423
+ HiInputProps: {
424
+ onSubmit: this.props.onSubmit
425
+ }
389
426
  });
390
427
 
391
428
  const toInputProps = _objectSpread({}, onReset && {
@@ -397,7 +434,10 @@ class HiDateRangePicker extends React.Component {
397
434
  }, {
398
435
  id: `${id}-to`,
399
436
  onChange: this.handleInputChange('to'),
400
- disabled
437
+ disabled,
438
+ HiInputProps: {
439
+ onSubmit: this.props.onSubmit
440
+ }
401
441
  });
402
442
 
403
443
  const toClass = classNames(classes.toInput, {
@@ -408,10 +448,10 @@ class HiDateRangePicker extends React.Component {
408
448
  className: classNames(classes.root, classes.rangePickerContainer)
409
449
  }, React.createElement("div", {
410
450
  className: classes.fromInput,
411
- onFocus: () => this.handleDayPickerFocus('from') // onBlur={() => this.handleDayPickerBlur('from')}
412
-
451
+ onFocus: () => this.handleDayPickerFocus('from'),
452
+ onKeyDown: this.handleKeyDown('from')
413
453
  }, React.createElement("div", null, React.createElement(DayPickerInput, {
414
- key: this.state.keyFrom,
454
+ key: '1',
415
455
  ref: el => {
416
456
  this.fromInput = el;
417
457
  },
@@ -429,9 +469,10 @@ class HiDateRangePicker extends React.Component {
429
469
  }))), React.createElement("div", {
430
470
  className: toClass,
431
471
  onFocus: () => this.handleDayPickerFocus('to'),
432
- onBlur: () => this.handleDayPickerBlur('to')
472
+ onBlur: () => this.handleDayPickerBlur('to'),
473
+ onKeyDown: this.handleKeyDown('to')
433
474
  }, React.createElement(DayPickerInput, {
434
- key: this.state.keyTo,
475
+ key: '1',
435
476
  ref: el => {
436
477
  this.toInput = el;
437
478
  },
@@ -443,8 +484,7 @@ class HiDateRangePicker extends React.Component {
443
484
  inputProps: toInputProps,
444
485
  format: enableTime ? `${format} HH:mm` : format,
445
486
  formatDate: MomentLocaleUtils.formatDate,
446
- parseDate: MomentLocaleUtils.parseDate // onDayChange={(day) => this.handleDayChange('to', day)}
447
- ,
487
+ parseDate: MomentLocaleUtils.parseDate,
448
488
  placeholder: ''
449
489
  })));
450
490
 
@@ -476,6 +516,7 @@ HiDateRangePicker.defaultProps = {
476
516
  locale: 'fr-FR',
477
517
  minimumDate: new Date(2013, 4, 1),
478
518
  // by default 1 May 2013
519
+ timezoneName: 'Europe/Paris',
479
520
  translations: {
480
521
  today: 'today',
481
522
  hour: 'Hour',
@@ -597,11 +638,21 @@ HiDateRangePicker.propTypes = process.env.NODE_ENV !== "production" ? {
597
638
  */
598
639
  onReset: PropTypes.func,
599
640
 
641
+ /**
642
+ * Callback lorsque l'utilisateur tape sur "Entrée"
643
+ */
644
+ onSubmit: PropTypes.func,
645
+
600
646
  /**
601
647
  * Si true, le calendrier sera dans une div static plutot que dans une popper absolute
602
648
  */
603
649
  staticPosition: PropTypes.bool,
604
650
 
651
+ /**
652
+ * Timezone de l'utilisateur
653
+ */
654
+ timezoneName: PropTypes.string,
655
+
605
656
  /**
606
657
  * Date de fin sélectionnée
607
658
  */
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
3
  import React from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import moment from 'moment';
5
+ 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';
@@ -52,7 +52,7 @@ export function yearAndQuarter(format, date, t) {
52
52
  const indexM = split.findIndex(findM);
53
53
  return indexY < indexM ? date.format(`${split[indexY]}${s}[${t.short_quarter}]Q`) : date.format(`[${t.short_quarter}]Q${s}${split[indexY]}`);
54
54
  }
55
- export function buildDateRangeOptionByKey(key, t, format) {
55
+ export function buildDateRangeOptionByKey(key, t, format, timezoneName) {
56
56
  let from;
57
57
  let label;
58
58
  let info;
@@ -67,71 +67,71 @@ export function buildDateRangeOptionByKey(key, t, format) {
67
67
  switch (key) {
68
68
  case 'custom':
69
69
  label = t.custom_period;
70
- from = moment().subtract(15, 'day').startOf('day');
71
- to = moment().endOf('day');
70
+ from = moment().tz(timezoneName).subtract(15, 'day').startOf('day');
71
+ to = moment().tz(timezoneName).endOf('day');
72
72
  type = 'primary-highlight';
73
73
  break;
74
74
 
75
75
  case 'cd':
76
76
  label = t.today;
77
- from = moment().startOf('day');
78
- to = moment().endOf('day');
77
+ from = moment().tz(timezoneName).startOf('day');
78
+ to = moment().tz(timezoneName).endOf('day');
79
79
  info = `${from.format(format)}`;
80
80
  break;
81
81
 
82
82
  case 'pd':
83
83
  label = t.yesterday;
84
- from = moment().subtract(1, 'day').startOf('day');
85
- to = moment().subtract(1, 'day').endOf('day');
84
+ from = moment().tz(timezoneName).subtract(1, 'day').startOf('day');
85
+ to = moment().tz(timezoneName).subtract(1, 'day').endOf('day');
86
86
  info = `${from.format(format)}`;
87
87
  break;
88
88
 
89
89
  case 'cw':
90
90
  label = t.current_week;
91
- from = moment().startOf('week');
92
- to = moment();
91
+ from = moment().tz(timezoneName).startOf('week');
92
+ to = moment().tz(timezoneName);
93
93
  info = `${t.short_week}${from.format('w')}, \n ${from.format(format)} ${t.to_now}`;
94
94
  break;
95
95
 
96
96
  case 'pw':
97
97
  label = t.previous_week;
98
- from = moment().subtract(1, 'week').startOf('week');
99
- to = moment().subtract(1, 'week').endOf('week');
98
+ from = moment().tz(timezoneName).subtract(1, 'week').startOf('week');
99
+ to = moment().tz(timezoneName).subtract(1, 'week').endOf('week');
100
100
  info = `${t.short_week}${from.format('w')}, ${from.format(format)} ${t.to} ${to.format(format)}`;
101
101
  break;
102
102
 
103
103
  case 'cm':
104
104
  label = t.current_month;
105
- from = moment().startOf('month');
106
- to = moment();
105
+ from = moment().tz(timezoneName).startOf('month');
106
+ to = moment().tz(timezoneName);
107
107
  info = `${from.format(format)} ${t.to_now}, ${to.diff(from, 'days') + 1} ${t.days}`;
108
108
  break;
109
109
 
110
110
  case 'pm':
111
111
  label = t.previous_month;
112
- from = moment().subtract(1, 'month').startOf('month');
113
- to = moment().subtract(1, 'month').endOf('month');
112
+ from = moment().tz(timezoneName).subtract(1, 'month').startOf('month');
113
+ to = moment().tz(timezoneName).subtract(1, 'month').endOf('month');
114
114
  info = `${yearAndMonth(format, from)}, ${from.daysInMonth()} ${t.days}`;
115
115
  break;
116
116
 
117
117
  case 'cq':
118
118
  label = t.current_quarter;
119
- from = moment().startOf('quarter');
120
- to = moment();
119
+ from = moment().tz(timezoneName).startOf('quarter');
120
+ to = moment().tz(timezoneName);
121
121
  info = `${yearAndQuarter(format, from, t)}, ${from.format(format)} ${t.to_now}, ${to.diff(from, 'days') + 1} ${t.days}`;
122
122
  break;
123
123
 
124
124
  case 'pq':
125
125
  label = t.previous_quarter;
126
- from = moment().subtract(1, 'quarter').startOf('quarter');
127
- to = moment().subtract(1, 'quarter').endOf('quarter');
126
+ from = moment().tz(timezoneName).subtract(1, 'quarter').startOf('quarter');
127
+ to = moment().tz(timezoneName).subtract(1, 'quarter').endOf('quarter');
128
128
  info = `${yearAndQuarter(format, from, t)}, ${to.diff(from, 'days') + 1} ${t.days}`;
129
129
  break;
130
130
 
131
131
  case 'cy':
132
132
  label = t.current_year;
133
- from = moment().startOf('year');
134
- to = moment();
133
+ from = moment().tz(timezoneName).startOf('year');
134
+ to = moment().tz(timezoneName);
135
135
  info = `${from.format(format)} ${t.to_now}, ${to.diff(from, 'days') + 1} ${t.days}`;
136
136
  break;
137
137
 
@@ -187,22 +187,10 @@ 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', selectedOption.from.toDate());
194
- this.props.onChange('to', selectedOption.to.toDate());
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
- this.handleSelectChange = this.handleSelectChange.bind(this);
205
- this.options = props.availableOptionKeys.map(key => buildDateRangeOptionByKey(key, props.translations, props.format));
193
+ this.options = props.availableOptionKeys.map(key => buildDateRangeOptionByKey(key, props.translations, props.format, props.timezoneName));
206
194
  this.state = {
207
195
  selectedPreset: props.defaultPreset,
208
196
  containerWidth: 0
@@ -227,10 +215,32 @@ class HiDateRangeSelector extends React.Component {
227
215
  }
228
216
  }
229
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
+
230
225
  componentWillUnmount() {
231
226
  clearTimeout(this.timeout); // TODO : supprimer ?
232
227
  }
233
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
+
234
244
  render() {
235
245
  const _this$props = this.props,
236
246
  {
@@ -299,7 +309,8 @@ class HiDateRangeSelector extends React.Component {
299
309
  classes: {
300
310
  root: classes.dateSelect
301
311
  },
302
- staticPosition: staticPosition
312
+ staticPosition: staticPosition,
313
+ onSubmit: this.props.onSubmit
303
314
  }, selectProps))), React.createElement(Grid, {
304
315
  item: true,
305
316
  xs: 12,
@@ -341,6 +352,7 @@ HiDateRangeSelector.defaultProps = {
341
352
  format: 'YYYY-DD-MM',
342
353
  minimumDate: new Date(2013, 4, 1),
343
354
  // by default 1 May 2013
355
+ timezoneName: 'Europe/Paris',
344
356
  translations: {
345
357
  today: 'Today',
346
358
  hour: 'Hour',
@@ -459,6 +471,11 @@ HiDateRangeSelector.propTypes = process.env.NODE_ENV !== "production" ? {
459
471
  */
460
472
  onChange: PropTypes.func.isRequired,
461
473
 
474
+ /**
475
+ * Callback lorsque l'utilisateur tape sur "Entrée"
476
+ */
477
+ onSubmit: PropTypes.func,
478
+
462
479
  /**
463
480
  * true si champs obligatoire
464
481
  */
@@ -479,6 +496,11 @@ HiDateRangeSelector.propTypes = process.env.NODE_ENV !== "production" ? {
479
496
  */
480
497
  staticPosition: PropTypes.bool,
481
498
 
499
+ /**
500
+ * Timezone de l'utilisateur
501
+ */
502
+ timezoneName: PropTypes.string,
503
+
482
504
  /**
483
505
  * Date de fin sélectionnée
484
506
  */
@@ -10,8 +10,15 @@ class YearPickerOverlay extends React.Component {
10
10
  super(props);
11
11
  this.years = [];
12
12
  this.handleYearClick = this.handleYearClick.bind(this);
13
+ let minDate = props.minimumDate;
14
+
15
+ if (!minDate) {
16
+ let today = new Date();
17
+ minDate = new Date(today.getFullYear() - 5, today.getMonth(), today.getDate()); // by default 5 years from now
18
+ }
19
+
13
20
  const currentYear = new Date().getFullYear();
14
- const minimumYear = props.minimumDate.getFullYear();
21
+ const minimumYear = minDate.getFullYear();
15
22
  this.years = [currentYear]; // get years from minimum date to now
16
23
 
17
24
  if (!props.disablePastDays && currentYear > minimumYear) {
@@ -55,8 +62,6 @@ class YearPickerOverlay extends React.Component {
55
62
  }
56
63
 
57
64
  YearPickerOverlay.defaultProps = {
58
- minimumDate: new Date(2013, 4, 1),
59
- // by default 1 May 2013
60
65
  translations: {
61
66
  year: 'Year'
62
67
  }