@@ -174,13 +174,14 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
174174 await page . setContent (
175175 `
176176 <ion-picker>
177- <ion-picker-column></ion-picker-column>
177+ <ion-picker-column id="hours"></ion-picker-column>
178+ <ion-picker-column id="minutes"></ion-picker-column>
178179 </ion-picker>
179180
180181 <script>
181- const column = document.querySelector('ion-picker-column');
182- column .numericInput = true;
183- const items = [
182+ const hoursColumn = document.querySelector('ion-picker-column#hours ');
183+ hoursColumn .numericInput = true;
184+ const hourItems = [
184185 { text: '01', value: 1 },
185186 { text: '02', value: 2},
186187 { text: '20', value: 20 },
@@ -189,29 +190,59 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
189190 { text: '23', value: 23 }
190191 ];
191192
192- items .forEach((item) => {
193+ hourItems .forEach((item) => {
193194 const option = document.createElement('ion-picker-column-option');
194195 option.value = item.value;
195196 option.textContent = item.text;
196197
197- column.appendChild(option);
198+ hoursColumn.appendChild(option);
199+ });
200+
201+ const minutesColumn = document.querySelector('ion-picker-column#minutes');
202+ minutesColumn.numericInput = true;
203+ const minuteItems = [
204+ { text: '00', value: 0 },
205+ { text: '15', value: 15 },
206+ { text: '30', value: 30 },
207+ { text: '45', value: 45 }
208+ ];
209+
210+ minuteItems.forEach((item) => {
211+ const option = document.createElement('ion-picker-column-option');
212+ option.value = item.value;
213+ option.textContent = item.text;
214+
215+ minutesColumn.appendChild(option);
198216 });
199217 </script>
200218 ` ,
201219 config
202220 ) ;
203221
204- const column = page . locator ( 'ion-picker-column' ) ;
205- const ionChange = await page . spyOnEvent ( 'ionChange' ) ;
206- await column . evaluate ( ( el : HTMLIonPickerColumnElement ) => el . setFocus ( ) ) ;
222+ const hoursColumn = page . locator ( 'ion-picker-column#hours' ) ;
223+ const minutesColumn = page . locator ( 'ion-picker-column#minutes' ) ;
224+ const hoursIonChange = await ( hoursColumn as E2ELocator ) . spyOnEvent ( 'ionChange' ) ;
225+ const minutesIonChange = await ( minutesColumn as E2ELocator ) . spyOnEvent ( 'ionChange' ) ;
226+ const highlight = page . locator ( 'ion-picker .picker-highlight' ) ;
227+
228+ const box = await highlight . boundingBox ( ) ;
229+ if ( box !== null ) {
230+ await page . mouse . click ( box . x + box . width / 2 , box . y + box . height / 2 ) ;
231+ }
207232
208- // Simulate typing '22'
233+ // Simulate typing '2230' (22 hours, 30 minutes)
209234 await page . keyboard . press ( 'Digit2' ) ;
210235 await page . keyboard . press ( 'Digit2' ) ;
236+ await page . keyboard . press ( 'Digit3' ) ;
237+ await page . keyboard . press ( 'Digit0' ) ;
211238
212- // Ensure the column value is updated to 22
213- await expect ( ionChange ) . toHaveReceivedEventDetail ( { value : 22 } ) ;
214- await expect ( column ) . toHaveJSProperty ( 'value' , 22 ) ;
239+ // Ensure the hours column is set to 22
240+ await expect ( hoursIonChange ) . toHaveReceivedEventDetail ( { value : 22 } ) ;
241+ await expect ( hoursColumn ) . toHaveJSProperty ( 'value' , 22 ) ;
242+
243+ // Ensure the minutes column is set to 30
244+ await expect ( minutesIonChange ) . toHaveReceivedEventDetail ( { value : 30 } ) ;
245+ await expect ( minutesColumn ) . toHaveJSProperty ( 'value' , 30 ) ;
215246 } ) ;
216247
217248 test ( 'should set value to 2 and not wait for another digit when max value is 12' , async ( { page } , testInfo ) => {
@@ -222,13 +253,14 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
222253 await page . setContent (
223254 `
224255 <ion-picker>
225- <ion-picker-column></ion-picker-column>
256+ <ion-picker-column id="hours"></ion-picker-column>
257+ <ion-picker-column id="minutes"></ion-picker-column>
226258 </ion-picker>
227259
228260 <script>
229- const column = document.querySelector('ion-picker-column');
230- column .numericInput = true;
231- const items = [
261+ const hoursColumn = document.querySelector('ion-picker-column#hours ');
262+ hoursColumn .numericInput = true;
263+ const hourItems = [
232264 { text: '01', value: 1 },
233265 { text: '02', value: 2 },
234266 { text: '03', value: 3 },
@@ -243,28 +275,58 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
243275 { text: '12', value: 12 }
244276 ];
245277
246- items .forEach((item) => {
278+ hourItems .forEach((item) => {
247279 const option = document.createElement('ion-picker-column-option');
248280 option.value = item.value;
249281 option.textContent = item.text;
250282
251- column.appendChild(option);
283+ hoursColumn.appendChild(option);
284+ });
285+
286+ const minutesColumn = document.querySelector('ion-picker-column#minutes');
287+ minutesColumn.numericInput = true;
288+ const minuteItems = [
289+ { text: '00', value: 0 },
290+ { text: '15', value: 15 },
291+ { text: '30', value: 30 },
292+ { text: '45', value: 45 }
293+ ];
294+
295+ minuteItems.forEach((item) => {
296+ const option = document.createElement('ion-picker-column-option');
297+ option.value = item.value;
298+ option.textContent = item.text;
299+
300+ minutesColumn.appendChild(option);
252301 });
253302 </script>
254303 ` ,
255304 config
256305 ) ;
257306
258- const column = page . locator ( 'ion-picker-column' ) ;
259- const ionChange = await page . spyOnEvent ( 'ionChange' ) ;
260- await column . evaluate ( ( el : HTMLIonPickerColumnElement ) => el . setFocus ( ) ) ;
307+ const hoursColumn = page . locator ( 'ion-picker-column#hours' ) ;
308+ const minutesColumn = page . locator ( 'ion-picker-column#minutes' ) ;
309+ const hoursIonChange = await ( hoursColumn as E2ELocator ) . spyOnEvent ( 'ionChange' ) ;
310+ const minutesIonChange = await ( minutesColumn as E2ELocator ) . spyOnEvent ( 'ionChange' ) ;
311+ const highlight = page . locator ( 'ion-picker .picker-highlight' ) ;
261312
262- // Simulate typing '2'
313+ const box = await highlight . boundingBox ( ) ;
314+ if ( box !== null ) {
315+ await page . mouse . click ( box . x + box . width / 2 , box . y + box . height / 2 ) ;
316+ }
317+
318+ // Simulate typing '245' (2 hours, 45 minutes)
263319 await page . keyboard . press ( 'Digit2' ) ;
320+ await page . keyboard . press ( 'Digit4' ) ;
321+ await page . keyboard . press ( 'Digit5' ) ;
264322
265- // Ensure the value is immediately set to 2
266- await expect ( ionChange ) . toHaveReceivedEventDetail ( { value : 2 } ) ;
267- await expect ( column ) . toHaveJSProperty ( 'value' , 2 ) ;
323+ // Ensure the hours column is set to 2
324+ await expect ( hoursIonChange ) . toHaveReceivedEventDetail ( { value : 2 } ) ;
325+ await expect ( hoursColumn ) . toHaveJSProperty ( 'value' , 2 ) ;
326+
327+ // Ensure the minutes column is set to 45
328+ await expect ( minutesIonChange ) . toHaveReceivedEventDetail ( { value : 45 } ) ;
329+ await expect ( minutesColumn ) . toHaveJSProperty ( 'value' , 45 ) ;
268330 } ) ;
269331
270332 test ( 'pressing Enter should dismiss the keyboard' , async ( { page } ) => {
0 commit comments