dhis2-gis
Version:
GIS Web App for DHIS 2
555 lines (459 loc) • 18.6 kB
JavaScript
import isArray from 'd2-utilizr/lib/isArray';
import isObject from 'd2-utilizr/lib/isObject';
import isString from 'd2-utilizr/lib/isString';
import arrayClean from 'd2-utilizr/lib/arrayClean';
export default function extendInstance(gis) {
var util = gis.util,
init = gis.init,
store = gis.store,
layer;
// util
(function() {
util.map.getFeaturesByLayers = function(layers) {
var a = [];
for (var i = 0; i < layers.length; i++) {
a = a.concat(layers[i].features);
}
return a;
};
util.map.hasVisibleFeatures = function() {
var layers = util.map.getVisibleVectorLayers(),
layer;
if (layers.length) {
for (var i = 0; i < layers.length; i++) {
layer = layers[i];
if (layer.features.length) {
return true;
}
}
}
return false;
};
util.map.getLayersByType = function(layerType) {
var layers = [];
for (var i = 0; i < gis.olmap.layers.length; i++) {
var layer = gis.olmap.layers[i];
if (layer.layerType === layerType) {
layers.push(layer);
}
}
return layers;
};
util.map.addMapControl = function(name, fn) {
var panel = GIS.app.MapControlPanel(name, fn);
gis.olmap.addControl(panel);
panel.div.className += ' ' + name;
panel.div.childNodes[0].className += ' ' + name + 'Button';
};
/*
util.map.getTransformedPointByXY = function(x, y) {
var p = new OpenLayers.Geometry.Point(parseFloat(x), parseFloat(y));
return p.transform(new OpenLayers.Projection('EPSG:4326'), new OpenLayers.Projection('EPSG:900913'));
};
*/
/*
util.map.getLonLatByXY = function(x, y) {
var point = util.map.getTransformedPointByXY(x, y);
return new OpenLayers.LonLat(point.x, point.y);
};
*/
util.map.map2plugin = function(map) {
map.url = init.contextPath;
if (map.id) {
return {id: map.id};
}
delete map.access;
delete map.created;
//delete lastUpdated;
//delete name;
for (var i = 0, dimensions, layout; i < map.mapViews.length; i++) {
layout = map.mapViews[i];
dimensions = arrayClean([].concat(layout.columns || [], layout.rows || [], layout.filters || []));dimension = dimensions[i];
for (var j = 0, dimension; j < dimensions.length; j++) {
dimension = dimensions[j];
delete dimension.id;
delete dimension.ids;
delete dimension.type;
delete dimension.dimensionName;
delete dimension.objectName;
for (var k = 0, item; k < dimension.items.length; k++) {
item = dimension.items[k];
delete item.name;
delete item.code;
delete item.created;
delete item.lastUpdated;
}
}
if (layout.legendSet) {
delete layout.method;
delete layout.classes;
delete layout.colorLow;
delete layout.colorHigh;
delete layout.radiusLow;
delete layout.radiusHigh;
}
else {
if (layout.method === 2) {
delete layout.method;
}
if (layout.classes === 5) {
delete layout.classes;
}
if (layout.colorLow === 'ff0000') {
delete layout.colorLow;
}
if (layout.colorHigh === '00ff00') {
delete layout.colorHigh;
}
if (layout.radiusLow === 5) {
delete layout.radiusLow;
}
if (layout.radiusHigh === 15) {
delete layout.radiusHigh;
}
}
if (layout.opacity === gis.conf.layout.layer.opacity) {
delete layout.opacity;
}
if (!layout.userOrganisationUnit) {
delete layout.userOrganisationUnit;
}
if (!layout.userOrganisationUnitChildren) {
delete layout.userOrganisationUnitChildren;
}
if (!layout.userOrganisationUnitGrandChildren) {
delete layout.userOrganisationUnitGrandChildren;
}
if (!layout.organisationUnitGroupSet) {
delete layout.organisationUnitGroupSet;
}
delete layout.parentGraphMap;
}
return map;
};
util.url = util.url || {};
util.url.getUrlParam = function(s) {
var output = '';
var href = window.location.href;
if (href.indexOf('?') > -1 ) {
var query = href.substr(href.indexOf('?') + 1);
var query = query.split('&');
for (var i = 0; i < query.length; i++) {
if (query[i].indexOf('=') > -1) {
var a = query[i].split('=');
if (a[0].toLowerCase() === s) {
output = a[1];
break;
}
}
}
}
return unescape(output);
};
util.svg = util.svg || {};
util.svg.merge = function(str, strArray) {
if (strArray.length) {
str = str || '<svg></svg>';
for (var i = 0; i < strArray.length; i++) {
str = str.replace('</svg>', '');
strArray[i] = strArray[i].substring(strArray[i].indexOf('>') + 1);
str += strArray[i];
}
}
return str;
};
util.svg.getString = function(title, layers) {
var svgArray = [],
svg = '',
namespace,
title = Ext.htmlEncode(title),
titleSVG,
legendSVG = '',
scalelineSVG,
x = 20,
y = 35,
center = gis.viewport.centerRegion;
if (!layers.length) {
return false;
}
layers = layers.reverse();
namespace = 'xmlns="http://www.w3.org/2000/svg"';
svg = '<svg ' + namespace + ' width="' + center.getWidth() + '" height="' + center.getHeight() + '"></svg>';
titleSVG = '<g id="title" style="display: block; visibility: visible;">' +
'<text id="title" x="' + x + '" y="' + y + '" font-size="18" font-weight="bold">' +
'<tspan>' + title + '</tspan></text></g>';
y += 35;
for (var i = layers.length - 1; i > 0; i--) {
if (layers[i].id === gis.layer.facility.id) {
layers.splice(i, 1);
console.log(GIS.i18n.facility_layer_export_currently_not_supported);
}
}
if (!layers.length) {
return false;
}
for (var i = 0; i < layers.length; i++) {
var layer = layers[i],
id = layer.id,
imageLegendConfig = layer.imageLegendConfig || [],
what,
when,
where,
legend;
// SVG
//svgArray.push(layer.div.innerHTML);
// Legend
if (id !== gis.layer.boundary.id && id !== gis.layer.facility.id && id !== gis.layer.event.id) {
what = '<g id="indicator" style="display: block; visibility: visible;">' +
'<text id="indicator" x="' + x + '" y="' + y + '" font-size="12">' +
'<tspan>' + Ext.htmlEncode(layer.view.columns[0].items[0].name) + '</tspan></text></g>';
y += 15;
when = '<g id="period" style="display: block; visibility: visible;">' +
'<text id="period" x="' + x + '" y="' + y + '" font-size="12">' +
'<tspan>' + Ext.htmlEncode(layer.view.filters[0].items[0].name) + '</tspan></text></g>';
y += 8;
legend = '<g>';
for (var j = 0; j < imageLegendConfig.length; j++) {
if (j !== 0) {
y += 15;
}
legend += '<rect x="' + x + '" y="' + y + '" height="15" width="30" ' +
'fill="' + Ext.htmlEncode(imageLegendConfig[j].color) + '" stroke="#000000" stroke-width="1"/>';
legend += '<text id="label" x="' + (x + 40) + '" y="' + (y + 12) + '" font-size="12">' +
'<tspan>' + Ext.htmlEncode(imageLegendConfig[j].label) + '</tspan></text>';
}
legend += '</g>';
legendSVG += (what + when + where + legend);
y += 50;
}
}
// Map
if (svgArray.length) {
svg = util.svg.merge(svg, svgArray);
}
svg = svg.replace('</svg>', (titleSVG + legendSVG + scalelineSVG) + '</svg>');
return svg;
};
util.json = util.json || {};
util.json.encodeString = function(str) {
return isString(str) ? str.replace(/[^a-zA-Z 0-9(){}<>_!+;:?*&%#-]+/g,'') : str;
};
util.json.decodeAggregatedValues = function(responseText) {
responseText = JSON.parse(responseText);
var values = [];
for (var i = 0; i < responseText.length; i++) {
values.push({
oi: responseText[i][0],
v: responseText[i][1]
});
}
return values;
};
util.gui = util.gui || {};
util.gui.window = util.gui.window || {};
util.gui.window.setPositionTopRight = function(window) {
window.setPosition(gis.viewport.centerRegion.getWidth() - (window.getWidth() + 3), gis.viewport.centerRegion.y + 64);
};
util.gui.window.setPositionTopLeft = function(window) {
window.setPosition(2,33);
};
util.gui.window.addHideOnBlurHandler = function(w) {
var maskElements = Ext.query('.x-mask'),
el = Ext.get(maskElements[maskElements.length - 1]);
el.on('click', function() {
if (w.hideOnBlur) {
w.hide();
}
});
w.hasHideOnBlurHandler = true;
};
util.gui.window.addDestroyOnBlurHandler = function(w) {
var maskElements = Ext.query('.x-mask'),
el = Ext.get(maskElements[maskElements.length - 1]);
el.on('click', function() {
if (w.destroyOnBlur) {
w.destroy();
}
});
w.hasDestroyOnBlurHandler = true;
};
util.gui.window.setAnchorPosition = function(w, target) {
var vpw = gis.viewport.getWidth(),
targetx = target ? target.getPosition()[0] : 4,
winw = w.getWidth(),
y = target ? target.getPosition()[1] + target.getHeight() + 4 : 33;
if ((targetx + winw) > vpw) {
w.setPosition((vpw - winw - 2), y);
}
else {
w.setPosition(targetx, y);
}
};
}());
// init
(function() {
// root nodes
for (var i = 0; i < init.rootNodes.length; i++) {
init.rootNodes[i].path = '/root/' + init.rootNodes[i].id;
}
// sort organisation unit levels
util.array.sort(init.organisationUnitLevels, 'ASC', 'level');
// sort indicator groups
util.array.sort(init.indicatorGroups);
// sort data element groups
util.array.sort(init.dataElementGroups);
}());
// store
(function() {
store.periodTypes = Ext.create('Ext.data.Store', {
fields: ['id', 'name'],
data: gis.conf.period.periodTypes
});
store.groupSets = Ext.create('Ext.data.Store', {
fields: ['id', 'name'],
proxy: {
type: 'ajax',
url: encodeURI(gis.init.contextPath + '/api/organisationUnitGroupSets.json?fields=id,' + gis.init.namePropertyUrl + '&paging=false'),
reader: {
type: 'json',
root: 'organisationUnitGroupSets'
}
},
isLoaded: false,
loadFn: function(fn) {
if (this.isLoaded) {
fn.call();
}
else {
this.load(fn);
}
},
listeners: {
load: function() {
if (!this.isLoaded) {
this.isLoaded = true;
}
this.sort('name', 'ASC');
}
}
});
store.groupsByGroupSet = Ext.create('Ext.data.Store', {
fields: ['id', 'name', 'symbol'],
});
store.organisationUnitGroup = Ext.create('Ext.data.Store', {
fields: ['id', 'name'],
proxy: {
type: 'ajax',
url: encodeURI(init.contextPath + '/api/organisationUnitGroups.json?fields=id,' + gis.init.namePropertyUrl + '&paging=false'),
reader: {
type: 'json',
root: 'organisationUnitGroups'
}
}
});
store.legendSets = Ext.create('Ext.data.Store', {
fields: ['id', 'name'],
proxy: {
type: 'ajax',
url: encodeURI(gis.init.contextPath + '/api/legendSets.json?fields=id,displayName|rename(name)&paging=false'),
reader: {
type: 'json',
root: 'legendSets'
}
},
isLoaded: false,
loadFn: function(fn) {
if (this.isLoaded) {
fn.call();
}
else {
this.load(fn);
}
},
listeners: {
load: function() {
if (!this.isLoaded) {
this.isLoaded = true;
}
this.sort('name', 'ASC');
}
}
});
store.maps = Ext.create('Ext.data.Store', {
fields: ['id', 'name', 'access'],
proxy: {
type: 'ajax',
reader: {
type: 'json',
root: 'maps'
}
},
isLoaded: false,
pageSize: 10,
page: 1,
defaultUrl: encodeURI(gis.init.contextPath + '/api/maps.json?fields=id,displayName|rename(name),access'),
loadStore: function(url) {
this.proxy.url = url || this.defaultUrl;
this.load({
params: {
pageSize: this.pageSize,
page: this.page
}
});
},
loadFn: function(fn) {
if (this.isLoaded) {
fn.call();
}
else {
this.load(fn);
}
},
listeners: {
load: function() {
if (!this.isLoaded) {
this.isLoaded = true;
}
this.sort('name', 'ASC');
}
}
});
}());
// layer
(function() {
layer = gis.layer.event;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetEvent(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer, gis.conf.layout.widget.window_width + 150, 1);
layer.window.widget = layer.widget;
layer = gis.layer.facility;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetFacility(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer);
layer.window.widget = layer.widget;
layer = gis.layer.thematic1;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetThematic(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer);
layer.window.widget = layer.widget;
layer = gis.layer.thematic2;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetThematic(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer);
layer.window.widget = layer.widget;
layer = gis.layer.thematic3;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetThematic(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer);
layer = gis.layer.thematic4;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetThematic(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer);
layer.window.widget = layer.widget;
layer = gis.layer.boundary;
layer.menu = GIS.app.LayerMenu(gis, layer);
layer.widget = GIS.app.LayerWidgetBoundary(gis, layer);
layer.window = GIS.app.WidgetWindow(gis, layer);
layer.window.widget = layer.widget;
}());
};