{"version":3,"file":"umw.tabbuilder.min.js","sources":["umw.tabbuilder.js"],"sourcesContent":["(function ($, _) {\r\n 'use strict';\r\n\r\n const dataAttributes = {\r\n containerSelector: 'umw-tab-container',\r\n tabName: 'umw-tab-name',\r\n tabClass: 'umw-tab-class',\r\n position: 'umw-tab-position'\r\n };\r\n\r\n const $umwTabsContainers = $('.js-umw-tabs-check-if-empty');\r\n\r\n $(function () {\r\n var selectorsMap = {}, tabContainerMap = {};\r\n $('[data-' + dataAttributes.containerSelector + ']').each(function () {\r\n var $content = $(this);\r\n $content.find('script').remove(); // Clear scripts inside the moving nodes in order to prevent double-executing\r\n\r\n var hasContent = $.trim($content.text()).length > 0 || $content.find('iframe').length > 0 || $content.find('img').length > 0;\r\n if (hasContent) {\r\n var containerSelector = $content.data(dataAttributes.containerSelector);\r\n\r\n var $tabsContainer;\r\n if (selectorsMap[containerSelector]) {\r\n $tabsContainer = selectorsMap[containerSelector];\r\n } else {\r\n // Multiple elements can be found by a single selector. We can not clone content to every found tabs container because scripts of cloned content will become broken.\r\n // Therefore, always use the first found element as a single tabs container\r\n $tabsContainer = selectorsMap[containerSelector] = $(containerSelector).first();\r\n }\r\n\r\n if (!$tabsContainer.length) {\r\n console.error('[UMW]: Tab builder - Cannot find tabs container by \"' + containerSelector + '\" selector');\r\n return;\r\n }\r\n\r\n // Get or define unique tab container id attribute\r\n var tabContUniqueId = $tabsContainer.attr('id');\r\n if (!tabContUniqueId) {\r\n $tabsContainer.attr('id', tabContUniqueId = _.uniqueId('tabCont'));\r\n }\r\n\r\n // The same tabs container can be found by different selector. Merge if the same container was already found by different selector\r\n if (!tabContainerMap[tabContUniqueId]) {\r\n tabContainerMap[tabContUniqueId] = [];\r\n }\r\n\r\n var tabDetails = {\r\n $content: $content,\r\n tabName: _getTabTitle($content),\r\n position: $content.data(dataAttributes.position),\r\n containerId: _getTabContainerId($content),\r\n tabClass: $content.data(dataAttributes.tabClass)\r\n }\r\n\r\n tabContainerMap[tabContUniqueId].push(tabDetails);\r\n }\r\n });\r\n\r\n if (!_.isEmpty(tabContainerMap)) {\r\n\r\n // Check URL for speific parameter \"tab\", to preselect tab at build\r\n const searchParams = new URLSearchParams(window.location.search);\r\n let urlPreselectedTabName = null;\r\n\r\n for (let param of searchParams) {\r\n if (param[0] === \"tab\") {\r\n urlPreselectedTabName = param[1].toLowerCase();\r\n break;\r\n }\r\n }\r\n\r\n _.each(tabContainerMap, function (tabDetailsList, containerUniqueId) {\r\n var $tabsContainer = $('#' + containerUniqueId);\r\n var hasActiveTabs = false;\r\n var sourceContainerIds = [];\r\n var overrideActiveState = false;\r\n\r\n var $navTabs = $tabsContainer.find('.nav-tabs');\r\n if ($navTabs.length > 0) {\r\n $navTabs.detach();\r\n\r\n hasActiveTabs = $navTabs.find('.active').length > 0;\r\n } else {\r\n $navTabs = _$createElem('ul', 'nav nav-tabs', { 'role': 'tablist' });\r\n }\r\n\r\n var $tabPanes = $tabsContainer.find('.tab-content');\r\n if ($tabPanes.length > 0) {\r\n $tabPanes.detach();\r\n } else {\r\n $tabPanes = _$createElem('div', 'tab-content');\r\n }\r\n\r\n var sorted = _.sortBy(tabDetailsList, 'position');\r\n var grouped = _.groupBy(sorted, 'tabName');\r\n\r\n // Add all source containers IDs to array to compare with Url seach param\r\n if (urlPreselectedTabName) {\r\n _.each(grouped, function (contentParts) {\r\n sourceContainerIds.push(contentParts[0].containerId);\r\n });\r\n overrideActiveState = _.indexOf(sourceContainerIds, urlPreselectedTabName) > 0 ? true : false;\r\n }\r\n\r\n _.each(grouped, function (contentParts, tabName) {\r\n var tabId = _.uniqueId(containerUniqueId + '_tab');\r\n var isActiveTab = !hasActiveTabs && (hasActiveTabs = true); // Set tab as active if there are no active tabs yet\r\n if (overrideActiveState) { // Override selected tab if selected tab parameter for selected tab passet by URL\r\n isActiveTab = false;\r\n if (urlPreselectedTabName === contentParts[0].containerId) {\r\n isActiveTab = true;\r\n }\r\n }\r\n\r\n // Nav tab\r\n if ($(\"body\").hasClass(\"bs5\")) {\r\n const $tabNavAnchor = _$createElem('button', isActiveTab ? 'nav-link active' : 'nav-link', { 'type': 'button', 'id': tabId + '-tab', 'data-bs-toggle': 'pill', 'data-bs-target': '#' + tabId, 'role': 'tab', 'aria-controls': tabId, 'aria-selected': 'false' }, tabName);\r\n const liClass = 'nav-item' + (contentParts[0] && contentParts[0].tabClass ? ' ' + contentParts[0].tabClass : '');\r\n _$createElem('li', liClass, { 'role': 'presentation' }).append($tabNavAnchor).appendTo($navTabs);\r\n } else {\r\n const $tabNavAnchor = _$createElem('a', null, { 'href': '#' + tabId, 'aria-controls': tabId, 'role': 'tab', 'data-toggle': 'tab' }, tabName);\r\n const liClass = ((isActiveTab ? 'active' : '') + (contentParts[0] && contentParts[0].tabClass ? ' ' + contentParts[0].tabClass : '')).trim();\r\n _$createElem('li', liClass, { 'role': 'presentation' }).append($tabNavAnchor).appendTo($navTabs);\r\n }\r\n\r\n // Tab pane\r\n const tabClass = 'tab-pane ' + ((isActiveTab ? ' active' : '') + (contentParts[0] && contentParts[0].tabClass ? ' ' + contentParts[0].tabClass : '')).trim();\r\n var $tabPane = _$createElem('div', tabClass, { 'id': tabId, 'role': 'tabpanel' }).appendTo($tabPanes);\r\n _.each(contentParts, function (part) {\r\n // Prepare the content\r\n part.$content.detach();\r\n part.$content.removeClass('hidden').show(); // Make the content visible in case it is hidden\r\n\r\n part.$content.appendTo($tabPane);\r\n });\r\n });\r\n\r\n $tabsContainer.append($navTabs, $tabPanes);\r\n\r\n $tabsContainer.show();\r\n });\r\n } else {\r\n // Markup trash collector, if empty container exists. \r\n // In case specific control builds the tabs but can't check content model of related to him controls at the same page, which participates in tab building process. \r\n $umwTabsContainers.each(function () {\r\n var $this = $(this);\r\n if ($this.text().length === 0) $this.remove();\r\n });\r\n }\r\n });\r\n\r\n function _$createElem(tag, className, attributes, textContent) {\r\n var elem = document.createElement(tag);\r\n\r\n if (className) {\r\n elem.className = className;\r\n }\r\n\r\n if (attributes) {\r\n _.each(attributes, function (attrValue, attrName) {\r\n elem.setAttribute(attrName, attrValue);\r\n });\r\n }\r\n\r\n if (textContent) {\r\n elem.textContent = textContent;\r\n }\r\n\r\n return $(elem);\r\n }\r\n\r\n function _getTabTitle($tabContent) {\r\n var tabTitle = $tabContent.data(dataAttributes.tabName); // Preferred way\r\n if (!tabTitle) {\r\n tabTitle = $tabContent.prevAll('input:hidden.TabTitle').val() ||\r\n $tabContent.find('.js-tab-name,.Title,.MainTitle').first().text() ||\r\n _.uniqueId('Tab ');\r\n }\r\n\r\n return tabTitle;\r\n }\r\n\r\n function _getTabContainerId($tabContent) {\r\n var tabContainerId = $tabContent.attr('id');\r\n if (tabContainerId) {\r\n tabContainerId = tabContainerId.toLowerCase();\r\n }\r\n return tabContainerId;\r\n }\r\n})(jQuery, _);"],"names":["$","_","dataAttributes","containerSelector","tabName","tabClass","position","$umwTabsContainers","_$createElem","tag","className","attributes","textContent","elem","document","createElement","each","attrValue","attrName","setAttribute","selectorsMap","tabContainerMap","tabContUniqueId","tabDetails","$content","this","find","remove","trim","text","length","data","$tabsContainer","first","attr","uniqueId","$tabContent","tabTitle","prevAll","val","_getTabTitle","containerId","tabContainerId","toLowerCase","_getTabContainerId","push","console","error","isEmpty","$this","param","searchParams","URLSearchParams","window","location","search","let","urlPreselectedTabName","tabDetailsList","containerUniqueId","hasActiveTabs","sourceContainerIds","overrideActiveState","$navTabs","$tabPanes","detach","role","sorted","sortBy","grouped","groupBy","contentParts","indexOf","$tabNavAnchor","tabId","isActiveTab","hasClass","type","id","data-bs-toggle","data-bs-target","aria-controls","aria-selected","append","appendTo","href","data-toggle","$tabPane","part","removeClass","show","jQuery"],"mappings":"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"}