diff --git a/tracks/app/helpers/todos_helper.rb b/tracks/app/helpers/todos_helper.rb
index ec56e756..1f473ea0 100644
--- a/tracks/app/helpers/todos_helper.rb
+++ b/tracks/app/helpers/todos_helper.rb
@@ -9,33 +9,78 @@ module TodosHelper
def form_remote_tag_edit_todo( item, &block )
form_tag( todo_path(item), {:method => :put, :id => dom_id(item, 'form'), :class => "edit_todo_form inline-form" }, &block )
- apply_behavior 'form.edit_todo_form:submit',
- remote_function(:url => javascript_variable('this.action'), :method => :put, :form => true),
- :prevent_default => true
+ apply_behavior 'form.edit_todo_form', make_remote_form(:method => :put), :prevent_default => true
end
- def link_to_remote_todo(item)
- itemurl = todo_path(:id => item.id, :_source_view => @source_view)
-
- str = link_to_remote( image_tag_for_delete,
- { :url => todo_path(:id => item.id, :_source_view => @source_view),
- :method => :delete,
- :confirm => "Are you sure that you want to delete the action, \'#{item.description}\'?" },
- { :class => "icon" }
- ) + "\n"
- if !item.completed?
- str << link_to_remote( image_tag_for_edit(item),
- { :url => edit_todo_path(:id => item.id, :_source_view => @source_view),
- :method => 'get',
- :loading => visual_effect(:pulsate, dom_id(item, 'edit_icon')) },
- { :class => "icon" }
- )
- else
- str << '' + image_tag("blank.png") + " "
+ def remote_delete_icon(item)
+ str = link_to( image_tag("blank.png", :title =>"Delete action", :class=>"delete_item"),
+ todo_path(item),
+ :class => "icon delete_icon", :title => "delete the action '#{item.description}'")
+ apply_behavior '.item-container a.delete_icon:click', :prevent_default => true do |page|
+ page << "if (confirm('Are you sure that you want to ' + this.title + '?')) {"
+ page << " new Ajax.Request(this.href, { asynchronous : true, evalScripts : true, method : 'delete', parameters : { '_source_view' : '#{@source_view}' }})"
+ page << "}"
end
str
end
+ def remote_edit_icon(item)
+ if !item.completed?
+ str = link_to( image_tag_for_edit(item),
+ edit_todo_path(item),
+ :class => "icon edit_icon")
+ apply_behavior '.item-container a.edit_icon:click', :prevent_default => true do |page|
+ page << "new Ajax.Request(this.href, { asynchronous : true, evalScripts : true, method : 'get', parameters : { '_source_view' : '#{@source_view}' }, onLoading: function(request){ Effect.Pulsate(this)}});"
+ end
+ else
+ str = '' + image_tag("blank.png") + " "
+ end
+ str
+ end
+
+ def remote_toggle_checkbox(item)
+ str = check_box_tag('item_id', item.id, item.completed?, :class => 'item-checkbox', :url => toggle_check_todo_path(item))
+ apply_behavior '.item-container input.item-checkbox:click',
+ remote_function(:url => javascript_variable('this.attributes.url.value'),
+ :with => "{ method : 'post', _source_view : '#{@source_view}' }")
+ str
+ end
+
+ def date_span(item)
+ if item.completed?
+ "#{format_date( item.completed_at )}"
+ elsif item.deferred?
+ show_date( item.show_from )
+ else
+ due_date( item.due )
+ end
+ end
+
+ def tag_list(item)
+ item.tags.collect{|t| "" + link_to(t.name, :action => "tag", :id => t.name) + ""}.join('')
+ end
+
+ def deferred_due_date(item)
+ if item.deferred? && item.due
+ "(action due on #{format_date(item.due)})"
+ end
+ end
+
+ def project_and_context_links(item, parent_container_type)
+ if item.completed?
+ "(#{item.context.name}#{", " + item.project.name unless item.project.nil?})"
+ else
+ str = ''
+ if (['project', 'tickler', 'tag'].include?(parent_container_type))
+ str << item_link_to_context( item )
+ end
+ if (['context', 'tickler', 'tag'].include?(parent_container_type)) && item.project_id
+ str << item_link_to_project( item )
+ end
+ str
+ end
+ end
+
# Uses the 'staleness_starts' value from settings.yml (in days) to colour
# the background of the action appropriately according to the age
# of the creation date:
diff --git a/tracks/app/views/contexts/_context_listing.rhtml b/tracks/app/views/contexts/_context_listing.rhtml
index 5e1bab92..b9f669f6 100644
--- a/tracks/app/views/contexts/_context_listing.rhtml
+++ b/tracks/app/views/contexts/_context_listing.rhtml
@@ -17,10 +17,10 @@
<%= image_tag( "blank.png", :title => "Delete context", :class=>"delete_item") %>
<% apply_behavior "a.delete_context_button:click", :prevent_default => true do |page|
page << "if (confirm('Are you sure that you want to ' + this.title + '?')) {"
- page << " new Ajax.Updater($(this).up('.list'),"
+ page << " new Ajax.Updater(this.up('.list'),"
page << " this.href, {asynchronous:true,"
page << " evalScripts:true, method:'delete',"
- page << " onLoading:function(request){ Effect.Fade($(this).up('.list'));}}); };"
+ page << " onLoading:function(request){ Effect.Fade(this.up('.list'));}}); };"
end -%>
<%= image_tag( "blank.png", :title => "Edit context", :class=>"edit_item") %>
<% apply_behavior 'a.edit_context_button:click', {:prevent_default => true } do |page, element|
diff --git a/tracks/app/views/notes/_notes_summary.rhtml b/tracks/app/views/notes/_notes_summary.rhtml
index 25373930..9eb70db0 100644
--- a/tracks/app/views/notes/_notes_summary.rhtml
+++ b/tracks/app/views/notes/_notes_summary.rhtml
@@ -1,6 +1,6 @@
<% note = notes_summary -%>
-<%= link_to( image_tag("blank.png", :border => 0), note_path(note), :title => "Show note", :class => "show_notes icon") %>
+<%= link_to( image_tag("blank.png", :border => 0), note_path(note), :title => "Show note", :class => "link_to_notes icon") %>
<%= truncated_note(note) %>
<% note = nil -%>
diff --git a/tracks/app/views/todos/_item.rhtml b/tracks/app/views/todos/_item.rhtml
index c567662f..c65aa528 100644
--- a/tracks/app/views/todos/_item.rhtml
+++ b/tracks/app/views/todos/_item.rhtml
@@ -1,65 +1,22 @@
<% Tag %>
- <%= link_to_remote_todo item %>
-
- <% unless source_view_is :deferred -%>
-
checked="checked" <% end %> />
- <% apply_behavior '.item-container input.item-checkbox:click',
- remote_function(:url => javascript_variable('this.attributes.url.value'), :with => "{ method : 'post', _source_view : '#{@source_view}' }") %>
- <% end -%>
-
-
<% # start of div which has a class 'description', and possibly 'stale_11', 'stale_12', 'stale_13' etc %>
- <% if item.completed? -%>
-
<%= format_date( item.completed_at ) %>
- <% elsif item.deferred? -%>
- <%= show_date( item.show_from ) -%>
- <% else -%>
- <%= due_date( item.due ) -%>
- <% end -%>
-
+ <%= remote_delete_icon( item ) %>
+ <%= remote_edit_icon( item ) %>
+ <%= remote_toggle_checkbox( item ) unless source_view_is :deferred %>
+
+ <%= date_span( item ) %>
<%= sanitize(item.description) %>
-
- <%= if item.tag_list.blank?
- ""
- else
- tag_string = ""
- item.tags.each do |t|
- tag_string << "" + link_to(t.name, :action => "tag", :id => t.name) + ""
- end
- tag_string
- end
- %>
-
- <% if item.deferred? && item.due -%>
- (action due on <%= format_date(item.due) %>)
- <% end -%>
-
- <% if item.completed? -%>
- (<%= item.context.name %><%= ", " + item.project.name unless item.project.nil? %>)
- <% else -%>
- <% if (parent_container_type == "project" || parent_container_type == "tickler") -%>
- <%= item_link_to_context( item ) %>
- <% end -%>
- <% if (parent_container_type == "context" || parent_container_type == "tickler") && item.project_id -%>
- <%= item_link_to_project( item ) %>
- <% end -%>
- <% if (parent_container_type == "tag") -%>
- <%= item_link_to_context( item ) %>
- <%= item_link_to_project( item ) if item.project_id %>
- <% end -%>
- <% end -%>
-
- <% if item.notes? -%>
- <%= render :partial => "todos/toggle_notes", :locals => { :item => item } %>
- <% end -%>
+ <%= tag_list( item ) %>
+ <%= deferred_due_date( item ) %>
+ <%= project_and_context_links( item, parent_container_type ) %>
+ <%= render(:partial => "todos/toggle_notes", :locals => { :item => item }) if item.notes? %>
-
+
-
+
+
diff --git a/tracks/app/views/todos/_toggle_notes.rhtml b/tracks/app/views/todos/_toggle_notes.rhtml
index 8a8b1586..6ccab15d 100644
--- a/tracks/app/views/todos/_toggle_notes.rhtml
+++ b/tracks/app/views/todos/_toggle_notes.rhtml
@@ -1,7 +1,8 @@
-<%= link_to_function(image_tag( 'blank.png', :width=>'16', :height=>'16', :border=>'0' ), nil, {:class => 'show_notes', :title => 'Show notes'}) do |page|
- page[dom_id(item, 'notes')].toggle
- end
+<%= link_to(image_tag( 'blank.png', :width=>'16', :height=>'16', :border=>'0' ), nil, {:class => 'show_notes', :title => 'Show notes'}) %>
+<% apply_behavior 'a.show_notes:click', :prevent_default => true do |page, element|
+ element.next('.notes').toggle
+ end
-%>
-
- <%= markdown( item.notes ) %>
-
\ No newline at end of file
+
+ <%= markdown( item.notes ) %>
+
\ No newline at end of file
diff --git a/tracks/db/schema.rb b/tracks/db/schema.rb
index a937bdbb..5afc62ac 100644
--- a/tracks/db/schema.rb
+++ b/tracks/db/schema.rb
@@ -5,14 +5,15 @@
ActiveRecord::Schema.define(:version => 27) do
create_table "contexts", :force => true do |t|
- t.column "name", :string, :default => "", :null => false
- t.column "position", :integer, :default => 0, :null => false
- t.column "hide", :boolean, :default => false
- t.column "user_id", :integer, :default => 1
+ t.column "name", :string, :default => "", :null => false
+ t.column "hide", :integer, :limit => 4, :default => 0, :null => false
+ t.column "position", :integer, :default => 0, :null => false
+ t.column "user_id", :integer, :default => 0, :null => false
t.column "created_at", :datetime
t.column "updated_at", :datetime
end
+ add_index "contexts", ["user_id"], :name => "index_contexts_on_user_id"
add_index "contexts", ["user_id", "name"], :name => "index_contexts_on_user_id_and_name"
create_table "notes", :force => true do |t|
@@ -63,13 +64,14 @@ ActiveRecord::Schema.define(:version => 27) do
create_table "projects", :force => true do |t|
t.column "name", :string, :default => "", :null => false
t.column "position", :integer, :default => 0, :null => false
- t.column "user_id", :integer, :default => 1
+ t.column "user_id", :integer, :default => 0, :null => false
t.column "description", :text
t.column "state", :string, :limit => 20, :default => "active", :null => false
t.column "created_at", :datetime
t.column "updated_at", :datetime
end
+ add_index "projects", ["user_id"], :name => "index_projects_on_user_id"
add_index "projects", ["user_id", "name"], :name => "index_projects_on_user_id_and_name"
create_table "sessions", :force => true do |t|
@@ -98,16 +100,16 @@ ActiveRecord::Schema.define(:version => 27) do
add_index "tags", ["name"], :name => "index_tags_on_name"
create_table "todos", :force => true do |t|
- t.column "context_id", :integer, :default => 0, :null => false
- t.column "project_id", :integer
- t.column "description", :string, :default => "", :null => false
+ t.column "context_id", :integer, :default => 0, :null => false
+ t.column "description", :string, :limit => 100, :default => "", :null => false
t.column "notes", :text
t.column "created_at", :datetime
t.column "due", :date
t.column "completed_at", :datetime
- t.column "user_id", :integer, :default => 1
+ t.column "project_id", :integer
+ t.column "user_id", :integer, :default => 0, :null => false
t.column "show_from", :date
- t.column "state", :string, :limit => 20, :default => "immediate", :null => false
+ t.column "state", :string, :limit => 20, :default => "immediate", :null => false
end
add_index "todos", ["user_id", "state"], :name => "index_todos_on_user_id_and_state"
@@ -117,10 +119,10 @@ ActiveRecord::Schema.define(:version => 27) do
add_index "todos", ["user_id", "context_id"], :name => "index_todos_on_user_id_and_context_id"
create_table "users", :force => true do |t|
- t.column "login", :string, :limit => 80, :default => "", :null => false
- t.column "password", :string, :limit => 40, :default => "", :null => false
+ t.column "login", :string, :limit => 80
+ t.column "password", :string, :limit => 40
t.column "word", :string
- t.column "is_admin", :boolean, :default => false, :null => false
+ t.column "is_admin", :integer, :limit => 4, :default => 0, :null => false
t.column "first_name", :string
t.column "last_name", :string
t.column "auth_type", :string, :default => "database", :null => false
diff --git a/tracks/public/stylesheets/standard.css b/tracks/public/stylesheets/standard.css
index 7cc001e0..88ab82b7 100644
--- a/tracks/public/stylesheets/standard.css
+++ b/tracks/public/stylesheets/standard.css
@@ -45,9 +45,8 @@ a.down:hover {background: transparent url(../images/down_on.png) no-repeat;}
a.to_bottom {background: transparent url(../images/bottom_off.png) no-repeat;}
a.to_bottom:hover {background: transparent url(../images/bottom_on.png) no-repeat;}
-a.show_notes {background-image: url(../images/notes_off.png); background-repeat: no-repeat; padding: 1px; background-color: transparent;}
-a.show_notes:hover {background-image: url(../images/notes_on.png); background-repeat: no-repeat; padding: 1px; background-color: transparent;}
-
+a.show_notes, a.link_to_notes {background-image: url(../images/notes_off.png); background-repeat: no-repeat; padding: 1px; background-color: transparent;}
+a.show_notes:hover, a.link_to_notes:hover {background-image: url(../images/notes_on.png); background-repeat: no-repeat; padding: 1px; background-color: transparent;}
/* Structural divs */
diff --git a/tracks/test/selenium/notes/link_to_note.rsel b/tracks/test/selenium/notes/link_to_note.rsel
index 01e90f2a..ef966df3 100644
--- a/tracks/test/selenium/notes/link_to_note.rsel
+++ b/tracks/test/selenium/notes/link_to_note.rsel
@@ -1,5 +1,5 @@
setup :fixtures => :all
include_partial 'login/login', :username => 'admin', :password => 'abracadabra'
open "/projects/Build_a_working_time_machine"
-click_and_wait "css=#note_1 .show_notes"
+click_and_wait "css=#note_1 .link_to_notes"
assert_element_present "note_1"
diff --git a/tracks/vendor/plugins/unobtrusive_javascript/lib/ujs/behaviour_script.rb b/tracks/vendor/plugins/unobtrusive_javascript/lib/ujs/behaviour_script.rb
index e50f174d..81ec75d5 100644
--- a/tracks/vendor/plugins/unobtrusive_javascript/lib/ujs/behaviour_script.rb
+++ b/tracks/vendor/plugins/unobtrusive_javascript/lib/ujs/behaviour_script.rb
@@ -8,7 +8,7 @@ class UJS::BehaviourScript
def add_rule(selector, javascript, cancel_default=false)
javascript = javascript << cancel_default_js if cancel_default
- @rules << [selector, javascript]
+ @rules << [selector, javascript] unless rule_exists(selector, javascript)
end
def cache?
@@ -51,4 +51,8 @@ class UJS::BehaviourScript
def cancel_default_js
" return false;"
end
+
+ def rule_exists(selector, javascript)
+ @rules.detect{|r| r[0] == selector && r[1] == javascript} != nil
+ end
end
\ No newline at end of file