]> git.uio.no Git - u/erikhf/frm.git/blobdiff - src/components/map/map.ts
fix in adding and editing markers
[u/erikhf/frm.git] / src / components / map / map.ts
index 1c7f3acb9c6789e575c60ff10784c8d307ff6fde..78b0437c0bd0a543ebe307f49470ad4b8bba3663 100644 (file)
@@ -1,7 +1,6 @@
 import {Component, EventEmitter,CORE_DIRECTIVES,} from 'angular2/angular2';
 import {Headers, Http} from 'angular2/http';
 
-
 @Component({
     selector: 'mou-map',
     directives: [CORE_DIRECTIVES],
@@ -16,78 +15,177 @@ export class Map {
     map:Object;
     http:Http;
     LEVEL:number;
+    allLevels:Object;
     runned:boolean;
-    parent:Object;
-    currentPos:Object;
     uprunned:boolean;
+    parent:Object;
     activeId:string;
+    currentPos:Object;
     currentMarker:Object;
+    isSearched:boolean;
+    popupON:boolean;
     popup:Object;
+    COLORS:Object;
+    colornum:number;
 
-    // COLORS:Object;
-
+    /**
+     * initializes all the global variabels
+     * @param http - for http requests
+     */
     constructor(http:Http) {
 
         this.activeId = null;
         this.newactive = new EventEmitter();
         this.neworg = new EventEmitter();
-        this.map = new google.maps.Map(document.getElementById("map"), {center: {lat: 0, lng: 0}, zoom: 12});
+        this.map = new google.maps.Map(document.getElementById("map"), {
+            center: {lat: 0, lng: 0},
+            zoom: 12,
+            mapTypeControlOptions: {
+                position: google.maps.ControlPosition.BOTTOM_CENTER
+            },
+            zoomControlOptions: {
+                position: google.maps.ControlPosition.LEFT_BOTTOM
+            },
+            streetViewControl: false
+        });
         this.init();
         this.http = http;
-        this.LEVEL = 2;
+        this.LEVEL = 2;//
         this.runned = false;
-        this.getData('?paging=false&level=2', this);
+        this.getLevels(this);
         this.parent = null;
         this.currentPos = null;
         this.uprunned = false;
         this.currentMarker = null;
+        this.isSearched = false;
+        this.colornum = 0;
+        this.COLORS = ['#ede1bb', '#1d407e', '#ff512e', '#662d47', '#3b3a35', '#419175', '#983e41', '#f3002d', '#b0a875', '#00bfb5', '#926851', '#47a0a4', '#333f50', '#6f007b'];
+        this.popupON = false;
         this.popup = null;
-        // this.COLORS = {'red','brown',',yellow','green',',pink','purple','gray','black'};
-        this.hideModal = document.getElementById("topLevel").style.visibility = "hidden";
-        this.hideModal = document.getElementById("middleLevel").style.visibility = "hidden";
-        this.hideModal = document.getElementById("bottomLevel").style.visibility = "hidden";
-        this.hideModal = document.getElementById("divModal").style.visibility = "hidden";
     }
 
-    setActiveId(id) { this.activeId = id; }
 
-    getMap() { return this.map; }
+    /**
+     * Sets the global variabel
+     * @param id - id of the active marker
+     */
+    setActiveId(id) {
+        this.activeId = id;
+    }
 
-    getHttp() { return this.http; }
+    /**
+     * returns the global map
+     * @returns {Object}
+     */
+    getMap() {
+        return this.map;
+    }
 
-    setcurrentPos(latlng) { this.currentPos = latlng; }
+    /**
+     * returns global http
+     * @returns {Http}
+     */
+    getHttp() {
+        return this.http;
+    }
 
-    getcurrentPos() { return this.currentPos; }
+    /**
+     * Sets the avctive markers position
+     * @param latlng - position of the active marker
+     */
+    setcurrentPos(latlng) {
+        this.currentPos = latlng;
+    }
 
-    setParent(id) {  this.parent = id; }
+    /**
+     * returns the active markers position
+     * @returns {Object}
+     */
+    getcurrentPos() {
+        return this.currentPos;
+    }
 
-    getParent() { return this.parent; }
+    /**
+     * sets the parent of the avtive marker
+     * @param id - of the parent
+     */
+    setParent(id) {
+        this.parent = id;
+    }
 
-    setRunned(value) { this.runned = value; }
+    /**
+     * returns the actice markers parent
+     * @returns {Object}
+     */
+    getParent() {
+        return this.parent;
+    }
 
-    setupRunned(value) { this.uprunned = value; }
+    /**
+     * sets a bool value for if the addListner for drilling down has runned (little hack)
+     * @param value - for the runned variabel
+     */
+    setRunned(value) {
+        this.runned = value;
+    }
 
-    setLevel(value) { this.LEVEL = value; }
+    /**
+     * sets a bool value for if the addListner for drilling up has runned (little hack)
+     * @param value - for the upRunned variabel
+     */
+    setupRunned(value) {
+        this.uprunned = value;
+    }
 
-    addLevel() { this.LEVEL++; }
+    /**
+     * sets the current level in the org.unit hierarchy
+     * @param value - for the level variabel
+     */
+    setLevel(value) {
+        this.LEVEL = value;
+    }
 
-    upLevel() { this.LEVEL--; }
+    /**
+     * add level when drilling down (little hack for synconisity)
+     */
+    addLevel() {
+        this.LEVEL++;
+    }
 
+    /**
+     * goes up level when drilling up (little hack for synconisity)
+     */
+    upLevel() {
+        this.LEVEL--;
+    }
+
+    /**
+     * initiates the map with position and zoom
+     */
     init() {
 
         let map = this.map;
         let pos = {lat: 9.1, lng: -11.6};
-
         map.setCenter(pos, 0);
         map.setZoom(7);
 
     }
 
+    /**
+     * prints out error messages in the console
+     * @param error - the error massage
+     */
     logError(error) {
         console.error(error);
 
     }
 
+    /**
+     * gets data from DHIS API
+     * @param query - for what kind of data to retrieve
+     * @param instance - this instance to use
+     * @param isParent - little hack to see if you want to levels up (the parent of a parent)
+     */
     getData(query, instance, isParent) {
         instance.http.get(dhisAPI + '/api/organisationUnits' + query)
             .map(res => res.json())
@@ -97,6 +195,34 @@ export class Map {
             );
     }
 
+    /**
+     * Gets the number of levels in the org.unit hierarchy from DHIS
+     */
+    getLevels() {
+        this.http.get(dhisAPI + '/api/organisationUnitLevels')
+            .map(res => res.json())
+            .subscribe(
+                res => this.saveLevelTotalandGetdata(res, this),
+                err => this.logError(err)
+            );
+    }
+
+    /**
+     * Saves the data from getLevels() in a global variabel and gets all the data from the second level.
+     * @param res - result from getLevels()
+     * @param instance - witch scope we are in
+     */
+    saveLevelTotalandGetdata(res, instance) {
+        instance.allLevels = res.pager.total;
+        instance.getData('?paging=false&level=2', instance, false);
+    }
+
+    /**
+     * parses all the data from getData() and calles methods based on the incomming data.
+     * @param res - result from getData()
+     * @param instance - witch scope we are in
+     * @param isParent - if it is a parent we have asked for
+     */
     parseResult(res, instance, isParent) {
         if (isParent) {
             instance.setParent(res.parent.id);
@@ -124,6 +250,12 @@ export class Map {
             }
         }
     }
+
+    /**
+     * creates and draws up the geojson polygons and adds listeners to them.
+     * @param item - an org.unit object
+     * @param instance - witch scope we are in
+     */
     drawPolygon(item, instance) {
         let feature;
         let incoming:string;
@@ -140,7 +272,7 @@ export class Map {
                 break;
             default:
         }
-        // TODO: test på feature og behandle type: NONE
+
         if (feature !== undefined) {
             let unit = {
                 "type": "Feature",
@@ -149,18 +281,26 @@ export class Map {
                     "coordinates": JSON.parse(item.coordinates)
                 },
                 "properties": {
+                    "title": item.name,
                     "name": item.name,
                     "id": item.id,
-                    "color": "gray",
+                    "color": instance.COLORS[instance.colornum],
                     "icon": null
                 }
             };
+            if (instance.COLORS.length == instance.colornum) {
+                instance.colornum = 0;
+            } else {
+                instance.colornum++;
+            }
+
             if (unit.geometry.type == 'Point') {
                 unit.properties.icon = {
                     path: google.maps.SymbolPath.CIRCLE,
                     strokeColor: 'black',
-                    scale: 3
+                    scale: 4
                 };
+                instance.map.setCenter({lat: unit.geometry.coordinates[1], lng: unit.geometry.coordinates[0]});
             }
 
             this.map.data.addGeoJson(unit);
@@ -173,52 +313,67 @@ export class Map {
                 color = feature.getProperty('color');
                 return /** @type {google.maps.Data.StyleOptions} */({
                     fillColor: color,
-                    strokeColor: color,
-                    strokeWeight: 3,
+                    fillOpacity: 0.91,
+                    strokeColor: 'white',
+                    strokeWeight: 2,
                     icon: icon
                 });
             });
-
+            if (instance.isSearched) {
+                instance.seeDetails();
+            }
             this.map.data.addListener('click', function (event) {
+                $('#myModal').modal('show');
                 instance.setActiveId(event.feature.O.id);
                 instance.setcurrentPos(event.latLng);
 
-                //TODO: finne liste over alle levels slike at man ikke har hardkodet inn < 4 !!
                 if (instance.uprunned == false && instance.LEVEL == 2) {
-                    this.hideModal = document.getElementById("topLevel").style.visibility = "visible";
-                    this.hideModal = document.getElementById("middleLevel").style.visibility = "hidden";
-                    this.hideModal = document.getElementById("bottomLevel").style.visibility = "hidden";
-                    instance.showModal();
-
+                    this.hideModal = document.getElementById("topLevel").style.display = "block";
+                    this.hideModal = document.getElementById("middleLevel").style.display = "none";
+                    this.hideModal = document.getElementById("bottomLevel").style.display = "none";
                 }
-                else if (instance.runned == false && instance.LEVEL < 4) {
-                    this.hideModal = document.getElementById("topLevel").style.visibility = "hidden";
-                    this.hideModal = document.getElementById("middleLevel").style.visibility = "visible";
-                    this.hideModal = document.getElementById("bottomLevel").style.visibility = "hidden";
-                    instance.showModal();
-                } else if (instance.runned == false && instance.LEVEL <= 4) {
-
-                    this.hideModal = document.getElementById("topLevel").style.visibility = "hidden";
-                    this.hideModal = document.getElementById("middleLevel").style.visibility = "hidden";
-                    this.hideModal = document.getElementById("bottomLevel").style.visibility = "visible";
+                else if (instance.runned == false && instance.LEVEL < instance.allLevels) {
+                    this.hideModal = document.getElementById("topLevel").style.display = "none";
+                    this.hideModal = document.getElementById("middleLevel").style.display = "block";
+                    this.hideModal = document.getElementById("bottomLevel").style.display = "none";
+                } else if (instance.runned == false && instance.LEVEL <= instance.allLevels) {
+                    this.hideModal = document.getElementById("topLevel").style.display = "none";
+                    this.hideModal = document.getElementById("middleLevel").style.display = "none";
+                    this.hideModal = document.getElementById("bottomLevel").style.display = "block";
 
                     instance.setcurrentPos(event.latLng);
-                    instance.showModal();
                 }
             });
-        }
-        else {
-            // ToDO:
-            console.log("fiks meg! gi warning på topp av kart");
+
+//slette ?? §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
+            /* this.map.data.addListener('mouseover', function (e) {


+             if(!instance.popupON) {
+             instance.popupON = true;
+
+             instance.popup = new google.maps.InfoWindow({
+             content: e.feature.getProperty('name'),
+             position: e.latLng
+             });
+             instance.popup.open(instance.map);
+
+             }
+             });

+             this.map.data.addListener('mouseout', function (event) {


+             instance.popupON = false;
+             instance.popup.open(null);

+             });*/
+
         }
     }
 
+    /**
+     * removes the polygon on current level and calles getData on one level down in the org.unit hierarchy
+     */
     drillDown() {
         this.closeModal();
         let map = this.getMap();
         let id = this.activeId;
         let level = this.LEVEL;
-        console.log(id);
         this.setRunned(true);
         this.setParent(id);
 
@@ -234,26 +389,36 @@ export class Map {
 
     }
 
+    /**
+     *removes the plogons on the current level and calles the get data with tha parents id and set parent true. this to say that we want this parent's parent
+     */
     drillUp() {
+        this.setupRunned(true);
+        this.upLevel();
+        let instance = this;
+        this.closeModal();
+        this.map.data.forEach(function (feature) {
+            instance.map.data.remove(feature);
 
-        if (this.LEVEL > 2) {
-            this.setupRunned(true);
-            this.upLevel();
-            let instance = this;
-            this.closeModal();
-            this.map.data.forEach(function (feature) {
-                instance.map.data.remove(feature);
-
-            });
-            let parent = instance.getParent();
-            instance.getData('/' + parent, instance, true);
+        });
+        if (this.currentMarker !== null) {
+            this.currentMarker.setMap(null);
         }
+        let parent = instance.getParent();
+        instance.getData('/' + parent, instance, true);
+
         this.closeModal();
     }
 
+    /**
+     * focuses map and colors to the clicked marker/polygon and fires an event to sidebar with the id of the marker
+     */
     seeDetails() {
+
+        console.log("inne i seeDetails");
         let map = this.getMap();
         let id = this.activeId;
+        let instance = this;
         this.closeModal();
         map.data.forEach(function (feature) {
             if (feature.getProperty('id') == id) {
@@ -261,6 +426,8 @@ export class Map {
                 if (feature.getProperty('icon') !== null) {
                     feature.O.icon.strokeColor = 'red';
                 }
+                this.isSearched = false;
+                console.log(this.isSearched);
             }
             else {
                 feature.setProperty('color', 'gray');
@@ -272,6 +439,9 @@ export class Map {
         this.newactive.next(this.activeId);
     }
 
+    /**
+     * gets the position of the clicked position on the map, saves the parent and sends it in an event.
+     */
     addUnit() {
         this.closeModal();
         let pos = this.getcurrentPos();
@@ -286,55 +456,100 @@ export class Map {
         this.setRunned(false);
     }
 
+    /**
+     * triggered from an event in search and gets the search object from the DHIS API
+     * then calles mapupdate()
+     * @param event - event from an emitter
+     */
     update(event) {
-        this.newactive.next(event);
-        let map = this.getMap();
-        let http = this.getHttp();
+        if(event !== null) {
+            if (this.currentMarker) {
+                this.currentMarker.setMap(null);
+            }
 
-        map.data.forEach(function (feature) {
-            map.data.remove(feature);
-        });
-        http.get(dhisAPI + '/api/organisationUnits/' + event)
-            .map(res => res.json())
-            .subscribe(
-                res=> this.mapUpdate(res, this)
-            );
+            this.newactive.next(event);
+            let map = this.getMap();
+            let http = this.getHttp();
+
+            map.data.forEach(function (feature) {
+                map.data.remove(feature);
+            });
+            http.get(dhisAPI + '/api/organisationUnits/' + event)
+                .map(res => res.json())
+                .subscribe(
+                    res => this.mapUpdate(res, this)
+                );
+        }
     }
 
+    /**
+     * updates varabels activeId, level and parent to matche the incomming object and gets all the children on the same level.
+     * Then it calles drawPolygon()
+     * @param res - org.unit object
+     * @param instance
+     */
     mapUpdate(res, instance) {
         this.setLevel(res.level);
+        this.setActiveId(res.id);
+        this.isSearched = true;
         this.setParent(res.parent.id);
-        this.drawPolygon(res, instance);
+       // this.setcurrentPos({lat: JSON.parse(res.coordinates)[1],lng: JSON.parse(res.coordinates)[0]});
+
+        instance.getData('/' + res.parent.id + '/children', instance);
+        if (res.coordinates == null || instance.LEVEL == instance.allLevels) {
+            instance.http.get(dhisAPI + '/api/organisationUnits/' + res.parent.id)
+                .map(res => res.json())
+                .subscribe(
+                    res => instance.drawPolygon(res, instance)
+                );
+        }
 
     }
 
+    /**
+     * adds a temperary marker so the user can see an update of the latitude and longitude of a marker
+     * @param pos - position for the temp marker
+     */
     tempMarker(pos) {
-        let map = this.map;
         if (this.currentMarker)
             this.currentMarker.setMap(null);
+        if(pos != null) {
+            let current = {};
+            current.lat = Math.round(this.getcurrentPos().lat() * 10000) / 10000;
+            current.lng = Math.round(this.getcurrentPos().lng() * 10000) / 10000;
+
+            let position = {};
+            position.lat = Math.round(pos.lat * 10000) / 10000;
+            position.lng = Math.round(pos.lng * 10000) / 10000;
+
+            if ((current.lat != position.lat) || (current.lng != position.lng)) {
 
-        this.currentMarker = new google.maps.Marker({
-            position: pos,
-            map: map,
-            title: 'neworg',
-            icon: {
-                path: google.maps.SymbolPath.CIRCLE,
-                scale: 3
+                let map = this.map;
+
+
+                this.currentMarker = new google.maps.Marker({
+                    position: pos,
+                    map: map,
+                    title: 'neworg',
+                    icon: {
+                        path: google.maps.SymbolPath.CIRCLE,
+                        strokeColor: "#871F78",
+                        scale: 4
+                    }
+                });
+                this.currentMarker.setMap(map);
+                map.panTo(this.currentMarker.getPosition());
             }
-        });
-        this.currentMarker.setMap(map);
-    }
+        }
 
-    showModal() {
-        return this.hideModal = document.getElementById("divModal").style.visibility = "visible";
     }
 
-    closeModal() {
-        this.hideModal = document.getElementById("topLevel").style.visibility = "hidden";
-        this.hideModal = document.getElementById("middleLevel").style.visibility = "hidden";
-        this.hideModal = document.getElementById("bottomLevel").style.visibility = "hidden";
-        this.hideModal = document.getElementById("divModal").style.visibility = "hidden";
 
+    /**
+     * closes the modal box over the map.
+     */
+    closeModal() {
+        $("#myModal").modal("hide");
         this.setRunned(false);
     }