1; 2function registerLoadingListeners(opts) { 3 var bsVersion = $.fn.tab.Constructor.VERSION; 4 if (bsVersion) { 5 bsVersion = bsVersion.replace(/\./g, ''); 6 bsVersion = parseInt(bsVersion); 7 if (bsVersion >= 400) { 8 $.fn.tab.noConflict(); 9 } 10 } 11 12 13 if (opts.ShowLoading && opts.ShowLoading.Value) { 14 dnnsf.api.tabspro.showLoading['tabsPopup' + opts.ModuleId] = opts.ShowLoading.Value; 15 dnnsf.initStickyLoading('dnn_ctr' + opts.ModuleId + '_Main_pnlTabs'); 16 17 var target = $('#dnn_ctr' + opts.ModuleId + '_Main_pnlDialog .common-loading-container'); 18 19 var loadingQueue = []; 20 21 var moduleIdsInTabsPro = _.reduce(opts.Tabs, 22 function (midArray, tab) { 23 var tabIds = _.map(tab.TabModules, 24 function (module) { 25 return module.ModuleId; 26 }) 27 return _.concat(tabIds, midArray); 28 }, []); 29 30 function fnLoading(message) { 31 if (_.find(moduleIdsInTabsPro, function (mid) { return mid === message.moduleId; })) { 32 if (message.loading) { 33 target.show(); 34 loadingQueue.push(message.moduleId); 35 } else { 36 _.pull(loadingQueue, message.moduleId); 37 !loadingQueue.length && target.hide(); 38 } 39 } 40 } 41 42 dnnsf.events.listen('loadGrid', opts.ModuleId, fnLoading); 43 44 dnnsf.events.listen('loadForm', opts.ModuleId, fnLoading); 45 } 46}; 47 48(function ($) { 49 50 // sametimes, the hashchange function breaks the tab state, so use this variable to bypass onHashChange if the we changed it from the activate/select handler 51 var _hashLockNext = false; 52 var defaultTabId = ''; 53 var currentHash; 54 function elementInViewport(el, reduceHeight) { 55 var top = el.offsetTop; 56 var left = el.offsetLeft; 57 var width = el.offsetWidth; 58 var height = el.offsetHeight; 59 var pageHeight = window.innerHeight - (reduceHeight || 0); 60 61 while (el.offsetParent) { 62 el = el.offsetParent; 63 top += el.offsetTop; 64 left += el.offsetLeft; 65 } 66 67 return ( 68 top >= window.pageYOffset && 69 left >= window.pageXOffset && 70 (top + height) <= (window.pageYOffset + pageHeight) && 71 (left + width) <= (window.pageXOffset + window.innerWidth) 72 ); 73 } 74 75 // once for all tabs pro modules 76 $(function () { 77 78 // setup image tabs 79 $('.tp-imagetab').hover(function () { 80 if ($(this).find('.tp-image-active:visible').size()) 81 return; 82 $(this).find('.tp-image-hover').show(); 83 $(this).find('.tp-image-default').hide(); 84 }, function () { 85 if ($(this).find('.tp-image-active:visible').size()) 86 return; 87 $(this).find('.tp-image-hover').hide(); 88 $(this).find('.tp-image-default').show(); 89 }); 90 91 $(".ui-tabs").on("tabsbeforeactivate", function (event, ui) { 92 ui.oldTab.find('.tp-image-active,.tp-image-hover').hide(); 93 ui.oldTab.find('.tp-image-default').show(); 94 ui.newTab.find('.tp-image-active').show(); 95 ui.newTab.find('.tp-image-hover,.tp-image-default').hide(); 96 }).on("tabscreate", function (event, ui) { 97 if (ui.tab) { 98 ui.tab.find('.tp-image-active').show(); 99 ui.tab.find('.tp-image-hover,.tp-image-default').hide(); 100 } 101 }); 102 103 }); 104 105 function updateQs(params) { 106 if (!params.qs || $.isEmptyObject(params.qs)) 107 return; 108 setTimeout(function () { 109 var nextQs = $.param($.isEmptyObject(dnnsf.getUrlParts(location.search).query) ? params.qs : $.extend({}, dnnsf.getUrlParts(location.search).query, params.qs || {})); 110 if (nextQs != location.search.substring(1)) 111 window.history.pushState({}, "", '?' + nextQs); 112 }, 500) 113 } 114 115 window.tpInitBootstrapLayout = function (opts) { 116 dnnsf['tp-' + opts.ModuleId] = opts; 117 // merge defaults 118 opts = $.extend({ 119 tabInit: -1 120 }, opts); 121 122 defaultTabId = '';//reset default tab 123 for (var i = 0; i < opts.Tabs.length; i++) { 124 for (var j = 0; j < opts.Tabs[i].TabModules.length; j++) { 125 if ($('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).children().size() == 0) 126 continue; 127 $('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).children().last(
127).hide(); 128 129 } 130 if (opts.Tabs[i].DefaultTab) 131 defaultTabId = opts.Tabs[i].TabId; 132 } 133 134 for (var i = 0; i < opts.Tabs.length; i++) { 135 136 // tabs with static content and URLs already handled in xsl template 137 if (opts.Tabs[i].Contents || opts.Tabs[i].TabUrl) 138 continue; 139 140 var _pnl = $('#tptab' + opts.Tabs[i].TabId); 141 var _pnlContent = $("<div id='" + Math.random().toString(16).slice(2, 10) + "'></div>"); //need the id for moduleActions(dnn) 142 143 if (opts.Tabs[i].DisplayAccordion) { 144 _pnlContent.append('<div class="panel-group tp-inner-accordion" id="tpInnerAccordion' + opts.Tabs[i].TabId + '"></div>'); 145 } 146 147 for (var j = 0; j < opts.Tabs[i].TabModules.length; j++) { 148 if (!$('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).size() == 0 && $('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).children().size() == 0) 149 continue; 150 151 var mod = $('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId); 152 if (mod.find('.dnnsharp-container').length) 153 mod.find('.dnnsharp-container').addClass('tabsProC'); 154 else 155 mod.children(':last').addClass('tabsProC'); 156 157 // prevent scripts from running again, except module actions which need reinitialization 158 //mod.find('script').not(':contains(dnnModuleActions)').remove(); 159 mod.find('script').remove(); 160 mod.find('.dnnDragHint').remove(); 161 mod.attr('data-mid', opts.Tabs[i].TabModules[j].ModuleId); 162 163 if (opts.Tabs[i].DisplayAccordion) { 164 var panel = $('<div class="panel panel-default ignore-events"></div>').appendTo(_pnlContent.children('.panel-group')); 165 // append header 166 panel.append('<div class="panel-heading"><h4 class="panel-title"><a class="accordionLink ignore-events " data-toggle="collapse" data-parent="#tpInnerAccordion' + opts.Tabs[i].TabId 167 + '" href="javascript:void(0)" data-target="#tpCollapseInner' + opts.Tabs[i].TabModules[j].ModuleId + '">' + (opts.Tabs[i].TabModules[j].DisplayTitle ? opts.Tabs[i].TabModules[j].ModuleTitle : '') + '</a></h4></div>'); 168 if (!opts.Tabs[i].TabModules[j].DisplayTitle) 169 panel.find('a.accordionLink').addClass('empty-link'); 170 // append body 171 var body = $('<div data-child="true" id="tpCollapseInner' + opts.Tabs[i].TabModules[j].ModuleId 172 + '" class="panel-collapse collapse ignore-events ' + (j == 0 ? 'in' : '') + '"><div class="panel-body" id="' + Math.random().toString(16).slice(2, 10) + '"></div></div>').appendTo(panel) 173 .children().append(mod); //random id for dnn moduleActions 174 } else { 175 _pnlContent.append(mod); 176 } 177 178 $("a[name=" + opts.Tabs[i].TabModules[j].ModuleId + "]").remove(); 179 180 if (opts.isAdmin || opts.Tabs[i].TabModules[j].DisplayTitle && !opts.Tabs[i].DisplayAccordion) { 181 mod.find('.tp-module-header').addClass('well'); 182 } else { 183 mod.find('.tp-module-header').remove(); 184 } 185 186 } 187 188 if (opts.Tabs[i].StackDirection == 'horizontal' || opts.Tabs[i].StackDirection == 1) { 189 _pnlContent.css("display", "inline-flex").find('.tabsProC').addClass('tabsProC-left').css("display", "inline-block"); 190 _pnlContent.append("<div style='clear: both;'></div>"); 191 } 192 _pnl.append(_pnlContent); 193 194 $.each($('.tabsProC'), function (i, v) { 195 $(v).attr('class', 'tabsProC dnnsharp-container') 196 $(v).css({ 'padding': '4px', 'overflow': 'visible', 'display': 'block' }); 197 198 setTimeout(function () { 199 if ($(v).find(".eipbackimg.containerTitle").length) { 200 var id = $(v).find(".eipbackimg.containerTitle").parents().eq(1).find("span").attr("id"), 201 title = $("#" + id).html(); 202 $(id).replaceWith($('<div class="tp-module-header well">' + title + '</div>')); 203 dnn.controls.initLabelEdit($(id)); 204 } 205 }, 1000); 206 }); 207 } 208 209 // render as accordion or tabs 210 if (opts.EffectiveLayout == 4) { // 'accordion') { 211 tpRenderAccordion(this, opts); 212 changeAccordionState(getAccordions(opts)); 213 $(opts.pnlDlgSelector).attr('data-layout', 'accordion'); 214 } else { 215 tpRenderTabs(this, opts); 216 changeTabState(getTabs(opts)); 217 $(opts.pnlDlgSelector).attr('data-layout', 'tab'); 218 } 219 $(opts.pnlDlgSelector).attr('data-mid', opts.ModuleId); 220 $(opts.pnlDlgSelector).attr('data-page-query', opts.dnnPageQuery); 221 222 var _this = this; 223 var fnHashChange = function () { 224 225 if (_hashLockNext) { 226 _hashLockNext = false; 227 return; 228 } 229 230 // select this item 231 var activeItem = getActiveItem(_this, opts); 232 activeItem = activeItem == -1 ? 0 : activeItem; 233 activeItem = getAvailableItem(activeItem, opts); 234 var selItem; 235 if (activeItem != -1) { 236 if (opts.EffectiveLayout == 4) { // 'accordion') { 237 $(".collapsing").one('shown.bs.collapse', function () { 238 selItem = _this.find('.accordion-root>div>.panel-collapse:eq(' + activeItem + ')'); 239 selItem.collapse('show'); 240 }); 241 } else { 242 selItem = _this.find('.tabs-root>li>a:eq(' + activeItem + ')'); 243 selItem.tab('show'); 244 } 245 } 246 247 // scroll tab header into view 248 if (opts.AutoScroll.Value && selItem && selItem.size() && !elementInViewport(selItem[0], window.innerHeight / 2)) { 249 $('html, body').scrollTop(selItem.offset().top - 40); 250 } 251 window.TabsPro = window.TabsPro || {}; 252 window.TabsPro[opts.ModuleId] = opts.Tabs; 253 254 }; 255 $(window).hashchange(fnHashChange); 256 fnHashChange(); 257 // OnTabLeave 258 $(opts.pnlDlgSelector + ' .nav-tabs a').on('show.bs.tab', function (e, data) { 259 if (!data) 260 return; 261 var modules = opts.Tabs; 262 e.relatedTarget = e.relatedTarget || data.relatedTarget; 263 e.currentTarget = e.currentTarget || data.currentTarget; 264 //indentify current tab; 265 var currentTab = true; 266 if (!e.relatedTarget) 267 currentTab = null; 268 if (currentTab) { 269 $.each(getTabs(opts), function (index, value) { 270 if (value.control.attr('href') == $(e.relatedTarget || e.currentTarget).attr('href')) { 271 currentTab = index; 272 } 273 }); 274 275 //Modules from it 276 var targetModuleListLeave = []; 277 $.each(opts.Tabs[currentTab].TabModules, function (index, value) { 278 targetModuleListLeave.push(value.ModuleId); 279 }); 280 } 281 var nextTab; 282 $.each(getTabs(opts), function (index, value) { 283 if (value.control.attr('href') == $(e.currentTarget).attr('href')) { 284 nextTab = index; 285 } 286 }); 287 288 var targetModuleListEnter = []; 289 if (!opts.Tabs[nextTab].DisplayAccordion) 290 $.each(opts.Tabs[nextTab].TabModules, function (index, value) { 291 targetModuleListEnter.push(value.ModuleId); 292 }); 293 294 if (currentTab != null && !opts.waitingForBroadcast) { 295 opts.Tabs[currentTab].Reevaluate && dnnsf.api.tabspro.refreshTabPro({ mid: opts.ModuleId }); 296 //Reevaluate state 297 !dnnsf.events._listeners.OnTabsLeave && $(this).closest('.nav').removeClass('disabled-nav');// fix tabspro crazyness 298 if (dnnsf.events._listeners.OnTabsLeave) 299 setTimeout(function () { 300 301 e.preventDefault(); 302 e.stopImmediatePropagation(); 303 304 opts.waitingForBroadcast = true; 305 //Broadcast event 306 dnnsf.events.broadcast('OnTabsLeave', { 'targetModuleList': targetModuleListLeave }, function (responses) { 307 var switchTab = true; 308 var refreshTabsPro = false; 309 responses && $.each(responses, function (index, response) { 310 if (response.value != true) { 311 switchTab = false; 312 } 313 if (response.refresh != false) { 314 refreshTabsPro = true; 315 } 316 }) 317 if (switchTab) { 318 var target = $(e.currentTarget).is('body') ? e.target || e.relatedTarget : e.currentTarget || e.relatedTarget; 319 // $(e.currentTarget || e.relatedTarget).tab('show'); 320 $(target).tab('show'); 321 dnnsf.api.tabspro.changeTab({ mid: opts.ModuleId, viewOrder: nextTab, refresh: refreshTabsPro, qs: opts.qs }, EnterTab); 322 function EnterTab(tabId) { 323 targetModuleListEnter = []; 324 $.each(opts.Tabs[tabId].TabModules, function (index, value) { 325 targetModuleListEnter.push(value.ModuleId); 326 }); 327 responses && dnnsf.events.broadcast('OnTabsEnter', { 'targetModuleList': targetModuleListEnter, qs: opts.qs }, function (responses) { });
328 } 329 //opts.waitingForBroadcast = false; 330 } 331 else { 332 e.relatedTarget && $(e.relatedTarget).tab('show'); 333 } 334 }); 335 }, 0); 336 else { 337 $(e.currentTarget).tab('show'); 338 } 339 } 340 }); 341 342 $(opts.pnlDlgSelector + ' .collapse,' + opts.pnlDlgSelector + ' .collapsing').not('.ignore-events').on('show.bs.collapse', function (e) { 343 if ($(e.target).hasClass('ignore-events')) 344 return; 345 var modules = opts.Tabs; 346 //indentify current tab; 347 var currentTab; 348 var accordions = getAccordions(opts); 349 var activeAccordion = getActiveAccordion($(e.currentTarget).closest('.bstrap30')); 350 if (activeAccordion == null) { 351 targetModuleListEnter = []; 352 var parentDiv = $(e.currentTarget).closest('.accordion-root'); 353 if (!parentDiv.length) 354 return; 355 var tabIndex = $(e.currentTarget).closest('.panel').index(); 356 if (tabIndex == -1) 357 tabIndex = 0; 358 $.each(opts.Tabs[tabIndex].TabModules, function (index, value) { 359 targetModuleListEnter.push(value.ModuleId); 360 }); 361 dnnsf.events.broadcast('OnTabsEnter', { 'targetModuleList': targetModuleListEnter }, function (responses) { }); 362 return; 363 } 364 var activeAccordionControll = getAccordions(opts)[activeAccordion].control; 365 $.each(getAccordions(opts), function (index, value) { 366 if (value.control.attr('data-target') == activeAccordionControll.attr('data-target')) { 367 currentTab = index; 368 } 369 }); 370 //Modules from it 371 var targetModuleListLeave = []; 372 $.each(opts.Tabs[currentTab].TabModules, function (index, value) { 373 targetModuleListLeave.push(value.ModuleId); 374 }); 375 376 var nextTab; 377 $.each(getAccordions(opts), function (index, value) { 378 if (value.control.attr('data-target') == '#' + $(e.currentTarget).attr('id')) { 379 nextTab = index; 380 } 381 }); 382 383 var targetModuleListEnter = []; 384 $.each(opts.Tabs[nextTab].TabModules, function (index, value) { 385 targetModuleListEnter.push(value.ModuleId); 386 }); 387 388 if (!opts.waitingForBroadcast) { 389 //Reevaluate state 390 opts.Tabs[currentTab].Reevaluate && dnnsf.api.tabspro.refreshTabPro({ mid: opts.ModuleId }); 391 392 e.preventDefault(); 393 e.stopImmediatePropagation(); 394 395 opts.waitingForBroadcast = true; 396 //Broadcast event 397 dnnsf.events.broadcast('OnTabsLeave', { 'targetModuleList': targetModuleListLeave }, function (responses) { 398 var switchTab = true; 399 var refreshTabsPro = false 400 responses && $.each(responses, function (index, response) { 401 if (response.value != true) { 402 switchTab = false; 403 } 404 if (response.refresh != false) { 405 refreshTabsPro = true; 406 } 407 }) 408 if (switchTab) { 409 if ($(e.relatedTarget || e.currentTarget).attr('data-child')) { 410 $(e.relatedTarget || e.currentTarget).collapse('show'); 411 return; 412 } 413 $(e.relatedTarget || e.currentTarget).tab('show'); 414 $(e.relatedTarget || e.currentTarget).collapse('show'); 415 dnnsf.api.tabspro.changeTab({ mid: opts.ModuleId, viewOrder: nextTab, refresh: refreshTabsPro }, EnterTab); 416 function EnterTab(tabId) { 417 targetModuleListEnter = []; 418 $.each(opts.Tabs[tabId].TabModules, function (index, value) { 419 targetModuleListEnter.push(value.ModuleId); 420 }); 421 responses && dnnsf.events.broadcast('OnTabsEnter', { 'targetModuleList': targetModuleListEnter }, function (responses) { });
422 } 423 } 424 // opts.waitingForBroadcast = false; 425 426 }); 427 } 428 }); 429 //console.log(opts.tabInit); 430 431 this.find('.tabsProC').show().parent().show(); 432 433 // set absolute URLs 434 this.find('[data-absurl]').each(function () { 435 $(this).attr('href', $(this).attr('data-absurl')); 436 $(this).unbind('click').unbind('click.tabs'); 437 }); 438 439 // show tabs pro containers outside tabs 440 $('.tabsProC').not(this.find('.tabsProC')).show(); 441 442 this.find('[data-absurl]').click(function () { 443 window.location = $(this).attr('data-absurl'); 444 return false; 445 }); 446 447 tpRenderDlg(opts); 448 return this; 449 } 450 451 function tpRenderDlg(opts) { 452 if (!opts.dlgShow) 453 return; 454 455 $(opts.pnlDlgSelector).dialog({ 456 autoOpen: false, 457 width: opts.Dlg_ContentWidth.Value, 458 resizable: false, 459 modal: opts.Dlg_Modal.Value, 460 title: opts.ModuleTitle 461 }).parents('.ui-dialog:first').wrap("<div class='" + opts.ThemeId + "'></div>"); 462 463 $(opts.pnlDlgSelector).find('.tabPnl').height(opts.Dlg_ContentHeight.Value); 464 } 465 466 467 function getActiveItem(el, opts) { 468 // first, check the bookmarks, since these also reflect navigation around tabs on client side 469 if (opts.PersistInUrl.Value && location.hash.length) { 470 if (location.hash.indexOf('tptab') == 1) { 471 var tabIndex; 472 var tabId = location.hash.substr(6); 473 $.each(opts.Tabs, function (i, tab) { 474 if (tab.TabId.toString() == tabId) { 475 tabIndex = i; 476 return false; 477 } 478 }); 479 return tabIndex != null ? tabIndex : tabId; // len of tptab 480 } 481 482 var selItem = el.find('[data-bookmark="' + location.hash.match(/#?\/?(.+)/)[1] + '"]'); 483 if (opts.EffectiveLayout != 4) { 484 if (selItem.length) 485 return selItem.parent().children().index(selItem) - 1; 486 } else { 487 return selItem.parent().parent().parent().parent().children().index(selItem.parent().parent().parent()); 488 } 489 } 490 491 // if persist in cookies, that takes precendece over postback, since cookies persist on postback as well 492 if (opts.PersistInCookies.Value && $.cookie('tabsPro' + opts.ModuleId)) 493 return parseInt($.cookie('tabsPro' + opts.ModuleId)); 494 495 // next, load persist on postback 496 var hdnActive = $(opts.hdnActiveTabSelector); 497 if (opts.PersistOnPostback.Value && !isNaN(parseInt(hdnActive.val()))) 498 return parseInt(hdnActive.val()); 499 500 // if we got here, we have to fallback to default 501 if ((!opts.IsCollapsible.Value || !opts.IsCollapsedInitially.Value) && defaultTabId != '') { 502 if (opts.EffectiveLayout == 4) { 503 var selectedTab = $('#tpHead' + defaultTabId).parent(); 504 var parentDiv = $(selectedTab).parent(); 505 return parseInt($(parentDiv).children().index($(selectedTab))); 506 } else { 507 var parentTab = $('#tpHead' + defaultTabId).parent(); 508 return parseInt(parentTab.children().index($('#tpHead' + defaultTabId))); 509 } 510 } 511 512 //return intial tab: if not initially collapsed 513 if (!opts.IsCollapsedInitially.Value) 514 return 0; 515 516 return null; 517 } 518 519 function getActiveAccordion(parent) { 520 var ret = $(parent).find('.collapse').not('.ignore-events').index($('[aria-expanded="true"]')); 521 // var accs = $(parent).find('.collapse').not('.ignore-events'); 522 // var el = $(parent).find('.collapse.in'); 523 // if (!el.length) 524 // return null; 525 526 // $.each(accs, function (index, value) { 527 // if (value == (el.length ? el[0] : el.context)) { 528 // ret = index; 529 // return false; 530 // } 531 // }); 532 return ret >= 0 ? ret : null; 533 } 534 535 function getActiveTab(parent) { 536 var ret; 537 $.each($(parent).find('.tabButton'), function (index, value) { 538 if ($(value).hasClass('active')) { 539 ret = index; 540 } 541 }); 542 return ret; 543 } 544 545 function getAvailableItem(activeItem, opts) { 546 if (!opts.Tabs.length) return 0; 547 if (activeItem && (opts.Tabs[activeItem].IsEnabled == false || opts.Tabs[activeItem].IsShown == false)) { 548 var i = activeItem; 549 for (i; i >= 0; i--) { 550 if (opts.Tabs[i].IsEnabled != false && opts.Tabs[i].IsShown != false) { 551 return i; 552 break; 553 } 554 }; 555 i = activeItem; 556 for (i; i < opts.Tabs.length; i++) { 557 if (opts.Tabs[i].IsEnabled != false && opts.Tabs[i].IsShown != false) { 558 return i; 559 break; 560 } 561 } 562 } else { 563 return activeItem; 564 } 565 } 566 567 function loadModules(pnlTabs, opts, qs) { 568 var tpSettings = dnnsf['tp-' + opts.ModuleId]; 569 setTimeout(function () { 570 var isAccordion, gridModules; 571 isAccordion = (tpSettings.TabsLayout.Value == 4 || (tpSettings.AccordionOnMobile.Value && tpSettings.IsMobile)); 572 gridModules = isAccordion ? $('.panel-collapse.in').find('div[data-ngbootstrap]') : $('.tab-pane.active').find('div[data-ngbootstrap]'); 573 if (!gridModules.length) return; 574 _.forEach(gridModules, function (module, key) { 575 var app = $(module).attr('data-ngbootstrap'); 576 try {
577 if (!window.dnnsfAngular15.element(module).scope()) 578 window.dnnsfAngular15.bootstrap(module, [app]); 579 window.dnnsfAngular15.element(module).scope().$broadcast('TabsProEvent', !$.isEmptyObject(qs) && qs); 580 } catch (e) {// old grid with new tabspro and new form 581 if (!window.angular.element(module).scope()) 582 window.angular.bootstrap(module, [app]); 583 window.angular.element(module).scope().$broadcast('TabsProEvent', !$.isEmptyObject(qs) && qs); 584 } 585 586 }); 587 }, 500); 588 } 589 590 function tpRenderTabs(pnlTabs, opts) { 591 592 // initialize tabs 593 pnlTabs.find('.tabs-root>li>a.tabLink').click(function (e, params) { 594 $(this).removeClass('has-error'); 595 596 if (dnnsf.events._listeners.OnTabsLeave) { !$(this).parent().hasClass('active') && $(this).closest('.nav').addClass('disabled-nav'); } 597 598 setTimeout(function () { 599 $(opts.pnlDlgSelector).find('.nav').removeClass('disabled-nav'); // failsafe for when tabspro decides to set disabled-nav permanently which happens in very rare occasions 600 }, 1500) 601 602 if (params && params.fromChangeTab) { 603 $(this).data('fromChangeTab', true); 604 $.each(getTabs(opts), function (index, value) { 605 value.control.removeClass('disabled'); 606 }); 607 } 608 opts.waitingForBroadcast = false; 609 if (params && params.qs) { 610 opts.qs = params.qs; 611 loadModules(this, opts, opts.qs); 612 } 613 if (!$('.modal').has(e.target).length && params && !$.isEmptyObject(params.qs)) { 614 updateQs(params); 615 } 616 e.preventDefault(); 617 e.stopImmediatePropagation(); 618 currentHash = location.hash; 619 var itemIndex; 620 if (opts.OpenAction.Value == 0 && opts.IsCollapsible.Value && $(this).parent().hasClass('active') && opts.TabsLayout.Value == 4) { 621 $(this).parent().removeClass('active'); 622 $($(this).attr('href')).removeClass('active'); 623 itemIndex = 1; 624 } else if (opts.IsCollapsible.Value && e.target !== $(this)[0] && e.target !== $($(this).attr('href'))[0] && !$(".actionMenu").has(e.target).length) { 625 $(this).parent().removeClass('active'); 626 $($(this).attr('href')).removeClass('active'); 627 itemIndex = 1; 628 } else { 629 if (!$(this).parent().hasClass('active')) 630 loadModules(pnlTabs, opts); 631 var ev = { relatedTarget: $(this).parent().siblings('.active').find('a')[0], currentTarget: e.currentTarget }; 632 $(this).trigger('show.bs.tab', [ev]); 633 itemIndex = $(this).closest('ul').children().index($(this).parent()); 634 } 635 var tab = $(this); 636 637 // setup persistence 638 setTimeout(function () { 639 persist(opts, tab, itemIndex, $(tab.attr('href')).attr('data-bookmark')); 640 }, 300) 641 642 }); 643 644 // load active tab 645 var activeItem = getActiveItem(pnlTabs, opts); 646 if (activeItem >= 0) { 647 pnlTabs.find('.tabs-root>li>a:eq(' + activeItem + ')').tab('show'); 648 loadModules(pnlTabs, opts); 649 } 650 else if (opts.IsCollapsedInitially.Value) 651 pnlTabs.find('.tab-pane').removeClass('active in'); 652 653 pnlTabs.find('.tabButton').click(function (e) { 654 refreshIframes($(this).children('a').attr('href')); 655 e.preventDefault(); 656 }); 657 658 if (opts.OpenAction.Value == 1 || opts.OpenAction.Value == 'hover') { 659 pnlTabs.find('ul > li > a.tabLink').mouseenter(function () { 660 $(this).click(); 661 $($(this).attr('href')).mouseenter(function (e) { 662 e.preventDefault(); 663 $("[href=#" + $(this).attr('id') + "]").click(); 664 }) 665 }); 666 } 667 } 668 669 function persist(opts, elHeader, itemIndex, bookmark) { 670 671 elHeader = $(elHeader); 672 673 var anchorParent = elHeader.parent(); 674 elHeader.hasClass('active') && !anchorParent.hasClass('active') && anchorParent.addClass('active'); 675 676 // setup cookie persistence 677 if (opts.PersistInCookies.Value) 678 $.cookie('tabsPro' + opts.ModuleId, itemIndex, { "path": "/", "expires": 365 }); 679 680 // setup urls persistence 681 setTimeout(function () { 682 if (opts.PersistInUrl.Value && (anchorParent.hasClass('active') || $($(elHeader).attr('data-target')).attr('aria-expanded'))) { 683 _hashLockNext = true; 684 if (location.hash.replace(/\//g, '') !== ('#' + bookmark)) 685 location.hash = '#' + (itemIndex != -1 ? bookmark : '_'); 686 } else { 687 return false; 688 689 } 690 }, 300); 691 692 693 // setup postback persistence 694 if (opts.PersistOnPostback.Value) 695 $(opts.hdnActiveTabSelector).val(itemIndex); 696 697 698 // scroll tab header into view 699 if (opts.AutoScroll.Value && !elementInViewport(elHeader, window.innerHeight / 2)) { 700 $('html, body').animate({ 701 scrollTop: elHeader.offset().top - 40 702 }, 500); 703 } 704 705 // log current tab in google analytics 706 if (typeof (_gaq) != 'undefined') { 707 //console.log('push to google analytics'); 708 if (bookmark) {
709 _gaq.push(['_trackPageview', window.location.pathname + '/' + bookmark]); 710 } else { 711 _gaq.push(['_trackPageview', window.location.pathname + '/']); 712 } 713 } 714 715 } 716 717 function tpRenderAccordion(pnlTabs, opts) { 718 719 // initialize accordion 720 pnlTabs.find('>.accordion-root>.panel>.panel-collapse').collapse({ 721 parent: '.panel-group' + opts.ModuleId, 722 toggle: false 723 }); 724 725 // setup height 726 if (opts.PanelHeight.Value > 0) { 727 pnlTabs.find('.tabPnl').css('height', opts.PanelHeight.Value); 728 pnlTabs.find('>.accordion-root>div>.panel-collapse>div>div').css({ 'overflow': 'auto' }); 729 } 730 731 // load active item 732 var activeItem = getActiveItem(pnlTabs, opts); 733 if (activeItem >= 0) 734 pnlTabs.find('.accordion-root .panel-collapse:eq(' + activeItem + ')').collapse('show'); 735 loadModules(pnlTabs, opts); 736 // setup navigation 737 pnlTabs.find('.accordionLink').not('.ignore-events').click(function (e, params) { 738 if ($(e.currentTarget).parent().hasClass('disabled')) { 739 e.preventDefault(); 740 return false; // fix for internet explorer, pointer-events:none 741 } 742 opts.waitingForBroadcast = false; 743 // select current item 744 var itemIndex = pnlTabs.find('.accordion-root>div>.panel-heading a').index($(this)); 745 var panel = $($(this).attr('data-target')); 746 747 // check if item is already open 748 // if (panel.hasClass('in')) { 749 750 // if (!opts.IsCollapsible.Value) 751 // return false; 752 // itemIndex = -1; 753 // } 754 755 756 if (opts.IsCollapsible.Value) { 757 panel.collapse('toggle'); 758 } else { 759 panel.collapse('show'); 760 pnlTabs.find('.accordion-root .panel-collapse[aria-expanded="true"]').not('.ignore-events').not(panel).not('.collapsing').collapse('hide') 761 } 762 // $($(this).attr('data-target')).collapse(opts.IsCollapsible.Value ? 'toggle' : 'show'); 763 764 // setup persistence 765 setTimeout(function () { 766 persist(opts, $(e.relatedTarget || e.currentTarget), itemIndex, panel.find('>div>div').attr('data-bookmark')); 767 }, 100) 768 769 refreshIframes($(this).attr('data-target')); 770 loadModules(pnlTabs, opts); 771 return false; 772 }); 773 774 775 } 776 777 function refreshIframes(tabs) { 778 // this is for google map issue in tab 779 //Warning: It refresh all iframe (iframe which you dont want to refresh add a class 'donotrefresh') 780 var iframes = $(tabs).find('iframe:not(.donotrefresh)'); 781 for (var i = 0; i < iframes.length; i++) { 782 $(iframes[i]).attr('src', $(iframes[i]).attr('src')); 783 // avoid re-refresh of iframe 784 $(iframes[i]).addClass('donotrefresh'); 785 } 786 } 787 788 789 //get Tabs and match them with settings 790 function getTabs(opts) { 791 var tabs = []; 792 $.each($(opts.pnlDlgSelector).find('.tabLink'), function (index, value) { 793 tabs.push({ 'control': $(opts.pnlDlgSelector).find('.tabLink').eq(index), 'settings': opts.Tabs == undefined ? {} : opts.Tabs[index] }); 794 }); 795 return tabs; 796 } 797 //Change Tab State 798 function changeTabState(tabs) { 799 $.each(tabs, function (index, tab) { 800 //check for Enable 801 if (tab.settings.IsEnabled == true || tab.settings.IsEnabled == null) { 802 tab.control.parent().removeClass('disabled'); 803 } 804 else { 805 tab.control.parent().addClass('disabled'); 806 } 807 //check for Show 808 if (tab.settings.IsShown == true || tab.settings.IsShown == null) { 809 tab.control.css('display', 'block'); 810 //$(tab.control.attr('href')).css('display', 'block'); 811 } 812 else { 813 tab.control.css('display', 'none'); 814 //$(tab.control.attr('href')).css('display', 'none'); 815 } 816 }) 817 } 818 //get Accordions and match them with settings 819 function getAccordions(opts) { 820 var accordions = []; 821 $.each($(opts.pnlDlgSelector).find('.accordionLink').not('.ignore-events'), function (index, value) { 822 accordions.push({ 'control': $(opts.pnlDlgSelector).find('.accordionLink').not('.ignore-events').eq(index), 'settings': opts.Tabs == undefined ? {} : opts.Tabs[index] }); 823 }); 824 return accordions; 825 } 826 //Change Accordion State 827 function changeAccordionState(accordions) { 828 $.each(accordions, function (index, accordion) { 829 if (!accordion.settings) 830 return; 831 //check for Enable 832 if (accordion.settings.IsEnabled == true || accordion.settings.IsEnabled == null) { 833 accordion.control.parent().removeClass('disabled'); 834 } 835 else { 836 accordion.control.parent().addClass('disabled'); 837 } 838 //check for show 839 if (accordion.settings.IsShown == true || accordion.settings.IsShown == null) { 840 accordion.control.closest('.panel').css('display', 'block'); 841 } 842 else { 843 accordion.control.closest('.panel').css('display', 'none'); 844 } 845 }) 846 } 847 848 //Public API 849 dnnsf.api.tabspro = { 850 refreshTabPro: function (params, done) { 851 try { 852 var opts = { 'pnlDlgSelector': '#' + $('div[data-mid=' + params.mid + ']').attr('id'), ModuleId: params.mid }; 853 opts.dnnPageQuery = $('div[data-mid=' + params.mid + ']').attr('data-page-query'); 854 //get Query of dnn 855 var dnnQuery = dnnsf.getUrlParts(dnnsf.getUrlParts().getUrl() + '?' + opts.dnnPageQuery).query; 856 //get our Query 857 var pageQuery = dnnsf.getUrlParts(window.location).query; 858 //Merge QueryStrings 859 var currentLink = dnnsf.getUrlParts(''); 860 861 var tabIdKey = _.head(_.keys(_.pickBy(dnnQuery, function (val, key, obj) { return key.match(/tabid/i); }))); 862 currentLink.query = $.extend(dnnQuery, pageQuery, 863 params.qs && !$.isEmptyObject(params.qs) && params.qs, 864 { _alias: dnnsf.alias }, { _mid: params.mid }, { _tabid: dnnQuery[tabIdKey] }); 865 866 delete currentLink.query[tabIdKey]; 867 868 //Get Tab State 869 $.get("//" + dnnsf.alias + "/DesktopModules/DnnSharp/TabsPro/API/settings/EvaluateTabStates", 870 currentLink.query 871 ) 872 .done(function (data) { 873 opts.Tabs = data; 874 //tabs 875 if (done) { 876 done(getAvailableItem(params.tabId, opts)); 877 } 878 if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') { 879 params.tabId = params.tabId == undefined ? getActiveTab(opts.pnlDlgSelector) : params.tabId; 880 setTimeout(function () { 881 changeTabState(getTabs(opts)); 882 }, 0); 883 dnnsf.api.tabspro.changeTab({ 'mid': params.mid, 'viewOrder': getAvailableItem(params.tabId, opts), 'refresh': false, 'qs': params.qs || '' }); 884 return getTabs(opts); 885 } 886 //accordion 887 if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') { 888 params.tabId = params.tabId == undefined ? getActiveAccordion(opts.pnlDlgSelector) : params.tabId; 889 changeAccordionState(getAccordions(opts)); 890 dnnsf.api.tabspro.changeTab({ 'mid': params.mid, 'viewOrder': getAvailableItem(params.tabId, opts), 'refresh': false }); 891 return getAccordions(opts); 892 } 893 }); 894 } 895 catch (e) { 896 return e; 897 } 898 }, 899 changeTab: function (params, done) { 900 params.fromChangeTab = true; 901 try { 902 var opts = { 'pnlDlgSelector': '#' + $('div[data-mid=' + params.mid + ']').attr('id'), ModuleId: params.mid }; 903 var viewOrderTabId; 904 if (!$(opts.pnlDlgSelector).length) 905 return waitForTp(params, done, opts); 906 if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') { 907 var elems = getTabs(opts); 908 $.each(elems, function (index, value) { 909 if (parseInt(value.control.attr('href').split('#tptab')[1]) == params.tabId) { 910 viewOrderTabId = index; 911 } 912 }); 913 } 914 if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') { 915 var elems = getAccordions(opts); 916 $.each(elems, function (index, value) { 917 if (parseInt(value.control.attr('data-target').split('#tptabRoot')[1]) == params.tabId) { 918 viewOrderTabId = index; 919 } 920 }); 921 } 922 if (params.viewOrder != null) { 923 params.tabId = params.viewOrder; 924 } else { 925 params.tabId = viewOrderTabId; 926 } 927 var elems; 928 if (params.refresh == true) { 929 dnnsf.api.tabspro.refreshTabPro(params, done); 930 } else { 931 if (done) { 932 done(params.viewOrder); 933 } 934 //tabs 935 if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') { 936 elems = getTabs(opts); 937 //elems[params.tabId].control.tab('show'); 938 !elems[params.tabId].control.parent().hasClass('active') && elems[params.tabId].control.trigger('click', params); 939 return { control: elems[params.tabId].control, tabId: params.tabId } 940 } 941 //accordion 942 if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') { 943 elems = getAccordions(opts); 944 elems[params.tabId].control.closest('.panel').find('.collapse').collapse('show'); 945 elems[params.tabId].control.click(); 946 if (params && !$.isEmptyObject(params.qs)) { 947 updateQs(params); 948 } 949 return { control: elems[params.tabId].control, tabId: params.tabId } 950 } 951 getAvailableItem(params.tabId, opts); 952 953 } 954 setTimeout(function () { 955 $(opts.pnlDlgSelector).find('.nav').removeClass('disabled-nav'); 956 }, 0) 957 } 958 catch (e) { 959 return e; 960 } 961 }, 962 isModalOpen: {}, 963 showLoading: {}, 964 openModal: function (params) { 965 dnnsf.api.tabspro.showLoading['tabsPopup' + params.mid] && $('#dnn_ctr' + params.mid + '_Main_pnlDialog .common-loading-container').first().show(); 966 967 if (!dnnsf.api.tabspro.isModalOpen['tabsPopup' + params.mid]) { 968 969 dnnsf.api.tabspro.isModalOpen['tabsPopup' + params.mid] = true; 970 971 $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').on('hidden.bs.modal', function () { 972 dnnsf.api.tabspro.isModalOpen['tabsPopup' + params.mid] = false; 973 $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').off('hidden.bs.modal'); 974 }); 975 976 var opts = { 'pnlDlgSelector': '#' + $('div[data-mid=' + params.mid + ']').attr('id'), TabsLayout: { Value: '' }, ModuleId: params.mid } 977 var tabs = getTabs(opts); 978 var index; 979 if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') { 980 index = getActiveTab(opts.pnlDlgSelector); 981 } 982 if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') { 983 index = getActiveAccordion(opts.pnlDlgSelector); 984 opts.TabsLayout.Value = 4; 985 } 986 if (index != undefined) { 987 var targetModuleListLeave = []; 988 $.each(window.TabsPro[params.mid][index].TabModules, function (index, value) { 989 targetModuleListLeave.push(value.ModuleId); 990 }); 991 dnnsf.events.broadcast('ActionFormPing', { 'targetModuleList': targetModuleListLeave }, function (responses) { 992 responses && $.each(responses, function (index, mid) { 993 dnnsf.api.actionForm.initForm(mid, params.params); 994 }); 995 996 }); 997 } 998 return setTimeout(function () {
999 loadModules(this, opts, params.params); 1000 $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').modal(); 1001 }, 300); 1002 } 1003 }, 1004 closeModal: function (params) { 1005 return $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').modal('hide'); 1006 }, 1007 }; 1008 function waitForTp(params, done, opts) { 1009 var i = 0; 1010 var checkIfLoaded = setInterval(function () { 1011 i++; 1012 if ($('div[data-mid=' + params.mid + ']').length || i > 100) { 1013 dnnsf.api.tabspro.changeTab(params, done); 1014 clearInterval(checkIfLoaded); 1015 } 1016 }, 100) 1017 } 1018})(dnnsfjQuery); 1019 1020 1021
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.