Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bootstrap-multiselect
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
bootstrap-multiselect
Commits
81df620e
Commit
81df620e
authored
Mar 13, 2013
by
David Stutz
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #33 from nghtstr/patch-1
Added handling for option groups.
parents
29f64e4d
e9ccd61b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
214 additions
and
199 deletions
+214
-199
bootstrap-multiselect.js
js/bootstrap-multiselect.js
+214
-199
No files found.
js/bootstrap-multiselect.js
View file @
81df620e
...
...
@@ -18,50 +18,50 @@
*/
!
function
(
$
)
{
"
use strict
"
;
// jshint ;_;
if
(
typeof
ko
!=
'
undefined
'
&&
ko
.
bindingHandlers
&&
!
ko
.
bindingHandlers
.
multiselect
){
ko
.
bindingHandlers
.
multiselect
=
{
init
:
function
(
element
)
{
var
ms
=
$
(
element
).
data
(
'
multiselect
'
);
if
(
!
ms
)
throw
new
Error
(
"
Bootstrap-multiselect's multiselect() has to be called on element before applying the Knockout View model!
"
);
var
prev
=
ms
.
options
.
onChange
;
ms
.
options
.
onChange
=
function
(
option
,
checked
){
// We dont want to refresh the multiselect since it would delete / recreate all items
$
(
element
).
data
(
'
blockRefresh
'
,
true
);
// Force the binding to be updated by triggering the change event on the select element
$
(
element
).
trigger
(
'
change
'
);
// Call any defined change handler
return
prev
(
option
,
checked
);
}
},
update
:
function
(
element
)
{
var
blockRefresh
=
$
(
element
).
data
(
'
blockRefresh
'
)
||
false
;
if
(
!
blockRefresh
)
{
$
(
element
).
multiselect
(
"
rebuild
"
);
}
$
.
data
(
element
,
'
blockRefresh
'
,
false
);
}
};
}
function
Multiselect
(
select
,
options
)
{
"
use strict
"
;
// jshint ;_;
if
(
typeof
ko
!=
'
undefined
'
&&
ko
.
bindingHandlers
&&
!
ko
.
bindingHandlers
.
multiselect
){
ko
.
bindingHandlers
.
multiselect
=
{
init
:
function
(
element
)
{
var
ms
=
$
(
element
).
data
(
'
multiselect
'
);
if
(
!
ms
)
throw
new
Error
(
"
Bootstrap-multiselect's multiselect() has to be called on element before applying the Knockout View model!
"
);
var
prev
=
ms
.
options
.
onChange
;
ms
.
options
.
onChange
=
function
(
option
,
checked
){
// We dont want to refresh the multiselect since it would delete / recreate all items
$
(
element
).
data
(
'
blockRefresh
'
,
true
);
// Force the binding to be updated by triggering the change event on the select element
$
(
element
).
trigger
(
'
change
'
);
// Call any defined change handler
return
prev
(
option
,
checked
);
}
},
update
:
function
(
element
)
{
var
blockRefresh
=
$
(
element
).
data
(
'
blockRefresh
'
)
||
false
;
if
(
!
blockRefresh
)
{
$
(
element
).
multiselect
(
"
rebuild
"
);
}
$
.
data
(
element
,
'
blockRefresh
'
,
false
);
}
};
}
function
Multiselect
(
select
,
options
)
{
this
.
options
=
this
.
getOptions
(
options
);
this
.
$select
=
$
(
select
);
// Manually add the multiple attribute, if its not already set.
if
(
!
this
.
$select
.
attr
(
'
multiple
'
))
{
this
.
$select
.
attr
(
'
multiple
'
,
true
);
}
this
.
$select
=
$
(
select
);
this
.
$container
=
$
(
this
.
options
.
buttonContainer
)
.
append
(
'
<button type="button" class="multiselect dropdown-toggle
'
+
this
.
options
.
buttonClass
+
'
" data-toggle="dropdown">
'
+
this
.
options
.
buttonText
(
$
(
'
option:selected
'
,
select
))
+
'
</button>
'
)
.
append
(
'
<ul class="dropdown-menu"></ul>
'
);
// Manually add the multiple attribute, if its not already set.
if
(
!
this
.
$select
.
attr
(
'
multiple
'
))
{
this
.
$select
.
attr
(
'
multiple
'
,
true
);
}
this
.
$container
=
$
(
this
.
options
.
buttonContainer
)
.
append
(
'
<button type="button" class="multiselect dropdown-toggle
'
+
this
.
options
.
buttonClass
+
'
" data-toggle="dropdown">
'
+
this
.
options
.
buttonText
(
$
(
'
option:selected
'
,
select
))
+
'
</button>
'
)
.
append
(
'
<ul class="dropdown-menu"></ul>
'
);
if
(
this
.
options
.
buttonWidth
)
{
$
(
'
button
'
,
this
.
$container
).
css
({
...
...
@@ -69,191 +69,206 @@
});
}
// Set max height of dropdown menu to activate auto scrollbar.
if
(
this
.
options
.
maxHeight
)
{
$
(
'
ul
'
,
this
.
$container
).
css
({
'
max-height
'
:
this
.
options
.
maxHeight
+
'
px
'
,
'
overflow-y
'
:
'
auto
'
,
'
overflow-x
'
:
'
hidden
'
});
}
this
.
buildDrowdown
(
select
,
this
.
options
);
this
.
$select
.
hide
()
.
after
(
this
.
$container
);
};
Multiselect
.
prototype
=
{
defaults
:
{
// Default text function will either print 'None selected' in case no option is selected,
// or a list of the selected options up to a length of 3 selected options.
// If more than 3 options are selected, the number of selected options is printed.
buttonText
:
function
(
options
)
{
if
(
options
.
length
==
0
)
{
return
'
None selected <b class="caret"></b>
'
;
}
else
if
(
options
.
length
>
3
)
{
return
options
.
length
+
'
selected <b class="caret"></b>
'
;
}
else
{
var
selected
=
''
;
options
.
each
(
function
()
{
selected
+=
$
(
this
).
text
()
+
'
,
'
;
});
return
selected
.
substr
(
0
,
selected
.
length
-
2
)
+
'
<b class="caret"></b>
'
;
}
},
// Is triggered on change of the selected options.
onChange
:
function
(
option
,
checked
)
{
// Set max height of dropdown menu to activate auto scrollbar.
if
(
this
.
options
.
maxHeight
)
{
$
(
'
ul
'
,
this
.
$container
).
css
({
'
max-height
'
:
this
.
options
.
maxHeight
+
'
px
'
,
'
overflow-y
'
:
'
auto
'
,
'
overflow-x
'
:
'
hidden
'
});
}
this
.
buildDrowdown
(
select
,
this
.
options
);
this
.
$select
.
hide
()
.
after
(
this
.
$container
);
};
Multiselect
.
prototype
=
{
defaults
:
{
// Default text function will either print 'None selected' in case no option is selected,
// or a list of the selected options up to a length of 3 selected options.
// If more than 3 options are selected, the number of selected options is printed.
buttonText
:
function
(
options
)
{
if
(
options
.
length
==
0
)
{
return
'
None selected <b class="caret"></b>
'
;
}
else
if
(
options
.
length
>
3
)
{
return
options
.
length
+
'
selected <b class="caret"></b>
'
;
}
else
{
var
selected
=
''
;
options
.
each
(
function
()
{
selected
+=
$
(
this
).
text
()
+
'
,
'
;
});
return
selected
.
substr
(
0
,
selected
.
length
-
2
)
+
'
<b class="caret"></b>
'
;
}
},
// Is triggered on change of the selected options.
onChange
:
function
(
option
,
checked
)
{
},
buttonClass
:
'
btn
'
,
buttonWidth
:
'
auto
'
,
buttonContainer
:
'
<div class="btn-group" />
'
,
// Maximum height of thet dropdown menu.
// If maximum height is exceeded a scrollbar will be displayed.
maxHeight
:
400
},
},
buttonClass
:
'
btn
'
,
buttonWidth
:
'
auto
'
,
buttonContainer
:
'
<div class="btn-group" />
'
,
// Maximum height of thet dropdown menu.
// If maximum height is exceeded a scrollbar will be displayed.
maxHeight
:
400
,
showGroups
:
false
,
},
isMobile
:
function
()
{
return
navigator
.
userAgent
.
match
(
/Android|webOS|iPhone|iPad|iPod|BlackBerry/i
);
return
navigator
.
userAgent
.
match
(
/Android|webOS|iPhone|iPad|iPod|BlackBerry/i
);
},
constructor
:
Multiselect
,
constructor
:
Multiselect
,
createOptionValue
:
function
(
element
)
{
if
(
$
(
element
).
is
(
'
:selected
'
))
{
$
(
element
).
attr
(
'
selected
'
,
'
selected
'
);
$
(
element
).
prop
(
'
selected
'
,
'
selected
'
);
}
$
(
'
ul
'
,
this
.
$container
).
append
(
'
<li><a href="javascript:void(0);" style="padding:0;"><label style="margin:0;padding:3px 20px 3px 20px;width:100%;height:100%;cursor:pointer;"><input style="margin-bottom:5px;" type="checkbox" value="
'
+
$
(
element
).
val
()
+
'
" />
'
+
$
(
element
).
text
()
+
'
</label></a></li>
'
);
var
selected
=
$
(
element
).
prop
(
'
selected
'
)
||
false
;
var
checkbox
=
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
);
if
(
$
(
element
).
is
(
'
:disabled
'
))
{
checkbox
.
attr
(
'
disabled
'
,
'
disabled
'
).
prop
(
'
disabled
'
,
'
disabled
'
).
parents
(
'
li
'
).
addClass
(
'
disabled
'
)
}
checkbox
.
prop
(
'
checked
'
,
selected
);
if
(
selected
)
{
checkbox
.
parents
(
'
li
'
).
addClass
(
'
active
'
);
}
},
buildDrowdown
:
function
(
select
,
options
){
// Build the dropdown.
$
(
'
option
'
,
this
.
$select
).
each
(
$
.
proxy
(
function
(
index
,
element
)
{
if
(
$
(
element
).
is
(
'
:selected
'
))
{
$
(
element
).
attr
(
'
selected
'
,
'
selected
'
);
$
(
element
).
prop
(
'
selected
'
,
'
selected
'
);
}
$
(
'
ul
'
,
this
.
$container
).
append
(
'
<li><a href="javascript:void(0);" style="padding:0;"><label style="margin:0;padding:3px 20px 3px 20px;width:100%;height:100%;cursor:pointer;"><input style="margin-bottom:5px;" type="checkbox" value="
'
+
$
(
element
).
val
()
+
'
" />
'
+
$
(
element
).
text
()
+
'
</label></a></li>
'
);
var
selected
=
$
(
element
).
prop
(
'
selected
'
)
||
false
;
var
checkbox
=
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
);
if
(
$
(
element
).
is
(
'
:disabled
'
))
{
checkbox
.
attr
(
'
disabled
'
,
'
disabled
'
).
prop
(
'
disabled
'
,
'
disabled
'
).
parents
(
'
li
'
).
addClass
(
'
disabled
'
)
}
checkbox
.
prop
(
'
checked
'
,
selected
);
if
(
selected
)
{
checkbox
.
parents
(
'
li
'
).
addClass
(
'
active
'
);
}
},
this
));
// Bind the change event on the dropdown elements.
$
(
'
ul li input[type="checkbox"]
'
,
this
.
$container
).
on
(
'
change
'
,
$
.
proxy
(
function
(
event
)
{
var
checked
=
$
(
event
.
target
).
prop
(
'
checked
'
)
||
false
;
if
(
checked
)
{
$
(
event
.
target
).
parents
(
'
li
'
).
addClass
(
'
active
'
);
}
else
{
$
(
event
.
target
).
parents
(
'
li
'
).
removeClass
(
'
active
'
);
}
var
option
=
$
(
'
option[value="
'
+
$
(
event
.
target
).
val
()
+
'
"]
'
,
this
.
$select
);
if
(
checked
)
{
option
.
attr
(
'
selected
'
,
'
selected
'
);
option
.
prop
(
'
selected
'
,
'
selected
'
);
}
else
{
option
.
removeAttr
(
'
selected
'
);
}
var
options
=
$
(
'
option:selected
'
,
this
.
$select
);
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
options
));
this
.
options
.
onChange
(
option
,
checked
);
},
this
));
$
(
'
ul li a
'
,
this
.
$container
).
on
(
'
click
'
,
function
(
event
)
{
event
.
stopPropagation
();
});
},
// Destroy - unbind - the plugin.
destroy
:
function
()
{
this
.
$container
.
remove
();
this
.
$select
.
show
();
},
// Refreshs the checked options based on the current state of the select.
refresh
:
function
()
{
$
(
'
option
'
,
this
.
$select
).
each
(
$
.
proxy
(
function
(
index
,
element
)
{
if
(
$
(
element
).
is
(
'
:selected
'
))
{
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
prop
(
'
checked
'
,
true
);
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
parents
(
'
li
'
).
addClass
(
'
active
'
);
}
else
{
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
prop
(
'
checked
'
,
false
);
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
parents
(
'
li
'
).
removeClass
(
'
active
'
);
}
},
this
));
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
$
(
'
option:selected
'
,
this
.
$select
)));
},
// Build the dropdown.
if
((
this
.
options
.
showGroups
)
&&
(
$
(
'
optgroup
'
,
this
.
$select
).
length
>
0
))
{
$
(
'
optgroup
'
,
this
.
$select
).
each
(
$
.
proxy
(
function
(
index
,
group
)
{
var
groupName
=
$
(
group
).
prop
(
'
label
'
);
$
(
'
ul
'
,
this
.
$container
).
append
(
'
<li><label style="margin:0;padding:3px 20px 3px 20px;width:100%;height:100%;" class="multiselect-group">
'
+
groupName
+
'
</label></li>
'
);
$
(
'
option
'
,
group
).
each
(
$
.
proxy
(
function
(
index
,
element
)
{
this
.
createOptionValue
(
element
);
},
this
));
},
this
));
}
else
{
$
(
'
option
'
,
this
.
$select
).
each
(
$
.
proxy
(
function
(
index
,
element
)
{
this
.
createOptionValue
(
element
);
},
this
));
}
// Bind the change event on the dropdown elements.
$
(
'
ul li input[type="checkbox"]
'
,
this
.
$container
).
on
(
'
change
'
,
$
.
proxy
(
function
(
event
)
{
var
checked
=
$
(
event
.
target
).
prop
(
'
checked
'
)
||
false
;
if
(
checked
)
{
$
(
event
.
target
).
parents
(
'
li
'
).
addClass
(
'
active
'
);
}
else
{
$
(
event
.
target
).
parents
(
'
li
'
).
removeClass
(
'
active
'
);
}
var
option
=
$
(
'
option[value="
'
+
$
(
event
.
target
).
val
()
+
'
"]
'
,
this
.
$select
);
if
(
checked
)
{
option
.
attr
(
'
selected
'
,
'
selected
'
);
option
.
prop
(
'
selected
'
,
'
selected
'
);
}
else
{
option
.
removeAttr
(
'
selected
'
);
}
var
options
=
$
(
'
option:selected
'
,
this
.
$select
);
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
options
));
this
.
options
.
onChange
(
option
,
checked
);
},
this
));
$
(
'
ul li a
'
,
this
.
$container
).
on
(
'
click
'
,
function
(
event
)
{
event
.
stopPropagation
();
});
},
// Destroy - unbind - the plugin.
destroy
:
function
()
{
this
.
$container
.
remove
();
this
.
$select
.
show
();
},
// Refreshs the checked options based on the current state of the select.
refresh
:
function
()
{
$
(
'
option
'
,
this
.
$select
).
each
(
$
.
proxy
(
function
(
index
,
element
)
{
if
(
$
(
element
).
is
(
'
:selected
'
))
{
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
prop
(
'
checked
'
,
true
);
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
parents
(
'
li
'
).
addClass
(
'
active
'
);
}
else
{
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
prop
(
'
checked
'
,
false
);
$
(
'
ul li input[value="
'
+
$
(
element
).
val
()
+
'
"]
'
,
this
.
$container
).
parents
(
'
li
'
).
removeClass
(
'
active
'
);
}
},
this
));
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
$
(
'
option:selected
'
,
this
.
$select
)));
},
select
:
function
(
value
)
{
var
option
=
$
(
'
option[value="
'
+
value
+
'
"]
'
,
this
.
$select
);
var
checkbox
=
$
(
'
ul li input[value="
'
+
value
+
'
"]
'
,
this
.
$container
);
checkbox
.
parents
(
'
li
'
).
addClass
(
'
active
'
);
checkbox
.
parents
(
'
li
'
).
addClass
(
'
active
'
);
checkbox
.
prop
(
'
checked
'
,
true
);
option
.
attr
(
'
selected
'
,
'
selected
'
);
option
.
prop
(
'
selected
'
,
'
selected
'
);
var
options
=
$
(
'
option:selected
'
,
this
.
$select
);
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
options
));
option
.
attr
(
'
selected
'
,
'
selected
'
);
option
.
prop
(
'
selected
'
,
'
selected
'
);
var
options
=
$
(
'
option:selected
'
,
this
.
$select
);
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
options
));
},
deselect
:
function
(
value
)
{
var
option
=
$
(
'
option[value="
'
+
value
+
'
"]
'
,
this
.
$select
);
var
checkbox
=
$
(
'
ul li input[value="
'
+
value
+
'
"]
'
,
this
.
$container
);
checkbox
.
parents
(
'
li
'
).
removeClass
(
'
active
'
);
checkbox
.
parents
(
'
li
'
).
removeClass
(
'
active
'
);
checkbox
.
prop
(
'
checked
'
,
false
);
option
.
removeAttr
(
'
selected
'
);
option
.
removeProp
(
'
selected
'
);
var
options
=
$
(
'
option:selected
'
,
this
.
$select
);
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
options
));
option
.
removeAttr
(
'
selected
'
);
option
.
removeProp
(
'
selected
'
);
var
options
=
$
(
'
option:selected
'
,
this
.
$select
);
$
(
'
button
'
,
this
.
$container
).
html
(
this
.
options
.
buttonText
(
options
));
},
rebuild
:
function
()
{
$
(
'
ul
'
,
this
.
$container
).
html
(
''
);
this
.
buildDrowdown
(
this
.
$select
,
this
.
options
);
this
.
buildDrowdown
(
this
.
$select
,
this
.
options
);
},
// Get options by merging defaults and given options.
getOptions
:
function
(
options
)
{
return
$
.
extend
({},
this
.
defaults
,
options
);
}
};
$
.
fn
.
multiselect
=
function
(
option
,
parameter
)
{
return
this
.
each
(
function
()
{
var
data
=
$
(
this
).
data
(
'
multiselect
'
),
options
=
typeof
option
==
'
object
'
&&
option
;
if
(
!
data
)
{
$
(
this
).
data
(
'
multiselect
'
,
(
data
=
new
Multiselect
(
this
,
options
)));
}
if
(
typeof
option
==
'
string
'
)
{
data
[
option
](
parameter
);
}
});
}
// Get options by merging defaults and given options.
getOptions
:
function
(
options
)
{
return
$
.
extend
({},
this
.
defaults
,
options
);
}
};
$
.
fn
.
multiselect
=
function
(
option
,
parameter
)
{
return
this
.
each
(
function
()
{
var
data
=
$
(
this
).
data
(
'
multiselect
'
),
options
=
typeof
option
==
'
object
'
&&
option
;
if
(
!
data
)
{
$
(
this
).
data
(
'
multiselect
'
,
(
data
=
new
Multiselect
(
this
,
options
)));
}
if
(
typeof
option
==
'
string
'
)
{
data
[
option
](
parameter
);
}
});
}
}(
window
.
jQuery
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment