backlog 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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