From ecd8ea4a1c40b6056381e920dd03add3db52d4dd Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Fri, 2 Sep 2011 00:21:09 +0200
Subject: [PATCH 001/351] Selectmenu: basic implementation
---
demos/selectmenu/default.html | 67 ++++++
demos/selectmenu/index.html | 16 ++
themes/base/jquery.ui.base.css | 1 +
themes/base/jquery.ui.selectmenu.css | 16 ++
ui/jquery.ui.selectmenu.js | 300 +++++++++++++++++++++++++++
5 files changed, 400 insertions(+)
create mode 100644 demos/selectmenu/default.html
create mode 100644 demos/selectmenu/index.html
create mode 100644 themes/base/jquery.ui.selectmenu.css
create mode 100644 ui/jquery.ui.selectmenu.js
diff --git a/demos/selectmenu/default.html b/demos/selectmenu/default.html
new file mode 100644
index 00000000000..e1b4517c329
--- /dev/null
+++ b/demos/selectmenu/default.html
@@ -0,0 +1,67 @@
+
+
+
+
+ jQuery UI Selectmenu - Default functionality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are tags for programming languages, give "ja" (for Java or JavaScript) a try.
+
The datasource is a simple JavaScript array, provided to the widget using the source-option.
+
+
+
+
diff --git a/demos/selectmenu/index.html b/demos/selectmenu/index.html
new file mode 100644
index 00000000000..909c3e262c4
--- /dev/null
+++ b/demos/selectmenu/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+ jQuery UI Selectmenu Demos
+
+
+
+
+
+
diff --git a/themes/base/jquery.ui.base.css b/themes/base/jquery.ui.base.css
index a359c2ba490..6973ff0f039 100644
--- a/themes/base/jquery.ui.base.css
+++ b/themes/base/jquery.ui.base.css
@@ -19,6 +19,7 @@
@import url("jquery.ui.progressbar.css");
@import url("jquery.ui.resizable.css");
@import url("jquery.ui.selectable.css");
+@import url("jquery.ui.selectmenu.css");
@import url("jquery.ui.slider.css");
@import url("jquery.ui.spinner.css");
@import url("jquery.ui.tabs.css");
diff --git a/themes/base/jquery.ui.selectmenu.css b/themes/base/jquery.ui.selectmenu.css
new file mode 100644
index 00000000000..d64084d60ef
--- /dev/null
+++ b/themes/base/jquery.ui.selectmenu.css
@@ -0,0 +1,16 @@
+/*
+ * jQuery UI Selectmenu @VERSION
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectmenu#theming
+ */
+
+.ui-selectmenu-menu { padding: 0; margin: 0; position:absolute; top: 0; display: none; }
+.ui-selectmenu-menu .ui-menu { padding: 0; }
+.ui-selectmenu-open { display: block; }
+
+.ui-button span.ui-icon { right: 0.5em; left: auto; }
+.ui-button span.ui-button-text { text-align: left; padding: 0.4em 2.1em 0.4em 1em }
\ No newline at end of file
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
new file mode 100644
index 00000000000..c8ee50a7500
--- /dev/null
+++ b/ui/jquery.ui.selectmenu.js
@@ -0,0 +1,300 @@
+/*
+ * jQuery UI Selectmenu @VERSION
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectmenu
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ * jquery.ui.menu.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.selectmenu", {
+ version: "@VERSION",
+ defaultElement: "",
+ options: {
+ wrapperElement: "
",
+ appendTo: "body",
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ source: null,
+
+ iconWidth: 26,
+
+ // callbacks
+ open: null,
+ focus: null,
+ select: null,
+ close: null,
+ change: null
+ },
+
+ _create: function() {
+ var self = this,
+ options = this.options,
+ tabindex = this.element.attr( 'tabindex' );
+
+ // set a default id value, generate a new random one if not set by developer
+ var selectmenuId = self.element.attr( 'id' ) || 'ui-selectmenu-' + Math.random().toString( 16 ).slice( 2, 10 );
+
+ // quick array of button and menu id's
+ self.ids = [ selectmenuId + '-button', selectmenuId + '-menu' ];
+
+ // get options
+ self.items = self.element.find( 'option' );
+
+ // catch click event of the label
+ self.element.bind( 'click.selectmenu', function() {
+ self.newelement.focus();
+ return false;
+ });
+
+ // create button
+ self.newelement = $( ' ', {
+ href: '#' + selectmenuId,
+ tabindex: (tabindex ? tabindex : self.element.attr( 'disabled' ) ? 1 : 0),
+ 'aria-haspopup': true,
+ 'aria-owns': self.ids[ 1 ],
+ css: {
+ width: self.element.width()
+ }
+ }).button({
+ label: self.items.eq( self.element[0].selectedIndex ).text(),
+ icons: {
+ primary: "ui-icon-triangle-2-n-s"
+ }
+ });
+ self.newelementWrap = $( options.wrapperElement )
+ .append( self.newelement )
+ .insertAfter( self.element );
+
+ self.newelement
+ .bind( 'mousedown.selectmenu' , function(event) {
+ self._toggle( event );
+ return false;
+ })
+ .bind( 'click.selectmenu' , function() {
+ return false;
+ })
+ .bind( 'keydown.selectmenu', function( event ) {
+ var ret = false;
+ switch (event.keyCode) {
+ case $.ui.keyCode.TAB:
+ case $.ui.keyCode.ENTER:
+ ret = true;
+ break;
+ case $.ui.keyCode.SPACE:
+ self._toggle(event);
+ break;
+ case $.ui.keyCode.UP:
+ if (event.altKey) {
+ self._toggle( event );
+ } else {
+ self.list.trigger( event );
+ if ( options.open ) self.list.focus();
+ }
+ break;
+ case $.ui.keyCode.DOWN:
+ if (event.altKey) {
+ self._toggle( event );
+ } else {
+ self.list.trigger( event );
+ if ( options.open ) self.list.focus();
+ }
+ break;
+ case $.ui.keyCode.LEFT:
+ // event.which = 40;
+ event.keyCode = 40;
+ self.list.trigger( event );
+ break;
+ case $.ui.keyCode.RIGHT:
+ // event.which = 38;
+ event.keyCode = 38;
+ self.list.trigger( event );
+ break;
+ default:
+ self.list.trigger( event );
+ }
+ return ret;
+ });
+
+
+ // create menu portion, append to body
+ self.list = $( '', {
+ 'class': 'ui-widget ui-widget-content',
+ 'aria-hidden': true,
+ 'aria-labelledby': self.ids[0],
+ role: 'listbox',
+ id: self.ids[1],
+ css: {
+ // width: self.element.width() - options.iconWidth
+ width: self.element.width()
+ }
+ });
+
+ self.listWrap = $( options.wrapperElement )
+ .addClass( self.widgetBaseClass + '-menu' )
+ .append( self.list )
+ .appendTo( options.appendTo );
+
+ self._renderMenu( self.list, self._initSource() );
+
+ self.list.menu({
+ select: function( event, ui ) {
+ var item = ui.item.data( "item.selectmenu" );
+ console.log(item);
+
+ self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ self.value( item.value );
+ self.close( event, true);
+ },
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.selectmenu" );
+ if ( !options.open ) self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ }
+ });
+
+ // document click closes menu
+ $( document ).bind( 'mousedown.selectmenu', function( event ) {
+ if ( self.options.open ) {
+ window.setTimeout( function() {
+ self.close( event );
+ }, 200 );
+ }
+ });
+
+ },
+
+ _toggle: function( event ) {
+ if ( this.options.open ) {
+ this.close( event );
+ } else {
+ this.open( event );
+ }
+ },
+
+ open: function( event ) {
+ var self = this,
+ options = this.options;
+
+ self.listWrap.addClass( self.widgetBaseClass + '-open' );
+ this.options.open = true;
+
+ self.listWrap.position( $.extend({
+ of: this.newelementWrap
+ }, options.position ));
+ },
+
+
+ close: function( event, focus ) {
+ var self = this,
+ options = this.options;
+
+ self.listWrap.removeClass( self.widgetBaseClass + '-open' );
+ this.options.open = false;
+
+ if (focus) self.newelement.focus();
+ },
+
+ _renderMenu: function( ul, items ) {
+ var self = this,
+ currentOptgroup = "";
+ $.each( items, function( index, item ) {
+ if ( item.optgroup != currentOptgroup ) {
+ ul.append( "" );
+ currentOptgroup = item.optgroup;
+ }
+ self._renderItem( ul, item );
+ });
+ },
+
+ _renderItem: function( ul, item) {
+ return $( " " )
+ .data( "item.selectmenu", item )
+ .append( $( " ", {
+ text: item.label,
+ href: '#nogo'
+ })
+ ).appendTo( ul );
+ },
+
+ _destroy: function() {
+ clearTimeout( this.searching );
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-autocomplete" )
+ .removeAttr( "aria-haspopup" );
+ this.menu.element.remove();
+ },
+
+ _setOption: function( key, value ) {
+ this._super( "_setOption", key, value );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ if ( key === "appendTo" ) {
+ this.listWrap.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+ }
+ // if ( key === "disabled" && value && this.xhr ) {
+ // this.xhr.abort();
+ // }
+ },
+
+ _initSource: function() {
+ var data = [];
+ // data = [
+ // { label: "anders", optgroup: "" },
+ // { label: "andreas", optgroup: "" },
+ // { label: "antal", optgroup: "" },
+ // { label: "annhhx10", optgroup: "Products" },
+ // { label: "annk K12", optgroup: "Products" },
+ // { label: "annttop C13", optgroup: "Products" },
+ // { label: "anders andersson", optgroup: "People" },
+ // { label: "andreas andersson", optgroup: "People" },
+ // { label: "andreas johnson", optgroup: "People" }
+ // ];
+
+ $.each( this.items, function( index, item ) {
+ var option = $( item );
+ data.push({
+ value: option.attr( 'value' ),
+ label: option.text(),
+ optgroup: option.parent("optgroup").attr("label") || false
+ });
+ });
+ // console.log(data);
+ return data;
+ },
+
+ value: function( newValue ) {
+ if (arguments.length) {
+ this.element[0].value = newValue;
+ } else {
+ return this.element[0].value;
+ }
+ }
+
+ // index: function( newValue ) {
+ // if ( arguments.length ) {
+ // this.element[0].selectedIndex = newValue;
+ // } else {
+ // return this.element[0].selectedIndex;
+ // }
+ // }
+});
+
+}( jQuery ));
From e70092f602c67db58e6c53a774dcc77653faa867 Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Thu, 22 Sep 2011 01:35:54 +0200
Subject: [PATCH 002/351] Selectmenu: fixed dependencies
---
ui/jquery.ui.selectmenu.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index c8ee50a7500..cf2c175fb28 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -12,6 +12,7 @@
* jquery.ui.widget.js
* jquery.ui.position.js
* jquery.ui.menu.js
+ * jquery.ui.button.js
*/
(function( $, undefined ) {
From 8120b0d6dfcb325066a7b22f428619882835e6fd Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Thu, 22 Sep 2011 21:20:49 +0200
Subject: [PATCH 003/351] Selectmenu: improved visual style
---
themes/base/jquery.ui.selectmenu.css | 5 +++--
ui/jquery.ui.selectmenu.js | 33 +++++++++++++++++++++++-----
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/themes/base/jquery.ui.selectmenu.css b/themes/base/jquery.ui.selectmenu.css
index d64084d60ef..6149a0bb770 100644
--- a/themes/base/jquery.ui.selectmenu.css
+++ b/themes/base/jquery.ui.selectmenu.css
@@ -10,7 +10,8 @@
.ui-selectmenu-menu { padding: 0; margin: 0; position:absolute; top: 0; display: none; }
.ui-selectmenu-menu .ui-menu { padding: 0; }
+.ui-selectmenu-menu li.ui-selectmenu-optgroup { font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; }
.ui-selectmenu-open { display: block; }
-.ui-button span.ui-icon { right: 0.5em; left: auto; }
-.ui-button span.ui-button-text { text-align: left; padding: 0.4em 2.1em 0.4em 1em }
\ No newline at end of file
+.ui-selectmenu-button span.ui-icon { right: 0.5em; left: auto; }
+.ui-selectmenu-button span.ui-button-text { text-align: left; padding: 0.4em 2.1em 0.4em 1em }
\ No newline at end of file
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index cf2c175fb28..7d6269d2bb2 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -23,6 +23,7 @@ $.widget( "ui.selectmenu", {
version: "@VERSION",
defaultElement: "",
options: {
+ dropdown: true,
wrapperElement: "
",
appendTo: "body",
position: {
@@ -65,18 +66,21 @@ $.widget( "ui.selectmenu", {
// create button
self.newelement = $( ' ', {
href: '#' + selectmenuId,
- tabindex: (tabindex ? tabindex : self.element.attr( 'disabled' ) ? 1 : 0),
+ tabindex: ( tabindex ? tabindex : self.element.attr( 'disabled' ) ? 1 : 0 ),
'aria-haspopup': true,
'aria-owns': self.ids[ 1 ],
css: {
width: self.element.width()
}
- }).button({
+ })
+ .addClass( self.widgetBaseClass + '-button' )
+ .button({
label: self.items.eq( self.element[0].selectedIndex ).text(),
icons: {
- primary: "ui-icon-triangle-2-n-s"
+ primary: ( options.dropdown ? 'ui-icon-triangle-1-s' : 'ui-icon-triangle-2-n-s' )
}
});
+
self.newelementWrap = $( options.wrapperElement )
.append( self.newelement )
.insertAfter( self.element );
@@ -130,8 +134,7 @@ $.widget( "ui.selectmenu", {
}
return ret;
});
-
-
+
// create menu portion, append to body
self.list = $( '', {
'class': 'ui-widget ui-widget-content',
@@ -167,6 +170,12 @@ $.widget( "ui.selectmenu", {
}
});
+ if ( options.dropdown ) {
+ self.list
+ .addClass( 'ui-corner-bottom' )
+ .removeClass( 'ui-corner-all' );
+ }
+
// document click closes menu
$( document ).bind( 'mousedown.selectmenu', function( event ) {
if ( self.options.open ) {
@@ -190,6 +199,14 @@ $.widget( "ui.selectmenu", {
var self = this,
options = this.options;
+
+ if ( options.dropdown ) {
+ self.newelement
+ .addClass( 'ui-corner-top' )
+ .removeClass( 'ui-corner-all' );
+ }
+
+
self.listWrap.addClass( self.widgetBaseClass + '-open' );
this.options.open = true;
@@ -203,6 +220,12 @@ $.widget( "ui.selectmenu", {
var self = this,
options = this.options;
+ if ( options.dropdown ) {
+ self.newelement
+ .addClass( 'ui-corner-all' )
+ .removeClass( 'ui-corner-top' );
+ }
+
self.listWrap.removeClass( self.widgetBaseClass + '-open' );
this.options.open = false;
From 85a34ebedb00627ad82ec46830616524f90bc352 Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Fri, 23 Sep 2011 00:17:24 +0200
Subject: [PATCH 004/351] Selectmenu: basic popop support, code cleanup
---
demos/selectmenu/default.html | 5 +-
ui/jquery.ui.selectmenu.js | 97 ++++++++++++++++++-----------------
2 files changed, 54 insertions(+), 48 deletions(-)
diff --git a/demos/selectmenu/default.html b/demos/selectmenu/default.html
index e1b4517c329..dd188cfe195 100644
--- a/demos/selectmenu/default.html
+++ b/demos/selectmenu/default.html
@@ -14,7 +14,10 @@
@@ -43,6 +48,31 @@
+ Select a Speed:
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+
+
+
+
Select a file:
diff --git a/themes/base/jquery.ui.selectmenu.css b/themes/base/jquery.ui.selectmenu.css
index 6149a0bb770..2f532d5eeb2 100644
--- a/themes/base/jquery.ui.selectmenu.css
+++ b/themes/base/jquery.ui.selectmenu.css
@@ -10,7 +10,9 @@
.ui-selectmenu-menu { padding: 0; margin: 0; position:absolute; top: 0; display: none; }
.ui-selectmenu-menu .ui-menu { padding: 0; }
-.ui-selectmenu-menu li.ui-selectmenu-optgroup { font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; }
+.ui-selectmenu-menu .ui-menu .ui-menu-item a { padding: 0.3em 1em 0.3em 1em; }
+.ui-selectmenu-menu .ui-menu .ui-menu-item a.ui-state-focus { margin: -1px 0 -1px -1px; }
+.ui-selectmenu-menu .ui-menu li.ui-selectmenu-optgroup { font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; }
.ui-selectmenu-open { display: block; }
.ui-selectmenu-button span.ui-icon { right: 0.5em; left: auto; }
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index 6f02959a59b..173a3d8e386 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -104,27 +104,21 @@ $.widget( "ui.selectmenu", {
if (event.altKey) {
self._toggle( event );
} else {
- self.list.trigger( event );
- if ( options.open ) self.list.focus();
+ self._previous();
}
break;
case $.ui.keyCode.DOWN:
if (event.altKey) {
self._toggle( event );
} else {
- self.list.trigger( event );
- if ( options.open ) self.list.focus();
+ self._next();
}
break;
case $.ui.keyCode.LEFT:
- // event.which = 40;
- event.keyCode = 40;
- self.list.trigger( event );
+ self._previous();
break;
case $.ui.keyCode.RIGHT:
- // event.which = 38;
- event.keyCode = 38;
- self.list.trigger( event );
+ self._next();
break;
default:
self.list.trigger( event );
@@ -139,13 +133,11 @@ $.widget( "ui.selectmenu", {
'aria-labelledby': self.ids[0],
role: 'listbox',
id: self.ids[1],
- css: {
- width: ( options.dropdown ) ? self.element.width() : self.element.width() - options.iconWidth
- }
});
self.listWrap = $( options.wrapperElement )
.addClass( self.widgetBaseClass + '-menu' )
+ .css("width", ( options.dropdown ) ? self.element.width() : self.element.width() - options.iconWidth)
.append( self.list )
.appendTo( options.appendTo );
@@ -156,18 +148,27 @@ $.widget( "ui.selectmenu", {
.menu({
select: function( event, ui ) {
var item = ui.item.data( "item.selectmenu" );
- // console.log(item);
+ console.log(item);
- self.newelement.children( 'span.ui-button-text' ).text( item.label );
- self._value( item.value );
+ self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ self._index( item.index );
self.close( event, true);
},
focus: function( event, ui ) {
var item = ui.item.data( "item.selectmenu" );
- if ( !options.open ) self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ if ( !self.opened ) {
+ self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ self._index( item.index );
+ }
}
+ })
+ .bind( 'mouseenter.selectelemenu', function() {
+ self.hover = true;
+ })
+ .bind( 'mouseleave .selectelemenu', function() {
+ self.hover = false;
});
-
+
if ( options.dropdown ) {
self.list
.addClass( 'ui-corner-bottom' )
@@ -176,7 +177,7 @@ $.widget( "ui.selectmenu", {
// document click closes menu
$( document ).bind( 'mousedown.selectmenu', function( event ) {
- if ( self.options.open ) {
+ if ( self.opened && !self.hover) {
window.setTimeout( function() {
self.close( event );
}, 200 );
@@ -185,8 +186,22 @@ $.widget( "ui.selectmenu", {
},
+ _previous: function() {
+ this.list.menu( "focus", null, this._getCurrenItem() );
+ this.list.menu("previous");
+ },
+
+ _next: function() {
+ this.list.menu( "focus", null, this._getCurrenItem() );
+ this.list.menu("next");
+ },
+
+ _getCurrenItem: function() {
+ return this.list.find( "li" ).not( '.ui-selectmenu-optgroup' ).eq( this._index() );
+ },
+
_toggle: function( event ) {
- if ( this.options.open ) {
+ if ( this.opened ) {
this.close( event );
} else {
this.open( event );
@@ -207,25 +222,42 @@ $.widget( "ui.selectmenu", {
.addClass( 'ui-corner-top' )
.removeClass( 'ui-corner-all' );
}
+
+ var currentItem = self._getCurrenItem();
self.listWrap.addClass( self.widgetBaseClass + '-open' );
- this.options.open = true;
+
+ // self.newelement.blur();
+ self.list.focus().menu( "focus", null, currentItem )
+ // currentItem.focus();
if ( !options.dropdown ) {
- // var _offset = self.list.outerWidth()
+ if ( self.list.css("overflow") == "auto" ) {
+ self.list.scrollTop( self.list.scrollTop() + currentItem.position().top - self.list.outerHeight()/2 + currentItem.outerHeight()/2 );
+ }
+ // console.log( self.newelement.offset().top );
+ // console.log( currentItem.offset().top );
+ var _offset = (self.list.offset().top - currentItem.offset().top + (self.newelement.outerHeight() - currentItem.outerHeight()) / 2);
+ // console.log( currentItem );
+ // console.log( currentItem.position().top );
+ // console.log( _offset );
+
+
$.extend( options.position, {
- my: "left center",
- at: "left center",
- collision: "fit"
+ my: "left top",
+ at: "left top",
+ offset: "0 " + _offset
});
}
- console.log(options.position);
+ // console.log(options.position);
self.listWrap.position( $.extend({
of: this.newelementWrap
}, options.position ));
+
+ this.opened = true;
},
close: function( event, focus ) {
@@ -239,7 +271,7 @@ $.widget( "ui.selectmenu", {
}
self.listWrap.removeClass( self.widgetBaseClass + '-open' );
- this.options.open = false;
+ this.opened = false;
if (focus) self.newelement.focus();
},
@@ -262,7 +294,10 @@ $.widget( "ui.selectmenu", {
.data( "item.selectmenu", item )
.append( $( " ", {
text: item.label,
- href: '#nogo'
+ href: '#',
+ click: function( event ) {
+ event.preventDefault();
+ }
})
).appendTo( ul );
},
@@ -280,15 +315,9 @@ $.widget( "ui.selectmenu", {
_setOption: function( key, value ) {
this._super( "_setOption", key, value );
- if ( key === "source" ) {
- this._initSource();
- }
if ( key === "appendTo" ) {
- this.listWrap.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+ this.listWrap.appendTo( $( value || "body", this.element[0].ownerDocument )[0] );
}
- // if ( key === "disabled" && value && this.xhr ) {
- // this.xhr.abort();
- // }
},
_initSource: function() {
@@ -297,6 +326,7 @@ $.widget( "ui.selectmenu", {
$.each( this.items, function( index, item ) {
var option = $( item );
data.push({
+ index: index,
value: option.attr( 'value' ),
label: option.text(),
optgroup: option.parent("optgroup").attr("label") || false
From d89e9b41a9605db3f3d64c30cf511965a749a1f0 Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Sat, 24 Sep 2011 02:04:06 +0200
Subject: [PATCH 006/351] Selectmenu: code cleanup
---
ui/jquery.ui.selectmenu.js | 74 +++++++++++++++-----------------------
1 file changed, 29 insertions(+), 45 deletions(-)
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index 173a3d8e386..a0aa14ca71c 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -186,28 +186,6 @@ $.widget( "ui.selectmenu", {
},
- _previous: function() {
- this.list.menu( "focus", null, this._getCurrenItem() );
- this.list.menu("previous");
- },
-
- _next: function() {
- this.list.menu( "focus", null, this._getCurrenItem() );
- this.list.menu("next");
- },
-
- _getCurrenItem: function() {
- return this.list.find( "li" ).not( '.ui-selectmenu-optgroup' ).eq( this._index() );
- },
-
- _toggle: function( event ) {
- if ( this.opened ) {
- this.close( event );
- } else {
- this.open( event );
- }
- },
-
open: function( event ) {
var self = this,
options = this.options;
@@ -227,32 +205,24 @@ $.widget( "ui.selectmenu", {
self.listWrap.addClass( self.widgetBaseClass + '-open' );
- // self.newelement.blur();
- self.list.focus().menu( "focus", null, currentItem )
- // currentItem.focus();
+ self.list.focus().menu( "focus", null, currentItem );
if ( !options.dropdown ) {
+ // center current item
if ( self.list.css("overflow") == "auto" ) {
self.list.scrollTop( self.list.scrollTop() + currentItem.position().top - self.list.outerHeight()/2 + currentItem.outerHeight()/2 );
}
- // console.log( self.newelement.offset().top );
- // console.log( currentItem.offset().top );
+
+ // calculate offset
var _offset = (self.list.offset().top - currentItem.offset().top + (self.newelement.outerHeight() - currentItem.outerHeight()) / 2);
- // console.log( currentItem );
- // console.log( currentItem.position().top );
- // console.log( _offset );
-
-
$.extend( options.position, {
my: "left top",
at: "left top",
offset: "0 " + _offset
});
}
-
- // console.log(options.position);
-
+
self.listWrap.position( $.extend({
of: this.newelementWrap
}, options.position ));
@@ -302,17 +272,28 @@ $.widget( "ui.selectmenu", {
).appendTo( ul );
},
- _destroy: function() {
- clearTimeout( this.searching );
- this.element
- .removeClass( "ui-autocomplete-input" )
- .removeAttr( "autocomplete" )
- .removeAttr( "role" )
- .removeAttr( "aria-autocomplete" )
- .removeAttr( "aria-haspopup" );
- this.menu.element.remove();
+ _previous: function() {
+ this.list.menu( "focus", null, this._getCurrenItem() );
+ this.list.menu("previous");
},
-
+
+ _next: function() {
+ this.list.menu( "focus", null, this._getCurrenItem() );
+ this.list.menu("next");
+ },
+
+ _getCurrenItem: function() {
+ return this.list.find( "li" ).not( '.ui-selectmenu-optgroup' ).eq( this._index() );
+ },
+
+ _toggle: function( event ) {
+ if ( this.opened ) {
+ this.close( event );
+ } else {
+ this.open( event );
+ }
+ },
+
_setOption: function( key, value ) {
this._super( "_setOption", key, value );
if ( key === "appendTo" ) {
@@ -337,6 +318,9 @@ $.widget( "ui.selectmenu", {
return data;
},
+ _destroy: function() {
+ },
+
_value: function( newValue ) {
if (arguments.length) {
this.element[0].value = newValue;
From 1d9fac52f758579941691e202f47062b9e6c56df Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Sat, 24 Sep 2011 03:08:03 +0200
Subject: [PATCH 007/351] Selectmenu: refresh method, value option, code
cleanup
---
demos/selectmenu/default.html | 4 +-
ui/jquery.ui.selectmenu.js | 190 +++++++++++++++++-----------------
2 files changed, 98 insertions(+), 96 deletions(-)
diff --git a/demos/selectmenu/default.html b/demos/selectmenu/default.html
index f7325dd41bd..cbeb6271054 100644
--- a/demos/selectmenu/default.html
+++ b/demos/selectmenu/default.html
@@ -40,8 +40,8 @@
Select a Speed:
Slower
- Slow
- Medium
+ Slow
+ Medium
Fast
Faster
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index a0aa14ca71c..4db5f6d5699 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -21,6 +21,7 @@ $.widget( "ui.selectmenu", {
defaultElement: "",
options: {
dropdown: true,
+ iconWidth: 26,
wrapperElement: "
",
appendTo: "body",
position: {
@@ -28,51 +29,52 @@ $.widget( "ui.selectmenu", {
at: "left bottom",
collision: "none"
},
- source: null,
-
- iconWidth: 26,
-
+ source: null,
// callbacks
open: null,
focus: null,
select: null,
close: null,
- change: null
+ change: null,
},
_create: function() {
var self = this,
options = this.options,
- tabindex = this.element.attr( 'tabindex' );
-
- // set a default id value, generate a new random one if not set by developer
- var selectmenuId = self.element.attr( 'id' ) || 'ui-selectmenu-' + Math.random().toString( 16 ).slice( 2, 10 );
-
+ tabindex = this.element.attr( 'tabindex' )
+ // set a default id value, generate a new random one if not set by developer
+ selectmenuId = self.element.attr( 'id' ) || 'ui-selectmenu-' + Math.random().toString( 16 ).slice( 2, 10 );
+
// quick array of button and menu id's
self.ids = [ selectmenuId + '-button', selectmenuId + '-menu' ];
// get options
self.items = self.element.find( 'option' );
+ // set options value
+ options.value = self.element[0].value;
+
// catch click event of the label
self.element.bind( 'click.selectmenu', function() {
self.newelement.focus();
return false;
- });
+ })
+ .hide();
// create button
self.newelement = $( ' ', {
href: '#' + selectmenuId,
tabindex: ( tabindex ? tabindex : self.element.attr( 'disabled' ) ? 1 : 0 ),
- 'aria-haspopup': true,
- 'aria-owns': self.ids[ 1 ],
+ id: self.ids[ 0 ],
css: {
width: self.element.width()
- }
+ },
+ 'aria-owns': self.ids[ 1 ],
+ 'aria-haspopup': true
})
.addClass( self.widgetBaseClass + '-button' )
.button({
- label: self.items.eq( self.element[0].selectedIndex ).text(),
+ label: self.items.eq( self.element[ 0 ].selectedIndex ).text(),
icons: {
primary: ( options.dropdown ? 'ui-icon-triangle-1-s' : 'ui-icon-triangle-2-n-s' )
}
@@ -83,7 +85,7 @@ $.widget( "ui.selectmenu", {
.insertAfter( self.element );
self.newelement
- .bind( 'mousedown.selectmenu' , function(event) {
+ .bind( 'mousedown.selectmenu' , function( event ) {
self._toggle( event );
return false;
})
@@ -101,14 +103,14 @@ $.widget( "ui.selectmenu", {
self._toggle(event);
break;
case $.ui.keyCode.UP:
- if (event.altKey) {
+ if ( event.altKey ) {
self._toggle( event );
} else {
self._previous();
}
break;
case $.ui.keyCode.DOWN:
- if (event.altKey) {
+ if ( event.altKey ) {
self._toggle( event );
} else {
self._next();
@@ -125,55 +127,8 @@ $.widget( "ui.selectmenu", {
}
return ret;
});
-
- // create menu portion, append to body
- self.list = $( '', {
- 'class': 'ui-widget ui-widget-content',
- 'aria-hidden': true,
- 'aria-labelledby': self.ids[0],
- role: 'listbox',
- id: self.ids[1],
- });
-
- self.listWrap = $( options.wrapperElement )
- .addClass( self.widgetBaseClass + '-menu' )
- .css("width", ( options.dropdown ) ? self.element.width() : self.element.width() - options.iconWidth)
- .append( self.list )
- .appendTo( options.appendTo );
-
- self._renderMenu( self.list, self._initSource() );
-
- self.list
- .data( 'element.selectelemenu', self.element )
- .menu({
- select: function( event, ui ) {
- var item = ui.item.data( "item.selectmenu" );
- console.log(item);
-
- self.newelement.children( 'span.ui-button-text' ).text( item.label );
- self._index( item.index );
- self.close( event, true);
- },
- focus: function( event, ui ) {
- var item = ui.item.data( "item.selectmenu" );
- if ( !self.opened ) {
- self.newelement.children( 'span.ui-button-text' ).text( item.label );
- self._index( item.index );
- }
- }
- })
- .bind( 'mouseenter.selectelemenu', function() {
- self.hover = true;
- })
- .bind( 'mouseleave .selectelemenu', function() {
- self.hover = false;
- });
- if ( options.dropdown ) {
- self.list
- .addClass( 'ui-corner-bottom' )
- .removeClass( 'ui-corner-all' );
- }
+ self.refresh();
// document click closes menu
$( document ).bind( 'mousedown.selectmenu', function( event ) {
@@ -203,19 +158,16 @@ $.widget( "ui.selectmenu", {
var currentItem = self._getCurrenItem();
- self.listWrap.addClass( self.widgetBaseClass + '-open' );
-
+ self.listWrap.addClass( self.widgetBaseClass + '-open' );
self.list.focus().menu( "focus", null, currentItem );
if ( !options.dropdown ) {
// center current item
if ( self.list.css("overflow") == "auto" ) {
self.list.scrollTop( self.list.scrollTop() + currentItem.position().top - self.list.outerHeight()/2 + currentItem.outerHeight()/2 );
- }
-
+ }
// calculate offset
- var _offset = (self.list.offset().top - currentItem.offset().top + (self.newelement.outerHeight() - currentItem.outerHeight()) / 2);
-
+ var _offset = (self.list.offset().top - currentItem.offset().top + (self.newelement.outerHeight() - currentItem.outerHeight()) / 2);
$.extend( options.position, {
my: "left top",
at: "left top",
@@ -230,6 +182,61 @@ $.widget( "ui.selectmenu", {
this.opened = true;
},
+ refresh: function() {
+ var self = this,
+ options = this.options;
+
+ // create menu portion, append to body
+ self.list = $( '', {
+ 'class': 'ui-widget ui-widget-content',
+ 'aria-hidden': true,
+ 'aria-labelledby': self.ids[0],
+ role: 'listbox',
+ id: self.ids[1],
+ });
+
+ self.listWrap = $( options.wrapperElement )
+ .addClass( self.widgetBaseClass + '-menu' )
+ .css("width", ( options.dropdown ) ? self.element.width() : self.element.width() - options.iconWidth)
+ .append( self.list )
+ .appendTo( options.appendTo );
+
+ self._initSource();
+ self._renderMenu( self.list, options.source );
+
+ self.list
+ .data( 'element.selectelemenu', self.element )
+ .menu({
+ select: function( event, ui ) {
+ var item = ui.item.data( "item.selectmenu" );
+ console.log(item);
+
+ self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ self._index( item.index );
+ self.close( event, true);
+ },
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.selectmenu" );
+ if ( !self.opened ) {
+ self.newelement.children( 'span.ui-button-text' ).text( item.label );
+ self._index( item.index );
+ }
+ }
+ })
+ .bind( 'mouseenter.selectelemenu', function() {
+ self.hover = true;
+ })
+ .bind( 'mouseleave .selectelemenu', function() {
+ self.hover = false;
+ });
+
+ if ( options.dropdown ) {
+ self.list
+ .addClass( 'ui-corner-bottom' )
+ .removeClass( 'ui-corner-all' );
+ }
+ },
+
close: function( event, focus ) {
var self = this,
options = this.options;
@@ -299,39 +306,34 @@ $.widget( "ui.selectmenu", {
if ( key === "appendTo" ) {
this.listWrap.appendTo( $( value || "body", this.element[0].ownerDocument )[0] );
}
+ if ( key === "value" && value) {
+ this.element[0].value = value;
+ }
},
_initSource: function() {
- var data = [];
-
- $.each( this.items, function( index, item ) {
- var option = $( item );
- data.push({
- index: index,
- value: option.attr( 'value' ),
- label: option.text(),
- optgroup: option.parent("optgroup").attr("label") || false
- });
- });
-
- // console.log(data);
- return data;
+ if ( !$.isArray( this.options.source ) ) {
+ var data = [];
+ $.each( this.items, function( index, item ) {
+ var option = $( item );
+ data.push({
+ index: index,
+ value: option.attr( 'value' ),
+ label: option.text(),
+ optgroup: option.parent("optgroup").attr("label") || false
+ });
+ });
+ this.options.source = data;
+ }
},
_destroy: function() {
},
- _value: function( newValue ) {
- if (arguments.length) {
- this.element[0].value = newValue;
- } else {
- return this.element[0].value;
- }
- },
-
_index: function( newIndex ) {
if ( arguments.length ) {
this.element[0].selectedIndex = newIndex;
+ self.options.value = this._getCurrenItem().attr( "value" );
} else {
return this.element[0].selectedIndex;
}
From 35289489c4e6272fb6396e89f08a948df506099e Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Sat, 24 Sep 2011 04:04:54 +0200
Subject: [PATCH 008/351] Selectmenu: implemented disable for option and
optgroup, code cleanup
---
demos/selectmenu/default.html | 10 ++---
themes/base/jquery.ui.selectmenu.css | 1 +
ui/jquery.ui.selectmenu.js | 60 +++++++++++++---------------
3 files changed, 34 insertions(+), 37 deletions(-)
diff --git a/demos/selectmenu/default.html b/demos/selectmenu/default.html
index cbeb6271054..c4393b57014 100644
--- a/demos/selectmenu/default.html
+++ b/demos/selectmenu/default.html
@@ -41,7 +41,7 @@
Slower
Slow
- Medium
+ Medium
Fast
Faster
@@ -60,8 +60,8 @@
8
9
10
- 11
- 12
+ 11
+ 12
13
14
15
@@ -75,12 +75,12 @@
Select a file:
-
+
jQuery.js
ui.jQuery.js
- Some unknown file
+ Some unknown file
Some other file
diff --git a/themes/base/jquery.ui.selectmenu.css b/themes/base/jquery.ui.selectmenu.css
index 2f532d5eeb2..d2353e88208 100644
--- a/themes/base/jquery.ui.selectmenu.css
+++ b/themes/base/jquery.ui.selectmenu.css
@@ -12,6 +12,7 @@
.ui-selectmenu-menu .ui-menu { padding: 0; }
.ui-selectmenu-menu .ui-menu .ui-menu-item a { padding: 0.3em 1em 0.3em 1em; }
.ui-selectmenu-menu .ui-menu .ui-menu-item a.ui-state-focus { margin: -1px 0 -1px -1px; }
+.ui-selectmenu-menu .ui-menu li.ui-state-disabled { margin: 0; padding: 0; }
.ui-selectmenu-menu .ui-menu li.ui-selectmenu-optgroup { font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; }
.ui-selectmenu-open { display: block; }
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index 4db5f6d5699..22f26953ead 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -74,7 +74,7 @@ $.widget( "ui.selectmenu", {
})
.addClass( self.widgetBaseClass + '-button' )
.button({
- label: self.items.eq( self.element[ 0 ].selectedIndex ).text(),
+ label: self.items.eq( this.element[0].selectedIndex ).text(),
icons: {
primary: ( options.dropdown ? 'ui-icon-triangle-1-s' : 'ui-icon-triangle-2-n-s' )
}
@@ -128,6 +128,7 @@ $.widget( "ui.selectmenu", {
return ret;
});
+ // built menu
self.refresh();
// document click closes menu
@@ -143,7 +144,8 @@ $.widget( "ui.selectmenu", {
open: function( event ) {
var self = this,
- options = this.options;
+ options = this.options,
+ currentItem = self._getSelectedItem();
// close all other selectmenus
$( '.' + self.widgetBaseClass + '-open' ).not( self.newelement ).each( function() {
@@ -155,9 +157,7 @@ $.widget( "ui.selectmenu", {
.addClass( 'ui-corner-top' )
.removeClass( 'ui-corner-all' );
}
-
- var currentItem = self._getCurrenItem();
-
+
self.listWrap.addClass( self.widgetBaseClass + '-open' );
self.list.focus().menu( "focus", null, currentItem );
@@ -197,7 +197,7 @@ $.widget( "ui.selectmenu", {
self.listWrap = $( options.wrapperElement )
.addClass( self.widgetBaseClass + '-menu' )
- .css("width", ( options.dropdown ) ? self.element.width() : self.element.width() - options.iconWidth)
+ .css( "width", ( options.dropdown ) ? self.element.width() : self.element.width() - options.iconWidth )
.append( self.list )
.appendTo( options.appendTo );
@@ -208,19 +208,12 @@ $.widget( "ui.selectmenu", {
.data( 'element.selectelemenu', self.element )
.menu({
select: function( event, ui ) {
- var item = ui.item.data( "item.selectmenu" );
- console.log(item);
-
- self.newelement.children( 'span.ui-button-text' ).text( item.label );
- self._index( item.index );
+ var item = ui.item.data( "item.selectmenu" );
+ self._setSelected( item );
self.close( event, true);
},
focus: function( event, ui ) {
- var item = ui.item.data( "item.selectmenu" );
- if ( !self.opened ) {
- self.newelement.children( 'span.ui-button-text' ).text( item.label );
- self._index( item.index );
- }
+ if ( !self.opened ) self._setSelected( ui.item.data( "item.selectmenu" );
}
})
.bind( 'mouseenter.selectelemenu', function() {
@@ -259,7 +252,9 @@ $.widget( "ui.selectmenu", {
$.each( items, function( index, item ) {
if ( item.optgroup != currentOptgroup ) {
- ul.append( "" );
+ var optgroup = $( '' );
+ if ( $( self.items[ item.index ] ).parent( "optgroup" ).attr( "disabled" ) ) optgroup.addClass( 'ui-state-disabled' );
+ ul.append( optgroup );
currentOptgroup = item.optgroup;
}
self._renderItem( ul, item );
@@ -268,6 +263,7 @@ $.widget( "ui.selectmenu", {
_renderItem: function( ul, item) {
return $( " " )
+ .addClass( ( item.disabled ) ? 'ui-state-disabled' : '' )
.data( "item.selectmenu", item )
.append( $( " ", {
text: item.label,
@@ -280,17 +276,23 @@ $.widget( "ui.selectmenu", {
},
_previous: function() {
- this.list.menu( "focus", null, this._getCurrenItem() );
+ this.list.menu( "focus", null, this._getSelectedItem() );
this.list.menu("previous");
},
_next: function() {
- this.list.menu( "focus", null, this._getCurrenItem() );
+ this.list.menu( "focus", null, this._getSelectedItem() );
this.list.menu("next");
},
- _getCurrenItem: function() {
- return this.list.find( "li" ).not( '.ui-selectmenu-optgroup' ).eq( this._index() );
+ _getSelectedItem: function() {
+ return this.list.find( "li" ).not( '.ui-selectmenu-optgroup' ).eq( this.element[0].selectedIndex );
+ },
+
+ _setSelected: function( item ) {
+ this.newelement.children( '.ui-button-text' ).text( item.label );
+ this.element[0].selectedIndex = item.index;
+ this.options.value = item.value;
},
_toggle: function( event ) {
@@ -315,28 +317,22 @@ $.widget( "ui.selectmenu", {
if ( !$.isArray( this.options.source ) ) {
var data = [];
$.each( this.items, function( index, item ) {
- var option = $( item );
+ var option = $( item ),
+ optgroup = option.parent( "optgroup" );
data.push({
index: index,
value: option.attr( 'value' ),
label: option.text(),
- optgroup: option.parent("optgroup").attr("label") || false
+ optgroup: optgroup.attr("label") || false,
+ disabled: optgroup.attr( "disabled" ) || option.attr( "disabled" )
});
});
+ console.log( data );
this.options.source = data;
}
},
_destroy: function() {
- },
-
- _index: function( newIndex ) {
- if ( arguments.length ) {
- this.element[0].selectedIndex = newIndex;
- self.options.value = this._getCurrenItem().attr( "value" );
- } else {
- return this.element[0].selectedIndex;
- }
}
});
From 3503c586c4b8384e3c6f1b140935cf4454c0853a Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Sat, 24 Sep 2011 04:44:13 +0200
Subject: [PATCH 009/351] Selectmenu: added callback events
---
ui/jquery.ui.selectmenu.js | 105 ++++++++++++++++++++-----------------
1 file changed, 56 insertions(+), 49 deletions(-)
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index 22f26953ead..b000f75c85d 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -29,13 +29,14 @@ $.widget( "ui.selectmenu", {
at: "left bottom",
collision: "none"
},
- source: null,
+ source: null,
+ value: null,
// callbacks
open: null,
focus: null,
select: null,
close: null,
- change: null,
+ // change: null,
},
_create: function() {
@@ -142,46 +143,6 @@ $.widget( "ui.selectmenu", {
},
- open: function( event ) {
- var self = this,
- options = this.options,
- currentItem = self._getSelectedItem();
-
- // close all other selectmenus
- $( '.' + self.widgetBaseClass + '-open' ).not( self.newelement ).each( function() {
- $( this ).children( 'ul.ui-menu' ).data( 'element.selectelemenu' ).selectmenu( 'close' );
- });
-
- if ( options.dropdown ) {
- self.newelement
- .addClass( 'ui-corner-top' )
- .removeClass( 'ui-corner-all' );
- }
-
- self.listWrap.addClass( self.widgetBaseClass + '-open' );
- self.list.focus().menu( "focus", null, currentItem );
-
- if ( !options.dropdown ) {
- // center current item
- if ( self.list.css("overflow") == "auto" ) {
- self.list.scrollTop( self.list.scrollTop() + currentItem.position().top - self.list.outerHeight()/2 + currentItem.outerHeight()/2 );
- }
- // calculate offset
- var _offset = (self.list.offset().top - currentItem.offset().top + (self.newelement.outerHeight() - currentItem.outerHeight()) / 2);
- $.extend( options.position, {
- my: "left top",
- at: "left top",
- offset: "0 " + _offset
- });
- }
-
- self.listWrap.position( $.extend({
- of: this.newelementWrap
- }, options.position ));
-
- this.opened = true;
- },
-
refresh: function() {
var self = this,
options = this.options;
@@ -209,12 +170,16 @@ $.widget( "ui.selectmenu", {
.menu({
select: function( event, ui ) {
var item = ui.item.data( "item.selectmenu" );
- self._setSelected( item );
+ self._setSelected( event, item );
+ item.element = $ ( self.items[ item.index ] );
+ self._trigger( "select", event, { item: item } );
self.close( event, true);
},
- focus: function( event, ui ) {
- if ( !self.opened ) self._setSelected( ui.item.data( "item.selectmenu" );
- }
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.selectmenu" );
+ if ( !self.opened ) self._setSelected( event, item );
+ self._trigger( "focus", event, { item: item } );
+ }
})
.bind( 'mouseenter.selectelemenu', function() {
self.hover = true;
@@ -230,6 +195,47 @@ $.widget( "ui.selectmenu", {
}
},
+ open: function( event ) {
+ var self = this,
+ options = this.options,
+ currentItem = self._getSelectedItem();
+
+ // close all other selectmenus
+ $( '.' + self.widgetBaseClass + '-open' ).not( self.newelement ).each( function() {
+ $( this ).children( 'ul.ui-menu' ).data( 'element.selectelemenu' ).selectmenu( 'close' );
+ });
+
+ if ( options.dropdown ) {
+ self.newelement
+ .addClass( 'ui-corner-top' )
+ .removeClass( 'ui-corner-all' );
+ }
+
+ self.listWrap.addClass( self.widgetBaseClass + '-open' );
+ self.list.focus().menu( "focus", null, currentItem );
+
+ if ( !options.dropdown ) {
+ // center current item
+ if ( self.list.css("overflow") == "auto" ) {
+ self.list.scrollTop( self.list.scrollTop() + currentItem.position().top - self.list.outerHeight()/2 + currentItem.outerHeight()/2 );
+ }
+ // calculate offset
+ var _offset = (self.list.offset().top - currentItem.offset().top + (self.newelement.outerHeight() - currentItem.outerHeight()) / 2);
+ $.extend( options.position, {
+ my: "left top",
+ at: "left top",
+ offset: "0 " + _offset
+ });
+ }
+
+ self.listWrap.position( $.extend({
+ of: this.newelementWrap
+ }, options.position ));
+
+ this.opened = true;
+ self._trigger( "open", event );
+ },
+
close: function( event, focus ) {
var self = this,
options = this.options;
@@ -244,6 +250,8 @@ $.widget( "ui.selectmenu", {
this.opened = false;
if (focus) self.newelement.focus();
+
+ self._trigger( "close", event );
},
_renderMenu: function( ul, items ) {
@@ -289,7 +297,7 @@ $.widget( "ui.selectmenu", {
return this.list.find( "li" ).not( '.ui-selectmenu-optgroup' ).eq( this.element[0].selectedIndex );
},
- _setSelected: function( item ) {
+ _setSelected: function( event, item ) {
this.newelement.children( '.ui-button-text' ).text( item.label );
this.element[0].selectedIndex = item.index;
this.options.value = item.value;
@@ -326,8 +334,7 @@ $.widget( "ui.selectmenu", {
optgroup: optgroup.attr("label") || false,
disabled: optgroup.attr( "disabled" ) || option.attr( "disabled" )
});
- });
- console.log( data );
+ });
this.options.source = data;
}
},
From d2a6eadde015fcd49526a84100157e229ff5845a Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Sat, 24 Sep 2011 04:47:11 +0200
Subject: [PATCH 010/351] Selectmenu: added destroy method
---
ui/jquery.ui.selectmenu.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js
index b000f75c85d..4053e0d9c54 100644
--- a/ui/jquery.ui.selectmenu.js
+++ b/ui/jquery.ui.selectmenu.js
@@ -340,6 +340,10 @@ $.widget( "ui.selectmenu", {
},
_destroy: function() {
+ this.listWrap.remove();
+ this.newelementWrap.remove();
+ this.element.show().unbind( '.selectmenu' );
+ $( document ).unbind( '.selectmenu' );
}
});
From 17c8ec587dbf41079cf833d22983ebe1d6d16094 Mon Sep 17 00:00:00 2001
From: Felix Nagel
Date: Sat, 24 Sep 2011 05:29:05 +0200
Subject: [PATCH 011/351] Selectmenu: improved disabled implementation
---
demos/selectmenu/default.html | 4 +-
ui/jquery.ui.selectmenu.js | 86 +++++++++++++++++++++--------------
2 files changed, 54 insertions(+), 36 deletions(-)
diff --git a/demos/selectmenu/default.html b/demos/selectmenu/default.html
index c4393b57014..bd1ca7307c8 100644
--- a/demos/selectmenu/default.html
+++ b/demos/selectmenu/default.html
@@ -38,10 +38,10 @@