diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index cca0349..cfce619 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -3,6 +3,7 @@ X-editable changelog
Version 1.4.5 wip
----------------------------
+[enh #218] sourceCache now disables cache totally (vitalets)
[bug #156] conflict of bootstrap datepicker and jQuery UI datepicker (vitalets)
[enh] update bootstrap-datepicker to 1.1.2 (vitalets)
[enh] allow follow links in disabled state (vitalets)
diff --git a/src/containers/editable-container.js b/src/containers/editable-container.js
index 663641f..0fb1c5c 100644
--- a/src/containers/editable-container.js
+++ b/src/containers/editable-container.js
@@ -181,8 +181,8 @@ Applied as jQuery method.
/*
Currently, form is re-rendered on every show.
- The main reason is that we dont know, what container will do with content when closed:
- remove(), detach() or just hide() - it depend on container.
+ The main reason is that we dont know, what will container do with content when closed:
+ remove(), detach() or just hide() - it depends on container.
Detaching form itself before hide and re-insert before show is good solution,
but visually it looks ugly --> container changes size before hide.
diff --git a/src/containers/editable-popover.js b/src/containers/editable-popover.js
index d5c7297..e520f6f 100644
--- a/src/containers/editable-popover.js
+++ b/src/containers/editable-popover.js
@@ -59,7 +59,7 @@
*/
/*jshint laxcomma: true*/
setPosition: function () {
-
+
(function() {
var $tip = this.tip()
, inside
diff --git a/src/inputs/list.js b/src/inputs/list.js
index 8f8afb0..6690978 100644
--- a/src/inputs/list.js
+++ b/src/inputs/list.js
@@ -58,30 +58,32 @@ List - abstract class for inputs that have source option loaded from js array or
// ------------- additional functions ------------
onSourceReady: function (success, error) {
+ //run source if it function
+ var source;
+ if ($.isFunction(this.options.source)) {
+ source = this.options.source.call(this.options.scope);
+ this.sourceData = null;
+ } else {
+ source = this.options.source;
+ }
+
//if allready loaded just call success
- if($.isArray(this.sourceData)) {
+ if(this.options.sourceCache && $.isArray(this.sourceData)) {
success.call(this);
return;
}
- // try parse json in single quotes (for double quotes jquery does automatically)
+ //try parse json in single quotes (for double quotes jquery does automatically)
try {
- this.options.source = $.fn.editableutils.tryParseJson(this.options.source, false);
+ source = $.fn.editableutils.tryParseJson(source, false);
} catch (e) {
error.call(this);
return;
}
-
- var source = this.options.source;
-
- //run source if it function
- if ($.isFunction(source)) {
- source = source.call(this.options.scope);
- }
//loading from url
if (typeof source === 'string') {
- //try to get from cache
+ //try to get sourceData from cache
if(this.options.sourceCache) {
var cacheID = source,
cache;
diff --git a/test/unit/select.js b/test/unit/select.js
index a5b3da8..1a8f9ae 100644
--- a/test/unit/select.js
+++ b/test/unit/select.js
@@ -41,13 +41,15 @@ $(function () {
//open second time: items should not dublicate
e.click();
-
- ok(p.find('select').length, 'select exists');
- equal(p.find('select').find('option').length, size, 'options loaded');
- equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
-
- e.remove();
- start();
+ p = tip(e);
+ setTimeout(function() {
+ ok(p.find('select').length, 'select exists');
+ equal(p.find('select').find('option').length, size, 'options loaded');
+ equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
+
+ e.remove();
+ start();
+ }, timeout);
}, timeout);
});
@@ -106,7 +108,8 @@ $(function () {
});
test("load options from function returning array", function () {
- var e = $('customer').appendTo('#qunit-fixture').editable({
+ var counter = 0,
+ e = $('customer').appendTo('#qunit-fixture').editable({
pk: 1,
prepend: function() {
equal(this, e[0], 'prepend scope is element');
@@ -114,22 +117,30 @@ $(function () {
},
source: function() {
equal(this, e[0], 'source scope is element');
- return groups;
+ return counter ? groupsArr.concat([{10: 'test'}]) : groupsArr;
}
});
- e.click()
- var p = tip(e);
- ok(p.is(':visible'), 'popover visible');
- ok(p.find('select').length, 'select exists');
- equal(p.find('select').find('option').length, size+1, 'options loaded');
- equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
- p.find('.editable-cancel').click();
- ok(!p.is(':visible'), 'popover was removed');
+ function t() {
+ e.click()
+ var p = tip(e);
+ ok(p.is(':visible'), 'popover visible');
+ ok(p.find('select').length, 'select exists');
+ equal(p.find('select').find('option').length, size+1+counter, 'options loaded');
+ equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
+ p.find('.editable-cancel').click();
+ ok(!p.is(':visible'), 'popover was removed');
+ }
+
+ //first run
+ t();
+ //second time
+ counter = 1;
+ t();
});
asyncTest("load options from function returning URL", function () {
- var e = $('customer').appendTo('#qunit-fixture').editable({
+ var e = $('customer').appendTo(fx).editable({
pk: 1,
//need to disable cache to force request
sourceCache: false,
@@ -152,13 +163,15 @@ $(function () {
//open second time: items should not dublicate
e.click();
-
- ok(p.find('select').length, 'select exists');
- equal(p.find('select').find('option').length, size, 'options loaded');
- equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
-
- e.remove();
- start();
+ p = tip(e);
+ setTimeout(function() {
+ ok(p.find('select').length, 'select exists');
+ equal(p.find('select option').length, size, 'options loaded');
+ equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
+
+ e.remove();
+ start();
+ }, timeout);
}, timeout);
});
@@ -428,7 +441,7 @@ $(function () {
});
-
+ //since 1.4.5 sourceCache is more strong: it forces load sourceData on every click
asyncTest("sourceCache: false", function () {
$.mockjax({
@@ -448,6 +461,7 @@ $(function () {
});
setTimeout(function() {
+ //autotext for first only!
equal(req, 1, 'autotext request performed');
//click first
@@ -459,7 +473,7 @@ $(function () {
ok(p.is(':visible'), 'popover visible');
equal(p.find('select').find('option').length, size, 'options loaded');
- equal(req, 1, 'no additional request performed, loaded on autotext');
+ equal(req, 2, 'additional request performed (allthough loaded on autotext)');
p.find('.editable-cancel').click();
ok(!p.is(':visible'), 'popover was removed');
@@ -471,7 +485,7 @@ $(function () {
setTimeout(function() {
ok(p.is(':visible'), 'popover2 visible');
equal(p.find('select').find('option').length, size, 'options loaded');
- equal(req, 2, 'second request performed');
+ equal(req, 3, 'second request performed');
p.find('.editable-cancel').click();
ok(!p.is(':visible'), 'popover was removed');
@@ -690,16 +704,14 @@ $(function () {
asyncTest("change source", function () {
- var e = $('').appendTo(fx).editable({
- //need to disable cache to force request
- sourceCache: false
+ var e = $('customer').appendTo(fx).editable({
+ sourceCache: true
});
-
+
+ e.click();
+ var p = tip(e);
+
setTimeout(function() {
-
- e.click();
- var p = tip(e);
-
equal(p.find('select').find('option').length, size, 'options loaded');
equal(p.find('select').val(), e.data('editable').value, 'selected value correct') ;
@@ -707,12 +719,12 @@ $(function () {
ok(!p.is(':visible'), 'popover was closed');
$.mockjax({
- url: 'groups1.php',
+ url: 'groups-changed.php',
responseText: [{value: 'a', text: 1}, {value: 'b', text: 2}]
});
//set new source
- e.editable('option', 'source', 'groups1.php');
+ e.editable('option', 'source', 'groups-changed.php');
e.click();
setTimeout(function() {
@@ -728,8 +740,7 @@ $(function () {
e.remove();
start();
}, timeout);
-
- }, timeout);
+ }, timeout);
});
asyncTest("optgroup", function () {