backlog 0.15.1 → 0.16.0
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.
- data/History.txt +16 -0
- data/app/controllers/backlogs_controller.rb +2 -2
- data/app/controllers/estimates_controller.rb +3 -4
- data/app/controllers/periods_controller.rb +14 -2
- data/app/controllers/tasks_controller.rb +6 -1
- data/app/controllers/user_controller.rb +10 -10
- data/app/helpers/application_helper.rb +3 -2
- data/app/helpers/user_helper.rb +4 -4
- data/app/views/layouts/_headers.rhtml +1 -0
- data/app/views/layouts/_notice.rhtml +1 -4
- data/app/views/periods/_show_active.rhtml +8 -6
- data/app/views/periods/show.rhtml +38 -0
- data/app/views/tasks/_backlog_header.rhtml +7 -7
- data/app/views/tasks/_completed.rhtml +3 -3
- data/app/views/tasks/_fields_header.rhtml +9 -9
- data/app/views/tasks/_form.rhtml +16 -6
- data/app/views/tasks/_task.rhtml +56 -60
- data/app/views/tasks/edit.rhtml +67 -1
- data/app/views/tasks/notes.rhtml +6 -2
- data/bin/backlog +63 -1
- data/db/migrate/025_add_simple_auditing_of_tasks.rb +11 -0
- data/db/schema.rb +5 -1
- data/lib/url_for_fix.rb +5 -5
- data/public/applets/bsf.jar +0 -0
- data/public/applets/jruby.jar +0 -0
- data/public/javascripts/ruby.js +46 -0
- data/test/functional/user_controller_test.rb +5 -5
- data/vendor/plugins/foreign_key_migrations/CHANGELOG +36 -0
- data/vendor/plugins/foreign_key_migrations/README +27 -0
- data/vendor/plugins/foreign_key_migrations/about.yml +5 -0
- data/vendor/plugins/foreign_key_migrations/init.rb +1 -2
- data/vendor/plugins/foreign_key_migrations/lib/foreign_key_migrations.rb +3 -0
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/base.rb +22 -0
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/abstract_adapter.rb +22 -0
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb +28 -0
- metadata +99 -80
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations.rb +0 -57
data/History.txt
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
== 0.16.0 2007-12-26
|
2
|
+
|
3
|
+
=== Features
|
4
|
+
|
5
|
+
* Added displaying of task id in task edit form.
|
6
|
+
* Added displaying of task id and description in task full screen view.
|
7
|
+
* Added more notice messages on small updates, for better responsiveness.
|
8
|
+
* Added display of total hours done to Show Task view.
|
9
|
+
* Added action buttons to Show Task view
|
10
|
+
* Improved control script to delete stale PID file at startup and give better status info.
|
11
|
+
* Simple auditing of tasks. Who created the task, and who updated it last.
|
12
|
+
|
13
|
+
=== Fixes
|
14
|
+
|
15
|
+
* Fixed error in some URL generations that led to strange navigation.
|
16
|
+
|
1
17
|
== 0.15.1 2007-11-29
|
2
18
|
|
3
19
|
=== Features
|
@@ -90,9 +90,9 @@ class BacklogsController < ApplicationController
|
|
90
90
|
Float(params[:estimate][:todo])
|
91
91
|
@task.estimate(params[:estimate][:todo])
|
92
92
|
@period = @task.period
|
93
|
-
@success,
|
93
|
+
@success, flash[:notice] = true, 'Estimate updated'
|
94
94
|
rescue ArgumentError => e
|
95
|
-
@success,
|
95
|
+
@success, flash[:notice] = false, "Estimate was not numeric"
|
96
96
|
end
|
97
97
|
if @task.finished?
|
98
98
|
load_tasks(@task.period)
|
@@ -4,21 +4,20 @@ class EstimatesController < ApplicationController
|
|
4
4
|
verify :method => :post, :redirect_to => ''
|
5
5
|
|
6
6
|
def create
|
7
|
-
@success,
|
7
|
+
@success, flash[:notice] = do_create
|
8
8
|
|
9
9
|
unless @success
|
10
|
-
@task.errors.add :estimate,
|
10
|
+
@task.errors.add :estimate, flash[:notice]
|
11
11
|
render :file => "public/500.html", :layout => true, :status => 500
|
12
12
|
return
|
13
13
|
end
|
14
14
|
|
15
|
-
flash[:notice] = @message
|
16
15
|
redirect_to :controller => 'periods', :action => :show, :id => @task.root_task.period, :task_id => @task.id
|
17
16
|
end
|
18
17
|
|
19
18
|
def create_ajax
|
20
19
|
@task = Task.find_by_id(params[:id])
|
21
|
-
@success,
|
20
|
+
@success, flash[:notice] = do_create
|
22
21
|
if @task.finished?
|
23
22
|
render :template => '/tasks/finish', :layout => false
|
24
23
|
end
|
@@ -175,9 +175,9 @@ class PeriodsController < ApplicationController
|
|
175
175
|
Float(params[:estimate][:todo])
|
176
176
|
@task.estimate(params[:estimate][:todo])
|
177
177
|
@period = @task.period
|
178
|
-
@success,
|
178
|
+
@success, flash[:notice] = true, 'Estimate updated'
|
179
179
|
rescue ArgumentError => e
|
180
|
-
@success,
|
180
|
+
@success, flash[:notice] = false, "Estimate was not numeric"
|
181
181
|
end
|
182
182
|
if @task.finished?
|
183
183
|
load_tasks(@task.period)
|
@@ -194,6 +194,18 @@ class PeriodsController < ApplicationController
|
|
194
194
|
end
|
195
195
|
end
|
196
196
|
|
197
|
+
# def order
|
198
|
+
# params.keys.find {|k| k =~ /active_tasks_(.*)/}
|
199
|
+
# period_id = $1
|
200
|
+
# tasks = params["active_tasks_#{period_id}"].select {|id| not id.empty?}
|
201
|
+
# tasks.each_with_index do |id,idx|
|
202
|
+
# task = Task.find(id)
|
203
|
+
# task.insert_at(idx + 1)
|
204
|
+
# task.save!
|
205
|
+
# end
|
206
|
+
# render :text => 'Updated sort order'
|
207
|
+
# end
|
208
|
+
|
197
209
|
private
|
198
210
|
|
199
211
|
def send_burn_down_chart(size)
|
@@ -127,7 +127,7 @@ class TasksController < ApplicationController
|
|
127
127
|
render :action => 'edit'
|
128
128
|
end
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
def update_task_estimate
|
132
132
|
update
|
133
133
|
end
|
@@ -194,6 +194,11 @@ class TasksController < ApplicationController
|
|
194
194
|
redirect_to :controller => 'periods', :action => :show_no_layout, :id => task.period_id, :task => task.id
|
195
195
|
end
|
196
196
|
|
197
|
+
# def order
|
198
|
+
# params[:list].each_with_index { |id,idx| Model.update(id, :position => idx) }
|
199
|
+
# render :text => 'Updated sort order'
|
200
|
+
# end
|
201
|
+
|
197
202
|
def start_work
|
198
203
|
@task = Task.find(params[:id])
|
199
204
|
@task.start_work
|
@@ -8,7 +8,7 @@ class UserController < ApplicationController
|
|
8
8
|
user = User.authenticate(params['user']['login'], params['user']['password'])
|
9
9
|
if user
|
10
10
|
self.current_user = user
|
11
|
-
flash[
|
11
|
+
flash[:notice] = 'Login succeeded'
|
12
12
|
if remember_me && remember_me == '1'
|
13
13
|
user.generate_security_token
|
14
14
|
cookies[:autologin] = {:value => user.id.to_s, :expires =>90.days.from_now}
|
@@ -17,7 +17,7 @@ class UserController < ApplicationController
|
|
17
17
|
back_or_redirect_to :controller => 'backlogs', :action => :index
|
18
18
|
else
|
19
19
|
@login = params['user']['login']
|
20
|
-
flash[
|
20
|
+
flash[:notice] = 'Login failed'
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -33,13 +33,13 @@ class UserController < ApplicationController
|
|
33
33
|
url = url_for(:action => 'welcome')
|
34
34
|
url += "?user[id]=#{@user.id}&key=#{key}"
|
35
35
|
UserNotify.deliver_signup(@user, params['user']['password'], url)
|
36
|
-
flash[
|
36
|
+
flash[:notice] = 'Signup successful! Please check your registered email account to verify your account registration and continue with the login.'
|
37
37
|
redirect_to :action => 'login'
|
38
38
|
end
|
39
39
|
end
|
40
40
|
rescue Exception => ex
|
41
41
|
report_exception ex
|
42
|
-
flash[
|
42
|
+
flash[:notice] = 'Error creating account: confirmation email not sent'
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -58,7 +58,7 @@ class UserController < ApplicationController
|
|
58
58
|
@user.save!
|
59
59
|
rescue Exception => ex
|
60
60
|
report_exception ex
|
61
|
-
flash.now[
|
61
|
+
flash.now[:notice] = 'Your password could not be changed at this time. Please retry.'
|
62
62
|
render and return
|
63
63
|
end
|
64
64
|
begin
|
@@ -71,7 +71,7 @@ class UserController < ApplicationController
|
|
71
71
|
|
72
72
|
def forgot_password
|
73
73
|
if authenticated_user?
|
74
|
-
flash[
|
74
|
+
flash[:notice] = 'You are currently logged in. You may change your password now.'
|
75
75
|
redirect_to :action => 'change_password'
|
76
76
|
return
|
77
77
|
end
|
@@ -79,9 +79,9 @@ class UserController < ApplicationController
|
|
79
79
|
return if generate_blank_form
|
80
80
|
|
81
81
|
if params['user']['email'].empty?
|
82
|
-
flash.now[
|
82
|
+
flash.now[:notice] = 'Please enter a valid email address.'
|
83
83
|
elsif (user = User.find_by_email(params['user']['email'])).nil?
|
84
|
-
flash.now[
|
84
|
+
flash.now[:notice] = "We could not find a user with the email address #{CGI.escapeHTML(params['user']['email'])}"
|
85
85
|
else
|
86
86
|
begin
|
87
87
|
User.transaction do
|
@@ -98,7 +98,7 @@ class UserController < ApplicationController
|
|
98
98
|
end
|
99
99
|
rescue Exception => ex
|
100
100
|
report_exception ex
|
101
|
-
flash.now[
|
101
|
+
flash.now[:notice] = "Your password could not be emailed to #{CGI.escapeHTML(params['user']['email'])}"
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
@@ -134,7 +134,7 @@ class UserController < ApplicationController
|
|
134
134
|
@user.update_attribute( :deleted, true )
|
135
135
|
logout
|
136
136
|
rescue Exception => ex
|
137
|
-
flash.now[
|
137
|
+
flash.now[:notice] = "Error: #{@ex}."
|
138
138
|
redirect_back_or_default :action => 'welcome'
|
139
139
|
end
|
140
140
|
end
|
@@ -86,9 +86,10 @@ module ApplicationHelper
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def display_notice(page)
|
89
|
-
if
|
90
|
-
page.replace_html :notice,
|
89
|
+
if flash[:notice]
|
90
|
+
page.replace_html :notice, flash[:notice]
|
91
91
|
page.visual_effect(:appear, :notice)
|
92
|
+
flash.discard
|
92
93
|
else
|
93
94
|
page.visual_effect(:fade, :notice)
|
94
95
|
end
|
data/app/helpers/user_helper.rb
CHANGED
@@ -15,12 +15,12 @@ module UserHelper
|
|
15
15
|
opts = DEFAULT_HEAD_OPTIONS.dup
|
16
16
|
opts.update(options.symbolize_keys)
|
17
17
|
s = "<h3>#{label}</h3>"
|
18
|
-
if flash[
|
19
|
-
notice = "<div><p>#{flash[
|
18
|
+
if flash[:notice] and not opts[:notice].nil? and opts[:notice]
|
19
|
+
notice = "<div><p>#{flash[:notice]}</p></div>"
|
20
20
|
s = s + notice
|
21
21
|
end
|
22
|
-
if flash[
|
23
|
-
message = "<div id=\"ErrorExplanation\"><p>#{flash[
|
22
|
+
if flash[:notice] and not opts[:message].nil? and opts[:message]
|
23
|
+
message = "<div id=\"ErrorExplanation\"><p>#{flash[:notice]}</p></div>"
|
24
24
|
s = s + message
|
25
25
|
end
|
26
26
|
if not opts[:error].nil? and opts[:error]
|
@@ -1,9 +1,6 @@
|
|
1
1
|
<div id="notice">
|
2
|
-
<% if flash[:notice]
|
2
|
+
<% if flash[:notice] %>
|
3
3
|
<%=flash[:notice]%>
|
4
|
-
<%=flash['notice']%>
|
5
|
-
<%=flash[:message]%>
|
6
|
-
<%=flash['message']%>
|
7
4
|
<%=javascript_tag update_page {|page|
|
8
5
|
page.show 'notice'
|
9
6
|
} %>
|
@@ -36,17 +36,19 @@ function handleEvent(field, event, id) {
|
|
36
36
|
<% current_backlog = nil -%>
|
37
37
|
<% for task in @tasks -%>
|
38
38
|
<% if task.backlog != current_backlog -%>
|
39
|
-
<%=
|
39
|
+
<%=sortable_element "active_tasks_#{current_backlog.id}", :url => { :action => :order } if current_backlog%>
|
40
|
+
<%='</ul>' if current_backlog%>
|
40
41
|
<% current_backlog = task.backlog %>
|
41
|
-
<
|
42
|
-
<%= '<
|
42
|
+
<ul id="active_tasks_<%=current_backlog.id%>" class="input" style="width: 95%; list-style-type: none">
|
43
|
+
<%= '<li><span> </span></li>' if false && current_backlog %>
|
43
44
|
<%=render :partial => '/tasks/backlog_header', :locals => { :backlog => task.backlog, :track_times => current_backlog.track_done? && @tasks.find {|t|t.period && t.period.active?} } %>
|
44
45
|
<%=render :partial => '/tasks/fields_header', :locals => { :backlog => task.backlog, :active => true, :track_times => @tasks.find {|t|t.period && t.period.active?}, :work_done => @tasks.find {|t|t.backlog_id == current_backlog.id && t.total_done > 0} } %>
|
45
46
|
<% end -%>
|
46
47
|
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => true, :highlight_task => task == @selected_task, :update => :spotlight, :hidden => false } %>
|
47
48
|
<% i += 1 %>
|
48
49
|
<% end -%>
|
49
|
-
<%=
|
50
|
+
<%=sortable_element "active_tasks_#{current_backlog.id}", :url => { :action => :order } if current_backlog%>
|
51
|
+
<%='</ul>' if current_backlog%>
|
50
52
|
</div>
|
51
53
|
|
52
54
|
<p id="no_tasks_message"<%=' style="display: none;"' if @tasks and not @tasks.empty?%>><%=l :no_pending_tasks%></p>
|
@@ -56,7 +58,7 @@ function handleEvent(field, event, id) {
|
|
56
58
|
|
57
59
|
<script type="text/JavaScript">
|
58
60
|
<% if @selected_task && @selected_task.active?%>
|
59
|
-
document.getElementById('task_<%=@selected_task.id%>
|
60
|
-
//document.getElementById('task_<%=@selected_task.id%>
|
61
|
+
document.getElementById('task_<%=@selected_task.id%>').focus();
|
62
|
+
//document.getElementById('task_<%=@selected_task.id%>').select();
|
61
63
|
<% end %>
|
62
64
|
</script>
|
@@ -13,3 +13,41 @@
|
|
13
13
|
|
14
14
|
<%=render :partial => '/tasks/completed', :locals => {:i => i} %>
|
15
15
|
</div>
|
16
|
+
|
17
|
+
<script type="text/javascript">
|
18
|
+
//alert(Ruby.eval(Ruby.code()));
|
19
|
+
</script>
|
20
|
+
|
21
|
+
<script type="text/x-ruby">
|
22
|
+
begin
|
23
|
+
require 'java'
|
24
|
+
JSObject = netscape.javascript.JSObject
|
25
|
+
s = "ho"
|
26
|
+
rescue Exception => e
|
27
|
+
s = e
|
28
|
+
end
|
29
|
+
s
|
30
|
+
#win = JSObject.getWindow(this)
|
31
|
+
#doc = win.getMember("document")
|
32
|
+
#loc = doc.getMember("location")
|
33
|
+
|
34
|
+
#s = loc.getMember("href")
|
35
|
+
#win.call("f", null)
|
36
|
+
</script>
|
37
|
+
|
38
|
+
<script type="text/javascript">
|
39
|
+
function showRuby() {
|
40
|
+
alert(Ruby.code());
|
41
|
+
}
|
42
|
+
|
43
|
+
function echoRuby(ruby) {
|
44
|
+
alert(Ruby.eval(ruby));
|
45
|
+
}
|
46
|
+
|
47
|
+
window.onload = function() {
|
48
|
+
Ruby.init(function(result) {
|
49
|
+
alert(result);
|
50
|
+
});
|
51
|
+
}
|
52
|
+
|
53
|
+
</script>
|
@@ -1,14 +1,14 @@
|
|
1
1
|
<% @backlog = backlog %>
|
2
2
|
|
3
|
-
<
|
4
|
-
<
|
3
|
+
<li valign="top">
|
4
|
+
<span>
|
5
5
|
<%=image_detour_to('add.png', l(:new_task), :controller => 'tasks', :action => :new, :task => {:backlog_id => @backlog.id, :period_id => @period && @period.id})%>
|
6
|
-
</
|
7
|
-
<
|
6
|
+
</span>
|
7
|
+
<span colspan="4" style="vertical-align: middle">
|
8
8
|
<h5>
|
9
9
|
<%=detour_to(h(backlog.name), :controller => 'backlogs', :action => :show, :id => @backlog) %>
|
10
10
|
<%=image_detour_to('clipboard.png', l(:edit), :controller => 'backlogs', :action => :edit, :id => @backlog.id)%>
|
11
11
|
</h5>
|
12
|
-
</
|
13
|
-
<
|
14
|
-
</
|
12
|
+
</span>
|
13
|
+
<span width="*"/>
|
14
|
+
</li>
|
@@ -1,6 +1,6 @@
|
|
1
|
-
<div id="completed_tasks">
|
1
|
+
<div id="completed_tasks" style="margin: 0px; border: 0px; padding: 0px">
|
2
2
|
<% @completed_tasks.map {|t| t.period}.uniq.each do |period| %>
|
3
|
-
<
|
3
|
+
<ul id="completed_tasks_<%=period ? period.id : ''%>" class="input" style="width: 100%; list-style-type: none; margin: 0px; border: 0px; padding: 0px">
|
4
4
|
<% tasks_in_period = @completed_tasks.select {|t| t.period == period} %>
|
5
5
|
<% work_done = !tasks_in_period.find{|t| t.total_done != 0}.nil? %>
|
6
6
|
<%=render :partial => '/tasks/period_header', :locals => {:period => period} unless @completed_tasks.map(&:period).uniq.size == 1 %>
|
@@ -9,6 +9,6 @@
|
|
9
9
|
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => false, :highlight_task => task == @selected_task, :hidden => false } %>
|
10
10
|
<% i += 1 %>
|
11
11
|
<% end %>
|
12
|
-
</
|
12
|
+
</ul>
|
13
13
|
<% end %>
|
14
14
|
</div>
|
@@ -1,9 +1,9 @@
|
|
1
|
-
<
|
2
|
-
<
|
3
|
-
<
|
4
|
-
<
|
5
|
-
<
|
6
|
-
<
|
7
|
-
<
|
8
|
-
<
|
9
|
-
</
|
1
|
+
<li>
|
2
|
+
<span/>
|
3
|
+
<span align="center"><%=active ? '#' : l(:resolution_abr)%></span>
|
4
|
+
<span><%=l :task %></span>
|
5
|
+
<span><%=l :start if active && backlog.track_times? %></span>
|
6
|
+
<span/>
|
7
|
+
<span><%=l :done if (active && backlog.track_done?) || work_done %></span>
|
8
|
+
<span width="*"><%=l :todo if active && backlog.track_todo? %></span>
|
9
|
+
</li>
|
data/app/views/tasks/_form.rhtml
CHANGED
@@ -29,12 +29,13 @@
|
|
29
29
|
|
30
30
|
<% if @task.backlog %>
|
31
31
|
|
32
|
-
<p><label for="task_description"><%=l :task%></label><br/>
|
32
|
+
<p><label for="task_description"><%=l :task%> #<%=@task.id%></label><br/>
|
33
33
|
<% if @task.active? -%>
|
34
|
-
<%=text_field 'task', 'description', :size => 64, :maxlength => 80
|
34
|
+
<%=text_field 'task', 'description', :size => 64, :maxlength => 80 %>
|
35
35
|
<% else -%>
|
36
36
|
<%=@task.description -%>
|
37
37
|
<% end -%>
|
38
|
+
</p>
|
38
39
|
|
39
40
|
<% if @task.enable_customer? %>
|
40
41
|
<p><label for="task_customer"><%=l :customer%></label><br/>
|
@@ -48,14 +49,23 @@
|
|
48
49
|
|
49
50
|
<% if @task.track_todo? %>
|
50
51
|
<% if @task.new_record? %>
|
51
|
-
<p><label for="task_initial_estimate"><%=l :estimate%></label><br/>
|
52
|
-
<%= text_field 'task', 'initial_estimate', :size => 4
|
52
|
+
<p><label for="task_initial_estimate"><%=l :estimate%></label><br/>
|
53
|
+
<%= text_field 'task', 'initial_estimate', :size => 4 %>
|
54
|
+
</p>
|
53
55
|
<% else %>
|
54
|
-
<p><label for="estimate_todo"><%=l :estimate%></label><br/>
|
55
|
-
<%=
|
56
|
+
<p style="float: left"><label for="estimate_todo"><%=l :estimate%></label><br/>
|
57
|
+
<%=text_field 'estimate', 'todo', :size => 4, :value => @task.todo %>
|
58
|
+
</p>
|
56
59
|
<% end %>
|
57
60
|
<% end %>
|
58
61
|
|
62
|
+
<% if @task.total_done != 0 -%>
|
63
|
+
<p style="float: left"><%=l :done%></label><br/>
|
64
|
+
<%=t @task.total_done%>
|
65
|
+
</p>
|
66
|
+
<% end %>
|
67
|
+
<br clear="all" />
|
68
|
+
|
59
69
|
<p><label for="task_notes"><%=l :notes%></label><br/>
|
60
70
|
<%=text_area 'task', 'notes', :cols => '72', :rows => 16 %>
|
61
71
|
<%=if @task.notes and not @task.notes.empty? then image_link_to 'view_fullscreen.png', l(:view_fullscreen), :controller => 'tasks', :action => :notes, :id => @task end%>
|
data/app/views/tasks/_task.rhtml
CHANGED
@@ -1,65 +1,70 @@
|
|
1
1
|
<% @task = task %>
|
2
|
-
<
|
3
|
-
<
|
2
|
+
<li id="task_<%=@task.id%>" style="border: 0px; margin: 0px"<%=' class="tasks" onmouseover="this.style.border=\'1px solid black\'" onmouseout="this.style.border=\'1px solid transparent\'"' if active && (@task.period.nil? || @task.period.active_or_future?) && (not @task.work_started?) %><%=' class="highlight"' if highlight_task %><%=' style="display: none"' if hidden %>>
|
3
|
+
<div style="float: left" style="border: 0px">
|
4
4
|
<% if @task.enable_subtasks? && active && (@task.period.nil? || @task.period.active_or_future?) %>
|
5
5
|
<% form_tag({:controller => 'tasks', :action => :specify, :id => @task}) do %>
|
6
6
|
<%= image_button_to('add.png', l(:specify), :controller => 'tasks', :action => :specify, :id => @task.id)%>
|
7
7
|
<% end %>
|
8
8
|
<% end %>
|
9
|
-
</
|
10
|
-
<
|
11
|
-
<%=
|
12
|
-
|
13
|
-
<%=
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
</div>
|
10
|
+
<div style="float: left" style="border: 0px">
|
11
|
+
<%=(" " * @task.depth * 4) if @task.depth > 0 %>
|
12
|
+
<%=resolution_image(@task.resolution) if @task.finished_at %>
|
13
|
+
<%="-" if @task.children.size > 0 %>
|
14
|
+
</div>
|
15
|
+
<div id="task_<%=@task.id%>_id" style="float: left; padding: 2px">
|
16
|
+
<%=@task.id %>
|
17
|
+
</div>
|
18
|
+
<div id="task_<%=@task.id%>_description" style="float: left">
|
19
|
+
<%=detour_to h(@task.description), :controller => 'tasks', :action => :edit, :id => @task.id, :style => 'border: 0px; margin: 0px; padding: 0px' if @task.position || @task.depth == 0 %>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
<div style="float: right" style="border: 1px solid black">
|
25
|
+
<div style="float: left" style="border: 1px solid black">
|
22
26
|
<% if active && @task.loggable? -%>
|
23
|
-
<% remote_form_for(:work, :url => {:controller => 'works', :action => 'update_time', :id => @task.started_work}) do |f| %>
|
24
|
-
<%=submit_tag('checkmark', :value => l(:save), :style => 'display: none')%>
|
25
27
|
<% if @task.work_started? -%>
|
26
|
-
|
27
|
-
|
28
|
+
<% remote_form_for(:work, :url => {:controller => 'works', :action => 'update_time', :id => @task.started_work}) do |f| %>
|
29
|
+
<%=submit_tag('checkmark', :value => l(:save), :style => 'display: none')%>
|
30
|
+
<%=f.text_field 'started_at_time', :id => "work_#{@task.started_work.id}_started_at_time", :tabindex => i+1, :value => @task.started_work.started_at.strftime('%H:%M'),
|
31
|
+
:class => :task_time, :maxlength => 5 %>
|
32
|
+
<% end %>
|
28
33
|
<% elsif @task.track_times? && (@task.period_id.nil? || @task.period.active?) %>
|
29
34
|
<%=image_link_to_remote 'hammer.png', l(:start_work), {:controller => 'tasks', :action => :start_work, :id => @task.id}, nil, true %>
|
30
35
|
<% end -%>
|
31
|
-
<% end %>
|
32
36
|
<% end -%>
|
33
|
-
</
|
34
|
-
<
|
37
|
+
</div>
|
38
|
+
<div style="float: left" style="border: 1px solid black">
|
35
39
|
<% if active && @task.loggable? && @task.work_started? -%>
|
36
40
|
<% form_tag({:controller => 'works', :action => 'update', :id => @task.started_work}) do %>
|
37
41
|
<%= image_detour_to('ernes_stop.png', l(:end_work), {:controller => 'tasks', :action => :end_work, :id => @task.id}, nil, true) %>
|
38
42
|
<% end -%>
|
39
43
|
<% end -%>
|
40
|
-
</
|
41
|
-
<
|
44
|
+
</div>
|
45
|
+
<div style="float: left" style="border: 1px solid black" align="<%=active && @task.loggable? && @task.track_done? ? 'left' : 'right'%>">
|
42
46
|
<% if @task.track_done? || @task.total_done != 0 %>
|
43
47
|
<% if @task.loggable? || @task.finished_at -%>
|
44
|
-
<% form_tag({:controller => 'works', :action => (@task.work_started? ? :edit : :create), :id => @task.started_work}) do %>
|
45
|
-
<%=hidden_field('work', 'task_id', :value => @task.id)%>
|
46
|
-
<%=submit_tag('checkmark', :value => l(:save), :style => 'display: none')%>
|
47
48
|
<% unless !@task.track_done? || @task.track_times? || @task.work_started? || @task.finished_at -%>
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
<% form_tag({:controller => 'works', :action => (@task.work_started? ? :edit : :create), :id => @task.started_work}) do %>
|
50
|
+
<%=hidden_field('work', 'task_id', :value => @task.id)%>
|
51
|
+
<%=submit_tag('checkmark', :value => l(:save), :style => 'display: none')%>
|
52
|
+
<%=text_field 'work', 'hours', :tabindex => i+1, :id => "#{@task.id}_done",
|
53
|
+
:class => :task_hours, :maxlength => 4,
|
54
|
+
:ondblclick => "form.elements[1].style.display = 'inline';this.style.display = 'none'" -%>
|
55
|
+
<% end -%>
|
51
56
|
<% end -%>
|
52
57
|
<%=t @task.total_done if @task.total_done != 0%>
|
53
|
-
<% end -%>
|
54
58
|
<% end -%>
|
55
59
|
<% end -%>
|
56
|
-
</
|
57
|
-
<
|
60
|
+
</div>
|
61
|
+
<div style="float: left" style="border: 1px solid black">
|
58
62
|
<% if active && @task.loggable? -%>
|
59
|
-
<% remote_form_for(:estimate, :url => {:action => :update_task_estimate, :id => @task}) do |f| -%>
|
60
63
|
<% if @task.track_todo? -%>
|
61
64
|
<% if @task.period.nil? || @task.period.active_or_future? -%>
|
62
|
-
|
65
|
+
<% form_for(:estimate, :url => {:action => :update_task_estimate, :id => @task}) do |f| -%>
|
66
|
+
<%=f.text_field :todo, :tabindex => i+2, :id => "task_#{@task.id}_todo", :value => @task.todo, :class => :task_hours, :maxlength => 4 %>
|
67
|
+
<% end -%>
|
63
68
|
<% else -%>
|
64
69
|
<%=@task.todo %>
|
65
70
|
<% end -%>
|
@@ -67,36 +72,27 @@
|
|
67
72
|
<% if (not @task.track_times?) && !@task.work_started? && (@task.period.nil? || @task.period.active?) %>
|
68
73
|
<%=image_link_to_remote('checkmark.png', l(:complete), {:action => :finish_task, :id => @task}, nil, true)%>
|
69
74
|
<% end -%>
|
70
|
-
<% end -%>
|
71
75
|
<% end -%>
|
72
|
-
</
|
73
|
-
<
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
76
|
+
</div>
|
77
|
+
<div style="float: left" align="right" style="border: 1px solid black">
|
78
|
+
<% if @task.active? -%>
|
79
|
+
<% if @task.loggable? -%>
|
80
|
+
<% unless @task.work_started? -%>
|
81
|
+
<%# form_tag({:controller => 'tasks', :action => 'update', :id => @task}) do -%>
|
78
82
|
<%=image_link_to_remote('arrow_right.png', l(:move_to_next_period), {:action => :move_task_to_next_period, :id => @task}, nil, true) if @task.backlog.enable_periods? || @task.period_id%>
|
79
83
|
<%=image_link_to_remote('ernes_stop.png', l(:abort), {:action => :abort_task, :id => @task}, nil, true)%>
|
80
|
-
|
81
|
-
|
82
|
-
|
84
|
+
<%# end -%>
|
85
|
+
<% end -%>
|
86
|
+
<% end -%>
|
87
|
+
<% elsif (@task.period.nil? || (not @task.period.passed?)) && @task.leaf? -%>
|
88
|
+
<% form_tag({:controller => 'tasks', :action => 'update', :id => @task}) do -%>
|
83
89
|
<%=image_link_to_remote('eraser.png', l(:reopen), {:action => :reopen_task, :id => @task}, nil, true) %>
|
84
|
-
<% end -%>
|
85
90
|
<% end -%>
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
<%=drop_receiving_element "task_#{@task.id}_description",
|
92
|
-
:update => update,
|
93
|
-
:url => with_detour({:controller => 'tasks', :action => "move_to", :target_id => @task.id, :layout => false}),
|
94
|
-
:accept => "tasks",
|
95
|
-
:loading => "",
|
96
|
-
:complete => "",
|
97
|
-
:hoverclass => 'dropzone-hover'
|
98
|
-
%>
|
99
|
-
<% end %>
|
91
|
+
<% end -%>
|
92
|
+
</div>
|
93
|
+
</div>
|
94
|
+
<br clear="all" />
|
95
|
+
</li>
|
100
96
|
|
101
97
|
<% for subtask in task.children %>
|
102
98
|
<%=render :partial => '/tasks/task', :locals => { :task => subtask, :i => i, :active => active, :highlight_task => subtask == @selected_task, :update => update } if (active && subtask.active?) || (!active && subtask.completed?) %>
|