@@ -725,6 +725,36 @@ describe(`${Combobox.metadata.tag}: multi select`, () => {
725725 expect ( select . selectedOptions . length ) . toBe ( 1 ) ;
726726 } ) ;
727727
728+ it ( 'should not open dropdown when tags are pressed without wrap layout' , async ( ) => {
729+ const dropdown = element . shadowRoot . querySelector < Dropdown > ( Dropdown . metadata . tag ) ;
730+ const tags = element . shadowRoot . querySelector < HTMLElement > ( '.tags' ) ;
731+
732+ expect ( dropdown . matches ( ':popover-open' ) ) . toBe ( false ) ;
733+ tags . dispatchEvent ( new Event ( 'pointerup' , { bubbles : true } ) ) ;
734+
735+ await new Promise ( resolve => setTimeout ( resolve , 0 ) ) ;
736+ await elementIsStable ( element ) ;
737+
738+ expect ( dropdown . matches ( ':popover-open' ) ) . toBe ( false ) ;
739+ } ) ;
740+
741+ it ( 'should focus input and open dropdown when wrap layout tags are pressed' , async ( ) => {
742+ element . tagLayout = 'wrap' ;
743+ await elementIsStable ( element ) ;
744+
745+ const dropdown = element . shadowRoot . querySelector < Dropdown > ( Dropdown . metadata . tag ) ;
746+ const tags = element . shadowRoot . querySelector < HTMLElement > ( '.tags' ) ;
747+
748+ expect ( dropdown . matches ( ':popover-open' ) ) . toBe ( false ) ;
749+ tags . dispatchEvent ( new Event ( 'pointerup' , { bubbles : true } ) ) ;
750+
751+ await new Promise ( resolve => setTimeout ( resolve , 0 ) ) ;
752+ await elementIsStable ( element ) ;
753+
754+ expect ( document . activeElement ) . toBe ( input ) ;
755+ expect ( dropdown . matches ( ':popover-open' ) ) . toBe ( true ) ;
756+ } ) ;
757+
728758 it ( 'should hide tags and display label when multiple is used and tags overflow container' , async ( ) => {
729759 expect ( element . matches ( ':state(multiple-overflow)' ) ) . toBe ( false ) ;
730760 element . style . setProperty ( '--width' , '100px' ) ;
@@ -740,13 +770,40 @@ describe(`${Combobox.metadata.tag}: multi select`, () => {
740770 expect ( element . matches ( ':state(multiple-overflow)' ) ) . toBe ( true ) ;
741771 } ) ;
742772
743- it ( 'should not render inline tags when notags is used' , async ( ) => {
773+ it ( 'should keep tags visible when wrap layout is used with overflow state' , async ( ) => {
774+ element . tagLayout = 'wrap' ;
775+ element . _internals . states . add ( 'multiple-overflow' ) ;
776+ await elementIsStable ( element ) ;
777+
778+ const tags = element . shadowRoot . querySelector < HTMLElement > ( '.tags' ) ;
779+ const tagsLabel = element . shadowRoot . querySelector < HTMLElement > ( '.tags-label' ) ;
780+
781+ expect ( element . matches ( ':state(multiple-overflow)' ) ) . toBe ( true ) ;
782+ expect ( getComputedStyle ( tags ) . opacity ) . toBe ( '1' ) ;
783+ expect ( getComputedStyle ( tags ) . position ) . toBe ( 'static' ) ;
784+ expect ( getComputedStyle ( tags ) . flexWrap ) . toBe ( 'wrap' ) ;
785+ expect ( getComputedStyle ( tagsLabel ) . display ) . toBe ( 'none' ) ;
786+ } ) ;
787+
788+ it ( 'should not render inline tags when hidden tag layout is used' , async ( ) => {
789+ element . tagLayout = 'hidden' ;
790+ select . multiple = true ;
791+ select . options [ 0 ] . selected = true ;
792+ select . options [ 1 ] . selected = true ;
793+ select . options [ 2 ] . selected = true ;
794+ await elementIsStable ( element ) ;
795+ expect ( element . shadowRoot . querySelectorAll ( Tag . metadata . tag ) . length ) . toBe ( 0 ) ;
796+ } ) ;
797+
798+ it ( 'should support deprecated notags alias' , async ( ) => {
744799 element . notags = true ;
745800 select . multiple = true ;
746801 select . options [ 0 ] . selected = true ;
747802 select . options [ 1 ] . selected = true ;
748803 select . options [ 2 ] . selected = true ;
804+
749805 await elementIsStable ( element ) ;
806+
750807 expect ( element . shadowRoot . querySelectorAll ( Tag . metadata . tag ) . length ) . toBe ( 0 ) ;
751808 } ) ;
752809
@@ -1379,6 +1436,66 @@ describe(`${Combobox.metadata.tag}: notags property reflection`, () => {
13791436 } ) ;
13801437} ) ;
13811438
1439+ describe ( `${ Combobox . metadata . tag } : tag-layout property reflection` , ( ) => {
1440+ let fixture : HTMLElement ;
1441+ let element : Combobox ;
1442+
1443+ beforeEach ( async ( ) => {
1444+ fixture = await createFixture ( html `
1445+ < nve-combobox >
1446+ < label > combobox</ label >
1447+ < input type ="search " />
1448+ < select multiple >
1449+ < option value ="1 "> Option 1</ option >
1450+ </ select >
1451+ </ nve-combobox >
1452+ ` ) ;
1453+ element = fixture . querySelector ( Combobox . metadata . tag ) ;
1454+ await elementIsStable ( element ) ;
1455+ } ) ;
1456+
1457+ afterEach ( ( ) => {
1458+ removeFixture ( fixture ) ;
1459+ } ) ;
1460+
1461+ it ( 'should have undefined tagLayout by default' , async ( ) => {
1462+ expect ( element . tagLayout ) . toBe ( undefined ) ;
1463+ expect ( element . hasAttribute ( 'tag-layout' ) ) . toBe ( false ) ;
1464+ } ) ;
1465+
1466+ it ( 'should reflect tag-layout attribute when set via attribute' , async ( ) => {
1467+ element . setAttribute ( 'tag-layout' , 'wrap' ) ;
1468+ await elementIsStable ( element ) ;
1469+
1470+ expect ( element . tagLayout ) . toBe ( 'wrap' ) ;
1471+ expect ( element . getAttribute ( 'tag-layout' ) ) . toBe ( 'wrap' ) ;
1472+ } ) ;
1473+
1474+ it ( 'should reflect hidden tag-layout attribute when set via attribute' , async ( ) => {
1475+ element . setAttribute ( 'tag-layout' , 'hidden' ) ;
1476+ await elementIsStable ( element ) ;
1477+
1478+ expect ( element . tagLayout ) . toBe ( 'hidden' ) ;
1479+ expect ( element . getAttribute ( 'tag-layout' ) ) . toBe ( 'hidden' ) ;
1480+ } ) ;
1481+
1482+ it ( 'should reflect tag-layout attribute when set via property' , async ( ) => {
1483+ element . tagLayout = 'wrap' ;
1484+ await elementIsStable ( element ) ;
1485+
1486+ expect ( element . tagLayout ) . toBe ( 'wrap' ) ;
1487+ expect ( element . getAttribute ( 'tag-layout' ) ) . toBe ( 'wrap' ) ;
1488+ } ) ;
1489+
1490+ it ( 'should reflect hidden tag-layout attribute when set via property' , async ( ) => {
1491+ element . tagLayout = 'hidden' ;
1492+ await elementIsStable ( element ) ;
1493+
1494+ expect ( element . tagLayout ) . toBe ( 'hidden' ) ;
1495+ expect ( element . getAttribute ( 'tag-layout' ) ) . toBe ( 'hidden' ) ;
1496+ } ) ;
1497+ } ) ;
1498+
13821499describe ( `${ Combobox . metadata . tag } : disabled input` , ( ) => {
13831500 let fixture : HTMLElement ;
13841501 let element : Combobox ;
0 commit comments