From af65f8cb47d71af540b2a66825a0c87ecdcdd625 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 5 Nov 2014 16:25:10 -0500 Subject: [PATCH 01/16] reset JIT for working with chrome and safari --- app/assets/javascripts/src/JIT.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/assets/javascripts/src/JIT.js b/app/assets/javascripts/src/JIT.js index 743a7eef..498183ef 100644 --- a/app/assets/javascripts/src/JIT.js +++ b/app/assets/javascripts/src/JIT.js @@ -1,6 +1,3 @@ - -var requestAnimId; - /* Copyright (c) 2011 Sencha Inc. - Author: Nicolas Garcia Belmonte (http://philogb.github.com/) From d73fa37f57c5f48ba0e9a91188807a9b25183f41 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 8 Nov 2014 15:00:12 -0500 Subject: [PATCH 02/16] tweaked donate and get involved html --- app/views/layouts/_lightboxes.html.erb | 5 ++--- public/famous/templates.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index e745bcd9..c5488536 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -188,11 +188,12 @@
+

GET INVOLVED!

-
+

Want to help us with design, code, community building, and communications for Metamaps? We're an open value network, which for us means we want to invite and empower peers to participate in creating value together. @@ -206,8 +207,6 @@

Thanks for your interest in helping out with Metamaps! Hopefully this gets you pointed in the right direction to get involved. The next step is to read the links on this page and then contribute!

-
-
diff --git a/public/famous/templates.js b/public/famous/templates.js index 3575e354..d38b0edc 100644 --- a/public/famous/templates.js +++ b/public/famous/templates.js @@ -6,7 +6,7 @@ t.logoContent = ''; t.logoContent += ''; From 4437270a6b1c44da5315bbfc4725381832e11577 Mon Sep 17 00:00:00 2001 From: poietic Date: Sat, 8 Nov 2014 21:52:46 -0800 Subject: [PATCH 03/16] misc css tweaks --- app/assets/images/synapse32padded.png | Bin 0 -> 423 bytes app/assets/stylesheets/application.css | 27 +++++++++++++------------ app/assets/stylesheets/base.css | 21 +++++++++++-------- app/assets/stylesheets/clean.css | 6 +++--- 4 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 app/assets/images/synapse32padded.png diff --git a/app/assets/images/synapse32padded.png b/app/assets/images/synapse32padded.png new file mode 100644 index 0000000000000000000000000000000000000000..09e52fc03acc054b8a8a1160e0a3f4d29a201ff4 GIT binary patch literal 423 zcmV;Y0a*TtP)I9CUVFEVL5g5TXxrYlmq`ltp zVEB`UaG+oR-nGUcnDx)fvg|zePUI1OrMwq;0LO4acn-0eGyw&FLZlG4rfEK7p9vkp zQw@%)C))xI9;+pidnXkD_@)OZyB8+_@WKEmyB8&(;HFlqIo}frdb}_^V!5}fzz;av zJ!)au<0hf=dw&rsauRO=0gg%_D($|5D8&^}J^oMtst~>f_pRs*Xaj}=Z>ezV7VLZX zJBZ^5ymNjCwW_=aD)Pc)IdJwIP{St~=>O7Yrf}y#Wmvn|!dVpCMZ-(0Y R0mJ|R002ovPDHLkV1n=$sV4vc literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index e925ad4c..259e8232 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -519,19 +519,19 @@ input[type="submit"]:active { #new_topic .twitter-typeahead { position: absolute !important; - top: 40px; - left: 35px; + top: 45px; + left: 41px; z-index: 9999; - width: 270px; + width: 256px; height: 42px; } .new_topic #topic_name, .new_topic .tt-hint { - width: 254px; + width: 244px; background: #FFFFFF; height: 14px; margin: 0; - padding: 14px 8px; + padding: 10px 6px; border: none; border-radius: 2px; outline: none; @@ -581,11 +581,11 @@ input[type="submit"]:active { } .new_synapse #synapse_desc, .new_synapse .tt-hint { - width: 254px; + width: 244px; background: #FFFFFF; height: 14px; margin: 0; - padding: 14px 8px; + padding: 10px 6px; border: none; border-radius: 2px; outline: none; @@ -1170,8 +1170,9 @@ h3.realtimeBoxTitle { .rightclickmenu { position: absolute; - width: 300px; + width: 260px; background: #FFFFFF; + padding: 6px 0px 6px 0px; z-index: 20; border-radius: 2px; color: black; @@ -1184,8 +1185,8 @@ h3.realtimeBoxTitle { list-style: none; padding: 6px 10px 6px 32px; font-family: helvetica, sans-serif; - font-size: 12px; - line-height: 12px; + font-size: 13px; + line-height: 15px; position: relative; } .rightclickmenu li:hover { @@ -1337,7 +1338,7 @@ float: left; #new_topic .tt-suggestion, #new_synapse .tt-suggestion { background: #F5F5F5; - width: 270px; + width: 256px; position: relative; } #new_topic .autocompleteSection { @@ -1606,7 +1607,7 @@ float: left; background-position: 13px center; } .mapSynapses { - background-image: url(synapse32.png); + background-image: url(synapse32padded.png); background-position: 13px center; } .mapInfoBox .mapPermission { @@ -1671,7 +1672,7 @@ float: left; .mapInfoBox .mapInfoDesc { font-family: helvetica, sans-serif; color: #E0E0E0; - margin: 8px; + margin: 16px; padding-right: 16px; height: 115px; font-size: 14px; diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 6cfa3d69..b894b317 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -110,7 +110,7 @@ display:block; padding: 8px 0 8px 16px; height: 152px; - font-size: 12px; + font-size: 13px; line-height:15px; font-family: helvetica, sans-serif; overflow-y: auto; @@ -120,7 +120,7 @@ } .CardOnGraph .best_in_place_desc textarea { - font-size: 12px; + font-size: 13px; line-height:15px; font-family: helvetica, sans-serif; color: #424242; @@ -170,8 +170,8 @@ resize: none; z-index: 1; position: relative; color: #424242; - font-size: 12px; - line-height:12px; + font-size: 14px; + line-height:14px; height:12px; padding:17px 0; } @@ -187,9 +187,9 @@ resize: none; height: 48px; } .linkItem.contributor { - margin-left:32px; + margin-left:40px; z-index:1; - padding:17px 16px 17px 32px; + padding:17px 16px 17px 30px; position: relative; } .contributor .contributorIcon { @@ -202,8 +202,9 @@ resize: none; display:none; } .linkItem.mapCount { + margin-left: 12px; width: 24px; - padding:17px 0 17px 35px; + padding:17px 0 17px 36px; } .linkItem.mapCount .mapCountIcon { position: absolute; @@ -219,8 +220,9 @@ resize: none; background-position: 0 -32px; } .linkItem.synapseCount { + margin-left: 2px; width: 24px; - padding:17px 0 17px 35px; + padding:17px 0 17px 32px; } .linkItem.synapseCount .synapseCountIcon { position: absolute; @@ -241,6 +243,7 @@ resize: none; padding: 0; min-width: 32px; margin-top: 8px; + margin-left: 8px; background-image: url(permissions32_sprite.png); background-position: 0 0; } @@ -507,6 +510,8 @@ background-color: #E0E0E0; width: 268px; padding: 8px 16px 8px 16px; position: relative; + border: none; + line-height: 14px; } #addLinkInput input{ diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index 5ebcb763..1646ed3f 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -191,7 +191,7 @@ .explorePage .sidebarSearchField, .explorePage .sidebarSearch .tt-hint { width: 380px; - padding: 7px 10px 3px 10px; + padding: 5px 10px 5px 10px; } .sidebarSearchField { @@ -207,7 +207,7 @@ border-bottom: 1px solid #BDBDBD; border-left: none; border-right: none; - padding: 7px 0 3px 0; + padding: 5px 0 5px 0; width: 0px; margin: 0; outline: none; @@ -218,7 +218,7 @@ } .sidebarSearch .tt-dropdown-menu { top: 40px !important; - background: #FFF; + background: #F5F5F5; width: 472px; overflow-y: auto; overflow-x: hidden; From 44923eb660c5d8bd7aa360f4246ffa6bc56c0738 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 9 Nov 2014 22:10:13 -0500 Subject: [PATCH 04/16] added new map screenshot capture method --- app/assets/images/screenshot_sprite.png | Bin 0 -> 1556 bytes app/assets/javascripts/src/Metamaps.JIT.js | 43 +++--- app/assets/javascripts/src/Metamaps.Router.js | 4 +- app/assets/javascripts/src/Metamaps.js | 126 +++++++++++++++++- app/assets/stylesheets/clean.css | 16 +++ app/controllers/maps_controller.rb | 26 +++- app/models/map.rb | 6 +- app/views/layouts/_lowermapelements.html.erb | 1 + config/routes.rb | 1 + 9 files changed, 197 insertions(+), 26 deletions(-) create mode 100644 app/assets/images/screenshot_sprite.png diff --git a/app/assets/images/screenshot_sprite.png b/app/assets/images/screenshot_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c87c5a88580bcc443a2acef7c904b4baf93d03 GIT binary patch literal 1556 zcmV+v2J88WP){xF|lUp1*i3@kj9#t1Acr6|ft9|8+DKLiawcn5v) z(;5{8209`QQkjAJLCA#_nu^XK{2=&VrAQIm{0A1Y`~1ds+1%Wpw|TkTyC1x~d(U~# zo^#IcJkRgh7>h+LViAj2{C^`(>cCT{PAPCxxF79r-n<$6Cnp{){5T1q+LV+O$J*Lj zu|}ie2?+^oetw=!PEOiwHk-w6w;M1SaSIo%O-oC2;orG)hbJZ`vbniAHZd__|M>Bv zWnp0FMd}qM{;}nVHFyN~Qed$&<>TKY!|+PG{WI z)RZ;Ki`S{u>Q=p8&*S3a`0((sDI+68efsoiwtxSAR#;dlKXc}c^2d)KI$UAnhqVD0 zFJ5fAcJ11|va&KcW&H5r!)$PHaPP>-$V+U1irOgR@39Mjj=M|@Ob>>ts{{EZtoG?Z!YsHv%O;Xi!%&=0?-rzdRu zZJ{_{yf@%PsOg!ax3`xK3=HTo&UoO!0S-EtkqNt0&YwGX zt_LT;uW!$uJ#1!XMg`s*a3a+7O!4~lYi6}t^%!T&%F5!PLs0zRLd<~!#QNmPlYpH| zOG_>Ve*XNq_5S_)e06n|b#--FcI?T)L-n{-OFRIaxZKdt5U|tXaJcZF zK7DF^{P;1^j=g&I%Cc+MuBxk7ue#oO_wHR#{7@U9fV#fjr0)UL*6z-f*xA|1Q333W zi;Hh>-n?n_=t6F8Zh1#Xhtv&FeERe$Ed18iR*nilQ+TV>>5Lv-fH;=7wY61CIevo4 zWO9n4=yQGk{Mm`@_5~73;+$5io$`MF#fukCv@50HKYRAfiLCluD0$8c7cTS#5=z3q zd-v{?_xqqkQ2bybs3f)D7{qZLeZL*W&ezf%dZE~;6$n8>_LbS$*?x`0aU6X=d}QB+ z55e}qhi3?iFNaM?JS(zkXduJf>2+d-v|#>gsBNp5X*t_(+nGtZ<-MUS1~62#O!744P2aHCVU+ z(_@DEH+c*Xi495=WkN)|BG6!zCb}7Zf%YcUbqy9SfJ$c6_9nNeF}OnothfO26YJ{g z0^&C|HipCx>IBI_$z-y%+1c4|m;?vM6y*0Qz(dL~$0TY|^ULA-e8v)GumJ||V;X4? z{`&g*+Lte1zNMz7a!^b`exD*aIhmo%@edz9)WZ9hZxmmm49aLod|4P=d;or#j~+eB zJ?6#}Hk&E)wMa@>_>%q*K_$=}Ja|y>h#$(M2%4Di@pt0wR{tS_N}xG% 1) { var ctx = canvas.getCtx(); var x = (pos.x + posChild.x) / 2; @@ -400,7 +410,7 @@ Metamaps.JIT = { ctx = canvas.getCtx(); // if the topic is selected draw a circle around it - if (node.selected) { + if (!canvas.denySelected && node.selected) { ctx.beginPath(); ctx.arc(pos.x, pos.y, dim + 3, 0, 2 * Math.PI, false); ctx.strokeStyle = Metamaps.Settings.colors.topics.selected; @@ -1595,12 +1605,10 @@ Metamaps.JIT = { ctx.lineTo(v2.x, v2.y); ctx.stroke(); }, // renderMidArrow - renderEdgeArrows: function (edgeHelper, adj, synapse) { + renderEdgeArrows: function (edgeHelper, adj, synapse, canvas) { var self = Metamaps.JIT; - var canvas = Metamaps.Visualize.mGraph.canvas; - var directionCat = synapse.get('category'); var direction = synapse.getDirection(); @@ -1657,8 +1665,7 @@ Metamaps.JIT = { Metamaps.Visualize.mGraph.canvas.scale(0.8,0.8); $(document).trigger(Metamaps.JIT.events.zoom, [event]); }, - centerMap: function () { - var canvas = Metamaps.Visualize.mGraph.canvas; + centerMap: function (canvas) { var offsetScale = canvas.scaleOffsetX; canvas.scale(1/offsetScale,1/offsetScale); @@ -1674,7 +1681,8 @@ Metamaps.JIT = { eX = Metamaps.Mouse.boxEndCoordinates.x, eY = Metamaps.Mouse.boxEndCoordinates.y; - Metamaps.JIT.centerMap(); + var canvas = Metamaps.Visualize.mGraph.canvas; + Metamaps.JIT.centerMap(canvas); var height = $(document).height(), width = $(document).width(); @@ -1686,8 +1694,6 @@ Metamaps.JIT = { var newRatio = Math.min(ratioX,ratioY); - var canvas = Metamaps.Visualize.mGraph.canvas; - if(canvas.scaleOffsetX *newRatio<= 5 && canvas.scaleOffsetX*newRatio >= 0.2){ canvas.scale(newRatio,newRatio); } @@ -1711,15 +1717,14 @@ Metamaps.JIT = { Metamaps.Visualize.mGraph.plot(); }, - zoomExtents: function (event) { - Metamaps.JIT.centerMap(); - var height = $(document).height(), - width = $(document).width(), + zoomExtents: function (event, canvas, denySelected) { + Metamaps.JIT.centerMap(canvas); + var height = canvas.getSize().height, + width = canvas.getSize().width, maxX, minX, maxY, minY, counter = 0; - var canvas = Metamaps.Visualize.mGraph.canvas; - if (Metamaps.Selected.Nodes.length > 0) { + if (!denySelected && Metamaps.Selected.Nodes.length > 0) { var nodes = Metamaps.Selected.Nodes; } else { diff --git a/app/assets/javascripts/src/Metamaps.Router.js b/app/assets/javascripts/src/Metamaps.Router.js index aa4fa338..466326d2 100644 --- a/app/assets/javascripts/src/Metamaps.Router.js +++ b/app/assets/javascripts/src/Metamaps.Router.js @@ -125,7 +125,7 @@ if (Metamaps.Visualize.mGraph) { Metamaps.Visualize.mGraph.graph.empty(); Metamaps.Visualize.mGraph.plot(); - Metamaps.JIT.centerMap(); + Metamaps.JIT.centerMap(Metamaps.Visualize.mGraph.canvas); } Metamaps.Famous.viz.show(); Metamaps.Topic.end(); @@ -156,7 +156,7 @@ if (Metamaps.Visualize.mGraph) { Metamaps.Visualize.mGraph.graph.empty(); Metamaps.Visualize.mGraph.plot(); - Metamaps.JIT.centerMap(); + Metamaps.JIT.centerMap(Metamaps.Visualize.mGraph.canvas); } Metamaps.Famous.viz.show(); Metamaps.Map.end(); diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 2543f0df..7e03ea4e 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -3384,7 +3384,7 @@ Metamaps.Listeners = { case 69: //if e or E is pressed if (e.ctrlKey){ e.preventDefault(); - Metamaps.JIT.zoomExtents(); + Metamaps.JIT.zoomExtents(null, Metamaps.Visualize.mGraph.canvas); } break; case 77: //if m or M is pressed @@ -4203,6 +4203,130 @@ Metamaps.Map = { Metamaps.Map.sideLength = 1; Metamaps.Map.timeToTurn = 0; Metamaps.Map.turnCount = 0; + }, + exportImage: function() { + + var canvas = {}; + + canvas.canvas = document.createElement("canvas"); + canvas.canvas.width = 1880; // 960; + canvas.canvas.height = 1260; // 630 + + canvas.scaleOffsetX = 1; + canvas.scaleOffsetY = 1; + canvas.translateOffsetY = 0; + canvas.translateOffsetX = 0; + canvas.denySelected = true; + + canvas.getSize = function() { + if(this.size) return this.size; + var canvas = this.canvas; + return this.size = { + width: canvas.width, + height: canvas.height + }; + }; + canvas.scale = function(x, y) { + var px = this.scaleOffsetX * x, + py = this.scaleOffsetY * y; + var dx = this.translateOffsetX * (x -1) / px, + dy = this.translateOffsetY * (y -1) / py; + this.scaleOffsetX = px; + this.scaleOffsetY = py; + this.getCtx().scale(x, y); + this.translate(dx, dy); + }; + canvas.translate = function(x, y) { + var sx = this.scaleOffsetX, + sy = this.scaleOffsetY; + this.translateOffsetX += x*sx; + this.translateOffsetY += y*sy; + this.getCtx().translate(x, y); + }; + canvas.getCtx = function() { + return this.canvas.getContext("2d"); + }; + // center it + canvas.getCtx().translate(1880/2, 1260/2); + + var mGraph = Metamaps.Visualize.mGraph; + + var id = mGraph.root; + var root = mGraph.graph.getNode(id); + var T = !!root.visited; + + // pass true to avoid basing it on a selection + Metamaps.JIT.zoomExtents(null, canvas, true); + + var c = canvas.canvas, + ctx = canvas.getCtx(), + scale = canvas.scaleOffsetX; + + // draw a grey background + ctx.fillStyle = '#d8d9da'; + var xPoint = (-(c.width/scale)/2) - (canvas.translateOffsetX/scale), + yPoint = (-(c.height/scale)/2) - (canvas.translateOffsetY/scale); + ctx.fillRect(xPoint,yPoint,c.width/scale,c.height/scale); + + // draw the graph + mGraph.graph.eachNode(function(node) { + var nodeAlpha = node.getData('alpha'); + node.eachAdjacency(function(adj) { + var nodeTo = adj.nodeTo; + if(!!nodeTo.visited === T && node.drawn && nodeTo.drawn) { + mGraph.fx.plotLine(adj, canvas); + } + }); + if(node.drawn) { + mGraph.fx.plotNode(node, canvas); + } + if(!mGraph.labelsHidden) { + if(node.drawn && nodeAlpha >= 0.95) { + mGraph.labels.plotLabel(canvas, node); + } else { + mGraph.labels.hideLabel(node, false); + } + } + node.visited = !T; + }); + + var imageData = { + encoded_image: canvas.canvas.toDataURL() + }; + + console.log(imageData.encoded_image); + var map = Metamaps.Active.Map; + + var today = new Date(); + var dd = today.getDate(); + var mm = today.getMonth()+1; //January is 0! + var yyyy = today.getFullYear(); + if(dd<10) { + dd='0'+dd + } + if(mm<10) { + mm='0'+mm + } + today = mm+'/'+dd+'/'+yyyy; + + var downloadMessage = ""; + downloadMessage += "Captured map screenshot! "; + downloadMessage += "DOWNLOAD"; + Metamaps.GlobalUI.notifyUser(downloadMessage); + + $.ajax({ + type: "POST", + dataType: 'json', + url: "/maps/" + Metamaps.Active.Map.id + "/upload_screenshot", + data: imageData, + success: function (data) { + console.log('successfully uploaded map screenshot'); + }, + error: function () { + console.log('failed to save map screenshot'); + } + }); } }; diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index 5ebcb763..847ec0ed 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -763,6 +763,18 @@ background-position: 0 0; cursor:pointer; } +.takeScreenshot { + margin-bottom: 5px; + border-radius: 2px; + background-image: url(screenshot_sprite.png); + display: none; +} +.takeScreenshot:hover { + background-position: -32px 0; +} +.canEditMap .takeScreenshot { + display: block; +} .zoomExtents { margin-bottom:5px; border-radius: 2px; @@ -883,6 +895,10 @@ line-height:14px; } +.toast a { + color: #4fc059; +} + /* end toast */ /* feedback */ diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index 0fbad24b..fbf34abc 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -1,6 +1,6 @@ class MapsController < ApplicationController - before_filter :require_user, only: [:create, :update, :destroy] + before_filter :require_user, only: [:create, :update, :screenshot, :destroy] respond_to :html, :json @@ -183,6 +183,30 @@ class MapsController < ApplicationController end end + # POST maps/:id/upload_screenshot + def screenshot + @current = current_user + @map = Map.find(params[:id]).authorize_to_edit(@current) + + if @map + png = Base64.decode64(params[:encoded_image]['data:image/png;base64,'.length .. -1]) + StringIO.open(png) do |data| + data.class.class_eval { attr_accessor :original_filename, :content_type } + data.original_filename = "map-" + @map.id.to_s + "-screenshot.png" + data.content_type = "image/png" + @map.screenshot = data + end + + if @map.save + render :json => {:message => "Successfully uploaded the map screenshot."} + else + render :json => {:message => "Failed to upload image."} + end + else + render :json => {:message => "Unauthorized to set map screenshot."} + end + end + # DELETE maps/:id def destroy @current = current_user diff --git a/app/models/map.rb b/app/models/map.rb index fcfefc81..91bc0a11 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -8,12 +8,12 @@ class Map < ActiveRecord::Base has_many :topics, :through => :topicmappings has_many :synapses, :through => :synapsemappings - after_touch :save_screenshot + #after_touch :save_screenshot # This method associates the attribute ":image" with a file attachment has_attached_file :screenshot, :styles => { - :thumb => ['188x126#', :png], - :full => ['940x630#', :png] + :thumb => ['188x126#', :png] + #:full => ['940x630#', :png] }, :default_url => "/assets/missing-map.png" diff --git a/app/views/layouts/_lowermapelements.html.erb b/app/views/layouts/_lowermapelements.html.erb index c69d475f..42b1820a 100644 --- a/app/views/layouts/_lowermapelements.html.erb +++ b/app/views/layouts/_lowermapelements.html.erb @@ -1,4 +1,5 @@
+
diff --git a/config/routes.rb b/config/routes.rb index 5031b431..edc19576 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,6 +30,7 @@ Metamaps::Application.routes.draw do match 'maps/topics/:id', to: 'maps#index', via: :get, as: :topicmaps resources :maps, except: [:new, :edit] match 'maps/:id/contains', to: 'maps#contains', via: :get, as: :contains + match 'maps/:id/upload_screenshot', to: 'maps#screenshot', via: :post, as: :screenshot devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords', sessions: 'devise/sessions' }, :skip => [:sessions] From 218716dee3bb47fb5f1979e90dc60abf948e9af8 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 10 Nov 2014 11:06:57 -0500 Subject: [PATCH 05/16] fixed cross origin image draw, so that canvas.toDataURL can work --- app/assets/javascripts/src/Metamaps.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 7e03ea4e..0049f983 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -82,6 +82,7 @@ Metamaps.Backbone.init = function () { self.Metacode = Backbone.Model.extend({ initialize: function () { var image = new Image(); + image.setAttribute('crossOrigin', 'anonymous'); image.src = this.get('icon'); this.set('image',image); }, From 20a6a9f44342f041102edbe0982c2f5c6083da16 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 10 Nov 2014 11:20:56 -0500 Subject: [PATCH 06/16] another attempt at cross origin --- app/assets/javascripts/src/Metamaps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 0049f983..377ef7ab 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -82,7 +82,7 @@ Metamaps.Backbone.init = function () { self.Metacode = Backbone.Model.extend({ initialize: function () { var image = new Image(); - image.setAttribute('crossOrigin', 'anonymous'); + image.crossOrigin = "Anonymous"; image.src = this.get('icon'); this.set('image',image); }, From 3bb8256f8f35d1418312760c49e380955ffc13e3 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 10 Nov 2014 17:58:15 -0500 Subject: [PATCH 07/16] updated missing map image. added topic description signifier and relocated topic link signifier to top left. added synapse count signifier. --- app/assets/images/linkedmedia.png | Bin 404 -> 0 bytes app/assets/images/missing-map.png | Bin 16291 -> 4242 bytes app/assets/images/synapsestar.png | Bin 304 -> 0 bytes .../images/topic_description_signifier.png | Bin 0 -> 450 bytes app/assets/images/topic_link_signifier.png | Bin 0 -> 621 bytes app/assets/javascripts/src/Metamaps.JIT.js | 77 +++++++++++++----- 6 files changed, 55 insertions(+), 22 deletions(-) delete mode 100755 app/assets/images/linkedmedia.png delete mode 100755 app/assets/images/synapsestar.png create mode 100644 app/assets/images/topic_description_signifier.png create mode 100644 app/assets/images/topic_link_signifier.png diff --git a/app/assets/images/linkedmedia.png b/app/assets/images/linkedmedia.png deleted file mode 100755 index 2009b7a356935d0cad6509c1ed619717f699a636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmV;F0c-w=P)LXwC)4s@LYninX{Z3rWu2$#?@Wcaqgjjz}U9rn+cZ8UP^){ z;tmNy3#du2m{~?*g2mO9bHVjDB;aiqJ&1w?uGtb^YGWZ?3EWUfPDxoSXiGrF*&9gi zY$t-4Gf1uPxphGjZ_b6hr*U9^iE%PD!7}FT6&>1ejr;T#aCk?nXIj6SKJj!ZC3-jH yG4(oCf4i5aazkGuAPIXzYR|MI-M`QICBOhkW~$HXnI!fA0000;K_7&p!LvU!D(Vt-Vh^ki^X$qo<=zPQpThhlfY5sR1##?X9;JLVWl3 zq$b@}N#vFTs5mttN=9#IcXQleMib24!!x~jvx*&Rj|uA%)}VTmsfy1{=I(M&m)1el zGt3V^i_&9{32@pwL_h3FPc6{qJ~CnYvg2YZ!7mxcGvLU4WQVen-XRYcZ>(Zcy~9OS z(eU0v;GTbrpWn;B=d(64WWmm0a0~eCYVXEB_sAD`>ER)&q$2c9`R)A?DwaC^Mu`^z zxETI@FO>iEdr@q(Rs?+SJ~>)R#pQM^6-h|`|M4yTKmH%dznXt=xQnCx)lHrWdz9N) z=YD6*vL%BRoNxnm5cvqy`uSzJ3d`2(Z4-Vm2~|+P-|MM`H)olk?o;g2O!&z8L|43!^6T%K;U+^IYEgcX&;V<>F*61d)Ei`3qiBhnazPW?!Wxx?dF}<{t{_l{ z7MJ;r&HXMmaPqH4n|zM*dDI&wK&1CYP5Sh4fH%m$!pgU_HM9_F$ zq@4SZh_iqbW^A>Oq@AZIf%$ghL#=|{Z?4$}X)w5dPAJoAkLY1#I{S=6e^WG(+}01h z_9Y8saJiHM7I==`spfhxUIq3*&+}m)(ajX+xgI9*yi3rX7${b8!4g^+%ykBS5b$gb z<>;h4Rp+j!>T~;@CAE6-^dlAc@spXVh2hUg(FNK_30QkY2mu7ieln_<%&#wrE7Szbh{KjAOH3XaaRMnfGXIT^Ac4;zWnNF?rSK2biJVAf3= zzno6DnTzt4NqOsMx`8%1$fxkF3)+d>?4xJJW3T@dfB#d^_|_|$z=BncE`LGKuL`Qu z5!&I&hcDX;Z{}$`fusa@kGtlpLP^>;!Y7BhP!jRfU@yL=%Qa+P@Fcx~U1mZrXOzoi zP2d~UN^xcg3uODKS+wDEkxrlUh{GjlXR;+q!XT@XZH8CI_YQ+Qr>tD|?8%rKUO&@8 zq_VHlZ+dCIMKyOiyK;N3*!VsWm?~3W9MdP)J*mQ6u>RH`u&G)q7AFD!`qLuKd1Q`? zoL5{3{T1=StvlNO+->Qx2~rq${citI5;|TesAYFt4!OI_j%a zVG-xPR+Rt)5;c9A+jbEn2=_U}n2pdfk9z(o>rC3$uht9~^m5nq5x4}Zkx0wH{NnNZ z4|BPU-`NV-*)tu)jUbHX$UJV0JJp(F)>s!x#e{N1NHP-^YWV3|S))}IRJDJ8W3!H! zUUlVAmJG;f$dwW-%_nQDElV(oa;Co!9=P;Q+s{tFfha*tNqH?1HFU$aNI5t*w`eUc&8-z)Iv| zgV6Y_N3_@ESkobHfLT1!$vc=am$-SgUQLUz$a;CU&fR}vRL z^yYru?4MhBG?Gyk4cs9YZ{c4n^MQL)62ze6QG!Q|QgEttruk%;pX|xmPZyOz#HPZE zEZ3`LB9kSCm~R{vRv*aIZ2+;+=9^HdX#(H{hupNe^^&(o`DlmJ(C^>P6%<7^@`)>b zMLNjUmbCN?ry?P(ApSFj-;UV#3aDPc$JA+5N}N3TPY5o11P#ADZ=dQxmspS9W2JoN zj%{kSb^MN-H9o)>&dG7RdXEi(>H z7I0MN45Ahs!UQ!{I!-x7`ve3e!KRnL9w_|0`nC*m;}PebVm}CR-icGFygc`Q$1?bK zhzY#NR4g^cN-$?y+Y<`!`2^}C>j#$W47(>Ls0GCtC~_YQ*DUusH#a9$Ub)Q`^atx8 z=5vB70#~jss%iOKoB4iNyjW;yIw-PmR-ccc_x}+YU*m2qFbJL(X=WKoXZg;%faa4Q z>x6sMI;rMeFYMLF%lmwX8X$I|WR2j(`Nv|@zi5b=B_NSb_fnivcYLOb1_72VmB^V? zM#vd2>c{AK3#MUtYiSP-Q&%cNg)Q>Rm|G58ipccSb4h_*>yFzKHa23pi81{3Wzj6F zM2|ZNP!}hnc~(`ZIune2_X?arBOv&OL|L-gRsX{I&iY4poisixA+;B+#j7EI*E%P| ztGh+G6_nrLm(Yk>V-oyy0mDKg|9tzPo2#g#v{UadEar+Y9tI~VBAa|7n*uW>9$e7_ z_BM}tM#R!;b`AzIN^mBVCncz;BDL(~eK|_k`O5%*+r!}?H!G^__hx@&cqX5FHqd?$ zwc5TJK7f>L7>Ji>nbUqq={P{Xbi6jCd^JY99l*Onn$??&OBJ*o0wOVo%+{uA4x8H( z3~< zl62yMr#ug<3w8!Ll1n^7LaIs8%;L|B3<>ZVAGX6L*XS@|%DNr~p1LF=JYYr5OC?E> z{l>H?ECIO8YMfXL$Pe8tl$g4z)k&p9EmKyFq@CJyv6&cg;mTV|jHXt5ZMz0Ap*|s0 z@!b|8FCE6mAvv03&az=C z52)KLyE=OytpZFx`jw$5WZ-5OQP_juoD(el$= zzL+byWQVE6KN}+(+3)O|-OFap0`vP`D^K+%-*+;6;_U0XJx<&&#utjC%Lw{109-V9 zpu$MEwJB(T6F5dAt}6X}VtG8*6byK&eM*Y+v!G;;s|*Yh8W~y0k=yqr-Sx3lv|9A9MVCCuE@!DJwd>mh)j z$2v;mB%PC-hd#iF@I|T%kUl<0s?BKfPD>`l{C@hZmo{NK$wi^J%v$9HG6)~4>w&uj znof*z=nFou#g^C|jc(Drvb&(nN)>Ud!`Tr-$tog$Wz0@+-A7JtJQ%Y-hGH!!`@zAw zRQ$dt-cJ}`l;HD8H<+KSR>vl~D_kjkk33j2;mxWB3pEVx6NByBdl988Kk|jh{dAib zL!)`5@*R8aKW!73mMWo(=dappzgGBNe&BLz zD=L}tNH&=k)DK1+s1xgXK?X?&Jz2bV*_6k}T75a8BZ$KbqHa1)2FqT#T^C9d+*P8};(-h%4ad#78Yc9<~jKux#&ZNxph zk1l-eelTux%SUS)IOaZb1sMMMv2E0K#5#`AN@aP$*ZJ6QkTv4-8*3Ub$c`*PjIo6EwbD+5QO$+zmZR zVDpUgPR)APnD3wXq=q@z!}~_omq0O?IkT#=fSkzN6WvmoL%PoOx*#~_}HoJV4;inX4IMb z!ygYU#Dc8f*&u`B0q+9oqf%m}PoU9MXU%cPE+okH(h)%ZJQw0TI(#HeS2vO3rFm*H&h> z?ct5(Q?k?`C6^{@)5&qu8D0)uvq{3&vB`BACg)f0D{LUxuqgP(@@G!tbJ1#l4c999=1Ie3GxMhH$xBfi#JumzE8_1qPMX1Hc;S#n2P>9NH48AwBHN}>ym&OSA{JOWVMjgb^pbY-876Z zdQabvGRTR?W=l#rpC$UvTdHZi%nV68F1eHxYM<$l~>M?`noHh82ejzd+do$ewy zP2JIwo_4+&`7b9({aKzl4EGahb&wyVcy(b?mLG%~3CUVAib6&izB~_wkD$1vT!_h8 zlq2BABPjI$F8}cV4*pN`U(vtV9ECVNJ;fO-sucV;j=PIp=HcPvooVOSJXnIV-To=y NX{zc#DwJ)){{u9uFJAxv literal 16291 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 ZU;zH03AX4(D#HK(002ovPDHLkV1jyu&AI>p diff --git a/app/assets/images/synapsestar.png b/app/assets/images/synapsestar.png deleted file mode 100755 index ba9a7dd3f98f7c2388c1a0d40e589fdfeb44a726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP|;pb7srr_TSsWZ73{| z4hRd|#^6$3TBv)^z1T31fgzO1G^*Jv`(fe&)hGaX*ec!;3cbq0mCDw6}>MWD21GBOi*Cj z8^o~W*Toj@M!)$E24W4f9M@Sed_Cr_qThIf&%s&m!Dl8869>}<2PTojJedcidp+11 va-uo5{hW2!Y~j7LP5z0q@#olP$mcypllFENJ*CsfC)kth(bq4HV7kx3E*D(BC>2^ zgGCVXORt#Z-+%U>&x{5=+sFZM0Qv?nem5})f((z4f1Zk>SbuE?P<+)YP8RYz$ALd1 zA^IBQF@;wk*~yS6#E}KOL2jyw8)~wgtbrfkN1k{uq(lT1zTv!C>zneFyaMpByxTrN z-1_7|V@krrV(|l3F9qPKGU~c6ec#V9oNzxUhDB++iMR=h?~F+(;lzRo7I%aa zS=9laFxLppb&DGTzz&ceWE!Cv$68myJ&RJ8O(hzkG*5H&v7+~MQqFMkCY*!7cM$o~ zHTO`XIGuo6@`>bm$uU<}NAcV*W#VJnf>7~3QjFWJ2yJjcwt}?HbRNqtoa$o$d<&+6 ss%;f~CxY)zye5g12RF$1Z^guchMnT zEE}H-9Q;M@+AERaLd*yTw$N0DuA>ugdTnfE2cG z!x;gveUNqLvjl7q!J~x!#D-7gk~^tI!jS;A0`Lj_nfgU)5id(HfE61)!f6vW=aJ@E zE#eFz0T=*5>%=hk$J-q)0N7x>QCx#CTkn{lQ#De6$;HaxUn_vY9i^{gX1V|)_n>)k zvmC}+3wWx=gUB7Q7~c7f1^}(_jn@zQ9{LxIWMC>=3vw_Vr+FWgWQqSwD zrD7$zqOdTU`QGq1kNlf>=>^J`KcouEj)NCoF#!vu%*;}Wc1ms%ccgy>Fa!~?AWY{37=kF63f8od z6yV^R-c1lWljD^R!~lRfB6F=LLPJH=DizTU2&rSM0Vo2GHmH~yDLzq*lrAOxXxTR8 zgkUNFQ9Z$m)w3pr@5TZ+m;7LrE#(4qN2x2-W`~%o{R%JuFVP};@r%Nk00000NkvXX Hu0mjfLW%=q literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 06ed616f..bbbfd1d7 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -28,11 +28,11 @@ Metamaps.JIT = { $(".takeScreenshot").click(Metamaps.Map.exportImage); - self.synapseStarImage = new Image(); - self.synapseStarImage.src = '/assets/synapsestar.png'; + self.topicDescImage = new Image(); + self.topicDescImage.src = '/assets/topic_description_signifier.png'; - self.topicMediaImage = new Image(); - self.topicMediaImage.src = '/assets/linkedmedia.png'; + self.topicLinkImage = new Image(); + self.topicLinkImage.src = '/assets/topic_link_signifier.png'; }, /** * convert our topic JSON into something JIT can use @@ -140,14 +140,31 @@ Metamaps.JIT = { var showDesc = adj.getData("showDesc"); - var drawStar = function (context, x, y) { - var starImage = Metamaps.JIT.synapseStarImage; - var starImageLoaded = starImage.complete || - (typeof starImage.naturalWidth !== "undefined" && - starImage.naturalWidth !== 0) - if (starImageLoaded) { - context.drawImage(starImage, x, y, 16, 16); - } + var drawSynapseCount = function (context, x, y, count) { + /* + circle size: 16x16px + positioning: overlay and center on top right corner of synapse label - 8px left and 8px down + color: #dab539 + border color: #424242 + border size: 1.5px + font: DIN medium + font-size: 14pt + font-color: #424242 + */ + context.beginPath(); + context.arc(x, y, 8, 0, 2 * Math.PI, false); + context.fillStyle = '#DAB539'; + context.strokeStyle = '#424242'; + context.lineWidth = 1.5; + context.closePath(); + context.fill(); + context.stroke(); + + // add the synapse count + context.fillStyle = '#424242'; + context.textAlign = 'center'; + context.font = '14px din-medium'; + context.fillText(count, x, y - 6); }; if (!canvas.denySelected && desc != "" && showDesc) { @@ -165,7 +182,7 @@ Metamaps.JIT = { for (index = 0; index < arrayOfLabelLines.length; ++index) { lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width) } - var width = Math.max.apply(null, lineWidths) + 8; + var width = Math.max.apply(null, lineWidths) + 16; var height = (16 * arrayOfLabelLines.length) + 8; var x = (pos.x + posChild.x - width) / 2; @@ -187,23 +204,29 @@ Metamaps.JIT = { ctx.closePath(); ctx.fill(); + // get number of synapses + var synapseNum = adj.getData("synapses").length; + //render text - ctx.fillStyle = '#222222'; + ctx.fillStyle = '#424242'; ctx.textAlign = 'center'; for (index = 0; index < arrayOfLabelLines.length; ++index) { - ctx.fillText(arrayOfLabelLines[index], x + (width / 2), y + 5 + (16 * index)); + ctx.fillText(arrayOfLabelLines[index], x + (width / 2), y + 7 + (16 * index)); } - if (adj.getData("synapses").length > 1) { - drawStar(ctx, x + width, y); + if (synapseNum > 1) { + drawSynapseCount(ctx, x + width, y, synapseNum); } } else if (!canvas.denySelected && showDesc) { - if (adj.getData("synapses").length > 1) { + // get number of synapses + var synapseNum = adj.getData("synapses").length; + + if (synapseNum > 1) { var ctx = canvas.getCtx(); var x = (pos.x + posChild.x) / 2; var y = (pos.y + posChild.y) / 2; - drawStar(ctx, x, y); + drawSynapseCount(ctx, x, y, synapseNum); } } @@ -433,12 +456,22 @@ Metamaps.JIT = { // if the topic has a link, draw a small image to indicate that var hasLink = topic && topic.get('link') !== "" && topic.get('link') !== null; - var linkImage = Metamaps.JIT.topicMediaImage; + var linkImage = Metamaps.JIT.topicLinkImage; var linkImageLoaded = linkImage.complete || (typeof linkImage.naturalWidth !== "undefined" && linkImage.naturalWidth !== 0) if (hasLink && linkImageLoaded) { - ctx.drawImage(linkImage, pos.x + dim / 2, pos.y - dim - 8, 16, 16); + ctx.drawImage(linkImage, pos.x - dim - 8, pos.y - dim - 8, 16, 16); + } + + // if the topic has a desc, draw a small image to indicate that + var hasDesc = topic && topic.get('desc') !== "" && topic.get('desc') !== null; + var descImage = Metamaps.JIT.topicDescImage; + var descImageLoaded = descImage.complete || + (typeof descImage.naturalWidth !== "undefined" && + descImage.naturalWidth !== 0) + if (hasDesc && descImageLoaded) { + ctx.drawImage(descImage, pos.x + dim - 8, pos.y - dim - 8, 16, 16); } }, 'contains': function (node, pos) { @@ -479,7 +512,7 @@ Metamaps.JIT = { if (-1 < pos.x && pos.x < 1) pos.x = 0; if (-1 < pos.y && pos.y < 1) pos.y = 0; - return $jit.Graph.Plot.edgeHelper.line.contains(from, to, pos, adj.Edge.epsilon); + return $jit.Graph.Plot.edgeHelper.line.contains(from, to, pos, adj.Edge.epsilon + 5); } } } From 1658c5fb5dd6c4a34b5bfe8e2c00d045c69c1fd1 Mon Sep 17 00:00:00 2001 From: poietic Date: Mon, 10 Nov 2014 17:02:07 -0800 Subject: [PATCH 08/16] lightbox content tweaks --- app/views/layouts/_lightboxes.html.erb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index c5488536..68b0db68 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -112,19 +112,19 @@
  • Asana
  • Invision App *
  • Docracy *
  • -
  • Google Hangouts
  • Google Plus *
  • -
  • Hipchat
  • Hackpad *
  • Loomio *
  • Twitter *
  • +
  • Hipchat
  • +
  • Google Hangouts
  • Vimeo
  • Youtube

  • -

    Development

    +

    Design & Development

      -
    • Git
    • -
    • Github*
    +
  • Github*
  • +
  • Pixelapse*
  • Documentation

    • Dropbox *
    • Google Drive *
    • @@ -158,7 +158,7 @@

    Documentation

    • Dropbox *
    • Google Drive *
    • From 8d3de3867f486d77060e64d0102ee2ed8c5e9a03 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 11 Nov 2014 06:48:21 -0500 Subject: [PATCH 13/16] enabled pulling in siblings through right click menus in topic view --- app/assets/javascripts/src/Metamaps.JIT.js | 117 ++++++++++++++++++--- app/assets/javascripts/src/Metamaps.js | 68 +++++++++++- app/assets/javascripts/src/codeleft.js | 34 ------ app/assets/stylesheets/application.css | 33 ++++-- app/controllers/topics_controller.rb | 81 +++++++++++++- config/routes.rb | 2 + 6 files changed, 271 insertions(+), 64 deletions(-) delete mode 100644 app/assets/javascripts/src/codeleft.js diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 038f1a67..88436a80 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -37,8 +37,9 @@ Metamaps.JIT = { /** * convert our topic JSON into something JIT can use */ - prepareVizData: function () { - var self = Metamaps.JIT; + convertModelsToJIT: function(topics, synapses) { + var jitReady = []; + var synapsesToRemove = []; var topic; var mapping; @@ -48,18 +49,14 @@ Metamaps.JIT = { var edge; var edges = []; - // reset/empty vizData - self.vizData = []; - Metamaps.Visualize.loadLater = false; - - Metamaps.Topics.each(function (t) { + topics.each(function (t) { node = t.createNode(); nodes[node.id] = node; }); - Metamaps.Synapses.each(function (s) { + synapses.each(function (s) { edge = s.createEdge(); - if(Metamaps.Topics.get(s.get('node1_id')) === undefined || Metamaps.Topics.get(s.get('node2_id')) === undefined) { + if (topics.get(s.get('node1_id')) === undefined || topics.get(s.get('node2_id')) === undefined) { // this means it's an invalid synapse synapsesToRemove.push(s); } @@ -89,17 +86,31 @@ Metamaps.JIT = { } }); + _.each(nodes, function (node) { + jitReady.push(node); + }); + + return [jitReady, synapsesToRemove]; + }, + prepareVizData: function () { + var self = Metamaps.JIT; + var mapping; + + // reset/empty vizData + self.vizData = []; + Metamaps.Visualize.loadLater = false; + + var results = self.convertModelsToJIT(Metamaps.Topics, Metamaps.Synapses); + + self.vizData = results[0]; + // clean up the synapses array in case of any faulty data - _.each(synapsesToRemove, function (synapse) { + _.each(results[1], function (synapse) { mapping = synapse.getMapping(); Metamaps.Synapses.remove(synapse); Metamaps.Mappings.remove(mapping); }); - _.each(nodes, function (node) { - self.vizData.push(node); - }); - if (self.vizData.length == 0) { Metamaps.Visualize.loadLater = true; } @@ -1319,7 +1330,9 @@ Metamaps.JIT = { if (Metamaps.Active.Map && Metamaps.Active.Mapper) menustring += '
    • Delete
    • '; - if (Metamaps.Active.Topic) menustring += '
    • Center this topic
    • '; + if (Metamaps.Active.Topic) { + menustring += '
    • Center this topic
    • '; + } menustring += '
    • Open in new tab
    • '; if (Metamaps.Active.Mapper) { var options = '
      • commons
      • \ @@ -1333,6 +1346,15 @@ Metamaps.JIT = { menustring += '
      • Change metacode' + metacodeOptions + '
      • '; } + if (Metamaps.Active.Topic) { + // set up the get sibling menu as a "lazy load" + // only fill in the submenu when they hover over the get siblings list item + var siblingMenu = '
          \ +
        • All
        • \ +
        • \ +
        '; + menustring += '
      • Get siblings' + siblingMenu + '
      • '; + } menustring += '
      '; rightclickmenu.innerHTML = menustring; @@ -1426,7 +1448,70 @@ Metamaps.JIT = { Metamaps.Control.updateSelectedMetacodes($(this).attr('data-id')); }); - }, //selectNodeOnRightClickHandler + + // fetch relatives + var fetched = false; + $('.rc-siblings').hover(function () { + if (!fetched) { + Metamaps.JIT.populateRightClickSiblings(node); + fetched = true; + } + }); + $('.rc-siblings .fetchAll').click(function () { + $('.rightclickmenu').remove(); + // data-id is a metacode id + Metamaps.Topic.fetchRelatives(node); + }); + }, //selectNodeOnRightClickHandler, + populateRightClickSiblings: function(node) { + var self = Metamaps.JIT; + + // depending on how many topics are selected, do different things + /*if (Metamaps.Selected.Nodes.length > 1) { + // we don't bother filling the submenu with + // specific numbers, because there are too many topics + // selected to find those numbers + $('#loadingSiblings').remove(); + return; + }*/ + + var topic = node.getData('topic'); + + // add a loading icon for now + var loader = new CanvasLoader('loadingSiblings'); + loader.setColor('#4FC059'); // default is '#000000' + loader.setDiameter(15); // default is 40 + loader.setDensity(41); // default is 40 + loader.setRange(0.9); // default is 1.3 + loader.show(); // Hidden by default + + var topics = Metamaps.Topics.map(function(t){ return t.id }); + var topics_string = topics.join(); + + var successCallback = function(data) { + $('#loadingSiblings').remove(); + + for (var key in data) { + var string = Metamaps.Metacodes.get(key).get('name') + ' (' + data[key] + ')'; + $('#fetchSiblingList').append('
    • ' + string + '
    • '); + } + + $('.rc-siblings .getSiblings').click(function () { + $('.rightclickmenu').remove(); + // data-id is a metacode id + Metamaps.Topic.fetchRelatives(node, $(this).attr('data-id')); + }); + }; + + $.ajax({ + type: "Get", + url: "/topics/" + topic.id + "/relative_numbers.json?network=" + topics_string, + success: successCallback, + error: function () { + + } + }); + }, selectEdgeOnClickHandler: function (adj, e) { if (Metamaps.Visualize.mGraph.busy) return; diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index ff2203c4..5b2109bc 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -219,7 +219,6 @@ Metamaps.Backbone.init = function () { var mapping; var node = this.get('node'); node.setData('topic', this); - node.id = this.isNew() ? this.cid : this.id; if (Metamaps.Active.Map) { mapping = this.getMapping(); @@ -1508,6 +1507,8 @@ Metamaps.Visualize = { mapping; if (self.type == "RGraph") { + var i, l, startPos, endPos, topic, synapse; + self.mGraph.graph.eachNode(function (n) { topic = Metamaps.Topics.get(n.id); topic.set({ node: n }, { silent: true }); @@ -3671,8 +3672,7 @@ Metamaps.Topic = { }, centerOn: function (nodeid) { if (!Metamaps.Visualize.mGraph.busy) { - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - Metamaps.Visualize.mGraph.onClick(node.id, { + Metamaps.Visualize.mGraph.onClick(nodeid, { hideLabels: false, duration: 1000, onComplete: function () { @@ -3681,6 +3681,66 @@ Metamaps.Topic = { }); } }, + fetchRelatives: function(node, metacode_id) { + + var topics = Metamaps.Topics.map(function(t){ return t.id }); + var topics_string = topics.join(); + + var creators = Metamaps.Creators.map(function(t){ return t.id }); + var creators_string = creators.join(); + + var topic = node.getData('topic'); + + var successCallback = function(data) { + if (data.creators.length > 0) Metamaps.Creators.add(data.creators); + if (data.topics.length > 0) Metamaps.Topics.add(data.topics); + if (data.synapses.length > 0) Metamaps.Synapses.add(data.synapses); + + var topicColl = new Metamaps.Backbone.TopicCollection(data.topics); + topicColl.add(topic); + var synapseColl = new Metamaps.Backbone.SynapseCollection(data.synapses); + + var graph = Metamaps.JIT.convertModelsToJIT(topicColl, synapseColl)[0]; + Metamaps.Visualize.mGraph.op.sum(graph, { + type: 'fade', + duration: 500, + hideLabels: false + }); + + var i, l, t, s; + + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + t = Metamaps.Topics.get(n.id); + t.set({ node: n }, { silent: true }); + t.updateNode(); + + n.eachAdjacency(function (edge) { + if(!edge.getData('init')) { + edge.setData('init', true); + + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + s = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + s.set({ edge: edge }, { silent: true }); + s.updateEdge(); + } + } + }); + }); + }; + + var paramsString = metacode_id ? "metacode=" + metacode_id + "&" : ""; + paramsString += "network=" + topics_string + "&creators=" + creators_string; + + $.ajax({ + type: "Get", + url: "/topics/" + topic.id + "/relatives.json?" + paramsString, + success: successCallback, + error: function () { + + } + }); + }, /* * * @@ -4739,8 +4799,6 @@ Metamaps.Account = { var destWidth = 84; var destHeight = 84; - //debugger; - context.drawImage(imageObj, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight); $('.userImageDiv').prepend($canvas); }; diff --git a/app/assets/javascripts/src/codeleft.js b/app/assets/javascripts/src/codeleft.js deleted file mode 100644 index 413fc62a..00000000 --- a/app/assets/javascripts/src/codeleft.js +++ /dev/null @@ -1,34 +0,0 @@ -function fetchRelatives(node) { - var myA = $.ajax({ - type: "Get", - url: "/topics/" + node.id + "?format=json", - success: function (data) { - if (gType == "centered") { - Mconsole.busy = true; - Mconsole.op.sum(data, { - type: 'fade', - duration: 500, - hideLabels: false - }); - Mconsole.graph.eachNode(function (n) { - n.eachAdjacency(function (a) { - if (!a.getData('showDesc')) { - a.setData('alpha', 0.4, 'start'); - a.setData('alpha', 0.4, 'current'); - a.setData('alpha', 0.4, 'end'); - } - }); - }); - Mconsole.busy = false; - } else { - Mconsole.op.sum(data, { - type: 'nothing', - }); - Mconsole.plot(); - } - }, - error: function () { - alert('failure'); - } - }); -} \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 259e8232..7849d889 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1244,7 +1244,9 @@ h3.realtimeBoxTitle { .rc-metacode li img { float: left; } -.rightclickmenu .rc-permission ul, .rightclickmenu .rc-metacode ul { +.rightclickmenu .rc-permission ul, +.rightclickmenu .rc-metacode ul, +.rightclickmenu .rc-siblings ul { display: none; background: white; top: 0; @@ -1255,7 +1257,9 @@ float: left; border-top-right-radius: 2px; box-shadow: 0px 3px 3px rgba(0,0,0,0.12), 0 3px 3px rgba(0,0,0,0.24); } -.rightclickmenu .rc-permission:hover > ul, .rightclickmenu .rc-metacode:hover > ul { +.rightclickmenu .rc-permission:hover > ul, +.rightclickmenu .rc-metacode:hover > ul, + .rightclickmenu .rc-siblings:hover > ul { display: block; } .rightclickmenu p { @@ -1283,20 +1287,24 @@ float: left; .rightclickmenu li.toPrivate .rc-perm-icon { background-position: -24px 0; } -.rightclickmenu .rc-metacode > ul > li { +.rightclickmenu .rc-metacode > ul > li, +.rightclickmenu .rc-siblings > ul > li { padding: 6px 10px 6px 8px; width: 100px; } -.rightclickmenu .rc-metacode ul ul { +.rightclickmenu .rc-metacode ul ul, +.rightclickmenu .rc-siblings ul ul { display: none; max-height: 270px; overflow-y: auto; overflow-x: hidden; } -.rightclickmenu .rc-metacode li:hover ul { +.rightclickmenu .rc-metacode li:hover ul, +.rightclickmenu .rc-siblings li:hover ul { display: block; } -.rightclickmenu .rc-metacode ul ul li { +.rightclickmenu .rc-metacode ul ul li, +.rightclickmenu .rc-siblings ul ul li { padding: 4px 10px 4px 8px; width: 120px; } @@ -1315,15 +1323,24 @@ float: left; display: block; } -.moveMenusUp .rc-metacode ul, .moveMenusUp .rc-permission ul { +.moveMenusUp .rc-metacode ul, +.moveMenusUp .rc-permission ul, +.moveMenusUp .rc-siblings ul { top: auto; bottom: 0; } -.moveMenusToLeft .rc-metacode ul, .moveMenusToLeft .rc-permission ul { +.moveMenusToLeft .rc-metacode ul, +.moveMenusToLeft .rc-permission ul, +.moveMenusToLeft .rc-siblings ul { left: auto; right: 100%; } +#loadingSiblings div { + width: 15px; + margin: 0 auto; +} + /* end right click menu */ diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index cd621db5..e39b67a8 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -61,7 +61,7 @@ class TopicsController < ApplicationController @topic = Topic.find(params[:id]).authorize_to_show(@current) if not @topic - redirect_to root_url and return + redirect_to root_url, notice: "Access denied. That topic is private." and return end @alltopics = @topic.relatives.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } @@ -90,6 +90,85 @@ class TopicsController < ApplicationController end end + # GET topics/:id/relative_numbers + def relative_numbers + @current = current_user + @topic = Topic.find(params[:id]).authorize_to_show(@current) + + if not @topic + redirect_to root_url, notice: "Access denied. That topic is private." and return + end + + @topicsAlreadyHas = params[:network] ? params[:network].split(',') : [] + + @alltopics = @topic.relatives.delete_if {|t| + @topicsAlreadyHas.index(t.id.to_s) != nil || + (t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id))) + } + + @alltopics.uniq! + + @json = Hash.new() + @alltopics.each do |t| + if @json[t.metacode.id] + @json[t.metacode.id] += 1 + else + @json[t.metacode.id] = 1 + end + end + + respond_to do |format| + format.json { render json: @json } + end + end + + # GET topics/:id/relatives + def relatives + @current = current_user + @topic = Topic.find(params[:id]).authorize_to_show(@current) + + if not @topic + redirect_to root_url, notice: "Access denied. That topic is private." and return + end + + @topicsAlreadyHas = params[:network] ? params[:network].split(',') : [] + + @alltopics = @topic.relatives.delete_if {|t| + @topicsAlreadyHas.index(t.id.to_s) != nil || + (params[:metacode] && t.metacode_id.to_s != params[:metacode]) || + (t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id))) + } + + @alltopics.uniq! + + @allsynapses = @topic.synapses.delete_if {|s| + (s.topic1 == @topic && @alltopics.index(s.topic2) == nil) || + (s.topic2 == @topic && @alltopics.index(s.topic1) == nil) + } + + @creatorsAlreadyHas = params[:creators] ? params[:creators].split(',') : [] + @allcreators = [] + @alltopics.each do |t| + if @allcreators.index(t.user) == nil && @creatorsAlreadyHas.index(t.user_id.to_s) == nil + @allcreators.push(t.user) + end + end + @allsynapses.each do |s| + if @allcreators.index(s.user) == nil && @creatorsAlreadyHas.index(s.user_id.to_s) == nil + @allcreators.push(s.user) + end + end + + @json = Hash.new() + @json['topics'] = @alltopics + @json['synapses'] = @allsynapses + @json['creators'] = @allcreators + + respond_to do |format| + format.json { render json: @json } + end + end + # POST /topics # POST /topics.json def create diff --git a/config/routes.rb b/config/routes.rb index edc19576..f5ad183f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,6 +22,8 @@ Metamaps::Application.routes.draw do get :autocomplete_topic, :on => :collection end match 'topics/:id/network', to: 'topics#network', via: :get, as: :network + match 'topics/:id/relative_numbers', to: 'topics#relative_numbers', via: :get, as: :relative_numbers + match 'topics/:id/relatives', to: 'topics#relatives', via: :get, as: :relatives match 'explore/active', to: 'maps#index', via: :get, as: :activemaps match 'explore/featured', to: 'maps#index', via: :get, as: :featuredmaps From f1135854a0633e36a72356f61c74c728895da1b3 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 11 Nov 2014 07:23:44 -0500 Subject: [PATCH 14/16] fix for when mappings are corrupt --- app/controllers/maps_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index 5a07d405..58f778d9 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -89,7 +89,7 @@ class MapsController < ApplicationController elsif m.category == "Topic" object = m.topic end - object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id)) + !object || (object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id))) } respond_with(@allmappers, @allmappings, @allsynapses, @alltopics, @map) @@ -117,7 +117,7 @@ class MapsController < ApplicationController elsif m.category == "Topic" object = m.topic end - object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id)) + !object || (object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id))) } @json = Hash.new() From 5175028ec1c80fdad988506ca41b092954f6edf1 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 11 Nov 2014 07:51:02 -0500 Subject: [PATCH 15/16] added image for 'center topic' and 'get siblings' --- app/assets/images/context_topicview_sprite.png | Bin 0 -> 1997 bytes app/assets/stylesheets/application.css | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 app/assets/images/context_topicview_sprite.png diff --git a/app/assets/images/context_topicview_sprite.png b/app/assets/images/context_topicview_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..c611d3926c0bf604ec0e28bdfaf4a6ea82f4aef4 GIT binary patch literal 1997 zcmV;;2Qv7HP)|EV(<2VeaJb6EF2TBE}bl^<#zTOIAR}i~`Bo)|KL7WPbyeDIKuZZq zNq#G6gTE+>1=LsfzzoP8=1l9lAAdtFIM?(9w0zAUYu(q^*8~3d_xDEKLJ&$4er-zy z-8_W9r`()?F<`53lSa@82Bq)%?55hcWj-gvesAZ>#zEFeT2?!Im!Edik ze>rdTr;i6RGBPqUdd~~J2miZ8>Nax!Ei6RpwZ*!~4Sws$-A3v*_-)-n8xQ!PWhFRf z=Mh&}LNELSX8Eqb7uhjCu!A~P;%Z#;+ZK)T!!?#arodmI{UnIGLM))p3hvRO=EqSN zF@!{ZDxg_{*SQ6)OGc0q>d&E-{!j@2!Eal4YXwyC+q!dGSIf`B2i-@36A}bfV~|kS z`R`w$+#f;snjb#5HlwkY|B5We1Y+cEUoB7ZyJ6O65BxL>nI^n=cRREflS`5LdaWNN^j?-bpU0oOK>g3IdB7Ad9Tb1&7f{c_(dkh4?{-9 z4|PfYlgLfi5X`S&k&0oCg8r1Quld~~#kdl4NViA%2TUfyt&)EWf>lswpQu31&y9Jw z#`2#CKXL=hcg!AN8GZWkTk~gRWMpJy{2p*i{P@T&_V`#4nG@b^4R}0;65tDc@W+%m zNfg#U%i4l_yN2)F|C=6!P3D(E${{#YS4941kI2J)6I!9w{CMAlwg<)#sQ6a7gH{-s z!zYWomMz{3|9}bLA5C*B*$9G>P|>%PcmN`-B>q_3P!L0A9SGxE;53-1u3Mjj5N{8H ztb`%c;J3r$)Lv8Z+qx^R2ZoWc7@EpC(Y5a0KNWMT!4Iw5ia%6fM@&d>%KY^ujMb~) z-lY&f`*gX;Z|jl#RQy~pE%j&)pPW1LGn7u5XopT@C?)ZSLq}sqeZG=|&swxGp=$n^ z3FXWv?$#}sxGIMj<$JJHegs5mspu_6;FtZpXP3D1s}Y-d5`i`E*8wJ{u;EL&N8~V+S<&;bj>te~JPn5w+pX8(jnZ20uh@EPu+Dvwc9a z?%ANU;@9@TMA5>}9maoaeysvm!u4%OE7Y35kArY4bG$7HHGi8;e|Q{H8H&nuJc{UE z3`X(0SlB%T(HupT7P5DuHF`T?M;uR2KEW63frV+N`+5@|4!2cZh3Do#6|Ahiwmik( z_Uz<9IfC9Sd}zUwoM(waY}z#Wtw8ZzOo#WDIJUtfy`Ke203#V>U^ zerd2H@~=v}Mhb}s;Dqdi$j`k%M!OD3=(-Mw{IPXlptRH5U`*};i_>)-XwA Date: Tue, 11 Nov 2014 12:28:24 -0800 Subject: [PATCH 16/16] added open data icons --- app/assets/images/.DS_Store | Bin 6148 -> 8196 bytes app/assets/images/icons/Open Data/OD_API.png | Bin 0 -> 3153 bytes .../icons/Open Data/OD_Business Data.png | Bin 0 -> 3337 bytes .../icons/Open Data/OD_Cloud-hosted Data.png | Bin 0 -> 3718 bytes .../Open Data/OD_Creative Commons Data.png | Bin 0 -> 3708 bytes .../icons/Open Data/OD_Data Analyst.png | Bin 0 -> 3529 bytes .../images/icons/Open Data/OD_Data Mining.png | Bin 0 -> 3438 bytes .../icons/Open Data/OD_Data Scientist.png | Bin 0 -> 3532 bytes app/assets/images/icons/Open Data/OD_Data.png | Bin 0 -> 3759 bytes .../images/icons/Open Data/OD_Database.png | Bin 0 -> 3548 bytes .../images/icons/Open Data/OD_Geolocation.png | Bin 0 -> 3158 bytes .../icons/Open Data/OD_Government Data.png | Bin 0 -> 2940 bytes .../images/icons/Open Data/OD_Hacker.png | Bin 0 -> 3388 bytes .../images/icons/Open Data/OD_Map Data.png | Bin 0 -> 3419 bytes .../images/icons/Open Data/OD_Mapper.png | Bin 0 -> 3321 bytes .../images/icons/Open Data/OD_Metadata.png | Bin 0 -> 3297 bytes .../images/icons/Open Data/OD_Open Data.png | Bin 0 -> 3335 bytes .../icons/Open Data/OD_Open Innovation.png | Bin 0 -> 3530 bytes .../images/icons/Open Data/OD_Startup.png | Bin 0 -> 3734 bytes .../images/icons/Open Data/OD_algorithm.png | Bin 0 -> 2976 bytes 20 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/icons/Open Data/OD_API.png create mode 100644 app/assets/images/icons/Open Data/OD_Business Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Cloud-hosted Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Creative Commons Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Data Analyst.png create mode 100644 app/assets/images/icons/Open Data/OD_Data Mining.png create mode 100644 app/assets/images/icons/Open Data/OD_Data Scientist.png create mode 100644 app/assets/images/icons/Open Data/OD_Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Database.png create mode 100644 app/assets/images/icons/Open Data/OD_Geolocation.png create mode 100644 app/assets/images/icons/Open Data/OD_Government Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Hacker.png create mode 100644 app/assets/images/icons/Open Data/OD_Map Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Mapper.png create mode 100644 app/assets/images/icons/Open Data/OD_Metadata.png create mode 100644 app/assets/images/icons/Open Data/OD_Open Data.png create mode 100644 app/assets/images/icons/Open Data/OD_Open Innovation.png create mode 100644 app/assets/images/icons/Open Data/OD_Startup.png create mode 100644 app/assets/images/icons/Open Data/OD_algorithm.png diff --git a/app/assets/images/.DS_Store b/app/assets/images/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..94ce050f47b2e39a78a6dd0a4fbb8bc6454667e2 100644 GIT binary patch literal 8196 zcmeHMTWl3Y7@qI+!Y=HQDJ{^JLXI|=iY2tAv_OcSUbtD1N=q+LJ>7G5g_Z4YJ-cnu zrdp#5cRNY)YQ0hvh&T( z{Qu1Cmv8sqe-C2}%|k{lW2KBSg${vy0aX_$Vq6?EN-XRtAO!g{=A}ox!L;qBXV^v^ z5d#qe5d#qe5d#qebAthj*`g@3#C`1OH0~#PcCRhrncr;}U~M2US4|K$uV6 zL7_I~0fA2<#AJx$5(8J7Q)UkcT@j`jknS{|5axu*5XU7-cLwRs5Uz|cLqV`Q`6U8# zhNQ%(ju?m-n8|?1-3yq-GR$Spl>Gf%deF8!zozC4VtM%mh4U13{sQsiMf0!kIN*+S z__{yjHS5`Z!I@>4>9F0d`v-FEPS>^1xAk>V7t`>Cg&dG@*IUpV=JqygchgcVPt<-@6*7+%Is(^Uxb zNmSY1aJ&4}5j&Qn>Z?gqY4J<8Y~5C(U6bOA#MXBW`j+c>U1ruJO!0*takxF>I^m_I zcu_{TGefrSn@zUeVclwa-5J*&8gM*eoyoek-R^ppn5MVKHxK#3X2wv@UeC??ErDZ- z^C8dNZPJ|9u-Qs8dp#B{DI7Ue<>@L+BeO_(>$dGnw6-}crsL z98cg$9L39c1+U^5-o`t47pL$UPUFjIlHD;)vft8qAqA=drnCLboD!w5KPGg_gAhnpCgF}!R pBnTAa1`@77th%xAJM(0I8AV3M$)+;eJWLRCKt?lcj^~-f3;-`E4{!hg diff --git a/app/assets/images/icons/Open Data/OD_API.png b/app/assets/images/icons/Open Data/OD_API.png new file mode 100644 index 0000000000000000000000000000000000000000..c84c0f11c26996d98a621e8ebce1629e5dfcb517 GIT binary patch literal 3153 zcmV-X46gHuP)|I@K9mN%%>p0l4lh`4|PEZQDC=ZbU#Sn?seIT}>YE&U&RDoKgR-wp!YDw}` zA&?Lir~;`XX~j#UHW8Jms8Ab6m7r1*J3KTIRl{v5RU;wW0gJ?T)A%PQHVHrTjc0D= zj%Ro0Z|`0wd!&`GeSLT5p6{IVopWYqmXKU>$t9Oua>*r^T&_u>RtMJ8)6+_SbkL)V z9$V=les4|q=p;Q#^cbPXS$YiO_v6QpPv#()DZZEf*v=K-5%}~a4#)`#$l)A>O2tFj zyXnzuVCA6%UI8HXQ$R{LEC^KjySVaWExvwrJ6Yb+MjF3%H>qoACJpQEh&}K8#1Q#n zewNIA{64udHBPQhkC}J~z&LcnfWVdi96dHgDSZW1c+=)@u%A%8j{uO%6p&9pJjH&- zfC3JAJ_|4kRa8FW{6U@aq3Gt#ouuX7hsjNCcceOw&&G$y)afH+_QR75pa?LYpkNGM zHz4pV=OB;yi>!XlHy>*5uSa>uVGhRRk_LfiI|o(5&06^uU`%o# z4lhX%C;(9YE;Z~x`7QVEtjTU2K?LldSBQ6QdJG9d8qGoWTY&6H@@?bz#0v?}R_ zJfAq{#M`e>&N!vZqPo)vPldn$K=FT;$rnmm+x_EUp$AHW#ZLXBpS?~iv>`-Y82F9q z6(H?LLf00BzyJ)$@gJE^+qd@w$#_)d>qvgpT@SEO7s@-3Nsa$?AN#5BM0ZFa3TXj= z9KU_%v)&51Iz7%5Kl8!SsFZS1y4$jCXD~2u&9VL$SdEbu5QQ`VSas)vH2&}LRz64) z%6E~_U`)KdPaR7zAPSxUK=JR%9N-Ipsq#hmnfdpz*wzF9z?c9?{pz;RK!79e@g-|t z5Z;rsARhokC7Yytgt;}HkF#EqVbMk8@qxsBz|a7JHu*i7fS}d^P|k+OeqntcG}H~(1>H&ku!+4PmG63PfPvK3=G=m; zKcPSwl5V{Oc`7zH!Q5-}@}HP~WVkzNMX=4@$;0qppj;V|;U? z?~~<}@bS4s#Wk;?$IYxo&ZUtaTZV^+-$>OHcsqJPZbhILaBPkRxBO6<7eHIdLsgQX zhEQ4@-L`FTTM&jtItnYjt?zeQYlVwqU`fgsxjXn?~V?5=Ev`A?p} z+D2b{%Igb<;sW%7klkDk;GrOUh3j^Q0-^WXMLMkpwebhPVnn96DYw2cZ_D#hJ}PM_ zKPpWX8I*n2)v48;GYGs#)Ow9vAGR74S{Wc@WKz2MWzmDFW@tjX2``M8&@U$usDWH= zNKkat%5~`F3EO2t_L-(c7{eD+&rvNPkPsk+#w31J0SU{;7~#FHDKx&H;`!TsLFkf8 z`4B~tuGyz)hEkv|vJ1?uxFuoI#M*2QX=}jE^orz)HnySS}7%&M+ZeSS-RM z=0O?*7+Hj_I=C*Q+aodWb;O_>1PH`tIW!<^8v5l!PCXo5V=YSgqH;(3It|h23c4J0 z2}fPB5<<5baK80BpD{WwfP$Btvj|yH00`1e3jp!m6kh0Z<%F%`1=a_oAqYumf!G#% zrsob#x;CQd>~`01RE}dIN17tE4ZHIjhnnVAuY>6!DK_c zaPhVsdyEviaQkInX4SZ&vkq@hNLr%g)4nkMLbZH1w@wtDIcGS@(yIT$EVge2Rk zPf_Th;!SJWRkb?2+B%_HTM!84;cknKKm0W-piI54u5sc2P{bi+6~^K^GiFopU00j{ zC84h^8EX_+tJN0|UR`8lV@1b5$!G)ny3+tlm^vqNyi;R&E4d7&uT4AGQUc zwuYgFUe)vv^WJ2&vxGSLgtw#78I^%puek%zHzWZ>gY6h>GOI~f5K7g~5@L%VZt<9o z6hL5H=lfsK{=e&89rzr)DsX01a^-}PiZ9feEeM!!5gZ`qg<)+`8H~wIy*dD*Ky^8n zPM5Zxa8|s)ZYf!d$^if(E`_w6AwwT4(&@~*D)SS6F&=jXnoHY#>7%vVe5-kwjbSmDDGA{f->XtEw@T93P z+&BRRTTf39KFr#%xX&_c5FpEGn6as3MFD4%F`<4z>%_HU{Eb6gv&K> z4=Jn~1P#(d7!fXyzc+2}WCdH?{Y0VqR+gSH=vy(LpvNA;3$TnVyP85!;6)XAuwvx- zN$Z@4&#r;v-HZ!~kkcFGs zie$ycyMr1QbR-vPCM!BkdPg|Pu7yhUBw0tyK|qF*<(vSn>w0am^3ztJBSm*XdPn*2oG6`Qpr@*R7&Jg8~yhZT3%_E|&_ra8P#Xq$R30x34UY zyQeCODA)M|lQq_+HyWhAaFBb$l*0LC{ zuwGp_vLRh`XKj-Ogwx4)->j$$s299s-7ax3EFj$_s%UIm*|4r?Toj3l7U3s~yoHzH zeOK}hNxD((34C|CI(G2_Yfs?bFh{)sX7#7z1&CC)?iV$H z*j7K(yl~t#6b`7}t@|Y)s`e0zG-Sy?#6kfhf1FF!AaEe^2ODJ#f)t)=?h#)Gd$(R6 zkN8r+=py;U?y?0z0s}meKlU+85EL--2cVMtQNTC$qkv|Je$RM#0k<9_Pu?wG|@gSNAhA3_scDzwobaaIGhrNj*-X%c9R35Nb@R4BBC zfK5rT^p6^7e^jU@g#=1zc1t1svC%bwCMB4zv4sesJ4v?cZepA@?uS`Ta-KWqY|flL z=iYPAJ@;eM`@&_$b>`kP@AH1&_q>;ooN~%3r<`)iDKk`Pp`Q6* z{B8z7QdDJtJeRf^E2J#-kI-XZki@t4Y#?o`Hjw779@0u*o7y@S{=S60zj1Yv+?bm1 z-p}Lx)d}+HQcnu(!tD_W*6aN<=Fy`-P%rEMgzI5Fkq~o?bN&EUcB46{f>(gZR zgL7n#9@Fo>;Q{1huAWL7j6%WyK=Kc(nBUyFnyk2e2U+oryXpI$Sl0o~_~bvY&|}yG zNCU>6q|8(yA?Cx}9B0n9j+RnM@BHR2PwLYkfN|v?FX*&mkbzNcXb>m>Fg*ul=?C*y zZh6RwxrrH!Dg$D$;Xq)v|F|6S!0fEt`VcicJ2IJ@OuaSafuS%{M<@^n8U_RkKpz93 zF0tyOW(NT9h$gFqNbB;c-+NA65k>X8Hcw440dPtTJHhm|Kll~t-1J>iXl`}RG)S$> z^J2ZrH{L~-w0Dr}7tfQ=Z_e}oT0@VWy}iBv92*lh|x@ezyLTd{te;gs-62|Wxg)dh3RtzJg#%$Prs0pK4(A_ z9GjqGTmZmMgYiDG{UVdnwRx9QFh2bI5%2o0fhfcQ0L%iyPgl%Gv?BfZQ1;y=7z!XF zJL{&10D$o?iB1?A(A~e+QG{}g{^-Nx(+~BvADAC7`Nq_wQbXWWQLeap_GNN&x=LER z*GB>aNhQ`MtO?HgPU@(iOGOhX2rr3wfD01@hVhbuAE}bPfb6%UVp(Ww1s89D*J`=4yv9;0RupcKmUXbc)v}(sbC2J{J_6N zyZg1hf3Q+>m&~_4H^4w>8@7Z3kjMY{gzTt$!}%hK4d*;T^krwJ>Os~__vC>QEW-D*; zKefY0Q2#I#t0u_#0GJcT5hrE0lhnG4)IUh)3}u!IApt-%G{(bGL?-JVe%8ngrOABT zuoqw~XQnFXeB;mmM2yZxCuKlez9}k5Yl_;;?qh@K; zsV2x;04Z5}{~@c=LY!G`oSNZRpHf6i6{-!rPBlT+f*z^`ItTW@7k^5o-+5K6J}M=D z_4j{9mX$WgQdzap3Z^!bLN82b zU-9D+mEgxC3`~Rh5Q5tEhkc!P7+O~U`4TJhL;_)#SfsN_qPVkDsHz}|hbc22v$n*u3dkqR=_)TOj*X@&YRyL zauLeH=|bE5Y`)8ev}M$63m}xEXhNUNKvx85!{O6x<=JU~BxdIL9R7}^Xntz44n$~9 z3zc3lK+bBV+KzE1Y)fscdS!tw>xz0oAZ!w)Bo2bTg~W3(R9Yd@#L&}PX@-fx!8@<{ zeQuZ_6#%?!;_805ND5O5fgXvZ3D_49ccuz3h=SrFu&`>frPM6Mtc zfJmwoZbI|*f?NH{Ic6QR6`TE1)Ydw|9km6a!r#n}XGg*y@j7N_3WO;$6K)KG=?RlD zMQ`{@pTR(pG&JF~EeNMICrp)Q6#hV@H11ccNUHc&qMM@(IlQ2?WWjVQw9(opjF>pX zq)ky!iwqc$c1SG?g5M5LUl7>LxJs6s-i+ZIrUOh?!qMAE6vte5f-I=HDRa~I3zEqk ziVDK%tf)DzZ`!RF=CcWy%*dKBSTAAel?K8}cUtE2T0M^{K|B5fL0~%(Pb@Iv-|4A& zSfX$R1=i22nw|4b(T_8V{7mr`QcUOUx|BYYp<752Je8|_n0K^Pkwo1;K1C9HJ= zj6ny6iirRK-DiGVRIymTJr(Eh>*m0{jH_?IYy|?YgLU}bd&U~TK&(f%*%9}%F4Vzg!63zZ{g$b8nbIg`o$GU|%i;qRh1cAb>fo1_MU$8FWD_ zrYwFbRo<|VVekLIcyW(2z7KP7?fk30KzPFsfB5S~Lr(zyN5jAKG)fnxp{Wd#54&&D z@CG2UXImi5Jqk5|%67^NN*RxECk^RbzHysz&rkc>jihta_pF>ZCaVC5xl8AjQp~4M z;&V1m7v`(YuxAx(L?k6<$Mkp*79$KlqYRw_2*>3gAGZ0*WTXM46CHP=ZC6d-QcWH+ z8Ej(HCXeeQjFn8Q)zB&H8F(0;K{Wy<$?I8#RGRn)l?1~1`OPG%wX@Xb5#c!skaB1d zu7$aFFkvzPkkU(keTIBOwMmzg;JTRA#6#*Z09;sH1+X6ZA9V&EqNP(r*h~_24xZm$ zHt`zbI38#NkE-I{o2Hq6hs^k1+u!VBBxi|*txjj6`t4=o8YE7L!RG*8kXeheH%)Vm z$Rjy3J)D-0>{0Dy6T#rScY*+mvNuhm0Zs;(yByQJ2ng6*Om&IcDIH}%t&6>B4Kb$K z4+z-mp6~2;vN0S?xJ)x#ld7hxF>bgf0Fbl{jNg;Ff#rTc@Vx`B_6Z~Mne@uy6HcA3 zDiKqdLg&v=i0dI1i=rl%=1I%}@URI!x*u7ti)ZurL|CyrV<+y%xg2Jhb)A!hndq_{ zTooq;1Omtdei_GglX$Sv0L!e4F2hCFBx;pJ6%zB~zLI*xm+~P;A{dJCG>J(*nin+5 z;Sr_*js1u(35+rWqogihY@ufAo>)fg$XR*qhLSeqh14H#75!ui1gZFUkZ7K{3GLt$ zC-E9J%;a0E&;m2788#xAo&!lgp*Gd0&@wRgk$`6`0~BlyY6?2M$rhpapbxQ~G`Kzyd5IHn2Hf zz9B(SL{)tZkgqczQX;`mEFWdH9lYY6_-NV>zRoG9oN~%3r<`)iDW?XaF9a9>Mk|I@K99I>dwOxB{$Fb8Sc4E1$9grHSMRl78nm$k`X{CUwx_N-2B1-aLgam3F z6$wg_(nuf>5~^De5>zxUNU7)p*j1&rB0nY%n3n`YKx(8Y*@`r+9g3Ya{%d03es}L( zpEMj2(4QAQbMR5g@atv`I{&YgYq`|;z)$1)I- zXL7gr)2p@z#nz@i+YkVm5!>IyHi1omRLDRGW;&P*>F!s5yA!@eL4h+W02#?Za5Mig z#rVBtye&ovfOw@E)L5>9QV*u@50d!$_AO4s#w|`=Yr9h~{?;}$m;PU)KL2-d*7XdWi>ZJUR&-(uXBjk_(WB3yRf@1!lVt$+Hn7XwcPV=Ylms|d}&&0kb0Gj{T z8D~Lkv*-RI0jf4Ia%BVnl7G-7`I_;q+xo@l_EdidM#e|~JSMiI5+DyS4wTbw>dV7e+8i@muOACM&;q|QFF;MmD$3{I(j{ZQ#8fgKMOACOF zy9X=AI0R-;C$s0qR~T7%W=%ph;x~p7kjrlk$=D(dAaXGQfD!&{wE%GA>XbC9Olpl3 z#a0=BKwx)oTw`4u(+z!-M!=N>0DAkqBTqZm|8vpm`2Q_kcV^F?l)%{nf#Y!e$Cpbs z0zBA#;lhPqRs@8eo}O1}6kKTlF1_~53e^M0VC_Ahm+o=C^G>I(`BoW_0f5rEf}uFC zsb`xt5DOR2NH7#_61->=K)hX6b)+KU=jp?Ce(6UQGr|{t`;^Or!SC77H(-p&!Egj* z2+SyT2rtfdMBo|#oq0`rqDI!a2mrY302tr(0M_5yWyd&i zk6NML=9VMtJoqBi((h6QL8YSyX(|Hg=cJ_ny;r~O%)WEdrL#RH@$z};sVvP+m;Sf* zo-a6Swtmj~p83wLF11usS0Bn-;y?lfA*6p2Kor6}dre4h=pc3RkPAu*0E3P#`Sp5( z%HZcw3Y!>&N`v%kLR^8s464eOkdS1m?{I1(K_L8Hhh#-JJp8T1)X)dNKj>MyS@O0RX630v338Ag)d5qhGuNGpHb% zI?#Z@hc=}%JW7Z1d)WL_-qJ=zAqHx+YXLg95)?(nY0uB3O+ta7 zvZdWYAj~o8g$lBlvMnxe2E(1l4V5NRzzH=P2=&Gp3B5L+3mpYuYS@%^>wS;9zQeYJ z$=#$)R7Kj33Lfk&=LW?BPs}O z%aLijui;A4@Ap!9e)qs+kbKB%&Yc^#ayi4MYpD7r*YA$6j(kQ!Lr51c4GQa3>GElq zcmXbV3~Gy=z^nBMpb$X@Wj)i<*ILr%)hry_su&L};i37B_U2FBA3BJHeVn%Rkm}+x z!!}~o^U9DIOQI=Yp$i~9<1*&A2-^@O5PFslRi|EYjkY^!3t62SI zex9U=A$inbL%(8pL%M>_J^#~3T=&}Y^cyAcA;FrV02!?>I3J^vOD?jtNR@Ck1Y4u; zp$$Ba!Ee@f2taM>e>OER>TGplR05N^$26~UO>vvWP!nEpKhy$FjY^<3)2QkSb^?m6 zlr*meFpwR-ecg!^(qJkI2m?sWGQ0*2v-pej%y$V0ybe!M0TJ6*Y)C^D(4b%AnK>+h{ zZ5{*BXKj|<+q;a}fz(0Zsn@8r+j0`MBgKqw$BGJwuA^M}z7*&g`R?Y1M8UUbX7D>Z_jT5qJ+q4!xw zDyd<4k zs7ojy;%@P3Ss4Jr$LzsKED+Re#2ISjGV&+Z0#vY>@oy6`k1T_5)HXQzM3SLt*lJ3x z4G6EeZ*t6-mcY$r)#@L|O2#w}(e{~Q@9IlcubK=(`a&WgDEF#B-A|M2rWb3{y1aGU zqp=<+Pl_^lIPEC`fVguI(xNM;UUxY)wyP4`)|d}DYE~kc49V1?KVk-AGE=gkw-3XwWLl=w+ zvk;E$rT1BIj`)Kk+uh_m2+LTA;~GLY0xDGkhWV3Av*7DMj09lm@ODi1q7W9 zpEU->jSg)dD5#hphh*`_ z5T#Sb=q^ERWNnI6HVp<)Lo8W06lE3qC^hDNG>S$;)oN%2NSg4>tevtDWfVjLL9OSr zk4hYtt*mzYkhC|%OP@}Rb+sdPTPU?OOr-)|NHtN^Lcc8l+z!Nf8Ajxm7qxbDDLDn* zXtM@HxkwlKwI@f*jZGm6_9jEj)GxfD=VA#=%xB%-@Qq^wJNn`nrZv{&0vJnTrayeiHl$* zlb)U)tPA>Or??=Wl%l!9X}LO>&BB1y>V{&@1MBWfe8KYCq%K5&*sVtdmf5*>_M}`j zv7rJ}s^Sm=vB}XN@R)2Pz(8VY zko)dfDJIF~+mh7%avt`nQB&Y~D6Sh?5fBs*ST*dh!={kJZA3b|THdYW^J1fdiiF3~ zyni`f@nw9;5e37rVpdrsUzSZzz3!FJ8&V@+b-&_^fzhYH=r*Mo&~}cIk@jo9^a6=K zog-s$(-2h)0s&*MHh)@0GjpBHq)$ literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Creative Commons Data.png b/app/assets/images/icons/Open Data/OD_Creative Commons Data.png new file mode 100644 index 0000000000000000000000000000000000000000..29f428fb4ad470b5f7d8bc25f49dc5227baf97e2 GIT binary patch literal 3708 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 DxFeIJ literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Data Mining.png b/app/assets/images/icons/Open Data/OD_Data Mining.png new file mode 100644 index 0000000000000000000000000000000000000000..dd192bee698a773f11576ef767600e015e3e783c GIT binary patch literal 3438 zcmV-!4UzJRP)|I@K6~`5xTZ4VUU>m5-k09ZqJRl`0PVy30YGV_s(kd$ErAi~UGOfr<(}X-# zsiH=e8bys%6jJ%s`1|C^lj9i(W{U5m9}fkJZ*|;!e*nlS3dpexgmT40 z*-z1{(_oal5?BR*I79*I|IC6wmERR8UpwNLHLNGg8(TO}J;*+x_#^^ArYImc&YfnT z8c@I?KS>*mT*}IapFgZpJ``PlR~u=({~M&XWt-Q2+#EemCeFM;CeQUTfI`67N5LrG zHXsC1&f&o4SB&~KUwn+LzWd=taf#R7J3+3zeKgEEjs;+hFKG~hXy>p@xQng)7+{PC zKpb0=AW#6H{4Uw;K>3aL@2Se%Wa3N@14H4aj!+=>Eg293_tPs!J@u4mn|D8*m}q?q z02q7g7nCzjtD>k5*X}9j0RSleb&-6b^mQGNSB>k5mUXHxN{(K4gi4S-w`>$H2_@s z6aVT7ORg%wKpz0evW6DlK!79eOG4H)Njp_26#D4Lb{_yh;p6{&jg0>JMKU#XhJ1Q! z*62QbZ|34z2Hf1$QBp_w$dzRv!b6)k$4VT5LAZNxaPT*a0z!}n?3Otoso){u?-3^I zl#hfDqkV2-G}J<%EZ1NFi0R=0)@C3Z=wRGRf#^xq9R->2>tYnN>62jn#y;{Hzxe> zLHBn>w=_gSD0l%Om=Qb7|6bRz->4c2v%gLs-h?!v0N1g78ekv-yWHC?{?k6w8M>UU z6`+%M?0?C)w6NI9S98Mg$OMps0XG$8@gH=5PkdHmYp9871zihP@OUUmLir;-&$H35 zdq60EL+7(>w546%#_us6*zt9eTUN^=9aTPp{)2e0zWXNoe>^k3uWU2FN+jtf8o*qj zB;D`K5-14o@Q6rf1u#jNrtaZ=)^~iDMi3@%{`N0TtpN+p?u#4{F$#30kQC;r^NnGG z`#|I%-D;cIVKaVh^ZnCJJW0u!@)-qb4RojHAHzOARbCvko18&(v|{tU)=>{eC_=#- z=laMj>NkQyFhZ9%%&$$tstsFynVT4ibfZxvjmuO=!u`pMcR0HOs0!G6H=ipdq{v=+q{j`1OQJB50u=IO4-9N|A1`%&acW`;N@a> zsPe_!#bzKtSJ&PfsnB6;5QO~!OjcUdRk)vI*)UO=yFyRPP&Ti@sJz0yug%#ER!o1qg7@4n?e-B zO4T%^L>XEJ2j9niQoWyn4A;k9+SVstW&LnjEacV?oe7B>bXl~qgdHWuZ**VRnJ2K8 zG6lg48M0Qh+*8RV*RacF;oqRfsJ*`l&s0}!IKJ8h$*CfVou6qF2PlMbuWUXv24 z>ml(y`VErR-Rnyvoo%%Rp;a6)J_XsdteA!vi-vVdRfU;R!GSB6WWou?mJqc?DXAdD ztjs(gbka6lo}AxIN6c-w5J_iENy`@A1eSe0M>qW{BVjuxN;iD0N zieaz8KDN}PdO(nrB92^EVm{Lo>5j@n+kqgoJ)m@_w^HB)W49HNsFAcdK_^k=V-sLy zcWT>asvyK6KHsuRif(M86Pa^Xq!8^Tc1K9DsWqh55!8W1cfyFXZJ}Ik7;|wjlJUNz8JI zVt%fn+a^0*a9e#xD3T|vZxUYOZI4_kqF#3mIeo~uZV^Uu=ukG3uNx?wT))M;VFfR>4 zgKI%tubQI72*(8yM;46Gb}l&6Xex%w1Q6T>`Vd85`mI0+5;ok-%CJ~xnFa{F=2P2J z2qk8|&M1la1mZ?{c&$Bu&m>PMYS8r_EhX88Wiln}%QZ>5Dke?VPKmsbcHs*?9}93n z%BJ-mfQIjbxJ@=Qx&{I|lK9|MqOt{cBT|ssc#y-;=qAanr& zbR_A{N$u#690o2mak0!@ZWF)7ef~1CP{{{VEFvcA7Q&=OalfEgdA}p5)+qFqEv$R z<3xneiA2bUOzv~OaZqszibSxx$|m4#1r{cbI-7${xP|f+d?s6_blau8Zybaa3WW(0 zY#3n^F8O+r-?+W(J1m*YkTp8!zyX zP~i3V|IXH;)>$NDG6>6q;}l}I!`$VM*b2Td1M?3$_lb6Hjtz?cw3iOpA#Wg{aS8-#Nz4yHxlmr%Xh!D&lJ3BdTa#BxhkdNr z@&zNlumu6Xk9yR{$A29fD1h&pg9A;X1_t^){*Twn@&alFKa1rSEqM{9*3R7$rXlN^ z3)&hFUktEn8g_>Bc=c7uJMl7qep$u}RR0B?Q(mO|1dW{?U?;zjT(3 z_$Z=<#jxqcgybE^5==>V{Ubj#u1~R@KW{uQThq5}4kffcehs@3apV{Y%G_`%AYoI# zoRqvxKyX32VRGqD&&mBh64wnS1|a~VhXR3+bp!XexJ>69l90C!1ec_%F7_Rim*XHa z{+e|?%z?Y@Ai|NHJW-32IPtw~y7Q3uQD=N3dKl?OZ3yS9wQVP-LXPC@NTR^1Je=0# zh#qM_SZOr7B3(lOs^f549S}*6X@*sp9!RSbu6)~mEQw>9bwDINuw1u%B}!ZzX0@aa zESG?Aesq7F13+Mb>)Q7xKKpb@9^Eeh;q4_BI`RfjVDVVe*|8=65(^0oZ?ALVN9yo7 zW>+uCxNTnNA_0-T*l4jq5ZqJMz2b|nOTF!1@g;%LPO_KXEiMQG7~qNQwU3Jlf&@nP z0@P|C#q3qURVLX>v8xXd@%8X`1{`wRy&gW3OftzNlT0$nB$G_4O#Uyx0R7>Dh#Fx4 QcmMzZ07*qoM6N<$f=wY$)Bpeg literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Data Scientist.png b/app/assets/images/icons/Open Data/OD_Data Scientist.png new file mode 100644 index 0000000000000000000000000000000000000000..71e71194967a9d42919cd1e6dcbb40324bd76836 GIT binary patch literal 3532 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Mapper.png b/app/assets/images/icons/Open Data/OD_Mapper.png new file mode 100644 index 0000000000000000000000000000000000000000..028d36e3ed06d507cbab0f79552492a23235142c GIT binary patch literal 3321 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 DNkS$9 literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Metadata.png b/app/assets/images/icons/Open Data/OD_Metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab2065a8ca5b4041e7317c9654141c2646cad37 GIT binary patch literal 3297 zcmV<73?B1|P)|K9oRo5Lq&qNdJkEB);9kxqKVZz#(DQtCr%%`>BhBPUor4w3pkiqEIDU6kN zWwWDFwtqAm+hAeScF@t%VV?}zf-~s~vru%ebAuLIeXeP1lBzFieobR{KIfhDJUKb{ z-gD1A_r4pwU%0#&U+$03=lk>A?>UE%OftzNlT0$nB$G_8Np3dZ{KkzN^YXus968dT zk>DQWHu}-QkM;c5dBZ;!guFqIA`VJYDI>uQ_%8a<$-!=OeEJe6r$7mLB_m;`TiHer z5YU{^Wy|yc5zp1yjpb?xd@~3AXF(c2ujO{qu~;X!q3Ae$(4~IGD$zh?*lC4X^=t*Dc=wzPy%+-j~{wzef{EAvfz%pN#m_|k@@rx zK-&rk8vpPFnV`q$`)`pe7Y6;TqlXf)`?@88`}@5*%?HqnzPO1V_b?5QQ(zev|MNF` z9A*T0SjMiT;zlkZ@B#XMU1kHoo7QwP@M|F;W8`?j%Vi-}?1($7$|XR+cCP)+D)>wD z-OS~rLEx%B?eEo*QRY^0VAheq124eeuDYFDHhi~cnr~tmXZwDyb5jR68Rc0)0(U$W{jS1i%V(0yo$E)dyIycXjN% z_Iq$8W7Lfx^_+0K1yzCTTA9GS;@#pJiy=hk#XUjSIK8nmq`On7;MSFbAp7+=LW>D zmgAr#6cTkuyb|6oXF;EP@LB613{8d4_ZeI>b}b+hLlK%hf0`9Ft?gu1WOL6T_2ZYG zP_w2THkEbGk^s1$e~LJOhgkW@udUKhm*Cq3^C)EC`~%PbK&~SY7rq>}n5(mNL;K}w zxMj=Zq;bU;LZ9bsUoScL<^ivfOy*vM+i9>ESp}$Y9gFVVRC(VpJado^t_hZN>D@OO z8DY;qcgd|}^u52!@u7{nr59r*fe%OTmi;5N)J8_$ep&0k@o+1?^>cP!`1`0Llfhp0 zc*G2lUQYve7{UE1@nIEJ(sw8k?;78q#WU?yha=(`h8Uu$;Dlvb>gSrq9iCH&rXbxL zN=Yn&aWx%} zd7G?FCPfpp5!r~BK-({m4EYvmxDHZFfG~2bFoQ@Dy!`~%LH1%&Na9+EQ#yr#E5!fZ z*8PV7MY>0QJqqmlU1UdHvPPMX0eNK-t({Mi6%Rg3<~9Wb!!nO`TUkYJdTn_a1=lgH z*8NA%H-LT$qgtH~J8Kenan>v|9km9)3lg}JFajVkIt!5I`@B6vyn^PheE3(P z-?E`wZ?N!;@0gPr3DYoY<`_nDN9*MWbkUe4h_Dfm0qusRp`eqs6Pg^Qc0pWmA;1V& zN%sZ}Uy0(5x@4c37J-(l?hN;rmQD@@t1fGI#9!L9$qyc-v=8#>A`3}E;0`B!Dsd50 z=373qf>j&G(#jomsF{YX%%yH*5%uX!YwlyIq^??qFUIeqjPsi$45}MbW6HE)^P_gx z(O}i#l_dp{ke6@H1t`!kFP~l=>!GPFQc{yD;1am68~1sQw6lkYaZ51a?*3@R8+ z3prb>m(tznF(J;ZLlk7tNH4908yWc1W9&Qd*?zzY@V$mglIjRoFzbkH37D=Fw}^ra zAj1{u{5J?1eg7!)-%|?6(7I4TH)c^Vv$lkqh+L5A<_w77t+Rk6g0A!DB`FrT3k*M) zbYvtQbQ2+gx3!QYVnWp5U5lXWG}!)8YqoMr0CB6wFTBlF%=HK((5=By*|E7#h@KX&n9C7RLeKPzWC7Ys zfQ_Q0Jx)mA3usicB)<*@FG0`GY^u5|EjRl@CnE|rMU%xx!i=K!$N@TRSM@lX!t?~| zdQPg<(H49t%zt~o6MCZIMK};5_J)lIGSS7JSe2K5SZEc96;%N7a5& zyj1rSbV`VB37x6KkK#O-U>L_bb~?WgcNo;48r110M6+07sAUd9uWf;uh}0U;(zi-z z!JNhgY%+C_;5&;~f0NCg)MZLI7p!7p-~`pYF9o*QgtY_!Ret+rGW6G9GRxEnG#*oI z(JW@t<^#ooTb1hqY6ZUtgQ;!v7px&K+!C}KFWF6+bxr$D5xiYCZUr@viMiQftPt*4 z3C3lP4T;qfxHU{rYk(>}Bz*f=={Q?O#dHR|Sb4=Scw-K+-|Tu5OE3w#OYi+YBOpvX zsVqA6B$*nU7E8WuvnZkU@@rU1h7tiwxLe#5h*-S(8==l)8oaR{ks7@HNC*nLVs?M4 z2z`pzd31PDqYL#0QeoLUAkWh)(45QhmOmM8*1=&5p>nDAdUO$CzVYsobDzP z>z+E446GuuQ|BsBHK$P!dpu?Xp$^y;$2F7K*rnId;e^*dHJ2@)B3PDY1*ENLCNi4S|nDaf)| z_3hm`Qsm(GCxJ_?wta*}c<#9=2oc*pMh)Z$wAZ$M^ljNG(c|ej_f$&_2?`n8NWdP; zAO!<=*!&b@OF?tf#s^N2s}q$4%F&o>@Gct~|6J1Gr-B5fwh&tZwy587$t06ZGRY*9 fOfoT*{|hhxFPWEb%}mD(00000NkvXXu0mjfox3S` literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Open Data.png b/app/assets/images/icons/Open Data/OD_Open Data.png new file mode 100644 index 0000000000000000000000000000000000000000..51ad11f99c8b614fef41e72147aab65ae6f1d17c GIT binary patch literal 3335 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 R<7WT>002ovPDHLkV1nHZH^=}0 literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Open Innovation.png b/app/assets/images/icons/Open Data/OD_Open Innovation.png new file mode 100644 index 0000000000000000000000000000000000000000..d75b4aa912b0be95854458e12a061bc219fe67e0 GIT binary patch literal 3530 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 Ef|MMM_y7O^ literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_Startup.png b/app/assets/images/icons/Open Data/OD_Startup.png new file mode 100644 index 0000000000000000000000000000000000000000..538459795f0afea11e0f7ca5bbed1a751b67ea10 GIT binary patch literal 3734 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/icons/Open Data/OD_algorithm.png b/app/assets/images/icons/Open Data/OD_algorithm.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5cbee77cd38f6790ba29b7086f0dce273e4614 GIT binary patch literal 2976 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 WT`zacnr@N+0000