Skip to content
Snippets Groups Projects
menu.tsx 3.86 KiB
Newer Older
  • Learn to ignore specific revisions
  • import {Component, Prop, Listen, h, State, Event, EventEmitter, Element} from '@stencil/core';
    import {DonateLink} from '../../site-header/site-header';
    
    import {SiteLogoColor, SiteLogoSize} from '../../../utils/utils';
    
      tag: 'hy-menu',
      styleUrl: 'menu.scss',
    
      @Element() el: HTMLElement;
      @Prop() open = true;
      @Prop() menuType: string = 'desktop';
    
      @Prop() logoUrl: string;
      @Prop() logoLabel: string;
      @Prop() dataMenuDonate: string;
      @Prop() dataMenuLanguage: string;
    
      @State() breadcrumbs: any;
      @Event() menuContainerToggled: EventEmitter;
    
      @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 has been clicked.
        if (currentBreadcrumb === 0) {
          this.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() {
        this.el.children[0].setAttribute('menu-type', this.menuType);
      }
    
    
      componentWillRender() {
        const siteHeader = this.el.closest('hy-site-header');
    
        if (siteHeader) {
          this.donateLink = JSON.parse(siteHeader.getAttribute('data-menu-donate'));
        }
    
        // 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');
          });
        }
    
        return this.menuType === 'desktop' ? (
          <div class={'hy-wrapper'}>
            <nav
              role={'navigation'}
              class={{
                'hy-menu-wrapper': true,
                'is-open': this.open
              }}
            >
              <div class={'hy-menu hy-menu--desktop'}>
    
                <slot />
              </div>
            </nav>
    
          </div>
        ) : (
          <nav
            role={'navigation'}
            class={{
              'hy-menu-wrapper': true,
              'is-open': this.open
            }}
          >
    
            <div class={'hy-menu__logo-container'} id={'menu-logo'}>
    
                size={SiteLogoSize.small}
                color={SiteLogoColor.black}
    
                url={this.logoUrl}
                label={this.logoLabel}
              />
            </div>
    
            <div id={'menu-bc-container'} class={{'hy-menu__breadcrumbs': true, 'is-empty': this.breadcrumbs.length === 0}}>
    
              <hy-menu-language is-mobile={this.menuType !== 'desktop'} data-menu-language={this.dataMenuLanguage} />
    
              {this.breadcrumbs.length
                ? this.breadcrumbs.map((breadcrumb, index) => {
                    return (
                      <hy-menu-mobile-breadcrumb label={breadcrumb.label} bid={breadcrumb.bid} is-first={index === 0} />
                    );
                  })
                : ''}
    
            </div>
            <div
              aria-hidden={this.open ? 'false' : 'true'}
              class={{
                'hy-menu': true,
    
                'is-open': this.open,
                'is-demo': this.isDemo
    
              {this.donateLink
                ? this.donateLink.map((i) => {
                    return <a href={i.url}>{i.label}</a>;
                  })
                : ''}