Newer
Older
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',
export class Menu {
@Event() menuContainerToggled: EventEmitter;
@Prop() dataMenuDonate: string;
@Prop() dataMenuLanguage: string;
@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;
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,
];
}
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);
Markus Kalijärvi
committed
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');
});
}
}
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>
case MenuType.mobile:
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.map((breadcrumb) => {
return (
<hy-menu-mobile-breadcrumb
label-back={this.menuButtonBreadcrumbReturn}
label-front-page={this.labelFrontPage}
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>
))