11import { LitElement , html , css , nothing } from 'lit' ;
2+ import { Event } from '../core/Event' ;
23
34/**
45 * @class NavGroupElement
@@ -7,12 +8,13 @@ import { LitElement, html, css, nothing } from 'lit';
78 *
89 * @property {Boolean } vertical - Fill the canvas vertically rather than horizontally, default false
910 * @property {Boolean } flex - Take up all available space, default false
11+ * @event CLICK - Dispatched when a navigation item is clicked, which is not disabled
1012 *
1113 * @example
12- * <wc-nav-group name="group" vertical>
13- * <wc-nav>....</wc-nav>
14+ * <wc-nav-group vertical>
15+ * <wc-nav-item >....</wc-nav-item >
1416 * <wc-nav-spacer></wc-nav-spacer>
15- * <wc-nav>....</wc-nav>
17+ * <wc-nav-item >....</wc-nav-item >
1618 * </wc-nav-group>
1719 */
1820export class NavGroupElement extends LitElement {
@@ -60,32 +62,63 @@ export class NavGroupElement extends LitElement {
6062 ::slotted(wc-nav-spacer) {
6163 flex: 999;
6264 }
63- ::slotted(wc-nav-item:hover) {
65+ ::slotted(wc-nav-item:not([disabled]): hover) {
6466 font-weight: var(--nav-item-hover-font-weight);
6567 }
6668 ::slotted(wc-nav-item[selected]) {
6769 color: var(--nav-item-selected-color);
6870 background-color: var(--nav-item-selected-background-color,red);
6971 }
72+ ::slotted(wc-nav-item[disabled]) {
73+ color: var(--nav-item-disabled-color);
74+ cursor: default;
75+ }
7076 ` ;
7177 }
7278
7379 render ( ) {
7480 return html `
75- < ul class =${ this . className || nothing } >
81+ < ul class =${ this . classes . join ( ' ' ) || nothing } @click = ${ this . onClick } >
7682 < slot > </ slot >
7783 </ ul >
7884 ` ;
7985 }
8086
81- get className ( ) {
87+ get classes ( ) {
8288 const classes = [ ] ;
8389 if ( this . vertical ) {
8490 classes . push ( 'vertical' ) ;
8591 }
8692 if ( this . flex ) {
8793 classes . push ( 'flex' ) ;
8894 }
89- return classes . join ( ' ' ) ;
95+ return classes ;
96+ }
97+
98+ /**
99+ * Select the named item from the list of wv-nav-item elements
100+ *
101+ * @param {String } name - Name of the item to select
102+ */
103+ select ( name ) {
104+ this . querySelectorAll ( 'wc-nav-item' ) . forEach ( ( item ) => {
105+ if ( item . name === name ) {
106+ item . setAttribute ( 'selected' , true ) ;
107+ } else {
108+ item . removeAttribute ( 'selected' ) ;
109+ }
110+ } ) ;
111+ }
112+
113+ // eslint-disable-next-line class-methods-use-this
114+ onClick ( event ) {
115+ const target = event . target . closest ( 'wc-nav-item' ) ;
116+ if ( target && ! target . disabled ) {
117+ this . dispatchEvent ( new CustomEvent ( Event . CLICK , {
118+ bubbles : true ,
119+ composed : true ,
120+ detail : target . name || target . textContent . trim ( ) ,
121+ } ) ) ;
122+ }
90123 }
91124}
0 commit comments