diff --git a/spec/Layers/FeatureLayer/FeatureManagerSpec.js b/spec/Layers/FeatureLayer/FeatureManagerSpec.js index b6d39dc02..faedac3c5 100644 --- a/spec/Layers/FeatureLayer/FeatureManagerSpec.js +++ b/spec/Layers/FeatureLayer/FeatureManagerSpec.js @@ -756,6 +756,54 @@ describe('L.esri.FeatureManager', function () { server.respond(); }); + it('should wrap the updateFeatures method on the underlying service and refresh', function (done) { + server.respondWith('POST', 'http://gis.example.com/mock/arcgis/rest/services/MockService/MockFeatureServer/0/updateFeatures', JSON.stringify({ + 'updateResults': [{ + 'objectid': 1, + 'success': true + }, { + 'objectid': 2, + 'success': true + }] + })); + + layer.updateFeatures({ + type: 'FeatureCollection', + features: [{ + type: 'Feature', + id: 1, + properties: { + foo: 'bar' + }, + geometry: { + type: 'Point', + coordinates: [-121, 45] + } + }, { + type: 'Feature', + id: 2, + properties: { + foo: 'bar' + }, + geometry: { + type: 'Point', + coordinates: [-121, 45] + } + }] + }, function (error, response) { + expect(response).to.deep.equal([{ + 'objectid': 1, + 'success': true + }, { + 'objectid': 2, + 'success': true + }]); + done(); + }); + + server.respond(); + }); + it('should wrap the removeFeature method on the underlying service', function (done) { server.respondWith('POST', 'http://gis.example.com/mock/arcgis/rest/services/MockService/MockFeatureServer/0/deleteFeatures', JSON.stringify({ 'deleteResults': [{ diff --git a/spec/Tasks/FindSpec.js b/spec/Tasks/FindSpec.js index d6a70c220..2cf8234eb 100644 --- a/spec/Tasks/FindSpec.js +++ b/spec/Tasks/FindSpec.js @@ -240,8 +240,6 @@ describe('L.esri.Find', function () { done(); }); - console.log(request.url); - expect(request).to.be.an.instanceof(XMLHttpRequest); server.respond(); diff --git a/spec/Tasks/IdentifyImageSpec.js b/spec/Tasks/IdentifyImageSpec.js index acb61ec7b..25f42adcf 100644 --- a/spec/Tasks/IdentifyImageSpec.js +++ b/spec/Tasks/IdentifyImageSpec.js @@ -404,8 +404,6 @@ describe('L.esri.IdentifyImage', function () { task.returnGeometry(true).returnCatalogItems(true); task.run(function (error, results, raw) { - console.log(JSON.stringify(results)); - console.log(JSON.stringify(sampleResultsWithCatalogItems)); expect(results).to.deep.equal(sampleResultsWithCatalogItems); expect(raw).to.deep.equal(sampleResponseWithCatalogItems); done(); diff --git a/spec/Tasks/QuerySpec.js b/spec/Tasks/QuerySpec.js index 1b212988a..c2b8b50b9 100644 --- a/spec/Tasks/QuerySpec.js +++ b/spec/Tasks/QuerySpec.js @@ -919,7 +919,6 @@ describe('L.esri.Query', function () { done(); }); - console.log(request); expect(request.requestBody).to.contain('foo=bar'); server.respond(); }); diff --git a/src/Layers/FeatureLayer/FeatureManager.js b/src/Layers/FeatureLayer/FeatureManager.js index a266f4656..8ad2cc85d 100644 --- a/src/Layers/FeatureLayer/FeatureManager.js +++ b/src/Layers/FeatureLayer/FeatureManager.js @@ -82,6 +82,10 @@ export var FeatureManager = VirtualGrid.extend({ this.service.options.isModern = true; } + if (metadata.objectIdField) { + this.service.options.idAttribute = metadata.objectIdField; + } + // add copyright text listed in service metadata if (!this.options.attribution && map.attributionControl && metadata.copyrightText) { this.options.attribution = metadata.copyrightText; @@ -484,20 +488,27 @@ export var FeatureManager = VirtualGrid.extend({ }, addFeature: function (feature, callback, context) { + this.addFeatures(feature, callback, context); + }, + + addFeatures: function (features, callback, context) { this._getMetadata(Util.bind(function (error, metadata) { if (error) { if (callback) { callback.call(this, error, null); } return; } + // GeoJSON featureCollection or simple feature + var featuresArray = features.features ? features.features : [features]; - this.service.addFeature(feature, Util.bind(function (error, response) { + this.service.addFeatures(features, Util.bind(function (error, response) { if (!error) { - // assign ID from result to appropriate objectid field from service metadata - feature.properties[metadata.objectIdField] = response.objectId; - - // we also need to update the geojson id for createLayers() to function - feature.id = response.objectId; - this.createLayers([feature]); + for (var i = featuresArray.length - 1; i >= 0; i--) { + // assign ID from result to appropriate objectid field from service metadata + featuresArray[i].properties[metadata.objectIdField] = featuresArray.length > 1 ? response[i].objectId : response.objectId; + // we also need to update the geojson id for createLayers() to function + featuresArray[i].id = featuresArray.length > 1 ? response[i].objectId : response.objectId; + } + this.createLayers(featuresArray); } if (callback) { @@ -508,10 +519,18 @@ export var FeatureManager = VirtualGrid.extend({ }, updateFeature: function (feature, callback, context) { - this.service.updateFeature(feature, function (error, response) { + this.updateFeatures(feature, callback, context); + }, + + updateFeatures: function (features, callback, context) { + // GeoJSON featureCollection or simple feature + var featuresArray = features.features ? features.features : [features]; + this.service.updateFeatures(features, function (error, response) { if (!error) { - this.removeLayers([feature.id], true); - this.createLayers([feature]); + for (var i = featuresArray.length - 1; i >= 0; i--) { + this.removeLayers([featuresArray[i].id], true); + } + this.createLayers(featuresArray); } if (callback) { @@ -521,21 +540,15 @@ export var FeatureManager = VirtualGrid.extend({ }, deleteFeature: function (id, callback, context) { - this.service.deleteFeature(id, function (error, response) { - if (!error && response.objectId) { - this.removeLayers([response.objectId], true); - } - if (callback) { - callback.call(context, error, response); - } - }, this); + this.deleteFeatures(id, callback, context); }, deleteFeatures: function (ids, callback, context) { return this.service.deleteFeatures(ids, function (error, response) { - if (!error && response.length > 0) { - for (var i = 0; i < response.length; i++) { - this.removeLayers([response[i].objectId], true); + var responseArray = response.length ? response : [response]; + if (!error && responseArray.length > 0) { + for (var i = responseArray.length - 1; i >= 0; i--) { + this.removeLayers([responseArray[i].objectId], true); } } if (callback) { diff --git a/src/Services/FeatureLayerService.js b/src/Services/FeatureLayerService.js index 1c2b13539..07355a221 100644 --- a/src/Services/FeatureLayerService.js +++ b/src/Services/FeatureLayerService.js @@ -13,14 +13,22 @@ export var FeatureLayerService = Service.extend({ }, addFeature: function (feature, callback, context) { - delete feature.id; - - feature = geojsonToArcGIS(feature); + this.addFeatures(feature, callback, context); + }, + addFeatures: function (features, callback, context) { + var featuresArray = features.features ? features.features : [features]; + for (var i = featuresArray.length - 1; i >= 0; i--) { + delete featuresArray[i].id; + } + features = geojsonToArcGIS(features); + features = featuresArray.length > 1 ? features : [features]; return this.post('addFeatures', { - features: [feature] + features: features }, function (error, response) { - var result = (response && response.addResults) ? response.addResults[0] : undefined; + // For compatibility reason with former addFeature function, + // we return the object in the array and not the array itself + var result = (response && response.addResults) ? response.addResults.length > 1 ? response.addResults : response.addResults[0] : undefined; if (callback) { callback.call(context, error || response.addResults[0].error, result); } @@ -28,12 +36,20 @@ export var FeatureLayerService = Service.extend({ }, updateFeature: function (feature, callback, context) { - feature = geojsonToArcGIS(feature, this.options.idAttribute); + this.updateFeatures(feature, callback, context); + }, + + updateFeatures: function (features, callback, context) { + var featuresArray = features.features ? features.features : [features]; + features = geojsonToArcGIS(features, this.options.idAttribute); + features = featuresArray.length > 1 ? features : [features]; return this.post('updateFeatures', { - features: [feature] + features: features }, function (error, response) { - var result = (response && response.updateResults) ? response.updateResults[0] : undefined; + // For compatibility reason with former updateFeature function, + // we return the object in the array and not the array itself + var result = (response && response.updateResults) ? response.updateResults.length > 1 ? response.updateResults : response.updateResults[0] : undefined; if (callback) { callback.call(context, error || response.updateResults[0].error, result); } @@ -41,22 +57,16 @@ export var FeatureLayerService = Service.extend({ }, deleteFeature: function (id, callback, context) { - return this.post('deleteFeatures', { - objectIds: id - }, function (error, response) { - var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined; - if (callback) { - callback.call(context, error || response.deleteResults[0].error, result); - } - }, context); + this.deleteFeatures(id, callback, context); }, deleteFeatures: function (ids, callback, context) { return this.post('deleteFeatures', { objectIds: ids }, function (error, response) { - // pass back the entire array - var result = (response && response.deleteResults) ? response.deleteResults : undefined; + // For compatibility reason with former deleteFeature function, + // we return the object in the array and not the array itself + var result = (response && response.deleteResults) ? response.deleteResults.length > 1 ? response.deleteResults : response.deleteResults[0] : undefined; if (callback) { callback.call(context, error || response.deleteResults[0].error, result); }