Skip to content

Commit 41e511e

Browse files
committed
Preserve js data for accordion heading. Dynamic Tab Labels (Values) Doesn't Load In Accordion Views close #21
1 parent 4c6685f commit 41e511e

File tree

1 file changed

+48
-18
lines changed

1 file changed

+48
-18
lines changed

bootstrap-tabcollapse.js

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,18 @@
2626
TabCollapse.DEFAULTS = {
2727
accordionClass: 'visible-xs',
2828
tabsClass: 'hidden-xs',
29-
accordionTemplate: function(heading, groupId, parentId, active){
30-
return '<div class="panel panel-default">' +
31-
' <div class="panel-heading">' +
32-
' <h4 class="panel-title">' +
33-
' <a class="' + (active ? '' : 'collapsed') + '" data-toggle="collapse" data-parent="#' + parentId + '" href="#' + groupId + '">' +
34-
' ' + heading +
35-
' </a>' +
36-
' </h4>' +
37-
' </div>' +
38-
' <div id="' + groupId + '" class="panel-collapse collapse ' + (active ? 'in' : '') + '">' +
39-
' <div class="panel-body js-tabcollapse-panel-body">' +
40-
' </div>' +
41-
' </div>' +
42-
'</div>';
29+
accordionTemplate: function(heading, groupId, parentId, active) {
30+
return '<div class="panel panel-default">' +
31+
' <div class="panel-heading">' +
32+
' <h4 class="panel-title">' +
33+
' </h4>' +
34+
' </div>' +
35+
' <div id="' + groupId + '" class="panel-collapse collapse ' + (active ? 'in' : '') + '">' +
36+
' <div class="panel-body js-tabcollapse-panel-body">' +
37+
' </div>' +
38+
' </div>' +
39+
'</div>'
40+
4341
}
4442
};
4543

@@ -54,8 +52,17 @@
5452
};
5553

5654
TabCollapse.prototype.showTabs = function(){
55+
var view = this;
5756
this.$tabs.trigger($.Event('show-tabs.bs.tabcollapse'));
5857

58+
var $panelHeadings = this.$accordion.find('.js-tabcollapse-panel-heading').detach();
59+
$panelHeadings.each(function() {
60+
var $panelHeading = $(this),
61+
$parentLi = $panelHeading.data('bs.tabcollapse.parentLi');
62+
view._panelHeadingToTabHeading($panelHeading);
63+
$parentLi.append($panelHeading);
64+
});
65+
5966
var $panelBodies = this.$accordion.find('.js-tabcollapse-panel-body');
6067
$panelBodies.each(function(){
6168
var $panelBody = $(this),
@@ -73,13 +80,35 @@
7380
var $headings = this.$tabs.find('li:not(.dropdown) [data-toggle="tab"], li:not(.dropdown) [data-toggle="pill"]'),
7481
view = this;
7582
$headings.each(function(){
76-
var $heading = $(this);
77-
view.$accordion.append(view._createAccordionGroup(view.$accordion.attr('id'), $heading));
83+
var $heading = $(this),
84+
$parentLi = $heading.parent();
85+
$heading.data('bs.tabcollapse.parentLi', $parentLi);
86+
view.$accordion.append(view._createAccordionGroup(view.$accordion.attr('id'), $heading.detach()));
7887
});
7988

8089
this.$tabs.trigger($.Event('shown-accordion.bs.tabcollapse'));
8190
};
8291

92+
TabCollapse.prototype._panelHeadingToTabHeading = function($heading) {
93+
var href = $heading.attr('href').replace(/-collapse$/g, '');
94+
$heading.attr({
95+
'data-toggle': 'tab',
96+
'href': href,
97+
'data-parent': ''
98+
});
99+
return $heading;
100+
};
101+
102+
TabCollapse.prototype._tabHeadingToPanelHeading = function($heading, groupId, parentId, active) {
103+
$heading.addClass('js-tabcollapse-panel-heading ' + (active ? '' : 'collapsed'));
104+
$heading.attr({
105+
'data-toggle': 'collapse',
106+
'data-parent': '#' + parentId,
107+
'href': '#' + groupId
108+
});
109+
return $heading;
110+
};
111+
83112
TabCollapse.prototype._checkStateOnResize = function(){
84113
var view = this;
85114
$(window).resize(function(){
@@ -100,7 +129,7 @@
100129

101130
TabCollapse.prototype._createAccordionGroup = function(parentId, $heading){
102131
var tabSelector = $heading.attr('data-target'),
103-
active = $heading.parent().is('.active');
132+
active = $heading.data('bs.tabcollapse.parentLi').is('.active');
104133

105134
if (!tabSelector) {
106135
tabSelector = $heading.attr('href');
@@ -109,7 +138,8 @@
109138

110139
var $tabPane = $(tabSelector),
111140
groupId = $tabPane.attr('id') + '-collapse',
112-
$panel = $(this.options.accordionTemplate($heading.html(), groupId, parentId, active));
141+
$panel = $(this.options.accordionTemplate($heading, groupId, parentId, active));
142+
$panel.find('.panel-heading > .panel-title').append(this._tabHeadingToPanelHeading($heading, groupId, parentId, active));
113143
$panel.find('.panel-body').append($tabPane.children('*').detach())
114144
.data('bs.tabcollapse.tabpane', $tabPane);
115145

0 commit comments

Comments
 (0)