|
2 | 2 | @inherits BitInputBase<DateTimeOffset?> |
3 | 3 |
|
4 | 4 | @{ |
5 | | - var todayYear = _culture.Calendar.GetYear(DateTime.Now); |
6 | | - var todayMonth = _culture.Calendar.GetMonth(DateTime.Now); |
7 | | - var todayDay = _culture.Calendar.GetDayOfMonth(DateTime.Now); |
| 5 | + var today = GetToday(); |
| 6 | + var todayYear = _culture.Calendar.GetYear(today); |
| 7 | + var todayMonth = _culture.Calendar.GetMonth(today); |
| 8 | + var focusableDay = GetFocusableDay(); |
8 | 9 |
|
9 | 10 | var prevMonthNavIconCss = BitIconInfo.From(PrevMonthNavIcon, PrevMonthNavIconName ?? "Up")?.GetCssClasses(); |
10 | 11 | var nextMonthNavIconCss = BitIconInfo.From(NextMonthNavIcon, NextMonthNavIconName ?? "Up bit-ico-r180")?.GetCssClasses(); |
|
127 | 128 | } |
128 | 129 | </div> |
129 | 130 | </div> |
130 | | - <div style="@Styles?.DaysHeaderRow" class="bit-cal-dgh @Classes?.DaysHeaderRow"> |
131 | | - @if (ShowWeekNumbers) |
132 | | - { |
133 | | - <div style="@Styles?.WeekNumbersHeader" class="bit-cal-wlb @Classes?.WeekNumbersHeader"></div> |
134 | | - } |
135 | | - |
136 | | - @for (var index = 0; index < 7; index++) |
137 | | - { |
138 | | - var dayOfWeekName = _culture.DateTimeFormat.GetShortestDayName(GetDayOfWeek(index)); |
139 | | - <div title="@dayOfWeekName" |
140 | | - style="@Styles?.WeekNumbersHeader" |
141 | | - class="bit-cal-wlb @Classes?.WeekNumbersHeader"> |
142 | | - @dayOfWeekName[0] |
143 | | - </div> |
144 | | - } |
145 | | - </div> |
146 | | - |
147 | | - @for (var week = 0; week < 6; week++) |
148 | | - { |
149 | | - //to ignore the last empty week of the month || to ignore the first whole week of the month |
150 | | - if (_daysOfCurrentMonth[week, 0].HasValue is false) continue; |
151 | | - |
152 | | - <div style="@Styles?.DaysRow" class="bit-cal-dgr @Classes?.DaysRow"> |
| 131 | + <div role="grid" aria-label="@_monthTitle" style="@Styles?.DaysGrid" class="bit-cal-grd @Classes?.DaysGrid"> |
| 132 | + <div role="row" style="@Styles?.DaysHeaderRow" class="bit-cal-dgh @Classes?.DaysHeaderRow"> |
153 | 133 | @if (ShowWeekNumbers) |
154 | 134 | { |
155 | | - var weekNumber = GetWeekNumber(week); |
156 | | - var title = string.Format(WeekNumberTitle, weekNumber); |
157 | | - <div scope="row" |
158 | | - title="@title" |
159 | | - aria-label="@title" |
160 | | - style="@Styles?.WeekNumber" |
161 | | - class="bit-cal-wnm @Classes?.WeekNumber"> |
162 | | - @weekNumber |
163 | | - </div> |
| 135 | + <div role="columnheader" style="@Styles?.WeekNumbersHeader" class="bit-cal-wlb @Classes?.WeekNumbersHeader"></div> |
164 | 136 | } |
165 | | - @for (var day = 0; day < 7; day++) |
| 137 | + |
| 138 | + @for (var index = 0; index < 7; index++) |
166 | 139 | { |
167 | | - var date = _daysOfCurrentMonth[week, day]!.Value; |
168 | | - var disabled = IsEnabled is false || IsWeekDayOutOfMinAndMaxDate(date); |
169 | | - var isSelected = IsSelectedDate(date); |
170 | | - var (style, klass) = GetDayButtonCss(date); |
171 | | - var dayEvents = GetDayEvents(date); |
172 | | - <button @onclick="() => HandleDayClick(date, dayEvents)" |
173 | | - type="button" |
174 | | - role="gridcell" |
175 | | - disabled="@disabled" |
176 | | - aria-readonly="true" |
177 | | - aria-disabled="@disabled" |
178 | | - title="@(dayEvents.Count > 0 ? GetEventTooltip(dayEvents) : null)" |
179 | | - style="@style @Styles?.DayButton" |
180 | | - class="bit-cal-dbt@(klass) @Classes?.DayButton" |
181 | | - tabindex="@(isSelected ? 0 : -1)" |
182 | | - aria-selected="@(isSelected ? "true" : "false")"> |
183 | | - @if (DayCellTemplate is not null) |
184 | | - { |
185 | | - @DayCellTemplate(GetDateTimeOfDayCell(date)) |
186 | | - } |
187 | | - else |
188 | | - { |
189 | | - @GetDayOfCurrentMonth(date) |
190 | | - } |
191 | | - @if (dayEvents.Count > 0) |
192 | | - { |
193 | | - <span style="@Styles?.EventIndicator" |
194 | | - class="bit-cal-evi @Classes?.EventIndicator"> |
195 | | - </span> |
196 | | - } |
197 | | - </button> |
| 140 | + var dayOfWeek = GetDayOfWeek(index); |
| 141 | + var dayOfWeekName = _culture.DateTimeFormat.GetShortestDayName(dayOfWeek); |
| 142 | + <div role="columnheader" |
| 143 | + title="@dayOfWeekName" |
| 144 | + aria-label="@_culture.DateTimeFormat.GetDayName(dayOfWeek)" |
| 145 | + style="@Styles?.DayNameHeader" |
| 146 | + class="bit-cal-wlb @Classes?.DayNameHeader"> |
| 147 | + @dayOfWeekName[0] |
| 148 | + </div> |
198 | 149 | } |
199 | 150 | </div> |
200 | | - } |
| 151 | + |
| 152 | + @for (var week = 0; week < 6; week++) |
| 153 | + { |
| 154 | + //to ignore the last empty week of the month || to ignore the first whole week of the month |
| 155 | + if (_daysOfCurrentMonth[week, 0].HasValue is false) continue; |
| 156 | + |
| 157 | + <div role="row" style="@Styles?.DaysRow" class="bit-cal-dgr @Classes?.DaysRow"> |
| 158 | + @if (ShowWeekNumbers) |
| 159 | + { |
| 160 | + var weekNumber = GetWeekNumber(week); |
| 161 | + var title = string.Format(WeekNumberTitle, weekNumber); |
| 162 | + <div role="rowheader" |
| 163 | + title="@title" |
| 164 | + aria-label="@title" |
| 165 | + style="@Styles?.WeekNumber" |
| 166 | + class="bit-cal-wnm @Classes?.WeekNumber"> |
| 167 | + @weekNumber |
| 168 | + </div> |
| 169 | + } |
| 170 | + @for (var day = 0; day < 7; day++) |
| 171 | + { |
| 172 | + var date = _daysOfCurrentMonth[week, day]!.Value; |
| 173 | + |
| 174 | + if (ShowOutsideDays is false && IsInCurrentMonth(date) is false) |
| 175 | + { |
| 176 | + <div role="gridcell" style="@Styles?.DayButton" class="bit-cal-dbe @Classes?.DayButton"></div> |
| 177 | + continue; |
| 178 | + } |
| 179 | + |
| 180 | + var disabled = IsEnabled is false || IsDayDisabled(date); |
| 181 | + var isSelected = IsSelectedDate(date); |
| 182 | + var isToday = IsInCurrentMonth(date) && date == today.Date; |
| 183 | + var (style, klass) = GetDayButtonCss(date); |
| 184 | + var dayEvents = GetDayEvents(date); |
| 185 | + <button @onclick="() => HandleDayClick(date, dayEvents)" |
| 186 | + @onkeydown="e => HandleDayKeyDown(e, date)" |
| 187 | + type="button" |
| 188 | + role="gridcell" |
| 189 | + id="@GetDayButtonId(date)" |
| 190 | + disabled="@disabled" |
| 191 | + aria-readonly="true" |
| 192 | + aria-disabled="@disabled" |
| 193 | + aria-label="@date.ToString(_culture.DateTimeFormat.LongDatePattern, _culture)" |
| 194 | + aria-current="@(isToday ? "date" : null)" |
| 195 | + title="@(dayEvents.Count > 0 ? GetEventTooltip(dayEvents) : null)" |
| 196 | + style="@style @Styles?.DayButton" |
| 197 | + class="bit-cal-dbt@(klass) @Classes?.DayButton" |
| 198 | + tabindex="@(date == focusableDay ? 0 : -1)" |
| 199 | + aria-selected="@(isSelected ? "true" : "false")"> |
| 200 | + @if (DayCellTemplate is not null) |
| 201 | + { |
| 202 | + @DayCellTemplate(GetDateTimeOfDayCell(date)) |
| 203 | + } |
| 204 | + else |
| 205 | + { |
| 206 | + @GetDayOfCurrentMonth(date) |
| 207 | + } |
| 208 | + @if (dayEvents.Count > 0) |
| 209 | + { |
| 210 | + <span style="@Styles?.EventIndicator" |
| 211 | + class="bit-cal-evi @Classes?.EventIndicator"> |
| 212 | + </span> |
| 213 | + } |
| 214 | + </button> |
| 215 | + } |
| 216 | + </div> |
| 217 | + } |
| 218 | + </div> |
201 | 219 | </div> |
202 | 220 | } |
203 | 221 |
|
|
292 | 310 | } |
293 | 311 | </div> |
294 | 312 | </div> |
| 313 | + <div role="grid" aria-label="@_currentYear" class="bit-cal-grd"> |
295 | 314 | @for (var rowIndex = 0; rowIndex <= 2; rowIndex++) |
296 | 315 | { |
297 | 316 | <div style="@Styles?.MonthsRow" class="bit-cal-pkr @Classes?.MonthsRow" role="row"> |
|
325 | 344 | } |
326 | 345 | </div> |
327 | 346 | } |
| 347 | + </div> |
328 | 348 | } |
329 | 349 | else |
330 | 350 | { |
|
390 | 410 | </button> |
391 | 411 | </div> |
392 | 412 | </div> |
| 413 | + <div role="grid" aria-label="@_yearPickerStartYear - @_yearPickerEndYear" class="bit-cal-grd"> |
393 | 414 | @for (var rowIndex = 0; rowIndex <= 2; rowIndex++) |
394 | 415 | { |
395 | 416 | <div style="@Styles?.YearsRow" class="bit-cal-pkr @Classes?.YearsRow" role="row"> |
|
420 | 441 | } |
421 | 442 | </div> |
422 | 443 | } |
423 | | - |
| 444 | + </div> |
424 | 445 | } |
425 | 446 | </div> |
426 | 447 | } |
|
0 commit comments