Initial commit
This commit is contained in:
+170
@@ -0,0 +1,170 @@
|
||||
var _ = require('underscore');
|
||||
var LegendFactory = require('builder/editor/layers/layer-content-views/legend/legend-factory');
|
||||
var LegendColorHelper = require('builder/editor/layers/layer-content-views/legend/form/legend-color-helper');
|
||||
var LegendTypes = require('builder/editor/layers/layer-content-views/legend/legend-types');
|
||||
|
||||
var StyleHelper = require('builder/helpers/style');
|
||||
var DEFAULT_BUBBLES_COLOR = '#999999';
|
||||
|
||||
function _createLegendForAnimation (layerDefModel, color) {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CATEGORY, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CHOROPLETH, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CUSTOM_CHOROPLETH, function () {
|
||||
var items = StyleHelper.getStyleCategories(layerDefModel.styleModel);
|
||||
LegendFactory.createLegend(layerDefModel, LegendTypes.TORQUE, {
|
||||
title: color.attribute,
|
||||
items: items
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function _createLegendForHeatmap (layerDefModel) {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CATEGORY, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.TORQUE, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CHOROPLETH, function () {
|
||||
var colors = StyleHelper.getHeatmapColors(layerDefModel);
|
||||
LegendFactory.createLegend(layerDefModel, LegendTypes.CUSTOM_CHOROPLETH, {
|
||||
title: _t('editor.legend.pixel-title'),
|
||||
colors: colors
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function _createCategoryLegend (layerDefModel, color) {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CHOROPLETH, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CUSTOM_CHOROPLETH, function () {
|
||||
if (layerDefModel.isAutoStyleApplied()) {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CATEGORY);
|
||||
} else {
|
||||
LegendFactory.createLegend(layerDefModel, LegendTypes.CATEGORY, { title: color.attribute });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function _createChoroplethLegend (layerDefModel, color) {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CATEGORY, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.TORQUE, function () {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CUSTOM_CHOROPLETH, function () {
|
||||
if (layerDefModel.isAutoStyleApplied()) {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.CHOROPLETH);
|
||||
} else {
|
||||
LegendFactory.createLegend(layerDefModel, LegendTypes.CHOROPLETH, { title: color.attribute });
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function _createColorLegend (layerDefModel, color) {
|
||||
var styleModel = layerDefModel.styleModel;
|
||||
|
||||
if (styleModel.isAnimation()) {
|
||||
_createLegendForAnimation(layerDefModel, color);
|
||||
} else if (styleModel.isHeatmap()) {
|
||||
_createLegendForHeatmap(layerDefModel);
|
||||
} else {
|
||||
var usesCategory = (color && color.quantification === 'category');
|
||||
var attributeTypeIsString = (color.attribute_type && color.attribute_type === 'string');
|
||||
var attributeTypeIsBoolean = (color.attribute_type && color.attribute_type === 'boolean');
|
||||
|
||||
if (usesCategory || attributeTypeIsString || attributeTypeIsBoolean) {
|
||||
_createCategoryLegend(layerDefModel, color);
|
||||
} else {
|
||||
_createChoroplethLegend(layerDefModel, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _updateSizeLegend (layerDefModel, size, color) {
|
||||
if (size && size.attribute !== undefined) {
|
||||
var attrs = { title: size.attribute };
|
||||
|
||||
if (!layerDefModel.isAutoStyleApplied()) {
|
||||
// Do not apply the fill color of an autostyle ramp
|
||||
attrs.fillColor = color && (color.fixed || color.range)
|
||||
? LegendColorHelper.getBubbles(color).color.fixed
|
||||
: DEFAULT_BUBBLES_COLOR;
|
||||
}
|
||||
|
||||
var hasBubbleLegend = LegendFactory.find(layerDefModel, LegendTypes.BUBBLE);
|
||||
if (hasBubbleLegend) {
|
||||
LegendFactory.createLegend(layerDefModel, LegendTypes.BUBBLE, attrs);
|
||||
}
|
||||
} else {
|
||||
LegendFactory.removeLegend(layerDefModel, LegendTypes.BUBBLE);
|
||||
}
|
||||
}
|
||||
|
||||
function _updateColorLegend (layerDefModel, color) {
|
||||
var colorLegendTypes = [LegendTypes.CATEGORY, LegendTypes.TORQUE, LegendTypes.CHOROPLETH, LegendTypes.CUSTOM_CHOROPLETH];
|
||||
|
||||
if (color && color.attribute !== undefined) {
|
||||
var hasSomeLegend = [];
|
||||
|
||||
_.each(colorLegendTypes, function (legendType) {
|
||||
var hasLegend = LegendFactory.find(layerDefModel, legendType);
|
||||
if (hasLegend) {
|
||||
hasSomeLegend.push(hasLegend);
|
||||
}
|
||||
});
|
||||
|
||||
var hasCustomLegend = LegendFactory.find(layerDefModel, LegendTypes.CUSTOM);
|
||||
if (!hasCustomLegend && hasSomeLegend.length) {
|
||||
_createColorLegend(layerDefModel, color);
|
||||
}
|
||||
} else {
|
||||
_.each(colorLegendTypes, function (legendType) {
|
||||
LegendFactory.removeLegend(layerDefModel, legendType);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var onChange = function (layerDefModel) {
|
||||
var color = StyleHelper.getColor(layerDefModel.styleModel);
|
||||
var size = StyleHelper.getSize(layerDefModel.styleModel);
|
||||
|
||||
if (color == null && size == null) return;
|
||||
|
||||
if (LegendFactory.isEnabledType('size')) {
|
||||
_updateSizeLegend(layerDefModel, size, color);
|
||||
}
|
||||
|
||||
if (LegendFactory.isEnabledType('color')) {
|
||||
_updateColorLegend(layerDefModel, color);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
track: function (layerDefModel) {
|
||||
var onStyleChange = function () {
|
||||
onChange(layerDefModel);
|
||||
};
|
||||
|
||||
var styleModel = layerDefModel.styleModel;
|
||||
|
||||
layerDefModel.on('change:cartocss', onChange);
|
||||
if (styleModel) {
|
||||
styleModel.on('style:update', onStyleChange);
|
||||
|
||||
// For torque legends, for agreggations with the same range, there is no change on the cartocss
|
||||
// so we need to force the onChange for these.
|
||||
styleModel.on('change', function () {
|
||||
var hasChangedCartocss = layerDefModel.hasChanged('cartocss');
|
||||
|
||||
if (!hasChangedCartocss && styleModel.isAnimation()) {
|
||||
onChange(layerDefModel);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
layerDefModel.on('destroy', function () {
|
||||
layerDefModel.off('change:cartocss', onChange);
|
||||
styleModel && styleModel.off('style:update', onStyleChange);
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user