diff --git a/LiveSiteUpdatesNotes.txt b/LiveSiteUpdatesNotes.txt new file mode 100644 index 00000000..ad2ae9dd --- /dev/null +++ b/LiveSiteUpdatesNotes.txt @@ -0,0 +1,6 @@ +make sure that root individuals have same 'joinedwithcode' as 'code' + +User.all.each do |u| + u.generation = u.get_generation + u.save +end \ No newline at end of file diff --git a/app/assets/javascripts/src/JIT.js b/app/assets/javascripts/src/JIT.js index 498183ef..633e68dd 100644 --- a/app/assets/javascripts/src/JIT.js +++ b/app/assets/javascripts/src/JIT.js @@ -2495,7 +2495,7 @@ Extras.Classes.Navigation = new Class({ //START METAMAPS CODE var rightClick = e.button == 2 || (navigator.platform.indexOf("Mac") != -1 && e.ctrlKey); // TODO make sure this works across browsers - if (!Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || (rightClick && e.ctrlKey))) { + if (!Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) { Metamaps.Mouse.boxStartCoordinates = eventInfo.getPos(); //console.log('mouse down'); } @@ -2525,13 +2525,13 @@ Extras.Classes.Navigation = new Class({ // START METAMAPS CODE var rightClick = e.button == 2 || (navigator.platform.indexOf("Mac") != -1 && e.ctrlKey); - if (!Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || (rightClick && e.ctrlKey))) { + if (!Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) { Metamaps.Visualize.mGraph.busy = true; Metamaps.boxStartCoordinates = eventInfo.getPos(); //console.log('mouse move'); return; } - if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || (rightClick && e.ctrlKey))) { + if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) { Metamaps.Visualize.mGraph.busy = true; Metamaps.JIT.drawSelectBox(eventInfo,e); //console.log('mouse move'); diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 88436a80..4b44a9fd 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -374,14 +374,14 @@ Metamaps.JIT = { $('.rightclickmenu').remove(); if (Metamaps.Mouse.boxStartCoordinates) { - if(e.ctrlKey && e.shiftKey){ + if(e.ctrlKey){ Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); Metamaps.JIT.zoomToBox(e); //console.log('called zoom to box'); return; } - else if (e.ctrlKey || e.shiftKey) { + else if (e.shiftKey) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); Metamaps.JIT.selectWithBox(e); @@ -410,10 +410,10 @@ Metamaps.JIT = { // remove the rightclickmenu $('.rightclickmenu').remove(); - if (Metamaps.Mouse.boxStartCoordinates && e.ctrlKey) { + if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.zoomToBox(e); + Metamaps.JIT.selectWithBox(e); return; } @@ -1097,7 +1097,7 @@ Metamaps.JIT = { eX = Metamaps.Mouse.boxEndCoordinates.x, eY = Metamaps.Mouse.boxEndCoordinates.y; - if(!(e.shiftKey) && !(e.ctrlKey)){ + if(!e.shiftKey){ Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllEdges(); } @@ -1108,7 +1108,7 @@ Metamaps.JIT = { y = n.pos.y; if ((sX < x && x < eX && sY < y && y < eY) || (sX > x && x > eX && sY > y && y > eY) || (sX > x && x > eX && sY < y && y < eY) || (sX < x && x < eX && sY > y && y > eY)) { - if(e.ctrlKey){ + if(e.shiftKey){ if(n.selected){ Metamaps.Control.deselectNode(n); } @@ -1211,7 +1211,7 @@ Metamaps.JIT = { var node2id = synapse.get('edge').nodeTo.id; var edge = Metamaps.Visualize.mGraph.graph.getAdjacence(node1id, node2id); if(selectTest){ - if(e.ctrlKey){ + if(e.shiftKey){ if(Metamaps.Selected.Edges.indexOf(synapse.get('edge')) != -1 ){ Metamaps.Control.deselectEdge(synapse.get('edge')); } @@ -1273,23 +1273,19 @@ Metamaps.JIT = { // wait a certain length of time, then check again, then run this code setTimeout(function () { if (!Metamaps.JIT.nodeWasDoubleClicked()) { - if (!e.shiftKey && !e.ctrlKey) { + + var nodeAlreadySelected = node.selected; + + if (!e.shiftKey) { Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllEdges(); + } + + if (nodeAlreadySelected) { + Metamaps.Control.deselectNode(node); + } else { Metamaps.Control.selectNode(node,e); } - else if(e.shiftKey && e.ctrlKey){ - //no result - } - else if(e.ctrlKey){ - if (node.selected) { - Metamaps.Control.deselectNode(node); - } else { - Metamaps.Control.selectNode(node,e); - } - }else if(e.shiftKey){ - Metamaps.Control.selectNode(node,e); - } //trigger animation to final styles Metamaps.Visualize.mGraph.fx.animate({ @@ -1531,22 +1527,17 @@ Metamaps.JIT = { // wait a certain length of time, then check again, then run this code setTimeout(function () { if (!Metamaps.JIT.nodeWasDoubleClicked()) { - if (!e.shiftKey && !e.ctrlKey) { + + var edgeAlreadySelected = Metamaps.Selected.Edges.indexOf(adj) !== -1; + + if (!e.shiftKey) { Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllEdges(); - Metamaps.Control.selectEdge(adj); } - else if (e.shiftKey && e.ctrlKey){ - //no result - } - else if (e.ctrlKey){ - if (Metamaps.Selected.Edges.indexOf(adj) !== -1) { - Metamaps.Control.deselectEdge(adj); - } else { - Metamaps.Control.selectEdge(adj); - } - } - else if (e.shiftKey){ + + if (edgeAlreadySelected) { + Metamaps.Control.deselectEdge(adj); + } else { Metamaps.Control.selectEdge(adj); } @@ -1861,7 +1852,7 @@ Metamaps.JIT = { var x = n.pos.x, y = n.pos.y; - if (counter == 0){ + if (counter == 0 && n.getData('alpha') == 1){ maxX = x; minX = x; maxY = y; @@ -1880,12 +1871,15 @@ Metamaps.JIT = { } var width = Math.max.apply(null, lineWidths) + 8; - maxX = Math.max(x + width /2,maxX); - maxY = Math.max(y + n.getData("height") + 5 + height,maxY); - minX = Math.min(x - width /2,minX); - minY = Math.min(y - dim,minY); + // only adjust these values if the node is not filtered + if (n.getData('alpha') == 1) { + maxX = Math.max(x + width /2,maxX); + maxY = Math.max(y + n.getData("height") + 5 + height,maxY); + minX = Math.min(x - width /2,minX); + minY = Math.min(y - dim,minY); - counter++; + counter++; + } }); var spanX = maxX - minX; diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index f52f997a..d3ba78ea 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1888,13 +1888,13 @@ Metamaps.Realtime = { turnOn: function (notify) { var self = Metamaps.Realtime; - if (!self.status) { - if (notify) self.sendRealtimeOn(); - $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); - self.status = true; - $(".sidebarCollaborateIcon").addClass("blue"); - $(".collabCompass").show(); - } + if (notify) self.sendRealtimeOn(); + $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); + $('.rtOn').addClass('active'); + $('.rtOff').removeClass('active'); + self.status = true; + $(".sidebarCollaborateIcon").addClass("blue"); + $(".collabCompass").show(); }, turnOff: function (silent) { var self = Metamaps.Realtime; @@ -1902,6 +1902,8 @@ Metamaps.Realtime = { if (self.status) { if (!silent) self.sendRealtimeOff(); $(".rtMapperSelf").removeClass('littleRtOn').addClass('littleRtOff'); + $('.rtOn').removeClass('active'); + $('.rtOff').addClass('active'); self.status = false; $(".sidebarCollaborateIcon").removeClass("blue"); $(".collabCompass").hide(); @@ -3111,6 +3113,8 @@ Metamaps.Filter = { $('#filter_by_metacode ul').empty(); $('#filter_by_mapper ul').empty(); $('#filter_by_synapse ul').empty(); + + $('.filterBox .showAll').addClass('active'); }, /* Most of this data essentially depends on the ruby function which are happening for filter inside view filterBox @@ -3239,36 +3243,48 @@ Metamaps.Filter = { filterAllMetacodes: function (e) { var self = Metamaps.Filter; $('#filter_by_metacode ul li').addClass('toggledOff'); + $('.showAllMetacodes').removeClass('active'); + $('.hideAllMetacodes').addClass('active'); self.visible.metacodes = []; self.passFilters(); }, filterNoMetacodes: function (e) { var self = Metamaps.Filter; $('#filter_by_metacode ul li').removeClass('toggledOff'); + $('.showAllMetacodes').addClass('active'); + $('.hideAllMetacodes').removeClass('active'); self.visible.metacodes = self.filters.metacodes.slice(); self.passFilters(); }, filterAllMappers: function (e) { var self = Metamaps.Filter; $('#filter_by_mapper ul li').addClass('toggledOff'); + $('.showAllMappers').removeClass('active'); + $('.hideAllMappers').addClass('active'); self.visible.mappers = []; self.passFilters(); }, filterNoMappers: function (e) { var self = Metamaps.Filter; $('#filter_by_mapper ul li').removeClass('toggledOff'); + $('.showAllMappers').addClass('active'); + $('.hideAllMappers').removeClass('active'); self.visible.mappers = self.filters.mappers.slice(); self.passFilters(); }, filterAllSynapses: function (e) { var self = Metamaps.Filter; $('#filter_by_synapse ul li').addClass('toggledOff'); + $('.showAllSynapses').removeClass('active'); + $('.hideAllSynapses').addClass('active'); self.visible.synapses = []; self.passFilters(); }, filterNoSynapses: function (e) { var self = Metamaps.Filter; $('#filter_by_synapse ul li').removeClass('toggledOff'); + $('.showAllSynapses').addClass('active'); + $('.hideAllSynapses').removeClass('active'); self.visible.synapses = self.filters.synapses.slice(); self.passFilters(); }, @@ -3292,14 +3308,53 @@ Metamaps.Filter = { toggleMetacode: function () { var self = Metamaps.Filter; self.toggleLi.call(this, 'metacodes'); + + if (self.visible.metacodes.length === self.filters.metacodes.length) { + $('.showAllMetacodes').addClass('active'); + $('.hideAllMetacodes').removeClass('active'); + } + else if (self.visible.metacodes.length === 0) { + $('.showAllMetacodes').removeClass('active'); + $('.hideAllMetacodes').addClass('active'); + } + else { + $('.showAllMetacodes').removeClass('active'); + $('.hideAllMetacodes').removeClass('active'); + } }, toggleMapper: function () { var self = Metamaps.Filter; self.toggleLi.call(this, 'mappers'); + + if (self.visible.mappers.length === self.filters.mappers.length) { + $('.showAllMappers').addClass('active'); + $('.hideAllMappers').removeClass('active'); + } + else if (self.visible.mappers.length === 0) { + $('.showAllMappers').removeClass('active'); + $('.hideAllMappers').addClass('active'); + } + else { + $('.showAllMappers').removeClass('active'); + $('.hideAllMappers').removeClass('active'); + } }, toggleSynapse: function () { var self = Metamaps.Filter; self.toggleLi.call(this, 'synapses'); + + if (self.visible.synapses.length === self.filters.synapses.length) { + $('.showAllSynapses').addClass('active'); + $('.hideAllSynapses').removeClass('active'); + } + else if (self.visible.synapses.length === 0) { + $('.showAllSynapses').removeClass('active'); + $('.hideAllSynapses').addClass('active'); + } + else { + $('.showAllSynapses').removeClass('active'); + $('.hideAllSynapses').removeClass('active'); + } }, passFilters: function () { var self = Metamaps.Filter; @@ -4204,6 +4259,7 @@ Metamaps.Map = { Metamaps.Create.newTopic.hide(); Metamaps.Create.newSynapse.hide(); Metamaps.Filter.close(); + Metamaps.Map.InfoBox.close(); Metamaps.Realtime.endActiveMap(); } }, diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index bd0a5d84..893c67d3 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1007,7 +1007,7 @@ h3.filterBox { cursor: pointer; font-size:12px; } -.sidebarFilterBox span:hover { +.sidebarFilterBox span:hover, .sidebarFilterBox span.active { color: #00BCD4; } .sidebarFilterBox ul { @@ -1104,7 +1104,7 @@ h3.realtimeBoxTitle { text-align: center; font-size:12px; } -.sidebarCollaborateBox .realtimeOnOff:hover { +.sidebarCollaborateBox .realtimeOnOff:hover, .sidebarCollaborateBox .realtimeOnOff.active { color: #00bcd4; } .sidebarCollaborateBox .rtOff { diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index 43abbc63..b6522ca8 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -760,7 +760,7 @@ /* infoAndHelp */ -.mapPage .infoAndHelp, .topicPage .infoAndHelp{ +.mapPage .infoAndHelp, .topicPage .infoAndHelp { right: 70px; } .mapPage .openCheatsheet .tooltipsAbove, .topicPage .openCheatsheet .tooltipsAbove { @@ -818,6 +818,10 @@ right: 24px; } +.topicPage .zoomExtents { + display: none; +} + .mapControl { width:32px; height:32px; diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 097ecdfb..a390eb83 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -10,6 +10,7 @@ module UsersHelper user['value'] = u.name user['profile'] = u.image.url(:square) user['mapCount'] = u.maps.count + user['generation'] = u.generation user['created_at'] = u.created_at.strftime("%m/%d/%Y") user['rtype'] = "mapper" diff --git a/app/models/user.rb b/app/models/user.rb index f0c1345f..8596a771 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -28,12 +28,7 @@ class User < ActiveRecord::Base validates_uniqueness_of :name # done by devise validates_uniqueness_of :email # done by devise - if ActiveRecord::Base.connection.table_exists? 'users' - codes = ActiveRecord::Base.connection.execute("SELECT code FROM users").map {|user| user["code"] } - else - codes = [] - end - validates :joinedwithcode, :presence => true, :inclusion => { :in => codes, :message => "%{value} is not valid" }, :on => :create + validates :joinedwithcode, :presence => true, :inclusion => { :in => $codes, :message => "%{value} is not valid" }, :on => :create # This method associates the attribute ":image" with a file attachment has_attached_file :image, :styles => { @@ -54,6 +49,24 @@ class User < ActiveRecord::Base def generate_code #generate a random 8 letter/digit code that they can use to invite people self.code = rand(36**8).to_s(36) + + $codes.push(self.code) + + self.generation = self.get_generation + end + + def get_generation + if self.joinedwithcode == self.code + # if your joinedwithcode equals your code you must be GEN 0 + gen = 0 + elsif self.generation + # if your generation has already been calculated then just return that value + gen = self.generation + else + # if your generation hasn't been calculated, base it off the + # generation of the person whose code you joined with + 1 + gen = User.find_by_code(self.joinedwithcode).get_generation + 1 + end end def settings diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 81f19878..176556cc 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -149,7 +149,7 @@
Mapping since: {{created_at}}
Generation: 1
+Generation: {{generation}}