baseui 10.3.0 → 10.7.0

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 (213) hide show
  1. package/app-nav-bar/user-menu.js +1 -0
  2. package/app-nav-bar/user-menu.js.flow +1 -0
  3. package/button/styled-components.js +1 -1
  4. package/button/styled-components.js.flow +4 -1
  5. package/card/styled-components.js +0 -1
  6. package/card/styled-components.js.flow +0 -1
  7. package/combobox/combobox.js +5 -1
  8. package/combobox/combobox.js.flow +4 -0
  9. package/combobox/index.d.ts +6 -3
  10. package/data-table/column-datetime.js +2 -0
  11. package/data-table/column-datetime.js.flow +2 -0
  12. package/data-table/data-table.js +13 -3
  13. package/data-table/data-table.js.flow +20 -4
  14. package/data-table/types.js.flow +2 -1
  15. package/datepicker/calendar-header.js +255 -109
  16. package/datepicker/calendar-header.js.flow +282 -145
  17. package/datepicker/calendar.js +6 -1
  18. package/datepicker/calendar.js.flow +5 -1
  19. package/datepicker/constants.js +9 -2
  20. package/datepicker/constants.js.flow +7 -0
  21. package/datepicker/datepicker.js +135 -73
  22. package/datepicker/datepicker.js.flow +161 -62
  23. package/datepicker/day.js +2 -0
  24. package/datepicker/day.js.flow +2 -0
  25. package/datepicker/index.d.ts +8 -0
  26. package/datepicker/month.js +4 -0
  27. package/datepicker/month.js.flow +3 -0
  28. package/datepicker/styled-components.js +116 -56
  29. package/datepicker/styled-components.js.flow +101 -36
  30. package/datepicker/types.js.flow +18 -1
  31. package/datepicker/utils/calendar-header-helpers.js +51 -0
  32. package/datepicker/utils/calendar-header-helpers.js.flow +53 -0
  33. package/datepicker/utils/date-helpers.js +1 -1
  34. package/datepicker/utils/date-helpers.js.flow +1 -1
  35. package/datepicker/week.js +1 -0
  36. package/datepicker/week.js.flow +1 -0
  37. package/dnd-list/index.js.flow +2 -1
  38. package/dnd-list/list.js +1 -2
  39. package/dnd-list/list.js.flow +1 -1
  40. package/dnd-list/styled-components.js +1 -1
  41. package/dnd-list/styled-components.js.flow +1 -0
  42. package/drawer/close-icon.js +3 -2
  43. package/drawer/close-icon.js.flow +2 -2
  44. package/drawer/drawer.js +5 -2
  45. package/drawer/drawer.js.flow +2 -2
  46. package/es/app-nav-bar/user-menu.js +1 -0
  47. package/es/button/styled-components.js +1 -1
  48. package/es/card/styled-components.js +0 -1
  49. package/es/combobox/combobox.js +5 -1
  50. package/es/data-table/column-datetime.js +2 -0
  51. package/es/data-table/data-table.js +13 -3
  52. package/es/datepicker/calendar-header.js +204 -93
  53. package/es/datepicker/calendar.js +7 -2
  54. package/es/datepicker/constants.js +6 -1
  55. package/es/datepicker/datepicker.js +70 -42
  56. package/es/datepicker/day.js +2 -0
  57. package/es/datepicker/month.js +3 -0
  58. package/es/datepicker/styled-components.js +98 -37
  59. package/es/datepicker/types.js +1 -1
  60. package/es/datepicker/utils/calendar-header-helpers.js +34 -0
  61. package/es/datepicker/utils/date-helpers.js +1 -1
  62. package/es/datepicker/week.js +1 -0
  63. package/es/dnd-list/index.js +2 -1
  64. package/es/dnd-list/list.js +1 -2
  65. package/es/dnd-list/styled-components.js +1 -0
  66. package/es/drawer/close-icon.js +3 -2
  67. package/es/drawer/drawer.js +5 -2
  68. package/es/helper/helper.js +1 -0
  69. package/es/layer/layer.js +8 -0
  70. package/es/list/list-heading.js +17 -6
  71. package/es/map-marker/constants.js +69 -0
  72. package/es/map-marker/fixed-marker.js +98 -0
  73. package/es/map-marker/floating-marker.js +65 -0
  74. package/es/map-marker/index.js +9 -0
  75. package/es/map-marker/pin-head.js +108 -0
  76. package/es/map-marker/styled-components.js +156 -0
  77. package/es/map-marker/types.js +8 -0
  78. package/es/menu/maybe-child-menu.js +1 -0
  79. package/es/popover/popover.js +6 -5
  80. package/es/popover/stateful-container.js +8 -2
  81. package/es/rating/emoticon-rating.js +3 -1
  82. package/es/rating/star-rating.js +3 -1
  83. package/es/select/select-component.js +20 -5
  84. package/es/select/styled-components.js +34 -4
  85. package/es/snackbar/snackbar-context.js +16 -4
  86. package/es/spinner/styled-components.js +1 -1
  87. package/es/table-semantic/styled-components.js +6 -4
  88. package/es/table-semantic/table-builder.js +3 -0
  89. package/es/themes/dark-theme/color-component-tokens.js +1 -1
  90. package/es/themes/light-theme/color-component-tokens.js +9 -9
  91. package/es/themes/shared/lighting.js +5 -1
  92. package/es/timepicker/timepicker.js +16 -11
  93. package/es/tooltip/styled-components.js +8 -0
  94. package/es/tooltip/tooltip.js +1 -0
  95. package/esm/app-nav-bar/user-menu.js +1 -0
  96. package/esm/button/styled-components.js +1 -1
  97. package/esm/card/styled-components.js +0 -1
  98. package/esm/combobox/combobox.js +5 -1
  99. package/esm/data-table/column-datetime.js +2 -0
  100. package/esm/data-table/data-table.js +13 -3
  101. package/esm/datepicker/calendar-header.js +255 -110
  102. package/esm/datepicker/calendar.js +7 -2
  103. package/esm/datepicker/constants.js +6 -1
  104. package/esm/datepicker/datepicker.js +136 -74
  105. package/esm/datepicker/day.js +2 -0
  106. package/esm/datepicker/month.js +3 -0
  107. package/esm/datepicker/styled-components.js +112 -55
  108. package/esm/datepicker/types.js +1 -1
  109. package/esm/datepicker/utils/calendar-header-helpers.js +45 -0
  110. package/esm/datepicker/utils/date-helpers.js +1 -1
  111. package/esm/datepicker/week.js +1 -0
  112. package/esm/dnd-list/index.js +2 -1
  113. package/esm/dnd-list/list.js +1 -2
  114. package/esm/dnd-list/styled-components.js +1 -1
  115. package/esm/drawer/close-icon.js +3 -2
  116. package/esm/drawer/drawer.js +5 -2
  117. package/esm/helper/helper.js +1 -0
  118. package/esm/layer/layer.js +8 -0
  119. package/esm/list/list-heading.js +17 -6
  120. package/esm/map-marker/constants.js +62 -0
  121. package/esm/map-marker/fixed-marker.js +137 -0
  122. package/esm/map-marker/floating-marker.js +94 -0
  123. package/esm/map-marker/index.js +9 -0
  124. package/esm/map-marker/pin-head.js +144 -0
  125. package/esm/map-marker/styled-components.js +168 -0
  126. package/esm/map-marker/types.js +8 -0
  127. package/esm/menu/maybe-child-menu.js +1 -0
  128. package/esm/popover/popover.js +6 -5
  129. package/esm/popover/stateful-container.js +8 -2
  130. package/esm/rating/emoticon-rating.js +2 -2
  131. package/esm/rating/star-rating.js +2 -2
  132. package/esm/select/select-component.js +19 -5
  133. package/esm/select/styled-components.js +28 -4
  134. package/esm/snackbar/snackbar-context.js +16 -4
  135. package/esm/spinner/styled-components.js +1 -1
  136. package/esm/table-semantic/styled-components.js +6 -4
  137. package/esm/table-semantic/table-builder.js +3 -0
  138. package/esm/themes/dark-theme/color-component-tokens.js +1 -1
  139. package/esm/themes/light-theme/color-component-tokens.js +9 -9
  140. package/esm/themes/shared/lighting.js +5 -1
  141. package/esm/timepicker/timepicker.js +17 -11
  142. package/esm/tooltip/styled-components.js +8 -0
  143. package/esm/tooltip/tooltip.js +1 -0
  144. package/helper/helper.js +1 -0
  145. package/helper/helper.js.flow +1 -0
  146. package/layer/layer.js +8 -0
  147. package/layer/layer.js.flow +9 -0
  148. package/link/index.d.ts +1 -0
  149. package/list/index.d.ts +36 -0
  150. package/list/list-heading.js +24 -7
  151. package/list/list-heading.js.flow +17 -8
  152. package/map-marker/constants.js +82 -0
  153. package/map-marker/constants.js.flow +74 -0
  154. package/map-marker/fixed-marker.js +152 -0
  155. package/map-marker/fixed-marker.js.flow +137 -0
  156. package/map-marker/floating-marker.js +109 -0
  157. package/map-marker/floating-marker.js.flow +102 -0
  158. package/map-marker/index.d.ts +105 -0
  159. package/map-marker/index.js +55 -0
  160. package/map-marker/index.js.flow +23 -0
  161. package/map-marker/package.json +4 -0
  162. package/map-marker/pin-head.js +159 -0
  163. package/map-marker/pin-head.js.flow +155 -0
  164. package/map-marker/styled-components.js +184 -0
  165. package/map-marker/styled-components.js.flow +177 -0
  166. package/map-marker/types.js +11 -0
  167. package/map-marker/types.js.flow +114 -0
  168. package/menu/index.d.ts +7 -0
  169. package/menu/maybe-child-menu.js +1 -0
  170. package/menu/maybe-child-menu.js.flow +1 -0
  171. package/menu/types.js.flow +12 -0
  172. package/modal/index.d.ts +1 -1
  173. package/modal/types.js.flow +4 -1
  174. package/package.json +5 -3
  175. package/popover/index.d.ts +2 -1
  176. package/popover/popover.js +6 -5
  177. package/popover/popover.js.flow +11 -4
  178. package/popover/stateful-container.js +8 -2
  179. package/popover/stateful-container.js.flow +5 -0
  180. package/popover/types.js.flow +6 -1
  181. package/rating/emoticon-rating.js +2 -2
  182. package/rating/emoticon-rating.js.flow +4 -1
  183. package/rating/star-rating.js +2 -2
  184. package/rating/star-rating.js.flow +4 -1
  185. package/select/select-component.js +19 -5
  186. package/select/select-component.js.flow +19 -5
  187. package/select/styled-components.js +28 -4
  188. package/select/styled-components.js.flow +30 -2
  189. package/select/types.js.flow +9 -0
  190. package/snackbar/index.d.ts +21 -16
  191. package/snackbar/snackbar-context.js +15 -4
  192. package/snackbar/snackbar-context.js.flow +15 -3
  193. package/spinner/styled-components.js +1 -1
  194. package/spinner/styled-components.js.flow +1 -1
  195. package/table-semantic/styled-components.js +6 -4
  196. package/table-semantic/styled-components.js.flow +6 -4
  197. package/table-semantic/table-builder.js +3 -0
  198. package/table-semantic/table-builder.js.flow +3 -0
  199. package/themes/dark-theme/color-component-tokens.js +1 -1
  200. package/themes/dark-theme/color-component-tokens.js.flow +1 -1
  201. package/themes/light-theme/color-component-tokens.js +9 -9
  202. package/themes/light-theme/color-component-tokens.js.flow +9 -9
  203. package/themes/shared/lighting.js +5 -1
  204. package/themes/shared/lighting.js.flow +4 -0
  205. package/themes/types.js.flow +4 -0
  206. package/timepicker/index.d.ts +1 -0
  207. package/timepicker/timepicker.js +17 -11
  208. package/timepicker/timepicker.js.flow +31 -12
  209. package/timepicker/types.js.flow +10 -0
  210. package/tooltip/styled-components.js +8 -0
  211. package/tooltip/styled-components.js.flow +8 -0
  212. package/tooltip/tooltip.js +1 -0
  213. package/tooltip/tooltip.js.flow +6 -1
@@ -9,17 +9,18 @@ This source code is licensed under the MIT license found in the
9
9
  LICENSE file in the root directory of this source tree.
10
10
  */
11
11
  import * as React from 'react';
12
- import ArrowRight from '../icon/arrow-right.js';
13
- import ArrowLeft from '../icon/arrow-left.js';
14
- import TriangleDown from '../icon/triangle-down.js';
12
+ import ChevronRight from '../icon/chevron-right.js';
13
+ import ChevronLeft from '../icon/chevron-left.js';
14
+ import ChevronDown from '../icon/chevron-down.js';
15
15
  import dateFnsAdapter from './utils/date-fns-adapter.js';
16
16
  import DateHelpers from './utils/date-helpers.js';
17
+ import { getFilteredMonthItems } from './utils/calendar-header-helpers.js';
17
18
  import { StatefulMenu } from '../menu/index.js';
18
19
  import { Popover } from '../popover/index.js';
19
20
  import { LocaleContext } from '../locale/index.js';
20
21
  import { ThemeContext } from '../styles/theme-provider.js';
21
22
  import { StyledCalendarHeader, StyledPrevButton, StyledNextButton, StyledMonthHeader, StyledWeekdayHeader, StyledMonthYearSelectButton, StyledMonthYearSelectIconContainer } from './styled-components.js';
22
- import { ORIENTATION, WEEKDAYS } from './constants.js';
23
+ import { ORIENTATION, WEEKDAYS, DENSITY } from './constants.js';
23
24
  import { getOverrides, mergeOverrides } from '../helpers/overrides.js';
24
25
  import { isFocusVisible, forkFocus, forkBlur } from '../utils/focusVisible.js';
25
26
 
@@ -38,10 +39,6 @@ const DIRECTION = {
38
39
  PREVIOUS: 'previous'
39
40
  };
40
41
 
41
- function yearMonthToId(year, month) {
42
- return `${year}-${month}`;
43
- }
44
-
45
42
  function idToYearMonth(id) {
46
43
  return id.split('-').map(Number);
47
44
  }
@@ -52,14 +49,13 @@ export default class CalendarHeader extends React.Component {
52
49
 
53
50
  _defineProperty(this, "dateHelpers", void 0);
54
51
 
55
- _defineProperty(this, "items", void 0);
52
+ _defineProperty(this, "monthItems", void 0);
56
53
 
57
- _defineProperty(this, "minYear", void 0);
58
-
59
- _defineProperty(this, "maxYear", void 0);
54
+ _defineProperty(this, "yearItems", void 0);
60
55
 
61
56
  _defineProperty(this, "state", {
62
- isMonthYearDropdownOpen: false,
57
+ isMonthDropdownOpen: false,
58
+ isYearDropdownOpen: false,
63
59
  isFocusVisible: false
64
60
  });
65
61
 
@@ -67,15 +63,71 @@ export default class CalendarHeader extends React.Component {
67
63
  return this.props.date || this.dateHelpers.date();
68
64
  });
69
65
 
70
- _defineProperty(this, "handleYearChange", ({
71
- value
72
- }) => {
73
- if (this.props.onYearChange) {
74
- // $FlowFixMe
75
- this.props.onYearChange({
76
- date: this.dateHelpers.setYear(this.getDateProp(), value[0].id)
77
- });
66
+ _defineProperty(this, "getYearItems", () => {
67
+ const date = this.getDateProp();
68
+ const maxDate = this.props.maxDate;
69
+ const minDate = this.props.minDate;
70
+ const maxYear = maxDate ? this.dateHelpers.getYear(maxDate) : MAX_YEAR;
71
+ const minYear = minDate ? this.dateHelpers.getYear(minDate) : MIN_YEAR;
72
+ const selectedMonth = this.dateHelpers.getMonth(date); // TODO: this logic can be optimized to only run when minDate / maxDate change
73
+
74
+ this.yearItems = Array.from({
75
+ length: maxYear - minYear + 1
76
+ }, (_, i) => minYear + i).map(year => ({
77
+ id: year.toString(),
78
+ label: year.toString()
79
+ }));
80
+ const monthOfMaxDate = maxDate ? this.dateHelpers.getMonth(maxDate) : MAX_MONTH;
81
+ const monthOfMinDate = minDate ? this.dateHelpers.getMonth(minDate) : MIN_MONTH; // Generates array like [0,1,.... monthOfMaxDate]
82
+
83
+ const maxYearMonths = Array.from({
84
+ length: monthOfMaxDate + 1
85
+ }, (x, i) => i); // Generates array like [monthOfMinDate, ...., 10, 11]
86
+
87
+ const minYearMonths = Array.from({
88
+ length: 12 - monthOfMinDate
89
+ }, (x, i) => i + monthOfMinDate);
90
+
91
+ if (selectedMonth > maxYearMonths[maxYearMonths.length - 1]) {
92
+ const lastIdx = this.yearItems.length - 1;
93
+ this.yearItems[lastIdx] = { ...this.yearItems[lastIdx],
94
+ disabled: true
95
+ };
78
96
  }
97
+
98
+ if (selectedMonth < minYearMonths[0]) {
99
+ this.yearItems[0] = { ...this.yearItems[0],
100
+ disabled: true
101
+ };
102
+ }
103
+ });
104
+
105
+ _defineProperty(this, "getMonthItems", () => {
106
+ const date = this.getDateProp();
107
+ const year = this.dateHelpers.getYear(date);
108
+ const maxDate = this.props.maxDate;
109
+ const minDate = this.props.minDate;
110
+ const maxYear = maxDate ? this.dateHelpers.getYear(maxDate) : MAX_YEAR;
111
+ const minYear = minDate ? this.dateHelpers.getYear(minDate) : MIN_YEAR;
112
+ const monthOfMaxDate = maxDate ? this.dateHelpers.getMonth(maxDate) : MAX_MONTH; // Generates array like [0,1,.... monthOfMaxDate]
113
+
114
+ const maxYearMonths = Array.from({
115
+ length: monthOfMaxDate + 1
116
+ }, (x, i) => i);
117
+ const monthOfMinDate = minDate ? this.dateHelpers.getMonth(minDate) : MIN_MONTH; // Generates array like [monthOfMinDate, ...., 10, 11]
118
+
119
+ const minYearMonths = Array.from({
120
+ length: 12 - monthOfMinDate
121
+ }, (x, i) => i + monthOfMinDate);
122
+ const maxMinYearMonthsIntersection = maxYearMonths.filter(year => minYearMonths.includes(year));
123
+ const filterMonthsList = year === maxYear && year === minYear ? maxMinYearMonthsIntersection : year === maxYear ? maxYearMonths : year === minYear ? minYearMonths : null;
124
+
125
+ const formatMonthLabel = month => this.dateHelpers.getMonthInLocale(month, this.props.locale);
126
+
127
+ this.monthItems = getFilteredMonthItems({
128
+ filterMonthsList,
129
+ formatMonthLabel
130
+ });
79
131
  });
80
132
 
81
133
  _defineProperty(this, "increaseMonth", () => {
@@ -153,7 +205,8 @@ export default class CalendarHeader extends React.Component {
153
205
  }) => {
154
206
  const date = this.getDateProp();
155
207
  const {
156
- overrides = {}
208
+ overrides = {},
209
+ density
157
210
  } = this.props;
158
211
  const allPrevDaysDisabled = this.dateHelpers.monthDisabledBefore(date, this.props);
159
212
  let isDisabled = false;
@@ -176,7 +229,7 @@ export default class CalendarHeader extends React.Component {
176
229
  }
177
230
 
178
231
  const [PrevButton, prevButtonProps] = getOverrides(overrides.PrevButton, StyledPrevButton);
179
- const [PrevButtonIcon, prevButtonIconProps] = getOverrides(overrides.PrevButtonIcon, theme.direction === 'rtl' ? ArrowRight : ArrowLeft);
232
+ const [PrevButtonIcon, prevButtonIconProps] = getOverrides(overrides.PrevButtonIcon, theme.direction === 'rtl' ? ChevronRight : ChevronLeft);
180
233
  let clickHandler = this.decreaseMonth;
181
234
 
182
235
  if (allPrevDaysDisabled) {
@@ -193,7 +246,7 @@ export default class CalendarHeader extends React.Component {
193
246
  $disabled: isDisabled,
194
247
  $order: this.props.order
195
248
  }, prevButtonProps), isHidden ? null : /*#__PURE__*/React.createElement(PrevButtonIcon, _extends({
196
- size: '24px',
249
+ size: density === DENSITY.high ? 24 : 36,
197
250
  overrides: {
198
251
  Svg: {
199
252
  style: navBtnStyle
@@ -208,7 +261,8 @@ export default class CalendarHeader extends React.Component {
208
261
  }) => {
209
262
  const date = this.getDateProp();
210
263
  const {
211
- overrides = {}
264
+ overrides = {},
265
+ density
212
266
  } = this.props;
213
267
  const allNextDaysDisabled = this.dateHelpers.monthDisabledAfter(date, this.props);
214
268
  let isDisabled = false;
@@ -231,7 +285,7 @@ export default class CalendarHeader extends React.Component {
231
285
  }
232
286
 
233
287
  const [NextButton, nextButtonProps] = getOverrides(overrides.NextButton, StyledNextButton);
234
- const [NextButtonIcon, nextButtonIconProps] = getOverrides(overrides.NextButtonIcon, theme.direction === 'rtl' ? ArrowLeft : ArrowRight);
288
+ const [NextButtonIcon, nextButtonIconProps] = getOverrides(overrides.NextButtonIcon, theme.direction === 'rtl' ? ChevronLeft : ChevronRight);
235
289
  let clickHandler = this.increaseMonth; // The other option is to always provide a click handler and let customers
236
290
  // override its functionality based on the `$allPrevDaysDisabled` prop
237
291
  // in a custom NextButton component override
@@ -252,7 +306,7 @@ export default class CalendarHeader extends React.Component {
252
306
  $isFocusVisible: this.state.isFocusVisible,
253
307
  $order: this.props.order
254
308
  }, nextButtonProps), isHidden ? null : /*#__PURE__*/React.createElement(NextButtonIcon, _extends({
255
- size: '24px',
309
+ size: density === DENSITY.high ? 24 : 36,
256
310
  overrides: {
257
311
  Svg: {
258
312
  style: navBtnStyle
@@ -262,7 +316,7 @@ export default class CalendarHeader extends React.Component {
262
316
  });
263
317
 
264
318
  _defineProperty(this, "canArrowsOpenDropdown", event => {
265
- if (!this.state.isMonthYearDropdownOpen) {
319
+ if (!this.state.isMonthDropdownOpen && !this.state.isYearDropdownOpen) {
266
320
  if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
267
321
  return true;
268
322
  }
@@ -273,11 +327,12 @@ export default class CalendarHeader extends React.Component {
273
327
 
274
328
  _defineProperty(this, "renderMonthYearDropdown", () => {
275
329
  const date = this.getDateProp();
330
+ const month = this.dateHelpers.getMonth(date);
331
+ const year = this.dateHelpers.getYear(date);
276
332
  const {
277
333
  locale,
278
- maxDate,
279
- minDate,
280
- overrides = {}
334
+ overrides = {},
335
+ density
281
336
  } = this.props;
282
337
  const [MonthYearSelectButton, monthYearSelectButtonProps] = getOverrides(overrides.MonthYearSelectButton, StyledMonthYearSelectButton);
283
338
  const [MonthYearSelectIconContainer, monthYearSelectIconContainerProps] = getOverrides(overrides.MonthYearSelectIconContainer, StyledMonthYearSelectIconContainer);
@@ -294,79 +349,38 @@ export default class CalendarHeader extends React.Component {
294
349
  menuProps && menuProps.overrides); // $FlowFixMe
295
350
 
296
351
  menuProps.overrides = menuOverrides;
297
- const defaultMonths = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
298
- const maxYear = maxDate ? this.dateHelpers.getYear(maxDate) : MAX_YEAR;
299
- const minYear = minDate ? this.dateHelpers.getYear(minDate) : MIN_YEAR;
300
- const maxDateMonth = maxDate ? this.dateHelpers.getMonth(maxDate) : MAX_MONTH; // Generates array like [0,1,.... maxDateMonth]
301
-
302
- const maxYearMonths = Array.from({
303
- length: maxDateMonth + 1
304
- }, (x, i) => i);
305
- const minDateMonth = minDate ? this.dateHelpers.getMonth(minDate) : MIN_MONTH; // Generates array like [minDateMonth, ...., 10, 11]
306
-
307
- const minYearMonths = Array.from({
308
- length: 12 - minDateMonth
309
- }, (x, i) => i + minDateMonth);
310
-
311
- if (this.maxYear !== maxYear || this.minYear !== minYear) {
312
- this.maxYear = maxYear;
313
- this.minYear = minYear;
314
- this.items = [];
315
-
316
- for (let i = minYear; i <= maxYear; i++) {
317
- let months;
318
-
319
- if (i === minYear && i === maxYear) {
320
- months = maxYearMonths.filter(month => minYearMonths.includes(month));
321
- } else if (i === minYear) {
322
- months = minYearMonths;
323
- } else if (i === maxYear) {
324
- months = maxYearMonths;
325
- } else {
326
- months = defaultMonths;
327
- }
328
-
329
- months.forEach(month => {
330
- this.items.push({
331
- id: yearMonthToId(i, month),
332
- label: `${this.dateHelpers.getMonthInLocale(month, locale)} ${i}`
333
- });
334
- });
335
- }
336
- }
337
-
338
- const initialIndex = this.items.findIndex(item => {
339
- return item.id === yearMonthToId(this.dateHelpers.getYear(date), this.dateHelpers.getMonth(date));
340
- });
341
- const monthYearTitle = `${this.dateHelpers.getMonthInLocale(this.dateHelpers.getMonth(date), locale)} ${this.dateHelpers.getYear(date)}`;
342
- return this.isMultiMonthHorizontal() ? /*#__PURE__*/React.createElement("div", null, monthYearTitle) : /*#__PURE__*/React.createElement(OverriddenPopover, _extends({
352
+ const initialMonthIndex = this.monthItems.findIndex(month => month.id === this.dateHelpers.getMonth(date).toString());
353
+ const initialYearIndex = this.yearItems.findIndex(year => year.id === this.dateHelpers.getYear(date).toString());
354
+ const monthTitle = `${this.dateHelpers.getMonthInLocale(this.dateHelpers.getMonth(date), locale)}`;
355
+ const yearTitle = `${this.dateHelpers.getYear(date)}`;
356
+ return this.isMultiMonthHorizontal() ? /*#__PURE__*/React.createElement("div", null, `${monthTitle} ${yearTitle}`) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(OverriddenPopover, _extends({
343
357
  placement: "bottom",
344
358
  autoFocus: true,
345
359
  focusLock: true,
346
- isOpen: this.state.isMonthYearDropdownOpen,
360
+ isOpen: this.state.isMonthDropdownOpen,
347
361
  onClick: () => {
348
362
  this.setState(prev => ({
349
- isMonthYearDropdownOpen: !prev.isMonthYearDropdownOpen
363
+ isMonthDropdownOpen: !prev.isMonthDropdownOpen
350
364
  }));
351
365
  },
352
366
  onClickOutside: () => this.setState({
353
- isMonthYearDropdownOpen: false
367
+ isMonthDropdownOpen: false
354
368
  }),
355
369
  onEsc: () => this.setState({
356
- isMonthYearDropdownOpen: false
370
+ isMonthDropdownOpen: false
357
371
  }),
358
372
  content: () => /*#__PURE__*/React.createElement(OverriddenStatefulMenu, _extends({
359
373
  initialState: {
360
- highlightedIndex: initialIndex,
374
+ highlightedIndex: initialMonthIndex,
361
375
  isFocused: true
362
376
  },
363
- items: this.items,
377
+ items: this.monthItems,
364
378
  onItemSelect: ({
365
379
  item,
366
380
  event
367
381
  }) => {
368
382
  event.preventDefault();
369
- const [year, month] = idToYearMonth(item.id);
383
+ const month = idToYearMonth(item.id);
370
384
  const updatedDate = this.dateHelpers.set(date, {
371
385
  year,
372
386
  month
@@ -374,11 +388,81 @@ export default class CalendarHeader extends React.Component {
374
388
  this.props.onMonthChange && this.props.onMonthChange({
375
389
  date: updatedDate
376
390
  });
391
+ this.setState({
392
+ isMonthDropdownOpen: false
393
+ });
394
+ }
395
+ }, menuProps))
396
+ }, popoverProps), /*#__PURE__*/React.createElement(MonthYearSelectButton, _extends({
397
+ "aria-live": "polite",
398
+ type: "button",
399
+ $isFocusVisible: this.state.isFocusVisible,
400
+ $density: density,
401
+ onKeyUp: event => {
402
+ if (this.canArrowsOpenDropdown(event)) {
403
+ this.setState({
404
+ isMonthDropdownOpen: true
405
+ });
406
+ }
407
+ },
408
+ onKeyDown: event => {
409
+ if (this.canArrowsOpenDropdown(event)) {
410
+ // disables page scroll
411
+ event.preventDefault();
412
+ }
413
+
414
+ if (event.key === 'Tab') {
415
+ this.setState({
416
+ isMonthDropdownOpen: false
417
+ });
418
+ }
419
+ }
420
+ }, monthYearSelectButtonProps), monthTitle, /*#__PURE__*/React.createElement(MonthYearSelectIconContainer, monthYearSelectIconContainerProps, /*#__PURE__*/React.createElement(ChevronDown, {
421
+ title: "",
422
+ overrides: {
423
+ Svg: {
424
+ props: {
425
+ role: 'presentation'
426
+ }
427
+ }
428
+ },
429
+ size: density === DENSITY.high ? 16 : 24
430
+ })))), /*#__PURE__*/React.createElement(OverriddenPopover, _extends({
431
+ placement: "bottom",
432
+ focusLock: true,
433
+ isOpen: this.state.isYearDropdownOpen,
434
+ onClick: () => {
435
+ this.setState(prev => ({
436
+ isYearDropdownOpen: !prev.isYearDropdownOpen
437
+ }));
438
+ },
439
+ onClickOutside: () => this.setState({
440
+ isYearDropdownOpen: false
441
+ }),
442
+ onEsc: () => this.setState({
443
+ isYearDropdownOpen: false
444
+ }),
445
+ content: () => /*#__PURE__*/React.createElement(OverriddenStatefulMenu, _extends({
446
+ initialState: {
447
+ highlightedIndex: initialYearIndex,
448
+ isFocused: true
449
+ },
450
+ items: this.yearItems,
451
+ onItemSelect: ({
452
+ item,
453
+ event
454
+ }) => {
455
+ event.preventDefault();
456
+ const year = idToYearMonth(item.id);
457
+ const updatedDate = this.dateHelpers.set(date, {
458
+ year,
459
+ month
460
+ });
377
461
  this.props.onYearChange && this.props.onYearChange({
378
462
  date: updatedDate
379
463
  });
380
464
  this.setState({
381
- isMonthYearDropdownOpen: false
465
+ isYearDropdownOpen: false
382
466
  });
383
467
  }
384
468
  }, menuProps))
@@ -386,10 +470,11 @@ export default class CalendarHeader extends React.Component {
386
470
  "aria-live": "polite",
387
471
  type: "button",
388
472
  $isFocusVisible: this.state.isFocusVisible,
473
+ $density: density,
389
474
  onKeyUp: event => {
390
475
  if (this.canArrowsOpenDropdown(event)) {
391
476
  this.setState({
392
- isMonthYearDropdownOpen: true
477
+ isYearDropdownOpen: true
393
478
  });
394
479
  }
395
480
  },
@@ -401,11 +486,11 @@ export default class CalendarHeader extends React.Component {
401
486
 
402
487
  if (event.key === 'Tab') {
403
488
  this.setState({
404
- isMonthYearDropdownOpen: false
489
+ isYearDropdownOpen: false
405
490
  });
406
491
  }
407
492
  }
408
- }, monthYearSelectButtonProps), monthYearTitle, /*#__PURE__*/React.createElement(MonthYearSelectIconContainer, monthYearSelectIconContainerProps, /*#__PURE__*/React.createElement(TriangleDown, {
493
+ }, monthYearSelectButtonProps), yearTitle, /*#__PURE__*/React.createElement(MonthYearSelectIconContainer, monthYearSelectIconContainerProps, /*#__PURE__*/React.createElement(ChevronDown, {
409
494
  title: "",
410
495
  overrides: {
411
496
  Svg: {
@@ -413,23 +498,47 @@ export default class CalendarHeader extends React.Component {
413
498
  role: 'presentation'
414
499
  }
415
500
  }
416
- }
417
- }))));
501
+ },
502
+ size: density === DENSITY.high ? 16 : 24
503
+ })))));
418
504
  });
419
505
 
420
506
  this.dateHelpers = new DateHelpers(props.adapter);
421
- this.items = [];
507
+ this.monthItems = [];
508
+ this.yearItems = [];
509
+ }
510
+
511
+ componentDidMount() {
512
+ this.getYearItems();
513
+ this.getMonthItems();
514
+ }
515
+
516
+ componentDidUpdate(prevProps) {
517
+ const selectedMonthDidChange = this.dateHelpers.getMonth(this.props.date) !== this.dateHelpers.getMonth(prevProps.date);
518
+ const selectedYearDidChange = this.dateHelpers.getYear(this.props.date) !== this.dateHelpers.getYear(prevProps.date);
519
+
520
+ if (selectedMonthDidChange) {
521
+ // re-calculate yearItems
522
+ this.getYearItems();
523
+ }
524
+
525
+ if (selectedYearDidChange) {
526
+ // re-calculate monthItems
527
+ this.getMonthItems();
528
+ }
422
529
  }
423
530
 
424
531
  render() {
425
532
  const {
426
- overrides = {}
533
+ overrides = {},
534
+ density
427
535
  } = this.props;
428
536
  const [CalendarHeader, calendarHeaderProps] = getOverrides(overrides.CalendarHeader, StyledCalendarHeader);
429
537
  const [MonthHeader, monthHeaderProps] = getOverrides(overrides.MonthHeader, StyledMonthHeader);
430
538
  const [WeekdayHeader, weekdayHeaderProps] = getOverrides(overrides.WeekdayHeader, StyledWeekdayHeader);
431
539
  const startOfWeek = this.dateHelpers.getStartOfWeek(this.getDateProp(), this.props.locale);
432
540
  return /*#__PURE__*/React.createElement(ThemeContext.Consumer, null, theme => /*#__PURE__*/React.createElement(LocaleContext.Consumer, null, locale => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(CalendarHeader, _extends({}, calendarHeaderProps, {
541
+ $density: this.props.density,
433
542
  onFocus: forkFocus(calendarHeaderProps, this.handleFocus),
434
543
  onBlur: forkBlur(calendarHeaderProps, this.handleBlur)
435
544
  }), this.renderPreviousMonthButton({
@@ -445,7 +554,9 @@ export default class CalendarHeader extends React.Component {
445
554
  return /*#__PURE__*/React.createElement(WeekdayHeader, _extends({
446
555
  key: offset,
447
556
  alt: this.dateHelpers.getWeekdayInLocale(day, this.props.locale)
448
- }, weekdayHeaderProps), this.dateHelpers.getWeekdayMinInLocale(day, this.props.locale));
557
+ }, weekdayHeaderProps, {
558
+ $density: density
559
+ }), this.dateHelpers.getWeekdayMinInLocale(day, this.props.locale));
449
560
  })))));
450
561
  }
451
562
 
@@ -19,7 +19,7 @@ import { StyledCalendarContainer, StyledMonthContainer, StyledRoot, StyledSelect
19
19
  import dateFnsAdapter from './utils/date-fns-adapter.js';
20
20
  import DateHelpers from './utils/date-helpers.js';
21
21
  import { getOverrides, mergeOverrides } from '../helpers/overrides.js';
22
- import { ORIENTATION } from './constants.js';
22
+ import { DENSITY, ORIENTATION } from './constants.js';
23
23
  export default class Calendar extends React.Component {
24
24
  constructor(props) {
25
25
  super(props);
@@ -329,10 +329,13 @@ export default class Calendar extends React.Component {
329
329
  "aria-roledescription": translations.ariaRoleDescCalMonth,
330
330
  "aria-multiselectable": this.props.range || null,
331
331
  onKeyDown: this.onKeyDown
332
- }, calendarContainerProps), /*#__PURE__*/React.createElement(Month, {
332
+ }, calendarContainerProps, {
333
+ $density: this.props.density
334
+ }), /*#__PURE__*/React.createElement(Month, {
333
335
  adapter: this.props.adapter,
334
336
  date: monthDate,
335
337
  dateLabel: this.props.dateLabel,
338
+ density: this.props.density,
336
339
  excludeDates: this.props.excludeDates,
337
340
  filterDate: this.props.filterDate,
338
341
  highlightedDate: this.state.highlightedDate,
@@ -571,6 +574,7 @@ export default class Calendar extends React.Component {
571
574
  const [Root, rootProps] = getOverrides(overrides.Root, StyledRoot);
572
575
  const [startDate, endDate] = [].concat(this.props.value);
573
576
  return /*#__PURE__*/React.createElement(LocaleContext.Consumer, null, locale => /*#__PURE__*/React.createElement(Root, _extends({
577
+ $density: this.props.density,
574
578
  "data-baseweb": "calendar",
575
579
  role: "application",
576
580
  "aria-roledescription": "datepicker",
@@ -593,6 +597,7 @@ export default class Calendar extends React.Component {
593
597
  _defineProperty(Calendar, "defaultProps", {
594
598
  autoFocusCalendar: false,
595
599
  dateLabel: null,
600
+ density: DENSITY.default,
596
601
  excludeDates: null,
597
602
  filterDate: null,
598
603
  highlightedDate: null,
@@ -20,4 +20,9 @@ export const STATE_CHANGE_TYPE = Object.freeze({
20
20
  mouseOver: 'mouseOver',
21
21
  mouseLeave: 'mouseLeave'
22
22
  });
23
- export const WEEKDAYS = [0, 1, 2, 3, 4, 5, 6];
23
+ export const WEEKDAYS = [0, 1, 2, 3, 4, 5, 6];
24
+ export const DEFAULT_MONTHS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
25
+ export const DENSITY = {
26
+ high: 'high',
27
+ default: 'default'
28
+ };