Skip to content
Snippets Groups Projects
menu.tsx 6.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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';
    
      tag: 'hy-menu',
      styleUrl: 'menu.scss',
    
      shadow: true,
    
      @Element() el: HTMLElement;
    
      @Event() menuContainerToggled: EventEmitter;
    
      @Prop() dataMenuDonate: string;
      @Prop() dataMenuLanguage: string;
    
      @Prop() isGroup: 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;
    
      // 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);
    
        // 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');
          });
        }
    
        switch (this.menuType) {
    
            return (
              <div class={'hy-wrapper'}>
                <nav
                  role={'navigation'}
                  class={{
                    'hy-menu-wrapper--desktop': true,
    
                  }}
                >
                  <div class={'hy-menu hy-menu--desktop'}>
                    <slot />
                  </div>
                </nav>
    
    Tuukka Turu's avatar
    Tuukka Turu committed
                data-is-group={this.isGroup}
    
                role={'navigation'}
                class={{
                  'hy-menu-wrapper--mobile': true,
    
                }}
              >
                <div class={'hy-menu__logo-container'} id={'menu-logo'}>
                  <hy-site-logo
                    size={SiteLogoSize.small}
    
                    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>
    
                {!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>
                )}