171 lines
6.0 KiB
JavaScript
171 lines
6.0 KiB
JavaScript
|
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);
|
||
|
});
|
||
|
}
|
||
|
};
|