@@ -165,7 +165,7 @@ describe("<Spreadsheet />", () => {
165165 activeCell ?. getBoundingClientRect ( )
166166 ) ;
167167 // Check selected is not hidden
168- expect ( selected ) . toHaveClass ( "Spreadsheet__floating-rect--hidden" ) ;
168+ expect ( selected ) . not . toHaveClass ( "Spreadsheet__floating-rect--hidden" ) ;
169169 // Check onActivate is called
170170 expect ( onActivate ) . toHaveBeenCalledTimes ( 1 ) ;
171171 expect ( onActivate ) . toHaveBeenCalledWith ( Point . ORIGIN ) ;
@@ -476,6 +476,123 @@ describe("<Spreadsheet />", () => {
476476 ) ;
477477 expect ( selected ) . not . toHaveClass ( "Spreadsheet__floating-rect--hidden" ) ;
478478 } ) ;
479+ test ( "auto fill handle is not rendered when no cell is selected" , ( ) => {
480+ render ( < Spreadsheet { ...EXAMPLE_PROPS } /> ) ;
481+ const element = getSpreadsheetElement ( ) ;
482+ const autoFillHandle = element . querySelector (
483+ ".Spreadsheet__auto-fill-handle"
484+ ) ;
485+ expect ( autoFillHandle ) . toBeNull ( ) ;
486+ } ) ;
487+ test ( "auto fill handle is rendered when a cell is selected" , ( ) => {
488+ render ( < Spreadsheet { ...EXAMPLE_PROPS } /> ) ;
489+ const element = getSpreadsheetElement ( ) ;
490+ const cell = safeQuerySelector ( element , "td" ) ;
491+ // Select a cell
492+ fireEvent . mouseDown ( cell ) ;
493+ // Check auto fill handle is rendered
494+ const autoFillHandle = safeQuerySelector (
495+ element ,
496+ ".Spreadsheet__auto-fill-handle"
497+ ) ;
498+ expect ( autoFillHandle ) . toBeInTheDocument ( ) ;
499+ } ) ;
500+ test ( "auto fill handle is rendered when a range is selected" , ( ) => {
501+ render ( < Spreadsheet { ...EXAMPLE_PROPS } /> ) ;
502+ const element = getSpreadsheetElement ( ) ;
503+ const firstCell = safeQuerySelector (
504+ element ,
505+ "tr:nth-of-type(2) td:nth-of-type(1)"
506+ ) ;
507+ const thirdCell = safeQuerySelector (
508+ element ,
509+ "tr:nth-of-type(3) td:nth-of-type(2)"
510+ ) ;
511+ // Select first cell
512+ fireEvent . mouseDown ( firstCell ) ;
513+ // Extend selection to create a range
514+ fireEvent . mouseDown ( thirdCell , { shiftKey : true } ) ;
515+ // Check auto fill handle is rendered
516+ const autoFillHandle = safeQuerySelector (
517+ element ,
518+ ".Spreadsheet__auto-fill-handle"
519+ ) ;
520+ expect ( autoFillHandle ) . toBeInTheDocument ( ) ;
521+ } ) ;
522+ test ( "mousedown on auto fill handle initiates auto fill mode" , ( ) => {
523+ render ( < Spreadsheet { ...EXAMPLE_PROPS } /> ) ;
524+ const element = getSpreadsheetElement ( ) ;
525+ const cell = safeQuerySelector ( element , "td" ) ;
526+ // Select a cell
527+ fireEvent . mouseDown ( cell ) ;
528+ // Get auto fill handle
529+ const autoFillHandle = safeQuerySelector (
530+ element ,
531+ ".Spreadsheet__auto-fill-handle"
532+ ) ;
533+ // Get selected floating rect
534+ const selected = safeQuerySelector (
535+ element ,
536+ ".Spreadsheet__floating-rect--selected"
537+ ) ;
538+ // Check auto filling class is not present initially
539+ expect ( selected ) . not . toHaveClass (
540+ "Spreadsheet__floating-rect--auto-filling"
541+ ) ;
542+ // Trigger auto fill
543+ fireEvent . mouseDown ( autoFillHandle ) ;
544+ // Check auto filling class is present
545+ expect ( selected ) . toHaveClass ( "Spreadsheet__floating-rect--auto-filling" ) ;
546+ } ) ;
547+ test ( "auto fill continues numeric sequence 1, 2, 3" , ( ) => {
548+ const onChange = jest . fn ( ) ;
549+ const data = createEmptyMatrix < CellType > ( ROWS , COLUMNS ) ;
550+ // Set up a numeric sequence: 1, 2
551+ const dataWithSequence = Matrix . set (
552+ { row : 0 , column : 0 } ,
553+ { value : "1" } ,
554+ Matrix . set ( { row : 1 , column : 0 } , { value : "2" } , data )
555+ ) ;
556+ render ( < Spreadsheet data = { dataWithSequence } onChange = { onChange } /> ) ;
557+ const element = getSpreadsheetElement ( ) ;
558+ // Select first cell (1)
559+ const firstCell = safeQuerySelector (
560+ element ,
561+ "tr:nth-of-type(2) td:nth-of-type(1)"
562+ ) ;
563+ fireEvent . mouseDown ( firstCell ) ;
564+ // Extend selection to second cell (2) to establish pattern
565+ const secondCell = safeQuerySelector (
566+ element ,
567+ "tr:nth-of-type(3) td:nth-of-type(1)"
568+ ) ;
569+ fireEvent . mouseDown ( secondCell , { shiftKey : true } ) ;
570+ // Get auto fill handle
571+ const autoFillHandle = safeQuerySelector (
572+ element ,
573+ ".Spreadsheet__auto-fill-handle"
574+ ) ;
575+ // Start auto fill
576+ fireEvent . mouseDown ( autoFillHandle ) ;
577+ // Extend selection to include two more cells (simulating dragging down)
578+ const fourthCell = safeQuerySelector (
579+ element ,
580+ "tr:nth-of-type(5) td:nth-of-type(1)"
581+ ) ;
582+ fireEvent . mouseDown ( fourthCell , { shiftKey : true } ) ;
583+ // End auto fill (trigger mouseup on window)
584+ fireEvent . mouseUp ( window ) ;
585+ // Check onChange was called with auto-filled data
586+ expect ( onChange ) . toHaveBeenCalled ( ) ;
587+ const resultData = onChange . mock . calls [
588+ onChange . mock . calls . length - 1
589+ ] [ 0 ] as Matrix . Matrix < CellType > ;
590+ // Verify the sequence: 1, 2, 3, 4
591+ expect ( Matrix . get ( { row : 0 , column : 0 } , resultData ) ?. value ) . toBe ( "1" ) ;
592+ expect ( Matrix . get ( { row : 1 , column : 0 } , resultData ) ?. value ) . toBe ( "2" ) ;
593+ expect ( Matrix . get ( { row : 2 , column : 0 } , resultData ) ?. value ) . toBe ( 3 ) ;
594+ expect ( Matrix . get ( { row : 3 , column : 0 } , resultData ) ?. value ) . toBe ( 4 ) ;
595+ } ) ;
479596} ) ;
480597
481598describe ( "Spreadsheet Ref Methods" , ( ) => {
0 commit comments