1616from OTAnalytics .plugin_ui .customtkinter_gui .frame_filter import (
1717 InvalidDatetimeFormatError ,
1818)
19+ from OTAnalytics .plugin_ui .nicegui_gui .nicegui .constants import TestIdAttributes
1920from OTAnalytics .plugin_ui .nicegui_gui .nicegui .elements .button_form import ButtonForm
2021from OTAnalytics .plugin_ui .nicegui_gui .nicegui .elements .forms import (
2122 DateTimeForm ,
2425)
2526
2627MARKER_FILTER_BY_DATE_CHECKBOX = "marker-filter-by-date-checkbox"
28+ MARKER_FILTER_BY_DATE_BUTTON = "marker-filter-by-date-button"
29+ MARKER_FILTER_BY_DATE_APPLY_BUTTON = "marker-filter-by-date-apply"
30+ MARKER_FILTER_START_DATE_INPUT = "marker-filter-start-date"
31+ MARKER_FILTER_START_TIME_INPUT = "marker-filter-start-time"
32+ MARKER_FILTER_END_DATE_INPUT = "marker-filter-end-date"
33+ MARKER_FILTER_END_TIME_INPUT = "marker-filter-end-time"
34+ MARKER_FILTER_RANGE_LABEL = "marker-filter-range-label"
35+
36+ # Additional navigation markers for Playwright tests
37+ MARKER_PREV_DATE_BUTTON = "marker-prev-date"
38+ MARKER_NEXT_DATE_BUTTON = "marker-next-date"
39+ MARKER_PREV_SECONDS_BUTTON = "marker-prev-seconds"
40+ MARKER_NEXT_SECONDS_BUTTON = "marker-next-seconds"
41+ MARKER_PREV_FRAMES_BUTTON = "marker-prev-frames"
42+ MARKER_NEXT_FRAMES_BUTTON = "marker-next-frames"
43+ MARKER_PREV_EVENT_BUTTON = "marker-prev-event"
44+ MARKER_NEXT_EVENT_BUTTON = "marker-next-event"
2745
2846
2947class FilterDateRangeForm :
@@ -37,10 +55,14 @@ def __init__(
3755 self ._start_date = DateTimeForm (
3856 self ._resource_manager .get (VisualizationFiltersKeys .LABEL_START_DATE ),
3957 self ._resource_manager .get (VisualizationFiltersKeys .LABEL_START_TIME ),
58+ marker_date = MARKER_FILTER_START_DATE_INPUT ,
59+ marker_time = MARKER_FILTER_START_TIME_INPUT ,
4060 )
4161 self ._end_date = DateTimeForm (
4262 self ._resource_manager .get (VisualizationFiltersKeys .LABEL_END_DATE ),
4363 self ._resource_manager .get (VisualizationFiltersKeys .LABEL_END_TIME ),
64+ marker_date = MARKER_FILTER_END_DATE_INPUT ,
65+ marker_time = MARKER_FILTER_END_TIME_INPUT ,
4466 )
4567
4668 def open (self ) -> None :
@@ -89,10 +111,15 @@ def open(self) -> None:
89111 ui .label (first_occurrence_info_text )
90112 ui .label (last_occurrence_info_text )
91113 with ui .row ():
92- ui .button (
114+ apply_button = ui .button (
93115 self ._resource_manager .get (GeneralKeys .LABEL_APPLY ),
94116 on_click = self ._on_apply_button_clicked ,
95117 )
118+ # marker for Playwright: Apply button inside the filter-by-date dialog
119+ apply_button .mark (MARKER_FILTER_BY_DATE_APPLY_BUTTON )
120+ apply_button .props (
121+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_FILTER_BY_DATE_APPLY_BUTTON } " # noqa
122+ )
96123 ui .button (
97124 self ._resource_manager .get (GeneralKeys .LABEL_RESET ),
98125 on_click = self ._on_reset_button_clicked ,
@@ -174,26 +201,56 @@ def build(self) -> None:
174201 ),
175202 on_click = self .open_range_dialog ,
176203 )
204+ # Attach a stable test marker for Playwright selection
205+ self ._filter_by_date_button .mark (MARKER_FILTER_BY_DATE_BUTTON )
206+ self ._filter_by_date_button .props (
207+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_FILTER_BY_DATE_BUTTON } "
208+ )
177209 self ._filter_by_date_button .disable ()
178210
179211 self ._button_previous_second = ui .button (
180212 "<" , on_click = self ._viewmodel .previous_second
181213 )
214+ self ._button_previous_second .mark (MARKER_PREV_SECONDS_BUTTON )
215+ self ._button_previous_second .props (
216+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_PREV_SECONDS_BUTTON } "
217+ )
182218 self ._button_previous_frame = ui .button (
183219 "<" , on_click = self ._viewmodel .previous_frame
184220 )
221+ self ._button_previous_frame .mark (MARKER_PREV_FRAMES_BUTTON )
222+ self ._button_previous_frame .props (
223+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_PREV_FRAMES_BUTTON } "
224+ )
185225 self ._button_previous_event = ui .button (
186226 "<" , on_click = self ._viewmodel .previous_event
187227 )
228+ self ._button_previous_event .mark (MARKER_PREV_EVENT_BUTTON )
229+ self ._button_previous_event .props (
230+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_PREV_EVENT_BUTTON } "
231+ )
188232 with ui .column ():
189233 with ui .row ():
190234 self ._filter_by_date_button_left = ui .button (
191235 "<" , on_click = self ._viewmodel .switch_to_prev_date_range
192236 )
237+ self ._filter_by_date_button_left .mark (MARKER_PREV_DATE_BUTTON )
238+ self ._filter_by_date_button_left .props (
239+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_PREV_DATE_BUTTON } "
240+ )
193241 self ._label_filter_by_date = ui .label ()
242+ # Expose the current applied date range for Playwright assertions
243+ self ._label_filter_by_date .mark (MARKER_FILTER_RANGE_LABEL )
244+ self ._label_filter_by_date .props (
245+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_FILTER_RANGE_LABEL } "
246+ )
194247 self ._filter_by_date_button_right = ui .button (
195248 ">" , on_click = self ._viewmodel .switch_to_next_date_range
196249 )
250+ self ._filter_by_date_button_right .mark (MARKER_NEXT_DATE_BUTTON )
251+ self ._filter_by_date_button_right .props (
252+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_NEXT_DATE_BUTTON } "
253+ )
197254 self ._filter_by_date_button_left .disable ()
198255 self ._filter_by_date_button_right .disable ()
199256 self ._input_seconds .build ()
@@ -216,12 +273,24 @@ def build(self) -> None:
216273 self ._button_next_second = ui .button (
217274 ">" , on_click = self ._viewmodel .next_second
218275 )
276+ self ._button_next_second .mark (MARKER_NEXT_SECONDS_BUTTON )
277+ self ._button_next_second .props (
278+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_NEXT_SECONDS_BUTTON } "
279+ )
219280 self ._button_next_frame = ui .button (
220281 ">" , on_click = self ._viewmodel .next_frame
221282 )
283+ self ._button_next_frame .mark (MARKER_NEXT_FRAMES_BUTTON )
284+ self ._button_next_frame .props (
285+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_NEXT_FRAMES_BUTTON } "
286+ )
222287 self ._button_next_event = ui .button (
223288 ">" , on_click = self ._viewmodel .next_event
224289 )
290+ self ._button_next_event .mark (MARKER_NEXT_EVENT_BUTTON )
291+ self ._button_next_event .props (
292+ f"{ TestIdAttributes .DATA_TESTID } ={ MARKER_NEXT_EVENT_BUTTON } "
293+ )
225294 self .set_enabled_general_buttons (False )
226295
227296 def change_button_date (self , checkbox_status : bool ) -> None :
@@ -275,9 +344,13 @@ def open_range_dialog(self) -> None:
275344
276345 def set_active_color_on_filter_by_date_button (self ) -> None :
277346 self ._filter_by_date_button .props ("color=orange" )
347+ # Expose active state for Playwright assertions
348+ self ._filter_by_date_button .props ("data-filter-by-date-active=true" )
278349
279350 def set_inactive_color_on_filter_by_date_button (self ) -> None :
280351 self ._filter_by_date_button .props ("color=primary" )
352+ # Expose inactive state for Playwright assertions
353+ self ._filter_by_date_button .props ("data-filter-by-date-active=false" )
281354
282355 def set_active_color_on_filter_by_class_button (self ) -> None :
283356 self ._filter_by_class_button .props ("color=orange" )
0 commit comments