Skip to content
This repository was archived by the owner on Oct 8, 2021. It is now read-only.

Commit c135660

Browse files
author
Gabriel Schulhof
committed
Collapsible: Implement the "enhanced" option.
1 parent 2efcb7a commit c135660

File tree

1 file changed

+59
-45
lines changed

1 file changed

+59
-45
lines changed

js/widgets/collapsible.js

Lines changed: 59 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var rInitialLetter = /([A-Z])/g;
1717

1818
$.widget( "mobile.collapsible", {
1919
options: {
20+
enhanced: false,
2021
expandCueText: null,
2122
collapseCueText: null,
2223
collapsed: true,
@@ -32,68 +33,77 @@ $.widget( "mobile.collapsible", {
3233
},
3334

3435
_create: function() {
35-
var anchor, placeholder,
36-
$el = this.element.addClass( "ui-collapsible" ),
37-
opts = this.options,
38-
heading = $el.children( opts.heading ).first(),
39-
replacementHeading = heading,
40-
content = $el.wrapInner( "<div class='ui-collapsible-content'></div>" ).children( ".ui-collapsible-content" ),
41-
accordion = $el.closest( ":jqmData(role='collapsible-set')" + ( $.mobile.collapsibleset ? ", :mobile-collapsibleset" : "" ) ).addClass( "ui-collapsible-set" );
42-
43-
// Replace collapsibleHeading if it's a legend
44-
if ( heading.is( "legend" ) ) {
45-
replacementHeading = $( "<div role='heading'>"+ heading.html() +"</div>" );
46-
placeholder = $( "<div><!-- placeholder for legend --></div>" ).insertBefore( heading );
47-
heading.remove();
48-
}
49-
50-
anchor = replacementHeading
51-
.detach()
52-
//modify markup & attributes
53-
.addClass( "ui-collapsible-heading" )
54-
.append( "<span class='ui-collapsible-heading-status'></span>" )
55-
.wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
56-
.find( "a" )
57-
.first()
58-
.addClass( "ui-btn" );
59-
60-
//drop heading in before content
61-
replacementHeading.insertBefore( content );
36+
var elem = this.element,
37+
ui = {
38+
accordion: elem
39+
.closest( ":jqmData(role='collapsible-set')" +
40+
( $.mobile.collapsibleset ? ", :mobile-collapsibleset" : "" ) )
41+
.addClass( "ui-collapsible-set" )
42+
},
43+
opts = this.options;
6244

6345
$.extend( this, {
64-
_accordion: accordion,
65-
_accordionWidget: null,
6646
_anchorClasses: "",
6747
_elClasses: "",
6848
_contentTheme: "",
69-
_ui: {
70-
placeholder: placeholder,
71-
originalHeading: heading,
72-
anchor: anchor,
73-
content: content,
74-
heading: replacementHeading
75-
}
49+
_ui: ui
7650
});
7751

52+
if ( opts.enhanced ) {
53+
ui.heading = $( ".ui-collapsible-heading", this.element[ 0 ] );
54+
ui.content = ui.heading.next();
55+
ui.anchor = $( "a", ui.heading[ 0 ] ).first();
56+
} else {
57+
this._enhance( elem, ui );
58+
this._setOptions( opts );
59+
}
60+
7861
//events
7962
this._on({
8063
"expand": "_handleExpandCollapse",
8164
"collapse": "_handleExpandCollapse"
8265
});
8366

84-
this._on( heading, {
85-
"tap": function(/* event */) {
86-
heading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
67+
this._on( ui.heading, {
68+
"tap": function() {
69+
ui.heading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
8770
},
8871

8972
"click": function( event ) {
90-
this._handleExpandCollapse( !heading.hasClass( "ui-collapsible-heading-collapsed" ) );
73+
this._handleExpandCollapse( !ui.heading.hasClass( "ui-collapsible-heading-collapsed" ) );
9174
event.preventDefault();
9275
event.stopPropagation();
9376
}
9477
});
78+
},
79+
80+
_enhance: function( elem, ui ) {
81+
elem.addClass( "ui-collapsible" );
82+
ui.originalHeading = elem.children( this.options.heading ).first(),
83+
ui.content = elem.wrapInner( "<div class='ui-collapsible-content'></div>" ).children( ".ui-collapsible-content" ),
84+
ui.heading = ui.originalHeading;
85+
86+
// Replace collapsibleHeading if it's a legend
87+
if ( ui.heading.is( "legend" ) ) {
88+
ui.heading = $( "<div role='heading'>"+ ui.heading.html() +"</div>" );
89+
ui.placeholder = $( "<div><!-- placeholder for legend --></div>" ).insertBefore( ui.originalHeading );
90+
ui.originalHeading.remove();
91+
}
9592

96-
this._setOptions( opts );
93+
ui.anchor = ui.heading
94+
.detach()
95+
//modify markup & attributes
96+
.addClass( "ui-collapsible-heading" )
97+
.append( "<span class='ui-collapsible-heading-status'></span>" )
98+
.wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
99+
.find( "a" )
100+
.first()
101+
.addClass( "ui-btn" );
102+
103+
//drop heading in before content
104+
ui.heading.insertBefore( ui.content );
105+
106+
return ui;
97107
},
98108

99109
_handleExpandCollapse: function( isCollapse ) {
@@ -131,11 +141,11 @@ $.widget( "mobile.collapsible", {
131141
// parent accordion, then from the defaults.
132142
_optionValue: function( options, name ) {
133143
var ret,
134-
accordion = this._accordion,
135-
accordionWidget = this._accordionWidget;
144+
accordion = this._ui.accordion,
145+
accordionWidget = this._ui.accordionWidget;
136146

137147
if ( accordion.length && !accordionWidget ) {
138-
this._accordionWidget = accordionWidget = accordion.data( "mobile-collapsibleset" );
148+
this._ui.accordionWidget = accordionWidget = accordion.data( "mobile-collapsibleset" );
139149
}
140150

141151
ret =
@@ -166,6 +176,10 @@ $.widget( "mobile.collapsible", {
166176
_destroy: function() {
167177
var ui = this._ui;
168178

179+
if ( this.options.enhanced ) {
180+
return;
181+
}
182+
169183
if ( ui.placeholder ) {
170184
ui.originalHeading.insertBefore( ui.placeholder );
171185
ui.placeholder.remove();
@@ -200,7 +214,7 @@ $.widget( "mobile.collapsible", {
200214
}
201215

202216
// Set corners for individual collapsibles to false when in a collapsible-set
203-
if ( this._accordion.length > 0 ) {
217+
if ( this._ui.accordion.length > 0 ) {
204218
opts.corners = false;
205219
}
206220

0 commit comments

Comments
 (0)