backlog 0.11.0 → 0.12.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 +17 -1
- data/app/controllers/estimates_controller.rb +36 -9
- data/app/controllers/tasks_controller.rb +19 -6
- data/app/controllers/work_accounts_controller.rb +1 -1
- data/app/helpers/application_helper.rb +6 -0
- data/app/models/task.rb +5 -0
- data/app/views/backlogs/_form.rhtml +5 -6
- data/app/views/backlogs/_tasks.rhtml +1 -1
- data/app/views/backlogs/edit.rhtml +3 -3
- data/app/views/estimates/create_ajax.rjs +11 -0
- data/app/views/periods/_burn_down_chart.rhtml +1 -1
- data/app/views/periods/_show_active.rhtml +8 -8
- data/app/views/tasks/_completed.rhtml +2 -2
- data/app/views/tasks/_task.rhtml +13 -14
- data/app/views/tasks/finish_ajax.rjs +25 -0
- data/app/views/tasks/reopen.rjs +26 -0
- data/app/views/tasks/start_work.rjs +2 -0
- data/app/views/work_accounts/_form.rhtml +5 -0
- data/app/views/work_accounts/edit.rhtml +10 -5
- data/public/images/work_account.png +0 -0
- data/test/functional/backlogs_controller_test.rb +1 -1
- data/test/functional/work_accounts_controller_test.rb +1 -1
- data/test/test_helper.rb +2 -0
- data/vendor/plugins/transactional_migrations/CHANGELOG +9 -0
- data/vendor/plugins/transactional_migrations/MIT-LICENSE +20 -0
- data/vendor/plugins/transactional_migrations/README +15 -0
- data/vendor/plugins/transactional_migrations/about.yml +5 -0
- data/vendor/plugins/transactional_migrations/init.rb +1 -0
- data/vendor/plugins/transactional_migrations/lib/red_hill_consulting/transactional_migrations/active_record/migration.rb +19 -0
- metadata +18 -2
data/History.txt
CHANGED
@@ -1,4 +1,20 @@
|
|
1
|
-
== 0.
|
1
|
+
== 0.12.0 2007-11-06
|
2
|
+
|
3
|
+
===Features
|
4
|
+
|
5
|
+
* Changed to use AJAX for small updates of tasks in the sprint view.
|
6
|
+
This to speed up the user experience.
|
7
|
+
Known bug: The position numbers are not updated yet.
|
8
|
+
* Added Transactional Migrations plugin to avoid partial migrations.
|
9
|
+
|
10
|
+
=== Fixes
|
11
|
+
|
12
|
+
* Changed to return from detour to work account edit view
|
13
|
+
* Moved editing of "Track Times" option from Backlog to Work Account
|
14
|
+
* Added link from backlog to corresponding work account.
|
15
|
+
* Made Edit Work Account view fit with layout.
|
16
|
+
|
17
|
+
== 0.11.0 2007-11-03
|
2
18
|
|
3
19
|
===Features
|
4
20
|
|
@@ -2,27 +2,54 @@ class EstimatesController < ApplicationController
|
|
2
2
|
verify :method => :post, :redirect_to => ''
|
3
3
|
|
4
4
|
def create
|
5
|
+
@success, @message = do_create
|
6
|
+
|
7
|
+
unless @success
|
8
|
+
@task.errors.add :estimate, @message
|
9
|
+
render :file => "public/500.html", :layout => true, :status => 500
|
10
|
+
return
|
11
|
+
end
|
12
|
+
|
13
|
+
flash[:notice] = @message
|
14
|
+
redirect_to :controller => 'periods', :action => :show, :id => @task.root_task.period, :task_id => @task.id
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_ajax
|
18
|
+
if @task = Task.find_by_id(params[:id])
|
19
|
+
@last_active = @task.lower_item.nil?
|
20
|
+
@last_active_in_backlog = @last_active || @task.lower_item.backlog != @task.backlog
|
21
|
+
finished_count = Task.count(:conditions => ['period_id = ? AND finished_at IS NOT NULL', @task.period_id])
|
22
|
+
@first_finished = finished_count == 0
|
23
|
+
end
|
24
|
+
@success, @message = do_create
|
25
|
+
# Only necessary since we have an unecessary complex update of estimates
|
26
|
+
@task.reload
|
27
|
+
if @task.finished?
|
28
|
+
render :template => '/tasks/finish_ajax', :layout => false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def do_create
|
5
35
|
if params[:id]
|
6
36
|
@task = Task.find(params[:id])
|
7
37
|
if params[:estimate] && params[:estimate][:todo]
|
8
38
|
begin
|
9
39
|
Float(params[:estimate][:todo])
|
10
40
|
@task.estimate(params[:estimate][:todo])
|
11
|
-
|
41
|
+
@period = @task.period
|
42
|
+
return true, 'Estimate updated'
|
12
43
|
rescue ArgumentError => e
|
13
|
-
|
14
|
-
render :file => "public/500.html", :layout => true, :status => 500
|
15
|
-
return
|
44
|
+
return false, "Estimate was not numeric"
|
16
45
|
end
|
17
|
-
redirect_to :controller => 'periods', :action => :show, :id => @task.root_task.period, :task_id => @task.id
|
18
46
|
else
|
19
|
-
|
20
|
-
render :file => "public/500.html", :layout => true, :status => 500
|
47
|
+
return false, "Estimate is missing."
|
21
48
|
end
|
22
49
|
else
|
23
50
|
@estimate = Estimate.new
|
24
|
-
|
25
|
-
render :file => "public/500.html", :layout => true, :status => 500
|
51
|
+
return false, 'Task id is missing.'
|
26
52
|
end
|
27
53
|
end
|
54
|
+
|
28
55
|
end
|
@@ -224,6 +224,16 @@ class TasksController < ApplicationController
|
|
224
224
|
back_or_redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task_id => @task.id
|
225
225
|
end
|
226
226
|
|
227
|
+
def finish_ajax
|
228
|
+
@task = Task.find(params[:id])
|
229
|
+
lower_item = @task.lower_item
|
230
|
+
@last_active = @task.lower_item.nil?
|
231
|
+
@last_active_in_backlog = @last_active || @task.lower_item.backlog != @task.backlog
|
232
|
+
finished_count = Task.count(:conditions => ['period_id = ? AND finished_at IS NOT NULL', @task.period_id])
|
233
|
+
@first_finished = finished_count == 0
|
234
|
+
@task.finish(Task::COMPLETED, true)
|
235
|
+
end
|
236
|
+
|
227
237
|
def abort
|
228
238
|
task = Task.find params[:id]
|
229
239
|
task.abort
|
@@ -231,15 +241,18 @@ class TasksController < ApplicationController
|
|
231
241
|
end
|
232
242
|
|
233
243
|
def reopen
|
234
|
-
task = Task.find(params[:id])
|
235
|
-
task.reopen
|
236
|
-
|
244
|
+
@task = Task.find(params[:id])
|
245
|
+
@task.reopen
|
246
|
+
@task.reload
|
247
|
+
finished_count = Task.count(:conditions => ['period_id = ? AND finished_at IS NOT NULL', @task.period_id])
|
248
|
+
@last_finished = finished_count == 0
|
249
|
+
# back_or_redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task => @task.id
|
237
250
|
end
|
238
251
|
|
239
252
|
def start_work
|
240
|
-
task = Task.find(params[:id])
|
241
|
-
task.start_work
|
242
|
-
back_or_redirect_to :controller => 'periods', :action => :show, :id => task.period, :task => task.id
|
253
|
+
@task = Task.find(params[:id])
|
254
|
+
@task.start_work
|
255
|
+
# back_or_redirect_to :controller => 'periods', :action => :show, :id => task.period, :task => task.id
|
243
256
|
end
|
244
257
|
|
245
258
|
def end_work
|
@@ -38,7 +38,7 @@ class WorkAccountsController < ApplicationController
|
|
38
38
|
@work_account = WorkAccount.find(params[:id])
|
39
39
|
if @work_account.update_attributes(params[:work_account])
|
40
40
|
flash[:notice] = 'WorkAccount was successfully updated.'
|
41
|
-
|
41
|
+
back_or_redirect_to :action => 'show', :id => @work_account
|
42
42
|
else
|
43
43
|
render :action => 'edit'
|
44
44
|
end
|
@@ -39,6 +39,12 @@ module ApplicationHelper
|
|
39
39
|
link_to image_tag(image_source, image_options), url_options, post ? {:method => :post} : nil
|
40
40
|
end
|
41
41
|
|
42
|
+
def image_link_to_remote(image_source, title, url_options, image_options = nil, post = false)
|
43
|
+
image_options ||= {:class => 'image-submit'}
|
44
|
+
image_options.update :alt => title, :title => title
|
45
|
+
link_to_remote image_tag(image_source, image_options), {:url => url_options}, post ? {:method => :post} : nil
|
46
|
+
end
|
47
|
+
|
42
48
|
def detour?
|
43
49
|
not session[:detours].nil?
|
44
50
|
end
|
data/app/models/task.rb
CHANGED
@@ -209,6 +209,10 @@ class Task < ActiveRecord::Base
|
|
209
209
|
def active_children?
|
210
210
|
children.detect {|child| child.active?}
|
211
211
|
end
|
212
|
+
|
213
|
+
def finished?
|
214
|
+
completed?
|
215
|
+
end
|
212
216
|
|
213
217
|
def completed?
|
214
218
|
finished_at || completed_children?
|
@@ -345,6 +349,7 @@ class Task < ActiveRecord::Base
|
|
345
349
|
new_work.user = current_user
|
346
350
|
new_work.work_account_id = work_account.id
|
347
351
|
new_work.save!
|
352
|
+
works << new_work
|
348
353
|
end
|
349
354
|
|
350
355
|
def works_with_children
|
@@ -15,11 +15,6 @@
|
|
15
15
|
<label for="backlog_track_done"><%=l :track_done%></label>
|
16
16
|
</p>
|
17
17
|
|
18
|
-
<p>
|
19
|
-
<%#= check_box 'backlog', 'track_times' %>
|
20
|
-
<label for="backlog_track_times"><%=l :track_times%></label>
|
21
|
-
</p>
|
22
|
-
|
23
18
|
<p>
|
24
19
|
<%= check_box 'backlog', 'enable_subtasks' %>
|
25
20
|
<label for="backlog_enable_subtasks"><%=l :enable_subtasks%></label>
|
@@ -37,7 +32,11 @@
|
|
37
32
|
|
38
33
|
<p>
|
39
34
|
<label for="backlog_work_account"><%=l :work_account%></label><br/>
|
40
|
-
<%=select 'backlog', '
|
35
|
+
<%=select 'backlog', 'work_account_id', @work_accounts.map {|wa| [wa.name, wa.id]}.sort %>
|
36
|
+
<% if @backlog.work_account %>
|
37
|
+
<%=image_detour_to('work_account.png', "#{l(:work_account)} #{@backlog.work_account.name}", {:controller => 'work_accounts', :action => :edit, :id => @backlog.work_account}, {:class => 'image-submit', :style => 'vertical-align: bottom'}) %>
|
38
|
+
<% end %>
|
39
|
+
<%=detour_to l(:new_work_account), :controller => 'work_accounts', :action => :new %>
|
41
40
|
</p>
|
42
41
|
|
43
42
|
<!--[eoform:task]-->
|
@@ -14,7 +14,7 @@
|
|
14
14
|
<%= render :partial => '/tasks/fields_header', :locals => {:backlog => @backlog, :active => true, :track_times => tasks.find {|t|t.period && t.period.active?}} %>
|
15
15
|
<% current_period = @task.period %>
|
16
16
|
<% end %>
|
17
|
-
<%= render :partial => '/tasks/task/', :locals => {:task => @task, :i => i += 1, :active => true, :highlight_task => false, :update => :maincontent} %>
|
17
|
+
<%= render :partial => '/tasks/task/', :locals => {:task => @task, :i => i += 1, :active => true, :highlight_task => false, :update => :maincontent, :hidden => false} %>
|
18
18
|
<% end %>
|
19
19
|
</table>
|
20
20
|
<%=back_or_link_to(l(:back)) %>
|
@@ -7,8 +7,8 @@
|
|
7
7
|
</div>
|
8
8
|
|
9
9
|
<% form_tag :action => 'update', :id => @backlog do %>
|
10
|
-
<%=
|
11
|
-
<%=
|
12
|
-
<%=
|
10
|
+
<%=render :partial => 'form' %>
|
11
|
+
<%=submit_tag l(:save) %>
|
12
|
+
<%=back_or_link_to l(:back), :action => 'show', :id => @backlog %>
|
13
13
|
<% end %>
|
14
14
|
</div>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
page.replace_html :notice, @message
|
2
|
+
page.visual_effect(:appear, :notice)
|
3
|
+
if @success
|
4
|
+
if @task.completed?
|
5
|
+
page.visual_effect :fade, "task_#{@task.id}"
|
6
|
+
page.remove "task_#{@task.id}"
|
7
|
+
page.insert_html :bottom, :completed_tasks, :partial => '/tasks/task'
|
8
|
+
page.visual_effect :appear, "task_#{@task.id}"
|
9
|
+
end
|
10
|
+
page['burn_down_chart'].src = url_for(:controller => 'periods', :action => :burn_down_chart_thumbnail, :id => @task.period_id, :rnd => rand)
|
11
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<h4><%=l :burn_down_chart %></h4>
|
4
4
|
</div>
|
5
5
|
|
6
|
-
<%= link_to %Q{<img src="#{url_for(:controller => 'periods', :action => :burn_down_chart_thumbnail, :id => @period, :format => :png)}" alt="Burn down chart" />}, :action => :burn_down_chart, :id => @period, :format => :png %>
|
6
|
+
<%= link_to %Q{<img id="burn_down_chart" src="#{url_for(:controller => 'periods', :action => :burn_down_chart_thumbnail, :id => @period, :format => :png)}" alt="Burn down chart" />}, :controller => 'periods', :action => :burn_down_chart, :id => @period, :format => :png %>
|
7
7
|
|
8
8
|
|
9
9
|
</div>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
//<!--
|
10
10
|
function handleEvent(field, event, id) {
|
11
11
|
if (event.keyCode == 13) {
|
12
|
-
field.form.submit();
|
12
|
+
// field.form.submit();
|
13
13
|
} else if (event.altKey && event.keyCode == 38) {
|
14
14
|
window.location = '<%=url_for(:controller => 'tasks', :action => :move_up)%>' + '/' + id;
|
15
15
|
} else if (event.altKey && event.keyCode == 40) {
|
@@ -31,23 +31,23 @@ function handleEvent(field, event, id) {
|
|
31
31
|
//-->
|
32
32
|
</script>
|
33
33
|
|
34
|
-
|
35
|
-
<table class="input"
|
34
|
+
|
35
|
+
<table id="active_tasks" class="input"<%=' style="display: none;"' unless @tasks and not @tasks.empty?%>>
|
36
36
|
<% current_backlog = nil %>
|
37
37
|
<% for task in @tasks %>
|
38
38
|
<% if task.backlog != current_backlog %>
|
39
39
|
<%= '<tr><td> </td></tr>' if current_backlog %>
|
40
40
|
<%=render :partial => '/tasks/backlog_header', :locals => { :backlog => task.backlog, :track_times => @tasks.find {|t|t.period && t.period.active?} } %>
|
41
|
-
<%=
|
41
|
+
<%=render :partial => '/tasks/fields_header', :locals => { :backlog => task.backlog, :active => true, :track_times => @tasks.find {|t|t.period && t.period.active?} } %>
|
42
42
|
<% current_backlog = task.backlog %>
|
43
43
|
<% end %>
|
44
|
-
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => true, :highlight_task => task == @selected_task, :update => :spotlight } %>
|
44
|
+
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => true, :highlight_task => task == @selected_task, :update => :spotlight, :hidden => false } %>
|
45
45
|
<% i += 1 %>
|
46
46
|
<% end %>
|
47
47
|
</table>
|
48
|
-
|
49
|
-
<p
|
50
|
-
|
48
|
+
|
49
|
+
<p id="no_tasks_message"<%=' style="display: none;"' if @tasks and not @tasks.empty?%>><%=l :no_pending_tasks%></p>
|
50
|
+
|
51
51
|
|
52
52
|
|
53
53
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
<% current_period = nil %>
|
2
2
|
|
3
|
-
<table class="input">
|
3
|
+
<table id="completed_tasks" class="input">
|
4
4
|
<% for task in @completed_tasks %>
|
5
5
|
<% if task.period != current_period %>
|
6
6
|
<%= render :partial => '/tasks/period_header', :locals => {:period => task.period} unless @completed_tasks.map(&:period).uniq.size == 1 %>
|
7
7
|
<%= render :partial => '/tasks/fields_header', :locals => {:backlog => task.backlog, :active => false, :track_times => false} %>
|
8
8
|
<% current_period = task.period %>
|
9
9
|
<% end %>
|
10
|
-
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => false, :highlight_task => task == @selected_task } %>
|
10
|
+
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => false, :highlight_task => task == @selected_task, :hidden => false } %>
|
11
11
|
<% i += 1 %>
|
12
12
|
<% end %>
|
13
13
|
</table>
|
data/app/views/tasks/_task.rhtml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<% @task = task %>
|
2
|
-
<tr valign="top"
|
2
|
+
<tr id="task_<%=@task.id%>" valign="top"<%=' class="highlight"' if highlight_task %><%=' style="display: none"' if hidden %>>
|
3
3
|
<td width="1">
|
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 %>
|
@@ -14,7 +14,7 @@
|
|
14
14
|
<%= "-" if @task.children.size > 0 %>
|
15
15
|
</td>
|
16
16
|
<td>
|
17
|
-
<div
|
17
|
+
<div<%=' 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?) %>>
|
18
18
|
<% if @task.active? -%>
|
19
19
|
<%= in_place_editor_field(:task, :description, {:id => "#{@task.id}_description", :tabindex => i}, :url => url_for(:controller => 'tasks', :action => "set_task_description", :id => @task)) %>
|
20
20
|
<% else -%>
|
@@ -30,7 +30,7 @@
|
|
30
30
|
<%= text_field 'work', 'started_at_time', :tabindex => i+1, :value => @task.started_work.started_at.strftime('%H:%M'),
|
31
31
|
:class => :task_time, :maxlength => 5, :onkeypress => "handleEvent(this, event, #{@task.id})" %>
|
32
32
|
<% elsif @task.track_times? && @task.period && @task.period.active? %>
|
33
|
-
<%=
|
33
|
+
<%= image_link_to_remote 'hammer.png', l(:start_work), {:controller => 'tasks', :action => :start_work, :id => @task.id}, nil, true %>
|
34
34
|
<% end -%>
|
35
35
|
<% end %>
|
36
36
|
<% end -%>
|
@@ -49,7 +49,7 @@
|
|
49
49
|
<%= hidden_field('work', 'task_id', :value => @task.id)%>
|
50
50
|
<%= submit_tag('checkmark', :value => l(:save), :style => 'display: none')%>
|
51
51
|
<% unless @task.track_times? || @task.work_started? || @task.finished_at -%>
|
52
|
-
<%=
|
52
|
+
<%=text_field 'work', 'hours', :tabindex => i+1, :id => "#{@task.id}_done",
|
53
53
|
:class => :task_hours, :maxlength => 4, :onkeypress => "handleEvent(this, event, #{@task.id})",
|
54
54
|
:ondblclick => "form.elements[1].style.display = 'inline';this.style.display = 'none'" -%>
|
55
55
|
<% end -%>
|
@@ -60,17 +60,16 @@
|
|
60
60
|
</td>
|
61
61
|
<td nowrap="true" width="1">
|
62
62
|
<% if active && @task.loggable? -%>
|
63
|
-
<%
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
<% end %>
|
63
|
+
<% remote_form_for(:estimate, :url => {:controller => 'estimates', :action => :create_ajax, :id => @task}) do |f| -%>
|
64
|
+
<% if @task.track_todo? -%>
|
65
|
+
<% if @task.period.nil? || @task.period.active_or_future? -%>
|
66
|
+
<%=f.text_field :todo, :tabindex => i+2, :id => "#{@task.id}_todo", :value => @task.todo, :class => :task_hours, :maxlength => 4, :onkeypress => "handleEvent(this, event, #{@task.id})" %>
|
67
|
+
<% else -%>
|
68
|
+
<%=@task.todo %>
|
69
|
+
<% end -%>
|
71
70
|
<% end -%>
|
72
71
|
<% if (not @task.track_times?) && !@task.work_started? && (@task.period.nil? || @task.period.active?) %>
|
73
|
-
<%=
|
72
|
+
<%= image_link_to_remote('checkmark.png', l(:complete), {:controller => 'tasks', :action => :finish_ajax, :id => @task}, nil, true)%>
|
74
73
|
<% end -%>
|
75
74
|
<% end -%>
|
76
75
|
<% end -%>
|
@@ -85,7 +84,7 @@
|
|
85
84
|
<% end %>
|
86
85
|
<% end %>
|
87
86
|
<% elsif (@task.period.nil? || (not @task.period.passed?)) && @task.leaf? %>
|
88
|
-
<%=
|
87
|
+
<%=image_link_to_remote('eraser.png', l(:reopen), {:controller => 'tasks', :action => :reopen, :id => @task}, nil, true) %>
|
89
88
|
<% end -%>
|
90
89
|
<% end -%>
|
91
90
|
</td>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
page.replace_html :notice, @message
|
2
|
+
page.visual_effect(:appear, :notice)
|
3
|
+
|
4
|
+
page.visual_effect :fade, "task_#{@task.id}"
|
5
|
+
page.remove "task_#{@task.id}"
|
6
|
+
|
7
|
+
if @last_active_in_backlog
|
8
|
+
page.select('#active_tasks tr').first.remove
|
9
|
+
page.select('#active_tasks tr').first.remove
|
10
|
+
end
|
11
|
+
|
12
|
+
if @last_active
|
13
|
+
page.visual_effect :appear, "no_tasks_message"
|
14
|
+
end
|
15
|
+
|
16
|
+
unless @first_finished
|
17
|
+
page.select('#completed_tasks tr').first.remove
|
18
|
+
end
|
19
|
+
|
20
|
+
page.insert_html :top, :completed_tasks, :partial => '/tasks/task', :locals => {:active => false, :hidden => true, :highlight_task => false}
|
21
|
+
page.visual_effect :appear, "task_#{@task.id}"
|
22
|
+
|
23
|
+
page.insert_html :top, :completed_tasks, :partial => '/tasks/fields_header', :locals => {:backlog => @task.backlog, :active => false}
|
24
|
+
|
25
|
+
page['burn_down_chart'].src = url_for(:controller => 'periods', :action => :burn_down_chart_thumbnail, :id => @task.period_id, :rnd => rand)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
page.replace :notice, :partial => '/layouts/notice'
|
2
|
+
page.visual_effect(:appear, :notice)
|
3
|
+
|
4
|
+
if @task.lower_item && @task.lower_item.backlog == @task.backlog
|
5
|
+
page.select('#active_tasks tr').first.remove
|
6
|
+
page.select('#active_tasks tr').first.remove
|
7
|
+
end
|
8
|
+
|
9
|
+
page.visual_effect :fade, "task_#{@task.id}"
|
10
|
+
|
11
|
+
page.remove "task_#{@task.id}"
|
12
|
+
|
13
|
+
if @last_finished
|
14
|
+
page.select('#completed_tasks tr').first.remove
|
15
|
+
end
|
16
|
+
|
17
|
+
page.insert_html :top, :active_tasks, :partial => '/tasks/task', :locals => { :task => @task, :i => 1, :active => true, :highlight_task => false, :update => :spotlight, :hidden => true }
|
18
|
+
page[:no_tasks_message].hide
|
19
|
+
|
20
|
+
page.insert_html :top, :active_tasks, :partial => '/tasks/fields_header', :locals => {:backlog => @task.backlog}
|
21
|
+
page.insert_html :top, :active_tasks, :partial => '/tasks/backlog_header', :locals => {:backlog => @task.backlog}
|
22
|
+
page.visual_effect :blind_down, "active_tasks"
|
23
|
+
page.visual_effect :appear, "task_#{@task.id}"
|
24
|
+
|
25
|
+
page.visual_effect :appear, "task_#{@task.id}"
|
26
|
+
page['burn_down_chart'].src = url_for(:controller => 'periods', :action => :burn_down_chart_thumbnail, :id => @task.period_id, :rnd => rand)
|
@@ -4,6 +4,11 @@
|
|
4
4
|
<p><label for="work_account_name">Name</label><br/>
|
5
5
|
<%= text_field 'work_account', 'name' %></p>
|
6
6
|
|
7
|
+
<p>
|
8
|
+
<%=check_box :work_account, 'track_times' %>
|
9
|
+
<label for="work_account_track_times"><%=l :track_times%></label>
|
10
|
+
</p>
|
11
|
+
|
7
12
|
<p><label for="work_account_invoice_code">Invoice code</label><br/>
|
8
13
|
<%= text_field 'work_account', 'invoice_code' %></p>
|
9
14
|
<!--[eoform:work_account]-->
|
@@ -1,9 +1,14 @@
|
|
1
|
-
|
1
|
+
<% @page_title = "#{l(:editing)} #{l(:work_account)}" %>
|
2
|
+
|
3
|
+
<div id="spotlight">
|
4
|
+
<div class="btitle">
|
5
|
+
<h4><%=@work_account.name%></h4>
|
6
|
+
</div>
|
2
7
|
|
3
8
|
<% form_tag :action => 'update', :id => @work_account do %>
|
4
|
-
<%=
|
5
|
-
<%=
|
9
|
+
<%=render :partial => 'form' %>
|
10
|
+
<%=submit_tag l(:save) %>
|
11
|
+
<%=back_or_link_to l(:back), :action => 'show', :id => @backlog %>
|
6
12
|
<% end %>
|
7
13
|
|
8
|
-
|
9
|
-
<%= link_to 'Back', :action => 'list' %>
|
14
|
+
</div>
|
Binary file
|
@@ -5,7 +5,7 @@ require 'backlogs_controller'
|
|
5
5
|
class BacklogsController; def rescue_action(e) raise e end; end
|
6
6
|
|
7
7
|
class BacklogsControllerTest < Test::Unit::TestCase
|
8
|
-
fixtures
|
8
|
+
fixtures(*ALL)
|
9
9
|
|
10
10
|
def setup
|
11
11
|
@user_controller = UserController.new
|
@@ -5,7 +5,7 @@ require 'work_accounts_controller'
|
|
5
5
|
class WorkAccountsController; def rescue_action(e) raise e end; end
|
6
6
|
|
7
7
|
class WorkAccountsControllerTest < Test::Unit::TestCase
|
8
|
-
fixtures
|
8
|
+
fixtures(*ALL)
|
9
9
|
|
10
10
|
def setup
|
11
11
|
@controller = WorkAccountsController.new
|
data/test/test_helper.rb
CHANGED
@@ -4,6 +4,8 @@ require 'test_help'
|
|
4
4
|
require 'user_notify'
|
5
5
|
|
6
6
|
class Test::Unit::TestCase
|
7
|
+
ALL = [:parties, :users, :groups, :groups_users, :work_accounts, :backlogs, :periods, :tasks, :task_files, :works, :estimates]
|
8
|
+
|
7
9
|
# Transactional fixtures accelerate your tests by wrapping each test method
|
8
10
|
# in a transaction that's rolled back on completion. This ensures that the
|
9
11
|
# test database remains unchanged so your fixtures don't have to be reloaded
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2006 RedHill Consulting, Pty. Ltd.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
= Transactional Migrations
|
2
|
+
|
3
|
+
Transactional Migrations is a plugin that ensures your migration scripts--both
|
4
|
+
up and down--run within a transaction. When used in conjunction with a
|
5
|
+
database that supports transactional Data Definition Language (DDL)--such as
|
6
|
+
PostgreSQL--this ensures that if any statement within your migration script
|
7
|
+
fails, the entire script is rolled-back.
|
8
|
+
|
9
|
+
Over and above installing the plugin, no further action is required for the
|
10
|
+
transactions to take effect.
|
11
|
+
|
12
|
+
=== License
|
13
|
+
|
14
|
+
This plugin is copyright 2006 by RedHill Consulting, Pty. Ltd. and is released
|
15
|
+
under the MIT license.
|
@@ -0,0 +1 @@
|
|
1
|
+
ActiveRecord::Migration.send(:include, RedHillConsulting::TransactionalMigrations::ActiveRecord::Migration)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RedHillConsulting::TransactionalMigrations::ActiveRecord
|
2
|
+
module Migration
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def self.extended(base)
|
9
|
+
class << base
|
10
|
+
alias_method_chain :migrate, :transactional_migrations
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def migrate_with_transactional_migrations(direction)
|
15
|
+
ActiveRecord::Base.transaction { migrate_without_transactional_migrations(direction) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: backlog
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.12.0
|
7
|
+
date: 2007-11-06 00:00:00 +01:00
|
8
8
|
summary: Application to aid collecting, processing, organizing, reviewing and doing tasks.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- public/images/arrow_right.png
|
51
51
|
- public/images/construction_hammer_jon__01.svg
|
52
52
|
- public/images/arrow_down.svg
|
53
|
+
- public/images/work_account.png
|
53
54
|
- public/images/checkmark_org.png
|
54
55
|
- public/images/rmagick_270.gif
|
55
56
|
- public/images/pagebak.jpg
|
@@ -271,6 +272,17 @@ files:
|
|
271
272
|
- cruise_config.rb
|
272
273
|
- vendor
|
273
274
|
- vendor/plugins
|
275
|
+
- vendor/plugins/transactional_migrations
|
276
|
+
- vendor/plugins/transactional_migrations/lib
|
277
|
+
- vendor/plugins/transactional_migrations/lib/red_hill_consulting
|
278
|
+
- vendor/plugins/transactional_migrations/lib/red_hill_consulting/transactional_migrations
|
279
|
+
- vendor/plugins/transactional_migrations/lib/red_hill_consulting/transactional_migrations/active_record
|
280
|
+
- vendor/plugins/transactional_migrations/lib/red_hill_consulting/transactional_migrations/active_record/migration.rb
|
281
|
+
- vendor/plugins/transactional_migrations/about.yml
|
282
|
+
- vendor/plugins/transactional_migrations/init.rb
|
283
|
+
- vendor/plugins/transactional_migrations/CHANGELOG
|
284
|
+
- vendor/plugins/transactional_migrations/MIT-LICENSE
|
285
|
+
- vendor/plugins/transactional_migrations/README
|
274
286
|
- vendor/plugins/goldspike
|
275
287
|
- vendor/plugins/goldspike/test
|
276
288
|
- vendor/plugins/goldspike/test/test_create_war.rb
|
@@ -423,6 +435,7 @@ files:
|
|
423
435
|
- app/views/backlogs/edit.rhtml
|
424
436
|
- app/views/backlogs/_tasks.rhtml
|
425
437
|
- app/views/estimates
|
438
|
+
- app/views/estimates/create_ajax.rjs
|
426
439
|
- app/views/groups
|
427
440
|
- app/views/groups/list.rhtml
|
428
441
|
- app/views/groups/_form.rhtml
|
@@ -441,13 +454,16 @@ files:
|
|
441
454
|
- app/views/tasks
|
442
455
|
- app/views/tasks/_backlog_header.rhtml
|
443
456
|
- app/views/tasks/list.rhtml
|
457
|
+
- app/views/tasks/finish_ajax.rjs
|
444
458
|
- app/views/tasks/_form.rhtml
|
445
459
|
- app/views/tasks/_period_header.rhtml
|
446
460
|
- app/views/tasks/new.rhtml
|
461
|
+
- app/views/tasks/start_work.rjs
|
447
462
|
- app/views/tasks/_fields_header.rhtml
|
448
463
|
- app/views/tasks/_completed.rhtml
|
449
464
|
- app/views/tasks/edit.rhtml
|
450
465
|
- app/views/tasks/list_started.rhtml
|
466
|
+
- app/views/tasks/reopen.rjs
|
451
467
|
- app/views/tasks/_task.rhtml
|
452
468
|
- app/views/works
|
453
469
|
- app/views/works/list.rhtml
|