commit
eb7ba35e14
50 changed files with 3036 additions and 1669 deletions
38
Gemfile
38
Gemfile
|
@ -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'
|
||||||
|
@ -22,6 +19,10 @@ gem 'dotenv'
|
||||||
gem 'paperclip'
|
gem 'paperclip'
|
||||||
gem 'aws-sdk'
|
gem 'aws-sdk'
|
||||||
|
|
||||||
|
gem 'jquery-rails'
|
||||||
|
gem 'jquery-ui-rails'
|
||||||
|
gem 'jbuilder'
|
||||||
|
|
||||||
#gem 'therubyracer' #optional
|
#gem 'therubyracer' #optional
|
||||||
#gem 'rb-readline'
|
#gem 'rb-readline'
|
||||||
|
|
||||||
|
@ -29,32 +30,21 @@ 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
|
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 'better_errors'
|
||||||
# gem 'bcrypt-ruby', '~> 3.0.0'
|
gem 'quiet_assets'
|
||||||
|
end
|
||||||
# To use Jbuilder templates for JSON
|
|
||||||
gem 'jbuilder', '0.8.2'
|
|
||||||
|
|
||||||
# Use unicorn as the web server
|
|
||||||
# gem 'unicorn'
|
|
||||||
|
|
||||||
# Deploy with Capistrano
|
|
||||||
# gem 'capistrano'
|
|
||||||
|
|
||||||
# To use debugger
|
|
||||||
# gem 'ruby-debug19', :require => 'ruby-debug'
|
|
||||||
|
|
||||||
|
|
294
Gemfile.lock
294
Gemfile.lock
|
@ -1,58 +1,71 @@
|
||||||
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 (2.1.19)
|
||||||
aws-sdk (1.54.0)
|
aws-sdk-resources (= 2.1.19)
|
||||||
aws-sdk-v1 (= 1.54.0)
|
aws-sdk-core (2.1.19)
|
||||||
aws-sdk-v1 (1.54.0)
|
jmespath (~> 1.0)
|
||||||
json (~> 1.4)
|
aws-sdk-resources (2.1.19)
|
||||||
nokogiri (>= 1.4.4)
|
aws-sdk-core (= 2.1.19)
|
||||||
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)
|
||||||
|
builder (3.2.2)
|
||||||
|
cancancan (1.12.0)
|
||||||
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)
|
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)
|
||||||
|
@ -61,92 +74,117 @@ GEM
|
||||||
warden (~> 1.2.3)
|
warden (~> 1.2.3)
|
||||||
dotenv (2.0.0)
|
dotenv (2.0.0)
|
||||||
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)
|
formtastic (3.1.3)
|
||||||
actionpack (>= 3.2.13)
|
actionpack (>= 3.2.13)
|
||||||
formula (1.0.1)
|
formula (1.1.1)
|
||||||
rails (> 3.0.0)
|
rails (> 3.0.0)
|
||||||
hike (1.2.3)
|
globalid (0.3.6)
|
||||||
i18n (0.6.11)
|
activesupport (>= 4.1.0)
|
||||||
jbuilder (0.8.2)
|
i18n (0.7.0)
|
||||||
activesupport (>= 3.0.0)
|
jbuilder (2.3.1)
|
||||||
journey (1.0.4)
|
activesupport (>= 3.0.0, < 5)
|
||||||
jquery-rails (2.1.2)
|
multi_json (~> 1.2)
|
||||||
railties (>= 3.1.0, < 5.0)
|
jmespath (1.0.2)
|
||||||
thor (~> 0.14)
|
multi_json (~> 1.0)
|
||||||
json (1.8.1)
|
jquery-rails (4.0.5)
|
||||||
kaminari (0.16.1)
|
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.1)
|
||||||
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.0)
|
||||||
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.0)
|
||||||
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.1)
|
||||||
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-rails (0.3.4)
|
||||||
rack
|
pry (>= 0.9.10)
|
||||||
rack-test (0.6.2)
|
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)
|
sass (3.4.18)
|
||||||
responders (1.1.1)
|
sass-rails (5.0.4)
|
||||||
railties (>= 3.2, < 4.2)
|
railties (>= 4.0.0, < 5.0)
|
||||||
sass (3.4.5)
|
sass (~> 3.1)
|
||||||
sass-rails (3.2.6)
|
sprockets (>= 2.8, < 4.0)
|
||||||
railties (~> 3.2.0)
|
sprockets-rails (>= 2.0, < 4.0)
|
||||||
sass (>= 3.1.10)
|
tilt (>= 1.1, < 3)
|
||||||
tilt (~> 1.3)
|
slop (3.6.0)
|
||||||
sprockets (2.2.2)
|
sprockets (3.3.4)
|
||||||
hike (~> 1.2)
|
|
||||||
multi_json (~> 1.0)
|
|
||||||
rack (~> 1.0)
|
rack (~> 1.0)
|
||||||
tilt (~> 1.1, != 1.3.0)
|
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)
|
tzinfo (1.2.2)
|
||||||
polyglot
|
thread_safe (~> 0.1)
|
||||||
polyglot (>= 0.3.1)
|
uglifier (2.7.2)
|
||||||
tzinfo (0.3.41)
|
|
||||||
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 +196,30 @@ GEM
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
x86-mingw32
|
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
aws-sdk
|
aws-sdk
|
||||||
best_in_place
|
best_in_place
|
||||||
cancan
|
better_errors
|
||||||
coffee-rails (~> 3.2.1)
|
cancancan
|
||||||
|
coffee-rails
|
||||||
devise
|
devise
|
||||||
dotenv
|
dotenv
|
||||||
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-rails
|
||||||
|
quiet_assets
|
||||||
|
rails (= 4.2.4)
|
||||||
rails3-jquery-autocomplete
|
rails3-jquery-autocomplete
|
||||||
|
rails_12factor
|
||||||
redis
|
redis
|
||||||
sass-rails
|
sass-rails
|
||||||
uglifier (>= 1.0.3)
|
uglifier
|
||||||
uservoice-ruby
|
uservoice-ruby
|
||||||
|
|
File diff suppressed because one or more lines are too long
2451
app/assets/javascripts/lib/typeahead.bundle.js
Normal file
2451
app/assets/javascripts/lib/typeahead.bundle.js
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -616,7 +616,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',
|
||||||
|
|
|
@ -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
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -664,6 +666,15 @@ 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(
|
||||||
{
|
{
|
||||||
|
@ -672,16 +683,18 @@ Metamaps.Create = {
|
||||||
[{
|
[{
|
||||||
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -714,7 +727,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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -726,6 +739,31 @@ Metamaps.Create = {
|
||||||
Metamaps.Create.newSynapse.description = $(this).val();
|
Metamaps.Create.newSynapse.description = $(this).val();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var synapseBloodhound = new Bloodhound({
|
||||||
|
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
|
||||||
|
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||||
|
remote: {
|
||||||
|
url: '/search/synapses?term=%QUERY',
|
||||||
|
wildcard: '%QUERY',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
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
|
// initialize the autocomplete results for synapse creation
|
||||||
$('#synapse_desc').typeahead(
|
$('#synapse_desc').typeahead(
|
||||||
{
|
{
|
||||||
|
@ -733,28 +771,29 @@ Metamaps.Create = {
|
||||||
},
|
},
|
||||||
[{
|
[{
|
||||||
name: 'synapse_autocomplete',
|
name: 'synapse_autocomplete',
|
||||||
template: "<div class='genericSynapseDesc'>{{label}}</div>",
|
display: function(s) { return s.label; },
|
||||||
remote: {
|
templates: {
|
||||||
url: '/search/synapses?term=%QUERY'
|
suggestion: function(s) {
|
||||||
|
return Hogan.compile("<div class='genericSynapseDesc'>{{label}}</div>").render(s);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
engine: Hogan
|
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();
|
},
|
||||||
}
|
header: "<h3>Existing synapses</h3>"
|
||||||
},
|
},
|
||||||
engine: Hogan,
|
source: existingSynapseBloodhound,
|
||||||
header: "<h3>Existing synapses</h3>"
|
|
||||||
}]
|
}]
|
||||||
);
|
);
|
||||||
|
|
||||||
$('#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);
|
||||||
}
|
}
|
||||||
|
@ -777,7 +816,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;
|
||||||
|
@ -785,13 +824,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
|
||||||
|
|
||||||
|
@ -1534,8 +1566,6 @@ Metamaps.SynapseCard = {
|
||||||
////////////////////// END TOPIC AND SYNAPSE CARDS //////////////////////////////////
|
////////////////////// END TOPIC AND SYNAPSE CARDS //////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* VISUALIZE
|
* VISUALIZE
|
||||||
|
@ -2511,7 +2541,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
@ -2529,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);
|
||||||
|
@ -2549,7 +2579,7 @@ Metamaps.Realtime = {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test();
|
waitThenRenderTopic();
|
||||||
},
|
},
|
||||||
// removeTopic
|
// removeTopic
|
||||||
sendDeleteTopic: function (data) {
|
sendDeleteTopic: function (data) {
|
||||||
|
@ -2576,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();
|
||||||
|
@ -2604,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');
|
||||||
|
@ -2627,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);
|
||||||
|
@ -2646,7 +2676,7 @@ Metamaps.Realtime = {
|
||||||
cancel = true;
|
cancel = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
test();
|
waitThenRenderSynapse();
|
||||||
},
|
},
|
||||||
// deleteSynapse
|
// deleteSynapse
|
||||||
sendDeleteSynapse: function (data) {
|
sendDeleteSynapse: function (data) {
|
||||||
|
@ -2674,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();
|
||||||
|
@ -2784,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 {
|
||||||
|
@ -2828,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);
|
||||||
},
|
},
|
||||||
|
@ -2957,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
|
||||||
|
@ -2968,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');
|
||||||
|
@ -3013,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);
|
||||||
|
@ -3024,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 () {
|
||||||
|
@ -4024,14 +4054,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');
|
||||||
|
@ -4081,10 +4111,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);
|
||||||
|
|
||||||
|
@ -4103,10 +4133,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);
|
||||||
|
|
||||||
|
@ -4121,10 +4151,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);
|
||||||
|
|
||||||
|
@ -4195,14 +4225,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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -4259,8 +4289,8 @@ Metamaps.Synapse = {
|
||||||
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);
|
||||||
|
|
||||||
|
@ -4280,8 +4310,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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -1421,12 +1422,12 @@ h3.realtimeBoxTitle {
|
||||||
background-image: url(arrowright_sprite.png);
|
background-image: url(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 {
|
||||||
|
|
|
@ -301,7 +301,7 @@
|
||||||
.sidebarSearch .tt-dropdown-menu .maximizeResults {
|
.sidebarSearch .tt-dropdown-menu .maximizeResults {
|
||||||
background-position: -32px 0;
|
background-position: -32px 0;
|
||||||
}
|
}
|
||||||
.sidebarSearch .tt-suggestions {
|
.sidebarSearch .tt-dataset {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
.sidebarSearch .tt-suggestion {
|
.sidebarSearch .tt-suggestion {
|
||||||
|
@ -310,7 +310,7 @@
|
||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
}
|
}
|
||||||
.sidebarSearch .tt-is-under-cursor,
|
.sidebarSearch .tt-is-under-cursor,
|
||||||
.sidebarSearch .tt-is-under-mouse-cursor {
|
.sidebarSearch .tt-suggestion:hover {
|
||||||
background: #E0E0E0;
|
background: #E0E0E0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,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
|
||||||
|
|
|
@ -68,25 +68,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,7 +122,7 @@ 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.id != t.user_id)) }
|
||||||
|
|
||||||
render json: autocomplete_array_json(@topics)
|
render json: autocomplete_array_json(@topics)
|
||||||
end
|
end
|
||||||
|
@ -163,7 +158,7 @@ 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.id != m.user_id)) }
|
||||||
|
|
||||||
render json: autocomplete_map_array_json(@maps)
|
render json: autocomplete_map_array_json(@maps)
|
||||||
end
|
end
|
||||||
|
@ -194,12 +189,12 @@ class MainController < ApplicationController
|
||||||
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 +206,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.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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,7 +133,6 @@ 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.topic = Topic.find(topic[0])
|
||||||
|
@ -155,7 +146,6 @@ 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.synapse = Synapse.find(synapse_id)
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -51,7 +51,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 +70,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 +93,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
|
||||||
|
|
|
@ -21,7 +21,7 @@ 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)
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
if @synapse.save
|
if @synapse.save
|
||||||
|
@ -38,7 +38,7 @@ class SynapsesController < ApplicationController
|
||||||
@synapse = Synapse.find(params[:id])
|
@synapse = Synapse.find(params[:id])
|
||||||
|
|
||||||
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 }
|
||||||
|
@ -50,18 +50,16 @@ class SynapsesController < ApplicationController
|
||||||
def destroy
|
def destroy
|
||||||
@current = current_user
|
@current = current_user
|
||||||
@synapse = Synapse.find(params[:id]).authorize_to_delete(@current)
|
@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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -98,4 +98,11 @@ class UsersController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def user_params
|
||||||
|
params.require(:user).permit(:name, :email, :image, :password,
|
||||||
|
:password_confirmation, :code, :joinedwithcode, :remember_me)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
||||||
|
else
|
||||||
|
@metacodes = Metacode.where(id: @m).to_a
|
||||||
|
end
|
||||||
|
@metacodes.sort! {|m1,m2| m2.name.downcase <=> m1.name.downcase }.rotate!(-1)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -2,11 +2,10 @@ 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 => {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -5,7 +5,7 @@ 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
|
||||||
|
|
||||||
def user_name
|
def user_name
|
||||||
|
|
|
@ -3,12 +3,12 @@ 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
|
||||||
|
|
||||||
# This method associates the attribute ":image" with a file attachment
|
# This method associates the attribute ":image" with a file attachment
|
||||||
|
|
|
@ -11,8 +11,6 @@ class User < ActiveRecord::Base
|
||||||
|
|
||||||
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,
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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 %>
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,8 @@
|
||||||
<%= 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="<%= metacode.icon %>" alt="<%= metacode.name %>" title="<%= metacode.name %>" data-id="<%= metacode.id %>" />
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
@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|
|
||||||
|
|
|
@ -2,12 +2,7 @@ require File.expand_path('../boot', __FILE__)
|
||||||
|
|
||||||
require 'rails/all'
|
require 'rails/all'
|
||||||
|
|
||||||
if defined?(Bundler)
|
Bundler.require(:default, Rails.env)
|
||||||
# If you precompile assets before deploying to production, use this line
|
|
||||||
Bundler.require(*Rails.groups(:assets => %w(development test)))
|
|
||||||
# If you want your assets lazily compiled in production, use this line
|
|
||||||
# Bundler.require(:default, :assets, Rails.env)
|
|
||||||
end
|
|
||||||
|
|
||||||
module Metamaps
|
module Metamaps
|
||||||
class Application < Rails::Application
|
class Application < Rails::Application
|
||||||
|
@ -44,17 +39,12 @@ 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.active_record.raise_in_transactional_callbacks = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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__)
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
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
|
||||||
|
@ -40,16 +40,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
|
# Do not compress assets
|
||||||
config.assets.compress = false
|
config.assets.compress = false
|
||||||
|
|
||||||
|
|
|
@ -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 = true
|
||||||
|
|
||||||
# Compress JavaScripts and CSS
|
# Compress JavaScripts and CSS
|
||||||
config.assets.compress = true
|
config.assets.compress = true
|
||||||
|
|
|
@ -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
|
||||||
|
@ -11,9 +13,6 @@ Metamaps::Application.configure do
|
||||||
config.serve_static_assets = true
|
config.serve_static_assets = 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,6 @@ 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
|
||||||
end
|
end
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
get '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
|
||||||
|
|
31
db/migrate/20151001024122_mapping_polymorphism.rb
Normal file
31
db/migrate/20151001024122_mapping_polymorphism.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
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(mapping.synapse_id)
|
||||||
|
else
|
||||||
|
mapping.mappable = Topic.find(mapping.topic_id)
|
||||||
|
end
|
||||||
|
mapping.save
|
||||||
|
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
|
75
db/schema.rb
75
db/schema.rb
|
@ -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: 20151001024122) 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,22 @@ 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", ["mappable_id", "mappable_type"], name: "index_mappings_on_mappable_id_and_mappable_type", 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 +57,26 @@ 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|
|
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 +84,19 @@ 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|
|
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 +107,25 @@ 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|
|
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 +137,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
|
||||||
|
|
24
metamaps-qa-steps.txt
Normal file
24
metamaps-qa-steps.txt
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
Metamaps Test Suite
|
||||||
|
|
||||||
|
1) Log in to the interface
|
||||||
|
2) Create an account using your join code
|
||||||
|
3) Check your user's "generation"
|
||||||
|
4) Create three maps: private, public, and another public
|
||||||
|
5) Change the last map's permissions to commons
|
||||||
|
6) Change a map's name
|
||||||
|
7) Create a topic on map #1
|
||||||
|
8) Verify (in a private window or another browser) that the second user can't acccess map #1
|
||||||
|
9) Create a topic on map #2
|
||||||
|
10) Verify that the second user can't edit map #2
|
||||||
|
11) Create a topic on map #3
|
||||||
|
12) Verify that the second can edit map #3
|
||||||
|
13) Pull a topic from map #1 to map #3
|
||||||
|
14) Create a private topic on map #1
|
||||||
|
15) Verify that the private topic can be pulled from map #1 by the same user
|
||||||
|
16) Verify that the private topic can't be pulled from map #1 by another user
|
||||||
|
17) Login as admin. Change metacode sets.
|
||||||
|
18) Add a number of topics to one of your maps. Reload to see if they are still there.
|
||||||
|
19) Add a number of synapses to one of your maps. Reload to see if they are still there.
|
||||||
|
20) Rearrange one of your maps. Reload to see if the layout is preserved.
|
||||||
|
21) Set the screenshot for one of your maps, and verify the index of maps is updated.
|
||||||
|
22) Open two browsers on map #3 and verify that realtime editing works.
|
Loading…
Reference in a new issue