diff --git a/tracks/app/controllers/application.rb b/tracks/app/controllers/application.rb
index 8f7ef3f4..984d38e0 100644
--- a/tracks/app/controllers/application.rb
+++ b/tracks/app/controllers/application.rb
@@ -74,7 +74,7 @@ class ApplicationController < ActionController::Base
def get_current_user
@user = User.find(session['user_id']) if session['user_id']
- @prefs = @user.preferences unless @user.nil?
+ @prefs = @user.preference unless @user.nil?
end
def get_admin_user
@@ -83,7 +83,7 @@ class ApplicationController < ActionController::Base
def parse_date_per_user_prefs( s )
return nil if s == ''
- Date.strptime(s, @user.preferences["date_format"])
+ Date.strptime(s, @user.preference.date_format)
end
def init_data_for_sidebar
diff --git a/tracks/app/controllers/login_controller.rb b/tracks/app/controllers/login_controller.rb
index 2d49e1b7..3bf88bbe 100644
--- a/tracks/app/controllers/login_controller.rb
+++ b/tracks/app/controllers/login_controller.rb
@@ -1,5 +1,5 @@
class LoginController < ApplicationController
- model :user
+ model :user, :preference
layout 'login'
skip_before_filter :set_session_expiration
@@ -34,7 +34,7 @@ class LoginController < ApplicationController
@user = get_new_user
else # all other situations (i.e. a non-admin is logged in, or no one is logged in, but we have some users)
@page_title = "No signups"
- @admin_email = admin.preferences["admin_email"]
+ @admin_email = admin.preference.admin_email
render :action => "nosignup"
end
end
@@ -51,7 +51,7 @@ class LoginController < ApplicationController
user.is_admin = true if User.find_all.empty?
if user.save
@user = User.authenticate(user.login, params['user']['password'])
- @user.preferences = { "date_format" => "%d/%m/%Y", "week_starts" => "1", "no_completed" => "5", "staleness_starts" => "7", "due_style" => "1", "admin_email" => "butshesagirl@rousette.org.uk"}
+ @user.create_preference
@user.save
flash['notice'] = "Signup successful for user #{@user.login}."
redirect_back_or_default :controller => "todo", :action => "index"
diff --git a/tracks/app/controllers/todo_controller.rb b/tracks/app/controllers/todo_controller.rb
index 3002c3bd..736358b8 100644
--- a/tracks/app/controllers/todo_controller.rb
+++ b/tracks/app/controllers/todo_controller.rb
@@ -22,7 +22,7 @@ class TodoController < ApplicationController
# If you've set no_completed to zero, the completed items box
# isn't shown on the home page
- max_completed = @user.preferences["no_completed"].to_i-1
+ max_completed = @user.preference.show_number_completed - 1
@done = nil
if max_completed > 0
@done = Todo.find(:all,
diff --git a/tracks/app/controllers/user_controller.rb b/tracks/app/controllers/user_controller.rb
index da43cb4f..4046f1cd 100644
--- a/tracks/app/controllers/user_controller.rb
+++ b/tracks/app/controllers/user_controller.rb
@@ -50,29 +50,20 @@ class UserController < ApplicationController
def preferences
@page_title = "TRACKS::Preferences"
- @prefs = @user.preferences
+ @prefs = @user.preference
end
def edit_preferences
@page_title = "TRACKS::Edit Preferences"
- @prefs = @user.preferences
+ @prefs = @user.preference
render :action => "preference_edit_form", :object => @prefs
end
def update_preferences
- @user.preferences = { "date_format" => "#{params['prefs']['date_format']}",
- "week_starts" => "#{params['prefs']['week_starts']}",
- "no_completed" => "#{params['prefs']['no_completed']}",
- "staleness_starts" => "#{params['prefs']['staleness_starts']}",
- "show_completed_projects_on_home_page" => "#{params['prefs']['show_completed_projects_on_home_page']}",
- "due_style" => "#{params['prefs']['due_style']}",
- "admin_email" => "#{params['prefs']['admin_email']}",
- "refresh" => "#{params['prefs']['refresh']}"
- }
- @user.first_name = params['user']['first_name']
- @user.last_name = params['user']['last_name']
- if @user.save
+ user_success = @user.update_attributes(params['user'])
+ prefs_success = @user.preference.update_attributes(params['prefs'])
+ if user_success && prefs_success
redirect_to :action => 'preferences'
else
render :action => 'edit_preferences'
diff --git a/tracks/app/helpers/application_helper.rb b/tracks/app/helpers/application_helper.rb
index ce213884..a7cc7860 100644
--- a/tracks/app/helpers/application_helper.rb
+++ b/tracks/app/helpers/application_helper.rb
@@ -6,7 +6,7 @@ module ApplicationHelper
#
def format_date(date)
if date
- date_format = @user.preferences["date_format"]
+ date_format = @user.preference.date_format
formatted_date = date.strftime("#{date_format}")
else
formatted_date = ''
@@ -72,7 +72,7 @@ module ApplicationHelper
"Due Tomorrow "
# due 2-7 days away
when 2..7
- if @user.preferences["due_style"] == "1"
+ if @user.preference.due_style == "1"
"Due on " + due.strftime("%A") + " "
else
"Due in " + @days.to_s + " days "
diff --git a/tracks/app/helpers/todo_helper.rb b/tracks/app/helpers/todo_helper.rb
index 7ecbb0e3..108b9d86 100644
--- a/tracks/app/helpers/todo_helper.rb
+++ b/tracks/app/helpers/todo_helper.rb
@@ -44,11 +44,11 @@ module TodoHelper
def staleness_class(item)
if item.due || item.done?
return ""
- elsif item.created_at < (@user.preferences["staleness_starts"].to_i*3).days.ago
+ elsif item.created_at < (@user.preference.staleness_starts * 3).days.ago
return " stale_l3"
- elsif item.created_at < (@user.preferences["staleness_starts"].to_i*2).days.ago
+ elsif item.created_at < (@user.preference.staleness_starts * 2).days.ago
return " stale_l2"
- elsif item.created_at < (@user.preferences["staleness_starts"].to_i).days.ago
+ elsif item.created_at < (@user.preference.staleness_starts).days.ago
return " stale_l1"
else
return ""
@@ -76,7 +76,7 @@ module TodoHelper
"Show Tomorrow "
# due 2-7 days away
when 2..7
- if @user.preferences["due_style"] == "1"
+ if @user.preference.due_style == 1
"Show on " + due.strftime("%A") + " "
else
"Show in " + @days.to_s + " days "
@@ -99,8 +99,8 @@ module TodoHelper
end
def calendar_setup( input_field )
- date_format = @user.preferences["date_format"]
- week_starts = @user.preferences["week_starts"]
+ date_format = @user.preference.date_format
+ week_starts = @user.preference.week_starts
str = "Calendar.setup({ ifFormat:\"#{date_format}\""
str << ",firstDay:#{week_starts},showOthers:true,range:[2004, 2010]"
str << ",step:1,inputField:\"" + input_field + "\",cache:true,align:\"TR\" })\n"
diff --git a/tracks/app/models/context.rb b/tracks/app/models/context.rb
index c8e47368..808f1d01 100644
--- a/tracks/app/models/context.rb
+++ b/tracks/app/models/context.rb
@@ -35,7 +35,7 @@ class Context < ActiveRecord::Base
todos = Todo.find :all, :conditions => ["todos.context_id = ? AND todos.type = ? AND todos.done = ?", id, "Immediate", true],
:order => "completed DESC",
:include => [:context, :project],
- :limit => @user.preferences["no_completed"].to_i
+ :limit => @user.preference.show_number_completed
end
def hidden?
diff --git a/tracks/app/models/preference.rb b/tracks/app/models/preference.rb
new file mode 100644
index 00000000..316f2e22
--- /dev/null
+++ b/tracks/app/models/preference.rb
@@ -0,0 +1,18 @@
+class Preference < ActiveRecord::Base
+ belongs_to :user
+
+ def self.day_number_to_name_map
+ { 0 => "Sunday",
+ 1 => "Monday",
+ 2 => "Tuesday",
+ 3 => "Wednesday",
+ 4 => "Thursday",
+ 5 => "Friday",
+ 6 => "Saturday"}
+ end
+
+ def hide_completed_actions?
+ return show_number_completed == 0
+ end
+
+end
\ No newline at end of file
diff --git a/tracks/app/models/project.rb b/tracks/app/models/project.rb
index d080c9c7..3ea6e46e 100644
--- a/tracks/app/models/project.rb
+++ b/tracks/app/models/project.rb
@@ -44,7 +44,7 @@ class Project < ActiveRecord::Base
todos = Todo.find :all, :conditions => ["todos.project_id = ? AND todos.type = ? AND todos.done = ?", id, "Immediate", true],
:order => "completed DESC",
:include => [:context, :project],
- :limit => @user.preferences["no_completed"].to_i
+ :limit => @user.preference.show_number_completed
end
diff --git a/tracks/app/models/user.rb b/tracks/app/models/user.rb
index 73d56cdb..5f4a91d7 100644
--- a/tracks/app/models/user.rb
+++ b/tracks/app/models/user.rb
@@ -1,14 +1,12 @@
require 'digest/sha1'
-# this model expects a certain database layout and its based on the name/login pattern.
class User < ActiveRecord::Base
has_many :contexts, :order => "position ASC"
has_many :projects, :order => "position ASC"
has_many :todos, :order => "completed DESC, created_at DESC"
has_many :notes, :order => "created_at DESC"
+ has_one :preference
- serialize :preferences
-
attr_protected :is_admin
def self.authenticate(login, pass)
diff --git a/tracks/app/views/context/show.rhtml b/tracks/app/views/context/show.rhtml
index f36f0058..fa0db281 100644
--- a/tracks/app/views/context/show.rhtml
+++ b/tracks/app/views/context/show.rhtml
@@ -8,7 +8,7 @@
<%= render :partial => "context/context", :locals => { :context => @context, :collapsible => false } %>
<% unless @done.empty? -%>
- <%= render :partial => "todo/completed", :locals => { :done => @done, :collapsible => false, :append_descriptor => "in this context (last #{@user.preferences["no_completed"]})" } %>
+ <%= render :partial => "todo/completed", :locals => { :done => @done, :collapsible => false, :append_descriptor => "in this context (last #{@user.preference.show_number_completed})" } %>
<% end -%>
diff --git a/tracks/app/views/context/toggle_check.rjs b/tracks/app/views/context/toggle_check.rjs
index b20725d8..bb25d3b8 100644
--- a/tracks/app/views/context/toggle_check.rjs
+++ b/tracks/app/views/context/toggle_check.rjs
@@ -2,7 +2,7 @@ if @saved
page.remove "item-#{@item.id}-container"
if @item.done?
# Don't try to insert contents into a non-existent container!
- unless @user.preferences["no_completed"].to_i == 0
+ unless @user.preference.hide_completed_actions?
page.insert_html :top, "completed", :partial => 'todo/item', :locals => { :parent_container_type => "completed" }
page.visual_effect :highlight, "item-#{@item.id}", {'startcolor' => "'#99ff99'"}
if @down_count == '0'
diff --git a/tracks/app/views/project/toggle_check.rjs b/tracks/app/views/project/toggle_check.rjs
index a898baba..4ac8a403 100644
--- a/tracks/app/views/project/toggle_check.rjs
+++ b/tracks/app/views/project/toggle_check.rjs
@@ -2,7 +2,7 @@ if @saved
page.remove "item-#{@item.id}-container"
if @item.done?
# Don't try to insert contents into a non-existent container!
- unless @user.preferences["no_completed"].to_i == 0
+ unless @user.preference.hide_completed_actions?
page.insert_html :top, "completed", :partial => 'todo/item', :locals => { :parent_container_type => "project" }
page.visual_effect :highlight, "item-#{@item.id}", {'startcolor' => "'#99ff99'"}
if @down_count == '0'
diff --git a/tracks/app/views/shared/sidebar.rhtml b/tracks/app/views/shared/sidebar.rhtml
index c272b9fd..1ffbf286 100644
--- a/tracks/app/views/shared/sidebar.rhtml
+++ b/tracks/app/views/shared/sidebar.rhtml
@@ -6,7 +6,7 @@
<% end -%>
-<% if @user.preferences['show_completed_projects_on_home_page'].downcase == 'true' %>
+<% if @user.preference.show_completed_projects_in_sidebar %>
Completed Projects:
<% for project in @projects.reject{|p| !p.done? } -%>
@@ -24,6 +24,7 @@
<% end -%>
+<% if @user.preference.show_hidden_contexts_in_sidebar %>
Hidden Contexts:
<% for context in @contexts.reject{|c| !c.hide? } -%>
@@ -31,3 +32,4 @@
:name => urlize(context.name) } ) + " (" + count_undone_todos(context,"actions") + ")" %>
<% end -%>
+<% end %>
diff --git a/tracks/app/views/todo/toggle_check.rjs b/tracks/app/views/todo/toggle_check.rjs
index 535e6312..a2ff2bc2 100644
--- a/tracks/app/views/todo/toggle_check.rjs
+++ b/tracks/app/views/todo/toggle_check.rjs
@@ -5,7 +5,7 @@ if @saved
# page.call "fadeAndRemoveItem", "item-#{@item.id}-container"
if @item.done?
# Don't try to insert contents into a non-existent container!
- unless @user.preferences["no_completed"].to_i == 0
+ unless @user.preference.hide_completed_actions?
page.insert_html :top, "completed", :partial => 'todo/item', :locals => { :parent_container_type => "completed" }
page.visual_effect :highlight, "item-#{@item.id}", {'startcolor' => "'#99ff99'"}
end
diff --git a/tracks/app/views/user/preference_edit_form.rhtml b/tracks/app/views/user/preference_edit_form.rhtml
index 68246a65..7ccbd66e 100644
--- a/tracks/app/views/user/preference_edit_form.rhtml
+++ b/tracks/app/views/user/preference_edit_form.rhtml
@@ -3,15 +3,16 @@
The preference settings should mostly be self-explanatory, but some hints are included below:
first name and last name: Used for display purposes if set
-
staleness starts: the number of days before items with no due date get marked as stale (with a yellow highlight)
-
date format: the format in which you'd like dates to be shown. For example, for the date 31st January 2006, %d/%m/%Y will show 31/01/2006, %b-%e-%y will show Jan-31-06. See the strftime manual for more formatting options for the date.
-
no completed: number of completed actions to show on the home page. If you set this to zero, the completed actions box will not be shown on the home page or on the individual context or project pages. You can still see all your completed items by clicking the 'Done' link in the navigation bar at the top of each page.
+
week starts: day of the week shown as the start of the week on the popup calendar.
+
due style: style in which due dates are shown, e.g. "Due in 3 days", "Due on Wednesday"
+
show completed projects in sidebar: whether or not projects marked as complete are shown in the sidebar on the home page and elsewhere
+
show hidden contexts in sidebar: whether or not contexts marked as hidden are shown in the sidebar on the home page and elsewhere
<% if @user.is_admin? %>
admin email: email address for the admin user of Tracks (displayed on the signup page for users to contact to obtain an account)
<% end %>
-
week starts: day of the week shown as the start of the week on the popup calendar.
-
show completed projects on home page: whether or not projects marked as complete are shown on the home page sidebar
-
due style: style in which due dates are shown, e.g. "Due in 3 days", "Due on Wednesday"
+
staleness starts: the number of days before items with no due date get marked as stale (with a yellow highlight)
+
date format: the format in which you'd like dates to be shown. For example, for the date 31st January 2006, %d/%m/%Y will show 31/01/2006, %b-%e-%y will show Jan-31-06. See the strftime manual for more formatting options for the date.
+
show number completed: number of completed actions to show on the home page. If you set this to zero, the completed actions box will not be shown on the home page or on the individual context or project pages. You can still see all your completed items by clicking the 'Done' link in the navigation bar at the top of each page.
refresh: automatic refresh interval for each of the pages (in minutes)