merge develop with rails4 stuff

This commit is contained in:
Devin Howard 2015-12-07 13:58:42 +08:00
commit 1597665be5
45 changed files with 916 additions and 843 deletions

View file

@ -16,3 +16,16 @@ SSO_KEY
# for a uniq ordered list of env vars:
## grep -rIsoh -P "(?<=ENV)(\.fetch\(|\[).[A-Z_]+.(\)|\])" | grep -oP "[A-Z_]+" | sort -u > temp
RUBY_GC_TUNE=0 #set to 1 to enable GC test
RUBY_GC_TOKEN=4f4380fc9a2857d1f008005a3eb86928
RUBY_GC_HEAP_INIT_SLOTS=186426
RUBY_GC_HEAP_FREE_SLOTS=559278
RUBY_GC_HEAP_GROWTH_FACTOR=1.03
RUBY_GC_HEAP_GROWTH_MAX_SLOTS=74570
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.4
RUBY_GC_MALLOC_LIMIT=32883406
RUBY_GC_MALLOC_LIMIT_MAX=69055153
RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1.68
RUBY_GC_OLDMALLOC_LIMIT=32509481
RUBY_GC_OLDMALLOC_LIMIT_MAX=68269910
RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR=1.4

2
.gitignore vendored
View file

@ -24,4 +24,6 @@ log/*.log
tmp
.DS_Store
*/.DS_Store
.DS_Store?
.vagrant

1
.ruby-gemset Normal file
View file

@ -0,0 +1 @@
metamaps_gen002

View file

@ -1 +1 @@
2.1.3
ruby-2.1.3

View file

@ -17,7 +17,7 @@ gem 'uservoice-ruby'
gem 'dotenv'
gem 'paperclip'
gem 'aws-sdk'
gem 'aws-sdk', '< 2.0'
gem 'jquery-rails'
gem 'jquery-ui-rails'
@ -54,4 +54,5 @@ group :development, :test do
gem 'better_errors'
gem 'binding_of_caller'
gem 'quiet_assets'
gem 'tunemygc'
end

View file

@ -37,12 +37,11 @@ GEM
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
arel (6.0.3)
aws-sdk (2.1.32)
aws-sdk-resources (= 2.1.32)
aws-sdk-core (2.1.32)
jmespath (~> 1.0)
aws-sdk-resources (2.1.32)
aws-sdk-core (= 2.1.32)
aws-sdk (1.66.0)
aws-sdk-v1 (= 1.66.0)
aws-sdk-v1 (1.66.0)
json (~> 1.4)
nokogiri (>= 1.4.4)
bcrypt (3.1.10)
best_in_place (3.0.3)
actionpack (>= 3.2)
@ -98,7 +97,6 @@ GEM
jbuilder (2.3.2)
activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2)
jmespath (1.1.3)
jquery-rails (4.0.5)
rails-dom-testing (~> 1.0)
railties (>= 4.2.0)
@ -213,6 +211,7 @@ GEM
thor (0.19.1)
thread_safe (0.3.5)
tilt (2.0.1)
tunemygc (1.0.61)
tzinfo (1.2.2)
thread_safe (~> 0.1)
uglifier (2.7.2)
@ -229,7 +228,7 @@ PLATFORMS
ruby
DEPENDENCIES
aws-sdk
aws-sdk (< 2.0)
best_in_place
better_errors
binding_of_caller
@ -256,6 +255,7 @@ DEPENDENCIES
redis
rspec-rails
sass-rails
tunemygc
uglifier
uservoice-ruby

View file

@ -45,7 +45,8 @@ OR create a new account at `/join`, and use access code `qwertyui`
Start mapping and programming!
While we are still figuring out vagrant for Windows, there is an older set of instructions below
We haven't figured out Vagrant for Windows yet, but we have a set of manual instructions here:
- [For Windows][windows-installation]
## Contributing
@ -72,6 +73,6 @@ Copyright (c) 2015 Connor Turland
[site-beta]: http://metamaps.cc
[community]: https://plus.google.com/u/0/communities/115060009262157699234
[license]: https://github.com/metamaps/metamaps_gen002/blob/master/LICENSE
[contributing]: https://github.com/metamaps/metamaps_gen002/blob/master/CONTRIBUTING.md
[contributing-issues]: https://github.com/metamaps/metamaps_gen002/blob/master/CONTRIBUTING.md#reporting-bugs-and-other-issues
[windows-installation]: https://github.com/metamaps/metamaps_gen002/blob/master/WindowsInstallation.md
[contributing]: https://github.com/metamaps/metamaps_gen002/blob/master/doc/CONTRIBUTING.md
[contributing-issues]: https://github.com/metamaps/metamaps_gen002/blob/master/doc/CONTRIBUTING.md#reporting-bugs-and-other-issues
[windows-installation]: https://github.com/metamaps/metamaps_gen002/blob/master/doc/WindowsInstallation.md

View file

@ -1,49 +0,0 @@
First off, Metamaps runs on Ruby On Rails. Ruby 2.1.3 and Rails 3.2. You'll need to get Ruby and Rails installed on your computer if you don't already have it. Go to here for Ruby http://rubyinstaller.org/downloads/
You'll also need GIT: http://git-scm.com/download/win
It uses postgreSQL 9.2 as a database. You can install that for your computer from here: http://www.enterprisedb.com/products-services-training/pgdownload . During installation you can choose whatever database password you like. Make sure to note it down!
Once you install those, open a 'command prompt with ruby'.
to install rails
gem install rails -v 3.2
also download node.js, which is also needed http://nodejs.org/download/
Navigate to the folder that you want to download the metamaps files to and run the following: (use your forked git repository address if it's different than this repo. You will also need to go to your Github account settings and add the SSH key that was placed in your clipboard earlier)
git clone https://github.com/metamaps/metamaps_gen002.git --branch develop
cd metamaps_gen002
Now you're in the main directory.
Install all the gems needed for Metamaps by running
bundle install
Setting up the database:
1) Copy /config/database.yml.default and rename the copy to /config/database.yml then edit database.yml with your text editor and set the password to whatever you chose when you set up the PostGres database.
2) In a terminal:
rake db:create
rake db:schema:load
rake db:fixtures:load
Running the server:
rails s
Navigate your browser to localhost:3000 once you have the server running
Sign in with the default account
email: user@user.com
password: toolsplusconsciousness
OR create a new account at /join, and use access code 'qwertyui'
Start mapping and programming!

View file

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

View file

@ -656,7 +656,7 @@ Metamaps.Create = {
self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0);
self.newSelectedMetacodes = self.selectedMetacodes.slice(0);
}
$('#metacodeSwitchTabs').tabs("select", self.selectedMetacodeSetIndex);
$('#metacodeSwitchTabs').tabs("option", "active", self.selectedMetacodeSetIndex);
$('#topic_name').focus();
},
newTopic: {
@ -3300,26 +3300,34 @@ Metamaps.Filter = {
// the first option enables us to accept
// ['Topics', 'Synapses'] as 'collection'
if (typeof collection === "object") {
Metamaps[collection[0]].each(function(model) {
var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false;
if (prop && newList.indexOf(prop) === -1) {
newList.push(prop);
}
});
Metamaps[collection[1]].each(function(model) {
var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false;
if (prop && newList.indexOf(prop) === -1) {
newList.push(prop);
}
});
}
else if (typeof collection === "string") {
Metamaps[collection].each(function(model) {
var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false;
if (prop && newList.indexOf(prop) === -1) {
newList.push(prop);
}
});
Metamaps[collection[0]].each(function(model) {
var prop = model.get(propertyToCheck);
if (prop !== null) {
prop = prop.toString();
if (newList.indexOf(prop) === -1) {
newList.push(prop);
}
}
});
Metamaps[collection[1]].each(function(model) {
var prop = model.get(propertyToCheck);
if (prop !== null) {
prop = prop.toString();
if (newList.indexOf(prop) === -1) {
newList.push(prop);
}
}
});
} else if (typeof collection === "string") {
Metamaps[collection].each(function(model) {
var prop = model.get(propertyToCheck);
if (prop !== null) {
prop = prop.toString();
if (newList.indexOf(prop) === -1) {
newList.push(prop);
}
}
});
}
removed = _.difference(self.filters[filtersToUse], newList);

View file

@ -2146,6 +2146,7 @@ and it won't be important on password protected instances */
display: block;
width: 100%;
padding: 4px 0 !important;
outline: none;
}
.ui-tabs-vertical .ui-tabs-panel {
padding: 0 !important;
@ -2182,6 +2183,7 @@ and it won't be important on password protected instances */
}
#metacodeSwitchTabs li.ui-state-active a {
color: #00BCD4;
cursor: pointer;
}
.metacodeSwitchTab {
max-height: 300px;

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,7 @@
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :get_invite_link
# this is for global login
include ContentHelper
@ -47,7 +49,6 @@ private
current_user
end
def authenticated?
current_user
end
@ -55,5 +56,11 @@ private
def admin?
current_user && current_user.admin
end
def get_invite_link
unsafe_uri = request.env["REQUEST_URI"]
valid_url = /^https?:\/\/([\w\.-]+)(:\d{1,5})?\/?$/
safe_uri = (unsafe_uri.match(valid_url)) ? unsafe_uri : "http://metamaps.cc/"
@invite_link = "#{safe_uri}join" + (current_user ? "?code=#{current_user.code}" : "")
end
end

View file

@ -26,8 +26,6 @@ class MainController < ApplicationController
# get /search/topics?term=SOMETERM
def searchtopics
@current = current_user
term = params[:term]
user = params[:user] ? params[:user] : false
@ -122,15 +120,13 @@ class MainController < ApplicationController
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
@topics.to_a.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && @current.id != t.user_id)) }
@topics.to_a.delete_if {|t| t.permission == "private" && (!authenticated? || (authenticated? && current_user.id != t.user_id)) }
render json: autocomplete_array_json(@topics)
end
# get /search/maps?term=SOMETERM
def searchmaps
@current = current_user
term = params[:term]
user = params[:user] ? params[:user] : nil
@ -158,15 +154,13 @@ class MainController < ApplicationController
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
@maps.to_a.delete_if {|m| m.permission == "private" && (!authenticated? || (authenticated? && @current.id != m.user_id)) }
@maps.to_a.delete_if {|m| m.permission == "private" && (!authenticated? || (authenticated? && current_user.id != m.user_id)) }
render json: autocomplete_map_array_json(@maps)
end
# get /search/mappers?term=SOMETERM
def searchmappers
@current = current_user
term = params[:term]
if term && !term.empty? && term.downcase[0..3] != "map:" && term.downcase[0..5] != "topic:" && term.downcase != "mapper:"
@ -182,8 +176,6 @@ class MainController < ApplicationController
# get /search/synapses?term=SOMETERM OR
# get /search/synapses?topic1id=SOMEID&topic2id=SOMEID
def searchsynapses
@current = current_user
term = params[:term]
topic1id = params[:topic1id]
topic2id = params[:topic2id]
@ -214,7 +206,7 @@ class MainController < ApplicationController
#permissions
@synapses.delete_if {|s| s.permission == "private" && !authenticated? }
@synapses.delete_if {|s| s.permission == "private" && authenticated? && @current.id != s.user_id }
@synapses.delete_if {|s| s.permission == "private" && authenticated? && current_user.id != s.user_id }
else
@synapses = []
end

View file

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

View file

@ -50,8 +50,7 @@ class SynapsesController < ApplicationController
# DELETE synapses/:id
def destroy
@current = current_user
@synapse = Synapse.find(params[:id]).authorize_to_delete(@current)
@synapse = Synapse.find(params[:id]).authorize_to_delete(current_user)
@synapse.delete if @synapse
respond_to do |format|

View file

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

View file

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

View file

@ -9,7 +9,7 @@ module ApplicationHelper
@m = user.settings.metacodes
set = get_metacodeset
if set
@metacodes = set.metacodes
@metacodes = set.metacodes.to_a
else
@metacodes = Metacode.where(id: @m).to_a
end

View file

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

View file

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

View file

@ -12,7 +12,7 @@ class Map < ActiveRecord::Base
:thumb => ['188x126#', :png]
#:full => ['940x630#', :png]
},
:default_url => ActionController::Base.helpers.asset_path('missing-map.png')
:default_url => 'https://s3.amazonaws.com/metamaps-assets/site/missing-map.png'
# Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :screenshot, :content_type => /\Aimage\/.*\Z/

View file

@ -35,11 +35,12 @@ class User < ActiveRecord::Base
:ninetysix => ['96x96#', :png],
:onetwentyeight => ['128x128#', :png]
},
:default_url => ActionController::Base.helpers.asset_path('user.png')
:default_url => 'https://s3.amazonaws.com/metamaps-assets/site/user.png'
# Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
# override default as_json
def as_json(options={})
{ :id => self.id,
:name => self.name,
@ -47,27 +48,37 @@ class User < ActiveRecord::Base
:admin => self.admin
}
end
def as_json_for_autocomplete
json = {}
json['id'] = id
json['label'] = name
json['value'] = name
json['profile'] = image.url(:sixtyfour)
json['mapCount'] = maps.count
json['generation'] = generation
json['created_at'] = created_at.strftime("%m/%d/%Y")
json['rtype'] = "mapper"
json
end
#generate a random 8 letter/digit code that they can use to invite people
def generate_code
#generate a random 8 letter/digit code that they can use to invite people
self.code = rand(36**8).to_s(36)
$codes.push(self.code)
self.generation = self.get_generation
end
def get_generation
if self.joinedwithcode == self.code
# if your joinedwithcode equals your code you must be GEN 0
gen = 0
elsif self.generation
# if your generation has already been calculated then just return that value
gen = self.generation
calculate_generation() if generation.nil?
generation
end
def calculate_generation
if code == joinedwithcode
update(generation: 0)
else
# if your generation hasn't been calculated, base it off the
# generation of the person whose code you joined with + 1
gen = User.find_by_code(self.joinedwithcode).get_generation + 1
update(generation: User.find_by_code(joinedwithcode).generation + 1)
end
end
@ -75,13 +86,12 @@ class User < ActiveRecord::Base
# make sure we always return a UserPreference instance
if read_attribute(:settings).nil?
write_attribute :settings, UserPreference.new
read_attribute :settings
else
read_attribute :settings
end
read_attribute :settings
end
def settings=(val)
write_attribute :settings, val
end
end

View file

@ -231,9 +231,8 @@
<p>As a valued beta tester, you have the ability to invite your peers, colleagues and collaborators onto the platform.</p>
<p>Below is a personal invite link containing your unique access code, which can be used multiple times.</p>
<div id="joinCodesBox">
<% mapper = current_user %>
<p class="joinCodes">http://metamaps.cc/join?code=<%= mapper.code %></p>
<button class="button" onclick="Metamaps.GlobalUI.shareInvite('http://metamaps.cc/join?code=<%= mapper.code %>');">COPY INVITE LINK!</button>
<p class="joinCodes"><%= @invite_link %>
<button class="button" onclick="Metamaps.GlobalUI.shareInvite('<%= @invite_link %>');">COPY INVITE LINK!</button>
</div>
</div>

View file

@ -19,9 +19,9 @@
<div id="metacodeSwitchTabs">
<ul>
<% allMetacodeSets.each do |m| %>
<li><a href="#metacodeSwitchTabs<%= m.id %>" data-set-id="<%= m.id %>"><%= m.name %></a></li>
<li><a href="#metacodeSwitchTabs<%= m.id %>" data-set-id="<%= m.id %>" data-bypass="true"><%= m.name %></a></li>
<% end %>
<li><a href="#metacodeSwitchTabsCustom" data-set-id="custom" id="metacodeSetCustom">CUSTOM SELECTION</a></li>
<li><a href="#metacodeSwitchTabsCustom" data-set-id="custom" data-bypass="true" id="metacodeSetCustom">CUSTOM SELECTION</a></li>
</ul>
<% allMetacodeSets.each_with_index do |m, localindex| %>
<div id="metacodeSwitchTabs<%= m.id %>"

View file

@ -2,7 +2,7 @@ require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(:default, Rails.env)
Bundler.require(*Rails.groups)
module Metamaps
class Application < Rails::Application

View file

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

View file

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

View file

@ -26,7 +26,7 @@ Metamaps::Application.routes.draw do
get 'explore/mapper/:id', to: 'maps#index', as: :usermaps
resources :maps, except: [:new, :edit]
get 'maps/:id/contains', to: 'maps#contains', as: :contains
get 'maps/:id/upload_screenshot', to: 'maps#screenshot', as: :screenshot
post 'maps/:id/upload_screenshot', to: 'maps#screenshot', as: :screenshot
devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords', sessions: 'devise/sessions' }, :skip => :sessions

View file

@ -1,12 +0,0 @@
defaults: &defaults
missing_map_png_url: '/assets/missing-map.png'
user_png_url: '/assets/user.png'
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults

View file

@ -1,8 +0,0 @@
class RemoveAssetPathsFromMetacodes < ActiveRecord::Migration
def change
Metacode.all.each do |metacode|
metacode.icon = metacode.icon.gsub(/^\/assets\//, '')
metacode.save
end
end
end

View file

@ -0,0 +1,9 @@
class MetacodeAssetPathUpdate < ActiveRecord::Migration
def change
Metacode.all.each do |metacode|
if metacode.icon.start_with?("/assets/icons/")
metacode.update(icon: metacode.icon.gsub(/^\/assets\/icons/, "https://s3.amazonaws.com/metamaps-assets/metacodes"))
end
end
end
end

View file

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

View file

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

View file

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

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

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

View file

@ -1,27 +0,0 @@
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.
23) Log in as admin
24) Open the metacodes editor, and create a metacode. Verify it behaves normally (its icon shows up, you can assign it to topics, etc)
25) Create a new metacode set, and include metacodes. Switch to using this metacode set. Ensure the set shows up in the right click menu on a topic

View file

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