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

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.
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
  }