@@ -17,10 +17,35 @@ import {
17
17
fireEvent ,
18
18
// @ts -expect-error need to migrate helpers to TypeScript
19
19
screen ,
20
+ // @ts -expect-error need to migrate helpers to TypeScript
21
+ waitFor ,
20
22
} from 'test/utils' ;
21
23
22
24
const isJSDOM = / j s d o m / . test ( window . navigator . userAgent ) ;
23
25
26
+ /**
27
+ * Creates a date that is compatible with years before 1901
28
+ * `new Date(0001)` creates a date for 1901, not 0001
29
+ */
30
+ const generateDate = (
31
+ year : number ,
32
+ month : number ,
33
+ date ?: number ,
34
+ hours ?: number ,
35
+ minutes ?: number ,
36
+ ) => {
37
+ const rawDate = new Date ( ) ;
38
+ rawDate . setFullYear ( year ) ;
39
+ rawDate . setMonth ( month ) ;
40
+ rawDate . setDate ( date ?? 0 ) ;
41
+ rawDate . setHours ( hours ?? 0 ) ;
42
+ rawDate . setMinutes ( minutes ?? 0 ) ;
43
+ rawDate . setSeconds ( 0 ) ;
44
+ rawDate . setMilliseconds ( 0 ) ;
45
+
46
+ return rawDate . getTime ( ) ;
47
+ } ;
48
+
24
49
describe ( '<DataGridPro /> - Edit Rows' , ( ) => {
25
50
let clock ;
26
51
let baselineProps ;
@@ -811,6 +836,68 @@ describe('<DataGridPro /> - Edit Rows', () => {
811
836
// @ts -expect-error need to migrate helpers to TypeScript
812
837
expect ( screen . getByRole ( 'cell' ) . querySelector ( 'input' ) ) . toHaveFocus ( ) ;
813
838
} ) ;
839
+
840
+ it ( 'should allow external value updates as date' , async ( ) => {
841
+ const onEditCellPropsChange = spy ( ) ;
842
+ render (
843
+ < TestCase
844
+ rows = { [ { id : 0 , date : new Date ( 2021 , 6 , 5 ) } ] }
845
+ columns = { [ { field : 'date' , type : 'date' , editable : true } ] }
846
+ onEditCellPropsChange = { onEditCellPropsChange }
847
+ /> ,
848
+ ) ;
849
+ const cell = getCell ( 0 , 0 ) ;
850
+ cell . focus ( ) ;
851
+ fireEvent . doubleClick ( cell ) ;
852
+ const newValue = new Date ( 2021 , 6 , 4 ) ;
853
+ apiRef . current . setEditCellValue ( { id : 0 , field : 'date' , value : newValue } ) ;
854
+ const input = cell . querySelector ( 'input' ) ! ;
855
+ await waitFor ( ( ) => {
856
+ expect ( input . value ) . to . equal ( '2021-07-04' ) ;
857
+ } ) ;
858
+ } ) ;
859
+
860
+ it ( 'should handle all the intermediate dates while editing the value' , ( ) => {
861
+ const onEditCellPropsChange = spy ( ) ;
862
+ render (
863
+ < TestCase
864
+ rows = { [ { id : 0 , date : new Date ( 2021 , 6 , 5 ) } ] }
865
+ columns = { [ { field : 'date' , type : 'date' , editable : true } ] }
866
+ onEditCellPropsChange = { onEditCellPropsChange }
867
+ /> ,
868
+ ) ;
869
+
870
+ const cell = getCell ( 0 , 0 ) ;
871
+ cell . focus ( ) ;
872
+ fireEvent . doubleClick ( cell ) ;
873
+ const input = cell . querySelector ( 'input' ) ! ;
874
+ fireEvent . change ( input , { target : { value : '' } } ) ;
875
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value ) . to . equal ( null ) ;
876
+ fireEvent . change ( input , { target : { value : '2021-01-05' } } ) ;
877
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
878
+ generateDate ( 2021 , 0 , 5 ) ,
879
+ ) ;
880
+ fireEvent . change ( input , { target : { value : '2021-01-01' } } ) ;
881
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
882
+ generateDate ( 2021 , 0 , 1 ) ,
883
+ ) ;
884
+ fireEvent . change ( input , { target : { value : '0001-01-01' } } ) ;
885
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
886
+ generateDate ( 1 , 0 , 1 ) ,
887
+ ) ;
888
+ fireEvent . change ( input , { target : { value : '0019-01-01' } } ) ;
889
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
890
+ generateDate ( 19 , 0 , 1 ) ,
891
+ ) ;
892
+ fireEvent . change ( input , { target : { value : '0199-01-01' } } ) ;
893
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
894
+ generateDate ( 199 , 0 , 1 ) ,
895
+ ) ;
896
+ fireEvent . change ( input , { target : { value : '1999-01-01' } } ) ;
897
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
898
+ generateDate ( 1999 , 0 , 1 ) ,
899
+ ) ;
900
+ } ) ;
814
901
} ) ;
815
902
816
903
describe ( 'column type: dateTime' , ( ) => {
@@ -862,6 +949,80 @@ describe('<DataGridPro /> - Edit Rows', () => {
862
949
// @ts -expect-error need to migrate helpers to TypeScript
863
950
expect ( screen . getByRole ( 'cell' ) . querySelector ( 'input' ) ) . toHaveFocus ( ) ;
864
951
} ) ;
952
+
953
+ it ( 'should allow external value updates as date' , async ( ) => {
954
+ const onEditCellPropsChange = spy ( ) ;
955
+ render (
956
+ < TestCase
957
+ rows = { [ { id : 0 , date : new Date ( 2021 , 6 , 5 , 14 , 30 ) } ] }
958
+ columns = { [ { field : 'date' , type : 'dateTime' , editable : true } ] }
959
+ onEditCellPropsChange = { onEditCellPropsChange }
960
+ /> ,
961
+ ) ;
962
+ const cell = getCell ( 0 , 0 ) ;
963
+ cell . focus ( ) ;
964
+ fireEvent . doubleClick ( cell ) ;
965
+ const newValue = new Date ( 2021 , 6 , 4 , 17 , 30 ) ;
966
+ apiRef . current . setEditCellValue ( { id : 0 , field : 'date' , value : newValue } ) ;
967
+ const input = cell . querySelector ( 'input' ) ! ;
968
+ await waitFor ( ( ) => {
969
+ expect ( input . value ) . to . equal ( '2021-07-04T17:30' ) ;
970
+ } ) ;
971
+ } ) ;
972
+
973
+ it ( 'should handle all the intermediate dates while editing the value' , ( ) => {
974
+ const onEditCellPropsChange = spy ( ) ;
975
+ render (
976
+ < TestCase
977
+ rows = { [ { id : 0 , date : new Date ( 2021 , 6 , 5 , 14 , 30 ) } ] }
978
+ columns = { [ { field : 'date' , type : 'dateTime' , editable : true } ] }
979
+ onEditCellPropsChange = { onEditCellPropsChange }
980
+ /> ,
981
+ ) ;
982
+
983
+ const cell = getCell ( 0 , 0 ) ;
984
+ cell . focus ( ) ;
985
+ fireEvent . doubleClick ( cell ) ;
986
+ const input = cell . querySelector ( 'input' ) ! ;
987
+ fireEvent . change ( input , { target : { value : '' } } ) ;
988
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value ) . to . equal ( null ) ;
989
+ fireEvent . change ( input , { target : { value : '2021-01-05T14:30' } } ) ;
990
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
991
+ generateDate ( 2021 , 0 , 5 , 14 , 30 ) ,
992
+ ) ;
993
+ fireEvent . change ( input , { target : { value : '2021-01-01T14:30' } } ) ;
994
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
995
+ generateDate ( 2021 , 0 , 1 , 14 , 30 ) ,
996
+ ) ;
997
+ fireEvent . change ( input , { target : { value : '0001-01-01T14:30' } } ) ;
998
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
999
+ generateDate ( 1 , 0 , 1 , 14 , 30 ) ,
1000
+ ) ;
1001
+ fireEvent . change ( input , { target : { value : '0019-01-01T14:30' } } ) ;
1002
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
1003
+ generateDate ( 19 , 0 , 1 , 14 , 30 ) ,
1004
+ ) ;
1005
+ fireEvent . change ( input , { target : { value : '0199-01-01T14:30' } } ) ;
1006
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
1007
+ generateDate ( 199 , 0 , 1 , 14 , 30 ) ,
1008
+ ) ;
1009
+ fireEvent . change ( input , { target : { value : '1999-01-01T14:30' } } ) ;
1010
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
1011
+ generateDate ( 1999 , 0 , 1 , 14 , 30 ) ,
1012
+ ) ;
1013
+ fireEvent . change ( input , { target : { value : '1999-01-01T20:30' } } ) ;
1014
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
1015
+ generateDate ( 1999 , 0 , 1 , 20 , 30 ) ,
1016
+ ) ;
1017
+ fireEvent . change ( input , { target : { value : '1999-01-01T20:02' } } ) ;
1018
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
1019
+ generateDate ( 1999 , 0 , 1 , 20 , 2 ) ,
1020
+ ) ;
1021
+ fireEvent . change ( input , { target : { value : '1999-01-01T20:25' } } ) ;
1022
+ expect ( onEditCellPropsChange . lastCall . args [ 0 ] . props . value . getTime ( ) ) . to . equal (
1023
+ generateDate ( 1999 , 0 , 1 , 20 , 25 ) ,
1024
+ ) ;
1025
+ } ) ;
865
1026
} ) ;
866
1027
867
1028
it ( 'should call onCellEditCommit with the correct params' , ( ) => {
0 commit comments