dhis2-gis
Version:
GIS Web App for DHIS 2
353 lines (291 loc) • 8.61 kB
JavaScript
import isArray from 'd2-utilizr/lib/isArray';
import isObject from 'd2-utilizr/lib/isObject';
import arrayDifference from 'd2-utilizr/lib/arrayDifference';
export default function LayerHandlerFacility(gis, layer) {
var compareView,
loadOrganisationUnitGroups,
loadOrganisationUnits,
loadData,
loadLegend,
updateLegend,
updateMap,
afterLoad,
onFeatureClick,
onFeatureRightClick,
loader;
compareView = function(view, doExecute) {
var src = layer.view,
viewIds,
viewDim,
srcIds,
srcDim;
loader.zoomToVisibleExtent = true;
if (!src) {
if (doExecute) {
loadOrganisationUnits(view);
}
return gis.conf.finals.widget.loadtype_organisationunit;
}
// organisation units
viewIds = [];
viewDim = view.rows[0];
srcIds = [];
srcDim = src.rows[0];
if (viewDim.items.length === srcDim.items.length) {
for (var i = 0; i < viewDim.items.length; i++) {
viewIds.push(viewDim.items[i].id);
}
for (var i = 0; i < srcDim.items.length; i++) {
srcIds.push(srcDim.items[i].id);
}
if (arrayDifference(viewIds, srcIds).length !== 0) {
if (doExecute) {
loadOrganisationUnits(view);
}
return gis.conf.finals.widget.loadtype_organisationunit;
}
}
else {
if (doExecute) {
loadOrganisationUnits(view);
}
return gis.conf.finals.widget.loadtype_organisationunit;
}
// Group set
loader.zoomToVisibleExtent = false;
if (view.organisationUnitGroupSet.id !== src.organisationUnitGroupSet.id) {
if (doExecute) {
loadOrganisationUnits(view);
}
return gis.conf.finals.widget.loadtype_organisationunit;
}
// always reload legend
if (doExecute) {
loadLegend(view);
return gis.conf.finals.widget.loadtype_legend;
}
gis.mask.hide();
};
loadOrganisationUnitGroups = function (view) {
var url = gis.init.contextPath + '/api/organisationUnitGroupSets/' + view.organisationUnitGroupSet.id + '.json' + '?fields=organisationUnitGroups[id,' + gis.init.namePropertyUrl + ',symbol]',
data;
Ext.Ajax.request({
url: encodeURI(url),
success: function(r) {
data = JSON.parse(r.responseText);
loadOrganisationUnits(view, data.organisationUnitGroups);
}
});
},
loadOrganisationUnits = function(view, orgUnitGroups) {
var items = view.rows[0].items,
propertyMap = {
'name': 'name',
'displayName': 'name',
'shortName': 'shortName',
'displayShortName': 'shortName'
},
keyAnalysisDisplayProperty = gis.init.userAccount.settings.keyAnalysisDisplayProperty,
displayProperty = propertyMap[keyAnalysisDisplayProperty] || propertyMap[xLayout.displayProperty] || 'name',
url = function() {
var params = '?ou=ou:';
for (var i = 0; i < items.length; i++) {
params += items[i].id;
params += i !== items.length - 1 ? ';' : '';
}
params += '&displayProperty=' + displayProperty.toUpperCase();
if (isArray(view.userOrgUnit) && view.userOrgUnit.length) {
params += '&userOrgUnit=';
for (var i = 0; i < view.userOrgUnit.length; i++) {
params += view.userOrgUnit[i] + (i < view.userOrgUnit.length - 1 ? ';' : '');
}
}
return gis.init.contextPath + '/api/geoFeatures.json' + params + '&includeGroupSets=true';
}(),
success,
failure;
success = function(r) {
var indicator = view.organisationUnitGroupSet.id,
orgUnitGroupSymbols = {};
// Easier lookup of unit group symbols
for (var i = 0; i < orgUnitGroups.length; i++) {
orgUnitGroupSymbols[orgUnitGroups[i].name] = orgUnitGroups[i].symbol;
}
var features = [];
for (var i = 0, prop, coord, group; i < r.length; i++) {
prop = r[i];
if (prop.ty === 1) { // Only add points
coord = JSON.parse(prop.co);
group = prop.dimensions[indicator];
if (gis.util.map.isValidCoordinate(coord) && group) {
prop.icon = {
iconUrl: gis.init.contextPath + '/images/orgunitgroup/' + orgUnitGroupSymbols[group],
iconSize: [16, 16]
};
prop.name = prop.na;
prop.label = prop.na + ' (' + group + ')';
features.push({
type: 'Feature',
id: prop.id,
properties: prop,
geometry: {
type: 'Point',
coordinates: coord
}
});
}
}
}
if (!features.length) {
gis.alert(GIS.i18n.no_valid_coordinates_found);
return;
}
// Store features for search
layer.featureStore.loadFeatures(features.slice(0));
layer.features = features;
updateLegend(orgUnitGroups);
updateMap(view, features);
};
failure = function() {
gis.mask.hide();
gis.alert(GIS.i18n.coordinates_could_not_be_loaded);
};
Ext.Ajax.request({
url: url,
disableCaching: false,
success: function(r) {
success(JSON.parse(r.responseText));
}
});
};
updateMap = function(view, features) {
var layerConfig = Ext.applyIf({
data: features,
hoverLabel: '{label}'
}, layer.config);
if (view.labels) {
Ext.apply(layerConfig, {
label: '{name}',
labelStyle: {
color: view.labelFontColor,
fontSize: view.labelFontSize,
fontStyle: view.labelFontStyle,
fontWeight: view.labelFontWeight
}
});
}
// Remove area layer instance if already exist
if (layer.areaInstance && gis.instance.hasLayer(layer.areaInstance)) {
gis.instance.removeLayer(layer.areaInstance);
}
if (view.areaRadius) {
layer.areaInstance = gis.instance.addLayer({
type: 'circles',
radius: view.areaRadius,
highlightStyle: false,
data: features
});
}
// Remove layer instance if already exist
if (layer.instance && gis.instance.hasLayer(layer.instance)) {
layer.instance.off('click', onFeatureClick);
layer.instance.off('contextmenu', onFeatureRightClick);
gis.instance.removeLayer(layer.instance);
}
// Create layer instance
layer.instance = gis.instance.addLayer(layerConfig);
// Put map layers in correct order: https://github.com/dhis2/dhis2-gis/issues/9
gis.util.map.orderLayers();
layer.instance.on('click', onFeatureClick);
layer.instance.on('contextmenu', onFeatureRightClick);
afterLoad(view);
};
onFeatureClick = function(evt) {
GIS.core.FeaturePopup(gis, evt.layer);
};
onFeatureRightClick = function(evt) {
var menu = GIS.core.FeatureContextMenu(gis, layer, evt.layer);
menu.showAt([evt.originalEvent.x, evt.originalEvent.y]);
};
updateLegend = function(items) {
var html = '<div class="dhis2-legend"><dl class="dhis2-legend-image">';
for (var i = 0; i < items.length; i++) {
html += '<dt style="background-image:url(' + gis.init.contextPath + '/images/orgunitgroup/' + items[i].symbol + ');"></dt>';
html += '<dd>' + items[i].name + '</dd>';
}
html += '</dl></div>';
if (layer.legendPanel) {
layer.legendPanel.update(html);
} else { // Dashboard map
if (!gis.legend) {
gis.legend = gis.instance.addControl({
type: 'legend',
offset: [0, -64],
content: html
});
} else {
gis.legend.setContent(gis.legend.getContent() + html);
}
}
},
afterLoad = function(view) {
layer.view = view;
// Legend
if (gis.viewport) {
gis.viewport.eastRegion.doLayout();
}
if (layer.legendPanel) {
layer.legendPanel.expand();
}
// Layer
if (layer.item) {
layer.item.setValue(true, view.opacity);
}
else {
layer.instance.setOpacity(view.opacity);
}
// Gui
if (loader.updateGui && isObject(layer.widget)) {
layer.widget.setGui(view);
}
// Zoom
if (loader.zoomToVisibleExtent) {
gis.instance.fitBounds(layer.instance.getBounds());
}
// Mask
if (loader.hideMask) {
gis.mask.hide();
}
// Map callback
if (loader.callBack) {
loader.callBack(layer);
}
else {
gis.map = null;
if (gis.viewport.shareButton) {
gis.viewport.shareButton.enable();
}
}
};
loader = {
compare: false,
updateGui: false,
zoomToVisibleExtent: false,
hideMask: false,
callBack: null,
load: function(view) {
if (gis.mask && !gis.skipMask) {
gis.mask.show();
}
if (this.compare) {
compareView(view, true);
}
else {
loadOrganisationUnitGroups(view);
}
},
loadData: loadData,
loadLegend: loadLegend
};
return loader;
};