From 6ee025f3c59369663268082843b719961bc41d7b Mon Sep 17 00:00:00 2001 From: Paul van Tilburg Date: Tue, 29 Nov 2011 17:21:51 +0100 Subject: [PATCH] Also show the customers in the project/task selector of the timeline * Added partial view Views#_form_select_nested. * Updated the Timeline controller to build the nested list. * Set the last used task as the default task. --- stoptime.rb | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/stoptime.rb b/stoptime.rb index de270ea..7a54e20 100644 --- a/stoptime.rb +++ b/stoptime.rb @@ -908,10 +908,15 @@ module StopTime::Controllers @customer_list = Customer.all.map do |c| [c.id, c.short_name.present? ? c.short_name : c.name] end - @task_list = Task.all.reject { |t| t.billed? }.map do |t| - [t.id, t.name] + @task_list = Hash.new { |h, k| h[k] = Array.new } + Task.all.reject { |t| t.billed? }.each do |t| + customer = t.customer + cust_name = customer.short_name.present? ? customer.short_name \ + : customer.name + @task_list[cust_name] << [t.id, t.name] end @input["bill"] = true # Bill by default. + @input["task"] = @time_entries.first.task.id if @time_entries.present? render :time_entries end @@ -1227,7 +1232,7 @@ module StopTime::Views end form :action => R(Timeline), :method => :post do tr do - td { _form_select("task", @task_list) } + td { _form_select_nested("task", @task_list) } td { input :type => :text, :name => "date", :value => DateTime.now.to_date.to_formatted_s } td { input :type => :text, :name => "start", @@ -1740,4 +1745,34 @@ module StopTime::Views end end + # Partial view similar to Views#_form_select that generates a select element + # for a form with a field (and ID) _name_ and hash of _opts_. + # The hash _opts_ represents a subdivision of the options, where the key + # is the name of the subdivision and the value the options list as in + # Views#_form_select. + # + # The option list is an Hash of Strings mapping to an Array of a 2-valued + # array containg a value label and a human readable description for the + # value. + def _form_select_nested(name, opts) + if opts.blank? + select :name => name, :id => name, :disabled => true do + option "None found", :value => "none", :selected => true + end + else + select :name => name, :id => name do + opts.keys.sort.each do |key| + option "— #{key} —", :disabled => true + opts[key].sort_by { |o| o.last }.each do |opt_val, opt_str| + if @input[name] == opt_val + option opt_str, :value => opt_val, :selected => true + else + option opt_str, :value => opt_val + end + end + end + end + end + end + end # module StopTime::Views