@@ -544,4 +544,104 @@ describe('ColumnPickerControl', () => {
544
544
expect ( control . getVisibleColumns ( ) ) . toEqual ( columnsMock ) ;
545
545
} ) ;
546
546
} ) ;
547
+
548
+ describe ( 'columnSort functionality' , ( ) => {
549
+ it ( 'should sort columns alphabetically by name when "columnSort" function is provided' , ( ) => {
550
+ const handlerSpy = vi . spyOn ( control . eventHandler , 'subscribe' ) ;
551
+ vi . spyOn ( gridStub , 'getColumnIndex' )
552
+ . mockReturnValue ( undefined as any )
553
+ . mockReturnValue ( 1 ) ;
554
+
555
+ // Create columns with names that are not in alphabetical order
556
+ const unsortedColumnsMock : Column [ ] = [
557
+ { id : 'field1' , field : 'field1' , name : 'Zebra Field' , width : 100 } ,
558
+ { id : 'field2' , field : 'field2' , name : 'Alpha Field' , width : 75 } ,
559
+ { id : 'field3' , field : 'field3' , name : 'Beta Field' , width : 75 } ,
560
+ ] ;
561
+
562
+ // Mock the shared service to return our custom columns
563
+ vi . spyOn ( SharedService . prototype , 'allColumns' , 'get' ) . mockReturnValue ( unsortedColumnsMock ) ;
564
+ vi . spyOn ( SharedService . prototype , 'visibleColumns' , 'get' ) . mockReturnValue ( unsortedColumnsMock ) ;
565
+ vi . spyOn ( SharedService . prototype , 'columnDefinitions' , 'get' ) . mockReturnValue ( unsortedColumnsMock ) ;
566
+ vi . spyOn ( gridStub , 'getColumns' ) . mockReturnValue ( unsortedColumnsMock ) ;
567
+
568
+ // Define the columnSort function to sort alphabetically by name
569
+ gridOptionsMock . columnPicker ! . columnSort = ( col1 : Column , col2 : Column ) => {
570
+ const nameA = String ( col1 . name || '' ) . toLowerCase ( ) ;
571
+ const nameB = String ( col2 . name || '' ) . toLowerCase ( ) ;
572
+ return nameA . localeCompare ( nameB ) ;
573
+ } ;
574
+
575
+ control . columns = unsortedColumnsMock ;
576
+ control . init ( ) ;
577
+
578
+ gridStub . onHeaderContextMenu . notify ( { column : unsortedColumnsMock [ 1 ] , grid : gridStub } , eventData as any , gridStub ) ;
579
+
580
+ // Get the column labels from the menu in the order they appear
581
+ const liElmList = control . menuElement ! . querySelectorAll < HTMLLIElement > ( 'li' ) ;
582
+ const columnLabels : string [ ] = [ ] ;
583
+
584
+ // Extract text content from each column item (excluding force fit and sync resize buttons)
585
+ for ( let i = 0 ; i < Math . min ( liElmList . length , unsortedColumnsMock . length ) ; i ++ ) {
586
+ const labelSpan = liElmList [ i ] . querySelector ( '.checkbox-label' ) ;
587
+ if ( labelSpan && labelSpan . textContent ) {
588
+ columnLabels . push ( labelSpan . textContent . trim ( ) ) ;
589
+ }
590
+ }
591
+
592
+ expect ( handlerSpy ) . toHaveBeenCalledTimes ( 4 ) ;
593
+ expect ( control . getAllColumns ( ) ) . toEqual ( unsortedColumnsMock ) ;
594
+ expect ( control . getVisibleColumns ( ) ) . toEqual ( unsortedColumnsMock ) ;
595
+
596
+ // Verify that columns are displayed in alphabetical order: Alpha Field, Beta Field, Zebra Field
597
+ expect ( columnLabels ) . toEqual ( [ 'Alpha Field' , 'Beta Field' , 'Zebra Field' ] ) ;
598
+ } ) ;
599
+
600
+ it ( 'should maintain the original column order when no "columnSort" function is provided' , ( ) => {
601
+ const handlerSpy = vi . spyOn ( control . eventHandler , 'subscribe' ) ;
602
+ vi . spyOn ( gridStub , 'getColumnIndex' )
603
+ . mockReturnValue ( undefined as any )
604
+ . mockReturnValue ( 1 ) ;
605
+
606
+ // Create columns in a specific order
607
+ const originalColumnsMock : Column [ ] = [
608
+ { id : 'field1' , field : 'field1' , name : 'Zebra Field' , width : 100 } ,
609
+ { id : 'field2' , field : 'field2' , name : 'Alpha Field' , width : 75 } ,
610
+ { id : 'field3' , field : 'field3' , name : 'Beta Field' , width : 75 } ,
611
+ ] ;
612
+
613
+ // Mock the shared service to return our custom columns
614
+ vi . spyOn ( SharedService . prototype , 'allColumns' , 'get' ) . mockReturnValue ( originalColumnsMock ) ;
615
+ vi . spyOn ( SharedService . prototype , 'visibleColumns' , 'get' ) . mockReturnValue ( originalColumnsMock ) ;
616
+ vi . spyOn ( SharedService . prototype , 'columnDefinitions' , 'get' ) . mockReturnValue ( originalColumnsMock ) ;
617
+ vi . spyOn ( gridStub , 'getColumns' ) . mockReturnValue ( originalColumnsMock ) ;
618
+
619
+ // Don't set columnSort, so it should remain undefined
620
+ gridOptionsMock . columnPicker ! . columnSort = undefined ;
621
+
622
+ control . columns = originalColumnsMock ;
623
+ control . init ( ) ;
624
+
625
+ gridStub . onHeaderContextMenu . notify ( { column : originalColumnsMock [ 1 ] , grid : gridStub } , eventData as any , gridStub ) ;
626
+
627
+ // Get the column labels from the menu in the order they appear
628
+ const liElmList = control . menuElement ! . querySelectorAll < HTMLLIElement > ( 'li' ) ;
629
+ const columnLabels : string [ ] = [ ] ;
630
+
631
+ // Extract text content from each column item (excluding force fit and sync resize buttons)
632
+ for ( let i = 0 ; i < Math . min ( liElmList . length , originalColumnsMock . length ) ; i ++ ) {
633
+ const labelSpan = liElmList [ i ] . querySelector ( '.checkbox-label' ) ;
634
+ if ( labelSpan && labelSpan . textContent ) {
635
+ columnLabels . push ( labelSpan . textContent . trim ( ) ) ;
636
+ }
637
+ }
638
+
639
+ expect ( handlerSpy ) . toHaveBeenCalledTimes ( 4 ) ;
640
+ expect ( control . getAllColumns ( ) ) . toEqual ( originalColumnsMock ) ;
641
+ expect ( control . getVisibleColumns ( ) ) . toEqual ( originalColumnsMock ) ;
642
+
643
+ // Verify that columns maintain their original order: Zebra Field, Alpha Field, Beta Field
644
+ expect ( columnLabels ) . toEqual ( [ 'Zebra Field' , 'Alpha Field' , 'Beta Field' ] ) ;
645
+ } ) ;
646
+ } ) ;
547
647
} ) ;
0 commit comments