Skip to content
Snippets Groups Projects
menu.tsx 5.35 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 = [];
    
    
          // Trigger menu-level-container toggle for every menu level.
          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'});
            }
          });
    
      @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);
    
        this.el.children[0].setAttribute('menu-button-submenu-expand', this.menuButtonSubmenuExpand);
    
      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');
          });
        }
    
        switch (this.menuType) {
          case 'desktop':
            return (
              <div class={'hy-wrapper'}>
                <nav
                  role={'navigation'}
                  class={{
                    'hy-menu-wrapper--desktop': true,
                    'is-open': this.open
                  }}
                >
                  <div class={'hy-menu hy-menu--desktop'}>
                    <slot />
                  </div>
                </nav>
    
            );
    
          case 'mobile':
            return (
              <nav
                role={'navigation'}
                class={{
                  'hy-menu-wrapper--mobile': true,
                  'is-open': this.open
                }}
              >
                <div class={'hy-menu__logo-container'} id={'menu-logo'}>
                  <hy-site-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={true} 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,
                    'hy-menu--mobile': true,
                    'is-open': this.open,
                    'is-demo': this.isDemo
                  }}
                >
                  <slot />
                </div>
                <div class={'hy-link__donate'}>
                  {this.donateLink
                    ? this.donateLink.map((i) => {
                        return <a href={i.url}>{i.label}</a>;
                      })
                    : ''}
                </div>
              </nav>
            );
    
          case 'sidebar':
            return (
              <nav
                role={'navigation'}
                class={{
                  'hy-menu-wrapper--sidebar': true,
                  'is-open': this.open,
                  'is-demo': this.isDemo
                }}
              >
                <div
                  aria-hidden={this.open ? 'false' : 'true'}
                  class={{
                    'hy-menu': true,
                    'hy-menu--sidebar': true,
                    'is-open': this.open,
                    'is-demo': this.isDemo
                  }}
                >
                  <slot />
                </div>
              </nav>
            );
        }