diff --git a/src/inputs/typeahead.js b/src/inputs/typeahead.js index 1e5c5d4..69e5edf 100644 --- a/src/inputs/typeahead.js +++ b/src/inputs/typeahead.js @@ -89,8 +89,8 @@ $(function(){ }, /* - if in sourceData values <> texts, put typeahead in "objects" mode: - user must pick some value from list + if in sourceData values <> texts, typeahead in "objects" mode: + user must pick some value from list, otherwise `null` returned. if all values == texts put typeahead in "strings" mode: anything what entered is submited. */ diff --git a/test/main.js b/test/main.js index 0863c1c..f0ecdc5 100644 --- a/test/main.js +++ b/test/main.js @@ -31,7 +31,11 @@ require(["loader", jqurl], function(loader) { switch(params.f) { case 'bootstrap': - custom = ['test/unit/datefield', 'test/unit/date', 'test/unit/wysihtml5']; + custom = ['test/unit/datefield', + 'test/unit/date', + 'test/unit/wysihtml5', + 'test/unit/typeahead' + ]; break; default: diff --git a/test/unit/typeahead.js b/test/unit/typeahead.js new file mode 100644 index 0000000..260e940 --- /dev/null +++ b/test/unit/typeahead.js @@ -0,0 +1,122 @@ +$(function () { + + module("typeahead", { + setup: function(){ + sfx = $('#qunit-fixture'), + fx = $('#async-fixture'); + $.support.transition = false; + } + }); + + asyncTest("should load correct value and save new entered text (source as objects)", function () { + var v = 2, + e = $('<a href="#" data-pk="1" data-name="text1" data-type="typeahead" data-value="'+v+'" data-url="post.php"></a>').appendTo(fx).editable({ + source: groups, + typeahead: { + items: 5 + } + }), + newText = 'adm'; + + + equal(e.text(), groups[v], 'autotext ok'); + equal(e.data().editable.value, v, 'initial value ok'); + + e.click(); + var p = tip(e), + $input = p.find('input[type=text]'); + + ok(p.is(':visible'), 'popup visible'); + ok($input.length, 'input exists'); + equal($input.val(), groups[v], 'input contain correct text'); + equal($input.data('value'), v, 'input contain correct data-value'); + ok($input.typeahead, 'typeahead applied to input'); + + $input.val(newText).keyup(); + ok(p.find('.typeahead.dropdown-menu').is(':visible'), 'dropdown visible'); + + //select `Admin` + v = 5; + p.find('.typeahead.dropdown-menu').find('.active').click(); + + equal($input.val(), groups[v], 'input contain correct text'); + p.find('form').submit(); + + setTimeout(function() { + ok(!p.is(':visible'), 'popup closed'); + equal(e.data('editable').value, v, 'new text saved to value'); + equal(e.text(), groups[v], 'new text shown'); + + e.click(); + p = tip(e), + $input = p.find('input[type=text]'); + + $input.val('not_matched_text').keyup(); + ok(!p.find('.typeahead.dropdown-menu').is(':visible'), 'dropdown not visible'); + + p.find('form').submit(); + setTimeout(function() { + equal(e.data('editable').value, null, 'null saved to value'); + equal(e.text(), e.data().editable.options.emptytext, 'emptytext shown'); + + e.remove(); + start(); + }, timeout); + }, timeout); + }); + + + asyncTest("should load correct value and save new entered text (source as strings)", function () { + var v = 'a', + e = $('<a href="#" data-pk="1" data-name="text1" data-type="typeahead" data-value="'+v+'" data-url="post.php"></a>').appendTo(fx).editable({ + source: ['a', 'ab', 'c'] + }); + + + equal(e.text(), v, 'autotext ok'); + equal(e.data().editable.value, v, 'initial value ok'); + + e.click(); + var p = tip(e), + $input = p.find('input[type=text]'); + + ok(p.is(':visible'), 'popup visible'); + ok($input.length, 'input exists'); + equal($input.val(), v, 'input contain correct text'); + equal($input.data('value'), undefined, 'input not contain data-value'); + ok($input.typeahead, 'typeahead applied to input'); + + $input.val('b').keyup(); + ok(p.find('.typeahead.dropdown-menu').is(':visible'), 'dropdown visible'); + + //select `ab` + v = 'ab'; + p.find('.typeahead.dropdown-menu').find('.active').click(); + + equal($input.val(), v, 'input contain correct text'); + p.find('form').submit(); + + setTimeout(function() { + ok(!p.is(':visible'), 'popup closed'); + equal(e.data('editable').value, v, 'new text saved to value'); + equal(e.text(), v, 'new text shown'); + + e.click(); + p = tip(e), + $input = p.find('input[type=text]'); + + v = 'not_matched_text'; + $input.val(v).keyup(); + ok(!p.find('.typeahead.dropdown-menu').is(':visible'), 'dropdown not visible'); + + p.find('form').submit(); + setTimeout(function() { + equal(e.data('editable').value, v, 'new text saved to value'); + equal(e.text(), v, 'new text shown'); + e.remove(); + start(); + }, timeout); + }, timeout); + }); + +}); \ No newline at end of file