Skip to content

Commit dffe8f6

Browse files
committed
Merge branch 'master' into selectmenu
2 parents d94e217 + 6d3a1e1 commit dffe8f6

30 files changed

Lines changed: 566 additions & 303 deletions

AUTHORS.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,8 @@ Pavel Selitskas <p.selitskas@gmail.com>
231231
Bjørn Johansen <bjorn.johansen@metronet.no>
232232
Matthieu Penant <thieum22@hotmail.com>
233233
Dominic Barnes <dominic@dbarnes.info>
234+
David Sullivan <david.sullivan@gmail.com>
235+
Thomas Jaggi <thomas.jaggi@gmail.com>
236+
Vahid Sohrabloo <vahid4134@gmail.com>
237+
Travis Carden <travis.carden@gmail.com>
238+
Bruno M. Custódio <bruno@brunomcustodio.com>

build/tasks/build.js

Lines changed: 27 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ grunt.registerMultiTask( "zip", "Create a zip file for release", function() {
159159

160160
grunt.registerMultiTask( "md5", "Create list of md5 hashes for CDN uploads", function() {
161161
// remove dest file before creating it, to make sure itself is not included
162-
if ( path.existsSync( this.file.dest ) ) {
162+
if ( fs.existsSync( this.file.dest ) ) {
163163
fs.unlinkSync( this.file.dest );
164164
}
165165
var crypto = require( "crypto" ),
@@ -175,67 +175,43 @@ grunt.registerMultiTask( "md5", "Create list of md5 hashes for CDN uploads", fun
175175
});
176176

177177
grunt.registerTask( "generate_themes", function() {
178-
var download, files, done, configContent,
179-
target = "dist/" + grunt.template.process( grunt.config( "files.themes" ), grunt.config() ) + "/",
178+
var download, done,
180179
distFolder = "dist/" + grunt.template.process( grunt.config( "files.dist" ), grunt.config() ),
181-
configFile = "node_modules/download.jqueryui.com/config.json";
180+
target = "dist/" + grunt.template.process( grunt.config( "files.themes" ), grunt.config() ) + "/";
181+
182182
try {
183183
require.resolve( "download.jqueryui.com" );
184184
} catch( error ) {
185185
throw new Error( "You need to manually install download.jqueryui.com for this task to work" );
186186
}
187187

188-
// copy release files into download builder to avoid cloning again
189-
grunt.file.expandFiles( distFolder + "/**" ).forEach(function( file ) {
190-
grunt.file.copy( file, "node_modules/download.jqueryui.com/release/" + file.replace(/^dist\/jquery-ui-/, "") );
191-
});
192-
// make it look for the right version
193-
configContent = grunt.file.readJSON( configFile );
194-
configContent.jqueryUi.stable.version = grunt.config( "pkg.version" );
195-
grunt.file.write( configFile, JSON.stringify( configContent, null, "\t" ) + "\n" );
196-
197-
download = new ( require( "download.jqueryui.com" ) )();
198-
199-
files = grunt.file.expandFiles( distFolder + "/themes/base/**/*" );
200-
files.forEach(function( fileName ) {
201-
grunt.file.copy( fileName, target + fileName.replace( distFolder, "" ) );
188+
download = require( "download.jqueryui.com" )({
189+
config: {
190+
"jqueryUi": {
191+
"stable": { "path": path.resolve( __dirname + "/../../" + distFolder ) }
192+
},
193+
"jquery": "skip"
194+
}
202195
});
203196

204197
done = this.async();
205-
grunt.utils.async.forEach( download.themeroller.gallery(), function( theme, done ) {
206-
var folderName = theme.folderName(),
207-
concatTarget = "css-" + folderName,
208-
cssContent = theme.css(),
209-
cssFolderName = target + "themes/" + folderName + "/",
210-
cssFileName = cssFolderName + "jquery.ui.theme.css",
211-
cssFiles = grunt.config.get( "concat.css.src" )[ 1 ].slice();
212-
213-
grunt.file.write( cssFileName, cssContent );
214-
215-
// get css components, replace the last file with the current theme
216-
cssFiles.splice(-1);
217-
cssFiles.push( "<strip_all_banners:" + cssFileName + ">" );
218-
grunt.config.get( "concat" )[ concatTarget ] = {
219-
src: [ "<banner:meta.bannerCSS>", cssFiles ],
220-
dest: cssFolderName + "jquery-ui.css"
221-
};
222-
grunt.task.run( "concat:" + concatTarget );
223-
224-
theme.fetchImages(function( err, files ) {
225-
if ( err ) {
226-
done( err );
227-
return;
228-
}
229-
files.forEach(function( file ) {
230-
grunt.file.write( cssFolderName + "images/" + file.path, file.data );
231-
});
232-
done();
233-
});
234-
}, function( err ) {
235-
if ( err ) {
236-
grunt.log.error( err );
198+
download.buildThemesBundle(function( error, files ) {
199+
if ( error ) {
200+
grunt.log.error( error );
201+
return done( false );
237202
}
238-
done( !err );
203+
204+
done(
205+
files.every(function( file ) {
206+
try {
207+
grunt.file.write( target + file.path, file.data );
208+
} catch( err ) {
209+
grunt.log.error( err );
210+
return false;
211+
}
212+
return true;
213+
}) && grunt.log.writeln( "Generated at " + target )
214+
);
239215
});
240216
});
241217

demos/accordion/hoverintent.html

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
});
1717
});
1818

19-
var cfg = ($.hoverintent = {
20-
sensitivity: 7,
21-
interval: 100
22-
});
23-
19+
/*
20+
* hoverIntent | Copyright 2011 Brian Cherne
21+
* http://cherne.net/brian/resources/jquery.hoverIntent.html
22+
* modified by the jQuery UI team
23+
*/
2424
$.event.special.hoverintent = {
2525
setup: function() {
2626
$( this ).bind( "mouseover", jQuery.event.special.hoverintent.handler );
@@ -29,41 +29,56 @@
2929
$( this ).unbind( "mouseover", jQuery.event.special.hoverintent.handler );
3030
},
3131
handler: function( event ) {
32-
var that = this,
32+
var currentX, currentY, timeout,
3333
args = arguments,
3434
target = $( event.target ),
35-
cX, cY, pX, pY;
35+
previousX = event.pageX,
36+
previousY = event.pageY;
3637

3738
function track( event ) {
38-
cX = event.pageX;
39-
cY = event.pageY;
39+
currentX = event.pageX;
40+
currentY = event.pageY;
4041
};
41-
pX = event.pageX;
42-
pY = event.pageY;
42+
4343
function clear() {
4444
target
4545
.unbind( "mousemove", track )
46-
.unbind( "mouseout", arguments.callee );
46+
.unbind( "mouseout", clear );
4747
clearTimeout( timeout );
4848
}
49+
4950
function handler() {
50-
if ( ( Math.abs( pX - cX ) + Math.abs( pY - cY ) ) < cfg.sensitivity ) {
51+
var prop,
52+
orig = event;
53+
54+
if ( ( Math.abs( previousX - currentX ) +
55+
Math.abs( previousY - currentY ) ) < 7 ) {
5156
clear();
52-
event.type = "hoverintent";
53-
// prevent accessing the original event since the new event
57+
58+
event = $.Event( "hoverintent" );
59+
for ( prop in orig ) {
60+
if ( !( prop in event ) ) {
61+
event[ prop ] = orig[ prop ];
62+
}
63+
}
64+
// Prevent accessing the original event since the new event
5465
// is fired asynchronously and the old event is no longer
5566
// usable (#6028)
56-
event.originalEvent = {};
57-
jQuery.event.handle.apply( that, args );
67+
delete event.originalEvent;
68+
69+
target.trigger( event );
5870
} else {
59-
pX = cX;
60-
pY = cY;
61-
timeout = setTimeout( handler, cfg.interval );
71+
previousX = currentX;
72+
previousY = currentY;
73+
timeout = setTimeout( handler, 100 );
6274
}
6375
}
64-
var timeout = setTimeout( handler, cfg.interval );
65-
target.mousemove( track ).mouseout( clear );
66-
return true;
76+
77+
timeout = setTimeout( handler, 100 );
78+
target.bind({
79+
mousemove: track,
80+
mouseout: clear
81+
});
6782
}
6883
};
6984
</script>

demos/autocomplete/combobox.html

Lines changed: 80 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -37,91 +37,52 @@
3737
(function( $ ) {
3838
$.widget( "ui.combobox", {
3939
_create: function() {
40-
var input,
41-
that = this,
42-
wasOpen = false,
43-
select = this.element.hide(),
44-
selected = select.children( ":selected" ),
45-
value = selected.val() ? selected.text() : "",
46-
wrapper = this.wrapper = $( "<span>" )
47-
.addClass( "ui-combobox" )
48-
.insertAfter( select );
49-
50-
function removeIfInvalid( element ) {
51-
var value = $( element ).val(),
52-
matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( value ) + "$", "i" ),
53-
valid = false;
54-
select.children( "option" ).each(function() {
55-
if ( $( this ).text().match( matcher ) ) {
56-
this.selected = valid = true;
57-
return false;
58-
}
59-
});
40+
this.wrapper = $( "<span>" )
41+
.addClass( "ui-combobox" )
42+
.insertAfter( this.element );
6043

61-
if ( !valid ) {
62-
// remove invalid value, as it didn't match anything
63-
$( element )
64-
.val( "" )
65-
.attr( "title", value + " didn't match any item" )
66-
.tooltip( "open" );
67-
select.val( "" );
68-
setTimeout(function() {
69-
input.tooltip( "close" ).attr( "title", "" );
70-
}, 2500 );
71-
input.data( "ui-autocomplete" ).term = "";
72-
}
73-
}
44+
this._createAutocomplete();
45+
this._createShowAllButton();
46+
},
47+
48+
_createAutocomplete: function() {
49+
var selected = this.element.children( ":selected" ),
50+
value = selected.val() ? selected.text() : "";
7451

75-
input = $( "<input>" )
76-
.appendTo( wrapper )
52+
this.input = $( "<input>" )
53+
.appendTo( this.wrapper )
7754
.val( value )
7855
.attr( "title", "" )
79-
.addClass( "ui-state-default ui-combobox-input" )
56+
.addClass( "ui-state-default ui-combobox-input ui-widget ui-widget-content ui-corner-left" )
8057
.autocomplete({
8158
delay: 0,
8259
minLength: 0,
83-
source: function( request, response ) {
84-
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
85-
response( select.children( "option" ).map(function() {
86-
var text = $( this ).text();
87-
if ( this.value && ( !request.term || matcher.test(text) ) )
88-
return {
89-
label: text.replace(
90-
new RegExp(
91-
"(?![^&;]+;)(?!<[^<>]*)(" +
92-
$.ui.autocomplete.escapeRegex(request.term) +
93-
")(?![^<>]*>)(?![^&;]+;)", "gi"
94-
), "<strong>$1</strong>" ),
95-
value: text,
96-
option: this
97-
};
98-
}) );
99-
},
100-
select: function( event, ui ) {
101-
ui.item.option.selected = true;
102-
that._trigger( "selected", event, {
103-
item: ui.item.option
104-
});
105-
},
106-
change: function( event, ui ) {
107-
if ( !ui.item ) {
108-
removeIfInvalid( this );
109-
}
110-
}
60+
source: $.proxy( this, "_source" )
11161
})
112-
.addClass( "ui-widget ui-widget-content ui-corner-left" );
62+
.tooltip({
63+
tooltipClass: "ui-state-highlight"
64+
});
65+
66+
this._on( this.input, {
67+
autocompleteselect: function( event, ui ) {
68+
ui.item.option.selected = true;
69+
this._trigger( "select", event, {
70+
item: ui.item.option
71+
});
72+
},
73+
74+
autocompletechange: "_removeIfInvalid"
75+
});
76+
},
11377

114-
input.data( "ui-autocomplete" )._renderItem = function( ul, item ) {
115-
return $( "<li>" )
116-
.append( "<a>" + item.label + "</a>" )
117-
.appendTo( ul );
118-
};
78+
_createShowAllButton: function() {
79+
var wasOpen = false;
11980

12081
$( "<a>" )
12182
.attr( "tabIndex", -1 )
12283
.attr( "title", "Show All Items" )
12384
.tooltip()
124-
.appendTo( wrapper )
85+
.appendTo( this.wrapper )
12586
.button({
12687
icons: {
12788
primary: "ui-icon-triangle-1-s"
@@ -136,18 +97,62 @@
13697
.click(function() {
13798
input.focus();
13899

139-
// close if already visible
100+
// Close if already visible
140101
if ( wasOpen ) {
141102
return;
142103
}
143104

144-
// pass empty string as value to search for, displaying all results
105+
// Pass empty string as value to search for, displaying all results
145106
input.autocomplete( "search", "" );
146107
});
108+
},
109+
110+
_source: function( request, response ) {
111+
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
112+
response( this.element.children( "option" ).map(function() {
113+
var text = $( this ).text();
114+
if ( this.value && ( !request.term || matcher.test(text) ) )
115+
return {
116+
label: text,
117+
value: text,
118+
option: this
119+
};
120+
}) );
121+
},
122+
123+
_removeIfInvalid: function( event, ui ) {
147124

148-
input.tooltip({
149-
tooltipClass: "ui-state-highlight"
125+
// Selected an item, nothing to do
126+
if ( ui.item ) {
127+
return;
128+
}
129+
130+
// Search for a match (case-insensitive)
131+
var value = this.input.val(),
132+
valueLowerCase = value.toLowerCase(),
133+
valid = false;
134+
this.element.children( "option" ).each(function() {
135+
if ( $( this ).text().toLowerCase() === valueLowerCase ) {
136+
this.selected = valid = true;
137+
return false;
138+
}
150139
});
140+
141+
// Found a match, nothing to do
142+
if ( valid ) {
143+
return;
144+
}
145+
146+
// Remove invalid value
147+
this.input
148+
.val( "" )
149+
.attr( "title", value + " didn't match any item" )
150+
.tooltip( "open" );
151+
this.element.val( "" );
152+
this._delay(function() {
153+
this.input.tooltip( "close" ).attr( "title", "" );
154+
}, 2500 );
155+
this.input.data( "ui-autocomplete" ).term = "";
151156
},
152157

153158
_destroy: function() {

0 commit comments

Comments
 (0)