137 lines
4.3 KiB
JavaScript
Executable File
137 lines
4.3 KiB
JavaScript
Executable File
var Backbone = require('backbone');
|
|
var XYZModel = require('./xyz/xyz-model');
|
|
var mosaicThumbnail = require('builder/components/mosaic/mosaic-thumbnail.tpl');
|
|
var MapboxModel = require('./mapbox/mapbox-model');
|
|
var WMSModel = require('./wms/wms-model');
|
|
var TileJSONModel = require('./tilejson/tilejson-model');
|
|
var NASAModel = require('./nasa/nasa-model');
|
|
|
|
/**
|
|
* Add basemap model
|
|
*/
|
|
module.exports = Backbone.Model.extend({
|
|
defaults: {
|
|
tabs: undefined,
|
|
contentPane: 'tabs', // [tabs, loading, error]
|
|
currentTab: 'xyz' // [xyz, wms, nasa, mapbox, tilejson, nasa]
|
|
},
|
|
|
|
initialize: function (attrs, opts) {
|
|
if (!opts.layerDefinitionsCollection) throw new Error('layerDefinitionsCollection is required');
|
|
if (!opts.basemapsCollection) throw new Error('basemapsCollection is required');
|
|
if (!opts.customBaselayersCollection) throw new Error('customBaselayersCollection is required');
|
|
|
|
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
|
|
this._basemapsCollection = opts.basemapsCollection;
|
|
this._customBaselayersCollection = opts.customBaselayersCollection;
|
|
this._currentTab = opts.currentTab;
|
|
|
|
this._initTabs();
|
|
this._initBinds();
|
|
},
|
|
|
|
activeTabModel: function () {
|
|
return this.get('tabs').findWhere({ name: this.get('currentTab') });
|
|
},
|
|
|
|
canSaveBasemap: function () {
|
|
return this.get('contentPane') === 'tabs' && this._layerToSave();
|
|
},
|
|
|
|
saveBasemap: function () {
|
|
var self = this;
|
|
|
|
this.set('contentPane', 'addingBasemap');
|
|
|
|
var customBaselayerModel = this._layerToSave();
|
|
var attrs = customBaselayerModel.getAttributes();
|
|
|
|
if (this.activeTabModel().hasAlreadyAddedLayer(this._customBaselayersCollection)) {
|
|
// update selected in basemaps collection
|
|
this._basemapsCollection.updateSelected(attrs.className);
|
|
// update category if needed in basemaps collection,
|
|
// this is the case for mapbox basemaps which were stored without category in the editor
|
|
this._basemapsCollection.updateCategory(attrs.className, attrs.category);
|
|
|
|
// update baselayer
|
|
this._onBasemapSaved(attrs);
|
|
} else {
|
|
// Add to customBaselayersCollection before saving, so save URL resolves to the expected endpoint
|
|
this._customBaselayersCollection.add(customBaselayerModel);
|
|
|
|
customBaselayerModel.save({}, {
|
|
success: function (mdl, mdlAttrs) {
|
|
var options = mdlAttrs.options;
|
|
|
|
var name = options.name ? options.name : 'Custom basemap ' + mdlAttrs.order;
|
|
var className = options.className;
|
|
var urlTemplate = options.urlTemplate;
|
|
|
|
// add in basemaps collection
|
|
self._basemapsCollection.add({
|
|
id: mdlAttrs.id,
|
|
urlTemplate: urlTemplate,
|
|
maxZoom: options.minZoom || 21,
|
|
minZoom: options.minZoom || 0,
|
|
name: name,
|
|
className: className,
|
|
attribution: options.attribution,
|
|
category: options.category,
|
|
tms: options.tms,
|
|
type: options.type,
|
|
val: className,
|
|
label: name,
|
|
template: function (imgURL) {
|
|
return mosaicThumbnail({
|
|
imgURL: imgURL
|
|
});
|
|
}
|
|
});
|
|
|
|
// update baselayer
|
|
self._onBasemapSaved(attrs);
|
|
},
|
|
error: function () {
|
|
// Cleanup, remove layer it could not be saved!
|
|
self._customBaselayersCollection.remove(customBaselayerModel);
|
|
self.set('contentPane', 'addBasemapFailed');
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
_onBasemapSaved: function (layerAttrs) {
|
|
// Update baseLayer
|
|
this._layerDefinitionsCollection.setBaseLayer(layerAttrs);
|
|
|
|
this.trigger('saveBasemapDone');
|
|
},
|
|
|
|
_initTabs: function () {
|
|
var tabs = new Backbone.Collection([
|
|
new XYZModel(),
|
|
new MapboxModel(),
|
|
new WMSModel(null, {
|
|
customBaselayersCollection: this._customBaselayersCollection
|
|
}),
|
|
new TileJSONModel(),
|
|
new NASAModel()
|
|
]);
|
|
this.set({
|
|
tabs: tabs,
|
|
currentTab: this._currentTab || tabs.first().get('name')
|
|
});
|
|
},
|
|
|
|
_initBinds: function () {
|
|
this.get('tabs').each(function (tabModel) {
|
|
tabModel.bind('saveBasemap', this.saveBasemap, this);
|
|
}, this);
|
|
},
|
|
|
|
_layerToSave: function () {
|
|
return this.activeTabModel().get('layer');
|
|
}
|
|
|
|
});
|