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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/HiAlertModal/HiAlertModal.js +56 -13
  3. package/HiColoredLabel/HiColoredLabel.js +1 -1
  4. package/HiDatePicker/Caption.js +8 -1
  5. package/HiDatePicker/HiDatePicker.js +9 -3
  6. package/HiDatePicker/HiDateRangePicker.js +9 -3
  7. package/HiDatePicker/HiDateRangeSelector.js +54 -4
  8. package/HiDatePicker/NavBar.js +8 -1
  9. package/HiDatePicker/Overlays/CustomOverlayLayoutWithoutFooter.js +123 -0
  10. package/HiDatePicker/Overlays/MonthPickerOverlay.js +4 -4
  11. package/HiDatePicker/Overlays/YearPickerOverlay.js +2 -2
  12. package/HiDatePicker/hiLocaleUtils.js +144 -0
  13. package/HiDatePicker/stylesheet.js +31 -6
  14. package/HiForm/HiFormControl.js +4 -4
  15. package/HiForm/HiInput.js +19 -7
  16. package/HiForm/HiUploadField.js +2 -1
  17. package/HiNotice/HiKPI.js +3 -3
  18. package/HiNotice/HiKPINotice.js +12 -9
  19. package/HiPin/HiPin.js +1 -1
  20. package/HiSelect/HiSelect.js +6 -5
  21. package/HiSelect/HiSuggestSelect.js +21 -2
  22. package/HiSelect/SelectInput.js +5 -1
  23. package/HiSelectNew/HiSelect.js +163 -59
  24. package/HiSelectNew/HiSelectInput.js +8 -1
  25. package/HiSelectableList/HiSelectableList.js +4 -30
  26. package/HiSelectableList/HiSelectableListItem.js +19 -12
  27. package/README.md +9 -10
  28. package/es/HiAlertModal/HiAlertModal.js +55 -13
  29. package/es/HiColoredLabel/HiColoredLabel.js +1 -1
  30. package/es/HiDatePicker/Caption.js +7 -1
  31. package/es/HiDatePicker/HiDatePicker.js +8 -3
  32. package/es/HiDatePicker/HiDateRangePicker.js +8 -3
  33. package/es/HiDatePicker/HiDateRangeSelector.js +48 -4
  34. package/es/HiDatePicker/NavBar.js +7 -1
  35. package/es/HiDatePicker/Overlays/CustomOverlayLayoutWithoutFooter.js +106 -0
  36. package/es/HiDatePicker/Overlays/MonthPickerOverlay.js +4 -4
  37. package/es/HiDatePicker/Overlays/YearPickerOverlay.js +2 -2
  38. package/es/HiDatePicker/hiLocaleUtils.js +131 -0
  39. package/es/HiDatePicker/stylesheet.js +30 -6
  40. package/es/HiForm/HiFormControl.js +4 -4
  41. package/es/HiForm/HiInput.js +19 -7
  42. package/es/HiForm/HiUploadField.js +2 -1
  43. package/es/HiNotice/HiKPI.js +3 -3
  44. package/es/HiNotice/HiKPINotice.js +10 -9
  45. package/es/HiPin/HiPin.js +1 -1
  46. package/es/HiSelect/HiSelect.js +6 -5
  47. package/es/HiSelect/HiSuggestSelect.js +21 -2
  48. package/es/HiSelect/SelectInput.js +5 -1
  49. package/es/HiSelectNew/HiSelect.js +166 -56
  50. package/es/HiSelectNew/HiSelectInput.js +7 -1
  51. package/es/HiSelectableList/HiSelectableList.js +5 -25
  52. package/es/HiSelectableList/HiSelectableListItem.js +23 -16
  53. package/es/index.js +2 -1
  54. package/index.es.js +2 -1
  55. package/index.js +10 -2
  56. package/package.json +1 -1
  57. package/umd/hipay-material-ui.development.js +6207 -1359
  58. package/umd/hipay-material-ui.production.min.js +2 -2
@@ -17,11 +17,12 @@ export const styles = theme => ({
17
17
  const Caption = ({
18
18
  classes,
19
19
  date,
20
+ locale = 'en_US',
20
21
  localeUtils,
21
22
  onMonthClick,
22
23
  onYearClick
23
24
  }) => {
24
- const months = localeUtils.getMonths();
25
+ const months = localeUtils.getMonths(locale);
25
26
  return React.createElement("div", {
26
27
  className: classes.caption
27
28
  }, React.createElement(HiButton, {
@@ -44,6 +45,11 @@ Caption.propTypes = process.env.NODE_ENV !== "production" ? {
44
45
  */
45
46
  date: PropTypes.object.isRequired,
46
47
 
48
+ /**
49
+ * ReactDayPicker prop
50
+ */
51
+ locale: PropTypes.string,
52
+
47
53
  /**
48
54
  * ReactDayPicker prop
49
55
  */
@@ -4,6 +4,7 @@ import _extends from "@babel/runtime/helpers/extends";
4
4
  import React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import MomentLocaleUtils from 'react-day-picker/moment';
7
+ import HiLocaleUtils from './hiLocaleUtils';
7
8
  import DayPickerInput from 'react-day-picker/DayPickerInput';
8
9
  import withStyles from '../styles/withStyles';
9
10
  import Caption from './Caption';
@@ -216,12 +217,13 @@ class HiDatePicker extends React.Component {
216
217
  navbarElement: props2 => React.createElement(NavBar, _extends({
217
218
  showClockButton: enableTime,
218
219
  onClockClick: this.handleClockClick
219
- }, props2)),
220
+ }, props2, {
221
+ localeUtils: HiLocaleUtils
222
+ })),
220
223
  captionElement: this.renderCaption,
221
224
  classNames: classes,
222
225
  disabledDays: effectiveDisabledDays,
223
226
  selectedDays: typeof value === 'object' ? value : undefined,
224
- locale,
225
227
  firstDayOfWeek: 1,
226
228
  fromMonth: minimumDate,
227
229
  modifiers: {
@@ -230,7 +232,10 @@ class HiDatePicker extends React.Component {
230
232
  },
231
233
  modifiersStyles,
232
234
  month: currentMonth
233
- }, props);
235
+ }, props, {
236
+ locale,
237
+ localeUtils: HiLocaleUtils
238
+ });
234
239
 
235
240
  const inputProps = _objectSpread({}, onReset && {
236
241
  onReset: this.handleReset
@@ -4,6 +4,7 @@ import _extends from "@babel/runtime/helpers/extends";
4
4
  import React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import MomentLocaleUtils from 'react-day-picker/moment';
7
+ import HiLocaleUtils from './hiLocaleUtils';
7
8
  import DayPickerInput from 'react-day-picker/DayPickerInput';
8
9
  import classNames from 'classnames';
9
10
  import withStyles from '../styles/withStyles';
@@ -58,7 +59,7 @@ class HiDateRangePicker extends React.Component {
58
59
  this.onDayToClick = day => {
59
60
  let change = moment(day) >= moment(this.props.from);
60
61
 
61
- if (change && this.props.disableFutureDays && moment(day) > moment()) {
62
+ if (change && this.props.disableFutureDays && moment(day).utc() > moment().utc().endOf('day')) {
62
63
  change = false;
63
64
  }
64
65
 
@@ -112,9 +113,9 @@ class HiDateRangePicker extends React.Component {
112
113
 
113
114
  if (name === 'to' && comparativeDate > moment(date) || name === 'from' && comparativeDate < moment(date)) {
114
115
  error = translations.to_superior_from;
115
- } else if (date < minimumDate) {
116
+ } else if (moment(date).utc() < moment(minimumDate).utc().startOf('day')) {
116
117
  error = translations.date_inferior_min_date.replace('%s', moment(minimumDate).format(format));
117
- } else if (disableFutureDays && date > now) {
118
+ } else if (disableFutureDays && moment(date).utc() > moment(now).utc().endOf('day')) {
118
119
  error = translations.date_superior_max_date.replace('%s', moment().format(format));
119
120
  }
120
121
 
@@ -350,6 +351,8 @@ class HiDateRangePicker extends React.Component {
350
351
  }, to && {
351
352
  after: to
352
353
  }),
354
+ locale,
355
+ localeUtils: HiLocaleUtils,
353
356
  month: this.state.currentMonth,
354
357
  modifiers: _objectSpread({}, modifiers)
355
358
  });
@@ -366,6 +369,8 @@ class HiDateRangePicker extends React.Component {
366
369
  }, from && {
367
370
  before: from
368
371
  }),
372
+ locale,
373
+ localeUtils: HiLocaleUtils,
369
374
  month: this.state.currentMonth,
370
375
  modifiers: _objectSpread({}, modifiers)
371
376
  }); // From & To InputProps
@@ -9,6 +9,49 @@ import withStyles from '../styles/withStyles';
9
9
  import HiSelectField from '../HiSelectNew/HiSelectField';
10
10
  import HiDateRangePicker from './HiDateRangePicker';
11
11
  import HiFormControl from '../HiForm/HiFormControl';
12
+ export function findSeparator(format) {
13
+ let str = '';
14
+
15
+ if (format.search('[/]') >= 0) {
16
+ str = '/';
17
+ } else if (format.search('[-]') >= 0) {
18
+ str = '-';
19
+ } else if (format.search('[.]') >= 0) {
20
+ str = '.';
21
+ }
22
+
23
+ return str;
24
+ }
25
+ export function yearAndMonth(format, date) {
26
+ const findY = el => {
27
+ return el.toUpperCase().search('Y') >= 0;
28
+ };
29
+
30
+ const findM = el => {
31
+ return el.toUpperCase().search('M') >= 0;
32
+ };
33
+
34
+ const s = findSeparator(format);
35
+ const split = format.split(s);
36
+ const indexY = split.findIndex(findY);
37
+ const indexM = split.findIndex(findM);
38
+ return indexY < indexM ? date.format(split[indexY] + s + split[indexM]) : date.format(split[indexM] + s + split[indexY]);
39
+ }
40
+ export function yearAndQuarter(format, date, t) {
41
+ const findY = el => {
42
+ return el.toUpperCase().search('Y') >= 0;
43
+ };
44
+
45
+ const findM = el => {
46
+ return el.toUpperCase().search('M') >= 0;
47
+ };
48
+
49
+ const s = findSeparator(format);
50
+ const split = format.split(s);
51
+ const indexY = split.findIndex(findY);
52
+ const indexM = split.findIndex(findM);
53
+ return indexY < indexM ? date.format(`${split[indexY]}${s}[${t.short_quarter}]Q`) : date.format(`[${t.short_quarter}]Q${s}${split[indexY]}`);
54
+ }
12
55
  export function buildDateRangeOptionByKey(key, t, format) {
13
56
  let from;
14
57
  let label;
@@ -68,21 +111,21 @@ export function buildDateRangeOptionByKey(key, t, format) {
68
111
  label = t.previous_month;
69
112
  from = moment().subtract(1, 'month').startOf('month');
70
113
  to = moment().subtract(1, 'month').endOf('month');
71
- info = `${from.format(t.yearAndMonth)}, ${from.daysInMonth()} ${t.days}`;
114
+ info = `${yearAndMonth(format, from)}, ${from.daysInMonth()} ${t.days}`;
72
115
  break;
73
116
 
74
117
  case 'cq':
75
118
  label = t.current_quarter;
76
119
  from = moment().startOf('quarter');
77
120
  to = moment();
78
- info = `${from.format(t.yearAndQuarter)}, ${from.format(format)} ${t.to_now}, ${to.diff(from, 'days') + 1} ${t.days}`;
121
+ info = `${yearAndQuarter(format, from, t)}, ${from.format(format)} ${t.to_now}, ${to.diff(from, 'days') + 1} ${t.days}`;
79
122
  break;
80
123
 
81
124
  case 'pq':
82
125
  label = t.previous_quarter;
83
126
  from = moment().subtract(1, 'quarter').startOf('quarter');
84
127
  to = moment().subtract(1, 'quarter').endOf('quarter');
85
- info = `${from.format(t.yearAndQuarter)}, ${to.diff(from, 'days') + 1} ${t.days}`;
128
+ info = `${yearAndQuarter(format, from, t)}, ${to.diff(from, 'days') + 1} ${t.days}`;
86
129
  break;
87
130
 
88
131
  case 'cy':
@@ -117,7 +160,7 @@ export const styles = () => ({
117
160
  },
118
161
  dateRangePicker: {
119
162
  width: 'calc(100% + 8px)',
120
- marginTop: 1
163
+ marginTop: 0
121
164
  },
122
165
  smSelect: {},
123
166
  smRangePicker: {}
@@ -306,6 +349,7 @@ HiDateRangeSelector.defaultProps = {
306
349
  quarter: 'Quarter',
307
350
  week: 'Week',
308
351
  short_week: 'W',
352
+ short_quarter: 'Q',
309
353
  yearAndMonth: 'YYYY[-]MM',
310
354
  yearAndQuarter: 'YYYY[-Q]Q',
311
355
  year: 'Year',
@@ -41,6 +41,7 @@ var _ref3 = React.createElement(AccessTime, null);
41
41
 
42
42
  const NavBar = ({
43
43
  classes,
44
+ locale = 'en_US',
44
45
  localeUtils,
45
46
  nextMonth,
46
47
  onClockClick,
@@ -49,7 +50,7 @@ const NavBar = ({
49
50
  previousMonth,
50
51
  showClockButton
51
52
  }) => {
52
- const months = localeUtils.getMonths();
53
+ const months = localeUtils.getMonths(locale);
53
54
  const prev = `${months[previousMonth.getMonth()]} ${previousMonth.getFullYear()}`;
54
55
  const next = `${months[nextMonth.getMonth()]} ${nextMonth.getFullYear()}`;
55
56
  return React.createElement("div", {
@@ -74,6 +75,11 @@ NavBar.propTypes = process.env.NODE_ENV !== "production" ? {
74
75
  */
75
76
  classes: PropTypes.object,
76
77
 
78
+ /**
79
+ * ReactDayPicker prop
80
+ */
81
+ locale: PropTypes.string,
82
+
77
83
  /**
78
84
  * ReactDayPicker prop
79
85
  */
@@ -0,0 +1,106 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
+ import _objectSpread from "@babel/runtime/helpers/objectSpread";
3
+ import React from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import classNames from 'classnames';
6
+ import Paper from '@material-ui/core/Paper';
7
+ import withStyles from '../../styles/withStyles';
8
+ export const styles = theme => ({
9
+ paper: {
10
+ width: '100%',
11
+ zIndex: 10
12
+ },
13
+ absolute: {
14
+ position: 'absolute'
15
+ },
16
+ relative: {
17
+ position: 'relative'
18
+ },
19
+ left: {
20
+ width: '200%',
21
+ left: 0
22
+ },
23
+ right: {
24
+ width: '200%',
25
+ left: '-100%'
26
+ },
27
+ overlay: _objectSpread({
28
+ padding: 0,
29
+ height: 325,
30
+ textAlign: 'center'
31
+ }, theme.typography.body2, {
32
+ fontWeight: theme.typography.fontWeightRegular
33
+ }),
34
+ header: _objectSpread({
35
+ display: 'block',
36
+ height: 40,
37
+ textAlign: 'center',
38
+ padding: '10px 0'
39
+ }, theme.typography.body1, {
40
+ color: theme.palette.neutral.main,
41
+ borderBottom: '1px solid',
42
+ borderBottomColor: theme.palette.divider
43
+ }),
44
+ body: {
45
+ height: 285,
46
+ width: 224,
47
+ margin: 'auto'
48
+ }
49
+ });
50
+
51
+ const CustomOverlayLayoutWithoutFooter = (_ref) => {
52
+ let {
53
+ classes,
54
+ children,
55
+ headerElement,
56
+ footerElement,
57
+ absoluteElement,
58
+ side,
59
+ staticPosition
60
+ } = _ref,
61
+ props = _objectWithoutProperties(_ref, ["classes", "children", "headerElement", "footerElement", "absoluteElement", "side", "staticPosition"]);
62
+
63
+ const paperClass = classNames(classes.paper, {
64
+ [classes.left]: side === 'from',
65
+ [classes.right]: side === 'to',
66
+ [classes.absolute]: staticPosition !== true,
67
+ [classes.relative]: staticPosition === true
68
+ });
69
+
70
+ const paperProps = _objectSpread({}, props);
71
+
72
+ return (// eslint-disable-next-line react/jsx-handler-names
73
+ React.createElement(Paper, {
74
+ className: paperClass,
75
+ onBlur: paperProps.onBlur,
76
+ onFocus: paperProps.onFocus
77
+ }, React.createElement("div", {
78
+ className: classes.overlay
79
+ }, React.createElement("div", {
80
+ className: classes.header
81
+ }, headerElement), React.createElement("div", {
82
+ className: classes.body
83
+ }, children), absoluteElement))
84
+ );
85
+ };
86
+
87
+ CustomOverlayLayoutWithoutFooter.propTypes = process.env.NODE_ENV !== "production" ? {
88
+ absoluteElement: PropTypes.any,
89
+ children: PropTypes.any,
90
+
91
+ /**
92
+ * Useful to extend the style applied to components.
93
+ */
94
+ classes: PropTypes.object,
95
+ footerElement: PropTypes.any,
96
+ headerElement: PropTypes.any,
97
+
98
+ /**
99
+ * Définit comment construire le Paper dans le cas d'un double input
100
+ */
101
+ side: PropTypes.string,
102
+ staticPosition: PropTypes.bool
103
+ } : {};
104
+ export default withStyles(styles, {
105
+ name: 'HmuiCustomOverlayLayoutWithoutFooter'
106
+ })(CustomOverlayLayoutWithoutFooter);
@@ -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 CustomOverlayLayout from './CustomOverlayLayout';
5
+ import CustomOverlayLayoutWithoutFooter from './CustomOverlayLayoutWithoutFooter';
6
6
  import ListPicker from '../ListPicker';
7
7
 
8
8
  class MonthPickerOverlay extends React.Component {
@@ -10,7 +10,7 @@ class MonthPickerOverlay extends React.Component {
10
10
  super();
11
11
  this.months = [];
12
12
  this.handleMonthClick = this.handleMonthClick.bind(this);
13
- this.months = props.localeUtils ? props.localeUtils.getMonths() : props.children.props.localeUtils.getMonths();
13
+ this.months = props.localeUtils ? props.localeUtils.getMonths(props.children.props.locale) : props.children.props.localeUtils.getMonths(props.children.props.locale);
14
14
  }
15
15
 
16
16
  handleMonthClick(month) {
@@ -32,8 +32,8 @@ class MonthPickerOverlay extends React.Component {
32
32
  props = _objectWithoutProperties(_this$props, ["value", "translations"]);
33
33
 
34
34
  const now = new Date();
35
- const currentMonth = props.localeUtils ? props.localeUtils.getMonths()[now.getMonth()] : props.children.props.localeUtils.getMonths()[now.getMonth()];
36
- return React.createElement(CustomOverlayLayout, _extends({
35
+ const currentMonth = props.localeUtils ? props.localeUtils.getMonths(props.children.props.locale)[now.getMonth()] : props.children.props.localeUtils.getMonths(props.children.props.locale)[now.getMonth()];
36
+ return React.createElement(CustomOverlayLayoutWithoutFooter, _extends({
37
37
  headerElement: translations.month
38
38
  }, props), React.createElement(ListPicker, {
39
39
  itemList: this.months,
@@ -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 CustomOverlayLayout from './CustomOverlayLayout';
5
+ import CustomOverlayLayoutWithoutFooter from './CustomOverlayLayoutWithoutFooter';
6
6
  import ListPicker from '../ListPicker';
7
7
 
8
8
  class YearPickerOverlay extends React.Component {
@@ -42,7 +42,7 @@ class YearPickerOverlay extends React.Component {
42
42
  } = _this$props,
43
43
  props = _objectWithoutProperties(_this$props, ["value", "translations"]);
44
44
 
45
- return React.createElement(CustomOverlayLayout, _extends({
45
+ return React.createElement(CustomOverlayLayoutWithoutFooter, _extends({
46
46
  headerElement: translations.year
47
47
  }, props), React.createElement(ListPicker, {
48
48
  itemList: this.years,
@@ -0,0 +1,131 @@
1
+ const WEEKDAYS_LONG = {
2
+ en_US: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
3
+ fr_FR: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi']
4
+ };
5
+ const WEEKDAYS_SHORT = {
6
+ en_US: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
7
+ fr_FR: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa']
8
+ };
9
+ const MONTHS = {
10
+ en_US: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
11
+ fr_FR: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
12
+ };
13
+ const FIRST_DAY = {
14
+ en_US: 0,
15
+ fr_FR: 1 // Use Monday as first day of the week
16
+
17
+ };
18
+ /**
19
+ * Format Date as day
20
+ *
21
+ * @param Date d
22
+ * @param string locale
23
+ *
24
+ * @returns string
25
+ */
26
+
27
+ function formatDay(d, locale = 'en_US') {
28
+ const loc = this.formatLocale(locale);
29
+ return `${WEEKDAYS_LONG[loc][d.getDay()]}, ${d.getDate()} ${MONTHS[loc][d.getMonth()]} ${d.getFullYear()}`;
30
+ }
31
+ /**
32
+ * Format Date as month title
33
+ *
34
+ * @param Date d
35
+ * @param string locale
36
+ *
37
+ * @returns string
38
+ */
39
+
40
+
41
+ function formatMonthTitle(d, locale = 'en_US') {
42
+ const loc = this.formatLocale(locale);
43
+ return `${MONTHS[loc][d.getMonth()]} ${d.getFullYear()}`;
44
+ }
45
+ /**
46
+ * Get the short version of a week day
47
+ *
48
+ * @param int i
49
+ * @param string locale
50
+ *
51
+ * @returns string
52
+ */
53
+
54
+
55
+ function formatWeekdayShort(i, locale = 'en_US') {
56
+ const loc = this.formatLocale(locale);
57
+ return WEEKDAYS_SHORT[loc][i];
58
+ }
59
+ /**
60
+ * Get the long version of a week day
61
+ *
62
+ * @param int i
63
+ * @param string locale
64
+ *
65
+ * @returns string
66
+ */
67
+
68
+
69
+ function formatWeekdayLong(i, locale = 'en_US') {
70
+ const loc = this.formatLocale(locale);
71
+ return WEEKDAYS_LONG[loc][i];
72
+ }
73
+ /**
74
+ * Get first day of the week
75
+ * @param string locale
76
+ *
77
+ * @returns integer
78
+ */
79
+
80
+
81
+ function getFirstDayOfWeek(locale = 'en_US') {
82
+ const loc = this.formatLocale(locale);
83
+ return FIRST_DAY[loc];
84
+ }
85
+ /**
86
+ * Get List of Months
87
+ *
88
+ * @param string locale
89
+ *
90
+ * @returns array
91
+ */
92
+
93
+
94
+ function getMonths(locale = 'en_US') {
95
+ const loc = this.formatLocale(locale);
96
+ return MONTHS[loc];
97
+ }
98
+ /**
99
+ * Format locale
100
+ *
101
+ * @param string locale
102
+ *
103
+ * @return string
104
+ */
105
+
106
+
107
+ function formatLocale(locale) {
108
+ let loc = locale.split('-');
109
+
110
+ if (loc.length !== 2) {
111
+ loc = locale.split('_');
112
+
113
+ if (loc.length !== 2) {
114
+ return false;
115
+ }
116
+ }
117
+
118
+ loc[1] = loc[1].toUpperCase();
119
+ return loc.join('_');
120
+ }
121
+
122
+ const HiLocaleUtils = {
123
+ formatDay,
124
+ formatMonthTitle,
125
+ formatWeekdayShort,
126
+ formatWeekdayLong,
127
+ getFirstDayOfWeek,
128
+ getMonths,
129
+ formatLocale
130
+ };
131
+ export default HiLocaleUtils;
@@ -1,4 +1,5 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/objectSpread";
2
+ import { fade } from '../styles/colorManipulator';
2
3
  export default (theme => ({
3
4
  root: {
4
5
  position: 'relative',
@@ -140,31 +141,54 @@ export default (theme => ({
140
141
  footer: {
141
142
  marginTop: 12,
142
143
  borderTop: '1px solid',
143
- borderTopColor: theme.palette.divider
144
+ borderTopColor: theme.palette.divider,
145
+ padding: '5px',
146
+ width: '100%'
144
147
  },
145
148
  // The today button (only with todayButton prop)
146
149
  todayButton: _objectSpread({
147
- width: '100%',
150
+ display: 'table',
151
+ minWidth: 230,
152
+ margin: '0 auto',
148
153
  border: 'none',
149
154
  backgroundImage: 'none',
150
155
  backgroundColor: 'transparent',
151
156
  boxShadow: 'none',
152
157
  cursor: 'pointer',
153
- height: 40
158
+ height: 30
154
159
  }, theme.typography.body2, {
155
160
  color: theme.palette.neutral.main,
156
161
  fontWeight: theme.typography.fontWeightMedium,
157
- textTransform: 'uppercase'
162
+ textTransform: 'uppercase',
163
+ '&:hover': {
164
+ backgroundColor: fade(theme.palette.neutral.dark, theme.palette.action.hoverOpacity),
165
+ // Reset on touch devices, it doesn't add specificity
166
+ '@media (hover: none)': {
167
+ backgroundColor: 'transparent'
168
+ }
169
+ },
170
+ borderRadius: 4
158
171
  }),
159
172
 
160
173
  /* default modifiers */
161
174
  // Added to the day's cell for the current day
162
175
  today: {
163
176
  // color: theme.palette.primary.light,
164
- boxShadow: 'inset 0 0 0 2px #8b9898',
177
+ position: 'relative',
165
178
  borderRadius: '50%',
166
179
  color: `${theme.palette.neutral.dark} !important`,
167
- fontWeight: theme.typography.fontWeightMedium
180
+ fontWeight: theme.typography.fontWeightMedium,
181
+ '&:before': {
182
+ content: '""',
183
+ position: 'absolute',
184
+ top: 0,
185
+ left: 0,
186
+ display: 'inline-block',
187
+ width: '100%',
188
+ height: '100%',
189
+ borderRadius: '50%',
190
+ boxShadow: `inset 0 0 0 2px ${theme.palette.neutral.main}`
191
+ }
168
192
  },
169
193
  // Added to the day's cell outside the current month
170
194
  outside: {
@@ -27,6 +27,8 @@ export const styles = theme => ({
27
27
  cursor: 'pointer',
28
28
  zIndex: 1,
29
29
  top: '-5px',
30
+ height: 24,
31
+ width: 24,
30
32
  '&$iconButtonError': {
31
33
  color: theme.palette.negative.main
32
34
  },
@@ -197,16 +199,14 @@ class HiFormControl extends React.PureComponent {
197
199
  focused: !disabled && (focused || hovered)
198
200
  }, InputLabelProps), error && errorText && React.createElement(HiIconButton, {
199
201
  className: classNames(classes.iconButton, classes.iconButtonError),
200
- onClick: this.handleHelperClick,
201
- onKeyDown: this.handleKeyDown
202
+ onClick: this.handleHelperClick
202
203
  }, React.createElement(Warning, {
203
204
  className: classNames(classes.icon)
204
205
  })), helperIcon && helperText && !error && React.createElement(HiIconButton, {
205
206
  className: classNames(classes.iconButton, classes.iconButtonInfo, {
206
207
  [classes.iconButtonInfoActive]: helperOpen
207
208
  }),
208
- onClick: this.handleHelperClick,
209
- onKeyDown: this.handleKeyDown
209
+ onClick: this.handleHelperClick
210
210
  }, React.createElement(Info, {
211
211
  className: classNames(classes.icon)
212
212
  }))), React.createElement("div", {
@@ -89,10 +89,10 @@ export const styles = theme => ({
89
89
  padding: 0
90
90
  }),
91
91
  inputText: {
92
- height: 39
92
+ height: 40
93
93
  },
94
94
  inputTextArea: {
95
- minHeight: 39,
95
+ minHeight: 40,
96
96
  paddingTop: 8
97
97
  },
98
98
  iconPointer: {
@@ -100,7 +100,7 @@ export const styles = theme => ({
100
100
  cursor: 'pointer'
101
101
  },
102
102
  eraseButton: {
103
- height: 39,
103
+ height: 40,
104
104
  width: 40,
105
105
  display: 'inline-block'
106
106
  },
@@ -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}`,