@@ -5,17 +5,20 @@ class DatePickerComponent extends BaseComponent {
5
5
private readonly calendarSelector = 'nb-calendar' ;
6
6
private readonly calendarViewModeSelector = 'nb-calendar-view-mode' ;
7
7
private readonly navChevronSelector = 'nb-calendar-pageable-navigation [data-name="chevron-right"]' ;
8
-
9
8
private readonly commonDayCellSelector = 'nb-calendar-day-cell.day-cell.ng-star-inserted:not(.bounding-month)' ;
10
-
11
9
private readonly rangeDayCellSelector = 'nb-calendar-range-day-cell.day-cell.ng-star-inserted' ;
10
+ private readonly currentMonthRangeDayCellSelector = 'nb-calendar-range-day-cell.day-cell.ng-star-inserted:not(.bounding-month)' ;
12
11
13
12
constructor ( page : Page ) {
14
13
super ( page , 'DatePickerComponent' ) ;
15
14
}
16
15
17
- //TODO: Rethink the implementation
18
-
16
+ /**
17
+ * Selects a date in the calendar by navigating to the correct month and clicking the day
18
+ * @param daysFromToday Number of days from today to select
19
+ * @param isRangePicker Whether this is being used in a range picker context
20
+ * @returns The formatted date string for assertion
21
+ */
19
22
private async selectDateInCalendar (
20
23
daysFromToday : number ,
21
24
isRangePicker : boolean = false
@@ -30,23 +33,62 @@ class DatePickerComponent extends BaseComponent {
30
33
const dateToAssert = `${ expectedMonthShort } ${ expectedDay } , ${ expectedYear } ` ;
31
34
const expectedMonthAndYear = `${ expectedMonthLong } ${ expectedYear } ` ;
32
35
36
+ // Navigate to the correct month/year using the next button if needed
33
37
let calendarMonthYear = await this . getText ( this . calendarViewModeSelector ) ;
34
38
while ( calendarMonthYear && ! calendarMonthYear . includes ( expectedMonthAndYear ) ) {
35
39
await this . click ( this . navChevronSelector ) ;
36
40
calendarMonthYear = await this . getText ( this . calendarViewModeSelector ) ;
37
41
}
38
42
39
- const dayCellSelector = isRangePicker ? this . rangeDayCellSelector : this . commonDayCellSelector ;
40
- await this . click ( dayCellSelector , { text : expectedDay , exact : true } ) ;
43
+ if ( isRangePicker ) {
44
+
45
+ const calendarContainer = await this . page . locator ( 'nb-calendar-range' ) . first ( ) ;
46
+ const cells = await calendarContainer
47
+ . locator ( this . currentMonthRangeDayCellSelector )
48
+ . filter ( { hasText : new RegExp ( `^${ expectedDay } $` ) } )
49
+ . all ( ) ;
50
+
51
+ if ( cells . length > 0 ) {
52
+ await cells [ 0 ] . click ( ) ;
53
+ } else {
54
+ const anyCells = await calendarContainer
55
+ . locator ( this . rangeDayCellSelector )
56
+ . filter ( { hasText : new RegExp ( `^${ expectedDay } $` ) } )
57
+ . all ( ) ;
58
+
59
+ if ( anyCells . length > 0 ) {
60
+ await anyCells [ 0 ] . click ( ) ;
61
+ } else {
62
+ throw new Error ( `Could not find any date cell with text "${ expectedDay } " in range picker` ) ;
63
+ }
64
+ }
65
+ } else {
66
+ await this . click ( this . commonDayCellSelector , {
67
+ text : expectedDay ,
68
+ exact : true ,
69
+ useFirst : true
70
+ } ) ;
71
+ }
72
+
41
73
return dateToAssert ;
42
74
}
43
75
76
+ /**
77
+ * Selects a date in the common datepicker that is a specified number of days from today
78
+ * @param daysFromToday Number of days from today to select
79
+ */
44
80
async selectCommonDatepickerDateFromToday ( daysFromToday : number ) : Promise < void > {
45
81
const calendarInputField = this . getByPlaceholder ( 'Form Picker' ) ;
46
82
await calendarInputField . click ( ) ;
47
83
await this . selectDateInCalendar ( daysFromToday , false ) ;
48
84
}
49
85
86
+ /**
87
+ * Selects a date range in the range picker
88
+ * @param daysFromToday Number of days from today for the start date
89
+ * @param daysAfter Number of days from today for the end date
90
+ * @returns Object containing formatted start and end dates for assertion
91
+ */
50
92
async selectDatePickerRangeFromToday (
51
93
daysFromToday : number ,
52
94
daysAfter : number
@@ -55,10 +97,18 @@ class DatePickerComponent extends BaseComponent {
55
97
await calendarInputField . click ( ) ;
56
98
57
99
const dateFrom = await this . selectDateInCalendar ( daysFromToday , true ) ;
100
+
58
101
const dateTo = await this . selectDateInCalendar ( daysAfter , true ) ;
102
+
59
103
return { dateFrom, dateTo } ;
60
104
}
61
105
106
+ /**
107
+ * Generates formatted date strings for assertions
108
+ * @param daysFromToday Number of days from today
109
+ * @param daysAfter Optional number of days after for range assertions
110
+ * @returns Formatted date string(s) for assertion
111
+ */
62
112
async getDateToAssert (
63
113
daysFromToday : number ,
64
114
daysAfter ?: number
0 commit comments