2015-04-03 19:57:57 +00:00
|
|
|
define( [
|
|
|
|
"jquery",
|
2015-07-15 01:56:36 +00:00
|
|
|
"ui/widgets/autocomplete"
|
2015-04-03 19:57:57 +00:00
|
|
|
], function( $ ) {
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
module( "autocomplete: options" );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2013-04-30 14:27:22 +00:00
|
|
|
var data = [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby",
|
|
|
|
"python", "c", "scala", "groovy", "haskell", "perl" ];
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2014-01-20 21:13:55 +00:00
|
|
|
test( "appendTo: null", function() {
|
|
|
|
expect( 1 );
|
|
|
|
var element = $( "#autocomplete" ).autocomplete();
|
2013-04-30 14:27:22 +00:00
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ], document.body,
|
|
|
|
"defaults to body" );
|
2011-06-13 18:09:44 +00:00
|
|
|
element.autocomplete( "destroy" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2014-01-20 21:13:55 +00:00
|
|
|
|
|
|
|
test( "appendTo: explicit", function() {
|
|
|
|
expect( 6 );
|
|
|
|
var detached = $( "<div>" ),
|
|
|
|
element = $( "#autocomplete" );
|
2010-07-21 18:54:20 +00:00
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
element.autocomplete( {
|
2013-04-30 14:27:22 +00:00
|
|
|
appendTo: ".autocomplete-wrap"
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2013-04-30 14:27:22 +00:00
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ],
|
|
|
|
$( "#autocomplete-wrap1" )[ 0 ], "first found element" );
|
|
|
|
equal( $( "#autocomplete-wrap2 .ui-autocomplete" ).length, 0,
|
|
|
|
"only appends to one element" );
|
2011-06-13 18:09:44 +00:00
|
|
|
element.autocomplete( "destroy" );
|
2010-07-21 18:54:20 +00:00
|
|
|
|
2013-04-30 14:27:22 +00:00
|
|
|
element.autocomplete().autocomplete( "option", "appendTo", "#autocomplete-wrap1" );
|
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ],
|
|
|
|
$( "#autocomplete-wrap1" )[ 0 ], "modified after init" );
|
2011-06-13 18:09:44 +00:00
|
|
|
element.autocomplete( "destroy" );
|
2012-11-28 15:33:44 +00:00
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
element.autocomplete( {
|
2012-11-28 15:33:44 +00:00
|
|
|
appendTo: detached
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2013-04-30 14:27:22 +00:00
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ],
|
|
|
|
"detached jQuery object" );
|
2012-11-28 15:33:44 +00:00
|
|
|
element.autocomplete( "destroy" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
element.autocomplete( {
|
2013-04-30 14:27:22 +00:00
|
|
|
appendTo: detached[ 0 ]
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2013-04-30 14:27:22 +00:00
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ],
|
|
|
|
"detached DOM element" );
|
2012-11-28 15:33:44 +00:00
|
|
|
element.autocomplete( "destroy" );
|
2012-12-07 16:58:58 +00:00
|
|
|
|
|
|
|
element.autocomplete().autocomplete( "option", "appendTo", detached );
|
2013-04-30 14:27:22 +00:00
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ], detached[ 0 ],
|
|
|
|
"detached DOM element via option()" );
|
2012-12-07 16:58:58 +00:00
|
|
|
element.autocomplete( "destroy" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-07-21 18:54:20 +00:00
|
|
|
|
2014-01-20 21:13:55 +00:00
|
|
|
test( "appendTo: ui-front", function() {
|
|
|
|
expect( 2 );
|
|
|
|
var element = $( "#autocomplete" );
|
|
|
|
|
|
|
|
$( "#autocomplete-wrap2" ).addClass( "ui-front" );
|
|
|
|
element.autocomplete();
|
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ],
|
|
|
|
$( "#autocomplete-wrap2" )[ 0 ], "null, inside .ui-front" );
|
|
|
|
element.autocomplete( "destroy" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
element.autocomplete( {
|
2014-01-20 21:13:55 +00:00
|
|
|
appendTo: $()
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2014-01-20 21:13:55 +00:00
|
|
|
equal( element.autocomplete( "widget" ).parent()[ 0 ],
|
2014-02-21 12:35:04 +00:00
|
|
|
$( "#autocomplete-wrap2" )[ 0 ], "empty jQuery object, inside .ui-front" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2014-01-20 21:13:55 +00:00
|
|
|
|
2011-03-15 13:36:36 +00:00
|
|
|
function autoFocusTest( afValue, focusedLength ) {
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-03-15 13:36:36 +00:00
|
|
|
autoFocus: afValue,
|
2011-03-15 12:42:28 +00:00
|
|
|
delay: 0,
|
|
|
|
source: data,
|
2012-10-23 14:36:42 +00:00
|
|
|
open: function() {
|
2013-04-30 14:27:22 +00:00
|
|
|
equal(
|
|
|
|
element.autocomplete( "widget" )
|
2015-01-19 16:00:57 +00:00
|
|
|
.find( ".ui-menu-item-wrapper.ui-state-active" )
|
2013-04-30 14:27:22 +00:00
|
|
|
.length,
|
|
|
|
focusedLength,
|
2015-08-21 04:11:54 +00:00
|
|
|
"first item is " + ( afValue ? "" : "not" ) + " auto focused" );
|
2011-06-13 18:09:44 +00:00
|
|
|
start();
|
2011-03-15 12:42:28 +00:00
|
|
|
}
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2015-05-14 01:54:08 +00:00
|
|
|
element.val( "ja" ).trigger( "keydown" );
|
2011-03-15 12:42:28 +00:00
|
|
|
stop();
|
2011-03-15 13:36:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
test( "autoFocus: false", function() {
|
2011-06-13 18:09:44 +00:00
|
|
|
expect( 1 );
|
2011-03-15 13:36:36 +00:00
|
|
|
autoFocusTest( false, 0 );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2011-03-15 12:42:28 +00:00
|
|
|
|
|
|
|
test( "autoFocus: true", function() {
|
2011-06-13 18:09:44 +00:00
|
|
|
expect( 1 );
|
2011-03-15 13:36:36 +00:00
|
|
|
autoFocusTest( true, 1 );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-07-21 18:54:20 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
asyncTest( "delay", function() {
|
|
|
|
expect( 2 );
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-06-13 18:09:44 +00:00
|
|
|
source: data,
|
2015-02-17 15:11:58 +00:00
|
|
|
delay: 25
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2011-06-13 18:09:44 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
2015-05-14 01:54:08 +00:00
|
|
|
element.val( "ja" ).trigger( "keydown" );
|
2011-06-13 18:09:44 +00:00
|
|
|
|
|
|
|
ok( menu.is( ":hidden" ), "menu is closed immediately after search" );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
setTimeout( function() {
|
2011-06-13 18:09:44 +00:00
|
|
|
ok( menu.is( ":visible" ), "menu is open after delay" );
|
2010-07-30 16:59:33 +00:00
|
|
|
start();
|
2015-02-17 15:11:58 +00:00
|
|
|
}, 50 );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-07-30 16:59:33 +00:00
|
|
|
|
2015-01-30 14:56:42 +00:00
|
|
|
asyncTest( "disabled", function( assert ) {
|
2013-03-14 23:08:21 +00:00
|
|
|
expect( 5 );
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-06-13 18:09:44 +00:00
|
|
|
source: data,
|
2013-03-14 23:08:21 +00:00
|
|
|
delay: 0
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2013-03-14 23:08:21 +00:00
|
|
|
menu = element.autocomplete( "disable" ).autocomplete( "widget" );
|
2015-05-14 01:54:08 +00:00
|
|
|
element.val( "ja" ).trigger( "keydown" );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
ok( menu.is( ":hidden" ) );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2015-01-30 14:56:42 +00:00
|
|
|
assert.lacksClasses( element, "ui-state-disabled" );
|
|
|
|
assert.hasClasses( menu, "ui-autocomplete-disabled" );
|
2013-03-14 23:08:21 +00:00
|
|
|
ok( !element.attr( "aria-disabled" ), "element doesn't get aria-disabled" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
setTimeout( function() {
|
2011-06-13 18:09:44 +00:00
|
|
|
ok( menu.is( ":hidden" ) );
|
|
|
|
start();
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
|
|
|
} );
|
2011-06-13 18:09:44 +00:00
|
|
|
|
|
|
|
test( "minLength", function() {
|
|
|
|
expect( 2 );
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-06-13 18:09:44 +00:00
|
|
|
source: data
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2011-06-13 18:09:44 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
|
|
|
element.autocomplete( "search", "" );
|
|
|
|
ok( menu.is( ":hidden" ), "blank not enough for minLength: 1" );
|
|
|
|
|
|
|
|
element.autocomplete( "option", "minLength", 0 );
|
|
|
|
element.autocomplete( "search", "" );
|
|
|
|
ok( menu.is( ":visible" ), "blank enough for minLength: 0" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2011-06-13 18:09:44 +00:00
|
|
|
|
2012-02-11 15:12:51 +00:00
|
|
|
asyncTest( "minLength, exceed then drop below", function() {
|
|
|
|
expect( 4 );
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2012-02-11 15:12:51 +00:00
|
|
|
minLength: 2,
|
|
|
|
source: function( req, res ) {
|
|
|
|
equal( req.term, "12", "correct search term" );
|
2015-08-21 04:11:54 +00:00
|
|
|
setTimeout( function() {
|
|
|
|
res( [ "item" ] );
|
|
|
|
} );
|
2012-02-11 15:12:51 +00:00
|
|
|
}
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2012-02-11 15:12:51 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
|
|
|
|
|
|
|
ok( menu.is( ":hidden" ), "menu is hidden before first search" );
|
|
|
|
element.autocomplete( "search", "12" );
|
|
|
|
|
|
|
|
ok( menu.is( ":hidden" ), "menu is hidden before second search" );
|
|
|
|
element.autocomplete( "search", "1" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
setTimeout( function() {
|
2012-02-11 15:12:51 +00:00
|
|
|
ok( menu.is( ":hidden" ), "menu is hidden after searches" );
|
|
|
|
start();
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
|
|
|
} );
|
2012-02-11 15:12:51 +00:00
|
|
|
|
2012-02-15 16:41:30 +00:00
|
|
|
test( "minLength, exceed then drop below then exceed", function() {
|
|
|
|
expect( 3 );
|
|
|
|
var _res = [],
|
2015-08-21 04:11:54 +00:00
|
|
|
element = $( "#autocomplete" ).autocomplete( {
|
2012-02-15 16:41:30 +00:00
|
|
|
minLength: 2,
|
|
|
|
source: function( req, res ) {
|
|
|
|
_res.push( res );
|
|
|
|
}
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2012-02-15 16:41:30 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
// Trigger a valid search
|
2012-02-15 16:41:30 +00:00
|
|
|
ok( menu.is( ":hidden" ), "menu is hidden before first search" );
|
|
|
|
element.autocomplete( "search", "12" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
// Trigger a search below the minLength, to turn on cancelSearch flag
|
2012-02-15 16:41:30 +00:00
|
|
|
ok( menu.is( ":hidden" ), "menu is hidden before second search" );
|
|
|
|
element.autocomplete( "search", "1" );
|
|
|
|
|
2015-08-21 04:11:54 +00:00
|
|
|
// Trigger a valid search
|
2012-02-15 16:41:30 +00:00
|
|
|
element.autocomplete( "search", "13" );
|
2015-08-21 04:11:54 +00:00
|
|
|
|
|
|
|
// React as if the first search was cancelled (default ajax behavior)
|
|
|
|
_res[ 0 ]( [] );
|
|
|
|
|
|
|
|
// React to second search
|
|
|
|
_res[ 1 ]( [ "13" ] );
|
2012-02-15 16:41:30 +00:00
|
|
|
|
|
|
|
ok( menu.is( ":visible" ), "menu is visible after searches" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2012-02-11 15:12:51 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
test( "source, local string array", function() {
|
|
|
|
expect( 1 );
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-06-13 18:09:44 +00:00
|
|
|
source: data
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2011-06-13 18:09:44 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
|
|
|
element.val( "ja" ).autocomplete( "search" );
|
|
|
|
equal( menu.find( ".ui-menu-item" ).text(), "javajavascript" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2011-06-13 18:09:44 +00:00
|
|
|
|
|
|
|
function sourceTest( source, async ) {
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-06-13 18:09:44 +00:00
|
|
|
source: source
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2011-06-13 18:09:44 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
|
|
|
function result() {
|
2014-01-22 15:40:19 +00:00
|
|
|
var items = menu.find( ".ui-menu-item" );
|
|
|
|
equal( items.length, 3, "Should find three results." );
|
|
|
|
deepEqual( items.eq( 0 ).data( "ui-autocomplete-item" ), {
|
|
|
|
label: "java",
|
|
|
|
value: "java"
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2014-01-22 15:40:19 +00:00
|
|
|
deepEqual( items.eq( 1 ).data( "ui-autocomplete-item" ), {
|
|
|
|
label: "javascript",
|
|
|
|
value: "javascript"
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2014-01-22 15:40:19 +00:00
|
|
|
deepEqual( items.eq( 2 ).data( "ui-autocomplete-item" ), {
|
|
|
|
label: "clojure",
|
|
|
|
value: "clojure"
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2011-06-13 18:09:44 +00:00
|
|
|
element.autocomplete( "destroy" );
|
|
|
|
if ( async ) {
|
|
|
|
start();
|
|
|
|
}
|
2010-01-20 14:00:14 +00:00
|
|
|
}
|
2011-06-13 18:09:44 +00:00
|
|
|
if ( async ) {
|
2010-01-20 14:00:14 +00:00
|
|
|
stop();
|
2011-06-13 18:09:44 +00:00
|
|
|
$( document ).one( "ajaxStop", result );
|
2011-08-03 20:12:46 +00:00
|
|
|
}
|
2014-01-22 15:40:19 +00:00
|
|
|
element.val( "j" ).autocomplete( "search" );
|
2011-08-03 20:12:46 +00:00
|
|
|
if ( !async ) {
|
2010-01-20 14:00:14 +00:00
|
|
|
result();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-22 15:40:19 +00:00
|
|
|
test( "source, local object array, only labels", function() {
|
|
|
|
expect( 4 );
|
2015-08-21 04:11:54 +00:00
|
|
|
sourceTest( [
|
2014-01-22 15:40:19 +00:00
|
|
|
{ label: "java", value: null },
|
|
|
|
{ label: "php", value: null },
|
|
|
|
{ label: "coldfusion", value: "" },
|
|
|
|
{ label: "javascript", value: "" },
|
|
|
|
{ label: "clojure" }
|
2015-08-21 04:11:54 +00:00
|
|
|
] );
|
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2014-01-22 15:40:19 +00:00
|
|
|
test( "source, local object array, only values", function() {
|
|
|
|
expect( 4 );
|
2015-08-21 04:11:54 +00:00
|
|
|
sourceTest( [
|
2014-01-22 15:40:19 +00:00
|
|
|
{ value: "java", label: null },
|
|
|
|
{ value: "php", label: null },
|
|
|
|
{ value: "coldfusion", label: "" },
|
|
|
|
{ value: "javascript", label: "" },
|
|
|
|
{ value: "clojure" }
|
2015-08-21 04:11:54 +00:00
|
|
|
] );
|
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
test( "source, url string with remote json string array", function() {
|
2014-01-22 15:40:19 +00:00
|
|
|
expect( 4 );
|
2011-06-13 18:09:44 +00:00
|
|
|
sourceTest( "remote_string_array.txt", true );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
test( "source, url string with remote json object array, only value properties", function() {
|
2014-01-22 15:40:19 +00:00
|
|
|
expect( 4 );
|
2011-06-13 18:09:44 +00:00
|
|
|
sourceTest( "remote_object_array_values.txt", true );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
test( "source, url string with remote json object array, only label properties", function() {
|
2014-01-22 15:40:19 +00:00
|
|
|
expect( 4 );
|
2011-06-13 18:09:44 +00:00
|
|
|
sourceTest( "remote_object_array_labels.txt", true );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
test( "source, custom", function() {
|
2014-01-22 15:40:19 +00:00
|
|
|
expect( 5 );
|
2015-08-21 04:11:54 +00:00
|
|
|
sourceTest( function( request, response ) {
|
2014-01-22 15:40:19 +00:00
|
|
|
equal( request.term, "j" );
|
2015-08-21 04:11:54 +00:00
|
|
|
response( [
|
2014-01-22 15:40:19 +00:00
|
|
|
"java",
|
|
|
|
{ label: "javascript", value: null },
|
|
|
|
{ value: "clojure", label: null }
|
2015-08-21 04:11:54 +00:00
|
|
|
] );
|
|
|
|
} );
|
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2011-06-13 18:09:44 +00:00
|
|
|
test( "source, update after init", function() {
|
|
|
|
expect( 2 );
|
2015-08-21 04:11:54 +00:00
|
|
|
var element = $( "#autocomplete" ).autocomplete( {
|
2011-06-13 18:09:44 +00:00
|
|
|
source: [ "java", "javascript", "haskell" ]
|
2015-08-21 04:11:54 +00:00
|
|
|
} ),
|
2011-06-13 18:09:44 +00:00
|
|
|
menu = element.autocomplete( "widget" );
|
|
|
|
element.val( "ja" ).autocomplete( "search" );
|
|
|
|
equal( menu.find( ".ui-menu-item" ).text(), "javajavascript" );
|
|
|
|
element.autocomplete( "option", "source", [ "php", "asp" ] );
|
|
|
|
element.val( "ph" ).autocomplete( "search" );
|
|
|
|
equal( menu.find( ".ui-menu-item" ).text(), "php" );
|
2015-08-21 04:11:54 +00:00
|
|
|
} );
|
2010-01-20 14:00:14 +00:00
|
|
|
|
2015-04-03 19:57:57 +00:00
|
|
|
} );
|