added ability to add synapse from any page on which there is a map
This commit is contained in:
parent
adf24530d8
commit
dfb92b89a5
22 changed files with 213 additions and 312 deletions
261
README.rdoc
261
README.rdoc
|
@ -1,261 +0,0 @@
|
||||||
== Welcome to Rails
|
|
||||||
|
|
||||||
Rails is a web-application framework that includes everything needed to create
|
|
||||||
database-backed web applications according to the Model-View-Control pattern.
|
|
||||||
|
|
||||||
This pattern splits the view (also called the presentation) into "dumb"
|
|
||||||
templates that are primarily responsible for inserting pre-built data in between
|
|
||||||
HTML tags. The model contains the "smart" domain objects (such as Account,
|
|
||||||
Product, Person, Post) that holds all the business logic and knows how to
|
|
||||||
persist themselves to a database. The controller handles the incoming requests
|
|
||||||
(such as Save New Account, Update Product, Show Post) by manipulating the model
|
|
||||||
and directing data to the view.
|
|
||||||
|
|
||||||
In Rails, the model is handled by what's called an object-relational mapping
|
|
||||||
layer entitled Active Record. This layer allows you to present the data from
|
|
||||||
database rows as objects and embellish these data objects with business logic
|
|
||||||
methods. You can read more about Active Record in
|
|
||||||
link:files/vendor/rails/activerecord/README.html.
|
|
||||||
|
|
||||||
The controller and view are handled by the Action Pack, which handles both
|
|
||||||
layers by its two parts: Action View and Action Controller. These two layers
|
|
||||||
are bundled in a single package due to their heavy interdependence. This is
|
|
||||||
unlike the relationship between the Active Record and Action Pack that is much
|
|
||||||
more separate. Each of these packages can be used independently outside of
|
|
||||||
Rails. You can read more about Action Pack in
|
|
||||||
link:files/vendor/rails/actionpack/README.html.
|
|
||||||
|
|
||||||
|
|
||||||
== Getting Started
|
|
||||||
|
|
||||||
1. At the command prompt, create a new Rails application:
|
|
||||||
<tt>rails new myapp</tt> (where <tt>myapp</tt> is the application name)
|
|
||||||
|
|
||||||
2. Change directory to <tt>myapp</tt> and start the web server:
|
|
||||||
<tt>cd myapp; rails server</tt> (run with --help for options)
|
|
||||||
|
|
||||||
3. Go to http://localhost:3000/ and you'll see:
|
|
||||||
"Welcome aboard: You're riding Ruby on Rails!"
|
|
||||||
|
|
||||||
4. Follow the guidelines to start developing your application. You can find
|
|
||||||
the following resources handy:
|
|
||||||
|
|
||||||
* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
|
|
||||||
* Ruby on Rails Tutorial Book: http://www.railstutorial.org/
|
|
||||||
|
|
||||||
|
|
||||||
== Debugging Rails
|
|
||||||
|
|
||||||
Sometimes your application goes wrong. Fortunately there are a lot of tools that
|
|
||||||
will help you debug it and get it back on the rails.
|
|
||||||
|
|
||||||
First area to check is the application log files. Have "tail -f" commands
|
|
||||||
running on the server.log and development.log. Rails will automatically display
|
|
||||||
debugging and runtime information to these files. Debugging info will also be
|
|
||||||
shown in the browser on requests from 127.0.0.1.
|
|
||||||
|
|
||||||
You can also log your own messages directly into the log file from your code
|
|
||||||
using the Ruby logger class from inside your controllers. Example:
|
|
||||||
|
|
||||||
class WeblogController < ActionController::Base
|
|
||||||
def destroy
|
|
||||||
@weblog = Weblog.find(params[:id])
|
|
||||||
@weblog.destroy
|
|
||||||
logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
The result will be a message in your log file along the lines of:
|
|
||||||
|
|
||||||
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
|
|
||||||
|
|
||||||
More information on how to use the logger is at http://www.ruby-doc.org/core/
|
|
||||||
|
|
||||||
Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
|
|
||||||
several books available online as well:
|
|
||||||
|
|
||||||
* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
|
|
||||||
* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
|
|
||||||
|
|
||||||
These two books will bring you up to speed on the Ruby language and also on
|
|
||||||
programming in general.
|
|
||||||
|
|
||||||
|
|
||||||
== Debugger
|
|
||||||
|
|
||||||
Debugger support is available through the debugger command when you start your
|
|
||||||
Mongrel or WEBrick server with --debugger. This means that you can break out of
|
|
||||||
execution at any point in the code, investigate and change the model, and then,
|
|
||||||
resume execution! You need to install ruby-debug to run the server in debugging
|
|
||||||
mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
|
|
||||||
|
|
||||||
class WeblogController < ActionController::Base
|
|
||||||
def index
|
|
||||||
@posts = Post.all
|
|
||||||
debugger
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
So the controller will accept the action, run the first line, then present you
|
|
||||||
with a IRB prompt in the server window. Here you can do things like:
|
|
||||||
|
|
||||||
>> @posts.inspect
|
|
||||||
=> "[#<Post:0x14a6be8
|
|
||||||
@attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>,
|
|
||||||
#<Post:0x14a6620
|
|
||||||
@attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
|
|
||||||
>> @posts.first.title = "hello from a debugger"
|
|
||||||
=> "hello from a debugger"
|
|
||||||
|
|
||||||
...and even better, you can examine how your runtime objects actually work:
|
|
||||||
|
|
||||||
>> f = @posts.first
|
|
||||||
=> #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
|
|
||||||
>> f.
|
|
||||||
Display all 152 possibilities? (y or n)
|
|
||||||
|
|
||||||
Finally, when you're ready to resume execution, you can enter "cont".
|
|
||||||
|
|
||||||
|
|
||||||
== Console
|
|
||||||
|
|
||||||
The console is a Ruby shell, which allows you to interact with your
|
|
||||||
application's domain model. Here you'll have all parts of the application
|
|
||||||
configured, just like it is when the application is running. You can inspect
|
|
||||||
domain models, change values, and save to the database. Starting the script
|
|
||||||
without arguments will launch it in the development environment.
|
|
||||||
|
|
||||||
To start the console, run <tt>rails console</tt> from the application
|
|
||||||
directory.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
* Passing the <tt>-s, --sandbox</tt> argument will rollback any modifications
|
|
||||||
made to the database.
|
|
||||||
* Passing an environment name as an argument will load the corresponding
|
|
||||||
environment. Example: <tt>rails console production</tt>.
|
|
||||||
|
|
||||||
To reload your controllers and models after launching the console run
|
|
||||||
<tt>reload!</tt>
|
|
||||||
|
|
||||||
More information about irb can be found at:
|
|
||||||
link:http://www.rubycentral.org/pickaxe/irb.html
|
|
||||||
|
|
||||||
|
|
||||||
== dbconsole
|
|
||||||
|
|
||||||
You can go to the command line of your database directly through <tt>rails
|
|
||||||
dbconsole</tt>. You would be connected to the database with the credentials
|
|
||||||
defined in database.yml. Starting the script without arguments will connect you
|
|
||||||
to the development database. Passing an argument will connect you to a different
|
|
||||||
database, like <tt>rails dbconsole production</tt>. Currently works for MySQL,
|
|
||||||
PostgreSQL and SQLite 3.
|
|
||||||
|
|
||||||
== Description of Contents
|
|
||||||
|
|
||||||
The default directory structure of a generated Ruby on Rails application:
|
|
||||||
|
|
||||||
|-- app
|
|
||||||
| |-- assets
|
|
||||||
| |-- images
|
|
||||||
| |-- javascripts
|
|
||||||
| `-- stylesheets
|
|
||||||
| |-- controllers
|
|
||||||
| |-- helpers
|
|
||||||
| |-- mailers
|
|
||||||
| |-- models
|
|
||||||
| `-- views
|
|
||||||
| `-- layouts
|
|
||||||
|-- config
|
|
||||||
| |-- environments
|
|
||||||
| |-- initializers
|
|
||||||
| `-- locales
|
|
||||||
|-- db
|
|
||||||
|-- doc
|
|
||||||
|-- lib
|
|
||||||
| `-- tasks
|
|
||||||
|-- log
|
|
||||||
|-- public
|
|
||||||
|-- script
|
|
||||||
|-- test
|
|
||||||
| |-- fixtures
|
|
||||||
| |-- functional
|
|
||||||
| |-- integration
|
|
||||||
| |-- performance
|
|
||||||
| `-- unit
|
|
||||||
|-- tmp
|
|
||||||
| |-- cache
|
|
||||||
| |-- pids
|
|
||||||
| |-- sessions
|
|
||||||
| `-- sockets
|
|
||||||
`-- vendor
|
|
||||||
|-- assets
|
|
||||||
`-- stylesheets
|
|
||||||
`-- plugins
|
|
||||||
|
|
||||||
app
|
|
||||||
Holds all the code that's specific to this particular application.
|
|
||||||
|
|
||||||
app/assets
|
|
||||||
Contains subdirectories for images, stylesheets, and JavaScript files.
|
|
||||||
|
|
||||||
app/controllers
|
|
||||||
Holds controllers that should be named like weblogs_controller.rb for
|
|
||||||
automated URL mapping. All controllers should descend from
|
|
||||||
ApplicationController which itself descends from ActionController::Base.
|
|
||||||
|
|
||||||
app/models
|
|
||||||
Holds models that should be named like post.rb. Models descend from
|
|
||||||
ActiveRecord::Base by default.
|
|
||||||
|
|
||||||
app/views
|
|
||||||
Holds the template files for the view that should be named like
|
|
||||||
weblogs/index.html.erb for the WeblogsController#index action. All views use
|
|
||||||
eRuby syntax by default.
|
|
||||||
|
|
||||||
app/views/layouts
|
|
||||||
Holds the template files for layouts to be used with views. This models the
|
|
||||||
common header/footer method of wrapping views. In your views, define a layout
|
|
||||||
using the <tt>layout :default</tt> and create a file named default.html.erb.
|
|
||||||
Inside default.html.erb, call <% yield %> to render the view using this
|
|
||||||
layout.
|
|
||||||
|
|
||||||
app/helpers
|
|
||||||
Holds view helpers that should be named like weblogs_helper.rb. These are
|
|
||||||
generated for you automatically when using generators for controllers.
|
|
||||||
Helpers can be used to wrap functionality for your views into methods.
|
|
||||||
|
|
||||||
config
|
|
||||||
Configuration files for the Rails environment, the routing map, the database,
|
|
||||||
and other dependencies.
|
|
||||||
|
|
||||||
db
|
|
||||||
Contains the database schema in schema.rb. db/migrate contains all the
|
|
||||||
sequence of Migrations for your schema.
|
|
||||||
|
|
||||||
doc
|
|
||||||
This directory is where your application documentation will be stored when
|
|
||||||
generated using <tt>rake doc:app</tt>
|
|
||||||
|
|
||||||
lib
|
|
||||||
Application specific libraries. Basically, any kind of custom code that
|
|
||||||
doesn't belong under controllers, models, or helpers. This directory is in
|
|
||||||
the load path.
|
|
||||||
|
|
||||||
public
|
|
||||||
The directory available for the web server. Also contains the dispatchers and the
|
|
||||||
default HTML files. This should be set as the DOCUMENT_ROOT of your web
|
|
||||||
server.
|
|
||||||
|
|
||||||
script
|
|
||||||
Helper scripts for automation and generation.
|
|
||||||
|
|
||||||
test
|
|
||||||
Unit and functional tests along with fixtures. When using the rails generate
|
|
||||||
command, template test files will be generated for you and placed in this
|
|
||||||
directory.
|
|
||||||
|
|
||||||
vendor
|
|
||||||
External libraries that the application depends on. Also includes the plugins
|
|
||||||
subdirectory. If the app has frozen rails, those gems also go here, under
|
|
||||||
vendor/rails/. This directory is in the load path.
|
|
|
@ -94,6 +94,7 @@ function initFD(){
|
||||||
Edge: {
|
Edge: {
|
||||||
overridable: true,
|
overridable: true,
|
||||||
color: '#d1d1d1',
|
color: '#d1d1d1',
|
||||||
|
//type: 'arrow',
|
||||||
lineWidth: 0.4
|
lineWidth: 0.4
|
||||||
},
|
},
|
||||||
//Native canvas text styling
|
//Native canvas text styling
|
||||||
|
@ -265,18 +266,14 @@ function initFD(){
|
||||||
// load JSON data.
|
// load JSON data.
|
||||||
fd.loadJSON(json);
|
fd.loadJSON(json);
|
||||||
// compute positions incrementally and animate.
|
// compute positions incrementally and animate.
|
||||||
fd.computeIncremental({
|
fd.compute()
|
||||||
iter: 40,
|
|
||||||
property: 'end',
|
$(document).ready(function() {
|
||||||
onStep: function(perc){
|
fd.animate({
|
||||||
},
|
|
||||||
onComplete: function(){
|
|
||||||
fd.animate({
|
|
||||||
modes: ['linear'],
|
modes: ['linear'],
|
||||||
transition: $jit.Trans.Elastic.easeOut,
|
transition: $jit.Trans.Elastic.easeOut,
|
||||||
duration: 2500
|
duration: 2500
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
});
|
|
||||||
// end
|
// end
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,14 +22,27 @@
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$('.nodemargin').css('padding-top',$('.focus').css('height'));
|
$('.nodemargin').css('padding-top',$('.focus').css('height'));
|
||||||
|
|
||||||
|
|
||||||
|
// if there's an add topic directly to page form loaded on the page you're on then let the user add one
|
||||||
$('#newtopic').click(function(event){
|
$('#newtopic').click(function(event){
|
||||||
obj = document.getElementById('new_item');
|
obj1 = document.getElementById('new_item');
|
||||||
if (obj != null) {
|
if (obj1 != null) {
|
||||||
|
$('#new_synapse').css('display','none');
|
||||||
$('#new_item').fadeIn('fast');
|
$('#new_item').fadeIn('fast');
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// if there's an add synapse directly to page form loaded on the page you're on then let the user add one
|
||||||
|
$('#newsynapse').click(function(event){
|
||||||
|
obj2 = document.getElementById('new_synapse');
|
||||||
|
if (obj2 != null) {
|
||||||
|
$('#new_item').css('display','none');
|
||||||
|
$('#new_synapse').fadeIn('fast');
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var sliding = false;
|
var sliding = false;
|
||||||
$(".legend").hover(
|
$(".legend").hover(
|
||||||
function () {
|
function () {
|
||||||
|
|
|
@ -32,8 +32,8 @@ a {color:#2d6a5d; text-decoration:none;}
|
||||||
|
|
||||||
.new_session, .new_user, .new_item, .new_synapse, .edit_item, .edit_synapse { display: block; width: 350px; margin: 0 auto; background: #D1D1D1; padding: 20px; border-radius: 15px; color: #000; border:2px solid #000; }
|
.new_session, .new_user, .new_item, .new_synapse, .edit_item, .edit_synapse { display: block; width: 350px; margin: 0 auto; background: #D1D1D1; padding: 20px; border-radius: 15px; color: #000; border:2px solid #000; }
|
||||||
|
|
||||||
.anypage .new_item { display: none; position:absolute; left:50%; top:50%; margin:-175px 0 0 -195px; border:2px solid #000; }
|
.anypage .new_item, .anypage .new_synapse { display: none; position:absolute; left:50%; top:0; margin:200px 0 0 -195px; border:2px solid #000; }
|
||||||
#closenewtopic { position:absolute; top: 3px; right:3px; }
|
#closenewtopic, #closenewsynapse { position:absolute; top: 3px; right:3px; }
|
||||||
|
|
||||||
|
|
||||||
label, select, input, textarea { display:block; }
|
label, select, input, textarea { display:block; }
|
||||||
|
|
|
@ -16,9 +16,8 @@ class SynapsesController < ApplicationController
|
||||||
def new
|
def new
|
||||||
@synapse = Synapse.new
|
@synapse = Synapse.new
|
||||||
@user = current_user
|
@user = current_user
|
||||||
@allitems = Item.all
|
|
||||||
|
|
||||||
respond_with(@synapse, @allitems)
|
respond_with(@synapse)
|
||||||
end
|
end
|
||||||
|
|
||||||
# GET /synapse/:id
|
# GET /synapse/:id
|
||||||
|
@ -26,7 +25,7 @@ class SynapsesController < ApplicationController
|
||||||
@synapse = Synapse.find(params[:id])
|
@synapse = Synapse.find(params[:id])
|
||||||
|
|
||||||
if @synapse
|
if @synapse
|
||||||
@synapsejson = @synapse.self_as_json.html_safe
|
@synapsejson = @synapse.selfplusnodes_as_json.html_safe
|
||||||
end
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
|
|
2
app/models/map.rb
Normal file
2
app/models/map.rb
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
class Map < ActiveRecord::Base
|
||||||
|
end
|
|
@ -6,6 +6,15 @@ belongs_to :item1, :class_name => "Item", :foreign_key => "node1_id"
|
||||||
belongs_to :item2, :class_name => "Item", :foreign_key => "node2_id"
|
belongs_to :item2, :class_name => "Item", :foreign_key => "node2_id"
|
||||||
|
|
||||||
def self_as_json
|
def self_as_json
|
||||||
|
Jbuilder.encode do |json|
|
||||||
|
@synapsedata = Hash.new
|
||||||
|
@synapsedata['$desc'] = self.desc
|
||||||
|
@synapsedata['$category'] = self.category
|
||||||
|
json.data @synapsedata
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def selfplusnodes_as_json
|
||||||
Jbuilder.encode do |json|
|
Jbuilder.encode do |json|
|
||||||
@items = Array.new
|
@items = Array.new
|
||||||
@items.push(self.item1)
|
@items.push(self.item1)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<div class="anypage">
|
<div class="anypage">
|
||||||
<%= form_for Item.new, url: items_path, remote: true do |form| %>
|
<%= form_for Item.new, url: items_path, remote: true do |form| %>
|
||||||
<button id="closenewtopic" onclick="$('#new_item').fadeOut('fast'); $('#new_item')[0].reset(); return false;">close</button>
|
<button id="closenewtopic" onclick="$('#new_item').fadeOut('fast'); $('#new_item')[0].reset(); return false;">close</button>
|
||||||
<h3>Add Item</h3>
|
<h3>Add Topic</h3>
|
||||||
<label for="category">Category</label>
|
<label for="category">Category</label>
|
||||||
<%= select_tag "category", options_from_collection_for_select(ItemCategory.all, "id", "name") %>
|
<%= select_tag "category", options_from_collection_for_select(ItemCategory.order("name ASC").all, "id", "name") %>
|
||||||
<label for="item_name">Title</label>
|
<label for="item_name">Title</label>
|
||||||
<%= form.text_field :name %>
|
<%= form.text_field :name %>
|
||||||
<label for="item_desc">Description</label>
|
<label for="item_desc">Description</label>
|
||||||
|
|
|
@ -2,32 +2,44 @@ $('#new_item').fadeOut('fast');
|
||||||
$('#new_item')[0].reset()
|
$('#new_item')[0].reset()
|
||||||
|
|
||||||
// if there's a map, add the node to that, if its in card view add card
|
// if there's a map, add the node to that, if its in card view add card
|
||||||
obj = document.getElementById('container');
|
map2 = document.getElementById('container');
|
||||||
|
|
||||||
|
if (map2 != null) {
|
||||||
if (obj != null) {
|
|
||||||
var newnode = <%= @item.self_as_json.html_safe %>;
|
var newnode = <%= @item.self_as_json.html_safe %>;
|
||||||
|
console.log(newnode);
|
||||||
|
|
||||||
if (fd != null) {
|
if (fd != null) {
|
||||||
fd.graph.addNode(newnode);
|
fd.graph.addNode(newnode);
|
||||||
var temp = fd.graph.getNode('<%= @item.id %>');
|
var temp = fd.graph.getNode('<%= @item.id %>');
|
||||||
temp.setData('dim', 1, 'start');
|
temp.setData('dim', 1, 'start');
|
||||||
temp.setData('dim', 40, 'end');
|
temp.setData('dim', 40, 'end');
|
||||||
fd.fx.animate({
|
temp.setPos(new $jit.Complex(0, 0), 'current');
|
||||||
modes: ['node-property:dim'],
|
temp.setPos(new $jit.Complex(0, 0), 'start');
|
||||||
duration: 400
|
temp.setPos(new $jit.Complex(0, 0), 'end');
|
||||||
});
|
fd.fx.plotNode(temp, fd.canvas);
|
||||||
|
fd.fx.animate({
|
||||||
|
modes: ['node-property:dim'],
|
||||||
|
duration: 400
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else if (rg != null) {
|
else if (rg != null) {
|
||||||
rg.graph.addNode(newnode);
|
rg.graph.addNode(newnode);
|
||||||
var temp = rggraph.getNode('<%= @item.id %>');
|
var temp = rg.graph.getNode('<%= @item.id %>');
|
||||||
temp.setData('dim', 1, 'start');
|
temp.setData('dim', 1, 'start');
|
||||||
temp.setData('dim', 40, 'end');
|
temp.setData('dim', 40, 'end');
|
||||||
rg.fx.animate({
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'current');
|
||||||
modes: ['node-property:dim'],
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'start');
|
||||||
duration: 400
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'end');
|
||||||
});
|
rg.fx.plotNode(temp, rg.canvas);
|
||||||
}
|
rg.fx.animate({
|
||||||
|
modes: ['node-property:dim'],
|
||||||
|
duration: 400
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// add the new node to the synapse select list
|
||||||
|
$("#node1_id").prepend("<option value='<%= @item.id %>'><%= @item.name %></option>");
|
||||||
|
$("#node2_id").prepend("<option value='<%= @item.id %>'><%= @item.name %></option>");
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$('#cards').prepend('<%= escape_javascript(render(@item)) %>');
|
$('#cards').prepend('<%= escape_javascript(render(@item)) %>');
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<%= form_for @item, url: item_url do |form| %>
|
<%= form_for @item, url: item_url do |form| %>
|
||||||
<h3>Edit Item</h3>
|
<h3>Edit Item</h3>
|
||||||
<label for="category">Category</label>
|
<label for="category">Category</label>
|
||||||
<%= select "category", "item_category_id", ItemCategory.all.collect {|p| [ p.name, p.id ] }, { :selected => @item.item_category.id } %>
|
<%= select "category", "item_category_id", ItemCategory.order("name ASC").all.collect {|p| [ p.name, p.id ] }, { :selected => @item.item_category.id } %>
|
||||||
<label for="item_name">Title</label>
|
<label for="item_name">Title</label>
|
||||||
<%= form.text_field :name %>
|
<%= form.text_field :name %>
|
||||||
<label for="item_desc">Description</label>
|
<label for="item_desc">Description</label>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<div class="nothidden">
|
<div class="nothidden">
|
||||||
<%= form_for @item || Item.new, url: items_path do |form| %>
|
<%= form_for @item || Item.new, url: items_path do |form| %>
|
||||||
<h3>Add Item</h3>
|
<h3>Add Topic</h3>
|
||||||
<label for="category">Category</label>
|
<label for="category">Category</label>
|
||||||
<%= select_tag "category", options_from_collection_for_select(ItemCategory.all, "id", "name") %>
|
<%= select_tag "category", options_from_collection_for_select(ItemCategory.order("name ASC").all, "id", "name") %>
|
||||||
<label for="item_name">Title</label>
|
<label for="item_name">Title</label>
|
||||||
<%= form.text_field :name %>
|
<%= form.text_field :name %>
|
||||||
<label for="item_desc">Description</label>
|
<label for="item_desc">Description</label>
|
||||||
|
|
|
@ -34,4 +34,5 @@
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<%= render :partial => 'items/new' %>
|
<%= render :partial => 'items/new' %>
|
||||||
|
<%= render :partial => 'synapses/new' %>
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
<li><%= link_to "My Synapses", usersynapses_path %></li>
|
<li><%= link_to "My Synapses", usersynapses_path %></li>
|
||||||
<li><%= link_to "My Topics", userobjects_path %></li>
|
<li><%= link_to "My Topics", userobjects_path %></li>
|
||||||
<li>|</li>
|
<li>|</li>
|
||||||
<li><%= link_to "Add Synapse", new_synapse_path %></li>
|
<li><%= link_to "Add Synapse", new_synapse_path, id: "newsynapse" %></li>
|
||||||
<li>|</li>
|
<li>|</li>
|
||||||
<li><%= link_to "Add Topic", new_item_path, id: "newtopic" %></li>
|
<li><%= link_to "Add Topic", new_item_path, id: "newtopic" %></li>
|
||||||
<li>|</li>
|
<li>|</li>
|
||||||
|
|
|
@ -19,3 +19,5 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= render :partial => 'items/new' %>
|
<%= render :partial => 'items/new' %>
|
||||||
|
<%= render :partial => 'synapses/new' %>
|
||||||
|
|
||||||
|
|
|
@ -15,3 +15,4 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<%= render :partial => 'items/new' %>
|
<%= render :partial => 'items/new' %>
|
||||||
|
<%= render :partial => 'synapses/new' %>
|
||||||
|
|
18
app/views/synapses/_new.html.erb
Normal file
18
app/views/synapses/_new.html.erb
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<div class="anypage">
|
||||||
|
<%= form_for Synapse.new, url: synapses_url, remote: true do |form| %>
|
||||||
|
<button id="closenewsynapse" onclick="$('#new_synapse').fadeOut('fast'); $('#new_synapse')[0].reset(); return false;">close</button>
|
||||||
|
<h3>Add Synapse Between Topics</h3>
|
||||||
|
<%= hidden_field_tag(:category, "Item") %>
|
||||||
|
<% if Item.all.count > 0 %>
|
||||||
|
<label for="node1_id">Choose First Item</label>
|
||||||
|
<%= select_tag :node1_id, options_from_collection_for_select(Item.order("name ASC").all, "id", "name") %>
|
||||||
|
<% end %>
|
||||||
|
<label for="item_desc">Describe The Connection</label>
|
||||||
|
<%= form.text_field :desc, class: "description" %>
|
||||||
|
<% if Item.all.count > 0 %>
|
||||||
|
<label for="node2_id">Choose Second Item</label>
|
||||||
|
<%= select_tag :node2_id, options_from_collection_for_select(Item.order("name ASC").all, "id", "name") %>
|
||||||
|
<% end %>
|
||||||
|
<%= form.submit "Add Synapse", class: "add" %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
82
app/views/synapses/create.js.erb
Normal file
82
app/views/synapses/create.js.erb
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
$('#new_synapse').fadeOut('fast');
|
||||||
|
$('#new_synapse')[0].reset();
|
||||||
|
|
||||||
|
// if there's a map, add the synapse to that
|
||||||
|
map1 = document.getElementById('container');
|
||||||
|
|
||||||
|
if (map1 != null) {
|
||||||
|
|
||||||
|
var mymap, newnode, select1, select2, option, temp1, temp2, temp;
|
||||||
|
if (fd != null) {
|
||||||
|
mymap = fd;
|
||||||
|
}
|
||||||
|
else if (rg != null) {
|
||||||
|
mymap = rg;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp1 = mymap.graph.getNode(<%= @synapse.item1.id %>);
|
||||||
|
if (temp1 == null) {
|
||||||
|
newnode = <%= @synapse.item1.self_as_json.html_safe %>;
|
||||||
|
mymap.graph.addNode(newnode);
|
||||||
|
temp = mymap.graph.getNode('<%= @synapse.item1.id %>');
|
||||||
|
temp.setData('dim', 1, 'start');
|
||||||
|
temp.setData('dim', 40, 'end');
|
||||||
|
if (mymap == fd) {
|
||||||
|
temp.setPos(new $jit.Complex(0, 0), 'current');
|
||||||
|
temp.setPos(new $jit.Complex(0, 0), 'start');
|
||||||
|
temp.setPos(new $jit.Complex(0, 0), 'end');
|
||||||
|
}
|
||||||
|
else if (mymap == rg) {
|
||||||
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'current');
|
||||||
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'start');
|
||||||
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'end');
|
||||||
|
}
|
||||||
|
mymap.fx.plotNode(temp, mymap.canvas);
|
||||||
|
temp1 = mymap.graph.getNode(<%= @synapse.item1.id %>);
|
||||||
|
// add the new node to the synapse select list
|
||||||
|
$("#node1_id").prepend("<option value='<%= @synapse.item1.id %>'><%= @synapse.item1.name %></option>");
|
||||||
|
$("#node2_id").prepend("<option value='<%= @synapse.item1.id %>'><%= @synapse.item1.name %></option>");
|
||||||
|
}
|
||||||
|
temp2 = mymap.graph.getNode(<%= @synapse.item2.id %>);
|
||||||
|
if (temp2 == null) {
|
||||||
|
newnode = <%= @synapse.item2.self_as_json.html_safe %>;
|
||||||
|
mymap.graph.addNode(newnode);
|
||||||
|
temp = mymap.graph.getNode('<%= @synapse.item2.id %>');
|
||||||
|
temp.setData('dim', 1, 'start');
|
||||||
|
temp.setData('dim', 40, 'end');
|
||||||
|
if (mymap == fd) {
|
||||||
|
temp.setPos(new $jit.Complex(0, 0), 'current');
|
||||||
|
temp.setPos(new $jit.Complex(0, 0), 'start');
|
||||||
|
temp.setPos(new $jit.Complex(0, 0), 'end');
|
||||||
|
}
|
||||||
|
else if (mymap == rg) {
|
||||||
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'current');
|
||||||
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'start');
|
||||||
|
temp.setPos(new $jit.Polar(5.54, 347.6), 'end');
|
||||||
|
}
|
||||||
|
mymap.fx.plotNode(temp, mymap.canvas);
|
||||||
|
temp2 = mymap.graph.getNode(<%= @synapse.item2.id %>);
|
||||||
|
// add the new node to the synapse select list
|
||||||
|
$("#node1_id").prepend("<option value='<%= @synapse.item2.id %>'><%= @synapse.item2.name %></option>");
|
||||||
|
$("#node2_id").prepend("<option value='<%= @synapse.item2.id %>'><%= @synapse.item2.name %></option>");
|
||||||
|
}
|
||||||
|
mymap.graph.addAdjacence(temp1, temp2, {});
|
||||||
|
temp = mymap.graph.getAdjacence(temp1.id, temp2.id);
|
||||||
|
temp.setDataset('start', {
|
||||||
|
lineWidth: 0.4,
|
||||||
|
color: '#d1d1d1'
|
||||||
|
});
|
||||||
|
temp.setDataset('end', {
|
||||||
|
lineWidth: 3,
|
||||||
|
color: '#36acfb'
|
||||||
|
});
|
||||||
|
temp.setDataset('current', {
|
||||||
|
desc: '<%= @synapse.desc %>',
|
||||||
|
category: '<%= @synapse.category %>'
|
||||||
|
});
|
||||||
|
mymap.fx.plotLine(temp, mymap.canvas);
|
||||||
|
mymap.fx.animate({
|
||||||
|
modes: ['node-property:dim','edge-property:lineWidth:color'],
|
||||||
|
duration: 400
|
||||||
|
});
|
||||||
|
}
|
|
@ -2,13 +2,13 @@
|
||||||
<h3>Edit Synapse</h3>
|
<h3>Edit Synapse</h3>
|
||||||
<% if @collection.count > 0 %>
|
<% if @collection.count > 0 %>
|
||||||
<label for="node1_id">Choose First <%= @synapse.category %></label>
|
<label for="node1_id">Choose First <%= @synapse.category %></label>
|
||||||
<%= select "node1_id", "node1", @collection.map {|p| [ p.name, p.id ] }, { :selected => @synapse.node1_id } %>
|
<%= select "node1_id", "node1", @collection.order("name ASC").map {|p| [ p.name, p.id ] }, { :selected => @synapse.node1_id } %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<label for="item_desc">Describe The Connection</label>
|
<label for="item_desc">Describe The Connection</label>
|
||||||
<%= form.text_field :desc, class: "description" %>
|
<%= form.text_field :desc, class: "description" %>
|
||||||
<% if @collection.count > 0 %>
|
<% if @collection.count > 0 %>
|
||||||
<label for="node2_id">Choose Second <%= @synapse.category %></label>
|
<label for="node2_id">Choose Second <%= @synapse.category %></label>
|
||||||
<%= select "node2_id", "node2", @collection.map {|p| [ p.name, p.id ] }, { :selected => @synapse.node2_id } %>
|
<%= select "node2_id", "node2", @collection.order("name ASC").map {|p| [ p.name, p.id ] }, { :selected => @synapse.node2_id } %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= form.submit "Update", class: "update" %>
|
<%= form.submit "Update", class: "update" %>
|
||||||
<% end %>
|
<% end %>
|
|
@ -1,16 +1,16 @@
|
||||||
<div class="newsynapses">
|
<div class="newsynapses">
|
||||||
<%= form_for @synapse, url: synapses_url do |form| %>
|
<%= form_for @synapse, url: synapses_url do |form| %>
|
||||||
<h3>Add Synapse Between Items</h3>
|
<h3>Add Synapse Between Topics</h3>
|
||||||
<%= hidden_field_tag(:category, "Item") %>
|
<%= hidden_field_tag(:category, "Item") %>
|
||||||
<% if @allitems.count > 0 %>
|
<% if Item.all.count > 0 %>
|
||||||
<label for="node1_id">Choose First Item</label>
|
<label for="node1_id">Choose First Item</label>
|
||||||
<%= select_tag :node1_id, options_from_collection_for_select(@allitems, "id", "name") %>
|
<%= select_tag :node1_id, options_from_collection_for_select(Item.order("name ASC").all, "id", "name") %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<label for="item_desc">Describe The Connection</label>
|
<label for="item_desc">Describe The Connection</label>
|
||||||
<%= form.text_field :desc, class: "description" %>
|
<%= form.text_field :desc, class: "description" %>
|
||||||
<% if @allitems.count > 0 %>
|
<% if Item.all.count > 0 %>
|
||||||
<label for="node2_id">Choose Second Item</label>
|
<label for="node2_id">Choose Second Item</label>
|
||||||
<%= select_tag :node2_id, options_from_collection_for_select(@allitems, "id", "name") %>
|
<%= select_tag :node2_id, options_from_collection_for_select(Item.order("name ASC").all, "id", "name") %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= form.submit "Add Synapse", class: "add" %>
|
<%= form.submit "Add Synapse", class: "add" %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
8
db/migrate/20121023231434_create_maps.rb
Normal file
8
db/migrate/20121023231434_create_maps.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
class CreateMaps < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :maps do |t|
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
11
test/fixtures/maps.yml
vendored
Normal file
11
test/fixtures/maps.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
|
||||||
|
|
||||||
|
# This model initially had no columns defined. If you add columns to the
|
||||||
|
# model remove the '{}' from the fixture names and add the columns immediately
|
||||||
|
# below each fixture, per the syntax in the comments below
|
||||||
|
#
|
||||||
|
one: {}
|
||||||
|
# column: value
|
||||||
|
#
|
||||||
|
two: {}
|
||||||
|
# column: value
|
7
test/unit/map_test.rb
Normal file
7
test/unit/map_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class MapTest < ActiveSupport::TestCase
|
||||||
|
# test "the truth" do
|
||||||
|
# assert true
|
||||||
|
# end
|
||||||
|
end
|
Loading…
Reference in a new issue