diff --git a/grails-app/assets/javascripts/forms-knockout-bindings.js b/grails-app/assets/javascripts/forms-knockout-bindings.js index 4778bfb..951b11b 100644 --- a/grails-app/assets/javascripts/forms-knockout-bindings.js +++ b/grails-app/assets/javascripts/forms-knockout-bindings.js @@ -1165,14 +1165,13 @@ var dataLoader = new ecodata.forms.dataLoader(target.context, target.config); var dataLoaderConfig = target.get('computed'); if (!dataLoaderConfig) { - throw "This extender can only be used with the metadata extender"; + throw "This extender can only be used with the metadata extender and expects a computed property to be defined"; } var dependencyTracker = ko.computed(function () { return dataLoader.prepop(dataLoaderConfig).done( function(data) { target(data); }); - }); - //dependencyTracker.subscribe(function() { console.log("bananas")}) + }); // This is a computed rather than a pureComputed as it has a side effect. return target; } diff --git a/grails-app/assets/javascripts/forms.js b/grails-app/assets/javascripts/forms.js index 2e72ad0..ac15063 100644 --- a/grails-app/assets/javascripts/forms.js +++ b/grails-app/assets/javascripts/forms.js @@ -860,7 +860,6 @@ function orEmptyArray(v) { } } else if (metadata.constraints.type == 'pre-populated') { - console.log("******************** Encountered pre-pop constraints for "+self.getName()+"***************************************") var defaultConstraints = metadata.constraints.defaults || []; var constraintsObservable = ko.observableArray(defaultConstraints); if (!includeExcludeDefined) { @@ -915,14 +914,14 @@ function orEmptyArray(v) { self.displayOptions = metadata.displayOptions; } self.load = function(data) { - console.log("Loading data for "+self.getName()+" : "+data) - self(data); if (constraintsInititaliser) { constraintsInititaliser.always(function() { - console.log("Re-Loading data for "+self.getName()+" : "+data) self(data); }) } + else { + self(data); + } } }; diff --git a/grails-app/assets/javascripts/knockout-utils.js b/grails-app/assets/javascripts/knockout-utils.js index d6fa13a..7e09a50 100644 --- a/grails-app/assets/javascripts/knockout-utils.js +++ b/grails-app/assets/javascripts/knockout-utils.js @@ -91,16 +91,10 @@ return (typeof root.modelAsJSON === 'function') ? root.modelAsJSON() : ko.toJSON(root); }; var _initialState = ko.observable(getRepresentation()); - console.log("****************** Initial state ******************") - console.log( _initialState()) result.isDirty = ko.pureComputed(function () { var dirty = _isInitiallyDirty() || _initialState() !== getRepresentation(); - if (dirty) { - console.log("******************* new state *******************") - console.log(getRepresentation()) - } return dirty; }); if (rateLimit) { @@ -109,8 +103,6 @@ result.reset = function () { _initialState(getRepresentation()); - console.log("****************** Reset initial state ******************") - console.log( _initialState()) _isInitiallyDirty(false); }; @@ -146,16 +138,14 @@ //just for subscriptions getRepresentation(); - console.log("****************** Initial state ******************") - console.log(getRepresentation()) + //next time return true and avoid ko.toJS _initialized(true); //on initialization this flag is not dirty return false; } - console.log("****************** New state ******************") - console.log(getRepresentation()) + //on subsequent changes, flag is now dirty return true; }); diff --git a/src/test/js/spec/DataLoaderExtenderSpec.js b/src/test/js/spec/DataLoaderExtenderSpec.js new file mode 100644 index 0000000..765f1f1 --- /dev/null +++ b/src/test/js/spec/DataLoaderExtenderSpec.js @@ -0,0 +1,35 @@ +describe("dataLoader extender spec", function () { + var turf ; + beforeEach(function() { + jasmine.clock().install(); + }); + afterEach(function() { + jasmine.clock().uninstall(); + }); + + + it("should augment an observable with geojson type methods", function() { + var metadata = { + name:'item', + dataType:'text', + computed: { + source: { + "context-path": "test" + } + } + }; + + var context = { + test:"test-value" + }; + var config = {}; + + var dataItem = ko.observable().extend({metadata:{metadata:metadata, context:context, config:config}}); + var withDataLoader = dataItem.extend({dataLoader:true}); + jasmine.clock().tick(); + expect(withDataLoader()).toEqual("test-value"); + + }); + + +}); diff --git a/src/test/js/spec/PrepopulationSpec.js b/src/test/js/spec/PrepopulationSpec.js index b57fa6c..2a8f80b 100644 --- a/src/test/js/spec/PrepopulationSpec.js +++ b/src/test/js/spec/PrepopulationSpec.js @@ -75,4 +75,85 @@ describe("Pre-population Spec", function () { expect(result).toEqual({item1:"test"}); }); }); + + it("Should should support computing the pre-pop params via an expression", function() { + var context = { + data: { + item1: '1', + item2: '2' + } + }; + + var prepopConfig = { + source: { + url:'test', + params: [{ + "type":"computed", + "expression":"2+2", + name:"p1", + }] + }, + mapping: [] + }; + + var config = { + prepopUrlPrefix:'/' + }; + + var url; + var params; + spyOn($, 'ajax').and.callFake(function(p1,p2) { + url = p1; + params = p2; + return $.Deferred().resolve(context).promise(); + }); + + var dataLoader = ecodata.forms.dataLoader(context, config); + dataLoader.getPrepopData(prepopConfig).done(function(result) { + expect(url).toEqual(config.prepopUrlPrefix+prepopConfig.source.url); + expect(params.data[0]).toEqual({name:"p1", value:4}); + expect(params.dataType).toEqual('json'); + + expect(result).toEqual(context); + }); + }); + + // This prevents making calls that will return errors + it("Should not make a remote call if required params are undefined", function() { + var context = { + data: { + item1: '1', + item2: '2' + } + }; + + var prepopConfig = { + source: { + url:'test', + params: [{ + "type":"computed", + "expression":"x", + name:"p1", + required:true + }] + }, + mapping: [] + }; + + var config = { + prepopUrlPrefix:'/' + }; + + var called = false; + + spyOn($, 'ajax').and.callFake(function(p1,p2) { + called = true; + }); + + var dataLoader = ecodata.forms.dataLoader(context, config); + dataLoader.getPrepopData(prepopConfig).done(function(result) { + }); + + expect(called).toEqual(false); + }); }); \ No newline at end of file