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 ? `