diff --git a/src/jquery.jeditable.js b/src/jquery.jeditable.js
index 810a88d..f0a0a25 100644
--- a/src/jquery.jeditable.js
+++ b/src/jquery.jeditable.js
@@ -231,6 +231,7 @@
// timeout function
var t;
+ var isSubmitting = false;
if (settings.loadurl) {
t = self.setTimeout(function() {
@@ -339,13 +340,21 @@
form.submit(function(e) {
+ /* Do no submit. */
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (isSubmitting) {
+ console.warn('...we are already submitting .. stop!');
+ return false;
+ } else {
+ isSubmitting = true;
+ }
+
if (t) {
self.clearTimeout(t);
}
- /* Do no submit. */
- e.preventDefault();
-
/* Call before submit hook. */
/* If it returns false abort submitting. */
if (false !== onsubmit.apply(form, [settings, self])) {
@@ -668,13 +677,14 @@ var _supportInType = function (type) {
for (key in json) {
tuples.push([key, json[key]]); // Store: [key, value]
}
- // sort it
- tuples.sort(function(a, b) {
- a = a[1];
- b = b[1];
- return a < b ? -1 : (a > b ? 1 : 0);
- });
-
+ if (settings.sortSelectOptions) {
+ // sort it
+ tuples.sort(function (a, b) {
+ a = a[1];
+ b = b[1];
+ return a < b ? -1 : (a > b ? 1 : 0);
+ });
+ }
// now add the options to our select
var option;
for (var i = 0; i < tuples.length; i++) {
@@ -687,14 +697,14 @@ var _supportInType = function (type) {
if (key !== 'selected') {
option = $('').val(key).append(value);
- }
- // add the selected prop if it's the same as original or if the key is 'selected'
- if (key === 'selected' || key === $.trim(original.revert)) {
- $(option).prop('selected', 'selected');
- }
+ // add the selected prop if it's the same as original or if the key is 'selected'
+ if (json.selected === key || key === $.trim(original.revert)) {
+ $(option).prop('selected', 'selected');
+ }
- $(this).find('select').append(option);
+ $(this).find('select').append(option);
+ }
}
// submit on change if no submit button defined
@@ -783,6 +793,7 @@ var _supportInType = function (type) {
loadtype : 'GET',
loadtext : 'Loading...',
placeholder: 'Click to edit',
+ sortSelectOptions: false,
loaddata : {},
submitdata : {},
ajaxoptions: {}
diff --git a/tests/tests.js b/tests/tests.js
index bcadba4..486c330 100644
--- a/tests/tests.js
+++ b/tests/tests.js
@@ -24,3 +24,74 @@ QUnit.test('Enable/disable/destroy', function(assert) {
elem.editable().editable('destroy');
assert.notOk(elem.data('event.editable'));
});
+
+QUnit.module('select-boxes');
+QUnit.test('Default: NOT Sorting select options', function(assert) {
+ elem.append( 'Letter F' );
+
+ $.fn.editable.defaults.sortSelectOptions = false;
+
+ $('#select-tester').editable('http://bla', {
+ type: 'select',
+ data: {'E': 'Letter E', 'F': 'Letter F', 'D': 'Letter Disk'},
+ selected: 'F'
+ });
+
+ assert.equal( $('#select-tester').attr('title'), 'Click to edit', 'Editable enabled: it sets the title' );
+ $('#select-tester').click();
+ assert.equal($('#select-tester form').length, 1, 'Clicking Editable adds inline form');
+
+ var optionsList = [];
+ $('#select-tester option').each(function(name, val) { optionsList.push(val.text); });
+
+ assert.deepEqual(optionsList, ['Letter E', 'Letter F', 'Letter Disk'], 'Does not sort the given options-list');
+});
+QUnit.test('Default: Sorting select options', function(assert) {
+ elem.append( 'Letter F' );
+
+ $.fn.editable.defaults.sortSelectOptions = true;
+
+ $('#select-sorted-tester').editable('http://bla', {
+ type: 'select',
+ data: {'E': 'Letter E', 'F': 'Letter F', 'D': 'Letter Disk'},
+ selected: 'F'
+ });
+ assert.equal( $('#select-sorted-tester').attr('title'), 'Click to edit', 'Editable enabled: it sets the title' );
+ $('#select-sorted-tester').click();
+ assert.equal($('#select-sorted-tester form').length, 1, 'Clicking Editable adds inline form');
+
+ var optionsList = [];
+ $('#select-sorted-tester option').each(function(name, val) { optionsList.push(val.text); });
+
+ assert.deepEqual(optionsList, ['Letter Disk', 'Letter E', 'Letter F'], 'It does sort the given options list');
+});
+QUnit.module('select-boxes setting selected');
+QUnit.test('Explicitly setting a selected option', function(assert) {
+ elem.append( 'Letter F' );
+
+ $.fn.editable.defaults.sortSelectOptions = false;
+
+ $('#selected-tester').editable('http://bla', {
+ type: 'select',
+ data: {'E': 'Letter E', 'F': 'Letter F', 'D': 'Letter Disk', 'selected': 'F'},
+ });
+
+ assert.equal( $( '#selected-tester').attr('title'), 'Click to edit', 'Editable enabled: it sets the title' );
+ $('#selected-tester').click();
+ assert.equal($('#selected-tester form select :selected').text(), 'Letter F', 'Sets the correct value as selected');
+});
+QUnit.test('Not setting a selected option', function(assert) {
+ elem.append( 'Letter F' );
+
+ $.fn.editable.defaults.sortSelectOptions = false;
+
+ $('#selected-tester').editable('http://bla', {
+ type: 'select',
+ data: {'E': 'Letter E', 'F': 'Letter F', 'D': 'Letter Disk'},
+ });
+
+ assert.equal( $( '#selected-tester').attr('title'), 'Click to edit', 'Editable enabled: it sets the title' );
+ $('#selected-tester').click();
+ assert.equal($('#selected-tester form select :selected').text(), 'Letter E', 'Selects the first option as selected?');
+});
+