414 lines
13 KiB
JavaScript
414 lines
13 KiB
JavaScript
'use strict';
|
|
|
|
var _createClass = (function() {
|
|
function defineProperties(target, props) {
|
|
for (var i = 0; i < props.length; i++) {
|
|
var descriptor = props[i];
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
descriptor.configurable = true;
|
|
if ('value' in descriptor) descriptor.writable = true;
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
}
|
|
}
|
|
return function(Constructor, protoProps, staticProps) {
|
|
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) defineProperties(Constructor, staticProps);
|
|
return Constructor;
|
|
};
|
|
})();
|
|
|
|
function _toConsumableArray(arr) {
|
|
if (Array.isArray(arr)) {
|
|
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
|
|
arr2[i] = arr[i];
|
|
}
|
|
return arr2;
|
|
} else {
|
|
return Array.from(arr);
|
|
}
|
|
}
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError('Cannot call a class as a function');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Main header function with docsearch
|
|
* @param {Object} docSearch config
|
|
*/
|
|
|
|
var communityHeader = (function() {
|
|
function communityHeader(docSearchCredentials, docSearch) {
|
|
var _this = this;
|
|
|
|
_classCallCheck(this, communityHeader);
|
|
|
|
this.docSearchCredentials = docSearchCredentials;
|
|
this.docSearch = docSearch || null;
|
|
|
|
this.menuState = {
|
|
isOpen: false,
|
|
isOpenMobile: false,
|
|
};
|
|
|
|
this.INIT_VAL = {
|
|
WIDTH: 490,
|
|
HEIGHT: 360,
|
|
};
|
|
|
|
this.disableTransitionTimeout;
|
|
|
|
this.searchIcon = document.querySelector('#search');
|
|
this.cancelIcon = document.querySelector('#cancel');
|
|
this.searchInputContainer = document.querySelector('.algc-search__input');
|
|
this.searchContainer = this.searchInputContainer
|
|
? this.searchInputContainer.parentNode
|
|
: null;
|
|
this.navRoot = document.querySelector('.algc-dropdownroot');
|
|
this.dropdownRoot = document.querySelector(
|
|
'.algc-navigation__dropdown-holder'
|
|
);
|
|
this.navItems = document.querySelectorAll('a[data-enabledropdown="true"]');
|
|
this.navContainer = document.querySelector(
|
|
'.algc-dropdownroot__dropdowncontainer'
|
|
);
|
|
this.menuContainer = document.querySelector('.algc-navigation__container');
|
|
this.navBg = document.querySelector('.algc-dropdownroot__dropdownbg');
|
|
this.navArrow = document.querySelector('.algc-dropdownroot__dropdownarrow');
|
|
this.dropDownContainer = document.querySelector(
|
|
'.algc-dropdownroot__dropdowncontainer'
|
|
);
|
|
this.menuTriggers = document.querySelectorAll(
|
|
'[data-enabledropdown="true"]'
|
|
);
|
|
this.mobileMenuButton = document.querySelector('.algc-openmobile ');
|
|
this.mobileMenu = document.querySelector('.algc-mobilemenu');
|
|
this.subList = document.querySelectorAll('.algc-menu--sublistlink');
|
|
this.subListHolders = []
|
|
.concat(_toConsumableArray(this.subList))
|
|
.map(function(node) {
|
|
return node.parentNode;
|
|
});
|
|
this.menuDropdowns = {};
|
|
|
|
[].forEach.call(
|
|
document.querySelectorAll('[data-dropdown-content]'),
|
|
function(item) {
|
|
_this.menuDropdowns[item.dataset.dropdownContent] = {
|
|
parent: item.parentNode,
|
|
content: item,
|
|
};
|
|
}
|
|
);
|
|
|
|
this.shouldInitDocSearch = this.shouldInitDocSearch.bind(this);
|
|
this.docSearchInit = this.checkDocSearch(docSearch);
|
|
this.enableDocSearch = this.verifyDocSearchParams(docSearchCredentials);
|
|
this.hasDocSearchRendered = document.querySelector(
|
|
'.algc-navigation .algc-search__input--docsearch'
|
|
);
|
|
this.triggerMenu = this.triggerMenu.bind(this);
|
|
this.shouldTriggerMenu = this.shouldTriggerMenu.bind(this);
|
|
this.closeMenu = this.closeMenu.bind(this);
|
|
this.toggleMobileMenu = this.toggleMobileMenu.bind(this);
|
|
this.docSearchToggling = this.docSearchToggling.bind(this);
|
|
this.initDocSearchStrategy = this.initDocSearchStrategy.bind(this);
|
|
this.openSublist = this.openSublist.bind(this);
|
|
this.closeSubLists = this.closeSubLists.bind(this);
|
|
this.bindListeners = this.bindListeners.bind(this);
|
|
|
|
this.calculatePosition = this.calculatePosition.bind(this);
|
|
|
|
this.verifyDocSearchParams();
|
|
this.shouldInitDocSearch();
|
|
this.initDocSearchStrategy();
|
|
this.bindListeners();
|
|
}
|
|
|
|
_createClass(communityHeader, [
|
|
{
|
|
key: 'calculatePosition',
|
|
value: function calculatePosition(sourceNode) {
|
|
var box = sourceNode.getBoundingClientRect();
|
|
var realWidth = sourceNode.offsetWidth;
|
|
var realHeight = sourceNode.offsetHeight;
|
|
|
|
return {
|
|
left: box.left,
|
|
top: box.top,
|
|
width: box.width,
|
|
height: box.height,
|
|
realWidth: realWidth,
|
|
realHeight: realHeight,
|
|
center: box.left + box.width / 2,
|
|
};
|
|
},
|
|
},
|
|
{
|
|
key: 'shouldInitDocSearch',
|
|
value: function shouldInitDocSearch() {
|
|
if (!this.enableDocSearch && this.hasDocSearchRendered) {
|
|
throw new Error(
|
|
'You need to pass docSearch: { apiKey, indexName, inputSelector } to communityHeader function in order to initialise docSearch'
|
|
);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'checkDocSearch',
|
|
value: function checkDocSearch() {
|
|
var docSearch = arguments.length > 0 && arguments[0] !== undefined
|
|
? arguments[0]
|
|
: false;
|
|
|
|
if (docSearch) return docSearch;
|
|
|
|
if (
|
|
typeof window.docsearch === 'function' ||
|
|
typeof docsearch === 'function'
|
|
) {
|
|
return docsearch;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'verifyDocSearchParams',
|
|
value: function verifyDocSearchParams(docSearchCredentials) {
|
|
return docSearchCredentials &&
|
|
docSearchCredentials.apiKey &&
|
|
docSearchCredentials.indexName &&
|
|
docSearchCredentials.inputSelector
|
|
? true
|
|
: false;
|
|
},
|
|
},
|
|
{
|
|
key: 'triggerMenu',
|
|
value: function triggerMenu(event) {
|
|
var _this2 = this;
|
|
|
|
var dropdown = event.target.dataset.dropdown;
|
|
var newTarget = this.menuDropdowns[dropdown].content;
|
|
var newContent = this.menuDropdowns[dropdown].parent;
|
|
|
|
var navItem = this.calculatePosition(event.target);
|
|
var newTargetCoordinates = this.calculatePosition(newTarget);
|
|
var menuContainerOffset = this.calculatePosition(this.menuContainer);
|
|
var leftDistance = void 0;
|
|
|
|
var scaleFactors = {
|
|
X: newTargetCoordinates.realWidth / this.INIT_VAL.WIDTH,
|
|
Y: newTargetCoordinates.realHeight / this.INIT_VAL.HEIGHT,
|
|
};
|
|
|
|
leftDistance = navItem.center - menuContainerOffset.left + 'px';
|
|
|
|
if (menuContainerOffset.left < 20) {
|
|
leftDistance = 'calc(50% - 36px)';
|
|
}
|
|
|
|
this.navBg.style.cssText = '\n transform: translateX(' +
|
|
leftDistance +
|
|
') scale(' +
|
|
scaleFactors.X +
|
|
', ' +
|
|
scaleFactors.Y +
|
|
')';
|
|
|
|
this.navArrow.style.cssText = '\n transform: translateX(' +
|
|
leftDistance +
|
|
') rotate(45deg)';
|
|
|
|
this.dropDownContainer.style.cssText = '\n transform: translateX(' +
|
|
leftDistance +
|
|
');\n width: ' +
|
|
newTargetCoordinates.realWidth +
|
|
'px;\n height: ' +
|
|
(newTargetCoordinates.realHeight + 10) +
|
|
'px;';
|
|
|
|
this.dropdownRoot.style.pointerEvents = 'auto';
|
|
|
|
Object.keys(this.menuDropdowns).forEach(function(key) {
|
|
if (key === dropdown) {
|
|
_this2.menuDropdowns[key].parent.classList.add('active');
|
|
} else {
|
|
_this2.menuDropdowns[key].parent.classList.remove('active');
|
|
}
|
|
});
|
|
|
|
if (!this.menuState.isOpen) {
|
|
setTimeout(
|
|
function() {
|
|
_this2.navRoot.className = 'algc-dropdownroot activeDropdown';
|
|
},
|
|
50
|
|
);
|
|
}
|
|
|
|
window.clearTimeout(this.disableTransitionTimeout);
|
|
this.menuState.isOpen = true;
|
|
},
|
|
},
|
|
{
|
|
key: 'shouldTriggerMenu',
|
|
value: function shouldTriggerMenu(event) {
|
|
var _this3 = this;
|
|
|
|
if (this.menuState.isOpen) {
|
|
this.triggerMenu(event);
|
|
} else {
|
|
this.triggerMenuTimeout = setTimeout(
|
|
function() {
|
|
_this3.triggerMenu(event);
|
|
},
|
|
200
|
|
);
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'closeMenu',
|
|
value: function closeMenu(event) {
|
|
var _this4 = this;
|
|
|
|
window.clearTimeout(this.triggerMenuTimeout);
|
|
this.menuState.isOpen = false;
|
|
this.disableTransitionTimeout = setTimeout(
|
|
function() {
|
|
_this4.dropdownRoot.style.pointerEvents = 'none';
|
|
_this4.navRoot.className = 'algc-dropdownroot notransition';
|
|
},
|
|
50
|
|
);
|
|
},
|
|
},
|
|
{
|
|
key: 'toggleMobileMenu',
|
|
value: function toggleMobileMenu(event) {
|
|
this.mobileMenuButton.classList.toggle('algc-openmobile--open');
|
|
this.mobileMenu.classList.toggle('algc-mobilemenu--open');
|
|
},
|
|
|
|
// Search
|
|
},
|
|
{
|
|
key: 'docSearchToggling',
|
|
value: function docSearchToggling() {
|
|
var _this5 = this;
|
|
|
|
this.searchInput = document.querySelector(
|
|
this.docSearchCredentials.inputSelector
|
|
);
|
|
var openSearchInput = function openSearchInput() {
|
|
_this5.searchContainer.classList.add('open');
|
|
_this5.searchInput.focus();
|
|
};
|
|
|
|
var closeSearchInput = function closeSearchInput() {
|
|
_this5.searchInput.blur();
|
|
_this5.searchContainer.classList.remove('open');
|
|
};
|
|
|
|
var emptySearchInput = function emptySearchInput() {
|
|
if (_this5.searchInput.value !== '') {
|
|
_this5.searchInput.value = '';
|
|
} else {
|
|
closeSearchInput();
|
|
}
|
|
};
|
|
this.searchInput.setAttribute('value', '');
|
|
this.searchIcon.addEventListener('click', openSearchInput);
|
|
this.cancelIcon.addEventListener('click', emptySearchInput);
|
|
},
|
|
},
|
|
{
|
|
key: 'initDocSearch',
|
|
value: function initDocSearch() {
|
|
this.docSearchToggling();
|
|
this.docSearchInit(this.docSearchCredentials);
|
|
},
|
|
},
|
|
{
|
|
key: 'initDocSearchStrategy',
|
|
value: function initDocSearchStrategy() {
|
|
var _this6 = this;
|
|
|
|
if (this.enableDocSearch && typeof this.docSearchInit === 'function') {
|
|
this.initDocSearch();
|
|
} else if (this.docSearch === 'lazy') {
|
|
var docSearchScript = document.createElement('script');
|
|
docSearchScript.type = 'text/javascript';
|
|
docSearchScript.async = true;
|
|
document.body.appendChild(docSearchScript);
|
|
|
|
docSearchScript.onload = function() {
|
|
_this6.docSearchInit = docsearch;
|
|
_this6.initDocSearch();
|
|
};
|
|
|
|
docSearchScript.src = 'https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.js';
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'openSublist',
|
|
value: function openSublist(node) {
|
|
var parent = node.parentNode;
|
|
this.subListHolders.forEach(function(holder) {
|
|
if (holder === parent && !parent.classList.contains('open')) {
|
|
holder.classList.add('open');
|
|
} else {
|
|
holder.classList.remove('open');
|
|
}
|
|
});
|
|
},
|
|
},
|
|
{
|
|
key: 'closeSubLists',
|
|
value: function closeSubLists(event) {
|
|
this.subListHolders.forEach(function(holder) {
|
|
return holder.classList.remove('open');
|
|
});
|
|
},
|
|
},
|
|
{
|
|
key: 'bindListeners',
|
|
value: function bindListeners() {
|
|
var _this7 = this;
|
|
|
|
var that = this;
|
|
this.subList.forEach(function(link) {
|
|
link.addEventListener('click', function(event) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
that.openSublist(this);
|
|
});
|
|
});
|
|
|
|
this.menuTriggers.forEach(function(item) {
|
|
item.addEventListener('mouseenter', _this7.shouldTriggerMenu);
|
|
item.addEventListener('focus', _this7.triggerMenu);
|
|
});
|
|
|
|
this.navItems.forEach(function(item) {
|
|
item.addEventListener('mouseleave', _this7.closeMenu);
|
|
});
|
|
|
|
this.navContainer.addEventListener('mouseenter', function() {
|
|
clearTimeout(_this7.disableTransitionTimeout);
|
|
});
|
|
|
|
this.mobileMenuButton.addEventListener('click', this.toggleMobileMenu);
|
|
document.addEventListener('click', this.closeSubLists);
|
|
document
|
|
.querySelector('.algc-dropdownroot__dropdowncontainer')
|
|
.addEventListener('mouseleave', this.closeMenu);
|
|
},
|
|
},
|
|
]);
|
|
|
|
return communityHeader;
|
|
})();
|