Merge pull request #421 from metamaps/develop

Upgrade to Rails 4
This commit is contained in:
Devin Howard 2016-02-05 11:31:24 +08:00
commit b43804bf80
158 changed files with 5932 additions and 3470 deletions

View file

@ -1,14 +1,43 @@
RAILS_ENV=development export DB_USERNAME='postgres'
export DB_PASSWORD='3112'
export DB_HOST='localhost'
export DB_PORT='5432'
export DB_NAME='metamap002'
AWS_ACCESS_KEY_ID export REALTIME_SERVER='http://localhost:5001'
AWS_SECRET_ACCESS_KEY export MAILER_DEFAULT_URL='localhost:3000'
BUNDLE_GEMFILE export DEVISE_MAILER_SENDER='team@metamaps.cc'
SMTP_DOMAIN export DEVISE_SECRET_KEY='f71c467e526f23d614b3b08866cad4788c502bed869c282f06e73ee6c94675b62fe1f6d52fa7ba8196b33031f0d2f3b67e27ea07693c52ecebccb01700cad614'
SMTP_PASSWORD
SMTP_PORT # # you can safely leave these blank, unless you're deploying an instance, in
SMTP_SERVER # # which case you'll need to set them up
SMTP_USERNAME #
SSO_KEY # export S3_BUCKET_NAME
# export AWS_ACCESS_KEY_ID
# export AWS_SECRET_ACCESS_KEY
# export SSO_KEY
#
# export SMTP_DOMAIN
# export SMTP_PASSWORD
# export SMTP_PORT
# export SMTP_SERVER
# export SMTP_USERNAME
#ruby garbage collection stuff
export RUBY_GC_TUNE=0 #set to 1 to enable GC test
export RUBY_GC_TOKEN=4f4380fc9a2857d1f008005a3eb86928
export RUBY_GC_HEAP_INIT_SLOTS=186426
export RUBY_GC_HEAP_FREE_SLOTS=559278
export RUBY_GC_HEAP_GROWTH_FACTOR=1.03
export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=74570
export RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.4
export RUBY_GC_MALLOC_LIMIT=32883406
export RUBY_GC_MALLOC_LIMIT_MAX=69055153
export RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1.68
export RUBY_GC_OLDMALLOC_LIMIT=32509481
export RUBY_GC_OLDMALLOC_LIMIT_MAX=68269910
export RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR=1.4
## find the ENV currently in use in the app using : ## find the ENV currently in use in the app using :
## grep -rIso -P "(?<=ENV)(\.fetch\(|\[).[A-Z_]+.(\)|\])" ## grep -rIso -P "(?<=ENV)(\.fetch\(|\[).[A-Z_]+.(\)|\])"

12
.gitignore vendored
View file

@ -4,21 +4,21 @@
# or operating system, you probably want to add a global ignore instead: # or operating system, you probably want to add a global ignore instead:
# git config --global core.excludesfile ~/.gitignore_global # git config --global core.excludesfile ~/.gitignore_global
#assety stuff
realtime/node_modules realtime/node_modules
config/database.yml public/assets
#secrets and config
.env .env
#public/assets
# Ignore bundler config # Ignore bundler config
.bundle .bundle
# Ignore the default SQLite database.
db/*.sqlite3
# Ignore all logfiles and tempfiles. # Ignore all logfiles and tempfiles.
log/*.log log/*.log
tmp tmp
.DS_Store .DS_Store
*/.DS_Store
.DS_Store?
.vagrant .vagrant

2
.rspec Normal file
View file

@ -0,0 +1,2 @@
--color
--require spec_helper

1
.ruby-gemset Normal file
View file

@ -0,0 +1 @@
metamaps_gen002

View file

@ -1 +1 @@
2.1.3 ruby-2.1.3

49
Gemfile
View file

@ -1,15 +1,12 @@
source 'https://rubygems.org' source 'https://rubygems.org'
ruby '2.1.3' ruby '2.1.3'
gem 'rails', '3.2.17' gem 'rails', '4.2.4'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'devise' gem 'devise'
gem 'redis' gem 'redis'
gem 'pg' gem 'pg'
gem 'cancan' gem 'cancancan'
gem 'formula' gem 'formula'
gem 'formtastic' gem 'formtastic'
gem 'json' gem 'json'
@ -20,7 +17,11 @@ gem 'uservoice-ruby'
gem 'dotenv' gem 'dotenv'
gem 'paperclip' gem 'paperclip'
gem 'aws-sdk' gem 'aws-sdk', '< 2.0'
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'jbuilder'
#gem 'therubyracer' #optional #gem 'therubyracer' #optional
#gem 'rb-readline' #gem 'rb-readline'
@ -29,32 +30,30 @@ gem 'aws-sdk'
# in production environments by default. # in production environments by default.
group :assets do group :assets do
gem 'sass-rails' gem 'sass-rails'
gem 'coffee-rails', '~> 3.2.1' gem 'coffee-rails'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes # See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer' # gem 'therubyracer'
gem 'uglifier', '>= 1.0.3' gem 'uglifier'
end
group :test do
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'shoulda-matchers'
end end
group :production do #this is used on heroku group :production do #this is used on heroku
#gem 'rmagick' #gem 'rmagick'
gem 'rails_12factor'
end end
gem 'jquery-rails', '2.1.2' group :development, :test do
gem 'pry-rails'
# To use ActiveModel has_secure_password gem 'pry-byebug'
# gem 'bcrypt-ruby', '~> 3.0.0' gem 'better_errors'
gem 'binding_of_caller'
# To use Jbuilder templates for JSON gem 'quiet_assets'
gem 'jbuilder', '0.8.2' gem 'tunemygc'
end
# Use unicorn as the web server
# gem 'unicorn'
# Deploy with Capistrano
# gem 'capistrano'
# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

View file

@ -1,152 +1,222 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actionmailer (3.2.17) actionmailer (4.2.4)
actionpack (= 3.2.17) actionpack (= 4.2.4)
mail (~> 2.5.4) actionview (= 4.2.4)
actionpack (3.2.17) activejob (= 4.2.4)
activemodel (= 3.2.17) mail (~> 2.5, >= 2.5.4)
activesupport (= 3.2.17) rails-dom-testing (~> 1.0, >= 1.0.5)
builder (~> 3.0.0) actionpack (4.2.4)
actionview (= 4.2.4)
activesupport (= 4.2.4)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.4)
activesupport (= 4.2.4)
builder (~> 3.1)
erubis (~> 2.7.0) erubis (~> 2.7.0)
journey (~> 1.0.4) rails-dom-testing (~> 1.0, >= 1.0.5)
rack (~> 1.4.5) rails-html-sanitizer (~> 1.0, >= 1.0.2)
rack-cache (~> 1.2) activejob (4.2.4)
rack-test (~> 0.6.1) activesupport (= 4.2.4)
sprockets (~> 2.2.1) globalid (>= 0.3.0)
activemodel (3.2.17) activemodel (4.2.4)
activesupport (= 3.2.17) activesupport (= 4.2.4)
builder (~> 3.0.0) builder (~> 3.1)
activerecord (3.2.17) activerecord (4.2.4)
activemodel (= 3.2.17) activemodel (= 4.2.4)
activesupport (= 3.2.17) activesupport (= 4.2.4)
arel (~> 3.0.2) arel (~> 6.0)
tzinfo (~> 0.3.29) activesupport (4.2.4)
activeresource (3.2.17) i18n (~> 0.7)
activemodel (= 3.2.17) json (~> 1.7, >= 1.7.7)
activesupport (= 3.2.17) minitest (~> 5.1)
activesupport (3.2.17) thread_safe (~> 0.3, >= 0.3.4)
i18n (~> 0.6, >= 0.6.4) tzinfo (~> 1.1)
multi_json (~> 1.0) arel (6.0.3)
arel (3.0.3) aws-sdk (1.66.0)
aws-sdk (1.54.0) aws-sdk-v1 (= 1.66.0)
aws-sdk-v1 (= 1.54.0) aws-sdk-v1 (1.66.0)
aws-sdk-v1 (1.54.0)
json (~> 1.4) json (~> 1.4)
nokogiri (>= 1.4.4) nokogiri (>= 1.4.4)
bcrypt (3.1.7) bcrypt (3.1.10)
bcrypt (3.1.7-x86-mingw32) best_in_place (3.0.3)
best_in_place (2.1.0) actionpack (>= 3.2)
jquery-rails railties (>= 3.2)
rails (~> 3.1) better_errors (2.1.1)
builder (3.0.4) coderay (>= 1.0.0)
cancan (1.6.10) erubis (>= 2.6.6)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.2.2)
byebug (5.0.0)
columnize (= 0.9.0)
cancancan (1.13.1)
climate_control (0.0.3) climate_control (0.0.3)
activesupport (>= 3.0) activesupport (>= 3.0)
cocaine (0.5.4) cocaine (0.5.7)
climate_control (>= 0.0.3, < 1.0) climate_control (>= 0.0.3, < 1.0)
coffee-rails (3.2.2) coderay (1.1.0)
coffee-rails (4.1.0)
coffee-script (>= 2.2.0) coffee-script (>= 2.2.0)
railties (~> 3.2.0) railties (>= 4.0.0, < 5.0)
coffee-script (2.3.0) coffee-script (2.4.1)
coffee-script-source coffee-script-source
execjs execjs
coffee-script-source (1.8.0) coffee-script-source (1.9.1.1)
devise (3.4.0) columnize (0.9.0)
debug_inspector (0.0.2)
devise (3.5.2)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5) railties (>= 3.2.6, < 5)
responders responders
thread_safe (~> 0.1) thread_safe (~> 0.1)
warden (~> 1.2.3) warden (~> 1.2.3)
dotenv (2.0.0) diff-lcs (1.2.5)
dotenv (2.0.2)
erubis (2.7.0) erubis (2.7.0)
execjs (2.2.1) execjs (2.6.0)
ezcrypto (0.7.2) ezcrypto (0.7.2)
formtastic (3.0.0) factory_girl (4.5.0)
actionpack (>= 3.2.13)
formula (1.0.1)
rails (> 3.0.0)
hike (1.2.3)
i18n (0.6.11)
jbuilder (0.8.2)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
journey (1.0.4) factory_girl_rails (4.5.0)
jquery-rails (2.1.2) factory_girl (~> 4.5.0)
railties (>= 3.1.0, < 5.0) railties (>= 3.0.0)
thor (~> 0.14) formtastic (3.1.3)
json (1.8.1) actionpack (>= 3.2.13)
kaminari (0.16.1) formula (1.1.1)
rails (> 3.0.0)
globalid (0.3.6)
activesupport (>= 4.1.0)
i18n (0.7.0)
jbuilder (2.3.2)
activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2)
jquery-rails (4.0.5)
rails-dom-testing (~> 1.0)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.5)
railties (>= 3.2.16)
json (1.8.3)
kaminari (0.16.3)
actionpack (>= 3.0.0) actionpack (>= 3.0.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
mail (2.5.4) loofah (2.0.3)
mime-types (~> 1.16) nokogiri (>= 1.5.9)
treetop (~> 1.4.8) mail (2.6.3)
mime-types (1.25.1) mime-types (>= 1.16, < 3)
mini_portile (0.6.0) method_source (0.8.2)
multi_json (1.10.1) mime-types (2.6.2)
nokogiri (1.6.3.1) mimemagic (0.3.0)
mini_portile (= 0.6.0) mini_portile (0.6.2)
nokogiri (1.6.3.1-x86-mingw32) minitest (5.8.2)
mini_portile (= 0.6.0) multi_json (1.11.2)
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
oauth (0.4.7) oauth (0.4.7)
orm_adapter (0.5.0) orm_adapter (0.5.0)
paperclip (4.2.0) paperclip (4.3.1)
activemodel (>= 3.0.0) activemodel (>= 3.2.0)
activesupport (>= 3.0.0) activesupport (>= 3.2.0)
cocaine (~> 0.5.3) cocaine (~> 0.5.5)
mime-types mime-types
pg (0.17.1) mimemagic (= 0.3.0)
pg (0.17.1-x86-mingw32) pg (0.18.3)
polyglot (0.3.5) pry (0.10.3)
rack (1.4.5) coderay (~> 1.1.0)
rack-cache (1.2) method_source (~> 0.8.1)
rack (>= 0.4) slop (~> 3.4)
rack-ssl (1.3.4) pry-byebug (3.2.0)
rack byebug (~> 5.0)
rack-test (0.6.2) pry (~> 0.10)
pry-rails (0.3.4)
pry (>= 0.9.10)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.6.4)
rack-test (0.6.3)
rack (>= 1.0) rack (>= 1.0)
rails (3.2.17) rails (4.2.4)
actionmailer (= 3.2.17) actionmailer (= 4.2.4)
actionpack (= 3.2.17) actionpack (= 4.2.4)
activerecord (= 3.2.17) actionview (= 4.2.4)
activeresource (= 3.2.17) activejob (= 4.2.4)
activesupport (= 3.2.17) activemodel (= 4.2.4)
bundler (~> 1.0) activerecord (= 4.2.4)
railties (= 3.2.17) activesupport (= 4.2.4)
rails3-jquery-autocomplete (1.0.14) bundler (>= 1.3.0, < 2.0)
rails (>= 3.0) railties (= 4.2.4)
railties (3.2.17) sprockets-rails
actionpack (= 3.2.17) rails-deprecated_sanitizer (1.0.3)
activesupport (= 3.2.17) activesupport (>= 4.2.0.alpha)
rack-ssl (~> 1.3.2) rails-dom-testing (1.0.7)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.2)
loofah (~> 2.0)
rails3-jquery-autocomplete (1.0.15)
rails (>= 3.2)
rails_12factor (0.0.3)
rails_serve_static_assets
rails_stdout_logging
rails_serve_static_assets (0.0.4)
rails_stdout_logging (0.0.4)
railties (4.2.4)
actionpack (= 4.2.4)
activesupport (= 4.2.4)
rake (>= 0.8.7) rake (>= 0.8.7)
rdoc (~> 3.4) thor (>= 0.18.1, < 2.0)
thor (>= 0.14.6, < 2.0) rake (10.4.2)
rake (10.3.2) redis (3.2.1)
rdoc (3.12.2) responders (2.1.0)
json (~> 1.4) railties (>= 4.2.0, < 5)
redis (3.1.0) rspec-core (3.3.2)
responders (1.1.1) rspec-support (~> 3.3.0)
railties (>= 3.2, < 4.2) rspec-expectations (3.3.1)
sass (3.4.5) diff-lcs (>= 1.2.0, < 2.0)
sass-rails (3.2.6) rspec-support (~> 3.3.0)
railties (~> 3.2.0) rspec-mocks (3.3.2)
sass (>= 3.1.10) diff-lcs (>= 1.2.0, < 2.0)
tilt (~> 1.3) rspec-support (~> 3.3.0)
sprockets (2.2.2) rspec-rails (3.3.3)
hike (~> 1.2) actionpack (>= 3.0, < 4.3)
multi_json (~> 1.0) activesupport (>= 3.0, < 4.3)
rack (~> 1.0) railties (>= 3.0, < 4.3)
tilt (~> 1.1, != 1.3.0) rspec-core (~> 3.3.0)
rspec-expectations (~> 3.3.0)
rspec-mocks (~> 3.3.0)
rspec-support (~> 3.3.0)
rspec-support (3.3.0)
sass (3.4.19)
sass-rails (5.0.4)
railties (>= 4.0.0, < 5.0)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
shoulda-matchers (3.0.1)
activesupport (>= 4.0.0)
slop (3.6.0)
sprockets (3.4.0)
rack (> 1, < 3)
sprockets-rails (2.3.3)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (>= 2.8, < 4.0)
thor (0.19.1) thor (0.19.1)
thread_safe (0.3.4) thread_safe (0.3.5)
tilt (1.4.1) tilt (2.0.1)
treetop (1.4.15) tunemygc (1.0.61)
polyglot tzinfo (1.2.2)
polyglot (>= 0.3.1) thread_safe (~> 0.1)
tzinfo (0.3.41) uglifier (2.7.2)
uglifier (2.5.3)
execjs (>= 0.3.0) execjs (>= 0.3.0)
json (>= 1.8.0) json (>= 1.8.0)
uservoice-ruby (0.0.11) uservoice-ruby (0.0.11)
@ -158,26 +228,39 @@ GEM
PLATFORMS PLATFORMS
ruby ruby
x86-mingw32
DEPENDENCIES DEPENDENCIES
aws-sdk aws-sdk (< 2.0)
best_in_place best_in_place
cancan better_errors
coffee-rails (~> 3.2.1) binding_of_caller
cancancan
coffee-rails
devise devise
dotenv dotenv
factory_girl_rails
formtastic formtastic
formula formula
jbuilder (= 0.8.2) jbuilder
jquery-rails (= 2.1.2) jquery-rails
jquery-ui-rails
json json
kaminari kaminari
paperclip paperclip
pg pg
rails (= 3.2.17) pry-byebug
pry-rails
quiet_assets
rails (= 4.2.4)
rails3-jquery-autocomplete rails3-jquery-autocomplete
rails_12factor
redis redis
rspec-rails
sass-rails sass-rails
uglifier (>= 1.0.3) shoulda-matchers
tunemygc
uglifier
uservoice-ruby uservoice-ruby
BUNDLED WITH
1.10.6

View file

@ -1,42 +0,0 @@
If you are doing an upgrade and or recent pull for changes you will need to change your default ruby package from 2.1.1 to ruby 2.1.2
install homebrew
\curl -sSL https://get.rvm.io | bash -s stable --rails
rvm install 2.1.3 --with-gcc=clang
rvm use 2.1.3
gem install lunchy
(http://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/)
brew install postgresql
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
createuser metamaps -P -s -d
set a password
lunchy start postgres
cd into the metamaps directory
bundle install
copy the database.yml.default file and rename it database.yml
make sure the username and password match the POSTGRES username and password you set
http://nodejs.org/ hit install, download, open, install
rake db:create
rake db:schema:load
rake db:fixtures:load
rails s
( to start the server)

View file

@ -2,6 +2,7 @@ Metamaps
======= =======
[![Join the chat at https://gitter.im/metamaps/metamaps_gen002](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/metamaps/metamaps_gen002?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/metamaps/metamaps_gen002](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/metamaps/metamaps_gen002?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
![Build Status](https://jenkins.devinhoward.ca/job/metamaps_gen002.develop/badge/icon)
Welcome to the Metamaps GitHub repo. Welcome to the Metamaps GitHub repo.
@ -72,7 +73,7 @@ Copyright (c) 2015 Connor Turland
[site-blog]: http://blog.metamaps.cc [site-blog]: http://blog.metamaps.cc
[site-beta]: http://metamaps.cc [site-beta]: http://metamaps.cc
[community]: https://plus.google.com/u/0/communities/115060009262157699234 [community]: https://plus.google.com/u/0/communities/115060009262157699234
[license]: https://github.com/metamaps/metamaps_gen002/blob/master/LICENSE [license]: https://github.com/metamaps/metamaps_gen002/blob/develop/LICENSE
[contributing]: https://github.com/metamaps/metamaps_gen002/blob/master/CONTRIBUTING.md [contributing]: https://github.com/metamaps/metamaps_gen002/blob/develop/doc/CONTRIBUTING.md
[contributing-issues]: https://github.com/metamaps/metamaps_gen002/blob/master/CONTRIBUTING.md#reporting-bugs-and-other-issues [contributing-issues]: https://github.com/metamaps/metamaps_gen002/blob/develop/doc/CONTRIBUTING.md#reporting-bugs-and-other-issues
[windows-installation]: https://github.com/metamaps/metamaps_gen002/blob/master/WindowsInstallation.md [windows-installation]: https://github.com/metamaps/metamaps_gen002/blob/develop/doc/WindowsInstallation.md

View file

@ -1,114 +0,0 @@
Firstly this walkthrough is done with a 14.04 32bit install of Ubuntu.
All commands that I could are terminal based.
Lets check if all updates for the system are installed first
in terminal type
sudo apt-get update
now we need to install git
sudo apt-get install git
lets get our RVM installed (Ruby Version Manager) now this is fun because the package you will get from apt-get is outdated.
so we are going to use CURL to get RVM
sudo apt-get install curl
then lets install RVM with curl like this
curl -L get.rvm.io | bash -s stable
PATH=$PATH:$HOME/.rvm/bin
[[ -s "$HOME/.profile" ]] && source "$HOME/.profile"
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
source ~/.rvm/scripts/rvm
now we can actually install RVM
rvm requirements
running this will check your system for requirements as well so you will need to put your system password in.
alright now we can download metamaps from the master using git
git clone https://github.com/metamaps/metamaps_gen002.git
now there is a couple other things we are going to need which is nodejs, postgresql, libpq-dev and redis-server
sudo apt-get install nodejs
sudo apt-get install postgresql
sudo apt-get install libpq-dev
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
rvm install ruby-2.1.3
Now we also need to rename your database file which is in ./config/database.default.yml to database.yml
now run inside your metamaps_gen002 folder
bundle install
in your top lvl directory for metamaps this is a lengthy process so you might want to go and make a coffee or something :)
alright now we need to make sure your postgres password is the same as it is listed in the DB file so we are going to set it by
sudo -u postgres psql
Select postgres like this
\password postgres
set the password to 3112
Then to quit
\q
now we can run the rake install and db creation
rake db:create
rake db:schema:load
rake db:fixtures:load
Execute the server:
rails s
and dont forget to run the other server for realtime...
open a new terminal
navigate to ./realtime and run
sudo apt-get install npm
npm install
nodejs realtime-server.js
Now you're all set enjoy your personal server of metamaps :)
Navigate your browser to localhost:3000 once you have the server running
Sign in with the default account
email: user@user.com
password: toolsplusconsciousness
OR create a new account at /join, and use access code 'qwertyui'
Start mapping and programming!

View file

@ -1,45 +0,0 @@
If you have any trouble with this process, contact us at team@metamaps.cc, and one of our developers may be able to help you out.
First, http://railsinstaller.org/en. This will install Ruby, Rails, and Git for you.
Once you've done that, you will need to download PostgreSQL and node.js:
- http://nodejs.org/en/download/
- http://www.postgresql.org/download/windows/
Now open a terminal, and navigate to the folder that you want to download the metamaps files to and run the following:
git clone https://github.com/metamaps/metamaps_gen002.git --branch develop
cd metamaps_gen002
Now you're in the main directory.
Install all the gems needed for Metamaps by running
bundle install
Setting up the database:
1) Copy /config/database.yml.default and rename the copy to /config/database.yml then edit database.yml with your text editor and set the password to whatever you chose when you set up the PostGres database.
2) In a terminal:
rake db:create
rake db:schema:load
rake db:fixtures:load
Running the server:
rails s
Navigate your browser to localhost:3000 once you have the server running
Sign in with the default account
email: user@user.com
password: toolsplusconsciousness
OR create a new account at /join, and use access code 'qwertyui'
Start mapping and programming!

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -3127,7 +3127,7 @@ var Canvas;
ctx = base.getCtx(), ctx = base.getCtx(),
scale = base.scaleOffsetX; scale = base.scaleOffsetX;
//var pattern = new Image(); //var pattern = new Image();
//pattern.src = "/assets/cubes.png"; //pattern.src = "<%= asset_path('cubes.png') %>";
//var ptrn = ctx.createPattern(pattern, 'repeat'); //var ptrn = ctx.createPattern(pattern, 'repeat');
//ctx.fillStyle = ptrn; //ctx.fillStyle = ptrn;
ctx.fillStyle = Metamaps.Settings.colors.background; ctx.fillStyle = Metamaps.Settings.colors.background;

View file

@ -459,7 +459,7 @@ Metamaps.GlobalUI.Search = {
$('.sidebarSearch .twitter-typeahead, .sidebarSearch .tt-hint, .sidebarSearchField').animate({ $('.sidebarSearch .twitter-typeahead, .sidebarSearch .tt-hint, .sidebarSearchField').animate({
width: '0' width: '0'
}, 300, function () { }, 300, function () {
$('.sidebarSearchField').typeahead('setQuery', ''); $('.sidebarSearchField').typeahead('val', '');
$('.sidebarSearchField').blur(); $('.sidebarSearchField').blur();
self.changing = false; self.changing = false;
self.isOpen = false; self.isOpen = false;
@ -477,95 +477,109 @@ Metamaps.GlobalUI.Search = {
var topics = { var topics = {
name: 'topics', name: 'topics',
limit: 9999, limit: 9999,
dupChecker: function (datum1, datum2) {
return false; display: function(s) { return s.label; },
}, templates: {
template: $('#topicSearchTemplate').html(), notFound: function(s) {
remote: { return Hogan.compile($('#topicSearchTemplate').html()).render({
url: '/search/topics?term=%QUERY',
replace: function () {
var q = '/search/topics?term=' + $('.sidebarSearchField').val();
if (Metamaps.Active.Mapper && $("#limitTopicsToMe").is(':checked')) {
q += "&user=" + Metamaps.Active.Mapper.id.toString();
}
return q;
},
filter: function (dataset) {
if (dataset.length == 0) {
dataset.push({
value: "No results", value: "No results",
label: "No results", label: "No results",
typeImageURL: "/assets/icons/wildcard.png", typeImageURL: "<%= asset_path('icons/wildcard.png') %>",
rtype: "noresult" rtype: "noresult"
}); });
}
return dataset;
}
}, },
engine: Hogan, header: topicheader,
header: topicheader suggestion: function(s) {
return Hogan.compile($('#topicSearchTemplate').html()).render(s);
},
},
source: new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/search/topics',
prepare: function(query, settings) {
settings.url += '?term=' + query;
if (Metamaps.Active.Mapper && $("#limitTopicsToMe").is(':checked')) {
settings.url += "&user=" + Metamaps.Active.Mapper.id.toString();
}
return settings;
},
},
}),
}; };
var maps = { var maps = {
name: 'maps', name: 'maps',
limit: 9999, limit: 9999,
dupChecker: function (datum1, datum2) { display: function(s) { return s.label; },
return false; templates: {
}, notFound: function(s) {
template: $('#mapSearchTemplate').html(), return Hogan.compile($('#mapSearchTemplate').html()).render({
remote: {
url: '/search/maps?term=%QUERY',
replace: function () {
var q = '/search/maps?term=' + $('.sidebarSearchField').val();
if (Metamaps.Active.Mapper && $("#limitMapsToMe").is(':checked')) {
q += "&user=" + Metamaps.Active.Mapper.id.toString();
}
return q;
},
filter: function (dataset) {
if (dataset.length == 0) {
dataset.push({
value: "No results", value: "No results",
label: "No results", label: "No results",
rtype: "noresult" rtype: "noresult"
}); });
}
return dataset;
}
}, },
engine: Hogan, header: mapheader,
header: mapheader suggestion: function(s) {
return Hogan.compile($('#mapSearchTemplate').html()).render(s);
},
},
source: new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/search/maps',
prepare: function(query, settings) {
settings.url += '?term=' + query;
if (Metamaps.Active.Mapper && $("#limitMapsToMe").is(':checked')) {
settings.url += "&user=" + Metamaps.Active.Mapper.id.toString();
}
return settings;
},
},
}),
}; };
var mappers = { var mappers = {
name: 'mappers', name: 'mappers',
limit: 9999, limit: 9999,
dupChecker: function (datum1, datum2) { display: function(s) { return s.label; },
return false; templates: {
}, notFound: function(s) {
template: $('#mapperSearchTemplate').html(), return Hogan.compile($('#mapperSearchTemplate').html()).render({
remote: {
url: '/search/mappers?term=%QUERY',
filter: function (dataset) {
if (dataset.length == 0) {
dataset.push({
profile: "/assets/user.png",
value: "No results", value: "No results",
label: "No results", label: "No results",
rtype: "noresult" rtype: "noresult",
profile: "<%= asset_path('user.png') %>",
}); });
}
return dataset;
}
}, },
engine: Hogan, header: mapperheader,
header: mapperheader suggestion: function(s) {
return Hogan.compile($('#mapperSearchTemplate').html()).render(s);
},
},
source: new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/search/mappers?term=%QUERY',
wildcard: '%QUERY',
},
}),
}; };
$('.sidebarSearchField').typeahead([topics, maps, mappers]);
// Take all that crazy setup data and put it together into one beautiful typeahead call!
$('.sidebarSearchField').typeahead(
{
highlight: true,
},
[topics, maps, mappers]
);
//Set max height of the search results box to prevent it from covering bottom left footer //Set max height of the search results box to prevent it from covering bottom left footer
$('.sidebarSearchField').bind('typeahead:suggestionsRendered', function (event) { $('.sidebarSearchField').bind('typeahead:render', function (event) {
self.initSearchOptions(); self.initSearchOptions();
self.hideLoader(); self.hideLoader();
var h = $(window).height(); var h = $(window).height();
@ -577,7 +591,7 @@ Metamaps.GlobalUI.Search = {
}); });
// tell the autocomplete to launch a new tab with the topic, map, or mapper you clicked on // tell the autocomplete to launch a new tab with the topic, map, or mapper you clicked on
$('.sidebarSearchField').bind('typeahead:selected', self.handleResultClick); $('.sidebarSearchField').bind('typeahead:select', self.handleResultClick);
// don't do it, if they clicked on a 'addToMap' button // don't do it, if they clicked on a 'addToMap' button
$('.sidebarSearch button.addToMap').click(function (event) { $('.sidebarSearch button.addToMap').click(function (event) {
@ -585,7 +599,7 @@ Metamaps.GlobalUI.Search = {
}); });
// make sure that when you click on 'limit to me' or 'toggle section' it works // make sure that when you click on 'limit to me' or 'toggle section' it works
$('.sidebarSearchField').bind('typeahead:queryChanged', function(){ $('.sidebarSearchField').bind('typeahead:change', function(){
if ($(this).val() === "") { if ($(this).val() === "") {
self.hideLoader(); self.hideLoader();
} }
@ -600,14 +614,14 @@ Metamaps.GlobalUI.Search = {
self.hideLoader(); self.hideLoader();
if (datum.rtype != "noresult") { if (["topic", "map", "mapper"].indexOf(datum.rtype) !== -1) {
self.close(0, true); self.close(0, true);
var win; var win;
if (dataset == "topics") { if (datum.rtype == "topic") {
Metamaps.Router.topics(datum.id); Metamaps.Router.topics(datum.id);
} else if (dataset == "maps") { } else if (datum.rtype == "map") {
Metamaps.Router.maps(datum.id); Metamaps.Router.maps(datum.id);
} else if (dataset == "mappers") { } else if (datum.rtype == "mapper") {
Metamaps.Router.explore("mapper", datum.id); Metamaps.Router.explore("mapper", datum.id);
} }
} }
@ -616,7 +630,7 @@ Metamaps.GlobalUI.Search = {
var self = Metamaps.GlobalUI.Search; var self = Metamaps.GlobalUI.Search;
function toggleResultSet(set) { function toggleResultSet(set) {
var s = $('.tt-dataset-' + set + ' .tt-suggestions'); var s = $('.tt-dataset-' + set + ' .tt-dataset');
if (s.css('height') == '0px') { if (s.css('height') == '0px') {
s.css({ s.css({
'height': 'auto', 'height': 'auto',
@ -635,7 +649,7 @@ Metamaps.GlobalUI.Search = {
$('.limitToMe').unbind().bind("change", function (e) { $('.limitToMe').unbind().bind("change", function (e) {
// set the value of the search equal to itself to retrigger the autocomplete event // set the value of the search equal to itself to retrigger the autocomplete event
self.isOpen = false; self.isOpen = false;
$('.sidebarSearchField').typeahead('setQuery', $('.sidebarSearchField').val()); $('.sidebarSearchField').typeahead('val', $('.sidebarSearchField').val());
setTimeout(function () { setTimeout(function () {
self.isOpen = true; self.isOpen = true;
}, 2000); }, 2000);

View file

@ -29,10 +29,10 @@ Metamaps.JIT = {
$(".takeScreenshot").click(Metamaps.Map.exportImage); $(".takeScreenshot").click(Metamaps.Map.exportImage);
self.topicDescImage = new Image(); self.topicDescImage = new Image();
self.topicDescImage.src = '/assets/topic_description_signifier.png'; self.topicDescImage.src = '<%= asset_path('topic_description_signifier.png') %>';
self.topicLinkImage = new Image(); self.topicLinkImage = new Image();
self.topicLinkImage.src = '/assets/topic_link_signifier.png'; self.topicLinkImage.src = '<%= asset_path('topic_link_signifier.png') %>';
}, },
/** /**
* convert our topic JSON into something JIT can use * convert our topic JSON into something JIT can use

View file

@ -37,7 +37,7 @@ Metamaps.Settings = {
background: '#18202E', background: '#18202E',
text: '#DDD' text: '#DDD'
} }
} },
}; };
Metamaps.Touch = { Metamaps.Touch = {
@ -157,7 +157,7 @@ Metamaps.Backbone.init = function () {
this.on('saved', this.savedEvent); this.on('saved', this.savedEvent);
this.on('nowPrivate', function(){ this.on('nowPrivate', function(){
var removeTopicData = { var removeTopicData = {
topicid: this.id mappableid: this.id
}; };
$(document).trigger(Metamaps.JIT.events.removeTopic, [removeTopicData]); $(document).trigger(Metamaps.JIT.events.removeTopic, [removeTopicData]);
@ -165,7 +165,7 @@ Metamaps.Backbone.init = function () {
this.on('noLongerPrivate', function(){ this.on('noLongerPrivate', function(){
var newTopicData = { var newTopicData = {
mappingid: this.getMapping().id, mappingid: this.getMapping().id,
topicid: this.id mappableid: this.id
}; };
$(document).trigger(Metamaps.JIT.events.newTopic, [newTopicData]); $(document).trigger(Metamaps.JIT.events.newTopic, [newTopicData]);
@ -194,7 +194,8 @@ Metamaps.Backbone.init = function () {
return Metamaps.Mappings.findWhere({ return Metamaps.Mappings.findWhere({
map_id: Metamaps.Active.Map.id, map_id: Metamaps.Active.Map.id,
topic_id: this.isNew() ? this.cid : this.id mappable_type: "Topic",
mappable_id: this.isNew() ? this.cid : this.id
}); });
}, },
createNode: function () { createNode: function () {
@ -320,14 +321,14 @@ Metamaps.Backbone.init = function () {
this.on('noLongerPrivate', function(){ this.on('noLongerPrivate', function(){
var newSynapseData = { var newSynapseData = {
mappingid: this.getMapping().id, mappingid: this.getMapping().id,
synapseid: this.id mappableid: this.id
}; };
$(document).trigger(Metamaps.JIT.events.newSynapse, [newSynapseData]); $(document).trigger(Metamaps.JIT.events.newSynapse, [newSynapseData]);
}); });
this.on('nowPrivate', function(){ this.on('nowPrivate', function(){
$(document).trigger(Metamaps.JIT.events.removeSynapse, [{ $(document).trigger(Metamaps.JIT.events.removeSynapse, [{
synapseid: this.id mappableid: this.id
}]); }]);
}); });
@ -336,7 +337,7 @@ Metamaps.Backbone.init = function () {
prepareLiForFilter: function () { prepareLiForFilter: function () {
var li = ''; var li = '';
li += '<li data-id="' + this.get('desc') + '">'; li += '<li data-id="' + this.get('desc') + '">';
li += '<img src="/assets/synapse16.png"'; li += '<img src="<%= asset_path('synapse16.png') %>"';
li += ' alt="synapse icon" />'; li += ' alt="synapse icon" />';
li += '<p>' + this.get('desc') + '</p></li>'; li += '<p>' + this.get('desc') + '</p></li>';
return li; return li;
@ -370,7 +371,8 @@ Metamaps.Backbone.init = function () {
return Metamaps.Mappings.findWhere({ return Metamaps.Mappings.findWhere({
map_id: Metamaps.Active.Map.id, map_id: Metamaps.Active.Map.id,
synapse_id: this.isNew() ? this.cid : this.id mappable_type: "Synapse",
mappable_id: this.isNew() ? this.cid : this.id
}); });
}, },
createEdge: function () { createEdge: function () {
@ -457,11 +459,11 @@ Metamaps.Backbone.init = function () {
return Metamaps.Map.get(this.get('map_id')); return Metamaps.Map.get(this.get('map_id'));
}, },
getTopic: function () { getTopic: function () {
if (this.get('category') === 'Topic') return Metamaps.Topic.get(this.get('topic_id')); if (this.get('mappable_type') === 'Topic') return Metamaps.Topic.get(this.get('mappable_id'));
else return false; else return false;
}, },
getSynapse: function () { getSynapse: function () {
if (this.get('category') === 'Synapse') return Metamaps.Synapse.get(this.get('synapse_id')); if (this.get('mappable_type') === 'Synapse') return Metamaps.Synapse.get(this.get('mappable_id'));
else return false; else return false;
} }
}); });
@ -654,7 +656,7 @@ Metamaps.Create = {
self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0); self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0);
self.newSelectedMetacodes = self.selectedMetacodes.slice(0); self.newSelectedMetacodes = self.selectedMetacodes.slice(0);
} }
$('#metacodeSwitchTabs').tabs("select", self.selectedMetacodeSetIndex); $('#metacodeSwitchTabs').tabs("option", "active", self.selectedMetacodeSetIndex);
$('#topic_name').focus(); $('#topic_name').focus();
}, },
newTopic: { newTopic: {
@ -664,21 +666,36 @@ Metamaps.Create = {
Metamaps.Create.newTopic.name = $(this).val(); Metamaps.Create.newTopic.name = $(this).val();
}); });
var topicBloodhound = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/topics/autocomplete_topic?term=%QUERY',
wildcard: '%QUERY',
},
});
// initialize the autocomplete results for the metacode spinner // initialize the autocomplete results for the metacode spinner
$('#topic_name').typeahead([ $('#topic_name').typeahead(
{ {
highlight: true,
minLength: 2,
},
[{
name: 'topic_autocomplete', name: 'topic_autocomplete',
limit: 8, limit: 8,
template: $('#topicAutocompleteTemplate').html(), display: function (s) { return s.label; },
remote: { templates: {
url: '/topics/autocomplete_topic?term=%QUERY' suggestion: function(s) {
return Hogan.compile($('#topicAutocompleteTemplate').html()).render(s);
}, },
engine: Hogan },
} source: topicBloodhound,
]); }]
);
// tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete // tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete
$('#topic_name').bind('typeahead:selected', function (event, datum, dataset) { $('#topic_name').bind('typeahead:select', function (event, datum, dataset) {
Metamaps.Topic.getTopicFromAutocomplete(datum.id); Metamaps.Topic.getTopicFromAutocomplete(datum.id);
}); });
@ -711,7 +728,7 @@ Metamaps.Create = {
}, },
hide: function () { hide: function () {
$('#new_topic').fadeOut('fast'); $('#new_topic').fadeOut('fast');
$("#topic_name").typeahead('setQuery', ''); $("#topic_name").typeahead('val', '');
Metamaps.Create.newTopic.beingCreated = false; Metamaps.Create.newTopic.beingCreated = false;
} }
}, },
@ -723,32 +740,62 @@ Metamaps.Create = {
Metamaps.Create.newSynapse.description = $(this).val(); Metamaps.Create.newSynapse.description = $(this).val();
}); });
// initialize the autocomplete results for synapse creation var synapseBloodhound = new Bloodhound({
$('#synapse_desc').typeahead([ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
{ queryTokenizer: Bloodhound.tokenizers.whitespace,
name: 'synapse_autocomplete',
template: "<div class='genericSynapseDesc'>{{label}}</div>",
remote: { remote: {
url: '/search/synapses?term=%QUERY' url: '/search/synapses?term=%QUERY',
wildcard: '%QUERY',
}, },
engine: Hogan });
var existingSynapseBloodhound = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/search/synapses?topic1id=%TOPIC1&topic2id=%TOPIC2',
prepare: function(query, settings) {
var self = Metamaps.Create.newSynapse;
if (Metamaps.Selected.Nodes.length < 2) {
settings.url = settings.url.replace("%TOPIC1", self.topic1id).replace("%TOPIC2", self.topic2id);
return settings;
} else {
return null;
}
},
},
});
// initialize the autocomplete results for synapse creation
$('#synapse_desc').typeahead(
{
highlight: true,
minLength: 2,
},
[{
name: 'synapse_autocomplete',
display: function(s) { return s.label; },
templates: {
suggestion: function(s) {
return Hogan.compile("<div class='genericSynapseDesc'>{{label}}</div>").render(s);
},
},
source: synapseBloodhound,
}, },
{ {
name: 'existing_synapses', name: 'existing_synapses',
limit: 50, limit: 50,
template: $('#synapseAutocompleteTemplate').html(), display: function(s) { return s.label; },
remote: { templates: {
url: '/search/synapses', suggestion: function(s) {
replace: function () { return Hogan.compile($('#synapseAutocompleteTemplate').html()).render(s);
return self.getSearchQuery();
}
}, },
engine: Hogan,
header: "<h3>Existing synapses</h3>" header: "<h3>Existing synapses</h3>"
} },
]); source: existingSynapseBloodhound,
}]
);
$('#synapse_desc').bind('typeahead:selected', function (event, datum, dataset) { $('#synapse_desc').bind('typeahead:select', function (event, datum, dataset) {
if (datum.id) { // if they clicked on an existing synapse get it if (datum.id) { // if they clicked on an existing synapse get it
Metamaps.Synapse.getSynapseFromAutocomplete(datum.id); Metamaps.Synapse.getSynapseFromAutocomplete(datum.id);
} }
@ -771,7 +818,7 @@ Metamaps.Create = {
}, },
hide: function () { hide: function () {
$('#new_synapse').fadeOut('fast'); $('#new_synapse').fadeOut('fast');
$("#synapse_desc").typeahead('setQuery', ''); $("#synapse_desc").typeahead('val', '');
Metamaps.Create.newSynapse.beingCreated = false; Metamaps.Create.newSynapse.beingCreated = false;
Metamaps.Create.newTopic.addSynapse = false; Metamaps.Create.newTopic.addSynapse = false;
Metamaps.Create.newSynapse.topic1id = 0; Metamaps.Create.newSynapse.topic1id = 0;
@ -779,13 +826,6 @@ Metamaps.Create = {
Metamaps.Mouse.synapseStartCoordinates = []; Metamaps.Mouse.synapseStartCoordinates = [];
Metamaps.Visualize.mGraph.plot(); Metamaps.Visualize.mGraph.plot();
}, },
getSearchQuery: function () {
var self = Metamaps.Create.newSynapse;
if (Metamaps.Selected.Nodes.length < 2) {
return '/search/synapses?topic1id=' + self.topic1id + '&topic2id=' + self.topic2id;
} else return '';
}
} }
}; // end Metamaps.Create }; // end Metamaps.Create
@ -888,8 +928,11 @@ Metamaps.TopicCard = {
setTimeout(function () { setTimeout(function () {
var text = $(element).val(); var text = $(element).val();
if (event.type=="paste" || (event.type=="keyup" && event.which==13)){ if (event.type=="paste" || (event.type=="keyup" && event.which==13)){
if (text.slice(0, 4) !== 'http') { // TODO evaluate converting this to '//' no matter what (infer protocol)
text='http://'+text; if (text.slice(0, 7) !== 'http://' &&
text.slice(0, 8) !== 'https://' &&
text.slice(0, 2) !== '//') {
text='//'+text;
} }
topic.save({ topic.save({
link: text link: text
@ -1528,8 +1571,6 @@ Metamaps.SynapseCard = {
////////////////////// END TOPIC AND SYNAPSE CARDS ////////////////////////////////// ////////////////////// END TOPIC AND SYNAPSE CARDS //////////////////////////////////
/* /*
* *
* VISUALIZE * VISUALIZE
@ -1859,7 +1900,7 @@ Metamaps.Util = {
return (url.match(/\.(jpeg|jpg|gif|png)$/) != null); return (url.match(/\.(jpeg|jpg|gif|png)$/) != null);
}, },
checkURLisYoutubeVideo: function (url) { checkURLisYoutubeVideo: function (url) {
return (url.match(/^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$/) != null); return (url.match(/^https?:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$/) != null);
} }
}; // end Metamaps.Util }; // end Metamaps.Util
@ -1869,9 +1910,6 @@ Metamaps.Util = {
* *
*/ */
Metamaps.Realtime = { Metamaps.Realtime = {
stringForLocalhost: 'http://localhost:5001',
stringForMetamaps: 'http://metamaps.cc:5001',
stringForHeroku: 'http://gentle-savannah-1303.herokuapp.com',
socket: null, socket: null,
isOpen: false, isOpen: false,
changing: false, changing: false,
@ -1895,9 +1933,7 @@ Metamaps.Realtime = {
}); });
$('body').click(self.close); $('body').click(self.close);
var railsEnv = $('body').data('env'); self.socket = io.connect('<%= ENV['REALTIME_SERVER'] %>');
var whichToConnect = railsEnv === 'development' ? self.stringForLocalhost : self.stringForHeroku;
self.socket = io.connect(whichToConnect);
self.socket.on('connect', function () { self.socket.on('connect', function () {
self.startActiveMap(); self.startActiveMap();
}); });
@ -2505,12 +2541,12 @@ Metamaps.Realtime = {
if (!self.status) return; if (!self.status) return;
function test() { function waitThenRenderTopic() {
if (topic && mapping && mapper) { if (topic && mapping && mapper) {
Metamaps.Topic.renderTopic(mapping, topic, false, false); Metamaps.Topic.renderTopic(mapping, topic, false, false);
} }
else if (!cancel) { else if (!cancel) {
setTimeout(test, 10); setTimeout(waitThenRenderTopic, 10);
} }
} }
@ -2523,7 +2559,7 @@ Metamaps.Realtime = {
Metamaps.Mapper.get(data.mapperid, mapperCallback); Metamaps.Mapper.get(data.mapperid, mapperCallback);
} }
$.ajax({ $.ajax({
url: "/topics/" + data.topicid + ".json", url: "/topics/" + data.mappableid + ".json",
success: function (response) { success: function (response) {
Metamaps.Topics.add(response); Metamaps.Topics.add(response);
topic = Metamaps.Topics.get(response.id); topic = Metamaps.Topics.get(response.id);
@ -2543,7 +2579,7 @@ Metamaps.Realtime = {
} }
}); });
test(); waitThenRenderTopic();
}, },
// removeTopic // removeTopic
sendDeleteTopic: function (data) { sendDeleteTopic: function (data) {
@ -2570,7 +2606,7 @@ Metamaps.Realtime = {
if (!self.status) return; if (!self.status) return;
var topic = Metamaps.Topics.get(data.topicid); var topic = Metamaps.Topics.get(data.mappableid);
if (topic) { if (topic) {
var node = topic.get('node'); var node = topic.get('node');
var mapping = topic.getMapping(); var mapping = topic.getMapping();
@ -2598,7 +2634,7 @@ Metamaps.Realtime = {
if (!self.status) return; if (!self.status) return;
function test() { function waitThenRenderSynapse() {
if (synapse && mapping && mapper) { if (synapse && mapping && mapper) {
topic1 = synapse.getTopic1(); topic1 = synapse.getTopic1();
node1 = topic1.get('node'); node1 = topic1.get('node');
@ -2608,7 +2644,7 @@ Metamaps.Realtime = {
Metamaps.Synapse.renderSynapse(mapping, synapse, node1, node2, false); Metamaps.Synapse.renderSynapse(mapping, synapse, node1, node2, false);
} }
else if (!cancel) { else if (!cancel) {
setTimeout(test, 10); setTimeout(waitThenRenderSynapse, 10);
} }
} }
@ -2621,7 +2657,7 @@ Metamaps.Realtime = {
Metamaps.Mapper.get(data.mapperid, mapperCallback); Metamaps.Mapper.get(data.mapperid, mapperCallback);
} }
$.ajax({ $.ajax({
url: "/synapses/" + data.synapseid + ".json", url: "/synapses/" + data.mappableid + ".json",
success: function (response) { success: function (response) {
Metamaps.Synapses.add(response); Metamaps.Synapses.add(response);
synapse = Metamaps.Synapses.get(response.id); synapse = Metamaps.Synapses.get(response.id);
@ -2640,7 +2676,7 @@ Metamaps.Realtime = {
cancel = true; cancel = true;
} }
}); });
test(); waitThenRenderSynapse();
}, },
// deleteSynapse // deleteSynapse
sendDeleteSynapse: function (data) { sendDeleteSynapse: function (data) {
@ -2668,7 +2704,7 @@ Metamaps.Realtime = {
if (!self.status) return; if (!self.status) return;
var synapse = Metamaps.Synapses.get(data.synapseid); var synapse = Metamaps.Synapses.get(data.mappableid);
if (synapse) { if (synapse) {
var edge = synapse.get('edge'); var edge = synapse.get('edge');
var mapping = synapse.getMapping(); var mapping = synapse.getMapping();
@ -2778,12 +2814,12 @@ Metamaps.Control = {
var permToDelete = Metamaps.Active.Mapper.id === topic.get('user_id') || Metamaps.Active.Mapper.get('admin'); var permToDelete = Metamaps.Active.Mapper.id === topic.get('user_id') || Metamaps.Active.Mapper.get('admin');
if (permToDelete) { if (permToDelete) {
var topicid = topic.id; var mappableid = topic.id;
var mapping = node.getData('mapping'); var mapping = node.getData('mapping');
topic.destroy(); topic.destroy();
Metamaps.Mappings.remove(mapping); Metamaps.Mappings.remove(mapping);
$(document).trigger(Metamaps.JIT.events.deleteTopic, [{ $(document).trigger(Metamaps.JIT.events.deleteTopic, [{
topicid: topicid mappableid: mappableid
}]); }]);
Metamaps.Control.hideNode(nodeid); Metamaps.Control.hideNode(nodeid);
} else { } else {
@ -2822,12 +2858,12 @@ Metamaps.Control = {
} }
var topic = node.getData('topic'); var topic = node.getData('topic');
var topicid = topic.id; var mappableid = topic.id;
var mapping = node.getData('mapping'); var mapping = node.getData('mapping');
mapping.destroy(); mapping.destroy();
Metamaps.Topics.remove(topic); Metamaps.Topics.remove(topic);
$(document).trigger(Metamaps.JIT.events.removeTopic, [{ $(document).trigger(Metamaps.JIT.events.removeTopic, [{
topicid: topicid mappableid: mappableid
}]); }]);
Metamaps.Control.hideNode(nodeid); Metamaps.Control.hideNode(nodeid);
}, },
@ -2951,7 +2987,7 @@ Metamaps.Control = {
Metamaps.Control.hideEdge(edge); Metamaps.Control.hideEdge(edge);
} }
var synapseid = synapse.id; var mappableid = synapse.id;
synapse.destroy(); synapse.destroy();
// the server will destroy the mapping, we just need to remove it here // the server will destroy the mapping, we just need to remove it here
@ -2962,7 +2998,7 @@ Metamaps.Control = {
delete edge.data.$displayIndex; delete edge.data.$displayIndex;
} }
$(document).trigger(Metamaps.JIT.events.deleteSynapse, [{ $(document).trigger(Metamaps.JIT.events.deleteSynapse, [{
synapseid: synapseid mappableid: mappableid
}]); }]);
} else { } else {
Metamaps.GlobalUI.notifyUser('Only synapses you created can be deleted'); Metamaps.GlobalUI.notifyUser('Only synapses you created can be deleted');
@ -3007,7 +3043,7 @@ Metamaps.Control = {
var synapse = edge.getData("synapses")[index]; var synapse = edge.getData("synapses")[index];
var mapping = edge.getData("mappings")[index]; var mapping = edge.getData("mappings")[index];
var synapseid = synapse.id; var mappableid = synapse.id;
mapping.destroy(); mapping.destroy();
Metamaps.Synapses.remove(synapse); Metamaps.Synapses.remove(synapse);
@ -3018,7 +3054,7 @@ Metamaps.Control = {
delete edge.data.$displayIndex; delete edge.data.$displayIndex;
} }
$(document).trigger(Metamaps.JIT.events.removeSynapse, [{ $(document).trigger(Metamaps.JIT.events.removeSynapse, [{
synapseid: synapseid mappableid: mappableid
}]); }]);
}, },
hideSelectedEdges: function () { hideSelectedEdges: function () {
@ -3263,24 +3299,32 @@ Metamaps.Filter = {
// ['Topics', 'Synapses'] as 'collection' // ['Topics', 'Synapses'] as 'collection'
if (typeof collection === "object") { if (typeof collection === "object") {
Metamaps[collection[0]].each(function(model) { Metamaps[collection[0]].each(function(model) {
var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false; var prop = model.get(propertyToCheck);
if (prop && newList.indexOf(prop) === -1) { if (prop !== null) {
prop = prop.toString();
if (newList.indexOf(prop) === -1) {
newList.push(prop); newList.push(prop);
} }
}
}); });
Metamaps[collection[1]].each(function(model) { Metamaps[collection[1]].each(function(model) {
var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false; var prop = model.get(propertyToCheck);
if (prop && newList.indexOf(prop) === -1) { if (prop !== null) {
prop = prop.toString();
if (newList.indexOf(prop) === -1) {
newList.push(prop); newList.push(prop);
} }
}
}); });
} } else if (typeof collection === "string") {
else if (typeof collection === "string") {
Metamaps[collection].each(function(model) { Metamaps[collection].each(function(model) {
var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false; var prop = model.get(propertyToCheck);
if (prop && newList.indexOf(prop) === -1) { if (prop !== null) {
prop = prop.toString();
if (newList.indexOf(prop) === -1) {
newList.push(prop); newList.push(prop);
} }
}
}); });
} }
@ -4018,14 +4062,14 @@ Metamaps.Topic = {
var mappingSuccessCallback = function (mappingModel, response) { var mappingSuccessCallback = function (mappingModel, response) {
var newTopicData = { var newTopicData = {
mappingid: mappingModel.id, mappingid: mappingModel.id,
topicid: mappingModel.get('topic_id') mappableid: mappingModel.get('mappable_id')
}; };
$(document).trigger(Metamaps.JIT.events.newTopic, [newTopicData]); $(document).trigger(Metamaps.JIT.events.newTopic, [newTopicData]);
}; };
var topicSuccessCallback = function (topicModel, response) { var topicSuccessCallback = function (topicModel, response) {
if (Metamaps.Active.Map) { if (Metamaps.Active.Map) {
mapping.save({ topic_id: topicModel.id }, { mapping.save({ mappable_id: topicModel.id }, {
success: mappingSuccessCallback, success: mappingSuccessCallback,
error: function (model, response) { error: function (model, response) {
console.log('error saving mapping to database'); console.log('error saving mapping to database');
@ -4075,10 +4119,10 @@ Metamaps.Topic = {
Metamaps.Topics.add(topic); Metamaps.Topics.add(topic);
var mapping = new Metamaps.Backbone.Mapping({ var mapping = new Metamaps.Backbone.Mapping({
category: "Topic",
xloc: Metamaps.Create.newTopic.x, xloc: Metamaps.Create.newTopic.x,
yloc: Metamaps.Create.newTopic.y, yloc: Metamaps.Create.newTopic.y,
topic_id: topic.cid mappable_id: topic.cid,
mappable_type: "Topic",
}); });
Metamaps.Mappings.add(mapping); Metamaps.Mappings.add(mapping);
@ -4097,10 +4141,10 @@ Metamaps.Topic = {
var topic = self.get(id); var topic = self.get(id);
var mapping = new Metamaps.Backbone.Mapping({ var mapping = new Metamaps.Backbone.Mapping({
category: "Topic",
xloc: Metamaps.Create.newTopic.x, xloc: Metamaps.Create.newTopic.x,
yloc: Metamaps.Create.newTopic.y, yloc: Metamaps.Create.newTopic.y,
topic_id: topic.id mappable_type: "Topic",
mappable_id: topic.id,
}); });
Metamaps.Mappings.add(mapping); Metamaps.Mappings.add(mapping);
@ -4115,10 +4159,10 @@ Metamaps.Topic = {
var nextCoords = Metamaps.Map.getNextCoord(); var nextCoords = Metamaps.Map.getNextCoord();
var mapping = new Metamaps.Backbone.Mapping({ var mapping = new Metamaps.Backbone.Mapping({
category: "Topic",
xloc: nextCoords.x, xloc: nextCoords.x,
yloc: nextCoords.y, yloc: nextCoords.y,
topic_id: topic.id mappable_type: "Topic",
mappable_id: topic.id,
}); });
Metamaps.Mappings.add(mapping); Metamaps.Mappings.add(mapping);
@ -4189,14 +4233,14 @@ Metamaps.Synapse = {
var mappingSuccessCallback = function (mappingModel, response) { var mappingSuccessCallback = function (mappingModel, response) {
var newSynapseData = { var newSynapseData = {
mappingid: mappingModel.id, mappingid: mappingModel.id,
synapseid: mappingModel.get('synapse_id') mappableid: mappingModel.get('mappable_id')
}; };
$(document).trigger(Metamaps.JIT.events.newSynapse, [newSynapseData]); $(document).trigger(Metamaps.JIT.events.newSynapse, [newSynapseData]);
}; };
var synapseSuccessCallback = function (synapseModel, response) { var synapseSuccessCallback = function (synapseModel, response) {
if (Metamaps.Active.Map) { if (Metamaps.Active.Map) {
mapping.save({ synapse_id: synapseModel.id }, { mapping.save({ mappable_id: synapseModel.id }, {
success: mappingSuccessCallback success: mappingSuccessCallback
}); });
} }
@ -4246,15 +4290,15 @@ Metamaps.Synapse = {
node1 = synapsesToCreate[i]; node1 = synapsesToCreate[i];
topic1 = node1.getData('topic'); topic1 = node1.getData('topic');
synapse = new Metamaps.Backbone.Synapse({ synapse = new Metamaps.Backbone.Synapse({
desc: Metamaps.Create.newSynapse.description, desc: Metamaps.Create.newSynapse.description,// || "",
node1_id: topic1.isNew() ? topic1.cid : topic1.id, node1_id: topic1.isNew() ? topic1.cid : topic1.id,
node2_id: topic2.isNew() ? topic2.cid : topic2.id, node2_id: topic2.isNew() ? topic2.cid : topic2.id,
}); });
Metamaps.Synapses.add(synapse); Metamaps.Synapses.add(synapse);
mapping = new Metamaps.Backbone.Mapping({ mapping = new Metamaps.Backbone.Mapping({
category: "Synapse", mappable_type: "Synapse",
synapse_id: synapse.cid mappable_id: synapse.cid,
}); });
Metamaps.Mappings.add(mapping); Metamaps.Mappings.add(mapping);
@ -4274,8 +4318,8 @@ Metamaps.Synapse = {
var synapse = self.get(id); var synapse = self.get(id);
var mapping = new Metamaps.Backbone.Mapping({ var mapping = new Metamaps.Backbone.Mapping({
category: "Synapse", mappable_type: "Synapse",
synapse_id: synapse.id mappable_id: synapse.id,
}); });
Metamaps.Mappings.add(mapping); Metamaps.Mappings.add(mapping);
@ -4755,7 +4799,7 @@ Metamaps.Map.InfoBox = {
obj["map_creator_tip"] = isCreator ? self.changePermissionText : ""; obj["map_creator_tip"] = isCreator ? self.changePermissionText : "";
obj["contributors_class"] = Metamaps.Mappers.length > 1 ? "multiple" : ""; obj["contributors_class"] = Metamaps.Mappers.length > 1 ? "multiple" : "";
obj["contributors_class"] += Metamaps.Mappers.length === 2 ? " mTwo" : ""; obj["contributors_class"] += Metamaps.Mappers.length === 2 ? " mTwo" : "";
obj["contributor_image"] = Metamaps.Mappers.length > 0 ? Metamaps.Mappers.models[0].get("image") : "/assets/user.png"; obj["contributor_image"] = Metamaps.Mappers.length > 0 ? Metamaps.Mappers.models[0].get("image") : "<%= asset_path('user.png') %>";
obj["contributor_list"] = self.createContributorList(); obj["contributor_list"] = self.createContributorList();
obj["user_name"] = isCreator ? "You" : map.get("user_name"); obj["user_name"] = isCreator ? "You" : map.get("user_name");
obj["created_at"] = map.get("created_at_clean"); obj["created_at"] = map.get("created_at_clean");
@ -4852,7 +4896,7 @@ Metamaps.Map.InfoBox = {
if (Metamaps.Mappers.length === 2) contributors_class = "multiple mTwo"; if (Metamaps.Mappers.length === 2) contributors_class = "multiple mTwo";
else if (Metamaps.Mappers.length > 2) contributors_class = "multiple"; else if (Metamaps.Mappers.length > 2) contributors_class = "multiple";
var contributors_image = "/assets/user.png"; var contributors_image = "<%= asset_path('user.png') %>";
if (Metamaps.Mappers.length > 0) { if (Metamaps.Mappers.length > 0) {
// get the first contributor and use their image // get the first contributor and use their image
contributors_image = Metamaps.Mappers.models[0].get("image"); contributors_image = Metamaps.Mappers.models[0].get("image");
@ -5033,7 +5077,7 @@ Metamaps.Account = {
var self = Metamaps.Account; var self = Metamaps.Account;
$('.userImageDiv canvas').remove(); $('.userImageDiv canvas').remove();
$('.userImageDiv img').attr('src', '/assets/user.png').show(); $('.userImageDiv img').attr('src', '<%= asset_path('user.png') %>').show();
$('.userImageMenu').hide(); $('.userImageMenu').hide();
var input = $('#user_image'); var input = $('#user_image');

View file

@ -78,7 +78,7 @@ html {
} }
body { body {
background: #d8d9da url(shattered_@2X.png); background: #d8d9da url(<%= asset_data_uri('shattered_@2X.png') %>);
font-family: 'din-medium', helvetica, sans-serif; font-family: 'din-medium', helvetica, sans-serif;
color: #424242; color: #424242;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
@ -300,7 +300,7 @@ input[type="submit"]:active {
display: none; display: none;
width: 40px; width: 40px;
height: 40px; height: 40px;
background-image: url(photo.png); background-image: url(<%= asset_data_uri('photo.png') %>);
position: absolute; position: absolute;
top: 22px; top: 22px;
left: 22px; left: 22px;
@ -413,7 +413,7 @@ input[type="submit"]:active {
} }
.accountName:hover .nameEdit:after { .accountName:hover .nameEdit:after {
background:url(edit.png)no-repeat; background: url(<%= asset_data_uri('edit.png') %>) no-repeat;
content:" "; content:" ";
position:absolute; position:absolute;
width:25px; width:25px;
@ -547,7 +547,7 @@ input[type="submit"]:active {
display: block; display: block;
height: 16px; height: 16px;
width: 16px; width: 16px;
background-image: url(metacodesettings_sprite.png); background-image: url(<%= asset_data_uri('metacodesettings_sprite.png') %>);
position: absolute; position: absolute;
z-index: 2; z-index: 2;
top: 20px; top: 20px;
@ -652,7 +652,7 @@ label {
box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4); box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4);
} }
.headertop .tab { .headertop .tab {
background: url(tab.png) no-repeat 0 0; background: url('tab.png') no-repeat 0 0;
position: absolute; position: absolute;
top: -11px; top: -11px;
right: -2px; right: -2px;
@ -719,7 +719,7 @@ label {
.accountInnerArrow { .accountInnerArrow {
width:16px; width:16px;
height:16px; height:16px;
background-image: url(arrowdown_sprite.png); background-image: url(<%= asset_data_uri('arrowdown_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
position:absolute; position:absolute;
top: 8px; top: 8px;
@ -783,7 +783,7 @@ label {
position:absolute; position:absolute;
pointer-events:none; pointer-events:none;
background-repeat:no-repeat; background-repeat:no-repeat;
background-image: url(user_sprite.png); background-image: url(<%= asset_data_uri('user_sprite.png') %>);
} }
.accountSettings .accountIcon { .accountSettings .accountIcon {
background-position: 0 0; background-position: 0 0;
@ -813,7 +813,7 @@ li.accountInvite span {
padding: 9px 0 9px 62px; padding: 9px 0 9px 62px;
} }
.accountImage { .accountImage {
background-image: url(user.png); background-image: url(<%= asset_data_uri 'user.png' %>);
background-size: 84px 84px; background-size: 84px 84px;
background-repeat: no-repeat; background-repeat: no-repeat;
height:84px; height:84px;
@ -1145,7 +1145,7 @@ h3.realtimeBoxTitle {
position: absolute; position: absolute;
top: 4px; top: 4px;
right: 0; right: 0;
background-image: url('junto24_sprite.png'); background-image: url(<%= asset_data_uri('junto24_sprite.png') %>);
} }
.realtimeMapperList .littleRtOff .littleJuntoIcon { .realtimeMapperList .littleRtOff .littleJuntoIcon {
background-position: 0 0; background-position: 0 0;
@ -1222,7 +1222,7 @@ h3.realtimeBoxTitle {
position: absolute; position: absolute;
top: 0; top: 0;
left: 4px; left: 4px;
background-image: url(context_sprite.png); background-image: url(<%= asset_data_uri('context_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
width: 24px; width: 24px;
height: 24px; height: 24px;
@ -1238,7 +1238,7 @@ h3.realtimeBoxTitle {
} }
.rightclickmenu .rc-center .rc-icon { .rightclickmenu .rc-center .rc-icon {
background-image: url(context_topicview_sprite.png); background-image: url(<%= asset_data_uri('context_topicview_sprite.png') %>);
} }
.rightclickmenu .rc-popout .rc-icon { .rightclickmenu .rc-popout .rc-icon {
background-position: 0 -72px; background-position: 0 -72px;
@ -1251,7 +1251,7 @@ h3.realtimeBoxTitle {
} }
.rightclickmenu .rc-siblings .rc-icon { .rightclickmenu .rc-siblings .rc-icon {
background-position: 0 -24px; background-position: 0 -24px;
background-image: url(context_topicview_sprite.png); background-image: url(<%= asset_data_uri('context_topicview_sprite.png') %>);
} }
.rightclickmenu .expandLi { .rightclickmenu .expandLi {
position: absolute; position: absolute;
@ -1259,7 +1259,7 @@ h3.realtimeBoxTitle {
right: 8px; right: 8px;
width: 16px; width: 16px;
height: 16px; height: 16px;
background-image: url(arrowright_sprite.png); background-image: url(<%= asset_data_uri('arrowright_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 -32px; background-position: 0 -32px;
} }
@ -1294,7 +1294,7 @@ h3.realtimeBoxTitle {
position: absolute; position: absolute;
top: 0; top: 0;
left: 4px; left: 4px;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
background-size: 72px 48px; background-size: 72px 48px;
background-repeat: no-repeat; background-repeat: no-repeat;
width: 24px; width: 24px;
@ -1339,7 +1339,7 @@ h3.realtimeBoxTitle {
right: 4px; right: 4px;
width: 16px; width: 16px;
height: 16px; height: 16px;
background-image: url(arrowright_sprite.png); background-image: url(<%= asset_data_uri('arrowright_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 -32px; background-position: 0 -32px;
} }
@ -1373,13 +1373,14 @@ h3.realtimeBoxTitle {
/* topic and synapse autocomplete */ /* topic and synapse autocomplete */
#new_topic .tt-suggestion.tt-is-under-cursor, #new_topic .tt-suggestion:hover,
#new_topic .tt-suggestion.tt-is-under-mouse-cursor, #new_topic .tt-suggestion.tt-cursor,
#new_synapse .tt-suggestion.tt-is-under-cursor, #new_synapse .tt-suggestion:hover,
#new_synapse .tt-suggestion.tt-is-under-mouse-cursor { #new_synapse .tt-suggestion.tt-cursor {
background: #E0E0E0; background: #E0E0E0;
} }
#new_topic .tt-suggestion, #new_topic .tt-suggestion,
#new_synapse .tt-dataset h3,
#new_synapse .tt-suggestion { #new_synapse .tt-suggestion {
background: #F5F5F5; background: #F5F5F5;
position: relative; position: relative;
@ -1418,15 +1419,15 @@ h3.realtimeBoxTitle {
top: 8px; top: 8px;
right: 8px; right: 8px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-image: url(arrowright_sprite.png); background-image: url(<%= asset_data_uri('arrowright_sprite.png') %>);
background-position: 0 -32px; background-position: 0 -32px;
} }
#new_topic .tt-suggestion.tt-is-under-cursor .expandTopicMetadata, #new_topic .tt-suggestion:hover .expandTopicMetadata,
#new_topic .tt-suggestion.tt-is-under-mouse-cursor .expandTopicMetadata { #new_topic .tt-suggestion.tt-cursor .expandTopicMetadata {
display: block; display: block;
} }
#new_topic .tt-suggestion.tt-is-under-cursor .topicMetadata, #new_topic .tt-suggestion:hover .topicMetadata,
#new_topic .tt-suggestion.tt-is-under-mouse-cursor .topicMetadata { #new_topic .tt-suggestion.tt-cursor .topicMetadata {
display: block; display: block;
} }
#new_topic .topicMetadata { #new_topic .topicMetadata {
@ -1444,7 +1445,7 @@ h3.realtimeBoxTitle {
width: 32px; width: 32px;
height: 32px; height: 32px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
position: absolute; position: absolute;
bottom: 4px; bottom: 4px;
right: 4px; right: 4px;
@ -1464,7 +1465,7 @@ h3.realtimeBoxTitle {
#new_topic .topicNumMaps { #new_topic .topicNumMaps {
height: 14px; height: 14px;
padding: 1px 0 1px 32px; padding: 1px 0 1px 32px;
background-image: url(metamap16.png); background-image: url(<%= asset_data_uri('metamap16.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 8px 0; background-position: 8px 0;
position: absolute; position: absolute;
@ -1473,7 +1474,7 @@ h3.realtimeBoxTitle {
#new_topic .topicNumSynapses { #new_topic .topicNumSynapses {
height: 14px; height: 14px;
padding: 1px 0 1px 32px; padding: 1px 0 1px 32px;
background-image: url(synapse16.png); background-image: url(<%= asset_data_uri('synapse16.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 8px 0; background-position: 8px 0;
position: absolute; position: absolute;
@ -1563,7 +1564,7 @@ h3.realtimeBoxTitle {
width: 32px; width: 32px;
height: 32px; height: 32px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
} }
/* map info box */ /* map info box */
/* map info box */ /* map info box */
@ -1603,7 +1604,7 @@ h3.realtimeBoxTitle {
resize: none; resize: none;
} }
.mapInfoBox.canEdit #mapInfoName:hover { .mapInfoBox.canEdit #mapInfoName:hover {
background-image: url(edit.png); background-image: url(<%= asset_data_uri('edit.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: bottom right; background-position: bottom right;
cursor: text; cursor: text;
@ -1757,11 +1758,11 @@ h3.realtimeBoxTitle {
} }
.mapTopics { .mapTopics {
background-image: url(topic32.png); background-image: url(<%= asset_data_uri('topic32.png') %>);
background-position: 13px center; background-position: 13px center;
} }
.mapSynapses { .mapSynapses {
background-image: url(synapse32padded.png); background-image: url(<%= asset_data_uri('synapse32padded.png') %>);
background-position: 13px center; background-position: 13px center;
} }
.mapInfoBox .mapPermission { .mapInfoBox .mapPermission {
@ -1771,7 +1772,7 @@ h3.realtimeBoxTitle {
padding: 0; padding: 0;
margin: 8px 30px 8px 10px; margin: 8px 30px 8px 10px;
position: relative; position: relative;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
} }
.mapInfoBox .mapPermission.commons { .mapInfoBox .mapPermission.commons {
background-position: 0 0; background-position: 0 0;
@ -1783,12 +1784,12 @@ h3.realtimeBoxTitle {
background-position: -32px 0; background-position: -32px 0;
} }
.yourMap .mapPermission:hover { .yourMap .mapPermission:hover {
background-image: url(arrowperms_sprite.png); background-image: url(<%= asset_data_uri('arrowperms_sprite.png') %>);
cursor: pointer; cursor: pointer;
background-position: -32px 0; background-position: -32px 0;
} }
.yourMap .mapPermission.minimize { .yourMap .mapPermission.minimize {
background-image: url(arrowperms_sprite.png) !important; background-image: url(<%= asset_data_uri('arrowperms_sprite.png') %>) !important;
cursor: pointer; cursor: pointer;
background-position: 0 0; background-position: 0 0;
} }
@ -1803,7 +1804,7 @@ h3.realtimeBoxTitle {
width: 32px; width: 32px;
height: 32px; height: 32px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
} }
.mapInfoBox .mapPermission .permissionSelect .commons { .mapInfoBox .mapPermission .permissionSelect .commons {
background-position: 0 0; background-position: 0 0;
@ -1850,7 +1851,7 @@ h3.realtimeBoxTitle {
width: 340px; width: 340px;
} }
.mapInfoBox.canEdit .mapInfoDesc:hover { .mapInfoBox.canEdit .mapInfoDesc:hover {
background-image: url(edit.png); background-image: url(<%= asset_data_uri('edit.png') %>);
background-position: top right; background-position: top right;
background-repeat: no-repeat; background-repeat: no-repeat;
cursor: text; cursor: text;
@ -1895,7 +1896,7 @@ h3.realtimeBoxTitle {
.mapInfoShareIcon { .mapInfoShareIcon {
width: 24px; width: 24px;
height: 24px; height: 24px;
background-image: url(share_sprite_mapinfo.png); background-image: url(<%= asset_data_uri('share_sprite_mapinfo.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
margin: 4px auto 0; margin: 4px auto 0;
background-position: 0 -24px; background-position: 0 -24px;
@ -1916,7 +1917,7 @@ and it won't be important on password protected instances */
width: 16px; width: 16px;
height: 16px; height: 16px;
margin: 8px auto 0; margin: 8px auto 0;
background-image: url(remove_mapinfo_sprite.png); background-image: url(<%= asset_data_uri('remove_mapinfo_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: -16px 0; background-position: -16px 0;
} }
@ -1977,7 +1978,7 @@ and it won't be important on password protected instances */
border: solid 2px #000; border: solid 2px #000;
} }
#lightbox_overlay #lightbox_main a#lightbox_close { #lightbox_overlay #lightbox_main a#lightbox_close {
background-image: url(xlightbox.png); background-image: url(<%= asset_data_uri('xlightbox.png') %>);
cursor: pointer; cursor: pointer;
height: 32px; height: 32px;
outline-style: none; outline-style: none;
@ -2076,7 +2077,7 @@ and it won't be important on password protected instances */
color: #00bcd4; color: #00bcd4;
} }
.lightbox_links .lightboxAboutIcon { .lightbox_links .lightboxAboutIcon {
background-image: url(about_sprite.png); background-image: url(<%= asset_data_uri('about_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
width:32px; width:32px;
height:32px; height:32px;
@ -2145,6 +2146,7 @@ and it won't be important on password protected instances */
display: block; display: block;
width: 100%; width: 100%;
padding: 4px 0 !important; padding: 4px 0 !important;
outline: none;
} }
.ui-tabs-vertical .ui-tabs-panel { .ui-tabs-vertical .ui-tabs-panel {
padding: 0 !important; padding: 0 !important;
@ -2181,6 +2183,7 @@ and it won't be important on password protected instances */
} }
#metacodeSwitchTabs li.ui-state-active a { #metacodeSwitchTabs li.ui-state-active a {
color: #00BCD4; color: #00BCD4;
cursor: pointer;
} }
.metacodeSwitchTab { .metacodeSwitchTab {
max-height: 300px; max-height: 300px;
@ -2351,15 +2354,15 @@ and it won't be important on password protected instances */
opacity: 0.7; opacity: 0.7;
} }
#chromeIcon { #chromeIcon {
background: url(/assets/browser_icons.png) no-repeat; background: url(<%= asset_data_uri 'browser_icons.png' %>) no-repeat;
} }
#fireFoxIcon { #fireFoxIcon {
background: url(/assets/browser_icons.png) no-repeat -105px 0; background: url(<%= asset_data_uri 'browser_icons.png' %>) no-repeat -105px 0;
} }
#safariIcon { #safariIcon {
background: url(/assets/browser_icons.png) no-repeat -220px 0; background: url(<%= asset_data_uri 'browser_icons.png' %>) no-repeat -220px 0;
} }
#chromeIcon:hover{ #chromeIcon:hover{
@ -2496,7 +2499,7 @@ and it won't be important on password protected instances */
position: relative; position: relative;
} }
.new_map .mapPermIcon { .new_map .mapPermIcon {
background-image: url(permissions64sprite.png); background-image: url(<%= asset_data_uri('permissions64sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
width:64px; width:64px;
height:64px; height:64px;
@ -2611,7 +2614,7 @@ and it won't be important on password protected instances */
} }
#zoomIn { #zoomIn {
background: #424242 url(zoom_sprite.png) no-repeat; background: #424242 url(<%= asset_data_uri('zoom_sprite.png') %>) no-repeat;
width: 22px; width: 22px;
height: 22px; height: 22px;
display: inline-block; display: inline-block;
@ -2623,7 +2626,7 @@ and it won't be important on password protected instances */
} }
#zoomOut { #zoomOut {
background: #424242 url(zoom_sprite.png) no-repeat; background: #424242 url(<%= asset_data_uri('zoom_sprite.png') %>) no-repeat;
width: 22px; width: 22px;
height: 22px; height: 22px;
display: inline-block; display: inline-block;
@ -2635,7 +2638,7 @@ and it won't be important on password protected instances */
} }
#centerMap { #centerMap {
background: #424242 url(extents_sprite.png) no-repeat; background: #424242 url(<%= asset_data_uri('extents_sprite.png') %>) no-repeat;
width: 22px; width: 22px;
height: 22px; height: 22px;
display: inline-block; display: inline-block;
@ -2940,7 +2943,7 @@ and it won't be important on password protected instances */
.compassArrow { .compassArrow {
display: none; display: none;
background-repeat: no-repeat; background-repeat: no-repeat;
background-image: url(compass_arrow.png); background-image: url(<%= asset_data_uri('compass_arrow.png') %>);
width: 48px; width: 48px;
height: 32px; height: 32px;
position: absolute; position: absolute;

View file

@ -85,7 +85,7 @@
padding: 0 16px; padding: 0 16px;
} }
.canEdit #titleActivator:hover { .canEdit #titleActivator:hover {
background-image: url(edit.png); background-image: url(<%= asset_data_uri('edit.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: bottom right; background-position: bottom right;
cursor: text; cursor: text;
@ -148,7 +148,7 @@
margin-right: 8px; margin-right: 8px;
} }
.canEdit .CardOnGraph .best_in_place_desc:hover { .canEdit .CardOnGraph .best_in_place_desc:hover {
background-image: url(edit.png); background-image: url(<%= asset_data_uri('edit.png') %>);
background-position: top right; background-position: top right;
background-repeat: no-repeat; background-repeat: no-repeat;
cursor: text; cursor: text;
@ -244,7 +244,7 @@
left: 0; left: 0;
width: 32px; width: 32px;
height: 32px; height: 32px;
background-image: url(map32_sprite.png); background-image: url(<%= asset_data_uri('map32_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 0; background-position: 0 0;
cursor: pointer; cursor: pointer;
@ -335,7 +335,7 @@
left: 0; left: 0;
width: 32px; width: 32px;
height: 32px; height: 32px;
background-image: url(synapse32_sprite.png); background-image: url(<%= asset_data_uri('synapse32_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 0; background-position: 0 0;
} }
@ -382,7 +382,7 @@
min-width: 32px; min-width: 32px;
margin-top: 8px; margin-top: 8px;
margin-left: 8px; margin-left: 8px;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
background-position: 0 0; background-position: 0 0;
} }
.mapPerm.co { .mapPerm.co {
@ -396,12 +396,12 @@
} }
.yourTopic .mapPerm:hover, .yourEdge .mapPerm:hover { .yourTopic .mapPerm:hover, .yourEdge .mapPerm:hover {
background-image: url(arrowperms_sprite.png); background-image: url(<%= asset_data_uri('arrowperms_sprite.png') %>);
background-position: -32px 0; background-position: -32px 0;
cursor:pointer; cursor:pointer;
} }
.yourTopic .mapPerm.minimize, .yourEdge .mapPerm.minimize { .yourTopic .mapPerm.minimize, .yourEdge .mapPerm.minimize {
background-image: url(arrowperms_sprite.png) !important; background-image: url(<%= asset_data_uri('arrowperms_sprite.png') %>) !important;
background-position: 0 0; background-position: 0 0;
cursor: pointer; cursor: pointer;
} }
@ -417,7 +417,7 @@ cursor: pointer;
height: 32px; height: 32px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 0; background-position: 0 0;
background-image: url(permissions32_sprite.png); background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
} }
.mapPerm .permissionSelect .commons { .mapPerm .permissionSelect .commons {
background-position: 0 0; background-position: 0 0;
@ -462,7 +462,7 @@ cursor: pointer;
right: 16px; right: 16px;
width: 16px; width: 16px;
height: 16px; height: 16px;
background-image: url(arrowright_sprite.png); background-image: url(<%= asset_data_uri('arrowright_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 -32px; background-position: 0 -32px;
} }
@ -542,7 +542,7 @@ background-color: #E0E0E0;
right: 8px; right: 8px;
width: 16px; width: 16px;
height: 16px; height: 16px;
background-image: url(arrowright_sprite.png); background-image: url(<%= asset_data_uri('arrowright_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 -32px; background-position: 0 -32px;
} }
@ -648,10 +648,10 @@ background-color: #E0E0E0;
left: 12px; left: 12px;
} }
#linkIcon { #linkIcon {
background-image: url(link_sprite.png); background-image: url(<%= asset_data_uri('link_sprite.png') %>);
} }
#uploadIcon { #uploadIcon {
background-image: url(upload_sprite.png); background-image: url(<%= asset_data_uri('upload_sprite.png') %>);
} }
#addlink:hover #linkIcon, #addupload:hover #uploadIcon { #addlink:hover #linkIcon, #addupload:hover #uploadIcon {
background-position: 0 -24px; background-position: 0 -24px;
@ -690,7 +690,7 @@ font-family: 'din-regular', helvetica, sans-serif;
height: 24px; height: 24px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 0; background-position: 0 0;
background-image: url(link_sprite.png); background-image: url(<%= asset_data_uri('link_sprite.png') %>);
pointer-events: none; pointer-events: none;
z-index: 1; z-index: 1;
} }
@ -703,7 +703,7 @@ font-family: 'din-regular', helvetica, sans-serif;
height: 32px; height: 32px;
cursor: pointer; cursor: pointer;
float:none; float:none;
background-image: url(remove.png); background-image: url(<%= asset_data_uri('remove.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
} }
@ -740,7 +740,7 @@ font-family: 'din-regular', helvetica, sans-serif;
} }
#linkremove { #linkremove {
background-image: url(/assets/remove.png); background-image: url(<%= asset_data_uri 'remove.png' %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
width: 24px; width: 24px;
@ -781,7 +781,7 @@ font-family: 'din-regular', helvetica, sans-serif;
} }
#editSynUpperBar { #editSynUpperBar {
background: #FFFFFF url(synapse32.png) no-repeat 8px center; background: #FFFFFF url(<%= asset_data_uri('synapse32.png') %>) no-repeat 8px center;
min-height: 48px; min-height: 48px;
height: 48px; height: 48px;
border-bottom: 1px solid #222222; border-bottom: 1px solid #222222;
@ -814,7 +814,7 @@ font-family: 'din-regular', helvetica, sans-serif;
} }
.canEdit #edit_synapse_desc:hover { .canEdit #edit_synapse_desc:hover {
background-image: url(edit.png); background-image: url(<%= asset_data_uri('edit.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 164px center; background-position: 164px center;
cursor: text; cursor: text;
@ -841,7 +841,7 @@ font-family: 'din-regular', helvetica, sans-serif;
height: 24px; height: 24px;
top: 12px; top: 12px;
right: 8px; right: 8px;
background-image: url(arrowdown_sprite.png); background-image: url(<%= asset_data_uri('arrowdown_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 4px -12px; background-position: 4px -12px;
} }
@ -923,11 +923,11 @@ font-family: 'din-regular', helvetica, sans-serif;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
#edit_synapse_right { #edit_synapse_right {
background-image: url(synapsedirectionright_sprite.png); background-image: url(<%= asset_data_uri('synapsedirectionright_sprite.png') %>);
right: 16px; right: 16px;
} }
#edit_synapse_left { #edit_synapse_left {
background-image: url(synapsedirectionleft_sprite.png); background-image: url(<%= asset_data_uri('synapsedirectionleft_sprite.png') %>);
right: 56px; right: 56px;
} }
#edit_synapse_left.checked, #edit_synapse_right.checked { #edit_synapse_left.checked, #edit_synapse_right.checked {
@ -1103,7 +1103,7 @@ font-family: 'din-regular', helvetica, sans-serif;
} }
.mapperMetadata { .mapperMetadata {
background: url(profile_card_sprite.png) no-repeat center 0; background: url(<%= asset_data_uri('profile_card_sprite.png') %>) no-repeat center 0;
height: 64px; height: 64px;
width: 160px; width: 160px;
margin: 16px auto 0; margin: 16px auto 0;

View file

@ -1,20 +1,20 @@
@font-face { @font-face {
font-family: 'din-medium'; font-family: 'din-medium';
src: url('/assets/Fonts/din.eot'); src: url(<%= asset_path 'Fonts/din.eot' %>);
src: url('/assets/Fonts/din.eot?#iefix') format('embedded-opentype'), src: url(<%= asset_path 'Fonts/din.eot?#iefix' %>) format('embedded-opentype'),
url('/assets/Fonts/din.woff') format('woff'), url(<%= asset_path 'Fonts/din.woff' %>) format('woff'),
url('/assets/Fonts/din.ttf') format('truetype'), url(<%= asset_path 'Fonts/din.ttf' %>) format('truetype'),
url('/assets/Fonts/din.svg#din-medium') format('svg'); url(<%= asset_path 'Fonts/din.svg#din-medium' %>) format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@font-face { @font-face {
font-family: 'din-regular'; font-family: 'din-regular';
src: url('/assets/Fonts/din-reg.eot'); src: url(<%= asset_path 'Fonts/din-reg.eot' %>);
src: url('/assets/Fonts/din-reg.eot?#iefix') format('embedded-opentype'), src: url(<%= asset_path 'Fonts/din-reg.eot?#iefix' %>) format('embedded-opentype'),
url('/assets/Fonts/din-reg.woff') format('woff'), url(<%= asset_path 'Fonts/din-reg.woff' %>) format('woff'),
url('/assets/Fonts/din-reg.ttf') format('truetype'), url(<%= asset_path 'Fonts/din-reg.ttf' %>) format('truetype'),
url('/assets/Fonts/din-reg.svg#din-reg') format('svg'); url(<%= asset_path 'Fonts/din-reg.svg#din-reg' %>) format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -134,7 +134,7 @@
width: 40px; width: 40px;
height: 32px; height: 32px;
background-color: #757575; background-color: #757575;
background-image: url(home_light.png); background-image: url(<%= asset_data_uri('home_light.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
border-top-left-radius: 2px; border-top-left-radius: 2px;
@ -142,7 +142,7 @@
float:left; float:left;
} }
.homeButton:hover { .homeButton:hover {
background-image: url(home_light.png); background-image: url(<%= asset_data_uri('home_light.png') %>);
} }
.homeButton a { .homeButton a {
display:block; display:block;
@ -150,470 +150,6 @@
height: 32px; height: 32px;
} }
/* search */
.sidebarSearch {
float:left;
height: 32px;
position: relative;
}
#searchLoading {
height: 24px;
width: 24px;
position: absolute;
top: 4px;
right: 76px;
display: none;
}
.unauthenticated .homePage .sidebarSearchIcon {
border-radius: 2px;
}
.sidebarSearchIcon {
float: left;
width: 72px;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
height: 32px;
background: #4fb5c0 url('search.png') no-repeat center center;
background-size: 32px 32px;
cursor: pointer;
}
.sidebarSearch .twitter-typeahead, .sidebarSearch .sidebarSearchField {
float: left;
}
.unauthenticated .homePage .sidebarSearchField,
.unauthenticated .homePage .sidebarSearch .tt-hint {
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
}
.explorePage .sidebarSearchField,
.explorePage .sidebarSearch .tt-hint {
width: 380px;
padding: 5px 10px 5px 10px;
}
.sidebarSearchField {
color: #424242;
}
.sidebarSearch .tt-hint {
color: transparent;
}
.sidebarSearchField,
.sidebarSearch .tt-hint {
height: 20px;
border-top: 1px solid #BDBDBD;
border-bottom: 1px solid #BDBDBD;
border-left: none;
border-right: none;
padding: 5px 0 5px 0;
width: 0px;
margin: 0;
outline: none;
font-size: 14px;
line-height: 14px;
background: #F5F5F5;
font-family: 'din-medium', helvetica, sans-serif;
}
.sidebarSearch .tt-dropdown-menu {
top: 40px !important;
background: #F5F5F5;
width: 472px;
overflow-y: auto;
overflow-x: visible;
box-shadow: 0 10px 10px rgba(0,0,0,0.19), 0 6px 3px rgba(0,0,0,0.23);
}
.autoOptions #mapContribs {
width: 15px;
height: 15px;
border: 1px solid #424242;
margin-top: 4px;
margin-left: 4px;
}
.mapContributorsIcon span {
margin-left: 5px;
}
.mapContributorsIcon li span {
margin-left: 10px;
}
.searchHeader {
height: 42px;
width: 100%;
position: relative;
}
.searchTopicsHeader {
background: #4fc4a8;
}
.searchMapsHeader {
background: #994fc0;
}
.searchMappersHeader {
background: #c04f4f;
}
.sidebarSearch .tt-dropdown-menu h3 {
text-transform: uppercase;
color: #F5F5F5;
font-size: 18px;
line-height: 18px;
margin: 12px 0 3px 16px;
float: left;
}
.sidebarSearch .tt-dropdown-menu .limitToMe {
float: left;
width: 12px;
height: 12px;
border: 1px;
color: #000000;
position: absolute;
top: 15px;
left: 136px;
}
.sidebarSearch .tt-dropdown-menu .limitToMeLabel {
float: left;
font-family: 'din-medium', helvetica, sans-serif;
font-size: 12px;
color: #f5f5f5;
margin: 0;
position: absolute;
top: 15px;
left: 156px;
}
.sidebarSearch .tt-dropdown-menu .minimizeResults, .sidebarSearch .tt-dropdown-menu .maximizeResults {
width: 32px;
height: 32px;
background-image: url(arrowpermswhite_sprite.png);
background-repeat: no-repeat;
cursor: pointer;
position: absolute;
top: 5px;
left: 410px;
}
.sidebarSearch .tt-dropdown-menu .minimizeResults {
background-position: 0 0;
}
.sidebarSearch .tt-dropdown-menu .maximizeResults {
background-position: -32px 0;
}
.sidebarSearch .tt-suggestions {
overflow: visible;
}
.sidebarSearch .tt-suggestion {
position: relative;
background: #FFF;
padding: 8px 0;
}
.sidebarSearch .tt-is-under-cursor,
.sidebarSearch .tt-is-under-mouse-cursor {
background: #E0E0E0;
}
.resultmap, .resulttopic, .resultmapper, .resultnoresult {
min-height: 48px;
display: table;
}
/*.sidebarSearch .tt-dataset-maps .tt-is-under-cursor .resultmap,
.sidebarSearch .tt-dataset-maps .tt-is-under-mouse-cursor .resultmap,
.sidebarSearch .tt-dataset-topics .tt-is-under-cursor .resulttopic,
.sidebarSearch .tt-dataset-topics .tt-is-under-mouse-cursor .resulttopic {
min-height: 48px;
}*/
.sidebarSearch .tt-suggestion .searchResIconWrapper {
display: table-cell;
vertical-align: middle;
height: 32px;
padding: 0 18px 0 28px;
}
.sidebarSearch .tt-suggestion .icon {
width: 32px;
height: 32px;
border-radius:16px;
}
.sidebarSearch .topicMetacode {
display: table-cell;
vertical-align: middle;
padding: 0 0 0 8px;
width: 70px;
}
.sidebarSearch .tt-dataset-topics .topicIcon {
width: 32px;
height: 32px;
margin: 0 auto;
}
.sidebarSearch .tt-dataset-topics .metacodeTip {
display: none;
margin: 0 auto;
}
.sidebarSearch .tt-dataset-topics .tt-is-under-cursor .metacodeTip,
.sidebarSearch .tt-dataset-topics .tt-is-under-mouse-cursor .metacodeTip {
display: block;
font-family: 'vinyl';
text-transform: uppercase;
font-style: italic;
font-size: 13px;
margin: 0 5px 0 2px;
text-align: center;
}
.sidebarSearch .tt-dataset-mappers .tt-suggestion .icon {
margin: 0px 0px 0px 0px;
}
.sidebarSearch .tt-dataset-mappers .resultText {
width: 150px;
}
.sidebarSearch .resultText {
width: 260px;
display: table-cell;
padding-left: 8px;
vertical-align: middle;
word-wrap: break-word;
}
.sidebarSearch .resultTitle {
font-weight: normal;
font-size: 16px;
line-height: 20px;
width: 100%;
font-family: 'din-regular', helvetica, sans-serif;
}
.sidebarSearch .resultDesc {
font-size: 12px;
line-height: 16px;
width: 100%;
font-style: italic;
font-family: helvetica, sans-serif;
}
.sidebarSearch .tip {
display: none;
}
.sidebarSearch div.autoOptions {
width: 114px;
height: 48px;
position: absolute;
display: none;
top: 8px;
right: 0;
}
.tt-dataset-maps div.autoOptions {
width: 84px;
}
.sidebarSearch .tt-dataset-mappers .autoOptions {
width: 235px;
}
.sidebarSearch .tt-is-under-cursor .autoOptions,
.sidebarSearch .tt-is-under-mouse-cursor .autoOptions {
display: block;
}
.sidebarSearch .tt-suggestion .resultnoresult .autoOptions {
display: none;
}
.sidebarSearch .autoOptions button,
.sidebarSearch .autoOptions a,
.sidebarSearch .autoOptions div {
position: absolute;
padding: 0;
margin: 0;
border: none;
outline: none;
}
.sidebarSearch button.addToMap {
display:none;
width: 24px;
height: 24px;
background: url(addtopic_sprite.png);
background-repeat: no-repeat;
background-size: 48px 24px;
top: 12px;
left: 80px;
cursor: pointer;
}
.canEditMap button.addToMap {
display: block;
}
.sidebarSearch button.addToMap:hover {
background-position: -24px;
}
.sidebarSearch div.topicCount {
width: 24px;
height: 24px;
background: url(topic16.png);
background-repeat: no-repeat;
background-position: 0 center;
top: 0;
left: 0;
padding-left: 18px;
font-size: 12px;
line-height: 24px;
}
.sidebarSearch div.mapCount {
width: 24px;
height: 24px;
background: url(metamap16.png);
background-repeat: no-repeat;
background-position: 0 center;
left: 0;
padding-left: 20px;
font-size: 12px;
line-height: 24px;
}
.sidebarSearch div.synapseCount {
width: 24px;
height: 24px;
background: url(synapse16.png);
background-repeat: no-repeat;
background-position: 0 center;
top: 24px;
left: 0;
padding-left: 20px;
font-size: 12px;
line-height: 24px;
}
.sidebarSearch div.topicOriginatorIcon {
width: 18px;
height: 18px;
padding: 3px;
top: 0;
left: 44px;
}
.sidebarSearch .topicOriginatorIcon img {
border-radius: 9px;
}
.sidebarSearch .topicOriginatorIcon .tip {
right: 30px;
top: 1px;
}
.sidebarSearch .tip {
position: absolute;
background: #424242;
width: auto;
top: 2px;
right: 25px;
color: white;
white-space: nowrap;
border-radius: 2px;
font-size: 12px !important;
font-family: 'din-regular';
line-height: 12px;
padding: 4px 4px 4px;
z-index: 100;
}
.sidebarSearch .hoverForTip:hover .tip {
display: block;
}
.sidebarSearch .mapContributorsIcon .tip {
right: 40px;
top: -5px;
padding-top: 5px;
padding-bottom: 5px;
}
.sidebarSearch .hoverForTip .tip li {
padding-left: 28px;
padding-top: 4px;
}
.tipUserImage {
position: absolute;
top: 0px;
left: 7px;
border-radius: 14px;
}
.sidebarSearch .hoverForTip .tip:before {
content: '';
position: absolute;
width: 0;
height: 0;
border-left: 4px solid #424242;
border-top: 5px solid transparent;
border-bottom: 5px solid transparent;
}
.sidebarSearch .hoverForTip.addToMap .tip {
right: 30px;
}
.sidebarSearch .hoverForTip.addToMap .tip:before {
right: -4px;
}
.sidebarSearch .mapContributorsIcon .tip:before {
top: 12px;
right: -4px;
}
.sidebarSearch .topicOriginatorIcon .tip:before {
top: 5px;
right: -4px;
}
.sidebarSearch .mapContributorsIcon .mapContributors {
top: auto;
right: 0;
bottom: 21px;
white-space: normal;
width: 200px;
}
.sidebarSearch div.mapContributorsIcon {
height: 24px;
top: 0;
left: 44px;
font-size: 12px;
line-height: 24px;
}
.sidebarSearch div.topicPermission,
.sidebarSearch div.mapPermission {
width: 24px;
height: 24px;
background-image: url(permissions32_sprite.png);
background-repeat: no-repeat;
background-size: 72px 48px !important;
top: 24px;
left: 44px;
}
.sidebarSearch div.topicPermission.commons,
.sidebarSearch div.mapPermission.commons {
background-position: 0 0;
}
.sidebarSearch div.topicPermission.public,
.sidebarSearch div.mapPermission.public {
background-position: -48px 0;
}
.sidebarSearch div.topicPermission.private,
.sidebarSearch div.mapPermission.private {
background-position: -24px 0;
}
.sidebarSearch .tt-dataset-mappers div.mapCount {
top: 8px;
left: 170px;
}
.sidebarSearch .tt-dataset-mappers div.mapperCreated {
left: 0px;
padding-left: 0px;
font-size: 12px;
font-family: 'din-medium', helvetica, sans-serif;
line-height: 24px;
}
.sidebarSearch .tt-dataset-mappers div.mapperGeneration {
top: 20px;
left: 0px;
padding-left: 0px;
font-size: 12px;
font-family: 'din-medium', helvetica, sans-serif;
line-height: 24px;
}
/* end search */
/* end upperLeftUI */ /* end upperLeftUI */
/* upperRightUI */ /* upperRightUI */
@ -665,7 +201,7 @@
.upperRightIcon { .upperRightIcon {
width: 32px; width: 32px;
height: 32px; height: 32px;
background-image: url('topright_sprite.png'); background-image: url(<%= asset_data_uri('topright_sprite.png') %>);
background-repeat: no-repeat; background-repeat: no-repeat;
cursor: pointer; cursor: pointer;
} }
@ -816,12 +352,12 @@
} }
.fullWidthWrapper.withPartners { .fullWidthWrapper.withPartners {
background: url(homepage_bg_fade.png) no-repeat center -300px; background: url(<%= asset_data_uri('homepage_bg_fade.png') %>) no-repeat center -300px;
} }
.homeWrapper.homePartners { .homeWrapper.homePartners {
padding: 64px 0 280px; padding: 64px 0 280px;
height: 96px; height: 96px;
background: url(partner_logos.png) no-repeat 0 64px; background: url(<%= asset_data_uri('partner_logos.png') %>) no-repeat 0 64px;
} }
.github-fork-ribbon-wrapper { .github-fork-ribbon-wrapper {
@ -863,7 +399,7 @@
cursor: pointer; cursor: pointer;
} }
.openCheatsheet { .openCheatsheet {
background-image: url('help_sprite.png'); background-image: url(<%= asset_data_uri('help_sprite.png') %>);
background-repeat:no-repeat; background-repeat:no-repeat;
} }
.openCheatsheet:hover { .openCheatsheet:hover {
@ -872,7 +408,7 @@
.mapInfoIcon { .mapInfoIcon {
position: relative; position: relative;
top: 56px; /* puts it just offscreen */ top: 56px; /* puts it just offscreen */
background-image: url('mapinfo_sprite.png'); background-image: url(<%= asset_data_uri('mapinfo_sprite.png') %>);
background-repeat:no-repeat; background-repeat:no-repeat;
} }
.mapInfoIcon:hover { .mapInfoIcon:hover {
@ -918,7 +454,7 @@
.takeScreenshot { .takeScreenshot {
margin-bottom: 5px; margin-bottom: 5px;
border-radius: 2px; border-radius: 2px;
background-image: url(screenshot_sprite.png); background-image: url(<%= asset_data_uri 'screenshot_sprite.png' %>);
display: none; display: none;
} }
.takeScreenshot:hover { .takeScreenshot:hover {
@ -931,7 +467,7 @@
.zoomExtents { .zoomExtents {
margin-bottom:5px; margin-bottom:5px;
border-radius: 2px; border-radius: 2px;
background-image: url(extents_sprite.png); background-image: url(<%= asset_data_uri('extents_sprite.png') %>);
} }
.zoomExtents:hover { .zoomExtents:hover {
@ -1076,7 +612,7 @@
} }
.zoomIn { .zoomIn {
background-image: url(zoom_sprite.png); background-image: url(<%= asset_data_uri('zoom_sprite.png') %>);
background-position: 0 /…0; background-position: 0 /…0;
border-top-left-radius: 2px; border-top-left-radius: 2px;
border-top-right-radius: 2px; border-top-right-radius: 2px;
@ -1085,7 +621,7 @@
background-position: -32px 0; background-position: -32px 0;
} }
.zoomOut { .zoomOut {
background-image: url(zoom_sprite.png); background-image: url(<%= asset_data_uri('zoom_sprite.png') %>);
background-position:0 -32px; background-position:0 -32px;
border-bottom-left-radius: 2px; border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px; border-bottom-right-radius: 2px;
@ -1163,15 +699,15 @@
left:5px; left:5px;
} }
.exploreMapsCenter .myMaps .exploreMapsIcon { .exploreMapsCenter .myMaps .exploreMapsIcon {
background-image: url(exploremaps_sprite.png); background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>);
background-position: 0 0; background-position: 0 0;
} }
.exploreMapsCenter .activeMaps .exploreMapsIcon { .exploreMapsCenter .activeMaps .exploreMapsIcon {
background-image: url(exploremaps_sprite.png); background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>);
background-position: -32px 0; background-position: -32px 0;
} }
.exploreMapsCenter .featuredMaps .exploreMapsIcon { .exploreMapsCenter .featuredMaps .exploreMapsIcon {
background-image: url(exploremaps_sprite.png); background-image: url(<%= asset_data_uri 'exploremaps_sprite.png' %>);
background-position: -64px 0; background-position: -64px 0;
} }
.myMaps:hover .exploreMapsIcon, .myMaps.active .exploreMapsIcon { .myMaps:hover .exploreMapsIcon, .myMaps.active .exploreMapsIcon {
@ -1212,7 +748,7 @@
/* feedback */ /* feedback */
body a#barometer_tab { body a#barometer_tab {
background-image: url(feedback_sprite.png); background-image: url(<%= asset_path 'feedback_sprite.png' %>);
background-position: 0 0; background-position: 0 0;
background-color: transparent; background-color: transparent;
height: 110px; height: 110px;

View file

@ -243,25 +243,25 @@ body .ui-tooltip { border-width: 2px; }
.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } .ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
.ui-widget .ui-widget { font-size: 1em; } .ui-widget .ui-widget { font-size: 1em; }
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } .ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(<%= asset_data_uri('ui-bg_flat_75_ffffff_40x100.png') %>)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
.ui-widget-content a { color: #222222/*{fcContent}*/; } .ui-widget-content a { color: #222222/*{fcContent}*/; }
.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } .ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(<%= asset_data_uri('images/ui-bg_highlight-soft_75_cccccc_1x100.png') %>)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
.ui-widget-header a { color: #222222/*{fcHeader}*/; } .ui-widget-header a { color: #222222/*{fcHeader}*/; }
/* Interaction states /* Interaction states
----------------------------------*/ ----------------------------------*/
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(<%= asset_data_uri('images/ui-bg_glass_75_e6e6e6_1x400.png') %>)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 0px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 0px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(<%= asset_data_uri('images/ui-bg_glass_75_dadada_1x400.png') %>)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121/*{fcHover}*/; text-decoration: none; } .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121/*{fcHover}*/; text-decoration: none; }
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(<%= asset_data_uri('images/ui-bg_glass_65_ffffff_1x400.png') %>)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
/* Interaction Cues /* Interaction Cues
----------------------------------*/ ----------------------------------*/
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(<%= asset_data_uri('images/ui-bg_glass_55_fbf9ee_1x400.png') %>)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(<%= asset_data_uri('images/ui-bg_glass_95_fef1ec_1x400.png') %>)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
@ -273,14 +273,14 @@ body .ui-tooltip { border-width: 2px; }
----------------------------------*/ ----------------------------------*/
/* states and images */ /* states and images */
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } .ui-icon { width: 16px; height: 16px; background-image: url(<%= asset_data_uri('images/ui-icons_222222_256x240.png') %>)/*{iconsContent}*/; }
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } .ui-widget-content .ui-icon {background-image: url(<%= asset_data_uri('images/ui-icons_222222_256x240.png') %>)/*{iconsContent}*/; }
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } .ui-widget-header .ui-icon {background-image: url(<%= asset_data_uri('images/ui-icons_222222_256x240.png') %>)/*{iconsHeader}*/; }
.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } .ui-state-default .ui-icon { background-image: url(<%= asset_data_uri('images/ui-icons_888888_256x240.png') %>)/*{iconsDefault}*/; }
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(<%= asset_data_uri('images/ui-icons_454545_256x240.png') %>)/*{iconsHover}*/; }
.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } .ui-state-active .ui-icon {background-image: url(<%= asset_data_uri('images/ui-icons_454545_256x240.png') %>)/*{iconsActive}*/; }
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } .ui-state-highlight .ui-icon {background-image: url(<%= asset_data_uri('images/ui-icons_2e83ff_256x240.png') %>)/*{iconsHighlight}*/; }
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(<%= asset_data_uri('images/ui-icons_cd0a0a_256x240.png') %>)/*{iconsError}*/; }
/* positioning */ /* positioning */
.ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-n { background-position: 0 0; }
@ -470,5 +470,5 @@ body .ui-tooltip { border-width: 2px; }
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
/* Overlays */ /* Overlays */
.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } .ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(<%= asset_data_uri('images/ui-bg_flat_0_aaaaaa_40x100.png') %>)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } .ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/<%= asset_data_uri('ui-bg_flat_0_aaaaaa_40x100.png') %>)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }

View file

@ -162,7 +162,6 @@
.mCSB_scrollTools .mCSB_buttonDown, .mCSB_scrollTools .mCSB_buttonDown,
.mCSB_scrollTools .mCSB_buttonLeft, .mCSB_scrollTools .mCSB_buttonLeft,
.mCSB_scrollTools .mCSB_buttonRight{ .mCSB_scrollTools .mCSB_buttonRight{
background-image:url(mCSB_buttons.png);
background-repeat:no-repeat; background-repeat:no-repeat;
opacity:0.4; opacity:0.4;
filter:"alpha(opacity=40)"; -ms-filter:"alpha(opacity=40)"; /* old ie */ filter:"alpha(opacity=40)"; -ms-filter:"alpha(opacity=40)"; /* old ie */

View file

@ -0,0 +1,492 @@
#searchLoading {
height: 24px;
width: 24px;
position: absolute;
top: 4px;
right: 76px;
display: none;
}
.unauthenticated {
.homePage .sidebarSearchIcon {
border-radius: 2px;
}
.homePage .sidebarSearchField,
.homePage .sidebarSearch .tt-hint {
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
}
}
.sidebarSearchIcon {
float: left;
width: 72px;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
height: 32px;
background: #4fb5c0 url(<%= asset_data_uri('search.png') %>) no-repeat center center;
background-size: 32px 32px;
cursor: pointer;
}
.autoOptions #mapContribs {
width: 15px;
height: 15px;
border: 1px solid #424242;
margin-top: 4px;
margin-left: 4px;
}
.mapContributorsIcon span {
margin-left: 5px;
}
.mapContributorsIcon li span {
margin-left: 10px;
}
.searchHeader {
height: 42px;
width: 100%;
position: relative;
}
.searchTopicsHeader {
background: #4fc4a8;
}
.searchMapsHeader {
background: #994fc0;
}
.searchMappersHeader {
background: #c04f4f;
}
.resultmap, .resulttopic, .resultmapper, .resultnoresult {
min-height: 48px;
display: table;
width: 100%;
}
.canEditMap button.addToMap {
display: block;
}
.tipUserImage {
position: absolute;
top: 0px;
left: 7px;
border-radius: 14px;
}
/* main search selector */
.sidebarSearch {
float:left;
height: 32px;
position: relative;
.twitter-typeahead {
float: left;
}
.sidebarSearchField {
float: left;
height: 20px;
border-top: 1px solid #BDBDBD;
border-bottom: 1px solid #BDBDBD;
border-left: none;
border-right: none;
padding: 5px 0 5px 0;
width: 0px;
margin: 0;
outline: none;
font-size: 14px;
line-height: 14px;
background: #F5F5F5;
font-family: 'din-medium', helvetica, sans-serif;
color: #424242;
}
.tt-hint {
color: transparent;
height: 20px;
border-top: 1px solid #BDBDBD;
border-bottom: 1px solid #BDBDBD;
border-left: none;
border-right: none;
padding: 5px 0 5px 0;
width: 0px;
margin: 0;
outline: none;
font-size: 14px;
line-height: 14px;
background: #F5F5F5;
font-family: 'din-medium', helvetica, sans-serif;
}
.tt-menu {
top: 40px !important;
background: #F5F5F5;
width: 472px;
overflow-y: auto;
overflow-x: visible;
box-shadow: 0 10px 10px rgba(0,0,0,0.19), 0 6px 3px rgba(0,0,0,0.23);
h3 {
text-transform: uppercase;
color: #F5F5F5;
font-size: 18px;
line-height: 18px;
margin: 12px 0 3px 16px;
float: left;
}
.limitToMe {
float: left;
width: 12px;
height: 12px;
border: 1px;
color: #000000;
position: absolute;
top: 15px;
left: 136px;
}
.limitToMeLabel {
float: left;
font-family: 'din-medium', helvetica, sans-serif;
font-size: 12px;
color: #f5f5f5;
margin: 0;
position: absolute;
top: 15px;
left: 156px;
}
.minimizeResults,
.maximizeResults {
width: 32px;
height: 32px;
background-image: url(<%= asset_data_uri('arrowpermswhite_sprite.png') %>);
background-repeat: no-repeat;
cursor: pointer;
position: absolute;
top: 5px;
left: 410px;
}
.minimizeResults {
background-position: 0 0;
}
.maximizeResults {
background-position: -32px 0;
}
}/* tt-menu */
.tt-suggestion {
position: relative;
background: #FFF;
padding: 8px 0;
> div {
display: table-cell;
}
&:hover {
background: #E0E0E0;
}
.icon {
width: 32px;
height: 32px;
border-radius:16px;
}
.resultText {
width: 260px;
padding-left: 8px;
vertical-align: middle;
word-wrap: break-word;
}
.resultTitle {
font-weight: normal;
font-size: 16px;
line-height: 20px;
width: 100%;
font-family: 'din-regular', helvetica, sans-serif;
}
.resultDesc {
font-size: 12px;
line-height: 16px;
width: 100%;
font-style: italic;
font-family: helvetica, sans-serif;
}
.topicMetacode,
.searchResIconWrapper {
vertical-align: middle;
padding: 0 0 0 8px;
width: 70px;
}
}/* tt-suggestion */
.tt-dataset {
overflow: visible;
}
.tt-dataset-maps {
.autoOptions {
width: 84px;
}
}/* .tt-dataset-maps */
.tt-dataset-topics {
.topicIcon {
width: 32px;
height: 32px;
margin: 0 auto;
}
.metacodeTip {
display: none;
margin: 0 auto;
}
.tt-cursor .metacodeTip,
.tt-suggestion:hover .metacodeTip {
display: block;
font-family: 'vinyl';
text-transform: uppercase;
font-style: italic;
font-size: 13px;
margin: 0 5px 0 2px;
text-align: center;
}
}/* tt-dataset-topics */
.tt-dataset-mappers {
.icon {
margin: 0px 0px 0px 0px;
}
.mappers .resultText {
width: 150px;
}
.autoOptions {
width: 235px;
}
.mapCount {
top: 8px;
left: 170px;
}
.mapperCreated {
left: 0px;
padding-left: 0px;
font-size: 12px;
font-family: 'din-medium', helvetica, sans-serif;
line-height: 24px;
}
.mapperGeneration {
top: 20px;
left: 0px;
padding-left: 0px;
font-size: 12px;
font-family: 'din-medium', helvetica, sans-serif;
line-height: 24px;
}
}/* tt-dataset-mappers */
.autoOptions {
width: 114px;
height: 48px;
position: absolute;
display: none;
top: 8px;
right: 0;
a,
div,
button {
position: absolute;
margin: 0;
border: none;
outline: none;
}
}/* .autoOptions */
.tt-cursor .autoOptions,
.tt-suggestion:hover .autoOptions {
display: block;
}
.tt-suggestion .resultnoresult .autoOptions {
display: none;
}
.addToMap {
display:none;
width: 24px;
height: 24px;
background: url(<%= asset_data_uri('addtopic_sprite.png') %>);
background-repeat: no-repeat;
background-size: 48px 24px;
top: 12px;
left: 80px;
cursor: pointer;
&:hover {
background-position: -24px;
}
}/* .addToMap */
.topicCount {
width: 24px;
height: 24px;
background: url(<%= asset_data_uri('topic16.png') %>);
background-repeat: no-repeat;
background-position: 0 center;
top: 0;
left: 0;
padding-left: 18px;
font-size: 12px;
line-height: 24px;
}
.mapCount {
width: 24px;
height: 24px;
background: url(<%= asset_data_uri('metamap16.png') %>);
background-repeat: no-repeat;
background-position: 0 center;
left: 0;
padding-left: 20px;
font-size: 12px;
line-height: 24px;
}
.synapseCount {
width: 24px;
height: 24px;
background: url(<%= asset_data_uri('synapse16.png') %>);
background-repeat: no-repeat;
background-position: 0 center;
top: 24px;
left: 0;
padding-left: 20px;
font-size: 12px;
line-height: 24px;
}
.tip {
display: none;
position: absolute;
background: #424242;
width: auto;
top: 2px;
right: 25px;
color: white;
white-space: nowrap;
border-radius: 2px;
font-size: 12px !important;
font-family: 'din-regular';
line-height: 12px;
padding: 4px 4px 4px;
z-index: 100;
}
.topicOriginatorIcon {
width: 18px;
height: 18px;
padding: 3px;
top: 0;
left: 44px;
img {
border-radius: 9px;
}
.tip {
right: 30px;
top: 1px;
}
.tip:before {
top: 5px;
right: -4px;
}
}/* .topicOriginatorIcon */
.mapContributorsIcon .tip {
right: 40px;
top: -5px;
padding-top: 5px;
padding-bottom: 5px;
}
.hoverForTip{
&:hover .tip {
display: block;
}
.tip li {
padding-left: 28px;
padding-top: 4px;
}
.tip:before {
content: '';
position: absolute;
width: 0;
height: 0;
border-left: 4px solid #424242;
border-top: 5px solid transparent;
border-bottom: 5px solid transparent;
}
.tip {
right: 30px;
}
.tip:before {
right: -4px;
}
}/* .hoverForTip */
.mapContributorsIcon {
height: 24px;
top: 0;
left: 44px;
font-size: 12px;
line-height: 24px;
.tip:before {
top: 12px;
right: -4px;
}
.mapContributors {
top: auto;
right: 0;
bottom: 21px;
white-space: normal;
width: 200px;
}
}/* .mapContributorsIcon */
.topicPermission,
.mapPermission {
width: 24px;
height: 24px;
background-image: url(<%= asset_data_uri('permissions32_sprite.png') %>);
background-repeat: no-repeat;
background-size: 72px 48px !important;
top: 24px;
left: 44px;
.commons,
.commons {
background-position: 0 0;
}
.public,
.public {
background-position: -48px 0;
}
.private,
.private {
background-position: -24px 0;
}
}/* .topicPermission, .mapPermission */
}/* .sidebarSearch */

View file

@ -6,7 +6,7 @@
} }
div.uv-icon.uv-bottom-left { div.uv-icon.uv-bottom-left {
background-image:url(feedback_sprite.png); background-image: url(<%= asset_data_uri 'feedback_sprite.png' %>);
background-repeat: no-repeat; background-repeat: no-repeat;
color:#FFFFFF; color:#FFFFFF;
cursor:pointer; cursor:pointer;

View file

@ -1,6 +1,8 @@
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
protect_from_forgery protect_from_forgery
before_filter :get_invite_link
# this is for global login # this is for global login
include ContentHelper include ContentHelper
@ -9,7 +11,13 @@ class ApplicationController < ActionController::Base
helper_method :admin? helper_method :admin?
def after_sign_in_path_for(resource) def after_sign_in_path_for(resource)
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http') unsafe_uri = request.env["REQUEST_URI"]
if unsafe_uri.starts_with?('http') && !unsafe_uri.starts_with?('https')
protocol = 'http'
else
protocol = 'https'
end
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => protocol)
if request.referer == sign_in_url if request.referer == sign_in_url
super super
@ -37,7 +45,7 @@ private
end end
def require_admin def require_admin
unless authenticated? && user.admin unless authenticated? && admin?
redirect_to root_url, notice: "You need to be an admin for that." redirect_to root_url, notice: "You need to be an admin for that."
return false return false
end end
@ -47,13 +55,18 @@ private
current_user current_user
end end
def authenticated? def authenticated?
current_user current_user
end end
def admin? def admin?
current_user && current_user.admin authenticated? && current_user.admin
end end
def get_invite_link
unsafe_uri = request.env["REQUEST_URI"] || 'https://metamaps.cc'
valid_url = /^https?:\/\/([\w\.-]+)(:\d{1,5})?\/?$/
safe_uri = (unsafe_uri.match(valid_url)) ? unsafe_uri : '//metamaps.cc/'
@invite_link = "#{safe_uri}join" + (current_user ? "?code=#{current_user.code}" : "")
end
end end

View file

@ -26,8 +26,6 @@ class MainController < ApplicationController
# get /search/topics?term=SOMETERM # get /search/topics?term=SOMETERM
def searchtopics def searchtopics
@current = current_user
term = params[:term] term = params[:term]
user = params[:user] ? params[:user] : false user = params[:user] ? params[:user] : false
@ -68,25 +66,20 @@ class MainController < ApplicationController
else else
search = term.downcase + '%' search = term.downcase + '%'
if !user if user
@topics = Topic.where('LOWER("name") like ?', search).where('metacode_id = ?', filterByMetacode.id).order('"name"') @topics = Set.new(Topic.where('LOWER("name") like ?', search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"'))
@topics2 = Topic.where('LOWER("name") like ?', '%' + search).where('metacode_id = ?', filterByMetacode.id).order('"name"') @topics2 = Set.new(Topic.where('LOWER("name") like ?', '%' + search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"'))
@topics3 = Topic.where('LOWER("desc") like ?', '%' + search).where('metacode_id = ?', filterByMetacode.id).order('"name"') @topics3 = Set.new(Topic.where('LOWER("desc") like ?', '%' + search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"'))
@topics4 = Topic.where('LOWER("link") like ?', '%' + search).where('metacode_id = ?', filterByMetacode.id).order('"name"') @topics4 = Set.new(Topic.where('LOWER("link") like ?', '%' + search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"'))
@topics = @topics + (@topics2 - @topics) else
@topics = @topics + (@topics3 - @topics) @topics = Set.new(Topic.where('LOWER("name") like ?', search).where('metacode_id = ?', filterByMetacode.id).order('"name"'))
@topics = @topics + (@topics4 - @topics) @topics2 = Set.new(Topic.where('LOWER("name") like ?', '%' + search).where('metacode_id = ?', filterByMetacode.id).order('"name"'))
@topics3 = Set.new(Topic.where('LOWER("desc") like ?', '%' + search).where('metacode_id = ?', filterByMetacode.id).order('"name"'))
elsif user @topics4 = Set.new(Topic.where('LOWER("link") like ?', '%' + search).where('metacode_id = ?', filterByMetacode.id).order('"name"'))
@topics = Topic.where('LOWER("name") like ?', search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"')
@topics2 = Topic.where('LOWER("name") like ?', '%' + search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"')
@topics3 = Topic.where('LOWER("desc") like ?', '%' + search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"')
@topics4 = Topic.where('LOWER("link") like ?', '%' + search).where('metacode_id = ? AND user_id = ?', filterByMetacode.id, user).order('"name"')
@topics = @topics + (@topics2 - @topics)
@topics = @topics + (@topics3 - @topics)
@topics = @topics + (@topics4 - @topics)
end end
#get unique elements only through the magic of Sets
@topics = (@topics + @topics2 + @topics3 + @topics4).to_a
end end
elsif desc elsif desc
search = '%' + term.downcase + '%' search = '%' + term.downcase + '%'
@ -127,15 +120,13 @@ class MainController < ApplicationController
end end
#read this next line as 'delete a topic if its private and you're either 1. logged out or 2. logged in but not the topic creator #read this next line as 'delete a topic if its private and you're either 1. logged out or 2. logged in but not the topic creator
@topics.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } @topics.to_a.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && current_user.id != t.user_id)) }
render json: autocomplete_array_json(@topics) render json: autocomplete_array_json(@topics)
end end
# get /search/maps?term=SOMETERM # get /search/maps?term=SOMETERM
def searchmaps def searchmaps
@current = current_user
term = params[:term] term = params[:term]
user = params[:user] ? params[:user] : nil user = params[:user] ? params[:user] : nil
@ -163,15 +154,13 @@ class MainController < ApplicationController
end end
#read this next line as 'delete a map if its private and you're either 1. logged out or 2. logged in but not the map creator #read this next line as 'delete a map if its private and you're either 1. logged out or 2. logged in but not the map creator
@maps.delete_if {|m| m.permission == "private" && (!authenticated? || (authenticated? && @current.id != m.user_id)) } @maps.to_a.delete_if {|m| m.permission == "private" && (!authenticated? || (authenticated? && current_user.id != m.user_id)) }
render json: autocomplete_map_array_json(@maps) render json: autocomplete_map_array_json(@maps)
end end
# get /search/mappers?term=SOMETERM # get /search/mappers?term=SOMETERM
def searchmappers def searchmappers
@current = current_user
term = params[:term] term = params[:term]
if term && !term.empty? && term.downcase[0..3] != "map:" && term.downcase[0..5] != "topic:" && term.downcase != "mapper:" if term && !term.empty? && term.downcase[0..3] != "map:" && term.downcase[0..5] != "topic:" && term.downcase != "mapper:"
@ -187,19 +176,17 @@ class MainController < ApplicationController
# get /search/synapses?term=SOMETERM OR # get /search/synapses?term=SOMETERM OR
# get /search/synapses?topic1id=SOMEID&topic2id=SOMEID # get /search/synapses?topic1id=SOMEID&topic2id=SOMEID
def searchsynapses def searchsynapses
@current = current_user
term = params[:term] term = params[:term]
topic1id = params[:topic1id] topic1id = params[:topic1id]
topic2id = params[:topic2id] topic2id = params[:topic2id]
if term && !term.empty? if term && !term.empty?
@synapses = Synapse.select('DISTINCT "desc"').where('LOWER("desc") like ?', '%' + term.downcase + '%').order('"desc"') @synapses = Synapse.where('LOWER("desc") like ?', '%' + term.downcase + '%').order('"desc"')
# remove any duplicate synapse types that just differ by # remove any duplicate synapse types that just differ by
# leading or trailing whitespaces # leading or trailing whitespaces
collectedDesc = [] collectedDesc = []
@synapses.delete_if {|s| @synapses.to_a.uniq(&:desc).delete_if {|s|
desc = s.desc == nil || s.desc == "" ? "" : s.desc.strip desc = s.desc == nil || s.desc == "" ? "" : s.desc.strip
if collectedDesc.index(desc) == nil if collectedDesc.index(desc) == nil
collectedDesc.push(desc) collectedDesc.push(desc)
@ -211,23 +198,20 @@ class MainController < ApplicationController
#limit to 5 results #limit to 5 results
@synapses = @synapses.slice(0,5) @synapses = @synapses.slice(0,5)
render json: autocomplete_synapse_generic_json(@synapses)
elsif topic1id && !topic1id.empty? elsif topic1id && !topic1id.empty?
@one = Synapse.where('node1_id = ? AND node2_id = ?', topic1id, topic2id) @one = Synapse.where('node1_id = ? AND node2_id = ?', topic1id, topic2id)
@two = Synapse.where('node2_id = ? AND node1_id = ?', topic1id, topic2id) @two = Synapse.where('node2_id = ? AND node1_id = ?', topic1id, topic2id)
@synapses = @one + @two @synapses = @one + @two
@synapses.sort! {|s1,s2| s1.desc <=> s2.desc } @synapses.sort! {|s1,s2| s1.desc <=> s2.desc }.to_a
#read this next line as 'delete a synapse if its private and you're either 1. logged out or 2. logged in but not the synapse creator #permissions
@synapses.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) } @synapses.delete_if {|s| s.permission == "private" && !authenticated? }
@synapses.delete_if {|s| s.permission == "private" && authenticated? && current_user.id != s.user_id }
render json: autocomplete_synapse_array_json(@synapses)
else else
@synapses = [] @synapses = []
render json: autocomplete_synapse_array_json(@synapses)
end end
render json: autocomplete_synapse_array_json(@synapses)
end end
end end

View file

@ -13,7 +13,7 @@ class MappingsController < ApplicationController
# POST /mappings.json # POST /mappings.json
def create def create
@mapping = Mapping.new(params[:mapping]) @mapping = Mapping.new(mapping_params)
@mapping.map.touch(:updated_at) @mapping.map.touch(:updated_at)
@ -30,7 +30,7 @@ class MappingsController < ApplicationController
@mapping.map.touch(:updated_at) @mapping.map.touch(:updated_at)
if @mapping.update_attributes(params[:mapping]) if @mapping.update_attributes(mapping_params)
head :no_content head :no_content
else else
render json: @mapping.errors, status: :unprocessable_entity render json: @mapping.errors, status: :unprocessable_entity
@ -48,4 +48,10 @@ class MappingsController < ApplicationController
head :no_content head :no_content
end end
private
# Never trust parameters from the scary internet, only allow the white list through.
def mapping_params
params.require(:mapping).permit(:id, :xloc, :yloc, :mappable_id, :mappable_type, :map_id, :user_id)
end
end end

View file

@ -72,14 +72,10 @@ class MapsController < ApplicationController
respond_to do |format| respond_to do |format|
format.html { format.html {
@allmappers = @map.contributors @allmappers = @map.contributors
@alltopics = @map.topics.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } @alltopics = @map.topics.to_a.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) }
@allsynapses = @map.synapses.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) } @allsynapses = @map.synapses.to_a.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) }
@allmappings = @map.mappings.delete_if {|m| @allmappings = @map.mappings.to_a.delete_if {|m|
if m.category == "Synapse" object = m.mappable
object = m.synapse
elsif m.category == "Topic"
object = m.topic
end
!object || (object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id))) !object || (object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id)))
} }
@ -100,14 +96,10 @@ class MapsController < ApplicationController
end end
@allmappers = @map.contributors @allmappers = @map.contributors
@alltopics = @map.topics.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } @alltopics = @map.topics.to_a.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) }
@allsynapses = @map.synapses.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) } @allsynapses = @map.synapses.to_a.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) }
@allmappings = @map.mappings.delete_if {|m| @allmappings = @map.mappings.to_a.delete_if {|m|
if m.category == "Synapse" object = m.mappable
object = m.synapse
elsif m.category == "Topic"
object = m.topic
end
!object || (object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id))) !object || (object.permission == "private" && (!authenticated? || (authenticated? && @current.id != object.user_id)))
} }
@ -141,10 +133,9 @@ class MapsController < ApplicationController
@all.each do |topic| @all.each do |topic|
topic = topic.split('/') topic = topic.split('/')
@mapping = Mapping.new() @mapping = Mapping.new()
@mapping.category = "Topic"
@mapping.user = @user @mapping.user = @user
@mapping.map = @map @mapping.map = @map
@mapping.topic = Topic.find(topic[0]) @mapping.mappable = Topic.find(topic[0])
@mapping.xloc = topic[1] @mapping.xloc = topic[1]
@mapping.yloc = topic[2] @mapping.yloc = topic[2]
@mapping.save @mapping.save
@ -155,10 +146,9 @@ class MapsController < ApplicationController
@synAll = @synAll.split(',') @synAll = @synAll.split(',')
@synAll.each do |synapse_id| @synAll.each do |synapse_id|
@mapping = Mapping.new() @mapping = Mapping.new()
@mapping.category = "Synapse"
@mapping.user = @user @mapping.user = @user
@mapping.map = @map @mapping.map = @map
@mapping.synapse = Synapse.find(synapse_id) @mapping.mappable = Synapse.find(synapse_id)
@mapping.save @mapping.save
end end
end end
@ -180,7 +170,7 @@ class MapsController < ApplicationController
respond_to do |format| respond_to do |format|
if !@map if !@map
format.json { render json: "unauthorized" } format.json { render json: "unauthorized" }
elsif @map.update_attributes(params[:map]) elsif @map.update_attributes(map_params)
format.json { head :no_content } format.json { head :no_content }
else else
format.json { render json: @map.errors, status: :unprocessable_entity } format.json { render json: @map.errors, status: :unprocessable_entity }
@ -218,15 +208,7 @@ class MapsController < ApplicationController
@map = Map.find(params[:id]).authorize_to_delete(@current) @map = Map.find(params[:id]).authorize_to_delete(@current)
if @map @map.delete if @map
@mappings = @map.mappings
@mappings.each do |mapping|
mapping.delete
end
@map.delete
end
respond_to do |format| respond_to do |format|
format.json { format.json {
@ -238,4 +220,11 @@ class MapsController < ApplicationController
} }
end end
end end
private
# Never trust parameters from the scary internet, only allow the white list through.
def map_params
params.require(:map).permit(:id, :name, :arranged, :desc, :permission, :user_id)
end
end end

View file

@ -45,7 +45,7 @@ class MetacodeSetsController < ApplicationController
# POST /metacode_sets.json # POST /metacode_sets.json
def create def create
@user = current_user @user = current_user
@metacode_set = MetacodeSet.new(params[:metacode_set]) @metacode_set = MetacodeSet.new(metacode_set_params)
@metacode_set.user_id = @user.id @metacode_set.user_id = @user.id
respond_to do |format| respond_to do |format|
@ -70,7 +70,7 @@ class MetacodeSetsController < ApplicationController
@metacode_set = MetacodeSet.find(params[:id]) @metacode_set = MetacodeSet.find(params[:id])
respond_to do |format| respond_to do |format|
if @metacode_set.update_attributes(params[:metacode_set]) if @metacode_set.update_attributes(metacode_set_params)
# build an array of the IDs of the metacodes currently in the set # build an array of the IDs of the metacodes currently in the set
@currentMetacodes = @metacode_set.metacodes.map{ |m| m.id.to_s } @currentMetacodes = @metacode_set.metacodes.map{ |m| m.id.to_s }
@ -116,4 +116,11 @@ class MetacodeSetsController < ApplicationController
format.json { head :no_content } format.json { head :no_content }
end end
end end
private
def metacode_set_params
params.require(:metacode_set).permit(:desc, :mapperContributed, :name)
end
end end

View file

@ -1,12 +1,13 @@
class MetacodesController < ApplicationController class MetacodesController < ApplicationController
before_filter :require_admin, except: [:index] before_filter :require_admin, except: [:index]
# GET /metacodes # GET /metacodes
# GET /metacodes.json # GET /metacodes.json
def index def index
@metacodes = Metacode.order("name").all @metacodes = Metacode.order("name").all
@metacodes.map do |metacode|
metacode.icon = ActionController::Base.helpers.asset_path(metacode.icon)
end
respond_to do |format| respond_to do |format|
format.html { format.html {
@ -51,7 +52,7 @@ class MetacodesController < ApplicationController
# POST /metacodes # POST /metacodes
# POST /metacodes.json # POST /metacodes.json
def create def create
@metacode = Metacode.new(params[:metacode]) @metacode = Metacode.new(metacode_params)
respond_to do |format| respond_to do |format|
if @metacode.save if @metacode.save
@ -70,7 +71,7 @@ class MetacodesController < ApplicationController
@metacode = Metacode.find(params[:id]) @metacode = Metacode.find(params[:id])
respond_to do |format| respond_to do |format|
if @metacode.update_attributes(params[:metacode]) if @metacode.update_attributes(metacode_params)
format.html { redirect_to metacodes_url, notice: 'Metacode was successfully updated.' } format.html { redirect_to metacodes_url, notice: 'Metacode was successfully updated.' }
format.json { head :no_content } format.json { head :no_content }
else else
@ -93,4 +94,11 @@ class MetacodesController < ApplicationController
# format.json { head :no_content } # format.json { head :no_content }
# end # end
# end # end
private
# Never trust parameters from the scary internet, only allow the white list through.
def metacode_params
params.require(:metacode).permit(:id, :name, :icon, :color)
end
end end

View file

@ -1,10 +0,0 @@
class Users::RegistrationsController < Devise::RegistrationsController
protected
def after_sign_up_path_for(resource)
signed_in_root_path(resource)
end
def after_update_path_for(resource)
signed_in_root_path(resource)
end
end

View file

@ -21,7 +21,8 @@ class SynapsesController < ApplicationController
# POST /synapses # POST /synapses
# POST /synapses.json # POST /synapses.json
def create def create
@synapse = Synapse.new(params[:synapse]) @synapse = Synapse.new(synapse_params)
@synapse.update_attribute :desc, "" if @synapse.desc.nil?
respond_to do |format| respond_to do |format|
if @synapse.save if @synapse.save
@ -36,9 +37,10 @@ class SynapsesController < ApplicationController
# PUT /synapses/1.json # PUT /synapses/1.json
def update def update
@synapse = Synapse.find(params[:id]) @synapse = Synapse.find(params[:id])
@synapse.update_attribute :desc, "" if @synapse.desc.nil?
respond_to do |format| respond_to do |format|
if @synapse.update_attributes(params[:synapse]) if @synapse.update_attributes(synapse_params)
format.json { head :no_content } format.json { head :no_content }
else else
format.json { render json: @synapse.errors, status: :unprocessable_entity } format.json { render json: @synapse.errors, status: :unprocessable_entity }
@ -48,20 +50,17 @@ class SynapsesController < ApplicationController
# DELETE synapses/:id # DELETE synapses/:id
def destroy def destroy
@current = current_user @synapse = Synapse.find(params[:id]).authorize_to_delete(current_user)
@synapse = Synapse.find(params[:id]).authorize_to_delete(@current) @synapse.delete if @synapse
if @synapse
@synapse.mappings.each do |m|
m.map.touch(:updated_at)
m.delete
end
@synapse.delete
end
respond_to do |format| respond_to do |format|
format.json { head :no_content } format.json { head :no_content }
end end
end end
private
def synapse_params
params.require(:synapse).permit(:id, :desc, :category, :weight, :permission, :node1_id, :node2_id, :user_id)
end
end end

View file

@ -10,12 +10,11 @@ class TopicsController < ApplicationController
@current = current_user @current = current_user
term = params[:term] term = params[:term]
if term && !term.empty? if term && !term.empty?
# !connor term here needs to have .downcase
@topics = Topic.where('LOWER("name") like ?', term.downcase + '%').order('"name"') @topics = Topic.where('LOWER("name") like ?', term.downcase + '%').order('"name"')
#read this next line as 'delete a topic if its private and you're either #read this next line as 'delete a topic if its private and you're either
#1. logged out or 2. logged in but not the topic creator #1. logged out or 2. logged in but not the topic creator
@topics.delete_if {|t| t.permission == "private" && @topics.to_a.delete_if {|t| t.permission == "private" &&
(!authenticated? || (authenticated? && @current.id != t.user_id)) } (!authenticated? || (authenticated? && @current.id != t.user_id)) }
else else
@topics = [] @topics = []
@ -35,7 +34,7 @@ class TopicsController < ApplicationController
respond_to do |format| respond_to do |format|
format.html { format.html {
@alltopics = ([@topic] + @topic.relatives).delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } # should limit to topics visible to user @alltopics = ([@topic] + @topic.relatives).delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } # should limit to topics visible to user
@allsynapses = @topic.synapses.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) } @allsynapses = @topic.synapses.to_a.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) }
@allcreators = [] @allcreators = []
@alltopics.each do |t| @alltopics.each do |t|
@ -64,8 +63,8 @@ class TopicsController < ApplicationController
redirect_to root_url, notice: "Access denied. That topic is private." and return redirect_to root_url, notice: "Access denied. That topic is private." and return
end end
@alltopics = @topic.relatives.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) } @alltopics = @topic.relatives.to_a.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) }
@allsynapses = @topic.synapses.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) } @allsynapses = @topic.synapses.to_a.delete_if {|s| s.permission == "private" && (!authenticated? || (authenticated? && @current.id != s.user_id)) }
@allcreators = [] @allcreators = []
@allcreators.push(@topic.user) @allcreators.push(@topic.user)
@alltopics.each do |t| @alltopics.each do |t|
@ -101,7 +100,7 @@ class TopicsController < ApplicationController
@topicsAlreadyHas = params[:network] ? params[:network].split(',') : [] @topicsAlreadyHas = params[:network] ? params[:network].split(',') : []
@alltopics = @topic.relatives.delete_if {|t| @alltopics = @topic.relatives.to_a.delete_if {|t|
@topicsAlreadyHas.index(t.id.to_s) != nil || @topicsAlreadyHas.index(t.id.to_s) != nil ||
(t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id))) (t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)))
} }
@ -133,7 +132,7 @@ class TopicsController < ApplicationController
@topicsAlreadyHas = params[:network] ? params[:network].split(',') : [] @topicsAlreadyHas = params[:network] ? params[:network].split(',') : []
@alltopics = @topic.relatives.delete_if {|t| @alltopics = @topic.relatives.to_a.delete_if {|t|
@topicsAlreadyHas.index(t.id.to_s) != nil || @topicsAlreadyHas.index(t.id.to_s) != nil ||
(params[:metacode] && t.metacode_id.to_s != params[:metacode]) || (params[:metacode] && t.metacode_id.to_s != params[:metacode]) ||
(t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id))) (t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)))
@ -141,7 +140,7 @@ class TopicsController < ApplicationController
@alltopics.uniq! @alltopics.uniq!
@allsynapses = @topic.synapses.delete_if {|s| @allsynapses = @topic.synapses.to_a.delete_if {|s|
(s.topic1 == @topic && @alltopics.index(s.topic2) == nil) || (s.topic1 == @topic && @alltopics.index(s.topic2) == nil) ||
(s.topic2 == @topic && @alltopics.index(s.topic1) == nil) (s.topic2 == @topic && @alltopics.index(s.topic1) == nil)
} }
@ -172,7 +171,7 @@ class TopicsController < ApplicationController
# POST /topics # POST /topics
# POST /topics.json # POST /topics.json
def create def create
@topic = Topic.new(params[:topic]) @topic = Topic.new(topic_params)
respond_to do |format| respond_to do |format|
if @topic.save if @topic.save
@ -189,7 +188,7 @@ class TopicsController < ApplicationController
@topic = Topic.find(params[:id]) @topic = Topic.find(params[:id])
respond_to do |format| respond_to do |format|
if @topic.update_attributes(params[:topic]) if @topic.update_attributes(topic_params)
format.json { head :no_content } format.json { head :no_content }
else else
format.json { render json: @topic.errors, status: :unprocessable_entity } format.json { render json: @topic.errors, status: :unprocessable_entity }
@ -201,36 +200,16 @@ class TopicsController < ApplicationController
def destroy def destroy
@current = current_user @current = current_user
@topic = Topic.find(params[:id]).authorize_to_delete(@current) @topic = Topic.find(params[:id]).authorize_to_delete(@current)
@topic.delete if @topic
if @topic
@synapses = @topic.synapses
@mappings = @topic.mappings
@synapses.each do |synapse|
synapse.mappings.each do |m|
@map = m.map
@map.touch(:updated_at)
m.delete
end
synapse.delete
end
@mappings.each do |mapping|
@map = mapping.map
@map.touch(:updated_at)
mapping.delete
end
@topic.delete
end
respond_to do |format| respond_to do |format|
format.json { head :no_content } format.json { head :no_content }
end end
end end
private
def topic_params
params.require(:topic).permit(:id, :name, :desc, :link, :permission, :user_id, :metacode_id)
end
end end

View file

@ -1,4 +1,7 @@
class Users::RegistrationsController < Devise::RegistrationsController class Users::RegistrationsController < Devise::RegistrationsController
before_filter :configure_sign_up_params, only: [:create]
before_filter :configure_account_update_params, only: [:update]
protected protected
def after_sign_up_path_for(resource) def after_sign_up_path_for(resource)
signed_in_root_path(resource) signed_in_root_path(resource)
@ -7,4 +10,14 @@ class Users::RegistrationsController < Devise::RegistrationsController
def after_update_path_for(resource) def after_update_path_for(resource)
signed_in_root_path(resource) signed_in_root_path(resource)
end end
private
def configure_sign_up_params
devise_parameter_sanitizer.for(:sign_up) << [:name, :joinedwithcode]
end
def configure_account_update_params
puts devise_parameter_sanitizer_for(:account_update)
devise_parameter_sanitizer.for(:account_update) << [:image]
end
end end

View file

@ -1,5 +1,4 @@
class UsersController < ApplicationController class UsersController < ApplicationController
before_filter :require_user, only: [:edit, :update, :updatemetacodes] before_filter :require_user, only: [:edit, :update, :updatemetacodes]
respond_to :html, :json respond_to :html, :json
@ -14,7 +13,6 @@ class UsersController < ApplicationController
# GET /users/:id/edit # GET /users/:id/edit
def edit def edit
@user = current_user @user = current_user
respond_with(@user) respond_with(@user)
end end
@ -22,9 +20,9 @@ class UsersController < ApplicationController
def update def update
@user = current_user @user = current_user
if params[:user][:password] == "" && params[:user][:password_confirmation] == "" if user_params[:password] == "" && user_params[:password_confirmation] == ""
# not trying to change the password # not trying to change the password
if @user.update_attributes(params[:user]) if @user.update_attributes(user_params.except(:password, :password_confirmation))
if params[:remove_image] == "1" if params[:remove_image] == "1"
@user.image = nil @user.image = nil
end end
@ -43,7 +41,7 @@ class UsersController < ApplicationController
# trying to change the password # trying to change the password
correct_pass = @user.valid_password?(params[:current_password]) correct_pass = @user.valid_password?(params[:current_password])
if correct_pass && @user.update_attributes(params[:user]) if correct_pass && @user.update_attributes(user_params)
if params[:remove_image] == "1" if params[:remove_image] == "1"
@user.image = nil @user.image = nil
end end
@ -98,4 +96,9 @@ class UsersController < ApplicationController
end end
end end
private
def user_params
params.require(:user).permit(:name, :email, :image, :password, :password_confirmation)
end
end end

View file

@ -1,2 +1,18 @@
module ApplicationHelper module ApplicationHelper
def get_metacodeset
@m = user.settings.metacodes
set = @m[0].include?("metacodeset") ? MetacodeSet.find(@m[0].sub("metacodeset-","").to_i) : false
return set
end
def user_metacodes
@m = user.settings.metacodes
set = get_metacodeset
if set
@metacodes = set.metacodes.to_a
else
@metacodes = Metacode.where(id: @m).to_a
end
@metacodes.sort! {|m1,m2| m2.name.downcase <=> m1.name.downcase }.rotate!(-1)
end
end end

View file

@ -16,7 +16,7 @@ module MapsHelper
map['rtype'] = "map" map['rtype'] = "map"
contributorTip = '' contributorTip = ''
firstContributorImage = '/assets/user.png' firstContributorImage = 'https://s3.amazonaws.com/metamaps-assets/site/user.png'
if m.contributors.count > 0 if m.contributors.count > 0
firstContributorImage = m.contributors[0].image.url(:thirtytwo) firstContributorImage = m.contributors[0].image.url(:thirtytwo)
m.contributors.each_with_index do |c, index| m.contributors.each_with_index do |c, index|

View file

@ -1,22 +1,10 @@
module UsersHelper module UsersHelper
# build custom json autocomplete for typeahead
## this one is for building our custom JSON autocomplete format for typeahead
def autocomplete_user_array_json(users) def autocomplete_user_array_json(users)
temp = [] json_users = []
users.each do |u| users.each do |user|
user = {} json_users.push user.as_json_for_autocomplete
user['id'] = u.id
user['label'] = u.name
user['value'] = u.name
user['profile'] = u.image.url(:sixtyfour)
user['mapCount'] = u.maps.count
user['generation'] = u.generation
user['created_at'] = u.created_at.strftime("%m/%d/%Y")
user['rtype'] = "mapper"
temp.push user
end end
return temp json_users
end end
end end

View file

@ -1,5 +1,4 @@
class InMetacodeSet < ActiveRecord::Base class InMetacodeSet < ActiveRecord::Base
belongs_to :metacode, :class_name => "Metacode", :foreign_key => "metacode_id" belongs_to :metacode, :class_name => "Metacode", :foreign_key => "metacode_id"
belongs_to :metacode_set, :class_name => "MetacodeSet", :foreign_key => "metacode_set_id" belongs_to :metacode_set, :class_name => "MetacodeSet", :foreign_key => "metacode_set_id"
# attr_accessible :title, :body
end end

View file

@ -2,18 +2,21 @@ class Map < ActiveRecord::Base
belongs_to :user belongs_to :user
has_many :topicmappings, :class_name => 'Mapping', :conditions => {:category => 'Topic'} has_many :topicmappings, -> { Mapping.topicmapping }, class_name: :Mapping, dependent: :destroy
has_many :synapsemappings, :class_name => 'Mapping', :conditions => {:category => 'Synapse'} has_many :synapsemappings, -> { Mapping.synapsemapping }, class_name: :Mapping, dependent: :destroy
has_many :topics, through: :topicmappings, source: :mappable, source_type: "Topic"
has_many :topics, :through => :topicmappings has_many :synapses, through: :synapsemappings, source: :mappable, source_type: "Synapse"
has_many :synapses, :through => :synapsemappings
# This method associates the attribute ":image" with a file attachment # This method associates the attribute ":image" with a file attachment
has_attached_file :screenshot, :styles => { has_attached_file :screenshot, :styles => {
:thumb => ['188x126#', :png] :thumb => ['188x126#', :png]
#:full => ['940x630#', :png] #:full => ['940x630#', :png]
}, },
:default_url => "/assets/missing-map.png" :default_url => 'https://s3.amazonaws.com/metamaps-assets/site/missing-map.png'
validates :name, presence: true
validates :arranged, inclusion: { in: [true, false] }
validates :permission, presence: true
validates :permission, inclusion: { in: Perm::ISSIONS.map(&:to_s) }
# Validate the attached image is image/jpg, image/png, etc # Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :screenshot, :content_type => /\Aimage\/.*\Z/ validates_attachment_content_type :screenshot, :content_type => /\Aimage\/.*\Z/
@ -23,13 +26,7 @@ class Map < ActiveRecord::Base
end end
def mk_permission def mk_permission
if self.permission == "commons" Perm.short(permission)
"co"
elsif self.permission == "public"
"pu"
elsif self.permission == "private"
"pr"
end
end end
#return an array of the contributors to the map #return an array of the contributors to the map
@ -111,14 +108,6 @@ class Map < ActiveRecord::Base
return self return self
end end
# returns Boolean if user allowed to view Topic, Synapse, or Map
def authorize_to_view(user)
if (self.permission == "private" && self.user != user)
return false
end
return true
end
def decode_base64(imgBase64) def decode_base64(imgBase64)
decoded_data = Base64.decode64(imgBase64) decoded_data = Base64.decode64(imgBase64)

View file

@ -1,7 +1,10 @@
class Mapping < ActiveRecord::Base class Mapping < ActiveRecord::Base
belongs_to :topic, :class_name => "Topic", :foreign_key => "topic_id" scope :topicmapping, -> { where(mappable_type: :Topic) }
belongs_to :synapse, :class_name => "Synapse", :foreign_key => "synapse_id" scope :synapsemapping, -> { where(mappable_type: :Synapse) }
belongs_to :mappable, polymorphic: true
belongs_to :map, :class_name => "Map", :foreign_key => "map_id" belongs_to :map, :class_name => "Map", :foreign_key => "map_id"
belongs_to :user belongs_to :user

View file

@ -13,5 +13,4 @@ class Metacode < ActiveRecord::Base
return true if self.metacode_sets.include? metacode_set return true if self.metacode_sets.include? metacode_set
return false return false
end end
end end

View file

@ -1,6 +1,5 @@
class MetacodeSet < ActiveRecord::Base class MetacodeSet < ActiveRecord::Base
belongs_to :user belongs_to :user
attr_accessible :desc, :mapperContributed, :name
has_many :in_metacode_sets has_many :in_metacode_sets
has_many :metacodes, :through => :in_metacode_sets has_many :metacodes, :through => :in_metacode_sets
end end

View file

@ -5,9 +5,14 @@ class Synapse < ActiveRecord::Base
belongs_to :topic1, :class_name => "Topic", :foreign_key => "node1_id" belongs_to :topic1, :class_name => "Topic", :foreign_key => "node1_id"
belongs_to :topic2, :class_name => "Topic", :foreign_key => "node2_id" belongs_to :topic2, :class_name => "Topic", :foreign_key => "node2_id"
has_many :mappings has_many :mappings, as: :mappable, dependent: :destroy
has_many :maps, :through => :mappings has_many :maps, :through => :mappings
validates :desc, length: { minimum: 0, allow_nil: false }
validates :permission, presence: true
validates :permission, inclusion: { in: Perm::ISSIONS.map(&:to_s) }
def user_name def user_name
self.user.name self.user.name
end end
@ -46,13 +51,4 @@ class Synapse < ActiveRecord::Base
end end
return false return false
end end
# returns Boolean if user allowed to view Topic, Synapse, or Map
def authorize_to_view(user)
if (self.permission == "private" && self.user != user)
return false
end
return true
end
end end

View file

@ -3,14 +3,17 @@ class Topic < ActiveRecord::Base
belongs_to :user belongs_to :user
has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id' has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id', dependent: :destroy
has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id' has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id', dependent: :destroy
has_many :topics1, :through => :synapses2, :source => :topic1 has_many :topics1, :through => :synapses2, :source => :topic1
has_many :topics2, :through => :synapses1, :source => :topic2 has_many :topics2, :through => :synapses1, :source => :topic2
has_many :mappings has_many :mappings, as: :mappable, dependent: :destroy
has_many :maps, :through => :mappings has_many :maps, :through => :mappings
validates :permission, presence: true
validates :permission, inclusion: { in: Perm::ISSIONS.map(&:to_s) }
# This method associates the attribute ":image" with a file attachment # This method associates the attribute ":image" with a file attachment
has_attached_file :image has_attached_file :image
@ -39,27 +42,27 @@ class Topic < ActiveRecord::Base
belongs_to :metacode belongs_to :metacode
def user_name def user_name
self.user.name user.name
end end
def user_image def user_image
self.user.image.url user.image.url
end end
def map_count def map_count
self.maps.count maps.count
end end
def synapse_count def synapse_count
self.synapses.count synapses.count
end end
def inmaps def inmaps
self.maps.map(&:name) maps.map(&:name)
end end
def inmapsLinks def inmapsLinks
self.maps.map(&:id) maps.map(&:id)
end end
def as_json(options={}) def as_json(options={})
@ -71,24 +74,18 @@ class Topic < ActiveRecord::Base
end end
def mk_permission def mk_permission
if self.permission == "commons" Perm.short(permission)
"co"
elsif self.permission == "public"
"pu"
elsif self.permission == "private"
"pr"
end
end end
# has no viewable synapses helper function # has no viewable synapses helper function
def has_viewable_synapses(current) def has_viewable_synapses(current)
result = false result = false
self.synapses.each do |synapse| synapses.each do |synapse|
if synapse.authorize_to_view(current) if synapse.authorize_to_show(current)
result = true result = true
end end
end end
return result result
end end
##### PERMISSIONS ###### ##### PERMISSIONS ######
@ -117,12 +114,4 @@ class Topic < ActiveRecord::Base
end end
return false return false
end end
# returns Boolean if user allowed to view Topic, Synapse, or Map
def authorize_to_view(user)
if (self.permission == "private" && self.user != user)
return false
end
return true
end
end end

View file

@ -7,12 +7,10 @@ class User < ActiveRecord::Base
has_many :maps has_many :maps
has_many :mappings has_many :mappings
before_create :generate_code after_create :generate_code
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable
attr_accessible :name, :email, :image, :password, :password_confirmation, :code, :joinedwithcode, :remember_me
serialize :settings, UserPreference serialize :settings, UserPreference
validates :password, :presence => true, validates :password, :presence => true,
@ -37,11 +35,12 @@ class User < ActiveRecord::Base
:ninetysix => ['96x96#', :png], :ninetysix => ['96x96#', :png],
:onetwentyeight => ['128x128#', :png] :onetwentyeight => ['128x128#', :png]
}, },
:default_url => "/assets/user.png" :default_url => 'https://s3.amazonaws.com/metamaps-assets/site/user.png'
# Validate the attached image is image/jpg, image/png, etc # Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
# override default as_json
def as_json(options={}) def as_json(options={})
{ :id => self.id, { :id => self.id,
:name => self.name, :name => self.name,
@ -50,26 +49,31 @@ class User < ActiveRecord::Base
} }
end end
def generate_code def as_json_for_autocomplete
#generate a random 8 letter/digit code that they can use to invite people json = {}
self.code = rand(36**8).to_s(36) json['id'] = id
json['label'] = name
$codes.push(self.code) json['value'] = name
json['profile'] = image.url(:sixtyfour)
self.generation = self.get_generation json['mapCount'] = maps.count
json['generation'] = generation
json['created_at'] = created_at.strftime("%m/%d/%Y")
json['rtype'] = "mapper"
json
end end
def get_generation #generate a random 8 letter/digit code that they can use to invite people
if self.joinedwithcode == self.code def generate_code
# if your joinedwithcode equals your code you must be GEN 0 self.code ||= rand(36**8).to_s(36)
gen = 0 $codes.push(self.code)
elsif self.generation self.generation = get_generation!
# if your generation has already been calculated then just return that value end
gen = self.generation
def get_generation!
if code == joinedwithcode
update(generation: 0)
else else
# if your generation hasn't been calculated, base it off the update(generation: User.find_by_code(joinedwithcode).generation + 1)
# generation of the person whose code you joined with + 1
gen = User.find_by_code(self.joinedwithcode).get_generation + 1
end end
end end
@ -77,13 +81,12 @@ class User < ActiveRecord::Base
# make sure we always return a UserPreference instance # make sure we always return a UserPreference instance
if read_attribute(:settings).nil? if read_attribute(:settings).nil?
write_attribute :settings, UserPreference.new write_attribute :settings, UserPreference.new
read_attribute :settings
else
read_attribute :settings
end end
read_attribute :settings
end end
def settings=(val) def settings=(val)
write_attribute :settings, val write_attribute :settings, val
end end
end end

37
app/services/perm.rb Normal file
View file

@ -0,0 +1,37 @@
class Perm
# e.g. Perm::ISSIONS
ISSIONS = [:commons, :public, :private]
class << self
def short(permission)
case permission
when :commons
"co"
when :public
"pu"
when :private
"pr"
else
fail "Invalid permission"
end
end
def long(perm)
case perm
when "co"
:commons
when "pu"
:public
when "pr"
:private
else
fail "Invalid short permission"
end
end
def valid?(permission)
ISSIONS.include? permission
end
end
end

View file

@ -18,7 +18,7 @@
<div id="rightAboutParms"> <div id="rightAboutParms">
<p>PRIVATE BETA</p> <p>PRIVATE BETA</p>
<p>2.6</p> <p>2.7</p>
<p>Nov 29, 2014</p> <p>Nov 29, 2014</p>
</div> </div>
<div class="clearfloat"> <div class="clearfloat">
@ -46,6 +46,7 @@
</a> </a>
</li> </li>
<li> <li>
<% # TODO enable ssl on blog.metamaps.cc %>
<a id="lightbox_blog" href="http://blog.metamaps.cc" target="_blank"> <a id="lightbox_blog" href="http://blog.metamaps.cc" target="_blank">
<div class="lightboxAboutIcon"></div> <div class="lightboxAboutIcon"></div>
blog blog
@ -58,7 +59,8 @@
</a> </a>
</li> </li>
<li> <li>
<a id="lightbox_term" data-bypass="true" href="http://metamaps.cc/maps/331" target="_blank"> <% # TODO switch to https:// once we're confident %>
<a id="lightbox_term" data-bypass="true" href="//metamaps.cc/maps/331" target="_blank">
<div class="lightboxAboutIcon"></div> <div class="lightboxAboutIcon"></div>
terms terms
</a> </a>
@ -115,7 +117,7 @@
<li>Google Plus <a href="https://plus.google.com/communities/115060009262157699234" target="_blank">*</a></li> <li>Google Plus <a href="https://plus.google.com/communities/115060009262157699234" target="_blank">*</a></li>
<li>Hackpad <a href="http://metamaps.hackpad.com/" target="_blank">*</a></li> <li>Hackpad <a href="http://metamaps.hackpad.com/" target="_blank">*</a></li>
<li>Loomio <a href="https://www.loomio.org/g/bu3L1tIW/topos-ffo" target="_blank">*</a></li> <li>Loomio <a href="https://www.loomio.org/g/bu3L1tIW/topos-ffo" target="_blank">*</a></li>
<li>Twitter <a href="http://twitter.com/metamapps" target="_blank">*</a></li> <li>Twitter <a href="https://twitter.com/metamapps" target="_blank">*</a></li>
<li>Hipchat</li> <li>Hipchat</li>
<li>Google Hangouts</li> <li>Google Hangouts</li>
<li>Vimeo </li> <li>Vimeo </li>
@ -140,7 +142,7 @@
<ul><li>Google Analytics</li></ul> <ul><li>Google Analytics</li></ul>
<br> <br>
<h4 id="colophonSection">Support</h4> <h4 id="colophonSection">Support</h4>
<ul><li>Uservoice <a href="http://support.metamaps.cc/" target="_blank">*</a></li></ul> <ul><li>Uservoice <a href="http://metamapscc.uservoice.com/" target="_blank">*</a></li></ul>
</div> </div>
<div class="clearfloat"></div> <div class="clearfloat"></div>
@ -152,7 +154,8 @@
<a id="chromeIcon" href="https://www.google.com/chrome/browser/" target="_blank">Chrome</a> <a id="chromeIcon" href="https://www.google.com/chrome/browser/" target="_blank">Chrome</a>
<a id="fireFoxIcon" href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a> <a id="fireFoxIcon" href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a>
<a id="safariIcon" href="http://support.apple.com/downloads/#safari" target="_blank">Safari</a> <a id="safariIcon" href="http://support.apple.com/downloads/#safari" target="_blank">Safari</a>
<p id="noIEbody">While it's downloading, explore our <a href="http://blog.metamaps.cc/">blog</a>,<br> watch the <a href="http://vimeo.com/88334167">tutorials</a>, or visit our <a href="http://support.metamaps.cc/">knowledge base</a>! <% # TODO https for blog.metamaps.cc %>
<p id="noIEbody">While it's downloading, explore our <a href="http://blog.metamaps.cc/">blog</a>,<br> watch the <a href="http://vimeo.com/88334167">tutorials</a>, or visit our <a href="http://metamapscc.uservoice.com/">knowledge base</a>!
</div> </div>
@ -200,13 +203,14 @@
<p>Want to help with design, code, community building, or 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. <p>Want to help with design, code, community building, or 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.
<% # TODO change this link to https once it works %>
<p>To be a <b>USER</b>, request an invite! We'll expect you to abide by our <a href="http://metamaps.cc/maps/331" target="_blank">terms of service</a>.</p> <p>To be a <b>USER</b>, request an invite! We'll expect you to abide by our <a href="http://metamaps.cc/maps/331" target="_blank">terms of service</a>.</p>
<p>To be a <b>CONTRIBUTOR</b>, simply <a href="https://docs.google.com/document/d/1z8FsSmYkHbLRLOsXc8i8M5ubKky8_WB2E9bLBoXJapU" target="_blank">enter our spaces</a> and join the conversation! We'll expect you to follow some guidelines.</p> <p>To be a <b>CONTRIBUTOR</b>, simply <a href="https://docs.google.com/document/d/1z8FsSmYkHbLRLOsXc8i8M5ubKky8_WB2E9bLBoXJapU" target="_blank">enter our spaces</a> and join the conversation! We'll expect you to follow some guidelines.</p>
<p><b>MEMBERS</b> are contributors who act as stewards and guardians of the collective and are responsible for maintaining our culture and purpose. We're working on a set of agreements to formalize what it means to be a member.</p> <p><b>MEMBERS</b> are contributors who act as stewards and guardians of the collective and are responsible for maintaining our culture and purpose. We're working on a set of agreements to formalize what it means to be a member.</p>
<p>We welcome people of all skillsets to create value within our network. There's open possibilities for designers, researchers, academics, strategists, and facilitators to contribute. If you're a developer, help us advance the code and take a look around our <a href="http://github.com/metamaps/metamaps_gen002" target="_blank">Github</a>.</p> <p>We welcome people of all skillsets to create value within our network. There's open possibilities for designers, researchers, academics, strategists, and facilitators to contribute. If you're a developer, help us advance the code and take a look around our <a href="https://github.com/metamaps/metamaps_gen002" target="_blank">Github</a>.</p>
<p>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! </p> <p>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! </p>
@ -231,9 +235,8 @@
<p>As a valued beta tester, you have the ability to invite your peers, colleagues and collaborators onto the platform.</p> <p>As a valued beta tester, you have the ability to invite your peers, colleagues and collaborators onto the platform.</p>
<p>Below is a personal invite link containing your unique access code, which can be used multiple times.</p> <p>Below is a personal invite link containing your unique access code, which can be used multiple times.</p>
<div id="joinCodesBox"> <div id="joinCodesBox">
<% mapper = current_user %> <p class="joinCodes"><%= @invite_link %>
<p class="joinCodes">http://metamaps.cc/join?code=<%= mapper.code %></p> <button class="button" onclick="Metamaps.GlobalUI.shareInvite('<%= @invite_link %>');">COPY INVITE LINK!</button>
<button class="button" onclick="Metamaps.GlobalUI.shareInvite('http://metamaps.cc/join?code=<%= mapper.code %>');">COPY INVITE LINK!</button>
</div> </div>
</div> </div>

View file

@ -129,7 +129,7 @@
<script type="text/template" id="mapSearchTemplate"> <script type="text/template" id="mapSearchTemplate">
<div class="result{{rtype}}"> <div class="result{{rtype}}">
<div class="searchResIconWrapper"> <div class="searchResIconWrapper">
<img class="icon" src="/assets/metamap36c.png"> <img class="icon" src="<%= asset_path('metamap36c.png') %>">
</div> </div>
<div class="resultText"> <div class="resultText">
<p class="resultTitle">{{label}}</p> <p class="resultTitle">{{label}}</p>
@ -196,6 +196,7 @@
</script> </script>
<script type="text/template" id="topicAutocompleteTemplate"> <script type="text/template" id="topicAutocompleteTemplate">
<div>
<img class="autocompleteSection topicType" width="24" height="24" src="{{typeImageURL}}" alt="{{type}}" title="{{type}}" /> <img class="autocompleteSection topicType" width="24" height="24" src="{{typeImageURL}}" alt="{{type}}" title="{{type}}" />
<p class="autocompleteSection topicTitle">{{label}}</p> <p class="autocompleteSection topicTitle">{{label}}</p>
<div class="expandTopicMetadata"></div> <div class="expandTopicMetadata"></div>
@ -209,6 +210,7 @@
<div class="topicPermission {{permission}}"></div> <div class="topicPermission {{permission}}"></div>
</div> </div>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</div>
</script> </script>
@ -234,7 +236,7 @@
<div class="metacodeSelect">{{{metacode_select}}}</div> <div class="metacodeSelect">{{{metacode_select}}}</div>
</div> </div>
<div class="linkItem contributor"> <div class="linkItem contributor">
<a href="/explore/mapper/{{userid}}"><img src="/assets/user.png" class="contributorIcon" width="32" height="32" /></a> <a href="/explore/mapper/{{userid}}"><img src="<%= asset_path('user.png') %>" class="contributorIcon" width="32" height="32" /></a>
<div class="contributorName">{{username}}</div> <div class="contributorName">{{username}}</div>
</div> </div>
<div class="linkItem mapCount"> <div class="linkItem mapCount">

View file

@ -16,12 +16,12 @@
<%= javascript_include_tag "application" %> <%= javascript_include_tag "application" %>
<!-- typekit for vinyl font --> <!-- typekit for vinyl font -->
<script type="text/javascript" src="//use.typekit.net/tki2nyo.js"></script> <script type="text/javascript" src="https://use.typekit.net/tki2nyo.js"></script>
<script type="text/javascript">try{Typekit.load();}catch(e){}</script> <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
<!-- app code --> <!-- app code -->
<script type="text/javascript"> <script type="text/javascript">
require.config({baseUrl: '/famous/'}); require.config({baseUrl: '<%= "#{ asset_path '/famous/main.js' }".chomp('main.js') %>'});
require(['main']); require(['main']);
</script> </script>
@ -66,7 +66,7 @@
<![endif]--> <![endif]-->
</head> </head>
<body data-env="<%= Rails.env %>" class="<%= authenticated? ? "authenticated" : "unauthenticated" %>"> <body class="<%= authenticated? ? "authenticated" : "unauthenticated" %>">
<% if devise_error_messages? %> <% if devise_error_messages? %>
<p id="toast"><%= devise_error_messages! %></p> <p id="toast"><%= devise_error_messages! %></p>
@ -147,10 +147,6 @@
<% end %> <% end %>
</script> </script>
<% if !authenticated? %>
<iframe width="1" height="1" src="http://support.metamaps.cc/logout.json"; style="visibility:hidden;"></iframe>
<% end %>
<%= render :partial => 'layouts/googleanalytics' if Rails.env.production? %> <%= render :partial => 'layouts/googleanalytics' if Rails.env.production? %>
</body> </body>
</html> </html>

View file

@ -47,7 +47,7 @@
Metamaps.Maps.Active = <%= @maps.to_json.html_safe %>; Metamaps.Maps.Active = <%= @maps.to_json.html_safe %>;
Metamaps.currentSection = ""; Metamaps.currentSection = "";
Metamaps.currentPage = ""; Metamaps.currentPage = "";
Metamaps.GlobalUI.Search.isOpen = true; Metamaps.GlobalUI.Search.open();
Metamaps.GlobalUI.Search.lock(); Metamaps.GlobalUI.Search.lock();
</script> </script>
<% end %> <% end %>

View file

@ -8,12 +8,12 @@
<%= @map && @map.permission != 'private' ? " shareable" : "" %>"> <%= @map && @map.permission != 'private' ? " shareable" : "" %>">
<% if @map %> <% if @map %>
<div class="mapInfoName" id="mapInfoName"><%= best_in_place @map, :name, :type => :textarea, :activator => "#mapInfoName", :classes => 'best_in_place_name' %></div> <div class="mapInfoName" id="mapInfoName"><%= best_in_place @map, :name, :as => :textarea, :activator => "#mapInfoName", :class => 'best_in_place_name' %></div>
<div class="mapInfoStat"> <div class="mapInfoStat">
<div class="infoStatIcon mapContributors hoverForTip"> <div class="infoStatIcon mapContributors hoverForTip">
<% if @map.contributors.count == 0 %> <% if @map.contributors.count == 0 %>
<img id="mapContribs" width="25" height="25" src="/assets/user.png" /> <img id="mapContribs" width="25" height="25" src="<%= asset_path('user.png'); %>" />
<% elsif @map.contributors.count == 1 %> <% elsif @map.contributors.count == 1 %>
<img id="mapContribs" width="25" height="25" src="<%= @map.contributors[0].image.url(:thirtytwo) %>" /> <img id="mapContribs" width="25" height="25" src="<%= @map.contributors[0].image.url(:thirtytwo) %>" />
<% elsif @map.contributors.count == 2 %> <% elsif @map.contributors.count == 2 %>
@ -23,7 +23,7 @@
<% end %> <% end %>
<span><%= @map.contributors.count %></span> <span><%= @map.contributors.count %></span>
<div class="tip"> <ul><% @map.contributors.each_with_index do |c, index| %> <div class="tip"> <ul><% @map.contributors.each_with_index do |c, index| %>
<li ><a href="/explore/mapper/<%= c.id %>" > <img class="rtUserImage" width="25" height="25" src="<%= c.image.url(:thirtytwo) %>" /> <li ><a href="/explore/mapper/<%= c.id %>" > <img class="rtUserImage" width="25" height="25" src="<%= asset_path c.image.url(:thirtytwo) %>" />
<%= c.name %></a> <%= c.name %></a>
</li> </li>
<% end %></ul></div> <% end %></ul></div>
@ -42,7 +42,7 @@
<div class="mapInfoDesc" id="mapInfoDesc"> <div class="mapInfoDesc" id="mapInfoDesc">
<% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%> <% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%>
<%= best_in_place @map, :desc, :activator => "#mapInfoDesc", :type => :textarea, :nil => "Click to add description...", :classes => 'best_in_place_desc' %> <%= best_in_place @map, :desc, :activator => "#mapInfoDesc", :as => :textarea, :placeholder => "Click to add description...", :class => 'best_in_place_desc' %>
<% end %> <% end %>
</div> </div>

View file

@ -1,19 +1,10 @@
<%= form_for Topic.new, url: topics_url, remote: true do |form| %> <%= form_for Topic.new, url: topics_url, remote: true do |form| %>
<div class="openMetacodeSwitcher openLightbox" data-open="switchMetacodes"></div> <div class="openMetacodeSwitcher openLightbox" data-open="switchMetacodes"></div>
<div id="metacodeImg"> <div id="metacodeImg">
<% @m = user.settings.metacodes %> <% @metacodes = user_metacodes() %>
<% set = @m[0].include?("metacodeset") ? MetacodeSet.find(@m[0].sub("metacodeset-","").to_i) : false %> <% set = get_metacodeset() %>
<% if set %>
<% @metacodes = set.metacodes %>
<% else %>
<% @metacodes = [] %>
<% @m.each do |m| %>
<% @metacodes.push(Metacode.find(m.to_i)) %>
<% end %>
<% end %>
<% @metacodes.sort! {|m1,m2| m2.name.downcase <=> m1.name.downcase }.rotate!(-1) %>
<% @metacodes.each do |metacode| %> <% @metacodes.each do |metacode| %>
<img class="cloudcarousel" width="40" height="40" src="<%= metacode.icon %>" alt="<%= metacode.name %>" title="<%= metacode.name %>" data-id="<%= metacode.id %>" /> <img class="cloudcarousel" width="40" height="40" src="<%= asset_path metacode.icon %>" alt="<%= metacode.name %>" title="<%= metacode.name %>" data-id="<%= metacode.id %>" />
<% end %> <% end %>
</div> </div>
<%= form.text_field :name, :maxlength => 140, :placeholder => "title..." %> <%= form.text_field :name, :maxlength => 140, :placeholder => "title..." %>

View file

@ -37,7 +37,7 @@
<% while $i < (Metacode.all.length / 4) do %> <% while $i < (Metacode.all.length / 4) do %>
<li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %> <li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %>
onclick="Metamaps.Admin.liClickHandler.call(this);"> onclick="Metamaps.Admin.liClickHandler.call(this);">
<img src="<%= @m[$i].icon %>" alt="<%= @m[$i].name %>" /> <img src="<%= asset_path @m[$i].icon %>" alt="<%= @m[$i].name %>" />
<p><%= @m[$i].name.downcase %></p> <p><%= @m[$i].name.downcase %></p>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</li> </li>
@ -48,7 +48,7 @@
<% while $i < (Metacode.all.length / 4 * 2) do %> <% while $i < (Metacode.all.length / 4 * 2) do %>
<li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %> <li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %>
onclick="Metamaps.Admin.liClickHandler.call(this);"> onclick="Metamaps.Admin.liClickHandler.call(this);">
<img src="<%= @m[$i].icon %>" alt="<%= @m[$i].name %>" /> <img src="<%= asset_path @m[$i].icon %>" alt="<%= @m[$i].name %>" />
<p><%= @m[$i].name.downcase %></p> <p><%= @m[$i].name.downcase %></p>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</li> </li>
@ -59,7 +59,7 @@
<% while $i < (Metacode.all.length / 4 * 3) do %> <% while $i < (Metacode.all.length / 4 * 3) do %>
<li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %> <li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %>
onclick="Metamaps.Admin.liClickHandler.call(this);"> onclick="Metamaps.Admin.liClickHandler.call(this);">
<img src="<%= @m[$i].icon %>" alt="<%= @m[$i].name %>" /> <img src="<%= asset_path @m[$i].icon %>" alt="<%= @m[$i].name %>" />
<p><%= @m[$i].name.downcase %></p> <p><%= @m[$i].name.downcase %></p>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</li> </li>
@ -70,7 +70,7 @@
<% while $i < Metacode.all.length do %> <% while $i < Metacode.all.length do %>
<li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %> <li id="<%= @m[$i].id %>" <% if not @m[$i].inMetacodeSet(@metacode_set) %>class="toggledOff"<% end %>
onclick="Metamaps.Admin.liClickHandler.call(this);"> onclick="Metamaps.Admin.liClickHandler.call(this);">
<img src="<%= @m[$i].icon %>" alt="<%= @m[$i].name %>" /> <img src="<%= asset_path @m[$i].icon %>" alt="<%= @m[$i].name %>" />
<p><%= @m[$i].name.downcase %></p> <p><%= @m[$i].name.downcase %></p>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</li> </li>

View file

@ -23,7 +23,7 @@
<td class='metacodeSetDesc'><%= metacode_set.desc %></td> <td class='metacodeSetDesc'><%= metacode_set.desc %></td>
<td> <td>
<% metacode_set.metacodes.each_with_index do |metacode, index| %> <% metacode_set.metacodes.each_with_index do |metacode, index| %>
<img class='metacodeSetImage' src='<%= metacode.icon %>' /> <img class='metacodeSetImage' src='<%= asset_path metacode.icon %>' />
<% if (index+1)%4 == 0 %> <% if (index+1)%4 == 0 %>
<div class='clearfloat'></div> <div class='clearfloat'></div>
<% end %> <% end %>

View file

@ -14,7 +14,7 @@
<% @metacodes.each do |metacode| %> <% @metacodes.each do |metacode| %>
<tr> <tr>
<td><%= metacode.name %></td> <td><%= metacode.name %></td>
<td class="iconURL"><%= metacode.icon %></td> <td class="iconURL"><%= asset_path metacode.icon %></td>
<% if metacode.color %> <% if metacode.color %>
<td class="iconColor" style="background-color: <%= metacode.color %>"> <td class="iconColor" style="background-color: <%= metacode.color %>">
<%= metacode.color %> <%= metacode.color %>
@ -22,7 +22,7 @@
<% else %> <% else %>
<td></td> <td></td>
<% end %> <% end %>
<td><img width='40' src='<%= metacode.icon %>' /></td> <td><img width='40' src='<%= asset_path metacode.icon %>' /></td>
<td><%= link_to 'Edit', edit_metacode_path(metacode), :data => { :bypass => 'true'} %></td> <td><%= link_to 'Edit', edit_metacode_path(metacode), :data => { :bypass => 'true'} %></td>
</tr> </tr>
<% end %> <% end %>

View file

@ -38,7 +38,7 @@
<div class="csItem indented"><span class="csTitle">Esc:</span> Hides auto-suggestion results</div> <div class="csItem indented"><span class="csTitle">Esc:</span> Hides auto-suggestion results</div>
<div class="csItem indented"><span class="csTitle">Enter:</span> create a new topic</div> <div class="csItem indented"><span class="csTitle">Enter:</span> create a new topic</div>
<div class="csItem indented"><span class="csTitle">Gear Icon:</span> open up metacode settings</div> <div class="csItem indented"><span class="csTitle">Gear Icon:</span> open up metacode settings</div>
<div class="csItem"><br><a href="http://support.metamaps.cc/knowledgebase/articles/425787-creating-and-editing-topics" target= "_blank">Learn More</a></div> <div class="csItem"><br><a href="http://metamapscc.uservoice.com/knowledgebase/articles/425787-creating-and-editing-topics" target= "_blank">Learn More</a></div>
</div> </div>
<div id="csEditingTopics"> <div id="csEditingTopics">
@ -61,7 +61,7 @@
<span class="csTitle">Change Topic permission:</span> Click on 'Permission' icon (only for topic creator) <span class="csTitle">Change Topic permission:</span> Click on 'Permission' icon (only for topic creator)
</div> </div>
<div class="csItem indented"> <div class="csItem indented">
<span class="csTitle">Open Topic view:</span> Click on <img src="/assets/synapse16.png" width="16" align="middle" /> icon within topic card bar <span class="csTitle">Open Topic view:</span> Click on <img src="<%= asset_path 'synapse16.png' %>" width="16" align="middle" /> icon within topic card bar
</div> </div>
<div class="csItem indented"> <div class="csItem indented">
<span class="csTitle">Close 'Topic' card:</span> Click on canvas <span class="csTitle">Close 'Topic' card:</span> Click on canvas
@ -70,7 +70,7 @@
<span class="csTitle">Open 'Context Menu':</span> Right-click/alt+click on topic icon or synapse <span class="csTitle">Open 'Context Menu':</span> Right-click/alt+click on topic icon or synapse
</div> </div>
<div class="csItem indented">*Hide/Remove/Delete topic within context menu</div> <div class="csItem indented">*Hide/Remove/Delete topic within context menu</div>
<div class="csItem"><br><a href="http://support.metamaps.cc/knowledgebase/articles/425787-creating-and-editing-topics" target= "_blank">Learn More</a></div> <div class="csItem"><br><a href="http://metamapscc.uservoice.com/knowledgebase/articles/425787-creating-and-editing-topics" target= "_blank">Learn More</a></div>
</div> </div>
@ -81,7 +81,7 @@
<div class="csItem"><span class="csTitle">Create new Topic with Synapse:</span> Right-click + drag from topic to open canvas</div> <div class="csItem"><span class="csTitle">Create new Topic with Synapse:</span> Right-click + drag from topic to open canvas</div>
<div class="csItem indented"><span class="csTitle">Enter:</span> Create topic</div> <div class="csItem indented"><span class="csTitle">Enter:</span> Create topic</div>
<div class="csItem indented"><span class="csTitle">Enter:</span> Create synapse</div> <div class="csItem indented"><span class="csTitle">Enter:</span> Create synapse</div>
<div class="csItem"><br><a href="http://support.metamaps.cc/knowledgebase/articles/425790-creating-and-editing-synapses" target= "_blank">Learn More</a></div> <div class="csItem"><br><a href="http://metamapscc.uservoice.com/knowledgebase/articles/425790-creating-and-editing-synapses" target= "_blank">Learn More</a></div>
</div> </div>
@ -94,7 +94,7 @@
<div class="csItem indented"><span class="csTitle">Browse synapses / change visible synapse</span> click on arrow icon and select desired synapse</div> <div class="csItem indented"><span class="csTitle">Browse synapses / change visible synapse</span> click on arrow icon and select desired synapse</div>
<div class="csItem"><span class="csTitle">Open 'Context Menu':</span> Right-click/alt-click on Synapse</div> <div class="csItem"><span class="csTitle">Open 'Context Menu':</span> Right-click/alt-click on Synapse</div>
<div class="csItem indented">*Hide/Remove/Delete synapse within context menu</div> <div class="csItem indented">*Hide/Remove/Delete synapse within context menu</div>
<div class="csItem"><br><a href="http://support.metamaps.cc/knowledgebase/articles/425790-creating-and-editing-synapses" target= "_blank">Learn More</a></div> <div class="csItem"><br><a href="http://metamapscc.uservoice.com/knowledgebase/articles/425790-creating-and-editing-synapses" target= "_blank">Learn More</a></div>
</div> </div>
@ -102,7 +102,7 @@
<div class="csItem"><span class="csTitle">Move around Canvas:</span> Click and drag</div> <div class="csItem"><span class="csTitle">Move around Canvas:</span> Click and drag</div>
<div class="csItem"><span class="csTitle">Zoom in/out:</span> Scroll OR click on <div id="zoomIn"> </div> & <div id="zoomOut"> </div></div> <div class="csItem"><span class="csTitle">Zoom in/out:</span> Scroll OR click on <div id="zoomIn"> </div> & <div id="zoomOut"> </div></div>
<div class="csItem"><span class="csTitle">Zoom to see all:</span> Click <div id="centerMap"></div> OR Ctrl + E</div> <div class="csItem"><span class="csTitle">Zoom to see all:</span> Click <div id="centerMap"></div> OR Ctrl + E</div>
<div class="csItem"><br><a href="http://support.metamaps.cc/knowledgebase/articles/425784-viewing-existing-maps" target= "_blank">Learn More</a></div> <div class="csItem"><br><a href="http://metamapscc.uservoice.com/knowledgebase/articles/425784-viewing-existing-maps" target= "_blank">Learn More</a></div>
</div> </div>
@ -151,42 +151,42 @@
<div id="moreResources"> <div id="moreResources">
<p>For more information about Metamaps.cc, visit our Knowledge Base or skip directly to a section by clicking on one of the categories below.</p> <p>For more information about Metamaps.cc, visit our Knowledge Base or skip directly to a section by clicking on one of the categories below.</p>
<div class="resourcesColumnOne resourcesColumn"> <div class="resourcesColumnOne resourcesColumn">
<a href="http://support.metamaps.cc/forums/262715-general" target="_blank" data-bypass="true" class="button">Feedback Forums</a> <a href="http://metamapscc.uservoice.com/forums/262715-general" target="_blank" data-bypass="true" class="button">Feedback Forums</a>
<ul> <ul>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/61031-getting-started" target="_blank" data-bypass="true">Getting Started</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/61031-getting-started" target="_blank" data-bypass="true">Getting Started</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63372-key-fundamentals" target="_blank" data-bypass="true">Key Fundamentals</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63372-key-fundamentals" target="_blank" data-bypass="true">Key Fundamentals</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/61033-best-practices" target="_blank" data-bypass="true">Best Practices</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/61033-best-practices" target="_blank" data-bypass="true">Best Practices</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63377-general-troubleshooting" target="_blank" data-bypass="true">General Troubleshooting</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63377-general-troubleshooting" target="_blank" data-bypass="true">General Troubleshooting</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63443-applications-use-cases" target="_blank" data-bypass="true">Applications & Use Cases</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63443-applications-use-cases" target="_blank" data-bypass="true">Applications & Use Cases</a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="resourcesColumnTwo resourcesColumn"> <div class="resourcesColumnTwo resourcesColumn">
<a href="http://support.metamaps.cc/knowledgebase" target="_blank" data-bypass="true" class="button">KNOWLEDGE BASE</a> <a href="http://metamapscc.uservoice.com/knowledgebase" target="_blank" data-bypass="true" class="button">KNOWLEDGE BASE</a>
<ul> <ul>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63440-general-questions" target="_blank" data-bypass="true">General Questions</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63440-general-questions" target="_blank" data-bypass="true">General Questions</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63375-getting-involved" target="_blank" data-bypass="true">Getting Involved</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63375-getting-involved" target="_blank" data-bypass="true">Getting Involved</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63376-project-organization-governance" target="_blank" data-bypass="true">Organization & Governance</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63376-project-organization-governance" target="_blank" data-bypass="true">Organization & Governance</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63378-technical-infrastructure" target="_blank" data-bypass="true">Technical Infrastructure</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63378-technical-infrastructure" target="_blank" data-bypass="true">Technical Infrastructure</a>
</li> </li>
<li> <li>
<a href="http://support.metamaps.cc/knowledgebase/topics/63587-theory-references" target="_blank" data-bypass="true">References & Key Theory</a> <a href="http://metamapscc.uservoice.com/knowledgebase/topics/63587-theory-references" target="_blank" data-bypass="true">References & Key Theory</a>
</li> </li>
</ul> </ul>
</div> </div>

View file

@ -70,13 +70,13 @@
@metacodes.each_with_index do |metacode, index| @metacodes.each_with_index do |metacode, index|
@metacodelist += '<li data-id="' + metacode.id.to_s + '">' @metacodelist += '<li data-id="' + metacode.id.to_s + '">'
@metacodelist += '<img src="' + metacode.icon + '" data-id="' + metacode.id.to_s + '" alt="' + metacode.name + '" />' @metacodelist += '<img src="' + asset_path(metacode.icon) + '" data-id="' + metacode.id.to_s + '" alt="' + metacode.name + '" />'
@metacodelist += '<p>' + metacode.name.downcase + '</p></li>' @metacodelist += '<p>' + metacode.name.downcase + '</p></li>'
end end
@synapses.each_with_index do |synapse, index| @synapses.each_with_index do |synapse, index|
d = synapse.desc || "" d = synapse.desc || ""
@synapselist += '<li data-id="' + d + '">' @synapselist += '<li data-id="' + d + '">'
@synapselist += '<img src="/assets/synapse16.png" alt="synapse icon" /><p>' + d @synapselist += '<img src="' + asset_path('synapse16.png') + '" alt="synapse icon" /><p>' + d
@synapselist += '</p></li>' @synapselist += '</p></li>'
end end
@mappers.each_with_index do |mapper, index| @mappers.each_with_index do |mapper, index|

View file

@ -12,7 +12,7 @@
<ul> <ul>
<% set.metacodes.sort { |a, b| a.name <=> b.name }.each do |m| %> <% set.metacodes.sort { |a, b| a.name <=> b.name }.each do |m| %>
<li data-id="<%= m.id.to_s %>"> <li data-id="<%= m.id.to_s %>">
<img width="24" height="24" src="<%= m.icon %>" alt="<%= m.name %>" /> <img width="24" height="24" src="<%= asset_path m.icon %>" alt="<%= m.name %>" />
<div class="mSelectName"><%= m.name %></div> <div class="mSelectName"><%= m.name %></div>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</li> </li>
@ -26,7 +26,7 @@
<ul> <ul>
<% Metacode.order("name").all.each do |m| %> <% Metacode.order("name").all.each do |m| %>
<li data-id="<%= m.id.to_s %>"> <li data-id="<%= m.id.to_s %>">
<img width="24" height="24" src="<%= m.icon %>" alt="<%= m.name %>" /> <img width="24" height="24" src="<%= asset_path m.icon %>" alt="<%= m.name %>" />
<div class="mSelectName"><%= m.name %></div> <div class="mSelectName"><%= m.name %></div>
<div class="clearfloat"></div> <div class="clearfloat"></div>
</li> </li>

View file

@ -19,16 +19,16 @@
<div id="metacodeSwitchTabs"> <div id="metacodeSwitchTabs">
<ul> <ul>
<% allMetacodeSets.each do |m| %> <% allMetacodeSets.each do |m| %>
<li><a href="#metacodeSwitchTabs<%= m.id %>" data-set-id="<%= m.id %>"><%= m.name %></a></li> <li><a href="#metacodeSwitchTabs<%= m.id %>" data-set-id="<%= m.id %>" data-bypass="true"><%= m.name %></a></li>
<% end %> <% end %>
<li><a href="#metacodeSwitchTabsCustom" data-set-id="custom" id="metacodeSetCustom">CUSTOM SELECTION</a></li> <li><a href="#metacodeSwitchTabsCustom" data-set-id="custom" data-bypass="true" id="metacodeSetCustom">CUSTOM SELECTION</a></li>
</ul> </ul>
<% allMetacodeSets.each_with_index do |m, localindex| %> <% allMetacodeSets.each_with_index do |m, localindex| %>
<div id="metacodeSwitchTabs<%= m.id %>" <div id="metacodeSwitchTabs<%= m.id %>"
data-metacodes="<%= m.metacodes.map(&:id).join(',') %>"> data-metacodes="<%= m.metacodes.map(&:id).join(',') %>">
<% @list = '' %> <% @list = '' %>
<% m.metacodes.sort{|x,y| x.name <=> y.name }.each_with_index do |m, index| %> <% m.metacodes.sort{|x,y| x.name <=> y.name }.each_with_index do |m, index| %>
<% @list += '<li><img src="' + m.icon + '" alt="' + m.name + '" /><p>' + m.name.downcase + '</p><div class="clearfloat"></div></li>' %> <% @list += '<li><img src="' + asset_path(m.icon) + '" alt="' + m.name + '" /><p>' + m.name.downcase + '</p><div class="clearfloat"></div></li>' %>
<% end %> <% end %>
<div class="metacodeSwitchTab"> <div class="metacodeSwitchTab">
<p class="setDesc"><%= m.desc %></p> <p class="setDesc"><%= m.desc %></p>
@ -53,7 +53,7 @@
<% else %> <% else %>
<% mClass = "toggledOff" %> <% mClass = "toggledOff" %>
<% end %> <% end %>
<% @list += '<li id="' + m.id.to_s + '" data-name="' + m.name + '" class="' + mClass + '"><img src="' + m.icon + '" alt="' + m.name + '" /><p>' + m.name.downcase + '</p><div class="clearfloat"></div></li>' %> <% @list += '<li id="' + m.id.to_s + '" data-name="' + m.name + '" class="' + mClass + '"><img src="' + asset_path(m.icon) + '" alt="' + m.name + '" /><p>' + m.name.downcase + '</p><div class="clearfloat"></div></li>' %>
<% end %> <% end %>
<div class="customMetacodeList"> <div class="customMetacodeList">

View file

@ -20,7 +20,7 @@
<% end %> <% end %>
<% @metacodes.sort! {|m1,m2| m2.name.downcase <=> m1.name.downcase }.rotate!(-1) %> <% @metacodes.sort! {|m1,m2| m2.name.downcase <=> m1.name.downcase }.rotate!(-1) %>
<% @metacodes.each do |metacode| %> <% @metacodes.each do |metacode| %>
<img class="cloudcarousel" width="40" height="40" src="<%= metacode.icon %>" alt="<%= metacode.name %>" title="<%= metacode.name %>"/> <img class="cloudcarousel" width="40" height="40" src="<%= asset_path metacode.icon %>" alt="<%= metacode.name %>" title="<%= metacode.name %>"/>
<% end %> <% end %>
</div> </div>
<%= form.text_field :name, :maxlength => 140, :placeholder => "title..." %> <%= form.text_field :name, :maxlength => 140, :placeholder => "title..." %>

21
bin/jenkins-test.sh Executable file
View file

@ -0,0 +1,21 @@
#!/bin/bash -l
#prerequisites
#sudo aptitude -q -y install libpq-dev
source "$HOME/.rvm/scripts/rvm"
rvm install $(cat .ruby-version)
rvm gemset use $(cat .ruby-gemset)
gem install bundler
set -x
#configure environment
export RAILS_ENV=test
cp .example-env .env
sed -i -e "s/DB_USERNAME='.*'/DB_USERNAME='jenkins'/" .env
#test
bundle install
rake db:create db:test:prepare
bundle exec rspec

View file

@ -1,13 +1,12 @@
require File.expand_path('../boot', __FILE__) require File.expand_path('../boot', __FILE__)
require 'rails/all' require 'rails/all'
require 'dotenv'
if defined?(Bundler) Bundler.require(*Rails.groups)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test))) ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
# If you want your assets lazily compiled in production, use this line Dotenv.load ".env.#{ENV["RAILS_ENV"]}", '.env'
# Bundler.require(:default, :assets, Rails.env)
end
module Metamaps module Metamaps
class Application < Rails::Application class Application < Rails::Application
@ -16,7 +15,7 @@ module Metamaps
# -- all .rb files in that directory are automatically loaded. # -- all .rb files in that directory are automatically loaded.
# Custom directories with classes and modules you want to be autoloadable. # Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras) config.autoload_paths << Rails.root.join('app', 'services')
# Only load the plugins named here, in the order given (default is alphabetical). # Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named. # :all can be used as a placeholder for all plugins not explicitly named.
@ -44,17 +43,15 @@ module Metamaps
# like if you have constraints or database-specific column types # like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql # config.active_record.schema_format = :sql
# Enforce whitelist mode for mass assignment.
# This will create an empty whitelist of attributes available for mass-assignment for all models
# in your app. As such, your models will need to explicitly whitelist or blacklist accessible
# parameters by using an attr_accessible or attr_protected declaration.
# config.active_record.whitelist_attributes = true
# Enable the asset pipeline # Enable the asset pipeline
config.assets.enabled = true
config.assets.initialize_on_precompile = false config.assets.initialize_on_precompile = false
# Version of your assets, change this if you want to expire all your assets # Version of your assets, change this if you want to expire all your assets
config.assets.version = '2.0' config.assets.version = '2.0'
config.generators do |g|
g.test_framework :rspec
end
config.active_record.raise_in_transactional_callbacks = true
end end
end end

View file

@ -1,4 +1,12 @@
require 'rubygems' require 'rubygems'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
# Set up gems listed in the Gemfile. # Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

21
config/database.yml Normal file
View file

@ -0,0 +1,21 @@
default: &default
min_messages: WARNING
encoding: unicode
pool: 5
adapter: postgresql
host: <%= ENV['DB_HOST'] %>
port: <%= ENV['DB_PORT'] %>
username: <%= ENV['DB_USERNAME'] %>
password: <%= ENV['DB_PASSWORD'] %>
development:
<<: *default
database: <%= ENV['DB_NAME'] %>_development
test:
<<: *default
database: <%= ENV['DB_NAME'] %>_test
production:
<<: *default
database: <%= ENV['DB_NAME'] %>_production

View file

@ -1,10 +0,0 @@
development:
min_messages: WARNING
adapter: postgresql
host: 127.0.0.1
port: 5432
encoding: unicode
database: metamap002_development
pool: 5
username: postgres
password: "3112"

View file

@ -1,26 +1,27 @@
Metamaps::Application.configure do Metamaps::Application.configure do
# Settings specified here will take precedence over those in config/application.rb # Settings specified here will take precedence over those in config/application.rb
config.log_level = :info
config.eager_load = false
# In the development environment your application's code is reloaded on # In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development # every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes. # since you don't have to restart the web server when you make code changes.
config.cache_classes = false config.cache_classes = false
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
# Show full error reports and disable caching # Show full error reports and disable caching
config.consider_all_requests_local = true config.consider_all_requests_local = true
config.action_controller.perform_caching = false config.action_controller.perform_caching = false
# S3 file storage # S3 file storage
config.paperclip_defaults = { config.paperclip_defaults = {
:storage => :s3, storage: :s3,
:s3_credentials => { s3_credentials: {
:bucket => ENV['S3_BUCKET_NAME'], bucket: ENV['S3_BUCKET_NAME'],
:access_key_id => ENV['AWS_ACCESS_KEY_ID'], access_key_id: ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
} },
s3_protocol: 'https'
} }
config.action_mailer.delivery_method = :smtp config.action_mailer.delivery_method = :smtp
@ -40,19 +41,6 @@ Metamaps::Application.configure do
# Print deprecation notices to the Rails logger # Print deprecation notices to the Rails logger
config.active_support.deprecation = :log config.active_support.deprecation = :log
# Only use best-standards-support built into browsers
config.action_dispatch.best_standards_support = :builtin
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict
# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
config.active_record.auto_explain_threshold_in_seconds = 0.5
# Do not compress assets
config.assets.compress = false
# Expands the lines which load the assets # Expands the lines which load the assets
config.assets.debug = true config.assets.debug = true
end end

View file

@ -1,6 +1,10 @@
Metamaps::Application.configure do Metamaps::Application.configure do
# Settings specified here will take precedence over those in config/application.rb # Settings specified here will take precedence over those in config/application.rb
config.log_level = :warn
config.eager_load = true
config.assets.js_compressor = :uglifier
# Code is not reloaded between requests # Code is not reloaded between requests
config.cache_classes = true config.cache_classes = true
@ -9,7 +13,9 @@ Metamaps::Application.configure do
config.action_controller.perform_caching = true config.action_controller.perform_caching = true
# Disable Rails's static asset server (Apache or nginx will already do this) # Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false config.serve_static_files = true
config.assets.compile = false
# Compress JavaScripts and CSS # Compress JavaScripts and CSS
config.assets.compress = true config.assets.compress = true
@ -18,11 +24,12 @@ Metamaps::Application.configure do
# S3 file storage # S3 file storage
config.paperclip_defaults = { config.paperclip_defaults = {
:storage => :s3, :storage => :s3,
:s3_credentials => { s3_credentials: {
:bucket => ENV['S3_BUCKET_NAME'], bucket: ENV['S3_BUCKET_NAME'],
:access_key_id => ENV['AWS_ACCESS_KEY_ID'], access_key_id: ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
} },
s3_protocol: 'https'
} }
config.action_mailer.delivery_method = :smtp config.action_mailer.delivery_method = :smtp
@ -35,7 +42,7 @@ Metamaps::Application.configure do
authentication: 'plain', authentication: 'plain',
enable_starttls_auto: true, enable_starttls_auto: true,
openssl_verify_mode: 'none' } openssl_verify_mode: 'none' }
config.action_mailer.default_url_options = { :host => 'metamaps.herokuapp.com' } config.action_mailer.default_url_options = { :host => ENV['MAILER_DEFAULT_URL'] }
# Don't care if the mailer can't send # Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = true config.action_mailer.raise_delivery_errors = true

View file

@ -1,6 +1,8 @@
Metamaps::Application.configure do Metamaps::Application.configure do
# Settings specified here will take precedence over those in config/application.rb # Settings specified here will take precedence over those in config/application.rb
config.eager_load = false
# The test environment is used exclusively to run your application's # The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that # test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped # your test database is "scratch space" for the test suite and is wiped
@ -8,12 +10,9 @@ Metamaps::Application.configure do
config.cache_classes = true config.cache_classes = true
# Configure static asset server for tests with Cache-Control for performance # Configure static asset server for tests with Cache-Control for performance
config.serve_static_assets = true config.serve_static_files = true
config.static_cache_control = "public, max-age=3600" config.static_cache_control = "public, max-age=3600"
# Log error messages when you accidentally call methods on nil
config.whiny_nils = true
# Show full error reports and disable caching # Show full error reports and disable caching
config.consider_all_requests_local = true config.consider_all_requests_local = true
config.action_controller.perform_caching = false config.action_controller.perform_caching = false
@ -29,9 +28,12 @@ Metamaps::Application.configure do
# ActionMailer::Base.deliveries array. # ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test config.action_mailer.delivery_method = :test
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict
# Print deprecation notices to the stderr # Print deprecation notices to the stderr
config.active_support.deprecation = :stderr config.active_support.deprecation = :stderr
#assets config
config.assets.compile = true
config.assets.compress = false
config.assets.debug = false
config.assets.digest = false
end end

View file

@ -1,21 +1,23 @@
# Use this hook to configure devise mailer, warden hooks and so forth. # Use this hook to configure devise mailer, warden hooks and so forth.
# Many of these configuration options can be set straight in your model. # Many of these configuration options can be set straight in your model.
Devise.setup do |config| Devise.setup do |config|
# The secret key used by Devise. Devise uses this key to generate
# random tokens. Changing this key will render invalid all existing
# confirmation, reset password and unlock tokens in the database.
# Devise will use the `secret_key_base` on Rails 4+ applications as its `secret_key`
# by default. You can change it below and use your own secret key.
# config.secret_key = '4d38a819bcea6314ffccb156a8e84b1b52c51ed446d11877c973791b3cd88449e9dbd7990cbc6e7f37d84702168ec36391467000c842ed5bed4f0b05df2b9507'
# ==> Mailer Configuration # ==> Mailer Configuration
# Configure the e-mail address which will be shown in Devise::Mailer, # Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class with default "from" parameter. # note that it will be overwritten if you use your own mailer class with default "from" parameter.
config.mailer_sender = "team@metamaps.cc" config.mailer_sender = ENV['DEVISE_MAILER_SENDER']
# Configure the class responsible to send e-mails. # Configure the class responsible to send e-mails.
# config.mailer = "Devise::Mailer" # config.mailer = "Devise::Mailer"
if Rails.env.development? # this is for Connors localhost config.secret_key = ENV['DEVISE_SECRET_KEY']
config.secret_key = 'f71c467e526f23d614b3b08866cad4788c502bed869c282f06e73ee6c94675b62fe1f6d52fa7ba8196b33031f0d2f3b67e27ea07693c52ecebccb01700cad614'
end
if Rails.env.production? # this is for the heroku staging environment
config.secret_key = 'd91ba0da95749174ee2b8922034783cbde4945409ed28b13383e18e72844beb74467f8199e9e216f0687cd2290c6e46bf74da24486d14bba3671d76c5b10c753'
end
# ==> ORM configuration # ==> ORM configuration
# Load and configure the ORM. Supports :active_record (default) and # Load and configure the ORM. Supports :active_record (default) and
@ -121,6 +123,9 @@ Devise.setup do |config|
# The time the user will be remembered without asking for credentials again. # The time the user will be remembered without asking for credentials again.
config.remember_for = 2.weeks config.remember_for = 2.weeks
# Invalidates all the remember me tokens when the user signs out.
config.expire_all_remember_me_on_sign_out = true
# If true, extends the user's remember period when remembered via cookie. # If true, extends the user's remember period when remembered via cookie.
# config.extend_remember_period = false # config.extend_remember_period = false
@ -142,9 +147,6 @@ Devise.setup do |config|
# time the user will be asked for credentials again. Default is 30 minutes. # time the user will be asked for credentials again. Default is 30 minutes.
# config.timeout_in = 30.minutes # config.timeout_in = 30.minutes
# If true, expires auth token on session timeout.
# config.expire_auth_token_on_timeout = false
# ==> Configuration for :lockable # ==> Configuration for :lockable
# Defines which strategy will be used to lock an account. # Defines which strategy will be used to lock an account.
# :failed_attempts = Locks an account after a number of failed attempts to sign in. # :failed_attempts = Locks an account after a number of failed attempts to sign in.
@ -168,6 +170,9 @@ Devise.setup do |config|
# Time interval to unlock the account if :time is enabled as unlock_strategy. # Time interval to unlock the account if :time is enabled as unlock_strategy.
# config.unlock_in = 1.hour # config.unlock_in = 1.hour
# Warn on the last attempt before the account is locked.
# config.last_attempt_warning = true
# ==> Configuration for :recoverable # ==> Configuration for :recoverable
# #
# Defines which key will be used when recovering the password for an account # Defines which key will be used when recovering the password for an account
@ -178,6 +183,10 @@ Devise.setup do |config|
# change their passwords. # change their passwords.
config.reset_password_within = 24.hours config.reset_password_within = 24.hours
# When set to false, does not sign a user in automatically after their password is
# reset. Defaults to true, so a user is signed in automatically after a reset.
# config.sign_in_after_reset_password = true
# ==> Configuration for :encryptable # ==> Configuration for :encryptable
# Allow you to use another encryption algorithm besides bcrypt (default). You can use # Allow you to use another encryption algorithm besides bcrypt (default). You can use
# :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1,
@ -186,10 +195,6 @@ Devise.setup do |config|
# REST_AUTH_SITE_KEY to pepper) # REST_AUTH_SITE_KEY to pepper)
# config.encryptor = :sha512 # config.encryptor = :sha512
# ==> Configuration for :token_authenticatable
# Defines name of the authentication token params key
# config.token_authentication_key = :auth_token
# ==> Scopes configuration # ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for # Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you # "users/sessions/new". It's turned off by default because it's slower if you
@ -237,12 +242,12 @@ Devise.setup do |config|
# is mountable, there are some extra configurations to be taken into account. # is mountable, there are some extra configurations to be taken into account.
# The following options are available, assuming the engine is mounted as: # The following options are available, assuming the engine is mounted as:
# #
# mount MyEngine, at: "/my_engine" # mount MyEngine, at: '/my_engine'
# #
# The router that invoked `devise_for`, in the example above, would be: # The router that invoked `devise_for`, in the example above, would be:
# config.router_name = :my_engine # config.router_name = :my_engine
# #
# When using omniauth, Devise cannot automatically set Omniauth path, # When using OmniAuth, Devise cannot automatically set OmniAuth path,
# so you need to do it manually. For the users scope, it would be: # so you need to do it manually. For the users scope, it would be:
# config.omniauth_path_prefix = "/my_engine/users/auth" # config.omniauth_path_prefix = '/my_engine/users/auth'
end end

View file

@ -4,4 +4,4 @@
# If you change this key, all old signed cookies will become invalid! # If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random, # Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks. # no regular words or you'll be exposed to dictionary attacks.
Metamaps::Application.config.secret_token = '267c8a84f63963282f45bc3010eaddf027abfab58fc759d6e239c8005f85ee99d6d01b1ab6394cdee9ca7f8c9213a0cf91d3d8d3350f096123e2caccbcc0924f' Metamaps::Application.config.secret_key_base = '267c8a84f63963282f45bc3010eaddf027abfab58fc759d6e239c8005f85ee99d6d01b1ab6394cdee9ca7f8c9213a0cf91d3d8d3350f096123e2caccbcc0924f'

View file

@ -3,49 +3,50 @@
en: en:
devise: devise:
confirmations: confirmations:
confirmed: "Your account was successfully confirmed. You are now signed in." confirmed: "Your email address has been successfully confirmed."
send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes." send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes." send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
failure: failure:
already_authenticated: "You are already signed in." already_authenticated: "You are already signed in."
inactive: "Your account was not activated yet." inactive: "Your account is not activated yet."
invalid: "Invalid email or password." invalid: "Invalid %{authentication_keys} or password."
invalid_token: "Invalid authentication token."
locked: "Your account is locked." locked: "Your account is locked."
not_found_in_database: "Invalid email or password." last_attempt: "You have one more attempt before your account is locked."
timeout: "Your session expired, please sign in again to continue." not_found_in_database: "Invalid %{authentication_keys} or password."
timeout: "Your session expired. Please sign in again to continue."
unauthenticated: "You need to sign in or sign up before continuing." unauthenticated: "You need to sign in or sign up before continuing."
unconfirmed: "You have to confirm your account before continuing." unconfirmed: "You have to confirm your email address before continuing."
mailer: mailer:
confirmation_instructions: confirmation_instructions:
subject: "Confirmation instructions" subject: "Confirmation instructions"
reset_password_instructions: reset_password_instructions:
subject: "Reset password instructions" subject: "Reset password instructions"
unlock_instructions: unlock_instructions:
subject: "Unlock Instructions" subject: "Unlock instructions"
omniauth_callbacks: omniauth_callbacks:
failure: "Could not authenticate you from %{kind} because \"%{reason}\"." failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
success: "Successfully authenticated from %{kind} account." success: "Successfully authenticated from %{kind} account."
passwords: passwords:
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
send_instructions: "You will receive an email with instructions about how to reset your password in a few minutes." send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
updated: "Your password was changed successfully. You are now signed in." updated: "Your password has been changed successfully. You are now signed in."
updated_not_active: "Your password was changed successfully." updated_not_active: "Your password has been changed successfully."
registrations: registrations:
destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon." destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
signed_up: "Welcome! You have signed up successfully." signed_up: "Welcome! You have signed up successfully."
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please open the link to activate your account." signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and click on the confirm link to finalize confirming your new email address." update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
updated: "You updated your account successfully." updated: "Your account has been updated successfully."
sessions: sessions:
signed_in: "Signed in successfully." signed_in: "Signed in successfully."
signed_out: "Signed out successfully." signed_out: "Signed out successfully."
already_signed_out: "Signed out successfully."
unlocks: unlocks:
send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes." send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
send_paranoid_instructions: "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes." send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
unlocked: "Your account has been unlocked successfully. Please sign in to continue." unlocked: "Your account has been unlocked successfully. Please sign in to continue."
errors: errors:
messages: messages:

View file

@ -2,12 +2,12 @@ Metamaps::Application.routes.draw do
root to: 'main#home', via: :get root to: 'main#home', via: :get
match 'request', to: 'main#requestinvite', via: :get, as: :request get 'request', to: 'main#requestinvite', as: :request
match 'search/topics', to: 'main#searchtopics', via: :get, as: :searchtopics get 'search/topics', to: 'main#searchtopics', as: :searchtopics
match 'search/maps', to: 'main#searchmaps', via: :get, as: :searchmaps get 'search/maps', to: 'main#searchmaps', as: :searchmaps
match 'search/mappers', to: 'main#searchmappers', via: :get, as: :searchmappers get 'search/mappers', to: 'main#searchmappers', as: :searchmappers
match 'search/synapses', to: 'main#searchsynapses', via: :get, as: :searchsynapses get 'search/synapses', to: 'main#searchsynapses', as: :searchsynapses
resources :mappings, except: [:index, :new, :edit] resources :mappings, except: [:index, :new, :edit]
resources :metacode_sets, :except => [:show] resources :metacode_sets, :except => [:show]
@ -16,28 +16,28 @@ Metamaps::Application.routes.draw do
resources :topics, except: [:index, :new, :edit] do resources :topics, except: [:index, :new, :edit] do
get :autocomplete_topic, :on => :collection get :autocomplete_topic, :on => :collection
end end
match 'topics/:id/network', to: 'topics#network', via: :get, as: :network get 'topics/:id/network', to: 'topics#network', as: :network
match 'topics/:id/relative_numbers', to: 'topics#relative_numbers', via: :get, as: :relative_numbers get 'topics/:id/relative_numbers', to: 'topics#relative_numbers', as: :relative_numbers
match 'topics/:id/relatives', to: 'topics#relatives', via: :get, as: :relatives get 'topics/:id/relatives', to: 'topics#relatives', as: :relatives
match 'explore/active', to: 'maps#index', via: :get, as: :activemaps get 'explore/active', to: 'maps#index', as: :activemaps
match 'explore/featured', to: 'maps#index', via: :get, as: :featuredmaps get 'explore/featured', to: 'maps#index', as: :featuredmaps
match 'explore/mine', to: 'maps#index', via: :get, as: :mymaps get 'explore/mine', to: 'maps#index', as: :mymaps
match 'explore/mapper/:id', to: 'maps#index', via: :get, as: :usermaps get 'explore/mapper/:id', to: 'maps#index', as: :usermaps
resources :maps, except: [:new, :edit] resources :maps, except: [:new, :edit]
match 'maps/:id/contains', to: 'maps#contains', via: :get, as: :contains get 'maps/:id/contains', to: 'maps#contains', as: :contains
match 'maps/:id/upload_screenshot', to: 'maps#screenshot', via: :post, as: :screenshot post 'maps/:id/upload_screenshot', to: 'maps#screenshot', as: :screenshot
devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords', sessions: 'devise/sessions' }, :skip => [:sessions] devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords', sessions: 'devise/sessions' }, :skip => :sessions
devise_scope :user do devise_scope :user do
get 'login' => 'devise/sessions#new', :as => :new_user_session get 'login' => 'devise/sessions#new', :as => :new_user_session
post 'login' => 'devise/sessions#create', :as => :user_session post 'login' => 'devise/sessions#create', :as => :user_session
get 'logout' => 'devise/sessions#destroy', :as => :destroy_user_session get 'logout' => 'devise/sessions#destroy', :as => :destroy_user_session
get 'join' => 'devise/registrations#new', :as => :new_user_registration get 'join' => 'devise/registrations#new', :as => :new_user_registration_path
end end
match 'users/:id/details', to: 'users#details', via: :get, as: :details get 'users/:id/details', to: 'users#details', as: :details
match 'user/updatemetacodes', to: 'users#updatemetacodes', via: :post, as: :updatemetacodes post 'user/updatemetacodes', to: 'users#updatemetacodes', as: :updatemetacodes
resources :users, except: [:index, :destroy] resources :users, except: [:index, :destroy]
end end

View file

@ -11,7 +11,7 @@ vagrant ssh --command "cd /vagrant; gem install bundler";
vagrant ssh --command "cd /vagrant; bundle install"; vagrant ssh --command "cd /vagrant; bundle install";
# copy the db config # copy the db config
vagrant ssh --command "cd /vagrant; cp config/database.yml.default config/database.yml"; vagrant ssh --command "cd /vagrant; cp .example-env .env";
# Rake all the things # Rake all the things
vagrant ssh --command "cd /vagrant; rake db:create; rake db:schema:load; rake db:fixtures:load" vagrant ssh --command "cd /vagrant; rake db:create; rake db:schema:load; rake db:fixtures:load"

View file

@ -0,0 +1,36 @@
class MappingPolymorphism < ActiveRecord::Migration
def up
add_column :mappings, :mappable_id, :integer
add_column :mappings, :mappable_type, :string
add_index :mappings, [:mappable_id, :mappable_type]
Mapping.find_each do |mapping|
if mapping.synapse_id.nil? and mapping.topic_id.nil?
puts "Mapping id=#{mapping.id} has no valid id, skipping!"
next
end
if not mapping.synapse_id.nil? and not mapping.topic_id.nil?
puts "Mapping id=#{mapping.id} has both topic and synapse ids, skipping!"
next
end
unless mapping.synapse_id.nil?
mapping.mappable = Synapse.find_by(id: mapping.synapse_id)
else
mapping.mappable = Topic.find_by(id: mapping.topic_id)
end
if mapping.mappable.nil?
mapping.delete
else
mapping.save
end
end
end
def down
remove_index :mappings, [:mappable_id, :mappable_type]
remove_column :mappings, :mappable_id, :integer
remove_column :mappings, :mappable_type, :string
end
end

View file

@ -0,0 +1,16 @@
class AddMissingIndexes < ActiveRecord::Migration
def change
add_index :topics, :user_id
add_index :topics, :metacode_id
add_index :synapses, [:node2_id, :node2_id]
add_index :synapses, [:node1_id, :node1_id]
add_index :synapses, :user_id
add_index :synapses, :node1_id
add_index :synapses, :node2_id
add_index :mappings, [:map_id, :topic_id]
add_index :mappings, [:map_id, :synapse_id]
add_index :mappings, :map_id
add_index :mappings, :user_id
add_index :maps, :user_id
end
end

View file

@ -0,0 +1,15 @@
class Metacode < ActiveRecord::Base
end
class MetacodeAssetPathUpdate < ActiveRecord::Migration
def change
Metacode.first(50).each do |metacode|
if metacode.icon.start_with?("/assets/icons/")
metacode.icon = metacode.icon.sub(/^\/assets\/icons/, "https://s3.amazonaws.com/metamaps-assets/metacodes")
metacode.icon = metacode.icon.sub('blueprint_96px', 'blueprint/96px')
metacode.icon = metacode.icon.sub('generics_96px', 'generics/96px')
metacode.save
end
end
end
end

View file

@ -9,21 +9,24 @@
# from scratch. The latter is a flawed and unsustainable approach (the more migrations # from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues). # you'll amass, the slower it'll run and the greater likelihood for issues).
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(:version => 20141121204712) do ActiveRecord::Schema.define(version: 20151028061513) do
create_table "in_metacode_sets", :force => true do |t| # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "in_metacode_sets", force: :cascade do |t|
t.integer "metacode_id" t.integer "metacode_id"
t.integer "metacode_set_id" t.integer "metacode_set_id"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
end end
add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" add_index "in_metacode_sets", ["metacode_id"], name: "index_in_metacode_sets_on_metacode_id", using: :btree
add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" add_index "in_metacode_sets", ["metacode_set_id"], name: "index_in_metacode_sets_on_metacode_set_id", using: :btree
create_table "mappings", :force => true do |t| create_table "mappings", force: :cascade do |t|
t.text "category" t.text "category"
t.integer "xloc" t.integer "xloc"
t.integer "yloc" t.integer "yloc"
@ -31,18 +34,26 @@ ActiveRecord::Schema.define(:version => 20141121204712) do
t.integer "synapse_id" t.integer "synapse_id"
t.integer "map_id" t.integer "map_id"
t.integer "user_id" t.integer "user_id"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
t.integer "mappable_id"
t.string "mappable_type"
end end
create_table "maps", :force => true do |t| add_index "mappings", ["map_id", "synapse_id"], name: "index_mappings_on_map_id_and_synapse_id", using: :btree
add_index "mappings", ["map_id", "topic_id"], name: "index_mappings_on_map_id_and_topic_id", using: :btree
add_index "mappings", ["map_id"], name: "index_mappings_on_map_id", using: :btree
add_index "mappings", ["mappable_id", "mappable_type"], name: "index_mappings_on_mappable_id_and_mappable_type", using: :btree
add_index "mappings", ["user_id"], name: "index_mappings_on_user_id", using: :btree
create_table "maps", force: :cascade do |t|
t.text "name" t.text "name"
t.boolean "arranged" t.boolean "arranged"
t.text "desc" t.text "desc"
t.text "permission" t.text "permission"
t.integer "user_id" t.integer "user_id"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
t.boolean "featured" t.boolean "featured"
t.string "screenshot_file_name" t.string "screenshot_file_name"
t.string "screenshot_content_type" t.string "screenshot_content_type"
@ -50,26 +61,28 @@ ActiveRecord::Schema.define(:version => 20141121204712) do
t.datetime "screenshot_updated_at" t.datetime "screenshot_updated_at"
end end
create_table "metacode_sets", :force => true do |t| add_index "maps", ["user_id"], name: "index_maps_on_user_id", using: :btree
create_table "metacode_sets", force: :cascade do |t|
t.string "name" t.string "name"
t.text "desc" t.text "desc"
t.integer "user_id" t.integer "user_id"
t.boolean "mapperContributed" t.boolean "mapperContributed"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
end end
add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" add_index "metacode_sets", ["user_id"], name: "index_metacode_sets_on_user_id", using: :btree
create_table "metacodes", :force => true do |t| create_table "metacodes", force: :cascade do |t|
t.text "name" t.text "name"
t.string "icon" t.string "icon"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
t.string "color" t.string "color"
end end
create_table "synapses", :force => true do |t| create_table "synapses", force: :cascade do |t|
t.text "desc" t.text "desc"
t.text "category" t.text "category"
t.text "weight" t.text "weight"
@ -77,19 +90,25 @@ ActiveRecord::Schema.define(:version => 20141121204712) do
t.integer "node1_id" t.integer "node1_id"
t.integer "node2_id" t.integer "node2_id"
t.integer "user_id" t.integer "user_id"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
end end
create_table "topics", :force => true do |t| add_index "synapses", ["node1_id", "node1_id"], name: "index_synapses_on_node1_id_and_node1_id", using: :btree
add_index "synapses", ["node1_id"], name: "index_synapses_on_node1_id", using: :btree
add_index "synapses", ["node2_id", "node2_id"], name: "index_synapses_on_node2_id_and_node2_id", using: :btree
add_index "synapses", ["node2_id"], name: "index_synapses_on_node2_id", using: :btree
add_index "synapses", ["user_id"], name: "index_synapses_on_user_id", using: :btree
create_table "topics", force: :cascade do |t|
t.text "name" t.text "name"
t.text "desc" t.text "desc"
t.text "link" t.text "link"
t.text "permission" t.text "permission"
t.integer "user_id" t.integer "user_id"
t.integer "metacode_id" t.integer "metacode_id"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
t.string "image_file_name" t.string "image_file_name"
t.string "image_content_type" t.string "image_content_type"
t.integer "image_file_size" t.integer "image_file_size"
@ -100,25 +119,28 @@ ActiveRecord::Schema.define(:version => 20141121204712) do
t.datetime "audio_updated_at" t.datetime "audio_updated_at"
end end
create_table "users", :force => true do |t| add_index "topics", ["metacode_id"], name: "index_topics_on_metacode_id", using: :btree
add_index "topics", ["user_id"], name: "index_topics_on_user_id", using: :btree
create_table "users", force: :cascade do |t|
t.string "name" t.string "name"
t.string "email" t.string "email"
t.text "settings" t.text "settings"
t.string "code", :limit => 8 t.string "code", limit: 8
t.string "joinedwithcode", :limit => 8 t.string "joinedwithcode", limit: 8
t.string "crypted_password" t.string "crypted_password"
t.string "password_salt" t.string "password_salt"
t.string "persistence_token" t.string "persistence_token"
t.string "perishable_token" t.string "perishable_token"
t.datetime "created_at", :null => false t.datetime "created_at", null: false
t.datetime "updated_at", :null => false t.datetime "updated_at", null: false
t.string "encrypted_password", :limit => 128, :default => "" t.string "encrypted_password", limit: 128, default: ""
t.string "remember_token" t.string "remember_token"
t.datetime "remember_created_at" t.datetime "remember_created_at"
t.string "reset_password_token" t.string "reset_password_token"
t.datetime "last_sign_in_at" t.datetime "last_sign_in_at"
t.string "last_sign_in_ip" t.string "last_sign_in_ip"
t.integer "sign_in_count", :default => 0 t.integer "sign_in_count", default: 0
t.datetime "current_sign_in_at" t.datetime "current_sign_in_at"
t.string "current_sign_in_ip" t.string "current_sign_in_ip"
t.datetime "reset_password_sent_at" t.datetime "reset_password_sent_at"
@ -130,6 +152,6 @@ ActiveRecord::Schema.define(:version => 20141121204712) do
t.integer "generation" t.integer "generation"
end end
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
end end

View file

@ -1,7 +1,306 @@
# This file should contain all the record creation needed to seed the database with its default values. # This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples: ## USERS
# User.new({
# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) name: 'user',
# Mayor.create(name: 'Emanuel', city: cities.first) email: 'user@user.com',
password: 'toolsplusconsciousness',
code: 'qwertyui',
joinedwithcode: 'qwertyui',
admin: 'false'
}).save(validate: false)
User.new({
name: 'admin',
email: 'admin@admin.com',
password: 'toolsplusconsciousness',
code: 'iuytrewq',
joinedwithcode: 'iuytrewq',
admin: 'true'
}).save(validate: false)
## END USERS
## METACODES
Metacode.create({
name: 'Action',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_action.png',
color: '#BD6C85'
})
Metacode.create({
name: 'Activity',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_activity.png',
color: '#6EBF65'
})
Metacode.create({
name: 'Catalyst',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_catalyst.png',
color: '#EF8964',
})
Metacode.create({
name: 'Closed',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_closedissue.png',
color: '#ABB49F',
})
Metacode.create({
name: 'Process',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_process.png',
color: '#BDB25E',
})
Metacode.create({
name: 'Future',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_futuredev.png',
color: '#25A17F',
})
Metacode.create({
name: 'Group',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_group.png',
color: '#7076BC',
})
Metacode.create({
name: 'Implication',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_implication.png',
color: '#83DECA',
})
Metacode.create({
name: 'Insight',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_insight.png',
color: '#B074AD',
})
Metacode.create({
name: 'Intention',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_intention.png',
color: '#BAEAFF',
})
Metacode.create({
name: 'Knowledge',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_knowledge.png',
color: '#60ACF7',
})
Metacode.create({
name: 'Location',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_location.png',
color: '#ABD9A7',
})
Metacode.create({
name: 'Need',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_need.png',
color: '#D2A7D4',
})
Metacode.create({
name: 'Open',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_openissue.png',
color: '#9BBF71',
})
Metacode.create({
name: 'Opportunity',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_opportunity.png',
color: '#889F64',
})
Metacode.create({
name: 'Person',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_person.png',
color: '#DE925F',
})
Metacode.create({
name: 'Platform',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_platform.png',
color: '#21C8FE',
})
Metacode.create({
name: 'Problem',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_problem.png',
color: '#99CFC4',
})
Metacode.create({
name: 'Resource',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_resource.png',
color: '#C98C63',
})
Metacode.create({
name: 'Role',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_role.png',
color: '#A8595D',
})
Metacode.create({
name: 'Task',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_task.png',
color: '#3397C4',
})
Metacode.create({
name: 'Trajectory',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_trajectory.png',
color: '#D3AA4C',
})
Metacode.create({
name: 'Argument',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_argument.png',
color: '#7FAEFD',
})
Metacode.create({
name: 'Con',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_con.png',
color: '#CF7C74',
})
Metacode.create({
name: 'Subject',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_subject.png',
color: '#8293D8',
})
Metacode.create({
name: 'Decision',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_decision.png',
color: '#CCA866',
})
Metacode.create({
name: 'Event',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_event.png',
color: '#F5854B',
})
Metacode.create({
name: 'Example',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_example.png',
color: '#618C61',
})
Metacode.create({
name: 'Experience',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_experience.png',
color: '#BE995F',
})
Metacode.create({
name: 'Feedback',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_feedback.png',
color: '#54A19D',
})
Metacode.create({
name: 'Aim',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_aim.png',
color: '#B0B0B0',
})
Metacode.create({
name: 'Good',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_goodpractice.png',
color: '#BD9E86',
})
Metacode.create({
name: 'Idea',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_idea.png',
color: '#C4BC5E',
})
Metacode.create({
name: 'List',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_list.png',
color: '#B7A499',
})
Metacode.create({
name: 'Media',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_media.png',
color: '#6D94CC',
})
Metacode.create({
name: 'Metamap',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_metamap.png',
color: '#AEA9FD',
})
Metacode.create({
name: 'Model',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_model.png',
color: '#B385BA',
})
Metacode.create({
name: 'Note',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_note.png',
color: '#A389A1',
})
Metacode.create({
name: 'Perspective',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_perspective.png',
color: '#2EB6CC',
})
Metacode.create({
name: 'Pro',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_pro.png',
color: '#89B879',
})
Metacode.create({
name: 'Project',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_project.png',
color: '#85A050',
})
Metacode.create({
name: 'Question',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_question.png',
color: '#5CB3B3',
})
Metacode.create({
name: 'Reference',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_reference.png',
color: '#A7A7A7',
})
Metacode.create({
name: 'Research',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_research.png',
color: '#CD8E89',
})
Metacode.create({
name: 'Status',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_status.png',
color: '#EFA7C0',
})
Metacode.create({
name: 'Tool',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_tool.png',
color: '#828282',
})
Metacode.create({
name: 'Wildcard',
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_wildcard.png',
color: '#73C7DE',
})
## END METACODES

43
doc/MacInstallation.md Normal file
View file

@ -0,0 +1,43 @@
# OSX Install
If you are doing an upgrade and or recent pull for changes you will need to change your default ruby package from 2.1.1 to ruby 2.1.2
Some of these steps are pulled from http://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/
Install homebrew
\curl -sSL https://get.rvm.io | bash -s stable --rails
rvm install 2.1.3 --with-gcc=clang
rvm use 2.1.3
gem install lunchy
Now install homebrew.
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Then install nodejs
brew install nodejs
And postgresql:
brew install postgresql
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
createuser metamaps -P -s -d
Set a password, then start the service:
lunchy start postgres
Change directory to the metamaps git repository, and run:
bundle install
Copy the .example-env file and rename it to .env. Then modify the DB_USERNAME and DB_PASSWORD values to match the postgres username and password you set
rake db:create
rake db:schema:load
rake db:fixtures:load
rails server
Now open a browser to http://localhost:3000!

View file

@ -1,2 +0,0 @@
Use this README file to introduce your application and point to useful places in the API for learning more.
Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries.

53
doc/RspecTesting.md Normal file
View file

@ -0,0 +1,53 @@
## Testing with RSpec
RSpec is a ruby gem that allows you to test your code base. This is great -
every time you make a change, you can do some basic sanity checks to make sure
you didn't break anything.
To test Metamaps, run
rspec
in the top level directory. It will automatically search the `spec` directory
for files called `*_spec.rb`, and run them as tests. When it's done testing, it
will print a report telling you how many tests failed. With luck, the number
will be 0.
Note that if your test database doesn't exist yet, you'll need to create it
first:
RAILS_ENV=test rake db:create
At the time of writing, there are four directories in the spec folder. One,
`support`, is for helper functions. `rails_helper.rb` and `spec_helper.rb` are
also for helper functions.
`factories` is for a gem called [factory-girl][factory-girl]. This gem lets you
use the `create` and `build` functions to quickly create the simplest possible
valid version of a given model. For instance:
let(:map1) { create :map }
let(:ronald) { create :user, name: "Ronald" }
let(:map2) { create :map, user: ronald }
As you can see, you can also customize the factories. You can read the full
documentation at the link above or check the existing specs to see how it works.
It is worth reading through the factories to see how they are defined. If you
add a model to `app/models`, please also create a factory for it that defines
the minimum valid state for that model.
Finally, `models` and `controllers` have the actual spec files. Writing specs is
usually fairly simple but you do need to understand the syntax. You can read
more at [rspec.info][rspec-docs].
If you modify the metamaps codebase, please consider adding tests verifying that
the added code works. This will help in a few ways:
- Unrelated changes in the future that break your code will be spotted earlier
- Your changes will be more easily understood, since the *purpose* will be
described by the spec
Happy testing!
[factory-girl]: https://github.com/thoughtbot/factory_girl
[rspec-docs]: http://rspec.info

98
doc/UbuntuInstallation.md Normal file
View file

@ -0,0 +1,98 @@
Firstly this walkthrough is done with a 14.04 32bit install of Ubuntu.
Let's check if all updates for the system are installed first. In a
terminal type:
sudo apt-get update
Now we need to install git:
sudo apt-get install git
Now let's get our RVM installed (Ruby Version Manager). Now this is fun
because the package you will get from apt-get is outdated. So we are going
to use CURL to get RVM
sudo apt-get install curl
Then lets install RVM with curl like this
gpg --keyserver hkp://keys.gnupg.net \
--recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
PATH=$PATH:$HOME/.rvm/bin
[[ -s "$HOME/.profile" ]] && source "$HOME/.profile"
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
source ~/.rvm/scripts/rvm
Now we can actually install RVM
rvm requirements
Running this will check your system for requirements as well so you will need to put your system password in.
All right now we can download metamaps from the master using git
git clone https://github.com/metamaps/metamaps_gen002.git
Now there is a couple other things we are going to need which is nodejs, postgresql, libpq-dev and redis-server
sudo apt-get install nodejs npm
sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo apt-get install postgresql
sudo apt-get install libpq-dev
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
rvm install $(cat metamaps_gen002/.ruby-version)
Now we also need to copy .example-env to a new file named .env. Review the
configuration in here to see if you need any changes.
cp .example-env .env
Now run inside your metamaps_gen002 folder:
gem install bundle
bundle install
in your top level directory for metamaps. This is a lengthy process so you might want to go and make a coffee or something :)
All right now we need to make sure your postgres password is the same as
it is listed in the .env file so we are going to set it by
sudo -u postgres psql
Use these commands to set the password to 3112 and then quit:
\password postgres
\q
now we can use rake to create, load the schema into, and load db/seeds.rb
into the postgres database:
rake db:setup
Open a new terminal, navigate to the metamaps directory, and execute the
server:
rails s
and dont forget to run the other server for realtime...
cd realtime
npm install
node realtime-server.js
Now you're all set enjoy your personal server of metamaps :) Navigate your browser to localhost:3000 once you have the server running. Sign in with the default account
email: user@user.com
password: toolsplusconsciousness
OR create a new account at /join, and use access code 'qwertyui'
Start mapping and programming!

View file

@ -0,0 +1,54 @@
Before you begin, you'll need to install stuff:
Ruby, Git, and Rails: http://railsinstaller.org/en
PostgreSQL 9.2: http://www.enterprisedb.com/products-services-training/pgdownload
nodejs: http://nodejs.org/download
During the installation of the PostgreSQL database, you'll need to choose a
database password. Anything is fine, just note down what you choose.
Once you are ready, create a new folder to hold this and any other git
repositories. As an example, let's pretend you've chose C:\git, and made that
folder writable by your user account.
Now you are ready to clone the Metamaps git repository:
git clone https://github.com/metamaps/metamaps_gen002.git --branch develop
cd metamaps_gen002
bundle install
The third `bundle install` command downloads and installs the rubygem
dependencies of Metamaps.
At this point you should be in C:\git\metamaps_gen002, or whatever equivalent
directory you've chosen. The next step is to set up your database
configuration. From the metamaps_gen002 directory, run
start config
This command will open a Windows Explorer window of the "config" directory of
Metamaps. Copy `.example-env`, and rename the copy to `.env`. Edit the file and
set the DB_PASSWORD to be whatever you set up with postgres earlier. Once
you're done, then move back into the command prompt. The next few commands will
fail unless `.env` is correctly configured and Postgres is running.
rake db:create
rake db:schema:load
rake db:fixtures:load
And you're set up! At this point, you should be able to run the server at any
time with only one command; you don't need to repeat any of the previous steps
again. The command to run the server is:
rails s
Navigate your browser to localhost:3000 once you have the server running
Sign in with the default account
email: user@user.com
password: toolsplusconsciousness
OR create a new account at /join, and use access code 'qwertyui'
Start mapping and programming!

39
doc/metamaps-qa-steps.md Normal file
View file

@ -0,0 +1,39 @@
# Metamaps Tests
Run these tests to be reasonably sure that your code changes haven't broken anything.
### Users & Accounts
- Create an account using your join code
- Log in to the interface
- Check your user's "generation"
- Edit your profile picture, email, name, and password
- Remove your profile picture
### Maps, Topics, Synapses, and Permissions
- Create three maps: private, public, and another public
- Change the last map's permissions to commons
- Change a map's name
- Create a topic on map #1
- Verify (in a private window or another browser) that the second user can't acccess map #1
- Create a topic on map #2
- Verify that the second user **can't** edit map #2
- Create a topic on map #3
- Verify that the second user **can** edit map #3
- Pull a topic from map #1 to map #3
- Create a private topic on map #1
- Verify that the private topic can be pulled from map #1 by the same user
- Verify that the private topic can't be pulled from map #1 by another user
### Mappings
- Add a number of topics to one of your maps. Reload to see if they are still there.
- Add a number of synapses to one of your maps. Reload to see if they are still there.
- Rearrange one of your maps and save the layout. Reload to see if the layout is preserved.
### Misc
- Login as admin. Change metacode sets.
- Set the screenshot for one of your maps, and verify the index of maps is updated.
- Open two browsers on map #3 and verify that realtime editing works (you'll need to be running the realtime server for this to work).

View file

@ -1,6 +1,8 @@
require 'dotenv/tasks'
namespace :heroku do namespace :heroku do
desc "Generate the Heroku gems manifest from gem dependencies" desc "Generate the Heroku gems manifest from gem dependencies"
task :gems do task :gems => :dotenv do
RAILS_ENV='production' RAILS_ENV='production'
Rake::Task[:environment].invoke Rake::Task[:environment].invoke
list = Rails.configuration.gems.collect do |g| list = Rails.configuration.gems.collect do |g|

View file

@ -26,7 +26,7 @@
} }
body { body {
background: #d8d9da url(/assets/shattered_@2X.png); background: #d8d9da url(https://s3.amazonaws.com/metamaps-assets/site/shattered_%402X.png);
font-family: 'din-regular', helvetica, sans-serif; font-family: 'din-regular', helvetica, sans-serif;
color: #424242; color: #424242;
text-align: justify; text-align: justify;
@ -61,7 +61,7 @@
border-radius: 225px; border-radius: 225px;
-webkit-border-radius: 225px; -webkit-border-radius: 225px;
-moz-border-radius: 225px; -moz-border-radius: 225px;
background: url(/assets/monkeyselfie.jpg) no-repeat; background: url(https://s3.amazonaws.com/metamaps-assets/site/monkeyselfie.jpg) no-repeat;
float: left; float: left;
background-position:50% 20%; background-position:50% 20%;
background-size: 100%; background-size: 100%;

View file

@ -1 +1,18 @@
'Real-Time' ## Node.js realtime server
To run the server, you need to install the dependencies and run the server.
Please ensure you have followed the OS-specific instructions in doc/ to
install NodeJS. Once you have node, then you can proceed to install the
node packages for the realtime server:
cd realtime
npm install #creates node_modules directory
node realtime-server.js
That's it!
To run the server as a daemon that will be re-run if it crashes, you can
use the forever node package.
sudo npm install -g forever
forever start realtime-server.js

View file

@ -2,6 +2,7 @@
"name": "RoR-real-time", "name": "RoR-real-time",
"description": "providing real-time sychronization for ruby on rails", "description": "providing real-time sychronization for ruby on rails",
"version": "0.0.1", "version": "0.0.1",
"private": true,
"dependencies": { "dependencies": {
"socket.io": "0.9.12" "socket.io": "0.9.12"
} }

View file

@ -0,0 +1,160 @@
require 'rails_helper'
# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# It assumes that the implementation code is generated by the rails scaffold
# generator. If you are using any extension libraries to generate different
# controller code, this generated spec may or may not pass.
#
# It only uses APIs available in rails and/or rspec-rails. There are a number
# of tools you can use to make these specs even more expressive, but we're
# sticking to rails and rspec-rails APIs to keep things simple and stable.
#
# Compared to earlier versions of this generator, there is very limited use of
# stubs and message expectations in this spec. Stubs are only used when there
# is no simpler way to get a handle on the object needed for the example.
# Message expectations are only used when there is no simpler way to specify
# that an instance is receiving a specific message.
RSpec.describe MappingsController, type: :controller do
# This should return the minimal set of attributes required to create a valid
# Mapping. As you add validations to Mapping, be sure to
# adjust the attributes here as well.
let(:valid_attributes) do
skip('Add a hash of attributes valid for your model')
end
let(:invalid_attributes) do
skip('Add a hash of attributes invalid for your model')
end
# This should return the minimal set of values that should be in the session
# in order to pass any filters (e.g. authentication) defined in
# MappingsController. Be sure to keep this updated too.
let(:valid_session) { {} }
describe 'GET #index' do
it 'assigns all mappings as @mappings' do
mapping = Mapping.create! valid_attributes
get :index, {}, valid_session
expect(assigns(:mappings)).to eq([mapping])
end
end
describe 'GET #show' do
it 'assigns the requested mapping as @mapping' do
mapping = Mapping.create! valid_attributes
get :show, { id: mapping.to_param }, valid_session
expect(assigns(:mapping)).to eq(mapping)
end
end
describe 'GET #edit' do
it 'assigns the requested mapping as @mapping' do
mapping = Mapping.create! valid_attributes
get :edit, { id: mapping.to_param }, valid_session
expect(assigns(:mapping)).to eq(mapping)
end
end
describe 'POST #create' do
context 'with valid params' do
it 'creates a new Mapping' do
expect do
post :create, { mapping: valid_attributes }, valid_session
end.to change(Mapping, :count).by(1)
end
it 'assigns a newly created mapping as @mapping' do
post :create, { mapping: valid_attributes }, valid_session
expect(assigns(:mapping)).to be_a(Mapping)
expect(assigns(:mapping)).to be_persisted
end
it 'redirects to the created mapping' do
post :create, { mapping: valid_attributes }, valid_session
expect(response).to redirect_to(Mapping.last)
end
end
context 'with invalid params' do
it 'assigns a newly created but unsaved mapping as @mapping' do
post :create, { mapping: invalid_attributes }, valid_session
expect(assigns(:mapping)).to be_a_new(Mapping)
end
it "re-renders the 'new' template" do
post :create, { mapping: invalid_attributes }, valid_session
expect(response).to render_template('new')
end
end
end
describe 'PUT #update' do
context 'with valid params' do
let(:new_attributes) do
skip('Add a hash of attributes valid for your model')
end
it 'updates the requested mapping' do
mapping = Mapping.create! valid_attributes
put :update,
{ id: mapping.to_param, mapping: new_attributes },
valid_session
mapping.reload
skip('Add assertions for updated state')
end
it 'assigns the requested mapping as @mapping' do
mapping = Mapping.create! valid_attributes
put :update,
{ id: mapping.to_param, mapping: valid_attributes },
valid_session
expect(assigns(:mapping)).to eq(mapping)
end
it 'redirects to the mapping' do
mapping = Mapping.create! valid_attributes
put :update,
{ id: mapping.to_param, mapping: valid_attributes },
valid_session
expect(response).to redirect_to(mapping)
end
end
context 'with invalid params' do
it 'assigns the mapping as @mapping' do
mapping = Mapping.create! valid_attributes
put :update,
{ id: mapping.to_param, mapping: invalid_attributes },
valid_session
expect(assigns(:mapping)).to eq(mapping)
end
it "re-renders the 'edit' template" do
mapping = Mapping.create! valid_attributes
put :update,
{ id: mapping.to_param, mapping: invalid_attributes },
valid_session
expect(response).to render_template('edit')
end
end
end
describe 'DELETE #destroy' do
it 'destroys the requested mapping' do
mapping = Mapping.create! valid_attributes
expect do
delete :destroy, { id: mapping.to_param }, valid_session
end.to change(Mapping, :count).by(-1)
end
it 'redirects to the mappings list' do
mapping = Mapping.create! valid_attributes
delete :destroy, { id: mapping.to_param }, valid_session
expect(response).to redirect_to(mappings_url)
end
end
end

View file

@ -0,0 +1,160 @@
require 'rails_helper'
# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# It assumes that the implementation code is generated by the rails scaffold
# generator. If you are using any extension libraries to generate different
# controller code, this generated spec may or may not pass.
#
# It only uses APIs available in rails and/or rspec-rails. There are a number
# of tools you can use to make these specs even more expressive, but we're
# sticking to rails and rspec-rails APIs to keep things simple and stable.
#
# Compared to earlier versions of this generator, there is very limited use of
# stubs and message expectations in this spec. Stubs are only used when there
# is no simpler way to get a handle on the object needed for the example.
# Message expectations are only used when there is no simpler way to specify
# that an instance is receiving a specific message.
RSpec.describe MapsController, type: :controller do
# This should return the minimal set of attributes required to create a valid
# Map. As you add validations to Map, be sure to
# adjust the attributes here as well.
let(:valid_attributes) do
skip('Add a hash of attributes valid for your model')
end
let(:invalid_attributes) do
skip('Add a hash of attributes invalid for your model')
end
# This should return the minimal set of values that should be in the session
# in order to pass any filters (e.g. authentication) defined in
# MapsController. Be sure to keep this updated too.
let(:valid_session) { {} }
describe 'GET #index' do
it 'assigns all maps as @maps' do
map = Map.create! valid_attributes
get :index, {}, valid_session
expect(assigns(:maps)).to eq([map])
end
end
describe 'GET #show' do
it 'assigns the requested map as @map' do
map = Map.create! valid_attributes
get :show, { id: map.to_param }, valid_session
expect(assigns(:map)).to eq(map)
end
end
describe 'GET #edit' do
it 'assigns the requested map as @map' do
map = Map.create! valid_attributes
get :edit, { id: map.to_param }, valid_session
expect(assigns(:map)).to eq(map)
end
end
describe 'POST #create' do
context 'with valid params' do
it 'creates a new Map' do
expect do
post :create, { map: valid_attributes }, valid_session
end.to change(Map, :count).by(1)
end
it 'assigns a newly created map as @map' do
post :create, { map: valid_attributes }, valid_session
expect(assigns(:map)).to be_a(Map)
expect(assigns(:map)).to be_persisted
end
it 'redirects to the created map' do
post :create, { map: valid_attributes }, valid_session
expect(response).to redirect_to(Map.last)
end
end
context 'with invalid params' do
it 'assigns a newly created but unsaved map as @map' do
post :create, { map: invalid_attributes }, valid_session
expect(assigns(:map)).to be_a_new(Map)
end
it "re-renders the 'new' template" do
post :create, { map: invalid_attributes }, valid_session
expect(response).to render_template('new')
end
end
end
describe 'PUT #update' do
context 'with valid params' do
let(:new_attributes) do
skip('Add a hash of attributes valid for your model')
end
it 'updates the requested map' do
map = Map.create! valid_attributes
put :update,
{ id: map.to_param, map: new_attributes },
valid_session
map.reload
skip('Add assertions for updated state')
end
it 'assigns the requested map as @map' do
map = Map.create! valid_attributes
put :update,
{ id: map.to_param, map: valid_attributes },
valid_session
expect(assigns(:map)).to eq(map)
end
it 'redirects to the map' do
map = Map.create! valid_attributes
put :update,
{ id: map.to_param, map: valid_attributes },
valid_session
expect(response).to redirect_to(map)
end
end
context 'with invalid params' do
it 'assigns the map as @map' do
map = Map.create! valid_attributes
put :update,
{ id: map.to_param, map: invalid_attributes },
valid_session
expect(assigns(:map)).to eq(map)
end
it "re-renders the 'edit' template" do
map = Map.create! valid_attributes
put :update,
{ id: map.to_param, map: invalid_attributes },
valid_session
expect(response).to render_template('edit')
end
end
end
describe 'DELETE #destroy' do
it 'destroys the requested map' do
map = Map.create! valid_attributes
expect do
delete :destroy, { id: map.to_param }, valid_session
end.to change(Map, :count).by(-1)
end
it 'redirects to the maps list' do
map = Map.create! valid_attributes
delete :destroy, { id: map.to_param }, valid_session
expect(response).to redirect_to(maps_url)
end
end
end

View file

@ -0,0 +1,172 @@
require 'rails_helper'
# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# It assumes that the implementation code is generated by the rails scaffold
# generator. If you are using any extension libraries to generate different
# controller code, this generated spec may or may not pass.
#
# It only uses APIs available in rails and/or rspec-rails. There are a number
# of tools you can use to make these specs even more expressive, but we're
# sticking to rails and rspec-rails APIs to keep things simple and stable.
#
# Compared to earlier versions of this generator, there is very limited use of
# stubs and message expectations in this spec. Stubs are only used when there
# is no simpler way to get a handle on the object needed for the example.
# Message expectations are only used when there is no simpler way to specify
# that an instance is receiving a specific message.
RSpec.describe MetacodesController, type: :controller do
before :each do
@user = create(:user, admin: true)
sign_in @user
end
# This should return the minimal set of attributes required to create a valid
# Metacode. As you add validations to Metacode, be sure to
# adjust the attributes here as well.
let(:valid_attributes) do
skip('Add a hash of attributes valid for your model')
end
let(:invalid_attributes) do
skip('Add a hash of attributes invalid for your model')
end
# This should return the minimal set of values that should be in the session
# in order to pass any filters (e.g. authentication) defined in
# MetacodesController. Be sure to keep this updated too.
let(:valid_session) { {} }
describe 'GET #index' do
it 'assigns all metacodes as @metacodes' do
metacode = Metacode.create! valid_attributes
get :index, {}, valid_session
expect(assigns(:metacodes)).to eq([metacode])
end
end
describe 'GET #show' do
it 'assigns the requested metacode as @metacode' do
metacode = Metacode.create! valid_attributes
get :show, { id: metacode.to_param }, valid_session
expect(assigns(:metacode)).to eq(metacode)
end
end
describe 'GET #new' do
it 'assigns a new metacode as @metacode' do
get :new, {}, valid_session
expect(assigns(:metacode)).to be_a_new(Metacode)
end
end
describe 'GET #edit' do
it 'assigns the requested metacode as @metacode' do
metacode = Metacode.create! valid_attributes
get :edit, { id: metacode.to_param }, valid_session
expect(assigns(:metacode)).to eq(metacode)
end
end
describe 'POST #create' do
context 'with valid params' do
it 'creates a new Metacode' do
expect do
post :create, { metacode: valid_attributes }, valid_session
end.to change(Metacode, :count).by(1)
end
it 'assigns a newly created metacode as @metacode' do
post :create, { metacode: valid_attributes }, valid_session
expect(assigns(:metacode)).to be_a(Metacode)
expect(assigns(:metacode)).to be_persisted
end
it 'redirects to the created metacode' do
post :create, { metacode: valid_attributes }, valid_session
expect(response).to redirect_to(Metacode.last)
end
end
context 'with invalid params' do
it 'assigns a newly created but unsaved metacode as @metacode' do
post :create, { metacode: invalid_attributes }, valid_session
expect(assigns(:metacode)).to be_a_new(Metacode)
end
it "re-renders the 'new' template" do
post :create, { metacode: invalid_attributes }, valid_session
expect(response).to render_template('new')
end
end
end
describe 'PUT #update' do
context 'with valid params' do
let(:new_attributes) do
skip('Add a hash of attributes valid for your model')
end
it 'updates the requested metacode' do
metacode = Metacode.create! valid_attributes
put :update,
{ id: metacode.to_param, metacode: new_attributes },
valid_session
metacode.reload
skip('Add assertions for updated state')
end
it 'assigns the requested metacode as @metacode' do
metacode = Metacode.create! valid_attributes
put :update,
{ id: metacode.to_param, metacode: valid_attributes },
valid_session
expect(assigns(:metacode)).to eq(metacode)
end
it 'redirects to the metacode' do
metacode = Metacode.create! valid_attributes
put :update,
{ id: metacode.to_param, metacode: valid_attributes },
valid_session
expect(response).to redirect_to(metacode)
end
end
context 'with invalid params' do
it 'assigns the metacode as @metacode' do
metacode = Metacode.create! valid_attributes
put :update,
{ id: metacode.to_param, metacode: invalid_attributes },
valid_session
expect(assigns(:metacode)).to eq(metacode)
end
it "re-renders the 'edit' template" do
metacode = Metacode.create! valid_attributes
put :update,
{ id: metacode.to_param, metacode: invalid_attributes },
valid_session
expect(response).to render_template('edit')
end
end
end
describe 'DELETE #destroy' do
it 'destroys the requested metacode' do
metacode = Metacode.create! valid_attributes
expect do
delete :destroy, { id: metacode.to_param }, valid_session
end.to change(Metacode, :count).by(-1)
end
it 'redirects to the metacodes list' do
metacode = Metacode.create! valid_attributes
delete :destroy, { id: metacode.to_param }, valid_session
expect(response).to redirect_to(metacodes_url)
end
end
end

View file

@ -0,0 +1,160 @@
require 'rails_helper'
# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# It assumes that the implementation code is generated by the rails scaffold
# generator. If you are using any extension libraries to generate different
# controller code, this generated spec may or may not pass.
#
# It only uses APIs available in rails and/or rspec-rails. There are a number
# of tools you can use to make these specs even more expressive, but we're
# sticking to rails and rspec-rails APIs to keep things simple and stable.
#
# Compared to earlier versions of this generator, there is very limited use of
# stubs and message expectations in this spec. Stubs are only used when there
# is no simpler way to get a handle on the object needed for the example.
# Message expectations are only used when there is no simpler way to specify
# that an instance is receiving a specific message.
RSpec.describe SynapsesController, type: :controller do
# This should return the minimal set of attributes required to create a valid
# Synapse. As you add validations to Synapse, be sure to
# adjust the attributes here as well.
let(:valid_attributes) do
skip('Add a hash of attributes valid for your model')
end
let(:invalid_attributes) do
skip('Add a hash of attributes invalid for your model')
end
# This should return the minimal set of values that should be in the session
# in order to pass any filters (e.g. authentication) defined in
# SynapsesController. Be sure to keep this updated too.
let(:valid_session) { {} }
describe 'GET #index' do
it 'assigns all synapses as @synapses' do
synapse = Synapse.create! valid_attributes
get :index, {}, valid_session
expect(assigns(:synapses)).to eq([synapse])
end
end
describe 'GET #show' do
it 'assigns the requested synapse as @synapse' do
synapse = Synapse.create! valid_attributes
get :show, { id: synapse.to_param }, valid_session
expect(assigns(:synapse)).to eq(synapse)
end
end
describe 'GET #edit' do
it 'assigns the requested synapse as @synapse' do
synapse = Synapse.create! valid_attributes
get :edit, { id: synapse.to_param }, valid_session
expect(assigns(:synapse)).to eq(synapse)
end
end
describe 'POST #create' do
context 'with valid params' do
it 'creates a new Synapse' do
expect do
post :create, { synapse: valid_attributes }, valid_session
end.to change(Synapse, :count).by(1)
end
it 'assigns a newly created synapse as @synapse' do
post :create, { synapse: valid_attributes }, valid_session
expect(assigns(:synapse)).to be_a(Synapse)
expect(assigns(:synapse)).to be_persisted
end
it 'redirects to the created synapse' do
post :create, { synapse: valid_attributes }, valid_session
expect(response).to redirect_to(Synapse.last)
end
end
context 'with invalid params' do
it 'assigns a newly created but unsaved synapse as @synapse' do
post :create, { synapse: invalid_attributes }, valid_session
expect(assigns(:synapse)).to be_a_new(Synapse)
end
it "re-renders the 'new' template" do
post :create, { synapse: invalid_attributes }, valid_session
expect(response).to render_template('new')
end
end
end
describe 'PUT #update' do
context 'with valid params' do
let(:new_attributes) do
skip('Add a hash of attributes valid for your model')
end
it 'updates the requested synapse' do
synapse = Synapse.create! valid_attributes
put :update,
{ id: synapse.to_param, synapse: new_attributes },
valid_session
synapse.reload
skip('Add assertions for updated state')
end
it 'assigns the requested synapse as @synapse' do
synapse = Synapse.create! valid_attributes
put :update,
{ id: synapse.to_param, synapse: valid_attributes },
valid_session
expect(assigns(:synapse)).to eq(synapse)
end
it 'redirects to the synapse' do
synapse = Synapse.create! valid_attributes
put :update,
{ id: synapse.to_param, synapse: valid_attributes },
valid_session
expect(response).to redirect_to(synapse)
end
end
context 'with invalid params' do
it 'assigns the synapse as @synapse' do
synapse = Synapse.create! valid_attributes
put :update,
{ id: synapse.to_param, synapse: invalid_attributes },
valid_session
expect(assigns(:synapse)).to eq(synapse)
end
it "re-renders the 'edit' template" do
synapse = Synapse.create! valid_attributes
put :update,
{ id: synapse.to_param, synapse: invalid_attributes },
valid_session
expect(response).to render_template('edit')
end
end
end
describe 'DELETE #destroy' do
it 'destroys the requested synapse' do
synapse = Synapse.create! valid_attributes
expect do
delete :destroy, { id: synapse.to_param }, valid_session
end.to change(Synapse, :count).by(-1)
end
it 'redirects to the synapses list' do
synapse = Synapse.create! valid_attributes
delete :destroy, { id: synapse.to_param }, valid_session
expect(response).to redirect_to(synapses_url)
end
end
end

Some files were not shown because too many files have changed in this diff Show more