@@ -57,6 +57,64 @@ describe("calcite-input-date-picker", () => {
57
57
58
58
it . skip ( "supports t9n" , ( ) => t9n ( "calcite-input-date-picker" ) ) ;
59
59
60
+ async function navigateMonth ( page : E2EPage , direction : "previous" | "next" ) : Promise < void > {
61
+ const linkIndex = direction === "previous" ? 0 : 1 ;
62
+
63
+ await page . evaluate (
64
+ async ( MONTH_HEADER_CSS , linkIndex : number ) : Promise < void > =>
65
+ document
66
+ . querySelector ( "calcite-input-date-picker" )
67
+ . shadowRoot . querySelector ( "calcite-date-picker" )
68
+ . shadowRoot . querySelector ( "calcite-date-picker-month-header" )
69
+ . shadowRoot . querySelectorAll < HTMLAnchorElement > ( `.${ MONTH_HEADER_CSS . chevron } ` )
70
+ [ linkIndex ] . click ( ) ,
71
+ MONTH_HEADER_CSS ,
72
+ linkIndex
73
+ ) ;
74
+ await page . waitForChanges ( ) ;
75
+ }
76
+
77
+ async function selectDayInMonth ( page : E2EPage , day : number ) : Promise < void > {
78
+ const dayIndex = day - 1 ;
79
+
80
+ await page . evaluate (
81
+ async ( dayIndex : number ) =>
82
+ document
83
+ . querySelector < HTMLCalciteInputDatePickerElement > ( "calcite-input-date-picker" )
84
+ . shadowRoot . querySelector < HTMLCalciteDatePickerElement > ( "calcite-date-picker" )
85
+ . shadowRoot . querySelector < HTMLCalciteDatePickerMonthElement > ( "calcite-date-picker-month" )
86
+ . shadowRoot . querySelectorAll < HTMLCalciteDatePickerDayElement > ( "calcite-date-picker-day[current-month]" )
87
+ [ dayIndex ] . click ( ) ,
88
+ dayIndex
89
+ ) ;
90
+ await page . waitForChanges ( ) ;
91
+ }
92
+
93
+ async function getActiveMonth ( page : E2EPage ) : Promise < string > {
94
+ return page . evaluate (
95
+ async ( MONTH_HEADER_CSS ) =>
96
+ document
97
+ . querySelector ( "calcite-input-date-picker" )
98
+ . shadowRoot . querySelector ( "calcite-date-picker" )
99
+ . shadowRoot . querySelector ( "calcite-date-picker-month-header" )
100
+ . shadowRoot . querySelector ( `.${ MONTH_HEADER_CSS . month } ` ) . textContent ,
101
+ MONTH_HEADER_CSS
102
+ ) ;
103
+ }
104
+
105
+ async function getDateInputValue ( page : E2EPage , type : "start" | "end" = "start" ) : Promise < string > {
106
+ const inputIndex = type === "start" ? 0 : 1 ;
107
+
108
+ return page . evaluate (
109
+ async ( inputIndex : number ) : Promise < string > =>
110
+ document
111
+ . querySelector ( "calcite-input-date-picker" )
112
+ . shadowRoot . querySelectorAll ( "calcite-input" )
113
+ [ inputIndex ] . shadowRoot . querySelector ( "input" ) . value ,
114
+ inputIndex
115
+ ) ;
116
+ }
117
+
60
118
describe ( "event emitting when the value changes" , ( ) => {
61
119
it ( "emits change event when value is committed for single date" , async ( ) => {
62
120
const page = await newE2EPage ( ) ;
@@ -201,14 +259,7 @@ describe("calcite-input-date-picker", () => {
201
259
await page . waitForChanges ( ) ;
202
260
203
261
expect ( changeEvent ) . toHaveReceivedEventTimes ( 0 ) ;
204
-
205
- const inputValue = await page . evaluate ( ( ) => {
206
- const inputDatePicker = document . querySelector ( "calcite-input-date-picker" ) ;
207
- const calciteInput = inputDatePicker . shadowRoot . querySelector ( "calcite-input" ) ;
208
- const input = calciteInput . shadowRoot . querySelector ( "input" ) ;
209
- return input . value ;
210
- } ) ;
211
- expect ( inputValue ) . toBe ( "3/7/" ) ;
262
+ expect ( await getDateInputValue ( page ) ) . toBe ( "3/7/" ) ;
212
263
} ) ;
213
264
} ) ;
214
265
@@ -294,38 +345,30 @@ describe("calcite-input-date-picker", () => {
294
345
await page . setContent (
295
346
`<calcite-input-date-picker lang="ar" numbering-system="arab"></calcite-input-date-picker>`
296
347
) ;
297
- const getInputValue = async ( ) =>
298
- await page . evaluate (
299
- ( ) =>
300
- document
301
- . querySelector ( "calcite-input-date-picker" )
302
- . shadowRoot . querySelector ( "calcite-input" )
303
- . shadowRoot . querySelector ( "input" ) . value
304
- ) ;
305
348
306
349
await page . keyboard . press ( "Tab" ) ;
307
350
await page . keyboard . type ( "1/" ) ;
308
351
await page . waitForChanges ( ) ;
309
352
310
- expect ( await getInputValue ( ) ) . toBe ( "١/" ) ;
353
+ expect ( await getDateInputValue ( page ) ) . toBe ( "١/" ) ;
311
354
312
355
await page . keyboard . type ( "2" ) ;
313
356
await page . waitForChanges ( ) ;
314
357
315
358
// NOTE: This asserted value was copied from the received value in a test failure caused by
316
359
// typing these same values into the test file using an Arabic input source on macOS.
317
360
// Make sure to preserve this value when refactoring instead of typing these characters from scratch.
318
- expect ( await getInputValue ( ) ) . toBe ( "١/٢" ) ;
361
+ expect ( await getDateInputValue ( page ) ) . toBe ( "١/٢" ) ;
319
362
320
363
await page . keyboard . type ( "/" ) ;
321
364
await page . waitForChanges ( ) ;
322
365
323
- expect ( await getInputValue ( ) ) . toBe ( "١/٢/" ) ;
366
+ expect ( await getDateInputValue ( page ) ) . toBe ( "١/٢/" ) ;
324
367
325
368
await page . keyboard . type ( "1234" ) ;
326
369
await page . waitForChanges ( ) ;
327
370
328
- expect ( await getInputValue ( ) ) . toBe ( "١/٢/١٢٣٤" ) ;
371
+ expect ( await getDateInputValue ( page ) ) . toBe ( "١/٢/١٢٣٤" ) ;
329
372
} ) ;
330
373
331
374
it ( "syncs lang changes to internal date-picker and input" , async ( ) => {
@@ -348,36 +391,16 @@ describe("calcite-input-date-picker", () => {
348
391
) ;
349
392
const inputDatePicker = await page . find ( "calcite-input-date-picker" ) ;
350
393
351
- const getLocalizedMonth = async ( ) =>
352
- await page . evaluate (
353
- async ( MONTH_HEADER_CSS ) =>
354
- document
355
- . querySelector ( "calcite-input-date-picker" )
356
- . shadowRoot . querySelector ( "calcite-date-picker" )
357
- . shadowRoot . querySelector ( "calcite-date-picker-month-header" )
358
- . shadowRoot . querySelector ( `.${ MONTH_HEADER_CSS . month } ` ) . textContent ,
359
- MONTH_HEADER_CSS
360
- ) ;
361
-
362
- const getLocalizedInputValue = async ( ) =>
363
- await page . evaluate (
364
- async ( ) =>
365
- document
366
- . querySelector ( "calcite-input-date-picker" )
367
- . shadowRoot . querySelector ( "calcite-input" )
368
- . shadowRoot . querySelector ( "input" ) . value
369
- ) ;
370
-
371
- expect ( await getLocalizedMonth ( ) ) . toEqual ( langTranslations . months . wide [ Number ( month ) - 1 ] ) ;
372
- expect ( await getLocalizedInputValue ( ) ) . toBe (
394
+ expect ( await getActiveMonth ( page ) ) . toEqual ( langTranslations . months . wide [ Number ( month ) - 1 ] ) ;
395
+ expect ( await getDateInputValue ( page ) ) . toBe (
373
396
langTranslations . placeholder . replace ( "DD" , day ) . replace ( "MM" , month ) . replace ( "YYYY" , year )
374
397
) ;
375
398
376
399
inputDatePicker . setProperty ( "lang" , newLang ) ;
377
400
await page . waitForChanges ( ) ;
378
401
379
- expect ( await getLocalizedMonth ( ) ) . toEqual ( newLangTranslations . months . wide [ Number ( month ) - 1 ] ) ;
380
- expect ( await getLocalizedInputValue ( ) ) . toBe (
402
+ expect ( await getActiveMonth ( page ) ) . toEqual ( newLangTranslations . months . wide [ Number ( month ) - 1 ] ) ;
403
+ expect ( await getDateInputValue ( page ) ) . toBe (
381
404
newLangTranslations . placeholder . replace ( "DD" , day ) . replace ( "MM" , month ) . replace ( "YYYY" , year )
382
405
) ;
383
406
} ) ;
@@ -391,16 +414,7 @@ describe("calcite-input-date-picker", () => {
391
414
await inputDatePicker . click ( ) ;
392
415
await calciteInputDatePickerOpenEvent ;
393
416
394
- await page . evaluate ( async ( ) =>
395
- // select first day of month
396
- document
397
- . querySelector < HTMLCalciteInputDatePickerElement > ( "calcite-input-date-picker" )
398
- . shadowRoot . querySelector < HTMLCalciteDatePickerElement > ( "calcite-date-picker" )
399
- . shadowRoot . querySelector < HTMLCalciteDatePickerMonthElement > ( "calcite-date-picker-month" )
400
- . shadowRoot . querySelector < HTMLCalciteDatePickerDayElement > ( "calcite-date-picker-day[current-month]" )
401
- . click ( )
402
- ) ;
403
- await page . waitForChanges ( ) ;
417
+ await selectDayInMonth ( page , 1 ) ;
404
418
await inputDatePicker . callMethod ( "blur" ) ;
405
419
406
420
expect ( await inputDatePicker . getProperty ( "value" ) ) . toBe ( "2023-05-01" ) ;
@@ -415,14 +429,7 @@ describe("calcite-input-date-picker", () => {
415
429
await inputDatePicker . click ( ) ;
416
430
await page . waitForChanges ( ) ;
417
431
418
- await page . evaluate ( ( ) => {
419
- const inputDatePicker = document . querySelector ( "calcite-input-date-picker" ) ;
420
- const datePicker = inputDatePicker . shadowRoot . querySelector ( "calcite-date-picker" ) ;
421
- const datePickerMonth = datePicker . shadowRoot . querySelector ( "calcite-date-picker-month" ) ;
422
- const datePickerDay = datePickerMonth . shadowRoot . querySelector ( "calcite-date-picker-day" ) ;
423
-
424
- datePickerDay . click ( ) ;
425
- } ) ;
432
+ await selectDayInMonth ( page , 1 ) ;
426
433
427
434
expect ( await inputDatePicker . getProperty ( "value" ) ) . toBe ( "2023-01-01" ) ;
428
435
} ) ;
@@ -567,15 +574,7 @@ describe("calcite-input-date-picker", () => {
567
574
const expectedInputValue = "10/1/2022" ;
568
575
569
576
expect ( await inputDatePickerEl . getProperty ( "value" ) ) . toEqual ( expectedValue ) ;
570
-
571
- const inputValue = await page . evaluate ( ( ) => {
572
- const inputDatePicker = document . querySelector ( "calcite-input-date-picker" ) ;
573
- const calciteInput = inputDatePicker . shadowRoot . querySelector ( "calcite-input" ) ;
574
- const input = calciteInput . shadowRoot . querySelector ( "input" ) ;
575
- return input . value ;
576
- } ) ;
577
-
578
- expect ( inputValue ) . toEqual ( expectedInputValue ) ;
577
+ expect ( await getDateInputValue ( page ) ) . toEqual ( expectedInputValue ) ;
579
578
} ) ;
580
579
581
580
it ( "should update this.value and both input values when valueAsDate is set for range" , async ( ) => {
@@ -597,22 +596,8 @@ describe("calcite-input-date-picker", () => {
597
596
const expectedStartDateInputValue = "10/1/2022" ;
598
597
const expectedEndDateInputValue = "10/2/2022" ;
599
598
600
- const startDateInputValue = await page . evaluate ( ( ) => {
601
- const inputDatePicker = document . querySelector ( "calcite-input-date-picker" ) ;
602
- const calciteInput = inputDatePicker . shadowRoot . querySelector ( "calcite-input" ) ;
603
- const input = calciteInput . shadowRoot . querySelector ( "input" ) ;
604
- return input . value ;
605
- } ) ;
606
-
607
- const endDateInputValue = await page . evaluate ( ( ) => {
608
- const inputDatePicker = document . querySelector ( "calcite-input-date-picker" ) ;
609
- const calciteInputs = inputDatePicker . shadowRoot . querySelectorAll ( "calcite-input" ) ;
610
- const input = calciteInputs [ 1 ] . shadowRoot . querySelector ( "input" ) ;
611
- return input . value ;
612
- } ) ;
613
-
614
- expect ( startDateInputValue ) . toEqual ( expectedStartDateInputValue ) ;
615
- expect ( endDateInputValue ) . toEqual ( expectedEndDateInputValue ) ;
599
+ expect ( await getDateInputValue ( page , "start" ) ) . toEqual ( expectedStartDateInputValue ) ;
600
+ expect ( await getDateInputValue ( page , "end" ) ) . toEqual ( expectedEndDateInputValue ) ;
616
601
} ) ;
617
602
618
603
it ( "should return endDate time as 23:59:999 when valueAsDate property is parsed" , async ( ) => {
@@ -827,4 +812,41 @@ describe("calcite-input-date-picker", () => {
827
812
expect ( await inputDatePickerEl . getProperty ( "value" ) ) . toEqual ( "" ) ;
828
813
expect ( await input . getProperty ( "value" ) ) . toEqual ( "" ) ;
829
814
} ) ;
815
+
816
+ it ( "should sync its date-pickers when updated programmatically after a user modifies the range" , async ( ) => {
817
+ const page = await newE2EPage ( ) ;
818
+ await page . setContent ( html `< calcite-input-date-picker range > </ calcite-input-date-picker > ` ) ;
819
+ await skipAnimations ( page ) ;
820
+
821
+ const inputDatePicker = await page . find ( "calcite-input-date-picker" ) ;
822
+ inputDatePicker . setProperty ( "value" , [ "2023-02-01" , "2023-02-28" ] ) ;
823
+ await page . waitForChanges ( ) ;
824
+
825
+ const [ startDatePicker , endDatePicker ] = await page . findAll ( "calcite-input-date-picker >>> calcite-input" ) ;
826
+
827
+ await startDatePicker . click ( ) ;
828
+ await page . waitForChanges ( ) ;
829
+
830
+ await navigateMonth ( page , "previous" ) ;
831
+ await selectDayInMonth ( page , 1 ) ;
832
+
833
+ await endDatePicker . click ( ) ;
834
+ await page . waitForChanges ( ) ;
835
+
836
+ await navigateMonth ( page , "previous" ) ;
837
+ await selectDayInMonth ( page , 31 ) ;
838
+
839
+ inputDatePicker . setProperty ( "value" , [ "2022-10-01" , "2022-10-31" ] ) ;
840
+ await page . waitForChanges ( ) ;
841
+
842
+ await startDatePicker . click ( ) ;
843
+ await page . waitForChanges ( ) ;
844
+
845
+ expect ( await getActiveMonth ( page ) ) . toBe ( "October" ) ;
846
+
847
+ await endDatePicker . click ( ) ;
848
+ await page . waitForChanges ( ) ;
849
+
850
+ expect ( await getActiveMonth ( page ) ) . toBe ( "October" ) ;
851
+ } ) ;
830
852
} ) ;
0 commit comments