import {Component, Element, Event, EventEmitter, h, Listen, Prop, State} from '@stencil/core'; import {DonateLink} from '../../site-header/site-header'; import {ColorVariant, MenuType, SiteLogoSize} from '../../../utils/utils'; @Component({ tag: 'hy-menu', styleUrl: 'menu.scss', shadow: true, }) export class Menu { @Element() el: HTMLElement; @Event() menuContainerToggled: EventEmitter; @Prop() dataMenuDonate: string; @Prop() dataMenuLanguage: string; @Prop() isGroup: boolean = false; @Prop() isDemo: boolean = false; @Prop() labelFrontPage: string; @Prop() logoUrl: string; @Prop() logoLabel: string; @Prop() menuIsOpen = true; @Prop() menuType: MenuType = MenuType.desktop; @Prop() menuButtonSubmenuExpand: string; @Prop() menuButtonBreadcrumbReturn: string; @Prop() menuButtonBreadcrumbHome: string; @Prop() menuButtonBreadcrumbMain: string; @Prop() menuButtonBreadcrumbLogourl: string; @State() breadcrumbs: any; private donateLink: DonateLink[]; // Listener for removing a breadcrumb from mobile menu breadcrumbs. @Listen('removeBreadcrumb') removeBreadcrumb(data) { let breadcrumbs = JSON.parse(JSON.stringify(this.breadcrumbs)); let currentBreadcrumb = breadcrumbs .map(function (e) { return e.bid; }) .indexOf(data.detail.bid); breadcrumbs.length = currentBreadcrumb; for (let i = currentBreadcrumb, l = this.breadcrumbs.length; i < l; i++) { this.menuContainerToggled.emit({ triggerItem: this.breadcrumbs[i].bid, triggerType: 'remove', }); } this.breadcrumbs = []; this.breadcrumbs = breadcrumbs; // Reset if home breadcrumb link has been clicked. if (currentBreadcrumb === 0) { this.breadcrumbs = []; // Notify menu-level-container toggle listener about closing all levels. let elements = this.el.querySelectorAll('.hy-menu-level-container--mobile'); elements.forEach((element) => { if (!element.classList.contains('hy-menu-level-container--level-1')) { this.menuContainerToggled.emit({ triggerItem: element.getAttribute('trigger-item'), triggerType: 'remove', }); } }); } } // Listener for adding a breadcrumb to mobile menu breadcrumbs. @Listen('addBreadcrumb') addBreadcrumb(event) { this.breadcrumbs = [ ...this.breadcrumbs, { label: event.detail.label, bid: event.detail.bid, url: event.detail.url, }, ]; } componentWillLoad() { this.breadcrumbs = []; } componentWillUpdate() { // Pass the menu type and menu-button-submenu-expand attributes to // the child menu-level-container component. this.el.children[0].setAttribute('menu-type', this.menuType); this.el.children[0].setAttribute('menu-button-submenu-expand', this.menuButtonSubmenuExpand); } componentWillRender() { // Set the donate link data. if (this.dataMenuDonate) { this.donateLink = JSON.parse(this.dataMenuDonate); } // Set demo value to all children to provide better UI for DS users. if (this.isDemo) { const items = Array.from(this.el.children); items.forEach((item) => { item.setAttribute('is-demo', 'true'); }); } } render() { switch (this.menuType) { case MenuType.desktop: return ( <div class={'hy-wrapper'}> <nav role={'navigation'} class={{ 'hy-menu-wrapper--desktop': true, 'is-open': this.menuIsOpen, }} > <div class={'hy-menu hy-menu--desktop'}> <slot /> </div> </nav> </div> ); case MenuType.mobile: return ( <nav role={'navigation'} class={{ 'hy-menu-wrapper--mobile': true, 'is-open': this.menuIsOpen, }} > <div class={'hy-menu__logo-container'} id={'menu-logo'}> <hy-site-logo size={SiteLogoSize.small} color={ColorVariant.black} url={this.logoUrl} label={this.logoLabel} /> </div> <div class="hy-menu-container--mobile"> <div id={'menu-bc-container'} class={{ 'hy-menu__breadcrumbs': true, 'is-empty': this.breadcrumbs.length === 0, }} > <hy-menu-language is-mobile={true} data-menu-language={this.dataMenuLanguage} /> {this.breadcrumbs.length ? ( [ this.breadcrumbs.map((breadcrumb) => { return ( <hy-menu-mobile-breadcrumb label-back={this.menuButtonBreadcrumbReturn} label-front-page={this.labelFrontPage} label={breadcrumb.label} bid={breadcrumb.bid} /> ); }), ] ) : ( <hy-menu-mobile-breadcrumb label-back={this.menuButtonBreadcrumbReturn} label-front-page={this.menuButtonBreadcrumbHome} label={this.menuButtonBreadcrumbHome} is-first={true} logo-url={this.logoUrl} /> )} </div> <div aria-hidden={this.menuIsOpen ? 'false' : 'true'} class={{ 'hy-menu': true, 'hy-menu--mobile': true, 'is-open': this.menuIsOpen, 'is-demo': this.isDemo, }} > <slot /> </div> </div> {!this.isGroup && ( <div class={'hy-link__donate'}> {this.donateLink ? this.donateLink.map((i) => ( <a href={i.url}> <hy-icon icon={'hy-icon-heart-support'} fill={'currentColor'} size={16} /> {i.label} </a> )) : ''} </div> )} </nav> ); } } }