backlog 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/History.txt +10 -0
  2. data/Rakefile +2 -1
  3. data/app/controllers/application.rb +55 -8
  4. data/app/controllers/groups_controller.rb +62 -0
  5. data/app/controllers/periods_controller.rb +13 -55
  6. data/app/controllers/tasks_controller.rb +9 -5
  7. data/app/controllers/works_controller.rb +43 -6
  8. data/app/helpers/application_helper.rb +20 -2
  9. data/app/helpers/groups_helper.rb +2 -0
  10. data/app/models/backlog.rb +19 -10
  11. data/app/models/estimate.rb +2 -1
  12. data/app/models/group.rb +11 -0
  13. data/app/models/party.rb +3 -0
  14. data/app/models/period.rb +43 -6
  15. data/app/models/task.rb +27 -14
  16. data/app/models/user.rb +37 -8
  17. data/app/models/work.rb +4 -6
  18. data/app/views/backlogs/_name_list.rhtml +5 -0
  19. data/app/views/backlogs/show.rhtml +4 -4
  20. data/app/views/groups/_form.rhtml +7 -0
  21. data/app/views/groups/edit.rhtml +31 -0
  22. data/app/views/groups/list.rhtml +27 -0
  23. data/app/views/groups/new.rhtml +8 -0
  24. data/app/views/layouts/wide.rhtml +2 -2
  25. data/app/views/periods/_burn_down_chart.rhtml +1 -1
  26. data/app/views/periods/_form.rhtml +13 -9
  27. data/app/views/periods/_show_active.rhtml +6 -12
  28. data/app/views/periods/_title.rhtml +4 -5
  29. data/app/views/periods/edit.rhtml +1 -1
  30. data/app/views/periods/new.rhtml +1 -1
  31. data/app/views/periods/show.rhtml +10 -6
  32. data/app/views/tasks/_backlog_header.rhtml +22 -0
  33. data/app/views/tasks/_description_list.rhtml +5 -0
  34. data/app/views/tasks/_form.rhtml +26 -7
  35. data/app/views/tasks/_task.rhtml +4 -4
  36. data/app/views/tasks/edit.rhtml +2 -3
  37. data/app/views/tasks/list_started.rhtml +1 -0
  38. data/app/views/tasks/new.rhtml +2 -2
  39. data/app/views/works/_buttons.rhtml +3 -0
  40. data/app/views/works/_form.rhtml +15 -10
  41. data/app/views/works/daily_work_sheet.rhtml +30 -18
  42. data/app/views/works/edit.rhtml +4 -4
  43. data/app/views/works/list.rhtml +2 -2
  44. data/app/views/works/new.rhtml +3 -2
  45. data/app/views/works/weekly_work_sheet.rhtml +2 -2
  46. data/bin/backlog +2 -0
  47. data/bin/backlog_init.d_kubosch_production +27 -0
  48. data/bin/copy_production2development.rb +33 -0
  49. data/config/database.yml +13 -7
  50. data/config/deploy_kubosch.rb +1 -0
  51. data/config/environment.rb +2 -0
  52. data/config/environments/development_mysql.rb +27 -0
  53. data/config/environments/kubosch_production_mysql.rb +21 -0
  54. data/config/routes.rb +1 -1
  55. data/db/migrate/{001_tasks.rb → 001_create_tasks.rb} +1 -1
  56. data/db/migrate/{002_backlogs.rb → 002_create_backlogs.rb} +2 -2
  57. data/db/migrate/003_add_estimation_points.rb +1 -1
  58. data/db/migrate/004_add_period.rb +2 -2
  59. data/db/migrate/013_create_estimates.rb +1 -1
  60. data/db/migrate/015_add_user_option.rb +9 -5
  61. data/db/migrate/017_insert_datek_projects.rb +13 -10
  62. data/db/migrate/018_create_groups.rb +115 -0
  63. data/db/schema.rb +72 -12
  64. data/lang/en.yaml +7 -0
  65. data/lang/no.yaml +7 -0
  66. data/lib/big_decimal_yaml_fix.rb +27 -0
  67. data/lib/class_table_inheritance.rb +163 -0
  68. data/lib/tasks/backup.rake +92 -0
  69. data/public/images/person.org.png +0 -0
  70. data/public/images/person.png +0 -0
  71. data/public/stylesheets/backlog.css +3 -1
  72. data/public/stylesheets/mwrt002.css +1 -1
  73. data/test/fixtures/groups.yml +6 -0
  74. data/test/fixtures/parties.yml +31 -0
  75. data/test/fixtures/periods.yml +2 -2
  76. data/test/fixtures/tasks.yml +2 -0
  77. data/test/fixtures/users.yml +6 -6
  78. data/test/functional/backlogs_controller_test.rb +1 -1
  79. data/test/functional/groups_controller_test.rb +120 -0
  80. data/test/functional/periods_controller_test.rb +1 -1
  81. data/test/functional/tasks_controller_test.rb +16 -1
  82. data/test/functional/user_controller_test.rb +8 -2
  83. data/test/test_helper.rb +5 -0
  84. data/test/unit/big_decimal_yaml_fix_test.rb +14 -0
  85. data/test/unit/estimate_test.rb +1 -1
  86. data/test/unit/group_test.rb +10 -0
  87. data/test/unit/user_test.rb +56 -44
  88. data/tmp/sessions/ruby_sess.22dec3e9df47fb4e +0 -0
  89. data/tmp/sessions/ruby_sess.8037e0ab58cbcf1a +0 -0
  90. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +35 -0
  91. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak +1 -0
  92. data/vendor/rails/{actionwebservice/lib/action_web_service/templates/scaffolds/layout.rhtml → railties/configs/empty.log} +0 -0
  93. metadata +36 -105
  94. data/backlog.gemspec +0 -21
  95. data/vendor/rails/actionwebservice/CHANGELOG +0 -265
  96. data/vendor/rails/actionwebservice/MIT-LICENSE +0 -21
  97. data/vendor/rails/actionwebservice/README +0 -364
  98. data/vendor/rails/actionwebservice/Rakefile +0 -171
  99. data/vendor/rails/actionwebservice/TODO +0 -32
  100. data/vendor/rails/actionwebservice/examples/googlesearch/README +0 -143
  101. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_api.rb +0 -50
  102. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_controller.rb +0 -57
  103. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/google_search_service.rb +0 -108
  104. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/search_controller.rb +0 -7
  105. data/vendor/rails/actionwebservice/examples/googlesearch/direct/google_search_api.rb +0 -50
  106. data/vendor/rails/actionwebservice/examples/googlesearch/direct/search_controller.rb +0 -58
  107. data/vendor/rails/actionwebservice/examples/metaWeblog/README +0 -17
  108. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_api.rb +0 -60
  109. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_service.rb +0 -34
  110. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_api.rb +0 -67
  111. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_service.rb +0 -48
  112. data/vendor/rails/actionwebservice/examples/metaWeblog/controllers/xmlrpc_controller.rb +0 -16
  113. data/vendor/rails/actionwebservice/install.rb +0 -30
  114. data/vendor/rails/actionwebservice/lib/action_web_service.rb +0 -66
  115. data/vendor/rails/actionwebservice/lib/action_web_service/api.rb +0 -301
  116. data/vendor/rails/actionwebservice/lib/action_web_service/base.rb +0 -42
  117. data/vendor/rails/actionwebservice/lib/action_web_service/casting.rb +0 -138
  118. data/vendor/rails/actionwebservice/lib/action_web_service/client.rb +0 -3
  119. data/vendor/rails/actionwebservice/lib/action_web_service/client/base.rb +0 -28
  120. data/vendor/rails/actionwebservice/lib/action_web_service/client/soap_client.rb +0 -113
  121. data/vendor/rails/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +0 -58
  122. data/vendor/rails/actionwebservice/lib/action_web_service/container.rb +0 -3
  123. data/vendor/rails/actionwebservice/lib/action_web_service/container/action_controller_container.rb +0 -93
  124. data/vendor/rails/actionwebservice/lib/action_web_service/container/delegated_container.rb +0 -86
  125. data/vendor/rails/actionwebservice/lib/action_web_service/container/direct_container.rb +0 -69
  126. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher.rb +0 -2
  127. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/abstract.rb +0 -207
  128. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +0 -379
  129. data/vendor/rails/actionwebservice/lib/action_web_service/invocation.rb +0 -202
  130. data/vendor/rails/actionwebservice/lib/action_web_service/protocol.rb +0 -4
  131. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/abstract.rb +0 -112
  132. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/discovery.rb +0 -37
  133. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol.rb +0 -176
  134. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +0 -235
  135. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +0 -122
  136. data/vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb +0 -283
  137. data/vendor/rails/actionwebservice/lib/action_web_service/struct.rb +0 -68
  138. data/vendor/rails/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb +0 -26
  139. data/vendor/rails/actionwebservice/lib/action_web_service/support/signature_types.rb +0 -226
  140. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/layout.erb +0 -65
  141. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.erb +0 -6
  142. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.rhtml +0 -0
  143. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.erb +0 -29
  144. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.rhtml +0 -0
  145. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.erb +0 -30
  146. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.rhtml +0 -0
  147. data/vendor/rails/actionwebservice/lib/action_web_service/test_invoke.rb +0 -110
  148. data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +0 -9
  149. data/vendor/rails/actionwebservice/setup.rb +0 -1379
  150. data/vendor/rails/actionwebservice/test/abstract_client.rb +0 -183
  151. data/vendor/rails/actionwebservice/test/abstract_dispatcher.rb +0 -551
  152. data/vendor/rails/actionwebservice/test/abstract_unit.rb +0 -45
  153. data/vendor/rails/actionwebservice/test/api_test.rb +0 -102
  154. data/vendor/rails/actionwebservice/test/apis/auto_load_api.rb +0 -3
  155. data/vendor/rails/actionwebservice/test/apis/broken_auto_load_api.rb +0 -2
  156. data/vendor/rails/actionwebservice/test/base_test.rb +0 -42
  157. data/vendor/rails/actionwebservice/test/casting_test.rb +0 -86
  158. data/vendor/rails/actionwebservice/test/client_soap_test.rb +0 -153
  159. data/vendor/rails/actionwebservice/test/client_xmlrpc_test.rb +0 -152
  160. data/vendor/rails/actionwebservice/test/container_test.rb +0 -73
  161. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_soap_test.rb +0 -137
  162. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_xmlrpc_test.rb +0 -59
  163. data/vendor/rails/actionwebservice/test/fixtures/db_definitions/mysql.sql +0 -8
  164. data/vendor/rails/actionwebservice/test/fixtures/users.yml +0 -12
  165. data/vendor/rails/actionwebservice/test/gencov +0 -3
  166. data/vendor/rails/actionwebservice/test/invocation_test.rb +0 -185
  167. data/vendor/rails/actionwebservice/test/run +0 -6
  168. data/vendor/rails/actionwebservice/test/scaffolded_controller_test.rb +0 -146
  169. data/vendor/rails/actionwebservice/test/struct_test.rb +0 -52
  170. data/vendor/rails/actionwebservice/test/test_invoke_test.rb +0 -112
@@ -1,3 +1,13 @@
1
+ == 0.0.5 2007-07-29
2
+
3
+ * First party (user/group) centric release.
4
+ * Released gem, but still requires external database.
5
+
6
+ == 0.0.4 2007-07-06
7
+
8
+ * Last backlog centric release. Next release will be user/group centric
9
+ * Released gem, but still requires external database.
10
+
1
11
  == 0.0.0 14/6/2007
2
12
 
3
13
  * First release on RubyForge
data/Rakefile CHANGED
@@ -11,8 +11,9 @@ require 'tasks/rails'
11
11
 
12
12
  require 'hoe'
13
13
 
14
- Hoe.new("backlog", '0.0.4') do |p|
14
+ Hoe.new("backlog", '0.0.5') do |p|
15
15
  p.rubyforge_name = "backlog"
16
+ p.remote_rdoc_dir = '' # Release to root
16
17
  p.spec_extras = {
17
18
  :files => Dir['**/*'].reject{|file_name| file_name =~ /^log|pkg/}
18
19
  }
@@ -4,6 +4,11 @@ require 'user_system'
4
4
  class ApplicationController < ActionController::Base
5
5
  include Localization
6
6
  include UserSystem
7
+ include ActionView::Helpers::TagHelper
8
+ include ActionView::Helpers::JavaScriptHelper
9
+ include ActionView::Helpers::PrototypeHelper
10
+ include ActionView::Helpers::ScriptaculousHelper
11
+
7
12
  layout :determine_layout
8
13
  helper :user
9
14
  before_filter :store_detour_from_params
@@ -87,7 +92,7 @@ class ApplicationController < ActionController::Base
87
92
 
88
93
  def pop_detour
89
94
  detour = session[:detours].pop
90
- puts "popped detour: #{detour}"; STDOUT.flush
95
+ puts "popped detour: #{detour} #{session[:detours].size} more"; STDOUT.flush
91
96
  if session[:detours].empty?
92
97
  session[:detours] = nil
93
98
  end
@@ -112,23 +117,65 @@ class ApplicationController < ActionController::Base
112
117
  end
113
118
 
114
119
  def populate_layout
120
+ @period = Period.find(:first, params[:id]) if params[:id]
121
+ @owner = @period.party if @period
115
122
  populate_shortcuts
116
- @backlogs = Backlog.find(:all, :order => 'name')
117
- @sidebars = @backlogs.sort {|a, b| b.required_speed <=> a.required_speed}.map do |backlog|
123
+
124
+ # TODO (uwe): This does not scale!
125
+ periods = Period.find(:all).select {|period| period.active_or_future?(true)}
126
+
127
+ @sidebars = periods.sort_by {|p| p.required_speed}.reverse.map do |period|
118
128
  content = '<ul>'
119
- backlog.periods.select {|period| period.in_list? }[0...5].map do |period|
120
- "<li><a href=\"#{url_for(:controller => 'periods', :action => :show, :id => period)}\">#{period.backlog.name}##{period.position}</a></li>"
129
+ period.tasks.select {|task| task.in_list? }[0...5].map do |task|
130
+ "<li>#{task.description}</li>"
121
131
  end.each do |period_link|
122
132
  content << "#{period_link}"
123
133
  end
124
- content << '</ul>'
125
- { :title => "#{backlog.name} (#{'%0.1f' % backlog.required_speed})",
126
- :options => {:controller => 'backlogs', :action => :show, :id => backlog},
134
+ content << "</ul>\n"
135
+ content << drop_receiving_element("sidebar_#{period.id}",
136
+ :update => "spotlight",
137
+ :url => { :controller => 'tasks', :action => "move_to_period", :period_id => period.id},
138
+ :accept => "tasks", :loading => "", :complete => "",
139
+ :hoverclass => 'highlight')
140
+
141
+ { :id => period.id,
142
+ :title => "#{period.party.name}##{period.position} (#{'%0.1f' % period.required_speed})",
143
+ :options => {:controller => 'periods', :action => :show, :id => period},
127
144
  :content => content
128
145
  }
129
146
  end
147
+ started_tasks = Task.find_started(user)
148
+ if not started_tasks.empty?
149
+ links = started_tasks.map do |task|
150
+ "<li><a href=\"#{url_for :controller => 'periods', :action => :show, :id => task.period, :task_id => task.id}\">#{task.description}</a></li>"
151
+ end
152
+ @sidebars.unshift({ :title => l(:started_tasks),
153
+ :options => {:controller => 'tasks', :action => :list_started},
154
+ :content => "<ul>#{links}"
155
+ })
156
+ end
130
157
  end
131
158
 
159
+ # def populate_layout
160
+ # populate_shortcuts
161
+ # @groups = Group.find(:all, :order => 'name')
162
+ # @backlogs = Backlog.find(:all, :order => 'name')
163
+ # @sidebars = @backlogs.map do |backlog|
164
+ # content = '<ul>'
165
+ # periods = backlog.tasks.map {|task| task.period}.uniq
166
+ # periods.select {|period| period.in_list? }[0...5].map do |period|
167
+ # "<li><a href=\"#{url_for(:controller => 'periods', :action => :show, :id => period)}\">#{period.name}</a></li>"
168
+ # end.each do |period_link|
169
+ # content << "#{period_link}"
170
+ # end
171
+ # content << '</ul>'
172
+ # { :title => "#{backlog.name}",
173
+ # :options => {:controller => 'backlogs', :action => :show, :id => backlog},
174
+ # :content => content
175
+ # }
176
+ # end
177
+ # end
178
+
132
179
  private
133
180
 
134
181
  def user_id
@@ -0,0 +1,62 @@
1
+ class GroupsController < ApplicationController
2
+ def index
3
+ list
4
+ render :action => 'list'
5
+ end
6
+
7
+ # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
8
+ verify :method => :post, :except => [ :edit, :index, :list, :new ],
9
+ :redirect_to => { :action => :list }
10
+
11
+ def list
12
+ @group_pages, @groups = paginate :groups, :per_page => 10
13
+ end
14
+
15
+ def new
16
+ @group = Group.new
17
+ end
18
+
19
+ def create
20
+ @group = Group.new(params[:group])
21
+ if @group.save
22
+ flash[:notice] = 'Group was successfully created.'
23
+ redirect_to :action => 'list'
24
+ else
25
+ render :action => 'new'
26
+ end
27
+ end
28
+
29
+ def edit
30
+ @group = Group.find(params[:id])
31
+ @users = User.find(:all)
32
+ @members = @group.users.to_s
33
+ end
34
+
35
+ def update
36
+ @group = Group.find(params[:id])
37
+ if @group.update_attributes(params[:group])
38
+ flash[:notice] = 'Group was successfully updated.'
39
+ back_or_redirect_to :action => :edit, :id => @group
40
+ else
41
+ render :action => 'edit'
42
+ end
43
+ end
44
+
45
+ def destroy
46
+ Group.find(params[:id]).destroy
47
+ redirect_to :action => 'list'
48
+ end
49
+
50
+ def set_member
51
+ @group = Group.find(params[:id])
52
+ @user = User.find(params[:user_id])
53
+ if params[:value] == 'true'
54
+ @group.users << @user unless @group.users.include? @user
55
+ else
56
+ @group.users.delete @user
57
+ end
58
+ @users = User.find(:all)
59
+ redirect_to :action => :edit, :id => @group
60
+ end
61
+
62
+ end
@@ -1,9 +1,4 @@
1
1
  class PeriodsController < ApplicationController
2
- include ActionView::Helpers::TagHelper
3
- include ActionView::Helpers::JavaScriptHelper
4
- include ActionView::Helpers::PrototypeHelper
5
- include ActionView::Helpers::ScriptaculousHelper
6
-
7
2
  skip_before_filter :populate_layout, :only => [:index, :show_nolayout, :destroy, :burn_down_chart_thumbnail, :burn_down_chart]
8
3
  skip_before_filter :authenticate_user, :only => [:burn_down_chart, :burn_down_chart_thumbnail, :burn_down_chart_large]
9
4
 
@@ -17,8 +12,8 @@ class PeriodsController < ApplicationController
17
12
  verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :index }
18
13
 
19
14
  def show
20
- if params[:task]
21
- @selected_task = Task.find(params[:task])
15
+ if params[:task_id]
16
+ @selected_task = Task.find(params[:task_id])
22
17
  end
23
18
  if @selected_task
24
19
  @period = @selected_task.period
@@ -42,9 +37,9 @@ class PeriodsController < ApplicationController
42
37
 
43
38
  def new
44
39
  @period = Period.new
45
- if params[:backlog_id]
46
- @period.backlog_id = params[:backlog_id]
47
- previous = @period.backlog.periods.last
40
+ if params[:party_id]
41
+ @period.party_id = params[:party_id]
42
+ previous = @period.party.periods.last
48
43
  if previous
49
44
  @period.start_on = previous.end_on + 1
50
45
  @period.end_on = previous.end_on + (1 + (previous.end_on - previous.start_on))
@@ -52,7 +47,7 @@ class PeriodsController < ApplicationController
52
47
  @period.start_on = Date.today
53
48
  end
54
49
  else
55
- @backlogs = Backlog.find(:all, :order => 'name')
50
+ @parties = Party.find(:all)
56
51
  end
57
52
  end
58
53
 
@@ -116,14 +111,14 @@ class PeriodsController < ApplicationController
116
111
  g.legend_font_size = 14
117
112
  g.hide_dots = true
118
113
  g.colors = %w{blue orange}
119
- if period.backlog.track_done
114
+ if period.track_work?
120
115
  g.colors += %w{green}
121
116
  end
122
117
  if previous_period = period.higher_item
123
118
  g.colors += %w{grey grey}
124
119
  end
125
120
  if period.active?
126
- g.colors += %w{red orange}
121
+ g.colors += %w{lightblue #d7a790}
127
122
  end
128
123
 
129
124
  recorded_dates = period.recorded_dates
@@ -131,7 +126,7 @@ class PeriodsController < ApplicationController
131
126
  actual_todo_data = get_todo_data(recorded_dates, period, true)
132
127
  g.data("#{l :todo} (#{l :obs})", observed_todo_data)
133
128
  g.data("#{l :calc}", actual_todo_data)
134
- g.data(l(:done), get_work_data(recorded_dates, period)) if period.backlog.track_done
129
+ g.data(l(:done), get_work_data(recorded_dates, period)) if period.track_work?
135
130
  if previous_period = period.higher_item
136
131
  g.data("#{l :previous} #{l :obs}", get_todo_data(previous_period.dates, previous_period))
137
132
  g.data("#{l :calc}", get_todo_data(previous_period.dates, previous_period, true))
@@ -148,11 +143,11 @@ class PeriodsController < ApplicationController
148
143
  labels = {0 => all_dates.first.to_s, all_dates.length-1 => all_dates.last.to_s}
149
144
  labels.merge({all_dates.index(Date.today) => Date.today.to_s}) if all_dates.index(Date.today) && (all_dates.index(Date.today) / all_dates.length) > 0.10
150
145
  g.labels = labels
151
-
146
+
152
147
  # g.draw_vertical_legend
153
-
148
+
154
149
  g.maximum_value = g.maximum_value.to_i
155
-
150
+
156
151
  send_data(g.to_blob,
157
152
  :disposition => 'inline',
158
153
  :type => 'image/png',
@@ -187,41 +182,4 @@ class PeriodsController < ApplicationController
187
182
  end
188
183
  end
189
184
 
190
- def populate_layout
191
- @period = Period.find(:first, params[:id]) if params[:id]
192
- @backlog = @period.backlog if @period
193
- populate_shortcuts
194
- periods = Period.find(:all).select {|period| period.active?(true)}
195
- @sidebars = periods.sort_by {|p| p.required_speed}.reverse.map do |period|
196
- content = '<ul>'
197
- period.tasks.select {|task| task.in_list? }[0...5].map do |task|
198
- "<li>#{task.description}</li>"
199
- end.each do |period_link|
200
- content << "#{period_link}"
201
- end
202
- content << "</ul>\n"
203
- content << drop_receiving_element("sidebar_#{period.id}",
204
- :update => "spotlight",
205
- :url => { :controller => 'tasks', :action => "move_to_period", :period_id => period.id},
206
- :accept => "tasks", :loading => "", :complete => "",
207
- :hoverclass => 'highlight')
208
-
209
- { :id => period.id,
210
- :title => "#{period.backlog.name}##{period.position} (#{'%0.1f' % period.required_speed})",
211
- :options => {:controller => 'periods', :action => :show, :id => period},
212
- :content => content
213
- }
214
- end
215
- started_tasks = Task.find_started(user)
216
- if not started_tasks.empty?
217
- links = started_tasks.map do |task|
218
- "<li><a href=\"#{url_for :controller => 'periods', :action => :show, :id => task.period, :task_id => task.id}\">#{task.description}</a></li>"
219
- end
220
- @sidebars.unshift({ :title => l(:started_tasks),
221
- :options => {:controller => 'tasks', :action => :list_started},
222
- :content => "<ul>#{links}"
223
- })
224
- end
225
- end
226
-
227
- end
185
+ end
@@ -7,16 +7,19 @@ class TasksController < ApplicationController
7
7
 
8
8
  def list_started
9
9
  @tasks = Task.find_started(user)
10
+ back_or_redirect_to :controller => nil, :action => nil if @tasks.empty?
10
11
  end
11
12
 
12
13
  def new
13
- @task = Task.new
14
- @task.period_id = params[:period_id]
14
+ @task = Task.new params[:task]
15
+ @task.backlog_id ||= @task.period && @task.period.most_frequent_backlog
16
+ @backlogs = Backlog.find(:all, :order => 'name')
17
+ @periods = Period.find_active_or_future
15
18
  end
16
19
 
17
20
  def create
18
- if params[:task] && params[:task][:period_id] && params[:task][:period_id][0..0] == 'B'
19
- detour_to :controller => 'periods', :action => :new, :backlog_id => params[:task][:period_id][1..-1].to_i
21
+ if params[:task] && params[:task][:period_id] && params[:task][:period_id][0..0] == 'G'
22
+ detour_to :controller => 'periods', :action => :new, :group_id => params[:task][:period_id][1..-1].to_i
20
23
  return
21
24
  end
22
25
  @task = Task.new(params[:task])
@@ -32,6 +35,7 @@ class TasksController < ApplicationController
32
35
 
33
36
  def edit
34
37
  @task = Task.find(params[:id])
38
+ @periods = Period.find_active_or_future
35
39
  end
36
40
 
37
41
  def update
@@ -122,7 +126,7 @@ class TasksController < ApplicationController
122
126
  back_or_redirect_to :controller => 'periods', :action => :show_nolayout, :id => next_task.period, :task_id => next_task.id
123
127
  end
124
128
  else
125
- detour_to :controller => 'periods', :action => :new, :backlog_id => task.period.backlog.id, :layout => with_layout && determine_layout
129
+ detour_to :controller => 'periods', :action => :new, :party_id => task.period.party_id, :layout => with_layout && determine_layout
126
130
  end
127
131
  else
128
132
  redirect_to :controller => 'periods', :action => :show, :id => task.period, :task_id => task.id, :layout => with_layout && determine_layout
@@ -27,11 +27,12 @@ class WorksController < ApplicationController
27
27
  @work = Work.new(params[:work])
28
28
  @work.user = user
29
29
  @estimate = Estimate.new(params[:estimate])
30
- @tasks = Task.find(:all)
30
+ @tasks = Task.find_open
31
31
  @users = User.find(:all)
32
32
  end
33
33
 
34
34
  def create
35
+ convert_hours_param
35
36
  @work = Work.new(params[:work])
36
37
  @work.completed_at = Time.now unless @work.completed_at
37
38
  if @work.save!
@@ -57,8 +58,9 @@ class WorksController < ApplicationController
57
58
  @work = Work.find(params[:id])
58
59
 
59
60
  @work.task.estimates.new(params[:estimate]).save! if params[:estimate]
60
-
61
+
61
62
  convert_start_time_param
63
+ convert_hours_param
62
64
  if @work.update_attributes(params[:work])
63
65
  flash[:notice] = 'Work was successfully updated.'
64
66
  back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id
@@ -78,10 +80,11 @@ class WorksController < ApplicationController
78
80
  @date = (params[:date] && Date.parse(params[:date])) || Date.today
79
81
  @periods = []
80
82
  @works = Work.find(:all,
81
- :conditions => "started_at < '#{@date+1}' AND completed_at >= '#{@date}'",
82
- :order => 'completed_at'
83
- )
84
- # render :layout => 'wide'
83
+ :conditions => "started_at < '#{@date+1}' AND completed_at >= '#{@date}'",
84
+ :order => 'completed_at'
85
+ )
86
+ @started_works = Task.find_started
87
+ render :layout => 'wide'
85
88
  end
86
89
 
87
90
  def weekly_work_sheet
@@ -98,6 +101,24 @@ class WorksController < ApplicationController
98
101
  render :layout => false
99
102
  end
100
103
 
104
+ def auto_complete_for_work_backlog_name
105
+ @backlogs = Backlog.find(:all,
106
+ :conditions => [ 'LOWER(name) LIKE ?',
107
+ '%' + params[:work][:backlog_name].downcase + '%' ],
108
+ :order => 'name ASC',
109
+ :limit => 16)
110
+ render :partial => '/backlogs/name_list'
111
+ end
112
+
113
+ def auto_complete_for_work_task_description
114
+ @tasks = Task.find(:all,
115
+ :conditions => [ 'finished_at IS NULL AND LOWER(description) LIKE ?',
116
+ '%' + params[:work][:task_description].downcase + '%' ],
117
+ :order => 'description ASC',
118
+ :limit => 16)
119
+ render :partial => '/tasks/description_list'
120
+ end
121
+
101
122
  private
102
123
 
103
124
  def convert_start_time_param
@@ -114,4 +135,20 @@ class WorksController < ApplicationController
114
135
  end
115
136
  end
116
137
 
138
+ def convert_hours_param
139
+ if params[:work] && params[:work][:hours_time]
140
+ params[:work][:hours_time].strip!
141
+ if params[:work][:hours_time] =~ /^(\d*):(\d{2})$/
142
+ new_hours = $1
143
+ new_minutes = $2.to_i
144
+ params[:work][:hours] = BigDecimal("#{new_hours}.#{new_minutes / 0.6}")
145
+ elsif params[:work][:hours_time] =~ /^(\d*(?:.\d)?)$/
146
+ params[:work][:hours] = BigDecimal($1)
147
+ else
148
+ raise "Unknown time format: '#{params[:work][:hours_time]}'"
149
+ end
150
+ params[:work].delete :hours_time
151
+ end
152
+ end
153
+
117
154
  end
@@ -4,9 +4,9 @@ require 'localization'
4
4
  module ApplicationHelper
5
5
  include Localization
6
6
 
7
- def image_button_to(source, title, options)
7
+ def image_button_to(image_source, title, options)
8
8
  html = ''
9
- html += image_submit_tag source, :class => 'image-submit', :alt => title, :title => title,
9
+ html += image_submit_tag image_source, :class => 'image-submit', :alt => title, :title => title,
10
10
  :id => "#{title}_#{options[:id]}", :name => title,
11
11
  :onclick => "form.action='#{url_for(options)}'"
12
12
  end
@@ -15,6 +15,12 @@ module ApplicationHelper
15
15
  link_to title, options.update({:return_controller => @controller.controller_name, :return_action => @controller.action_name, :return_id => params[:id]})
16
16
  end
17
17
 
18
+ def image_detour_to(image_source, title, image_options, options )
19
+ image_options ||= {:class => 'image-submit'}
20
+ image_options.update :alt => title, :title => title
21
+ detour_to image_tag(image_source, image_options), options
22
+ end
23
+
18
24
  def back_or_link_to(title, options)
19
25
  if session[:detours]
20
26
  options = session[:detours].last.update({:return_from_detour => true})
@@ -23,4 +29,16 @@ puts "linked detour: #{options}"
23
29
  link_to title, options
24
30
  end
25
31
 
32
+ def t(time_as_float)
33
+ "#{time_as_float.to_i}:#{'%02d' % (time_as_float.frac * 60).to_i}"
34
+ end
35
+
36
+ def h(object)
37
+ if object.is_a? Time
38
+ object.strftime '%Y-%m-%d %H:%M:%S'
39
+ else
40
+ super object
41
+ end
42
+ end
43
+
26
44
  end