|
- const $ = require('jquery');
- import {StudioPreviewUtil} from "../utils/StudioPreviewUtil";
- import IHK from '../ihk';
- import 'jquery.easing';
-
-
- class Header {
- constructor(header) {
- this.header = header.addClass('initiated');
- this.window = $(window);
- this.body = $('body');
- this.overlayOpen = false;
- this.showOpenedNav = this.header.find('.primary').data("show-opened-menu");
- const t = this;
-
- this.initLogo();
- this.initTopLink();
- this.initScroll();
- this.initSearch();
- this.initPrimaryNav();
- this.initSecondaryNav();
- this.initToggling();
- this.initLanguage();
-
- if(this.showOpenedNav){
- t.header.find('.toggle-nav').click();
- }
-
- this.body.on('open-navigation', function (event, data) {
- if (data.openMenu) {
- t.header.find('.toggle-nav').click();
- }
- t.initPrimaryNav(data.rootUrl);
- });
- }
-
- initLogo() {
- const t = this;
- const logo = t.header.find('.logo');
- const img = logo.find('img');
- const overlay = $('<span class="logo-overlay" />').appendTo(logo);
- const browser = IHK.getBrowser();
- t.resizeTimeout = 0;
-
- t.window.on('resize load', function () {
- if (img.height() < 44) {
- overlay.css('left', img.height() * 2.1);
- }
- })
-
- if (browser.name === 'ie') {
- img.attr('src', img.attr('src').split('svg').join('png'));
- }
- };
-
- initTopLink() {
- const t = this;
- const toplink = $('<a href="#" class="toplink" tabindex="-1" />').text('Top').prependTo(t.header);
-
- toplink.on('click', function (e) {
- e.preventDefault();
- $('html, body').animate({'scrollTop': 0}, Math.round($(window).scrollTop() / 12 + 300), 'easeOutQuad');
- })
- }
-
- initSearch() {
- const t = this;
- const formNav = $('<div class="form-nav" />').appendTo(t.header.find('.search form'));
-
- t.header.find('nav .secondary').clone().appendTo(formNav);
- t.header.find('nav .meta').clone().appendTo(formNav);
-
- t.header.find('.open-search, .close-search').on('click', function (e) {
- t.header.toggleClass('search-open').removeClass('nav-open');
- if (t.header.hasClass('search-open')) {
- setTimeout(function () {
- t.header.find('.search-field').focus();
- }, 200)
- }
- t.toggleContentScroll();
- })
- };
-
- initScroll() {
- const t = this;
-
- window.addEventListener("scroll", function () {
- window.requestAnimationFrame(function () {
- t.checkScroll();
- })
- }, {passive: true});
- };
-
- checkScroll() {
- const t = this;
- const st = t.window.scrollTop();
-
- if (t.overlayOpen || $('.gallery-popup.open').length) {
- return false;
- }
-
- if (st > 59) {
- t.header.addClass('scrolled');
- } else {
- t.header.removeClass('scrolled');
- }
-
- if (st > t.window.height() * 1.2) {
- t.header.addClass('show-toplink');
- }
- else {
- t.header.removeClass('show-toplink');
- }
- }
-
- initToggling() {
- this.header.find('.overlay-holder').on('click touch', this.toggleNavigation.bind(this));
- this.header.find('.toggle-nav').on('click touch', this.toggleNavigation.bind(this));
- };
-
- toggleNavigation() {
- const t = this;
- if (StudioPreviewUtil.isStudioPreview()) {
- $("html").stop().animate({'scrollTop': 0}, 300, 'swing', function () {
- t.header.toggleClass('nav-open');
- t.toggleContentScroll();
- });
- } else {
- t.header.toggleClass('nav-open');
- t.toggleContentScroll();
- }
- };
-
- initPrimaryNav(optionalRootUrl) {
- const t = this;
- const primary = t.header.find('.primary');
-
- $(primary).empty()
- t.baseUrl = primary.attr('data-base-url');
- t.rootUrl = primary.attr('data-root-url');
-
- if (optionalRootUrl) {
- t.rootUrl = optionalRootUrl;
- primary.off('click', 'a');
- }
-
- primary.append($('<ul class="current" />').attr('data-json', t.baseUrl + t.rootUrl));
-
- primary.on('click', 'a', function (e) {
- const a = $(this);
- const li = a.parent();
- const ul = li.parent('ul');
-
- if (li.hasClass('deep')) {
- e.preventDefault();
-
- if (a.siblings('ul').length) {
- ul.removeClass('current');
- t.toTop(ul);
- a.siblings('ul').addClass('current');
- li.addClass('open');
- t.manageTabIndex();
- } else {
- const deepUl = $('<ul />').attr('data-json', a.attr('href')).appendTo(li);
- t.loadNav(deepUl);
- }
- } else if (li.hasClass('back')) {
- e.preventDefault();
- t.toTop(ul);
-
- if (ul.closest('li').length) {
- ul.removeClass('current')
- .closest('li').removeClass('open')
- .parent('ul').addClass('current');
- t.manageTabIndex();
- } else {
- const backUl = $('<ul />').attr('data-json', a.attr('href')).insertBefore(ul);
- t.loadNav(backUl);
- }
- }
- });
-
- t.loadNav(t.header.find('.primary ul'));
- }
-
- initSecondaryNav() {
- // secondary-nav-item
- const t = this;
- const $secondary = t.header.find("nav").find(".secondary");
- const $secondaryItems = $secondary.find(".secondary-nav-item");
- $.each($secondaryItems, function (index,element) {
- $(element).on("click", function (e) {
- if($(element).data("is-channel")){
- e.preventDefault();
- const elementRootUrl= $(this).data("root-url");
- t.initPrimaryNav(elementRootUrl);
- } else {
- return true;
- }
- });
- });
- }
-
- loadNav(ul) {
- const t = this;
- const currentPageId = t.header.find('.primary').data("page-content-id");
-
- if (ul.parent('li').length) {
- ul.addClass('current');
- setTimeout(function () {
- const parentUl = ul.addClass('loading').parent('li').addClass('open')
- .closest('.current').removeClass('current');
- t.toTop(parentUl);
- }, 20)
- }
-
- $.ajax({
- url: ul.attr('data-json'),
- type: "GET",
- dataType: "json",
- xhrFields: {withCredentials: true}
- }).done(function (data) {
- ul.attr('data-cm-metadata', '[{"_":{"$Ref":"content/' + data.tocListId + '"}}]');
- if (data.parentId) {
- $('<li class="back" />').appendTo(ul)
- .append($('<a />').attr('href', t.baseUrl + data.parentId).text(data.title));
- }
- if(!data.hideOverview) {
- if (data.showOverview) {
- const overviewElement = $('<li class="overview" />');
- overviewElement.appendTo(ul)
- .append($('<a />').attr('href', data.url).text(window.ihk.translations.overview));
-
- if (data.contentId === currentPageId.toString()) {
- overviewElement.find("a").addClass("active");
- }
- }
- }
- const parentElement = data;
- $.each(data.items, function () {
- let li = $('<li />').attr('data-id', this.contentId).attr('data-cm-metadata', '[{"_":{"$Ref":"content/' + this.contentId + '"}}]').appendTo(ul),
- a = $('<a />').html(this.title).appendTo(li);
-
- switch (this.type) {
- case "CMChannel" :
- li.addClass('deep');
- a.attr('href', t.baseUrl + this.contentId);
- break;
- case "CMArticle" :
- li.addClass('link');
- a.attr('href', this.url);
- break;
- default :
- li.addClass('miscellaneous');
- li.attr('data-type', this.type);
- a.attr('href', this.url);
- }
-
- if (this.linktype == 'external') {
- li.addClass('external');
- $(li).find("a").attr("target","_blank")
- }
-
- if (this.viewType === 'onlinemagazinstart') {
- // todo als link
- li.removeClass('deep');
- li.addClass('magazine-nav');
- $(li).find("a").attr("href",this.url);
- if (this.titleImage) {
- a.text('').append($('<img src="' + this.titleImage + '" alt="' + this.title + '" />'))
- }
- }
- if (this.viewType === 'themenseite' && !parentElement.root) {
- li.addClass('overview');
- li.removeClass('deep');
- a.attr('href', this.url);
- }
-
- if (this.trackCode && this.trackCode.length > 0) {
- $(li).find("a").attr("onmousedown", this.trackCode);
- }
-
- if (this.restrictedTo && this.restrictedTo.indexOf('extranet') > -1) {
- li.addClass('extranet');
- } else if (this.restrictedTo && this.restrictedTo.indexOf('intranet') > -1) {
- li.addClass('intranet');
- }
-
- if (this.doctype &&
- (this.doctype.indexOf('Datei') > -1 || this.doctype.indexOf('PDF') > -1 || this.doctype.indexOf('PIC') > -1)) {
- li.addClass('download');
- }
-
- if(this.contentId === currentPageId.toString()){
- $(li).find("a").addClass("active");
- }
- });
-
- ul.addClass('current').attr('data-id', data.contentId);
-
- if (ul.parent('li').length) {
- setTimeout(function () {
- const parentUl = ul.removeClass('loading').parent('li').addClass('open')
- .closest('.current').removeClass('current');
- t.toTop(parentUl);
- t.manageTabIndex();
- }, 20)
- } else if (ul.next('ul').length) {
- const innerUl = ul.next('ul');
- let wrapperLi = ul.find('li[data-id="' + innerUl.attr('data-id') + '"]').addClass('open');
-
- if (!wrapperLi.length) {
- wrapperLi = $('<li />').addClass('open').appendTo(ul);
- }
-
- wrapperLi.append(innerUl);
-
- setTimeout(function () {
- innerUl.removeClass('current');
- wrapperLi.removeClass('open');
- t.manageTabIndex();
- }, 20)
- }
- })
- }
-
- toggleContentScroll() {
- const t = this;
-
- if (t.header.hasClass('nav-open') || t.header.hasClass('search-open')) {
- t.overlayOpen = true;
- this.body.trigger('overlay-open');
- t.body.css('top', (t.window.scrollTop() * -1) + 'px').addClass('nav-open');
- if (t.header.hasClass('search-open')) {
- t.body.addClass('search-open');
- }
- } else {
- t.overlayOpen = false;
- this.body.trigger('overlay-close');
- const top = Math.abs(parseInt(t.body.css('top')));
- t.body.removeClass('nav-open').removeClass('search-open').removeAttr('style');
- t.window.scrollTop(top);
- }
- }
-
- initLanguage() {
- const lang = this.header.find('.language');
-
- lang.find('button').on('click', function (e) {
- lang.toggleClass('open');
- })
-
- lang.on('click', function (e) {
- e.stopPropagation();
- })
-
- this.body.on('click', function () {
- lang.removeClass('open');
- })
-
- lang.siblings().find('a').on('focus', function () {
- lang.removeClass('open');
- })
- }
-
- manageTabIndex() {
- this.header.find('.primary a').attr('tabindex', '-1');
- this.header.find('.primary .current > li > a').removeAttr('tabindex');
- }
-
- toTop(ul) {
- if (ul.scrollTop() > 0) {
- ul.animate({'scrollTop': 0}, 300, 'swing');
- }
- }
- }
-
- $('body').on('ihk-init', function () {
- $('.page-header:not(.initiated)').each(function (i) {
- new Header($('.page-header'));
- });
-
- });
|