Initial commit

This commit is contained in:
zhongjin
2020-06-15 10:58:47 +08:00
commit 4f1dfe7564
8590 changed files with 1516878 additions and 0 deletions
@@ -0,0 +1,6 @@
<div class="js-selector">
<div class="Editor-HeaderInfo-title u-bSpace--m">
<h2 class="CDB-Text CDB-HeaderInfo-titleText CDB-Size-large"><%- _t('editor.layers.basemap.category.title-label') %></h2>
</div>
<p class="CDB-Text u-upperCase CDB-FontSize-small u-altTextColor u-bSpace--m js-highlight"><%- _t('editor.layers.basemap.category.select-category') %></p>
</div>
@@ -0,0 +1,32 @@
var CoreView = require('backbone/core-view');
var template = require('./basemap-categories.tpl');
var CarouselFormView = require('builder/components/carousel-form-view');
module.exports = CoreView.extend({
initialize: function (opts) {
if (!opts.categoriesCollection) throw new Error('categoriesCollection is required');
this._categoriesCollection = opts.categoriesCollection;
},
render: function () {
this.clearSubViews();
this.$el.html(template());
this._renderCarousel();
return this;
},
_renderCarousel: function () {
var view = new CarouselFormView({
collection: this._categoriesCollection,
template: require('./basemap-carousel.tpl')
});
this.addView(view);
this.$('.js-select').append(view.render().el);
}
});
@@ -0,0 +1,4 @@
<div class="Editor-HeaderInfo">
<div class="Editor-HeaderNumeration CDB-Text is-semibold u-rSpace--m">1</div>
<div class="Editor-HeaderInfo-inner CDB-Text js-select"></div>
</div>
@@ -0,0 +1,68 @@
var _ = require('underscore');
var Backbone = require('backbone');
var DEBOUNCE_TIME = 650;
module.exports = Backbone.Model.extend({
initialize: function (attrs, opts) {
if (!opts.layerDefinitionsCollection) throw new Error('layerDefinitionsCollection is required');
if (!opts.basemapsCollection) throw new Error('basemapsCollection is required');
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
this._basemapsCollection = opts.basemapsCollection;
this._disabled = opts.disabled;
this._generateSchema();
this._initBinds();
},
_initBinds: function () {
this._onChange = this._onChange.bind(this);
this.bind('change', _.debounce(this._onChange, DEBOUNCE_TIME), this);
},
_onChange: function () {
if (this.hasChanged('color')) {
var color = this.get('color').color.fixed;
this._updatePlainBasemap(color);
}
},
_updatePlainBasemap: function (color) {
var plainBasemap = this._basemapsCollection.find(function (mdl) {
return mdl.get('className') === 'plain';
});
var isAlreadySelected = plainBasemap.get('selected');
plainBasemap.set({
color: color,
image: '',
maxZoom: 32
});
if (isAlreadySelected) {
this._layerDefinitionsCollection.setBaseLayer(plainBasemap.toJSON());
} else {
this._basemapsCollection.updateSelected(plainBasemap.getValue());
}
},
_generateSchema: function () {
this.schema = {
color: {
type: 'Fill',
title: _t('editor.layers.basemap.style.color'),
options: [],
editorAttrs: {
color: {
hidePanes: ['value'],
disableOpacity: true
},
disabled: this._disabled
},
validators: ['required']
}
};
}
});
@@ -0,0 +1,68 @@
var Backbone = require('backbone');
var CoreView = require('backbone/core-view');
var template = require('./basemap-form.tpl');
var BasemapFormModel = require('./basemap-form-model');
module.exports = CoreView.extend({
initialize: function (opts) {
if (!opts.layerDefinitionsCollection) throw new Error('layerDefinitionsCollection is required');
if (!opts.basemapsCollection) throw new Error('basemapsCollection is required');
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
this._basemapsCollection = opts.basemapsCollection;
this._disabled = opts.disabled;
},
render: function () {
this.clearSubViews();
this.$el.html(template());
this._generateForms();
return this;
},
_generateForms: function () {
if (this._formView) {
this._formView.remove();
}
var color = {
color: {
fixed: '',
opacity: 1
}
};
if (typeof this.model.get('color') === 'string') {
color.color.fixed = this.model.get('color');
}
this._formModel = new BasemapFormModel({
color: color,
image: this.model.get('image') || ''
}, {
basemapsCollection: this._basemapsCollection,
layerDefinitionsCollection: this._layerDefinitionsCollection,
disabled: this._disabled
});
this._formView = new Backbone.Form({
model: this._formModel
});
this._formView.bind('change', function () {
this.commit();
});
this.$('.js-form').append(this._formView.render().$el);
},
clean: function () {
if (this._formView) {
this._formView.remove();
}
}
});
@@ -0,0 +1,8 @@
<div class="js-selector">
<div class="Editor-HeaderInfo-title u-bSpace--m">
<h2 class="CDB-Text CDB-HeaderInfo-titleText CDB-Size-large"><%- _t('editor.layers.infowindow.style.title-label') %></h2>
</div>
<p class="CDB-Text u-upperCase CDB-FontSize-small u-altTextColor u-bSpace--m js-highlight"><%- _t('editor.layers.infowindow.style.select-style') %></p>
</div>
<div class="js-form"></div>
@@ -0,0 +1,36 @@
var CoreView = require('backbone/core-view');
var template = require('./basemap-header.tpl');
var DEFAULT_NAME = _t('editor.layers.basemap.custom-basemap');
module.exports = CoreView.extend({
initialize: function (opts) {
if (!opts.category) throw new Error('category is required');
this.category = opts.category;
},
render: function () {
this.$el.html(
template({
title: _t('editor.layers.basemap.title-label'),
description: this._getName()
})
);
return this;
},
_getName: function () {
var name = this.model.getName();
if (!name) {
name = DEFAULT_NAME;
} else {
name = this.model.getName().replace(/_/g, '') + ' ' + _t('editor.layers.basemap.by') + ' ' + this.category;
}
return name;
}
});
@@ -0,0 +1,24 @@
<ul class="Editor-breadcrumb">
<li class="Editor-breadcrumbItem CDB-Text CDB-Size-medium u-actionTextColor">
<button class="js-back">
<i class="CDB-IconFont CDB-IconFont-arrowPrev Size-large u-rSpace"></i>
<span class="Editor-breadcrumbLink">
<%- _t('back') %>
</span>
</button>
</li>
<li class="Editor-breadcrumbItem CDB-Text CDB-Size-medium">
<span class="Editor-breadcrumbSep"> / </span>
<%- _t('editor.layers.breadcrumb.basemap-options') %>
</li>
</ul>
<div class="Editor-HeaderInfo u-alignStart">
<div class="Editor-HeaderInfo-inner">
<div class="Editor-HeaderInfo-title u-bSpace">
<h2 class="Editor-HeaderInfo-titleText CDB-Text CDB-Size-huge is-light u-ellipsis"><%- description %></h2>
</div>
</div>
</div>
@@ -0,0 +1 @@
<img src="data:image/png;base64,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" />
@@ -0,0 +1,6 @@
<svg width="23px" height="25px" viewBox="1383 664 23 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="color" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(1383.000000, 664.000000)">
<path d="M19.04725,12.691 C19.12525,12.504 19.08225,12.289 18.93925,12.146 L9.93925,3.146 C9.84125,3.049 9.71325,3 9.58525,3 L9.58525,2.5 C9.58525,1.122 8.46325,0 7.08525,0 C5.70725,0 4.58525,1.122 4.58525,2.5 L4.58525,7.793 L0.73125,11.647 C-0.24375,12.622 -0.24375,14.208 0.73125,15.183 L5.40325,19.854 C5.87525,20.326 6.50325,20.586 7.17125,20.586 C7.83925,20.586 8.46625,20.326 8.93925,19.854 L15.79225,13 L18.58525,13 C18.78725,13 18.97025,12.878 19.04725,12.691 L19.04725,12.691 Z M5.58525,2.5 C5.58525,1.673 6.25825,1 7.08525,1 C7.91225,1 8.58525,1.673 8.58525,2.5 L8.58525,3.793 L5.58525,6.793 L5.58525,2.5 L5.58525,2.5 Z M15.58525,12 C15.45225,12 15.32525,12.053 15.23125,12.146 L8.23125,19.146 C7.66525,19.712 6.67625,19.712 6.11025,19.146 L1.43825,14.475 C0.85325,13.89 0.85325,12.938 1.43825,12.353 L5.38925,8.401 C5.42025,8.377 5.44725,8.351 5.47125,8.32 L8.58525,5.207 L8.58525,10.5 C8.58525,10.776 8.80925,11 9.08525,11 C9.36125,11 9.58525,10.776 9.58525,10.5 L9.58525,4.207 L17.37825,12 L15.58525,12 L15.58525,12 Z" id="Shape" fill="#AAAAAA"></path>
<path d="M20.01225,15.241 C19.83125,14.942 19.33825,14.942 19.15825,15.241 C18.89425,15.674 16.58525,19.522 16.58525,21 C16.58525,22.654 17.93125,24 19.58525,24 C21.23925,24 22.58525,22.654 22.58525,21 C22.58525,19.522 20.27625,15.674 20.01225,15.241 L20.01225,15.241 Z M19.58525,23 C18.48225,23 17.58525,22.103 17.58525,21 C17.58525,20.225 18.68125,18.061 19.58525,16.485 C20.48925,18.061 21.58525,20.225 21.58525,21 C21.58525,22.103 20.68825,23 19.58525,23 L19.58525,23 Z" id="Shape" fill="#AAAAAA"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,3 @@
<svg width="22px" height="24px" viewBox="966 769 22 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<path d="M973.5,791.5 L966.5,786.5 L966.5,770.5 L973.5,775.5 L980.5,770.5 L987.5,775.5 L987.5,791.5 L980.5,786.5 L973.5,791.5 Z M973.5,775.5 L973.5,791.5 L973.5,775.5 Z M980.5,786.5 L980.5,770.531 L980.5,786.5 Z" id="Shape" stroke="#AAAAAA" stroke-width="1" fill="none"></path>
</svg>

After

Width:  |  Height:  |  Size: 437 B

@@ -0,0 +1 @@
<p class="CDB-Text CDB-Size-small u-upperCase u-altTextColor">Google maps</p>
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<p class="CDB-Text CDB-Size-small u-upperCase u-altTextColor">Mapbox</p>
@@ -0,0 +1 @@
<p class="CDB-Text CDB-Size-small u-upperCase u-altTextColor">nasa</p>
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<p class="CDB-Text CDB-Size-small u-upperCase u-altTextColor">tilejson</p>
@@ -0,0 +1 @@
<p class="CDB-Text CDB-Size-small u-upperCase u-altTextColor">wms/wmts</p>
@@ -0,0 +1,85 @@
var CoreView = require('backbone/core-view');
var BasemapCategoriesView = require('./basemap-categories-view');
var BasemapSelectView = require('./basemap-select-view');
var template = require('./basemap-inner.tpl');
module.exports = CoreView.extend({
className: 'Editor-inner',
initialize: function (opts) {
if (!opts.categoriesCollection) throw new Error('categoriesCollection is required');
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');
if (!opts.modals) throw new Error('modals is required');
this._categoriesCollection = opts.categoriesCollection;
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
this._basemapsCollection = opts.basemapsCollection;
this._customBaselayersCollection = opts.customBaselayersCollection;
this._modals = opts.modals;
this._initBinds();
},
_initBinds: function () {
this.model.bind('change:disabled', function () {
this._renderSelect();
}, this);
this._basemapsCollection.bind('add remove', function () {
this._renderSelect();
}, this);
this.add_related_model(this._basemapsCollection);
this._categoriesCollection.bind('change:selected', this._renderSelect, this);
this.add_related_model(this._categoriesCollection);
},
render: function () {
this.clearSubViews();
this.$el.html(template());
this._initViews();
return this;
},
_initViews: function () {
this._renderCategories();
this._renderSelect();
},
_renderCategories: function () {
if (this._categoriesView) {
this.removeView(this._categoriesView);
this._categoriesView.clean();
}
this._categoriesView = new BasemapCategoriesView({
categoriesCollection: this._categoriesCollection
});
this.addView(this._categoriesView);
this.$('.js-basemapCategory').html(this._categoriesView.render().el);
},
_renderSelect: function () {
if (this._selectView) {
this.removeView(this._selectView);
this._selectView.clean();
}
this._selectView = new BasemapSelectView({
layerDefinitionsCollection: this._layerDefinitionsCollection,
basemapsCollection: this._basemapsCollection,
customBaselayersCollection: this._customBaselayersCollection,
selectedCategoryVal: this._categoriesCollection.getSelectedValue(),
modals: this._modals,
disabled: this.model.get('disabled')
});
this.addView(this._selectView);
this.$('.js-basemapSelect').html(this._selectView.render().el);
}
});
@@ -0,0 +1,2 @@
<div class="js-basemapCategory"></div>
<div class="js-basemapSelect"></div>
@@ -0,0 +1,188 @@
var _ = require('underscore');
var basemapProvidersAndCategories = require('builder/data/basemap-providers-and-categories');
var mosaicThumbnail = require('builder/components/mosaic/mosaic-thumbnail.tpl');
var BasemapModel = require('./basemap-model');
var DEFAULT_SUBDOMAIN = 'a';
var DEFAULT_X_POSITION = 30;
var DEFAULT_Y_POSISTION = 24;
var DEFAULT_ZOOM = 6;
// 'CartoDB', 'Stamen', 'Here'
var createLeafletBasemapModel = function (category, basemap, baseLayerDefinition, assetsBaseURL) {
var value;
var currentValue;
var label;
var imageURL;
var type = basemapProvidersAndCategories.getLayerType(category);
value = basemap.className;
currentValue = baseLayerDefinition.get('className');
label = basemap.name;
imageURL = lowerXYZ(basemap.urlTemplate, basemap.subdomains);
_.extend(basemap, {
type: type,
name: basemap.name,
category: category,
selected: currentValue === value,
val: value,
label: label,
template: function () {
return mosaicThumbnail({
imgURL: imageURL
});
}
});
return new BasemapModel(basemap);
};
var lowerXYZ = function (urlTemplate, subdomains) {
return urlTemplate
.replace('{s}', getSubdomain(subdomains))
.replace('{z}', DEFAULT_ZOOM)
.replace('{x}', DEFAULT_X_POSITION)
.replace('{y}', DEFAULT_Y_POSISTION);
};
var getSubdomain = function (subdomains) {
return (subdomains && subdomains.length) ? subdomains[0] : DEFAULT_SUBDOMAIN;
};
// Google Maps
var createGoogleMapsBasemapModel = function (category, basemapAttrs, baseLayerDefinition, assetsBaseURL) {
var value;
var currentValue;
var label;
var imageURL;
var type = basemapProvidersAndCategories.getLayerType(category);
var generateValue = function (baseType, baseName) {
var value = baseType;
if (baseName) {
value = value + '_' + baseName;
}
return value;
};
value = generateValue(basemapAttrs.baseType, basemapAttrs.baseName);
currentValue = generateValue(baseLayerDefinition.get('baseType'), baseLayerDefinition.get('baseName'));
label = basemapAttrs.name.replace('GMaps ', '');
imageURL = [
assetsBaseURL,
'unversioned/images/google-maps-basemap-icons',
value + '.jpg'
].join('/');
_.extend(basemapAttrs, {
type: type,
name: basemapAttrs.name,
category: category,
selected: currentValue === value,
val: value,
label: label,
template: function () {
return mosaicThumbnail({
imgURL: imageURL
});
}
});
return new BasemapModel(basemapAttrs);
};
// Custom
var createCustomBasemapModel = function (category, customBaseLayerAttrs, baseLayerDefinition, configModel) {
var name = customBaseLayerAttrs.name ? customBaseLayerAttrs.name : 'Custom basemap ' + customBaseLayerAttrs.order;
var className = customBaseLayerAttrs.className;
var urlTemplate = customBaseLayerAttrs.urlTemplate;
return new BasemapModel({
id: customBaseLayerAttrs.id,
urlTemplate: urlTemplate,
minZoom: customBaseLayerAttrs.minZoom || 0,
maxZoom: customBaseLayerAttrs.maxZoom || 21,
name: name,
className: className,
attribution: customBaseLayerAttrs.attribution,
category: category || 'Custom',
tms: customBaseLayerAttrs.tms,
selected: baseLayerDefinition.get('className') === className,
val: className,
label: name,
template: function (imgURL) {
return mosaicThumbnail({
imgURL: imgURL
});
}
});
};
// Color
var createColorBasemapModel = function (category, basemapAttrs, baseLayerDefinition, configModel) {
return new BasemapModel({
default: false,
color: basemapAttrs.color || '',
image: basemapAttrs.image || '',
maxZoom: 32,
className: 'plain',
category: 'Color',
type: 'Plain',
selected: baseLayerDefinition.get('className') === 'plain',
val: 'plain',
label: 'plain',
template: function () {
return 'plain';
}
});
};
// Factory
var CATEGORY_CARTODB = 'CARTO';
var CATEGORY_STAMEN = 'Stamen';
var CATEGORY_HERE = 'Here';
var CATEGORY_GMAPS = 'GMaps';
var CATEGORY_CUSTOM = 'Custom';
var CATEGORY_NASA = 'NASA';
var CATEGORY_TILEJSON = 'TileJSON';
var CATEGORY_MAPBOX = 'Mapbox';
var CATEGORY_WMS = 'WMS';
var CATEGORY_COLOR = 'Color';
var CREATE_METHODS = {};
CREATE_METHODS[CATEGORY_CARTODB] = createLeafletBasemapModel;
CREATE_METHODS[CATEGORY_STAMEN] = createLeafletBasemapModel;
CREATE_METHODS[CATEGORY_HERE] = createLeafletBasemapModel;
CREATE_METHODS[CATEGORY_GMAPS] = createGoogleMapsBasemapModel;
CREATE_METHODS[CATEGORY_CUSTOM] = createCustomBasemapModel;
CREATE_METHODS[CATEGORY_NASA] = createCustomBasemapModel;
CREATE_METHODS[CATEGORY_TILEJSON] = createCustomBasemapModel;
CREATE_METHODS[CATEGORY_MAPBOX] = createCustomBasemapModel;
CREATE_METHODS[CATEGORY_WMS] = createCustomBasemapModel;
CREATE_METHODS[CATEGORY_COLOR] = createColorBasemapModel;
var BasemapModelFactory = function (layerDefinitionsCollection, configModel) {
if (!layerDefinitionsCollection) throw new Error('layerDefinitionsCollection is required');
if (!configModel) throw new Error('configModel is required');
this._layerDefinitionsCollection = layerDefinitionsCollection;
this._configModel = configModel;
};
BasemapModelFactory.prototype.createBasemapModel = function (basemapCategory, basemapAttrs) {
var baseLayer = this._layerDefinitionsCollection.getBaseLayer();
var assetsBaseURL = this._configModel.get('app_assets_base_url');
var createMethod = CREATE_METHODS[basemapCategory];
if (!createMethod) {
throw new Error("Can't create basemapModel for basemap of type: " + basemapCategory);
}
return createMethod(basemapCategory, basemapAttrs, baseLayer, assetsBaseURL);
};
module.exports = BasemapModelFactory;
@@ -0,0 +1,28 @@
var Backbone = require('backbone');
module.exports = Backbone.Model.extend({
defaults: {
default: false,
minZoom: 0,
maxZoom: 21,
name: '',
category: 'Custom',
type: 'Tiled',
selected: false,
val: '',
label: '',
template: function () {
return '';
}
},
getName: function () {
return this.get('label') || this.getValue();
},
getValue: function () {
return this.get('val');
}
});
@@ -0,0 +1,74 @@
var CoreView = require('backbone/core-view');
var template = require('builder/components/mosaic/mosaic-item.tpl');
var AddBasemapView = require('builder/components/modals/add-basemap/add-basemap-view');
var AddBasemapModel = require('builder/components/modals/add-basemap/add-basemap-model');
module.exports = CoreView.extend({
className: 'Mosaic-item Mosaic-item--dashed',
tagName: 'li',
events: {
'mouseenter': '_onMouseEnter',
'mouseleave': '_onMouseLeave',
'click': '_onClick'
},
initialize: function (opts) {
if (!opts.layerDefinitionsCollection) throw new Error('layerDefinitionsCollection is required');
if (!opts.modals) throw new Error('modals is required');
if (!opts.basemapsCollection) throw new Error('basemapsCollection is required');
if (!opts.customBaselayersCollection) throw new Error('customBaselayersCollection is required');
if (!opts.mosaicModel) throw new Error('mosaicModel is required');
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
this._basemapsCollection = opts.basemapsCollection;
this._customBaselayersCollection = opts.customBaselayersCollection;
this._modals = opts.modals;
this._currentTab = opts.currentTab;
this._mosaicModel = opts.mosaicModel;
this.add_related_model(this._mosaicModel);
},
render: function () {
this.$el.html(
template({
name: this.model.getName(),
template: this.model.get('template')()
})
);
return this;
},
_onMouseEnter: function () {
this._mosaicModel.set('highlightedAdd', true);
},
_onMouseLeave: function () {
this._mosaicModel.set('highlightedAdd', false);
},
_onClick: function () {
var self = this;
var modal = this._modals.create(function (modalModel) {
var addBasemapModel = new AddBasemapModel({}, {
layerDefinitionsCollection: self._layerDefinitionsCollection,
basemapsCollection: self._basemapsCollection,
customBaselayersCollection: self._customBaselayersCollection,
currentTab: self._currentTab
});
return new AddBasemapView({
modalModel: modalModel,
createModel: addBasemapModel
});
}, {
breadcrumbsEnabled: true
});
modal.show();
}
});
@@ -0,0 +1,59 @@
var BasemapMosaicView = require('./basemap-mosaic-view');
var BasemapMosaicModel = require('./basemap-mosaic-model');
var MosaicFormView = require('builder/components/mosaic-form-view');
/**
* Mosaic form view
*/
module.exports = MosaicFormView.extend({
initialize: function (opts) {
if (!opts.collection) throw new Error('Mosaic collection is required');
if (!opts.template) throw new Error('template is required');
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');
if (!opts.modals) throw new Error('modals is required');
this.template = opts.template;
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
this._basemapsCollection = opts.basemapsCollection;
this._customBaselayersCollection = opts.customBaselayersCollection;
this._modals = opts.modals;
this._disabled = opts.disabled;
this._currentTab = opts.currentTab;
this._initBinds();
},
_initViews: function () {
this.mosaic = new BasemapMosaicView({
model: new BasemapMosaicModel(),
collection: this.collection,
layerDefinitionsCollection: this._layerDefinitionsCollection,
basemapsCollection: this._basemapsCollection,
customBaselayersCollection: this._customBaselayersCollection,
modals: this._modals,
disabled: this._disabled,
currentTab: this._currentTab
});
this.mosaic.model.bind('change:highlightedAdd', this._onChangeHighlighted, this);
if (!this.$('.js-selector').length) throw new Error('HTML element with js-selector class is required');
this.$('.js-selector').append(this.mosaic.render().el);
this.addView(this.mosaic);
},
_onChangeHighlighted: function () {
var item = this.collection.getHighlighted() || this.mosaic.model.getHighlighted() || this.collection.getSelected();
if (item) {
var $el = this.$('.js-highlight');
if ($el) {
$el.text(item.getName());
}
}
}
});
@@ -0,0 +1,88 @@
/* global Image */
var template = require('builder/components/mosaic/mosaic-item.tpl');
var MosaicItemView = require('builder/components/mosaic/mosaic-item-view');
var BasemapMosaicRemoveView = require('./basemap-mosaic-remove-view');
var DEFAULT_SUBDOMAIN = 'a';
var DEFAULT_X_POSITION = 30;
var DEFAULT_Y_POSISTION = 24;
var DEFAULT_ZOOM = 6;
var DEFAULT_IMG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAZ9JREFUWAntWUtugzAUNKbAJl1EYtcz9Ba5UE6SC+UWPUN3SNlkw78zVhJRCeIXbCup6ic5gP08Ho/x40ESBauq6iNJkgPKDpdb1j3RTuM4HlH2ZVl+JySXpukXygaksiViRVEsNd3qu65Tfd/frpdO8jxXEGO2GcTUMAxtXddnYH1qKqe1fof3IrlZpECVJA6xMgiyMdzws0N5CzTealiIlpGbBsKz77nZSYAc67ck+NIWCbouj1cFL/eNK6df/UW7FztKMT7ZTOJDDMQ5RUyJGYK2IMyBm6ax4nFQGxZBEIStWFcH2TSu3pZjiCX2StDCf1VzJLhKtkmnqOBEjFWn/0tBaaB+REoTqJkJ2wxJpM3FtPvGMgQlabrkCUEcCcF7Kf9UBT5xvN6DIZbYK8Hp7H2dR4KuSkYFo4KPKBAiYTWBmoHznvEdQpKm82ljw+I4DObElJghaJu59AWHA9qw6CMlR9+4i6mCi0UFXdRj3z+hIL8Ju040VP+TBrkjtn0bagQH3JbcSHB/+WDNCgc8r11bZOdncjPfWV/5b4gfOaaYLUG/QVoAAAAASUVORK5CYII=';
var DEFAULT_NAME = _t('editor.layers.basemap.custom-basemap');
module.exports = MosaicItemView.extend({
initialize: function (opts) {
if (!opts.basemapsCollection) throw new Error('basemapsCollection is required');
this._basemapsCollection = opts.basemapsCollection;
this._disabled = opts.disabled;
this._initBinds();
},
render: function () {
this.$el.html(
template({
name: this._getName(),
template: this.model.get('template')(this._getImageURL())
})
);
this.$el.addClass('js-' + this.model.getValue());
this.$el.toggleClass('is-selected', !!this.model.get('selected'));
this._initViews();
return this;
},
_initViews: function () {
var basemapMosaicRemoveView = new BasemapMosaicRemoveView({
model: this.model,
basemapsCollection: this._basemapsCollection
});
this.addView(basemapMosaicRemoveView);
this.$el.append(basemapMosaicRemoveView.render().el);
},
_getImageURL: function () {
var self = this;
var url = this._lowerXYZ();
var image = new Image();
image.onerror = function () {
self.$('.js-thumbnailImg').attr('src', DEFAULT_IMG);
};
image.src = url;
return url;
},
_getSubdomain: function () {
var subdomains = this.model.get('subdomains'); // eg: 'abcd' or '1234'
return (subdomains && subdomains.length) ? subdomains[0] : DEFAULT_SUBDOMAIN;
},
_lowerXYZ: function () {
return this.model.get('urlTemplate')
.replace('{s}', this._getSubdomain())
.replace('{z}', DEFAULT_ZOOM)
.replace('{x}', DEFAULT_X_POSITION)
.replace('{y}', DEFAULT_Y_POSISTION);
},
_getName: function () {
var name = this.model.getName();
if (!name) {
name = this.model.get('order') ? DEFAULT_NAME + ' ' + this.model.get('order') : DEFAULT_NAME;
} else {
name.replace(/_/g, '');
}
return name;
}
});
@@ -0,0 +1,22 @@
var Backbone = require('backbone');
/*
* List item model
*
*/
module.exports = Backbone.Model.extend({
defaults: {
highlightedAdd: false
},
getHighlighted: function () {
return this.get('highlightedAdd') && this;
},
getName: function () {
return 'Add';
}
});
@@ -0,0 +1,86 @@
var CoreView = require('backbone/core-view');
var template = require('./basemap-mosaic-remove.tpl');
var CustomListCollection = require('builder/components/custom-list/custom-list-collection');
var ContextMenuView = require('builder/components/context-menu/context-menu-view');
module.exports = CoreView.extend({
tagName: 'span',
className: 'Mosaic-remove CDB-Shape-threePoints is-white is-small js-Mosaic-remove',
events: {
'click': '_onToggleContextMenuClicked'
},
initialize: function (opts) {
if (!opts.basemapsCollection) throw new Error('basemapsCollection is required');
this._basemapsCollection = opts.basemapsCollection;
},
render: function () {
this.$el.html(template());
return this;
},
_hasContextMenu: function () {
return this._menuView;
},
_hideContextMenu: function () {
this.removeView(this._menuView);
this._menuView.clean();
delete this._menuView;
},
_showContextMenu: function (position) {
this._menuItems = new CustomListCollection([{
label: _t('editor.layers.basemap.remove-baselayer'),
val: 'remove-baselayer',
destructive: true
}]);
var triggerElementID = 'context-menu-trigger-' + this.model.cid;
this.$('.js-Mosaic-remove').attr('id', triggerElementID);
this._menuView = new ContextMenuView({
collection: this._menuItems,
triggerElementID: triggerElementID,
position: position
});
this._menuItems.bind('change:selected', function (menuItem) {
if (menuItem.get('val') === 'remove-baselayer') {
this._deleteBaselayer();
}
}, this);
this.add_related_model(this._menuItems);
this._menuView.model.bind('change:visible', function (model, isContextMenuVisible) {
if (this._hasContextMenu() && !isContextMenuVisible) {
this._hideContextMenu();
}
}, this);
this._menuView.show();
this.addView(this._menuView);
},
_deleteBaselayer: function () {
this._basemapsCollection.remove(this.model);
},
_onToggleContextMenuClicked: function (e) {
this.killEvent(e);
if (this._hasContextMenu()) {
this._hideContextMenu();
} else {
this._showContextMenu({
x: e.pageX + 215, // CustomList--small width
y: e.pageY
});
}
}
});
@@ -0,0 +1,3 @@
<div class="CDB-Shape-threePointsItem"></div>
<div class="CDB-Shape-threePointsItem"></div>
<div class="CDB-Shape-threePointsItem"></div>
@@ -0,0 +1,61 @@
var template = require('builder/components/mosaic/mosaic.tpl');
var MosaicView = require('builder/components/mosaic/mosaic-view');
var MosaicItemModel = require('builder/components/mosaic/mosaic-item-model');
var BasemapMosaicItemView = require('./basemap-mosaic-item-view');
var MosaicAddItemView = require('./basemap-mosaic-add-item-view');
module.exports = MosaicView.extend({
initialize: function (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');
if (!opts.modals) throw new Error('modals is required');
this._layerDefinitionsCollection = opts.layerDefinitionsCollection;
this._basemapsCollection = opts.basemapsCollection;
this._customBaselayersCollection = opts.customBaselayersCollection;
this._modals = opts.modals;
this._disabled = opts.disabled;
this._currentTab = opts.currentTab;
},
render: function () {
this.clearSubViews();
this.$el.html(template());
this._renderList();
this._createAddItem();
return this;
},
_createItem: function (mdl) {
var view = new BasemapMosaicItemView({
model: mdl,
disabled: this._disabled,
basemapsCollection: this._basemapsCollection
});
this.$('.js-mosaic').append(view.render().el);
this.addView(view);
},
_createAddItem: function () {
var view = new MosaicAddItemView({
model: new MosaicItemModel({
label: 'Add',
val: 'add',
template: function () {
return '<div class="Mosaic-button">+</div>';
}
}),
layerDefinitionsCollection: this._layerDefinitionsCollection,
basemapsCollection: this._basemapsCollection,
customBaselayersCollection: this._customBaselayersCollection,
mosaicModel: this.model,
modals: this._modals,
currentTab: this._currentTab
});
this.$('.js-mosaic').append(view.render().el);
this.addView(view);
}
});
@@ -0,0 +1,6 @@
<div class="js-selector">
<div class="Editor-HeaderInfo-title u-bSpace--m">
<h2 class="CDB-Text CDB-HeaderInfo-titleText CDB-Size-large"><%- _t('editor.layers.basemap.style.title-label') %></h2>
</div>
<p class="CDB-Text u-upperCase CDB-FontSize-small u-altTextColor u-bSpace--m js-highlight"><%- _t('editor.layers.basemap.style.select-style') %></p>
</div>
@@ -0,0 +1,114 @@
var CoreView = require('backbone/core-view');
var template = require('./basemap-select.tpl');
var MosaicFormView = require('builder/components/mosaic-form-view');
var BasemapFormView = require('./basemap-form-view');
var MosaicCollection = require('builder/components/mosaic/mosaic-collection');
var BasemapMosaicFormView = require('./basemap-mosaic-form-view');
var checkAndBuildOpts = require('builder/helpers/required-opts');
var REQUIRED_OPTS = [
'layerDefinitionsCollection',
'basemapsCollection',
'customBaselayersCollection',
'selectedCategoryVal',
'modals'
];
module.exports = CoreView.extend({
initialize: function (opts) {
checkAndBuildOpts(opts, REQUIRED_OPTS, this);
this._baseLayer = this._layerDefinitionsCollection.getBaseLayer();
this._disabled = opts.disabled;
this._initCollection();
this._initBinds();
},
render: function () {
this.clearSubViews();
this.$el.html(template());
var category = this._selectedCategoryVal.toLowerCase();
switch (category) {
case 'color':
this._renderForm();
break;
case 'custom':
this._renderCustomMosaic();
break;
case 'nasa':
case 'tilejson':
case 'mapbox':
case 'wms':
this._renderCustomMosaic(category);
break;
default:
this._renderMosaic();
}
return this;
},
_initCollection: function () {
this._filteredBasemapsCollection = new MosaicCollection(
this._basemapsCollection.findByCategory(this._selectedCategoryVal)
);
},
_initBinds: function () {
this._filteredBasemapsCollection.bind('change:selected', function (mdl) {
if (mdl.get('selected')) {
var value = mdl.getValue();
this._changeBasemap(value);
}
}, this);
this.add_related_model(this._filteredBasemapsCollection);
},
_changeBasemap: function (value) {
var basemap = this._basemapsCollection.getByValue(value);
this._layerDefinitionsCollection.setBaseLayer(basemap.toJSON());
},
_renderMosaic: function () {
var view = new MosaicFormView({
collection: this._filteredBasemapsCollection,
template: require('./basemap-mosaic.tpl'),
disabled: this._disabled
});
this.addView(view);
this.$('.js-select').append(view.render().el);
},
_renderCustomMosaic: function (category) {
var view = new BasemapMosaicFormView({
collection: this._filteredBasemapsCollection,
template: require('./basemap-mosaic.tpl'),
layerDefinitionsCollection: this._layerDefinitionsCollection,
basemapsCollection: this._basemapsCollection,
customBaselayersCollection: this._customBaselayersCollection,
modals: this._modals,
disabled: this._disabled,
currentTab: category
});
this.addView(view);
this.$('.js-select').append(view.render().el);
},
_renderForm: function () {
var view = new BasemapFormView({
model: this._baseLayer,
basemapsCollection: this._basemapsCollection,
layerDefinitionsCollection: this._layerDefinitionsCollection,
disabled: this._disabled
});
this.addView(view);
this.$('.js-select').append(view.render().el);
}
});
@@ -0,0 +1,4 @@
<div class="Editor-HeaderInfo">
<div class="Editor-HeaderNumeration CDB-Text is-semibold u-rSpace--m">2</div>
<div class="Editor-HeaderInfo-inner CDB-Text js-select"></div>
</div>
@@ -0,0 +1,78 @@
var Backbone = require('backbone');
var BasemapModel = require('./basemap-model');
var _ = require('underscore');
/*
* Basemap collection, extends Mosaic collection
*/
module.exports = Backbone.Collection.extend({
model: BasemapModel,
initialize: function () {
this._initBinds();
},
_initBinds: function () {
this.bind('change:selected', this._onSelectedChange, this);
},
_onSelectedChange: function (changedModel, isSelected) {
if (isSelected) {
this.each(function (m) {
if (m.cid !== changedModel.cid && m.get('selected')) {
m.set('selected', false);
}
});
}
},
findByCategory: function (category) {
return this.where({ category: category });
},
getDefaultCategory: function () {
var defaultCategory = this.findWhere({ default: true });
defaultCategory = defaultCategory || this.first();
return defaultCategory.get('category');
},
getCategories: function () {
var categories = this.chain()
.map(function (model) { return model.get('category'); })
.concat('Custom')
.concat('NASA')
.concat('TileJSON')
.concat('Mapbox')
.concat('WMS')
.uniq()
.value();
return categories;
},
getSelected: function () {
return this.findWhere({ selected: true });
},
updateSelected: function (value) {
var newSelected = this.getByValue(value);
newSelected.set({ selected: true });
},
updateCategory: function (value, category) {
var newCategory = this.getByValue(value);
newCategory.set({ category: category });
},
getByValue: function (value) {
return _.first(this.where({ val: value }));
},
getThumbnailImage: function (urlTemplate, subdomains) {
return this._lowerXYZ(urlTemplate, subdomains);
}
});