import $ from 'jquery'; import 'mage/translate'; import OffcanvasNavigation from '../../../node_modules/creative-patterns/packages/components/offcanvas-navigation/src/offcanvas-navigation'; export interface NavigationTree { name: string; url: string; icon: string; productCount: string; activeClass: string; subcategories: NavigationTree[]; } const navClassName: string = 'cs-navigation'; const offNavClassName: string = 'cs-offcanvas-navigation'; const infoStripeClassName: string = 'cs-information-stripe'; /** * Builds subtree structure from existing desktop navigation. * @param {JQuery} $link Root link for tree. * @return {NavigationTree} Navigation tree originating in root link. */ export function buildSubtree($link: JQuery): NavigationTree { const $subcategories: JQuery = $link.next(); const subcategoryClass = $subcategories.hasClass(`${navClassName}__flyout`) ? `.${navClassName}__link--category` : `.${navClassName}__link--subcategory`; const $sublinks: JQuery = $subcategories.find(subcategoryClass); const subcategories: NavigationTree[] = $.map( $sublinks, (sublink: HTMLElement) => { return buildSubtree($(sublink)); } ); const subtree: NavigationTree = { name: $link .clone() .children() .remove() .end() .text() .trim(), url: $link.attr('href'), icon: $link.find(`> .${navClassName}__link-icon-wrapper`).length ? $link .find( `> .${navClassName}__link-icon-wrapper .${navClassName}__link-icon` ) .attr('src') : '', productCount: $link.find(`> .${navClassName}__link-products-qty`).length ? $link.find(`> .${navClassName}__link-products-qty`).text() : '', activeClass: $link.parent().data('active-class') ? $link.parent().data('active-class') : '', subcategories: subcategories, }; return subtree; } /** * Build navigation tree structure from exisiting desktop navigation. * @param {JQuery} $links Main links of desktop navigation. * @return {NavigationTree[]} Complete navigation tree */ export function buildTree($links: JQuery): NavigationTree[] { const navigationTree: NavigationTree[] = []; $links.each((index: number, link: HTMLElement) => { navigationTree.push(buildSubtree($(link))); }); return navigationTree; } /** * Renders navigation tree. * @param {NavigationTree[]} navigationTree Navigation tree data. * @param {NavigationTree} parent Parent category. * @return {string} Rendered HTML. */ export function renderTree( navigationTree: NavigationTree[], parent?: NavigationTree, settings?: any ): string { let subtreeHTML: string = parent ? `' : ''; return subtreeHTML; } export function renderUserAction(): string { const $accountLink: JQuery = $(`.${infoStripeClassName}__account-link`); if (!$accountLink.length) { return ''; } else { const accountLinkHref: string = $accountLink.attr('href'); const accountLinkText: string = $accountLink.text().trim(); const accountActionType: string = accountLinkHref.toLowerCase().indexOf('out') === -1 ? 'in' : 'out'; return `
  • ${accountLinkText}
  • `; } } // add placeholder for storeviewswitcher export function renderStoreViewSwitcher(): string { return `
    `; } // move storeviewswitcher to placeholder in offcanvas export function moveStoreViewSwitcher(): void { jQuery(`#switcher-language-nav`).appendTo( `.cs-offcanvas-navigation__item-lang-switcher` ); } /** * Sets offcanvas navigation content. */ export const contentSetter = ( offcanvasNavigation: OffcanvasNavigation ): void => { const $navigation: JQuery = $(`.${navClassName}`); const $links: JQuery = $navigation .find(`.${navClassName}__link`) .not( `.${navClassName}__link--category, .${navClassName}__link--subcategory` ); const $offNavList: JQuery = offcanvasNavigation .getElement() .find(`.${offNavClassName}__list`); $offNavList.append( renderTree(buildTree($links), null, offcanvasNavigation._options) + renderUserAction() + renderStoreViewSwitcher() ); moveStoreViewSwitcher(); }; export default contentSetter;