kill stupid tab bug
[potlatch2.git] / net / systemeD / potlatch2 / BugLayer.as
index 0de103c978c598d17feb49db3c2a4e2860c3ea19..35b47fa2d3e676309dcbc27657ab5a2550bea63a 100644 (file)
@@ -2,44 +2,94 @@ package net.systemeD.potlatch2 {
 
     import net.systemeD.halcyon.VectorLayer;
     import net.systemeD.halcyon.Map;
-    import net.systemeD.halcyon.connection.Marker;
+    import net.systemeD.halcyon.connection.*;
+    import net.systemeD.halcyon.connection.actions.*;
     import flash.net.*;
     import flash.events.*;
+    import com.adobe.serialization.json.JSON;
 
     public class BugLayer extends VectorLayer {
 
         private var baseUrl:String;
         private var apiKey:String;
+        private var detailsUrl:String;
 
         // as strings, since that's how they are in tags and http calls
-        private var BUG_STATUS_OPEN:String = "1";
-        private var BUG_STATUS_FIXED:String = "2";
-        private var BUG_STATUS_INVALID:String = "3"; // or 'non-reproduceable'
+        public static var BUG_STATUS_OPEN:String = "1";
+        public static var BUG_STATUS_FIXED:String = "2";
+        public static var BUG_STATUS_INVALID:String = "3"; // or 'non-reproduceable'
+        public static const status:Array = ["", "open", "fixed", "invalid"];
 
-        public function BugLayer(n:String, map:Map, s:String, baseUrl:String, apiKey:String) {
+        public function BugLayer(n:String, map:Map, s:String, baseUrl:String, apiKey:String, detailsURL:String) {
             this.baseUrl = baseUrl;
             this.apiKey = apiKey;
+            this.detailsUrl = detailsURL;
             super(n,map,s);
         }
 
-        public function closeBug(m:Marker):void {
+        public function closeBug(m:Marker, nickname:String, comment:String, status:String = null):void {
             var id:String = m.getTag('bug_id');
-            var status:String = BUG_STATUS_FIXED;
-            var comment:String = "NoComment";
-            var nickname:String = "NoName";
-
-            //TODO urlencode stuff
-            var urlReq:URLRequest = new URLRequest(baseUrl+"changeBugStatus?id="+id+"&status="+status+"&comment="+comment+"&nickname="+nickname+"&key="+apiKey);
+            nickname ||= 'NoName';
+            // nicknames have length and character restictions. The character restrictions should be taken care of
+            // by the BugPanel.mxml restriction.
+            if (nickname.length < 3 || nickname.length > 16) {
+              nickname = 'NoName';
+            }
+            comment ||= 'No Comment';
+            if (comment.length > 1000) {
+              comment = comment.substr(0,1000); // that's index, length
+            }
+            status ||= BUG_STATUS_FIXED;
+            var urlReq:URLRequest = new URLRequest(baseUrl+"changeBugStatus?id="+id+"&status="+status+"&comment="+encodeURIComponent(comment)+"&nickname="+encodeURIComponent(nickname)+"&key="+apiKey);
             urlReq.method = "POST";
             urlReq.data = '    '; // dear Adobe, this is nuts, kthxbye (you can't POST with an empty payload)
             var loader:URLLoader = new URLLoader();
             loader.load(urlReq);
-            loader.addEventListener(Event.COMPLETE, bugClosed);
+            loader.addEventListener(Event.COMPLETE, function(e:Event):void { bugClosed(e, m, status); } );
+        }
+
+        private function bugClosed(event:Event, marker:Marker, s:String):void {
+            var action:UndoableEntityAction = new SetTagAction(marker, "status", status[int(s)]);
+            action.doAction(); // just do it, don't add to undo stack
+        }
+
+        public override function loadBbox(left:Number, right:Number,
+                                top:Number, bottom:Number):void {
+            var loader:URLLoader = new URLLoader();
+            loader.load(new URLRequest(baseUrl+"getBugs?bbox="+map.edge_l+","+map.edge_b+","+map.edge_r+","+map.edge_t+"&key="+apiKey));
+            loader.addEventListener(Event.COMPLETE, parseJSON);
         }
 
-        private function bugClosed(event:Event):void {
-            trace("bug closed");
-            // remove it from the layer, redraw, fix selection etc.
+        private function parseJSON(event:Event):void {
+            var result:String = String(event.target.data);
+            if (result) { // api returns 204 no content for no bugs, and the JSON parser treats '' as an error
+              var featureCollection:Object = JSON.decode(result);
+
+              for each (var feature:Object in featureCollection.features) {
+                // geoJSON spec is x,y,z i.e. lon, lat, ele
+                var lon:Number = feature.geometry.coordinates[0];
+                var lat:Number = feature.geometry.coordinates[1];
+                var tags:Object = {};
+                tags["name"] = String(feature.properties.description).substr(0,10)+'...';
+                tags["description"] = feature.properties.description;
+                tags["bug_id"] = feature.id;
+                tags["nickname"] = feature.properties.nickname;
+                tags["type"] = feature.properties.type;
+                tags["date_created"] = feature.properties.date_created;
+                tags["date_updated"] = feature.properties.date_updated;
+                tags["source"] = feature.properties.source;
+                tags["status"] = status[int(feature.properties.status)];
+                var marker:Marker = createMarker(tags, lat, lon, Number(feature.id));
+              }
+              paint.updateEntityUIs(getObjectsByBbox(map.edge_l,map.edge_r,map.edge_t,map.edge_b), true, false);
+            }
         }
+
+        public function bugDetailsUrl(m:Marker):String {
+            if (detailsUrl == '')
+              return null;
+            return detailsUrl+m.id;
+        }
+
     }
 }