merged conflicts coming from develop branch

This commit is contained in:
Connor Turland 2014-10-22 11:52:31 -04:00
commit 13937ae51d
10 changed files with 327 additions and 130 deletions

View file

@ -72,6 +72,9 @@ now there is a couple other things we are going to need which is phantomjs, node
sudo apt-get install redis-server sudo apt-get install redis-server
Furthermore, if you want to be able to work on profile picture uploading, or use it
you'll need ImageMagick. On Ubuntu, you can just go find ImageMagick in the Ubuntu Software Centre
Install the specific version of ruby needed this will take some time Install the specific version of ruby needed this will take some time
rvm install ruby-2.1.3 rvm install ruby-2.1.3
@ -110,12 +113,19 @@ Execute the server:
rails s rails s
and dont forget to run realtime too open a new terminal and dont forget to run the two other servers, for sidekiq, and realtime...
open a new terminal
navigate to ./realtime and run navigate to ./realtime and run
sudo apt-get install npm
npm install
nodejs realtime-server.js nodejs realtime-server.js
open a new terminal
navigate to the main directory and run
sidekiq
Now you're all set enjoy your personal server of metamaps :) Now you're all set enjoy your personal server of metamaps :)
Navigate your browser to localhost:3000 once you have the server running Navigate your browser to localhost:3000 once you have the server running

View file

@ -2481,6 +2481,7 @@ Extras.Classes.Navigation = new Class({
}, },
onMouseDown: function(e, win, eventInfo) { onMouseDown: function(e, win, eventInfo) {
///console.log('mouse down!!!!');
if(!this.config.panning) return; if(!this.config.panning) return;
//START METAMAPS CODE //START METAMAPS CODE
@ -2495,8 +2496,9 @@ Extras.Classes.Navigation = new Class({
//START METAMAPS CODE //START METAMAPS CODE
var rightClick = e.button == 2 || (navigator.platform.indexOf("Mac") != -1 && e.ctrlKey); var rightClick = e.button == 2 || (navigator.platform.indexOf("Mac") != -1 && e.ctrlKey);
// TODO make sure this works across browsers // TODO make sure this works across browsers
if (!Metamaps.Mouse.boxStartCoordinates && (e.shiftKey || rightClick)) { if (!Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || (rightClick && e.ctrlKey))) {
Metamaps.Mouse.boxStartCoordinates = eventInfo.getPos(); Metamaps.Mouse.boxStartCoordinates = eventInfo.getPos();
//console.log('mouse down');
} }
Metamaps.Mouse.didPan = false; Metamaps.Mouse.didPan = false;
@ -2524,14 +2526,19 @@ Extras.Classes.Navigation = new Class({
// START METAMAPS CODE // START METAMAPS CODE
var rightClick = e.button == 2 || (navigator.platform.indexOf("Mac") != -1 && e.ctrlKey); var rightClick = e.button == 2 || (navigator.platform.indexOf("Mac") != -1 && e.ctrlKey);
if (!Metamaps.Mouse.boxStartCoordinates && (e.shiftKey || rightClick)) { if (!Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || (rightClick && e.ctrlKey))) {
Metamaps.Visualize.mGraph.busy = true; Metamaps.Visualize.mGraph.busy = true;
Metamaps.boxStartCoordinates = eventInfo.getPos(); Metamaps.boxStartCoordinates = eventInfo.getPos();
//console.log('mouse move');
return; return;
} }
if (Metamaps.Mouse.boxStartCoordinates && (e.shiftKey || rightClick)) { if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || (rightClick && e.ctrlKey))) {
Metamaps.Visualize.mGraph.busy = true; Metamaps.Visualize.mGraph.busy = true;
Metamaps.JIT.drawSelectBox(eventInfo,e); Metamaps.JIT.drawSelectBox(eventInfo,e);
//console.log('mouse move');
return;
}
if (rightClick){
return; return;
} }
if (e.target.id != 'infovis-canvas') { if (e.target.id != 'infovis-canvas') {
@ -11202,4 +11209,4 @@ $jit.ForceDirected3D.$extend = true;
})(); })();

View file

@ -301,13 +301,16 @@ Metamaps.JIT = {
enableForEdges: true, enableForEdges: true,
onMouseMove: function (node, eventInfo, e) { onMouseMove: function (node, eventInfo, e) {
Metamaps.JIT.onMouseMoveHandler(node, eventInfo, e); Metamaps.JIT.onMouseMoveHandler(node, eventInfo, e);
//console.log('called mouse move handler');
}, },
//Update node positions when dragged //Update node positions when dragged
onDragMove: function (node, eventInfo, e) { onDragMove: function (node, eventInfo, e) {
Metamaps.JIT.onDragMoveTopicHandler(node, eventInfo, e); Metamaps.JIT.onDragMoveTopicHandler(node, eventInfo, e);
//console.log('called drag move handler');
}, },
onDragEnd: function (node, eventInfo, e) { onDragEnd: function (node, eventInfo, e) {
Metamaps.JIT.onDragEndTopicHandler(node, eventInfo, e, false); Metamaps.JIT.onDragEndTopicHandler(node, eventInfo, e, false);
//console.log('called drag end handler');
}, },
onDragCancel: function (node, eventInfo, e) { onDragCancel: function (node, eventInfo, e) {
Metamaps.JIT.onDragCancelHandler(node, eventInfo, e, false); Metamaps.JIT.onDragCancelHandler(node, eventInfo, e, false);
@ -352,10 +355,20 @@ Metamaps.JIT = {
$('.rightclickmenu').remove(); $('.rightclickmenu').remove();
if (Metamaps.Mouse.boxStartCoordinates) { if (Metamaps.Mouse.boxStartCoordinates) {
Metamaps.Visualize.mGraph.busy = false; if(e.ctrlKey && e.shiftKey){
Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); Metamaps.Visualize.mGraph.busy = false;
Metamaps.JIT.zoomToBox(e); Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos();
return; Metamaps.JIT.zoomToBox(e);
//console.log('called zoom to box');
return;
}
else if (e.ctrlKey || e.shiftKey) {
Metamaps.Visualize.mGraph.busy = false;
Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos();
Metamaps.JIT.selectWithBox(e);
//console.log('called select with box');
return;
};
} }
if (e.target.id != "infovis-canvas") return false; if (e.target.id != "infovis-canvas") return false;
@ -363,10 +376,13 @@ Metamaps.JIT = {
//clicking on a edge, node, or clicking on blank part of canvas? //clicking on a edge, node, or clicking on blank part of canvas?
if (node.nodeFrom) { if (node.nodeFrom) {
Metamaps.JIT.selectEdgeOnClickHandler(node, e); Metamaps.JIT.selectEdgeOnClickHandler(node, e);
//console.log('called selectEdgeOnClickHandler');
} else if (node && !node.nodeFrom) { } else if (node && !node.nodeFrom) {
Metamaps.JIT.selectNodeOnClickHandler(node, e); Metamaps.JIT.selectNodeOnClickHandler(node, e);
//console.log('called selectNodeOnClickHandler');
} else { } else {
Metamaps.JIT.canvasClickHandler(eventInfo.getPos(), e); Metamaps.JIT.canvasClickHandler(eventInfo.getPos(), e);
//console.log('called canvasClickHandler');
} //if } //if
}, },
//Add also a click handler to nodes //Add also a click handler to nodes
@ -375,10 +391,10 @@ Metamaps.JIT = {
// remove the rightclickmenu // remove the rightclickmenu
$('.rightclickmenu').remove(); $('.rightclickmenu').remove();
if (Metamaps.Mouse.boxStartCoordinates) { if (Metamaps.Mouse.boxStartCoordinates && e.ctrlKey) {
Metamaps.Visualize.mGraph.busy = false; Metamaps.Visualize.mGraph.busy = false;
Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos();
Metamaps.JIT.selectWithBox(e); Metamaps.JIT.zoomToBox(e);
return; return;
} }
@ -390,8 +406,8 @@ Metamaps.JIT = {
} else if (node && !node.nodeFrom) { } else if (node && !node.nodeFrom) {
Metamaps.JIT.selectNodeOnRightClickHandler(node, e); Metamaps.JIT.selectNodeOnRightClickHandler(node, e);
} else { } else {
console.log('right clicked on open space'); //console.log('right clicked on open space');
} //if }
} }
}, },
//Number of iterations for the FD algorithm //Number of iterations for the FD algorithm
@ -736,7 +752,7 @@ Metamaps.JIT = {
if (node && !node.nodeFrom) { if (node && !node.nodeFrom) {
var pos = eventInfo.getPos(); var pos = eventInfo.getPos();
// if it's a left click, or a touch, move the node // if it's a left click, or a touch, move the node
if (e.touches || (e.button == 0 && !e.altKey && (e.buttons == 0 || e.buttons == 1 || e.buttons == undefined))) { if (e.touches || (e.button == 0 && !e.altKey && !e.ctrlKey && !e.shiftKey && (e.buttons == 0 || e.buttons == 1 || e.buttons == undefined))) {
//if the node dragged isn't already selected, select it //if the node dragged isn't already selected, select it
var whatToDo = self.handleSelectionBeforeDragging(node, e); var whatToDo = self.handleSelectionBeforeDragging(node, e);
if (node.pos.rho || node.pos.rho === 0) { if (node.pos.rho || node.pos.rho === 0) {
@ -949,8 +965,10 @@ Metamaps.JIT = {
tempInit = false; tempInit = false;
tempNode = null; tempNode = null;
tempNode2 = null; tempNode2 = null;
Metamaps.Control.deselectAllEdges(); if (!e.ctrlKey && !e.shiftKey) {
Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllEdges();
Metamaps.Control.deselectAllNodes();
}
} }
}, //canvasClickHandler }, //canvasClickHandler
nodeDoubleClickHandler: function (node, e) { nodeDoubleClickHandler: function (node, e) {
@ -1181,19 +1199,20 @@ Metamaps.JIT = {
if (!e.shiftKey && !e.ctrlKey) { if (!e.shiftKey && !e.ctrlKey) {
Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllNodes();
Metamaps.Control.deselectAllEdges(); Metamaps.Control.deselectAllEdges();
Metamaps.Control.selectNode(node,e);
} }
if(e.ctrlKey || e.shiftKey){ else if(e.shiftKey && e.ctrlKey){
//no result
}
else if(e.ctrlKey){
if (node.selected) { if (node.selected) {
Metamaps.Control.deselectNode(node); Metamaps.Control.deselectNode(node);
} else { } else {
Metamaps.Control.selectNode(node,e); Metamaps.Control.selectNode(node,e);
} }
} }else if(e.shiftKey){
else{
Metamaps.Control.deselectAllNodes();
Metamaps.Control.deselectAllEdges();
Metamaps.Control.selectNode(node,e); Metamaps.Control.selectNode(node,e);
} }
//trigger animation to final styles //trigger animation to final styles
Metamaps.Visualize.mGraph.fx.animate({ Metamaps.Visualize.mGraph.fx.animate({
@ -1352,15 +1371,24 @@ Metamaps.JIT = {
// wait a certain length of time, then check again, then run this code // wait a certain length of time, then check again, then run this code
setTimeout(function () { setTimeout(function () {
if (!Metamaps.JIT.nodeWasDoubleClicked()) { if (!Metamaps.JIT.nodeWasDoubleClicked()) {
if (!e.shiftKey) { if (!e.shiftKey && !e.ctrlKey) {
Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllNodes();
Metamaps.Control.deselectAllEdges(); Metamaps.Control.deselectAllEdges();
} }
if (Metamaps.Selected.Edges.indexOf(adj) !== -1) { else if (e.shiftKey && e.ctrlKey){
Metamaps.Control.deselectEdge(adj); //no result
} else { }
else if (e.ctrlKey){
if (Metamaps.Selected.Edges.indexOf(adj) !== -1) {
Metamaps.Control.deselectEdge(adj);
} else {
Metamaps.Control.selectEdge(adj);
}
}
else if (e.shiftKey){
Metamaps.Control.selectEdge(adj); Metamaps.Control.selectEdge(adj);
} }
Metamaps.Visualize.mGraph.plot(); Metamaps.Visualize.mGraph.plot();
} }
}, Metamaps.Mouse.DOUBLE_CLICK_TOLERANCE); }, Metamaps.Mouse.DOUBLE_CLICK_TOLERANCE);

View file

@ -3963,10 +3963,61 @@ Metamaps.Map.InfoBox = {
* *
*/ */
Metamaps.Account = { Metamaps.Account = {
listenersInitialized: false,
init: function () { init: function () {
var self = Metamaps.Account; var self = Metamaps.Account;
},
initListeners: function(){
var self = Metamaps.Account;
$('#user_image').change(self.showImagePreview);
self.listenersInitialized = true;
},
toggleChangePicture: function(){
var self = Metamaps.Account;
$('.userImageMenu').toggle();
if (!self.listenersInitialized) self.initListeners();
},
openChangePicture: function(){
var self = Metamaps.Account;
$('.userImageMenu').show();
if (!self.listenersInitialized) self.initListeners();
},
closeChangePicture: function(){
var self = Metamaps.Account;
$('.userImageMenu').hide();
},
showImagePreview: function(){
var self = Metamaps.Account;
var file = $('#user_image')[0].files[0];
var reader = new FileReader();
reader.onload = function(e) {
$('.userImageDiv img').attr('src', reader.result);
};
if (file) {
reader.readAsDataURL(file);
$('.userImageMenu').hide();
$('#remove_image').val('0');
}
},
removePicture: function(){
var self = Metamaps.Account;
$('.userImage img').attr('src', '/assets/user.png');
$('.userImageMenu').hide();
var input = $('#user_image');
input.replaceWith(input.val('').clone(true));
$('#remove_image').val('1');
}, },
changeName: function(){ changeName: function(){
$('.accountName').hide(); $('.accountName').hide();

View file

@ -76,73 +76,6 @@ body,
.wrapper.mapPage { .wrapper.mapPage {
overflow: hidden; overflow: hidden;
} }
/* scrollbar override */
.mCS_no_scrollbar {
padding-right: 0px !important;
}
.mCSB_container {
margin-right: 15px !important;
}
/* forgot password fix */
.forgotPassword input[type="submit"] {
width: 300px;
color: #f5f5f5;
font-family: din-regular;
top: 118px;
position: absolute;
}
.new_user input[type="submit"] {
width: 96px;
padding: 0px;
font-family: din-regular;
text-transform: uppercase;
color: #f5f5f5;
margin-top:16px;
float: right;
}
.login input[type="submit"]{
width:84px;
margin-top: 16px;
font-family: din-regular;
text-transform: uppercase;
}
.edit_user input[type="submit"]{
width: 96px;
padding: 0px;
font-family: din-regular;
text-transform: uppercase;
color: #f5f5f5;
margin-top:16px;
float: right;
}
.edit_user .userImage {
width: 84px;
margin: 0 auto;
position: relative;
margin-top: 32px;
}
.edit_user .userImage img {
border-radius: 42px;
}
.edit_user .editPhoto {
display: none;
width: 40px;
height: 40px;
background-image: url(photo.png);
position: absolute;
top: 22px;
left: 22px;
cursor: pointer;
}
.edit_user .userImage:hover .editPhoto {
display: block;
}
html { html {
@ -310,6 +243,127 @@ input[type="submit"]:active {
line-height: 18px; line-height: 18px;
} }
/* forgot password fix */
.forgotPassword input[type="submit"] {
width: 300px;
color: #f5f5f5;
font-family: din-regular;
top: 118px;
position: absolute;
}
.new_user input[type="submit"] {
width: 96px;
padding: 0px;
font-family: din-regular;
text-transform: uppercase;
color: #f5f5f5;
margin-top:16px;
float: right;
}
.login input[type="submit"]{
width:84px;
margin-top: 16px;
font-family: din-regular;
text-transform: uppercase;
}
.edit_user input[type="submit"]{
width: 96px;
padding: 0px;
font-family: din-regular;
text-transform: uppercase;
color: #f5f5f5;
margin-top:16px;
float: right;
}
.edit_user .userImage {
width: 84px;
margin: 0 auto;
position: relative;
margin-top: 32px;
cursor: pointer;
}
.edit_user .userImage img {
border-radius: 42px;
}
.edit_user .editPhoto {
display: none;
width: 40px;
height: 40px;
background-image: url(photo.png);
position: absolute;
top: 22px;
left: 22px;
}
.edit_user .userImageDiv:hover .editPhoto {
display: block;
}
.userImageMenu {
position: absolute;
top: 88px;
left: -18px;
display: none;
}
.userMenuArrow {
border-color: transparent;
border-bottom-color: #202020;
border-style: dashed dashed solid;
border-width: 0 8px 8px;
display: block;
position: absolute;
left: 52px;
top: 0px;
z-index: 1;
height: 0;
width: 0;
}
.userImageMenu ul {
background: #202020;
list-style: none;
text-align: center;
font-size: 14px;
line-height: 14px;
color: #FFFFFF;
width: 120px;
border-radius: 2px;
position: absolute;
top: 8px;
overflow: hidden;
z-index: 1;
}
.userImageMenu li {
height:14px;
padding: 5px 0;
position: relative;
}
.userImageMenu li:hover {
background-color: #757575;
}
.edit_user #user_image {
width: 120px;
height: 24px;
position: absolute;
top: 0;
left: 0;
opacity: 0;
cursor: pointer;
}
.edit_user .upload label {
width: 120px;
height: 24px;
position: absolute;
top: 0;
left: 0;
opacity: 0;
cursor: pointer;
margin: 0;
padding: 0;
}
.edit_user label.firstFieldText { .edit_user label.firstFieldText {
padding-top: 8px; padding-top: 8px;
} }
@ -2676,3 +2730,11 @@ and it won't be important on password protected instances */
-webkit-transform-origin: left center; -webkit-transform-origin: left center;
transform-origin: left center; transform-origin: left center;
} }
.blockchain-btn {
display: inline;
float: right;
}
script.data-gratipay-username {
display: inline;
float: left;
}

View file

@ -26,19 +26,18 @@ private
def require_no_user def require_no_user
if authenticated? if authenticated?
flash[:warning] = "You must be logged out." redirect_to edit_user_path(user), notice: "You must be logged out."
store and redirect_to edit_user_path(user)
return false return false
end end
end end
def require_user def require_user
unless authenticated? unless authenticated?
path = request.env["PATH_INFO"] path = request.env["PATH_INFO"]
unless path == "/" || path == new_user_registration_path || path == new_user_session_path unless path == "/" || path == new_user_registration_path || path == new_user_session_path
store_location_for(:user, path) and redirect_to root_url store_location_for(:user, path) and redirect_to root_url, notice: "You must be logged in."
return false return false
end end
end end

View file

@ -19,13 +19,49 @@ class UsersController < ApplicationController
# PUT /users/:id # PUT /users/:id
def update def update
@user = current_user @user = current_user
@user.attributes = params[:user]
@user.save
sign_in(@user, :bypass => true) if params[:user][:password] == "" && params[:user][:password_confirmation] == ""
# not trying to change the password
respond_with(@user, location: session[:previous_url]) do |format| if @user.update_attributes(params[:user])
if params[:remove_image] == "1"
@user.image = nil
end
@user.save
sign_in(@user, :bypass => true)
respond_to do |format|
format.html { redirect_to root_url, notice: "Account updated!" }
end
else
sign_in(@user, :bypass => true)
respond_to do |format|
format.html { redirect_to edit_user_path(@user), notice: @user.errors.to_a[0] }
end
end
else
# trying to change the password
correct_pass = @user.valid_password?(params[:current_password])
if correct_pass && @user.update_attributes(params[:user])
if params[:remove_image] == "1"
@user.image = nil
end
@user.save
sign_in(@user, :bypass => true)
respond_to do |format|
format.html { redirect_to root_url, notice: "Account updated!" }
end
else
respond_to do |format|
if correct_pass
u = User.find(@user.id)
sign_in(u, :bypass => true)
format.html { redirect_to edit_user_path(@user), notice: @user.errors.to_a[0] }
else
sign_in(@user, :bypass => true)
format.html { redirect_to edit_user_path(@user), notice: "Incorrect current password" }
end
end
end
end end
end end

View file

@ -15,6 +15,16 @@ class User < ActiveRecord::Base
serialize :settings, UserPreference serialize :settings, UserPreference
validates :password, :presence => true,
:length => { :within => 8..40 },
:on => :create
validates :password, :length => { :within => 8..40 },
:allow_blank => true,
:on => :update
validates_confirmation_of :password
validates_presence_of :name # done by devise
validates_presence_of :email # done by devise
validates_uniqueness_of :name # done by devise validates_uniqueness_of :name # done by devise
validates_uniqueness_of :email # done by devise validates_uniqueness_of :email # done by devise

View file

@ -6,11 +6,27 @@
<% content_for :title, @user.name + "'s Settings | Metamaps" %> <% content_for :title, @user.name + "'s Settings | Metamaps" %>
<div id="yield"> <div id="yield">
<%= form_for @user, url: user_url, :html =>{ :class => "edit_user centerGreyForm"} do |form| %> <%= form_for @user, url: user_url, :html =>{ :multipart => true, :class => "edit_user centerGreyForm"} do |form| %>
<h3>Edit Account</h3> <h3>Edit Account</h3>
<div class="userImage"> <div class="userImage">
<%= image_tag @user.image.url(:round), :size => "84x84" %> <div class="userImageDiv" onclick="Metamaps.Account.toggleChangePicture()">
<div class="editPhoto"></div> <%= image_tag @user.image.url(:round), :size => "84x84" %>
<div class="editPhoto"></div>
</div>
<div class="userImageMenu">
<div class="userMenuArrow"></div>
<ul>
<li class="upload">
Upload Photo
<%= hidden_field_tag "remove_image", "0" %>
<%= form.file_field :image %>
<%= form.label :image %>
</li>
<li class="remove" onclick="Metamaps.Account.removePicture()">Remove</li>
<li class="cancel" onclick="Metamaps.Account.closeChangePicture()">Cancel</li>
</ul>
</div>
</div> </div>
<div class="accountName" onclick="Metamaps.Account.changeName()"> <div class="accountName" onclick="Metamaps.Account.changeName()">
<div class="nameEdit"><%= @user.name %></div> <div class="nameEdit"><%= @user.name %></div>

View file

@ -1,22 +0,0 @@
0 info it worked if it ends with ok
1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'install' ]
2 info using npm@1.4.28
3 info using node@v0.10.32
4 verbose node symlink /usr/bin/node
5 error install Couldn't read dependencies
6 error Failed to parse json
6 error Unexpected token }
7 error File: /home/sandra/metamaps_gen002/realtime/package.json
8 error Failed to parse package.json data.
8 error package.json must be actual JSON, not just JavaScript.
8 error
8 error This is not a bug in npm.
8 error Tell the package author to fix their package.json file. JSON.parse
9 error System Linux 3.13.0-36-generic
10 error command "/usr/bin/node" "/usr/bin/npm" "install"
11 error cwd /home/sandra/metamaps_gen002/realtime
12 error node -v v0.10.32
13 error npm -v 1.4.28
14 error file /home/sandra/metamaps_gen002/realtime/package.json
15 error code EJSONPARSE
16 verbose exit [ 1, true ]