@ui5/webcomponents 2.21.0 → 2.22.0-rc.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 (114) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/Calendar.d.ts +39 -0
  4. package/dist/Calendar.js +109 -3
  5. package/dist/Calendar.js.map +1 -1
  6. package/dist/CalendarHeaderTemplate.d.ts +13 -1
  7. package/dist/CalendarHeaderTemplate.js +48 -12
  8. package/dist/CalendarHeaderTemplate.js.map +1 -1
  9. package/dist/CalendarTemplate.js +58 -2
  10. package/dist/CalendarTemplate.js.map +1 -1
  11. package/dist/Carousel.js +1 -1
  12. package/dist/Carousel.js.map +1 -1
  13. package/dist/DateRangePicker.d.ts +27 -0
  14. package/dist/DateRangePicker.js +57 -3
  15. package/dist/DateRangePicker.js.map +1 -1
  16. package/dist/DateRangePickerTemplate.js +7 -3
  17. package/dist/DateRangePickerTemplate.js.map +1 -1
  18. package/dist/DateTimePicker.js +0 -3
  19. package/dist/DateTimePicker.js.map +1 -1
  20. package/dist/Popup.js +4 -0
  21. package/dist/Popup.js.map +1 -1
  22. package/dist/SliderHandle.d.ts +0 -8
  23. package/dist/SliderHandle.js +0 -11
  24. package/dist/SliderHandle.js.map +1 -1
  25. package/dist/SliderTemplate.js +1 -1
  26. package/dist/SliderTemplate.js.map +1 -1
  27. package/dist/css/themes/Calendar.css +1 -1
  28. package/dist/css/themes/DatePickerPopover.css +1 -1
  29. package/dist/css/themes/Popup.css +1 -1
  30. package/dist/css/themes/ResponsivePopoverCommon.css +1 -1
  31. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +1 -1
  32. package/dist/css/themes/sap_fiori_3_dark/parameters-bundle.css +1 -1
  33. package/dist/css/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -1
  34. package/dist/css/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -1
  35. package/dist/css/themes/sap_horizon/parameters-bundle.css +1 -1
  36. package/dist/css/themes/sap_horizon_auto/parameters-bundle.css +8 -0
  37. package/dist/css/themes/sap_horizon_dark/parameters-bundle.css +1 -1
  38. package/dist/css/themes/sap_horizon_hc_auto/parameters-bundle.css +9 -1
  39. package/dist/css/themes/sap_horizon_hcb/parameters-bundle.css +1 -1
  40. package/dist/css/themes/sap_horizon_hcw/parameters-bundle.css +1 -1
  41. package/dist/custom-elements-internal.json +20 -20
  42. package/dist/custom-elements.json +19 -19
  43. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  44. package/dist/generated/assets/themes/sap_fiori_3_dark/parameters-bundle.css.json +1 -1
  45. package/dist/generated/assets/themes/sap_fiori_3_hcb/parameters-bundle.css.json +1 -1
  46. package/dist/generated/assets/themes/sap_fiori_3_hcw/parameters-bundle.css.json +1 -1
  47. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  48. package/dist/generated/assets/themes/sap_horizon_auto/parameters-bundle.css.json +1 -1
  49. package/dist/generated/assets/themes/sap_horizon_dark/parameters-bundle.css.json +1 -1
  50. package/dist/generated/assets/themes/sap_horizon_hc_auto/parameters-bundle.css.json +1 -1
  51. package/dist/generated/assets/themes/sap_horizon_hcb/parameters-bundle.css.json +1 -1
  52. package/dist/generated/assets/themes/sap_horizon_hcw/parameters-bundle.css.json +1 -1
  53. package/dist/generated/i18n/i18n-defaults.d.ts +3 -1
  54. package/dist/generated/i18n/i18n-defaults.js +3 -1
  55. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  56. package/dist/generated/themes/Calendar.css.d.ts +1 -1
  57. package/dist/generated/themes/Calendar.css.js +1 -1
  58. package/dist/generated/themes/Calendar.css.js.map +1 -1
  59. package/dist/generated/themes/DatePickerPopover.css.d.ts +1 -1
  60. package/dist/generated/themes/DatePickerPopover.css.js +1 -1
  61. package/dist/generated/themes/DatePickerPopover.css.js.map +1 -1
  62. package/dist/generated/themes/Popup.css.d.ts +1 -1
  63. package/dist/generated/themes/Popup.css.js +1 -1
  64. package/dist/generated/themes/Popup.css.js.map +1 -1
  65. package/dist/generated/themes/ResponsivePopoverCommon.css.d.ts +1 -1
  66. package/dist/generated/themes/ResponsivePopoverCommon.css.js +1 -1
  67. package/dist/generated/themes/ResponsivePopoverCommon.css.js.map +1 -1
  68. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.d.ts +1 -1
  69. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  70. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
  71. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.d.ts +1 -1
  72. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js +1 -1
  73. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js.map +1 -1
  74. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.d.ts +1 -1
  75. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js +1 -1
  76. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js.map +1 -1
  77. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.d.ts +1 -1
  78. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js +1 -1
  79. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js.map +1 -1
  80. package/dist/generated/themes/sap_horizon/parameters-bundle.css.d.ts +1 -1
  81. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  82. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
  83. package/dist/generated/themes/sap_horizon_auto/parameters-bundle.css.d.ts +1 -1
  84. package/dist/generated/themes/sap_horizon_auto/parameters-bundle.css.js +8 -0
  85. package/dist/generated/themes/sap_horizon_auto/parameters-bundle.css.js.map +1 -1
  86. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.d.ts +1 -1
  87. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js +1 -1
  88. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js.map +1 -1
  89. package/dist/generated/themes/sap_horizon_hc_auto/parameters-bundle.css.d.ts +1 -1
  90. package/dist/generated/themes/sap_horizon_hc_auto/parameters-bundle.css.js +9 -1
  91. package/dist/generated/themes/sap_horizon_hc_auto/parameters-bundle.css.js.map +1 -1
  92. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.d.ts +1 -1
  93. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js +1 -1
  94. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js.map +1 -1
  95. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.d.ts +1 -1
  96. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js +1 -1
  97. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js.map +1 -1
  98. package/dist/vscode.html-custom-data.json +5 -5
  99. package/dist/web-types.json +11 -11
  100. package/package.json +9 -9
  101. package/src/CalendarHeaderTemplate.tsx +148 -77
  102. package/src/CalendarTemplate.tsx +203 -66
  103. package/src/DateRangePickerTemplate.tsx +29 -1
  104. package/src/SliderTemplate.tsx +0 -1
  105. package/src/i18n/messagebundle.properties +6 -0
  106. package/src/themes/Calendar.css +144 -0
  107. package/src/themes/DatePickerPopover.css +3 -2
  108. package/src/themes/Popup.css +4 -0
  109. package/src/themes/ResponsivePopoverCommon.css +6 -1
  110. package/src/themes/base/CalendarHeader-parameters.css +9 -0
  111. package/src/themes/base/TextArea-parameters.css +1 -1
  112. package/src/themes/base/sizes-parameters.css +12 -0
  113. package/src/themes/sap_horizon/TextArea-parameters.css +0 -1
  114. package/src/themes/sap_horizon_dark/TextArea-parameters.css +0 -1
@@ -4,91 +4,155 @@ import Icon from "./Icon.js";
4
4
  import slimArowLeft from "@ui5/webcomponents-icons/dist/slim-arrow-left.js";
5
5
  import slimArowRight from "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
6
6
 
7
- export default function CalendarTemplate(this: Calendar) {
7
+ interface CalendarHeaderOptions {
8
+ headerText?: {
9
+ monthText: string;
10
+ yearText: string;
11
+ secondMonthText?: string;
12
+ secondYearText?: string;
13
+ };
14
+ isFirst?: boolean;
15
+ isLast?: boolean;
16
+ isMultiple?: boolean;
17
+ }
18
+
19
+ export default function CalendarHeaderTemplate(this: Calendar, options?: CalendarHeaderOptions) {
20
+ const headerText = options?.headerText;
21
+ const isFirst = options?.isFirst ?? true;
22
+ const isLast = options?.isLast ?? true;
23
+ const isMultiple = options?.isMultiple ?? false;
24
+
25
+ const monthText = headerText?.monthText ?? this._headerMonthButtonText;
26
+ const yearText = headerText?.yearText ?? this._headerYearButtonText;
27
+ const secondMonthText = headerText?.secondMonthText ?? this.secondMonthButtonText;
28
+ const secondYearText = headerText?.secondYearText ?? this._headerYearButtonTextSecType;
29
+
8
30
  return (
9
- <div class="ui5-calheader-root">
31
+ <div class={isMultiple ? "ui5-calheader ui5-calheader-multiple" : "ui5-calheader-root"}>
32
+ {renderPrevButton.call(this, isFirst, isMultiple)}
33
+ {renderMiddleButtons.call(this, {
34
+ monthText: monthText || "",
35
+ yearText: yearText || "",
36
+ secondMonthText: secondMonthText || "",
37
+ secondYearText: secondYearText || "",
38
+ })}
39
+ {renderNextButton.call(this, isFirst, isLast, isMultiple)}
40
+ </div>
41
+ );
42
+ }
43
+
44
+ function renderPrevButton(this: Calendar, isFirst: boolean, isMultiple: boolean) {
45
+ if (!isFirst && isMultiple) {
46
+ return <div class="ui5-calheader-spacer"></div>;
47
+ }
48
+
49
+ return (
50
+ <div
51
+ data-ui5-cal-header-btn-prev
52
+ class={{
53
+ "ui5-calheader-arrowbtn": true,
54
+ "ui5-calheader-arrowbtn-disabled": this._previousButtonDisabled,
55
+ }}
56
+ part="calendar-header-arrow-button"
57
+ role="button"
58
+ onMouseDown={this.onPrevButtonClick}
59
+ tabindex={this._previousButtonDisabled ? -1 : 0}
60
+ title={this.accInfo.tooltipPrevButton}
61
+ aria-label={this.accInfo.ariaLabelPrevButton}
62
+ aria-description={this.accInfo.ariaLabelPrevButton}
63
+ aria-keyshortcuts={this.accInfo.keyShortcutPrevButton}
64
+ >
65
+ <Icon class="ui5-calheader-arrowicon" name={slimArowLeft}/>
66
+ </div>
67
+ );
68
+ }
69
+
70
+ function renderMiddleButtons(
71
+ this: Calendar,
72
+ headerText: {
73
+ monthText: string;
74
+ yearText: string;
75
+ secondMonthText?: string;
76
+ secondYearText?: string;
77
+ }
78
+ ) {
79
+ return (
80
+ <div class="ui5-calheader-midcontainer">
10
81
  <div
11
- data-ui5-cal-header-btn-prev
12
- class={{
13
- "ui5-calheader-arrowbtn": true,
14
- "ui5-calheader-arrowbtn-disabled": this._previousButtonDisabled,
15
- }}
16
- part="calendar-header-arrow-button"
82
+ data-ui5-cal-header-btn-month
83
+ class="ui5-calheader-arrowbtn ui5-calheader-middlebtn"
84
+ part="calendar-header-middle-button"
85
+ hidden={this._isHeaderMonthButtonHidden}
86
+ tabindex={0}
17
87
  role="button"
18
- onMouseDown={this.onPrevButtonClick}
19
- tabindex={this._previousButtonDisabled ? -1 : 0}
20
- title={this.accInfo.tooltipPrevButton}
21
- aria-label={this.accInfo.ariaLabelPrevButton}
22
- aria-description={this.accInfo.ariaLabelPrevButton}
23
- aria-keyshortcuts={this.accInfo.keyShortcutPrevButton}
88
+ aria-label={this.accInfo.ariaLabelMonthButton}
89
+ aria-description={this.accInfo.ariaLabelMonthButton}
90
+ title={this.accInfo.tooltipMonthButton}
91
+ aria-keyshortcuts={this.accInfo.keyShortcutMonthButton}
92
+ onClick={this.onHeaderMonthButtonPress}
93
+ onKeyDown={this.onMonthButtonKeyDown}
94
+ onKeyUp={this.onMonthButtonKeyUp}
24
95
  >
25
- <Icon class="ui5-calheader-arrowicon" name={slimArowLeft}/>
96
+ <span>{headerText.monthText}</span>
97
+ {this.hasSecondaryCalendarType && headerText.secondMonthText &&
98
+ <span class="ui5-calheader-btn-sectext">{headerText.secondMonthText}</span>
99
+ }
26
100
  </div>
27
101
 
28
- <div class="ui5-calheader-midcontainer">
29
- <div
30
- data-ui5-cal-header-btn-month
31
- class="ui5-calheader-arrowbtn ui5-calheader-middlebtn"
32
- part="calendar-header-middle-button"
33
- hidden={this._isHeaderMonthButtonHidden}
34
- tabindex={0}
35
- role="button"
36
- aria-label={this.accInfo.ariaLabelMonthButton}
37
- aria-description={this.accInfo.ariaLabelMonthButton}
38
- title={this.accInfo.tooltipMonthButton}
39
- aria-keyshortcuts={this.accInfo.keyShortcutMonthButton}
40
- onClick={this.onHeaderMonthButtonPress}
41
- onKeyDown={this.onMonthButtonKeyDown}
42
- onKeyUp={this.onMonthButtonKeyUp}
43
- >
44
- <span>{this._headerMonthButtonText}</span>
45
- {this.hasSecondaryCalendarType &&
46
- <span class="ui5-calheader-btn-sectext">{this.secondMonthButtonText}</span>
47
- }
48
- </div>
102
+ <div
103
+ data-ui5-cal-header-btn-year
104
+ class="ui5-calheader-arrowbtn ui5-calheader-middlebtn"
105
+ part="calendar-header-middle-button"
106
+ hidden={this._isHeaderYearButtonHidden}
107
+ tabindex={0}
108
+ role="button"
109
+ aria-label={this.accInfo.ariaLabelYearButton}
110
+ aria-description={this.accInfo.ariaLabelYearButton}
111
+ onClick={this.onHeaderYearButtonPress}
112
+ onKeyDown={this.onYearButtonKeyDown}
113
+ onKeyUp={this.onYearButtonKeyUp}
114
+ title={this.accInfo.tooltipYearButton}
115
+ aria-keyshortcuts={this.accInfo.keyShortcutYearButton}
116
+ >
117
+ <span>{headerText.yearText}</span>
118
+ {this.hasSecondaryCalendarType && headerText.secondYearText &&
119
+ <span class="ui5-calheader-btn-sectext">{headerText.secondYearText}</span>
120
+ }
121
+ </div>
49
122
 
50
- <div
51
- data-ui5-cal-header-btn-year
52
- class="ui5-calheader-arrowbtn ui5-calheader-middlebtn"
53
- part="calendar-header-middle-button"
54
- hidden={this._isHeaderYearButtonHidden}
55
- tabindex={0}
56
- role="button"
57
- aria-label={this.accInfo.ariaLabelYearButton}
58
- aria-description={this.accInfo.ariaLabelYearButton}
59
- onClick={this.onHeaderYearButtonPress}
60
- onKeyDown={this.onYearButtonKeyDown}
61
- onKeyUp={this.onYearButtonKeyUp}
62
- title={this.accInfo.tooltipYearButton}
63
- aria-keyshortcuts={this.accInfo.keyShortcutYearButton}
64
- >
65
- <span>{this._headerYearButtonText}</span>
66
- {this.hasSecondaryCalendarType &&
67
- <span class="ui5-calheader-btn-sectext">{this._headerYearButtonTextSecType}</span>
68
- }
69
- </div>
70
- <div
71
- data-ui5-cal-header-btn-year-range
72
- class="ui5-calheader-arrowbtn ui5-calheader-middlebtn"
73
- part="calendar-header-middle-button"
74
- hidden={this._isHeaderYearRangeButtonHidden}
75
- tabindex={0}
76
- role="button"
77
- aria-label={this.accInfo.ariaLabelYearRangeButton}
78
- aria-description={this.accInfo.ariaLabelYearRangeButton}
79
- title={this.accInfo.tooltipYearRangeButton}
80
- aria-keyshortcuts={this.accInfo.keyShortcutYearRangeButton}
81
- onClick={this.onHeaderYearRangeButtonPress}
82
- onKeyDown={this.onYearRangeButtonKeyDown}
83
- onKeyUp={this.onYearRangeButtonKeyUp}
84
- >
85
- <span>{this._headerYearRangeButtonText}</span>
86
- {this.hasSecondaryCalendarType &&
87
- <span class="ui5-calheader-btn-sectext">{this._headerYearRangeButtonTextSecType}</span>
88
- }
89
- </div>
123
+ <div
124
+ data-ui5-cal-header-btn-year-range
125
+ class="ui5-calheader-arrowbtn ui5-calheader-middlebtn"
126
+ part="calendar-header-middle-button"
127
+ hidden={this._isHeaderYearRangeButtonHidden}
128
+ tabindex={0}
129
+ role="button"
130
+ aria-label={this.accInfo.ariaLabelYearRangeButton}
131
+ aria-description={this.accInfo.ariaLabelYearRangeButton}
132
+ title={this.accInfo.tooltipYearRangeButton}
133
+ aria-keyshortcuts={this.accInfo.keyShortcutYearRangeButton}
134
+ onClick={this.onHeaderYearRangeButtonPress}
135
+ onKeyDown={this.onYearRangeButtonKeyDown}
136
+ onKeyUp={this.onYearRangeButtonKeyUp}
137
+ >
138
+ <span>{this._headerYearRangeButtonText}</span>
139
+ {this.hasSecondaryCalendarType &&
140
+ <span class="ui5-calheader-btn-sectext">{this._headerYearRangeButtonTextSecType}</span>
141
+ }
90
142
  </div>
143
+ </div>
144
+ );
145
+ }
91
146
 
147
+ function renderNextButton(this: Calendar, isFirst: boolean, isLast: boolean, isMultiple: boolean) {
148
+ // In portrait or compact mode, show next button only on first calendar
149
+ // In landscape mode, show next button only on last calendar
150
+ const isVertical = this._portraitView || this._isCompactMode;
151
+ const shouldShowNextButton = !isMultiple || (isVertical ? isFirst : isLast);
152
+ const shouldShowSpacer = isMultiple && (isVertical ? isLast : !isLast);
153
+
154
+ if (shouldShowNextButton) {
155
+ return (
92
156
  <div
93
157
  data-ui5-cal-header-btn-next
94
158
  class={{
@@ -106,5 +170,12 @@ export default function CalendarTemplate(this: Calendar) {
106
170
  >
107
171
  <Icon class="ui5-calheader-arrowicon" name={slimArowRight}/>
108
172
  </div>
109
- </div>);
173
+ );
174
+ }
175
+
176
+ if (shouldShowSpacer) {
177
+ return <div class="ui5-calheader-spacer"></div>;
178
+ }
179
+
180
+ return null;
110
181
  }
@@ -7,18 +7,148 @@ import CalendarHeaderTemplate from "./CalendarHeaderTemplate.js";
7
7
  import CalendarSelectionMode from "./types/CalendarSelectionMode.js";
8
8
 
9
9
  export default function CalendarTemplate(this: Calendar) {
10
+ const showMultipleMonths = this._monthsToShow > 1 && !this._isDayPickerHidden;
11
+ const shouldRenderSeparateHeaders = this._isDefaultHeaderModeInMultipleMonths && !this._portraitView && !this._isCompactMode;
12
+ const shouldRenderInlineHeaders = this._isDefaultHeaderModeInMultipleMonths && (this._portraitView || this._isCompactMode);
13
+
10
14
  return (
11
15
  <>
12
16
  <div
13
- class="ui5-cal-root"
17
+ class={{
18
+ "ui5-cal-root": true,
19
+ "ui5-dt-cal--mobile": this._phoneView,
20
+ "ui5-dt-cal--portrait": this._portraitView,
21
+ "ui5-dt-cal--multiple": showMultipleMonths,
22
+ }}
14
23
  onKeyDown={this._onkeydown}
15
24
  >
16
- <div class="ui5-calheader" exportparts="calendar-header-arrow-button, calendar-header-middle-button">
17
- { CalendarHeaderTemplate.call(this) }
25
+ {!showMultipleMonths && (
26
+ <div class="ui5-calheader" exportparts="calendar-header-arrow-button, calendar-header-middle-button">
27
+ { CalendarHeaderTemplate.call(this) }
28
+ </div>
29
+ )}
30
+ <div id={`${this._id}-content`} class={{
31
+ "ui5-cal-content": true,
32
+ "ui5-cal-content-multiple": showMultipleMonths,
33
+ }}>
34
+ {showMultipleMonths ? (
35
+ <>
36
+ {/* When pickers are active, show standard calendar header */}
37
+ {this._shouldShowOnePickerHeaderButtonInMultipleMonths && (
38
+ <div class="ui5-calheader ui5-calheader-multiple ui5-calheader-default-multiple" exportparts="calendar-header-arrow-button, calendar-header-middle-button">
39
+ { CalendarHeaderTemplate.call(this) }
40
+ </div>
41
+ )}
42
+
43
+ <div class="ui5-cal-daypicker-overlay"></div>
44
+
45
+ {/* Render headers in separate loop when in horizontal layout (cozy mode, not portrait, not compact) */}
46
+ {shouldRenderSeparateHeaders && (
47
+ <div class="ui5-cal-multiple-months-header-wrapper">
48
+ {renderMonthHeaders.call(this)}
49
+ </div>
50
+ )}
51
+
52
+ {/* Render day pickers (with inline headers in vertical layout) */}
53
+ <div class="ui5-cal-multiple-months-wrapper">
54
+ {renderMonthPickers.call(this, shouldRenderInlineHeaders)}
55
+ </div>
56
+ </>
57
+ ) : (
58
+ <>
59
+ <DayPicker
60
+ id={`${this._id}-daypicker`}
61
+ hidden={this._isDayPickerHidden}
62
+ formatPattern={this._formatPattern}
63
+ selectedDates={this._selectedDatesTimestamps}
64
+ specialCalendarDates={this._specialCalendarDates}
65
+ disabledDates={this._disabledDates}
66
+ _hidden={this._isDayPickerHidden}
67
+ primaryCalendarType={this._primaryCalendarType}
68
+ secondaryCalendarType={this._secondaryCalendarType}
69
+ selectionMode={this.selectionMode}
70
+ minDate={this.minDate}
71
+ maxDate={this.maxDate}
72
+ calendarWeekNumbering={this.calendarWeekNumbering}
73
+ timestamp={this._timestamp}
74
+ hideWeekNumbers={this.hideWeekNumbers}
75
+ onChange={this.onSelectedDatesChange}
76
+ onNavigate={this.onNavigate}
77
+ exportparts="day-cell, day-cell-selected, day-cell-selected-between"
78
+ />
79
+ {renderMonthPicker.call(this)}
80
+ {renderYearPicker.call(this)}
81
+ {renderYearRangePicker.call(this)}
82
+ </>
83
+ )}
18
84
  </div>
19
- <div id={`${this._id}-content`} class="ui5-cal-content">
85
+
86
+ {showMultipleMonths && (
87
+ <div class={{
88
+ "ui5-cal-overlay-container": true,
89
+ "ui5-cal-overlay-hidden": this._isMonthPickerHidden && this._isYearPickerHidden && this._isYearRangePickerHidden,
90
+ }}>
91
+ {renderMonthPicker.call(this)}
92
+ {renderYearPicker.call(this)}
93
+ {renderYearRangePicker.call(this)}
94
+ </div>
95
+ )}
96
+ </div>
97
+
98
+ <div
99
+ onui5-calendar-legend-selection-change={this._onCalendarLegendSelectionChange}
100
+ onui5-calendar-legend-focus-out={this._onLegendFocusOut}
101
+ >
102
+ <slot name="calendarLegend"></slot>
103
+ </div>
104
+ </>);
105
+ }
106
+
107
+ /**
108
+ * Renders month headers in a separate loop (horizontal layout)
109
+ */
110
+ function renderMonthHeaders(this: Calendar) {
111
+ return Array.from({ length: this._monthsToShow }, (_, index) => {
112
+ const monthTimestamp = this._getMonthTimestamp(index);
113
+ const isFirst = index === 0;
114
+ const isLast = index === this._monthsToShow - 1;
115
+
116
+ return (
117
+ <div key={`calendar-month-header-${index}`} class="ui5-cal-month-header-container">
118
+ {CalendarHeaderTemplate.call(this, {
119
+ headerText: this._getHeaderTextForMonth(monthTimestamp),
120
+ isFirst,
121
+ isLast,
122
+ isMultiple: true,
123
+ })}
124
+ </div>
125
+ );
126
+ });
127
+ }
128
+
129
+ /**
130
+ * Renders month pickers (with optional inline headers for vertical layout)
131
+ */
132
+ function renderMonthPickers(this: Calendar, shouldRenderInlineHeaders: boolean) {
133
+ return Array.from({ length: this._monthsToShow }, (_, index) => {
134
+ const monthTimestamp = this._getMonthTimestamp(index);
135
+ const isFirst = index === 0;
136
+ const isLast = index === this._monthsToShow - 1;
137
+
138
+ return (
139
+ <div key={`calendar-month-picker-${index}`} class="ui5-cal-month-container">
140
+ {/* Render header inline when in vertical layout (portrait OR compact) */}
141
+ {shouldRenderInlineHeaders &&
142
+ CalendarHeaderTemplate.call(this, {
143
+ headerText: this._getHeaderTextForMonth(monthTimestamp),
144
+ isFirst,
145
+ isLast,
146
+ isMultiple: true,
147
+ })
148
+ }
149
+ <div class="ui5-cal-daypicker-wrapper">
20
150
  <DayPicker
21
- id={`${this._id}-daypicker`}
151
+ id={`${this._id}-daypicker-${index}`}
22
152
  hidden={this._isDayPickerHidden}
23
153
  formatPattern={this._formatPattern}
24
154
  selectedDates={this._selectedDatesTimestamps}
@@ -31,73 +161,80 @@ export default function CalendarTemplate(this: Calendar) {
31
161
  minDate={this.minDate}
32
162
  maxDate={this.maxDate}
33
163
  calendarWeekNumbering={this.calendarWeekNumbering}
34
- timestamp={this._timestamp}
164
+ timestamp={monthTimestamp}
35
165
  hideWeekNumbers={this.hideWeekNumbers}
36
166
  onChange={this.onSelectedDatesChange}
37
167
  onNavigate={this.onNavigate}
38
168
  exportparts="day-cell, day-cell-selected, day-cell-selected-between"
39
- />
40
-
41
- <MonthPicker
42
- id={`${this._id}-MP`}
43
- hidden={this._isMonthPickerHidden}
44
- formatPattern={this._formatPattern}
45
- selectedDates={this._selectedDatesTimestamps}
46
- _hidden={this._isMonthPickerHidden}
47
- primaryCalendarType={this._primaryCalendarType}
48
- secondaryCalendarType={this._secondaryCalendarType}
49
- selectionMode={this.selectionMode}
50
- minDate={this.minDate}
51
- maxDate={this.maxDate}
52
- timestamp={this._timestamp}
53
- onChange={this.onSelectedMonthChange}
54
- onNavigate={this.onNavigate}
55
- exportparts="month-cell, month-cell-selected, month-cell-selected-between, month-picker-root"
56
- />
57
-
58
- <YearPicker
59
- id={`${this._id}-YP`}
60
- hidden={this._isYearPickerHidden}
61
- formatPattern={this._formatPattern}
62
- selectedDates={this._selectedDatesTimestamps}
63
- _hidden={this._isYearPickerHidden}
64
- primaryCalendarType={this._primaryCalendarType}
65
- secondaryCalendarType={this._secondaryCalendarType}
66
- selectionMode={this.selectionMode}
67
- minDate={this.minDate}
68
- maxDate={this.maxDate}
69
- timestamp={this._timestamp}
70
- _currentYearRange = {this._currentYearRange}
71
- onChange={this.onSelectedYearChange}
72
- onNavigate={this.onNavigate}
73
- exportparts="year-cell, year-cell-selected, year-cell-selected-between, year-picker-root"
74
- />
75
-
76
- <YearRangePicker
77
- id={`${this._id}-YRP`}
78
- hidden={this._isYearRangePickerHidden}
79
- formatPattern={this._formatPattern}
80
- selectedDates={this._selectedDatesTimestamps}
81
- _showRangeSelection={this.selectionMode === CalendarSelectionMode.Range}
82
- _hidden={this._isYearRangePickerHidden}
83
- primaryCalendarType={this._primaryCalendarType}
84
- secondaryCalendarType={this._secondaryCalendarType}
85
- minDate={this.minDate}
86
- maxDate={this.maxDate}
87
- timestamp={this._timestamp}
88
- _currentYearRange = {this._currentYearRange}
89
- onChange={this.onSelectedYearRangeChange}
90
- onNavigate={this.onNavigate}
91
- exportparts="year-range-cell, year-range-cell-selected, year-range-cell-selected-between, year-range-picker-root"
169
+ inert={this._inert}
92
170
  />
93
171
  </div>
94
172
  </div>
173
+ );
174
+ });
175
+ }
95
176
 
96
- <div
97
- onui5-calendar-legend-selection-change={this._onCalendarLegendSelectionChange}
98
- onui5-calendar-legend-focus-out={this._onLegendFocusOut}
99
- >
100
- <slot name="calendarLegend"></slot>
101
- </div>
102
- </>);
177
+ function renderMonthPicker(this: Calendar) {
178
+ return (
179
+ <MonthPicker
180
+ id={`${this._id}-MP`}
181
+ hidden={this._isMonthPickerHidden}
182
+ formatPattern={this._formatPattern}
183
+ selectedDates={this._selectedDatesTimestamps}
184
+ _hidden={this._isMonthPickerHidden}
185
+ primaryCalendarType={this._primaryCalendarType}
186
+ secondaryCalendarType={this._secondaryCalendarType}
187
+ selectionMode={this.selectionMode}
188
+ minDate={this.minDate}
189
+ maxDate={this.maxDate}
190
+ timestamp={this._timestamp}
191
+ onChange={this.onSelectedMonthChange}
192
+ onNavigate={this.onNavigate}
193
+ exportparts="month-cell, month-cell-selected, month-cell-selected-between, month-picker-root"
194
+ />
195
+ );
196
+ }
197
+
198
+ function renderYearPicker(this: Calendar) {
199
+ return (
200
+ <YearPicker
201
+ id={`${this._id}-YP`}
202
+ hidden={this._isYearPickerHidden}
203
+ formatPattern={this._formatPattern}
204
+ selectedDates={this._selectedDatesTimestamps}
205
+ _hidden={this._isYearPickerHidden}
206
+ primaryCalendarType={this._primaryCalendarType}
207
+ secondaryCalendarType={this._secondaryCalendarType}
208
+ selectionMode={this.selectionMode}
209
+ minDate={this.minDate}
210
+ maxDate={this.maxDate}
211
+ timestamp={this._timestamp}
212
+ _currentYearRange = {this._currentYearRange}
213
+ onChange={this.onSelectedYearChange}
214
+ onNavigate={this.onNavigate}
215
+ exportparts="year-cell, year-cell-selected, year-cell-selected-between, year-picker-root"
216
+ />
217
+ );
218
+ }
219
+
220
+ function renderYearRangePicker(this: Calendar) {
221
+ return (
222
+ <YearRangePicker
223
+ id={`${this._id}-YRP`}
224
+ hidden={this._isYearRangePickerHidden}
225
+ formatPattern={this._formatPattern}
226
+ selectedDates={this._selectedDatesTimestamps}
227
+ _showRangeSelection={this.selectionMode === CalendarSelectionMode.Range}
228
+ _hidden={this._isYearRangePickerHidden}
229
+ primaryCalendarType={this._primaryCalendarType}
230
+ secondaryCalendarType={this._secondaryCalendarType}
231
+ minDate={this.minDate}
232
+ maxDate={this.maxDate}
233
+ timestamp={this._timestamp}
234
+ _currentYearRange = {this._currentYearRange}
235
+ onChange={this.onSelectedYearRangeChange}
236
+ onNavigate={this.onNavigate}
237
+ exportparts="year-range-cell, year-range-cell-selected, year-range-cell-selected-between, year-range-picker-root"
238
+ />
239
+ );
103
240
  }
@@ -4,11 +4,12 @@ import type DateRangePicker from "./DateRangePicker.js";
4
4
 
5
5
  import DatePickerInputTemplate from "./DatePickerInputTemplate.js";
6
6
  import DatePickerPopoverTemplate from "./DatePickerPopoverTemplate.js";
7
+ import Button from "./Button.js";
7
8
 
8
9
  export default function DateRangePickerTemplate(this: DateRangePicker) {
9
10
  return [
10
11
  DatePickerInputTemplate.call(this),
11
- DatePickerPopoverTemplate.call(this, { content, initialFocus: this.initialFocusId }),
12
+ DatePickerPopoverTemplate.call(this, { content, initialFocus: this.initialFocusId, footer: this._isPhone ? footer : undefined }),
12
13
  ];
13
14
  }
14
15
 
@@ -29,8 +30,35 @@ function content(this: DateRangePicker) {
29
30
  hideWeekNumbers={this.hideWeekNumbers}
30
31
  _currentPicker={this._calendarCurrentPicker}
31
32
  _pickersMode={this._calendarPickersMode}
33
+ _showTwoMonths={this.showTwoMonths}
32
34
  >
33
35
  <CalendarDateRange startValue={this.startValue} endValue={this.endValue} />
34
36
  </Calendar>
35
37
  );
36
38
  }
39
+
40
+ function footer(this: DateRangePicker) {
41
+ return (
42
+ <div
43
+ slot="footer"
44
+ class="ui5-dt-picker-footer">
45
+ <Button
46
+ id="ok"
47
+ class="ui5-dt-picker-action"
48
+ design="Emphasized"
49
+ disabled={this._submitDisabled}
50
+ onClick={this._submitClick}
51
+ >
52
+ {this._okButtonText}
53
+ </Button>
54
+ <Button
55
+ id="cancel"
56
+ class="ui5-dt-picker-action"
57
+ design="Transparent"
58
+ onClick={this._cancelClick}
59
+ >
60
+ {this._cancelButtonText}
61
+ </Button>
62
+ </div>
63
+ );
64
+ }
@@ -20,7 +20,6 @@ const handle = (slider: Slider) => {
20
20
  min={slider.min}
21
21
  max={slider.max}
22
22
  tabIndex={slider.disabled ? -1 : 0}
23
- disabled={slider.disabled}
24
23
  aria-orientation="horizontal"
25
24
  part="handle"
26
25
  exportparts="icon: handle-icon"
@@ -706,6 +706,12 @@ CALENDAR_HEADER_YEAR_BUTTON = Year {0}
706
706
  #XACT: ARIA label for year range button in the Calendar Header
707
707
  CALENDAR_HEADER_YEAR_RANGE_BUTTON = Year range from {0} to {1}
708
708
 
709
+ #XACT: text that is used in the daterange calendar footer cancel button in mobile devices
710
+ CALENDAR_FOOTER_CANCEL_BUTTON = Cancel
711
+
712
+ #XACT: text that is used in the daterange calendar footer ok button in mobile devices
713
+ CALENDAR_FOOTER_OK_BUTTON = OK
714
+
709
715
  #XACT: Keyboard shortcut for month button in the Calendar Header
710
716
  CALENDAR_HEADER_MONTH_BUTTON_SHORTCUT = F4
711
717