backlog 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/Rakefile +2 -1
- data/app/controllers/application.rb +55 -8
- data/app/controllers/groups_controller.rb +62 -0
- data/app/controllers/periods_controller.rb +13 -55
- data/app/controllers/tasks_controller.rb +9 -5
- data/app/controllers/works_controller.rb +43 -6
- data/app/helpers/application_helper.rb +20 -2
- data/app/helpers/groups_helper.rb +2 -0
- data/app/models/backlog.rb +19 -10
- data/app/models/estimate.rb +2 -1
- data/app/models/group.rb +11 -0
- data/app/models/party.rb +3 -0
- data/app/models/period.rb +43 -6
- data/app/models/task.rb +27 -14
- data/app/models/user.rb +37 -8
- data/app/models/work.rb +4 -6
- data/app/views/backlogs/_name_list.rhtml +5 -0
- data/app/views/backlogs/show.rhtml +4 -4
- data/app/views/groups/_form.rhtml +7 -0
- data/app/views/groups/edit.rhtml +31 -0
- data/app/views/groups/list.rhtml +27 -0
- data/app/views/groups/new.rhtml +8 -0
- data/app/views/layouts/wide.rhtml +2 -2
- data/app/views/periods/_burn_down_chart.rhtml +1 -1
- data/app/views/periods/_form.rhtml +13 -9
- data/app/views/periods/_show_active.rhtml +6 -12
- data/app/views/periods/_title.rhtml +4 -5
- data/app/views/periods/edit.rhtml +1 -1
- data/app/views/periods/new.rhtml +1 -1
- data/app/views/periods/show.rhtml +10 -6
- data/app/views/tasks/_backlog_header.rhtml +22 -0
- data/app/views/tasks/_description_list.rhtml +5 -0
- data/app/views/tasks/_form.rhtml +26 -7
- data/app/views/tasks/_task.rhtml +4 -4
- data/app/views/tasks/edit.rhtml +2 -3
- data/app/views/tasks/list_started.rhtml +1 -0
- data/app/views/tasks/new.rhtml +2 -2
- data/app/views/works/_buttons.rhtml +3 -0
- data/app/views/works/_form.rhtml +15 -10
- data/app/views/works/daily_work_sheet.rhtml +30 -18
- data/app/views/works/edit.rhtml +4 -4
- data/app/views/works/list.rhtml +2 -2
- data/app/views/works/new.rhtml +3 -2
- data/app/views/works/weekly_work_sheet.rhtml +2 -2
- data/bin/backlog +2 -0
- data/bin/backlog_init.d_kubosch_production +27 -0
- data/bin/copy_production2development.rb +33 -0
- data/config/database.yml +13 -7
- data/config/deploy_kubosch.rb +1 -0
- data/config/environment.rb +2 -0
- data/config/environments/development_mysql.rb +27 -0
- data/config/environments/kubosch_production_mysql.rb +21 -0
- data/config/routes.rb +1 -1
- data/db/migrate/{001_tasks.rb → 001_create_tasks.rb} +1 -1
- data/db/migrate/{002_backlogs.rb → 002_create_backlogs.rb} +2 -2
- data/db/migrate/003_add_estimation_points.rb +1 -1
- data/db/migrate/004_add_period.rb +2 -2
- data/db/migrate/013_create_estimates.rb +1 -1
- data/db/migrate/015_add_user_option.rb +9 -5
- data/db/migrate/017_insert_datek_projects.rb +13 -10
- data/db/migrate/018_create_groups.rb +115 -0
- data/db/schema.rb +72 -12
- data/lang/en.yaml +7 -0
- data/lang/no.yaml +7 -0
- data/lib/big_decimal_yaml_fix.rb +27 -0
- data/lib/class_table_inheritance.rb +163 -0
- data/lib/tasks/backup.rake +92 -0
- data/public/images/person.org.png +0 -0
- data/public/images/person.png +0 -0
- data/public/stylesheets/backlog.css +3 -1
- data/public/stylesheets/mwrt002.css +1 -1
- data/test/fixtures/groups.yml +6 -0
- data/test/fixtures/parties.yml +31 -0
- data/test/fixtures/periods.yml +2 -2
- data/test/fixtures/tasks.yml +2 -0
- data/test/fixtures/users.yml +6 -6
- data/test/functional/backlogs_controller_test.rb +1 -1
- data/test/functional/groups_controller_test.rb +120 -0
- data/test/functional/periods_controller_test.rb +1 -1
- data/test/functional/tasks_controller_test.rb +16 -1
- data/test/functional/user_controller_test.rb +8 -2
- data/test/test_helper.rb +5 -0
- data/test/unit/big_decimal_yaml_fix_test.rb +14 -0
- data/test/unit/estimate_test.rb +1 -1
- data/test/unit/group_test.rb +10 -0
- data/test/unit/user_test.rb +56 -44
- data/tmp/sessions/ruby_sess.22dec3e9df47fb4e +0 -0
- data/tmp/sessions/ruby_sess.8037e0ab58cbcf1a +0 -0
- data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +35 -0
- data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak +1 -0
- data/vendor/rails/{actionwebservice/lib/action_web_service/templates/scaffolds/layout.rhtml → railties/configs/empty.log} +0 -0
- metadata +36 -105
- data/backlog.gemspec +0 -21
- data/vendor/rails/actionwebservice/CHANGELOG +0 -265
- data/vendor/rails/actionwebservice/MIT-LICENSE +0 -21
- data/vendor/rails/actionwebservice/README +0 -364
- data/vendor/rails/actionwebservice/Rakefile +0 -171
- data/vendor/rails/actionwebservice/TODO +0 -32
- data/vendor/rails/actionwebservice/examples/googlesearch/README +0 -143
- data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_api.rb +0 -50
- data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_controller.rb +0 -57
- data/vendor/rails/actionwebservice/examples/googlesearch/delegated/google_search_service.rb +0 -108
- data/vendor/rails/actionwebservice/examples/googlesearch/delegated/search_controller.rb +0 -7
- data/vendor/rails/actionwebservice/examples/googlesearch/direct/google_search_api.rb +0 -50
- data/vendor/rails/actionwebservice/examples/googlesearch/direct/search_controller.rb +0 -58
- data/vendor/rails/actionwebservice/examples/metaWeblog/README +0 -17
- data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_api.rb +0 -60
- data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_service.rb +0 -34
- data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_api.rb +0 -67
- data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_service.rb +0 -48
- data/vendor/rails/actionwebservice/examples/metaWeblog/controllers/xmlrpc_controller.rb +0 -16
- data/vendor/rails/actionwebservice/install.rb +0 -30
- data/vendor/rails/actionwebservice/lib/action_web_service.rb +0 -66
- data/vendor/rails/actionwebservice/lib/action_web_service/api.rb +0 -301
- data/vendor/rails/actionwebservice/lib/action_web_service/base.rb +0 -42
- data/vendor/rails/actionwebservice/lib/action_web_service/casting.rb +0 -138
- data/vendor/rails/actionwebservice/lib/action_web_service/client.rb +0 -3
- data/vendor/rails/actionwebservice/lib/action_web_service/client/base.rb +0 -28
- data/vendor/rails/actionwebservice/lib/action_web_service/client/soap_client.rb +0 -113
- data/vendor/rails/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +0 -58
- data/vendor/rails/actionwebservice/lib/action_web_service/container.rb +0 -3
- data/vendor/rails/actionwebservice/lib/action_web_service/container/action_controller_container.rb +0 -93
- data/vendor/rails/actionwebservice/lib/action_web_service/container/delegated_container.rb +0 -86
- data/vendor/rails/actionwebservice/lib/action_web_service/container/direct_container.rb +0 -69
- data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher.rb +0 -2
- data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/abstract.rb +0 -207
- data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +0 -379
- data/vendor/rails/actionwebservice/lib/action_web_service/invocation.rb +0 -202
- data/vendor/rails/actionwebservice/lib/action_web_service/protocol.rb +0 -4
- data/vendor/rails/actionwebservice/lib/action_web_service/protocol/abstract.rb +0 -112
- data/vendor/rails/actionwebservice/lib/action_web_service/protocol/discovery.rb +0 -37
- data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol.rb +0 -176
- data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +0 -235
- data/vendor/rails/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +0 -122
- data/vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb +0 -283
- data/vendor/rails/actionwebservice/lib/action_web_service/struct.rb +0 -68
- data/vendor/rails/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb +0 -26
- data/vendor/rails/actionwebservice/lib/action_web_service/support/signature_types.rb +0 -226
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/layout.erb +0 -65
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.erb +0 -6
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.rhtml +0 -0
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.erb +0 -29
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.rhtml +0 -0
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.erb +0 -30
- data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.rhtml +0 -0
- data/vendor/rails/actionwebservice/lib/action_web_service/test_invoke.rb +0 -110
- data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +0 -9
- data/vendor/rails/actionwebservice/setup.rb +0 -1379
- data/vendor/rails/actionwebservice/test/abstract_client.rb +0 -183
- data/vendor/rails/actionwebservice/test/abstract_dispatcher.rb +0 -551
- data/vendor/rails/actionwebservice/test/abstract_unit.rb +0 -45
- data/vendor/rails/actionwebservice/test/api_test.rb +0 -102
- data/vendor/rails/actionwebservice/test/apis/auto_load_api.rb +0 -3
- data/vendor/rails/actionwebservice/test/apis/broken_auto_load_api.rb +0 -2
- data/vendor/rails/actionwebservice/test/base_test.rb +0 -42
- data/vendor/rails/actionwebservice/test/casting_test.rb +0 -86
- data/vendor/rails/actionwebservice/test/client_soap_test.rb +0 -153
- data/vendor/rails/actionwebservice/test/client_xmlrpc_test.rb +0 -152
- data/vendor/rails/actionwebservice/test/container_test.rb +0 -73
- data/vendor/rails/actionwebservice/test/dispatcher_action_controller_soap_test.rb +0 -137
- data/vendor/rails/actionwebservice/test/dispatcher_action_controller_xmlrpc_test.rb +0 -59
- data/vendor/rails/actionwebservice/test/fixtures/db_definitions/mysql.sql +0 -8
- data/vendor/rails/actionwebservice/test/fixtures/users.yml +0 -12
- data/vendor/rails/actionwebservice/test/gencov +0 -3
- data/vendor/rails/actionwebservice/test/invocation_test.rb +0 -185
- data/vendor/rails/actionwebservice/test/run +0 -6
- data/vendor/rails/actionwebservice/test/scaffolded_controller_test.rb +0 -146
- data/vendor/rails/actionwebservice/test/struct_test.rb +0 -52
- data/vendor/rails/actionwebservice/test/test_invoke_test.rb +0 -112
data/History.txt
CHANGED
@@ -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.
|
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
|
-
|
117
|
-
|
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
|
-
|
120
|
-
"<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 <<
|
125
|
-
|
126
|
-
|
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[:
|
21
|
-
@selected_task = Task.find(params[:
|
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[:
|
46
|
-
@period.
|
47
|
-
previous = @period.
|
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
|
-
@
|
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.
|
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{
|
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.
|
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
|
-
|
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.
|
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] == '
|
19
|
-
detour_to :controller => 'periods', :action => :new, :
|
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, :
|
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.
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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(
|
7
|
+
def image_button_to(image_source, title, options)
|
8
8
|
html = ''
|
9
|
-
html += image_submit_tag
|
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
|