backlog 0.3.9 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/README.txt +3 -1
- data/app/controllers/application.rb +1 -22
- data/app/controllers/backlogs_controller.rb +14 -3
- data/app/controllers/periods_controller.rb +1 -1
- data/app/controllers/tasks_controller.rb +9 -4
- data/app/helpers/application_helper.rb +7 -1
- data/app/models/task.rb +2 -2
- data/app/views/backlogs/_form.rhtml +0 -2
- data/app/views/backlogs/_tasks.rhtml +13 -0
- data/app/views/backlogs/edit.rhtml +8 -21
- data/app/views/periods/_show_active.rhtml +2 -2
- data/app/views/tasks/_backlog_header.rhtml +1 -1
- data/app/views/tasks/_task.rhtml +15 -13
- data/app/views/tasks/edit.rhtml +1 -1
- data/lang/en.yaml +1 -0
- data/lang/no.yaml +1 -0
- data/public/stylesheets/backlog.css +5 -2
- metadata +5 -3
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.4.0 2007-08-06
|
2
|
+
|
3
|
+
* Added tasks to backlog edit view
|
4
|
+
* Started simplifying task ordering. Now ordering simply has period_id as scope.
|
5
|
+
* Improved and fixed bugs in workflow
|
6
|
+
* Fixed typos in stylesheet
|
7
|
+
* KNOWN BUG: Ordering for tasks in backlog does not work properly
|
8
|
+
|
1
9
|
== 0.3.9 2007-08-03
|
2
10
|
|
3
11
|
* Fixed bug in moving task between periods
|
data/README.txt
CHANGED
@@ -28,8 +28,10 @@ A timekeeping module is also included to track time spent on the different tasks
|
|
28
28
|
|
29
29
|
=== Configuration
|
30
30
|
|
31
|
-
You can set configuration parameters for
|
31
|
+
You can set configuration parameters for backlog using the /etc/backlog.conf file.
|
32
32
|
The format is YAML.
|
33
33
|
Currently only port number is settable.
|
34
34
|
|
35
|
+
Example:
|
36
|
+
|
35
37
|
port: 3000
|
@@ -122,8 +122,7 @@ class ApplicationController < ActionController::Base
|
|
122
122
|
end
|
123
123
|
|
124
124
|
def populate_layout
|
125
|
-
|
126
|
-
# @owner = @period.party if @period
|
125
|
+
return true if request.path_parameters[:action] =~ /_no_layout$/
|
127
126
|
populate_shortcuts
|
128
127
|
|
129
128
|
# TODO (uwe): This does not scale!
|
@@ -161,26 +160,6 @@ class ApplicationController < ActionController::Base
|
|
161
160
|
end
|
162
161
|
end
|
163
162
|
|
164
|
-
# def populate_layout
|
165
|
-
# populate_shortcuts
|
166
|
-
# @groups = Group.find(:all, :order => 'name')
|
167
|
-
# @backlogs = Backlog.find(:all, :order => 'name')
|
168
|
-
# @sidebars = @backlogs.map do |backlog|
|
169
|
-
# content = '<ul>'
|
170
|
-
# periods = backlog.tasks.map {|task| task.period}.uniq
|
171
|
-
# periods.select {|period| period.in_list? }[0...5].map do |period|
|
172
|
-
# "<li><a href=\"#{url_for(:controller => 'periods', :action => :show, :id => period)}\">#{period.name}</a></li>"
|
173
|
-
# end.each do |period_link|
|
174
|
-
# content << "#{period_link}"
|
175
|
-
# end
|
176
|
-
# content << '</ul>'
|
177
|
-
# { :title => "#{backlog.name}",
|
178
|
-
# :options => {:controller => 'backlogs', :action => :show, :id => backlog},
|
179
|
-
# :content => content
|
180
|
-
# }
|
181
|
-
# end
|
182
|
-
# end
|
183
|
-
|
184
163
|
private
|
185
164
|
|
186
165
|
def user_id
|
@@ -48,10 +48,21 @@ class BacklogsController < ApplicationController
|
|
48
48
|
|
49
49
|
def edit
|
50
50
|
@backlog = Backlog.find(params[:id])
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
unplanned_tasks = @backlog.tasks.select {|t| t.period.nil? && t.finished_at.nil?}.sort_by {|t| t.position}
|
52
|
+
planned_tasks = @backlog.tasks.select {|t| t.period && t.finished_at.nil?}.sort do |t1, t2|
|
53
|
+
if (cmp_period = t1.period.end_on <=> t2.period.end_on) != 0
|
54
|
+
cmp_period
|
55
|
+
else
|
56
|
+
t1.position <=> t2.position
|
57
|
+
end
|
54
58
|
end
|
59
|
+
@tasks = planned_tasks + unplanned_tasks
|
60
|
+
@completed_tasks = @backlog.tasks.select {|t| t.finished_at}.sort {|t1, t2| t1.finished_at <=> t2.finished_at}
|
61
|
+
end
|
62
|
+
|
63
|
+
def edit_no_layout
|
64
|
+
edit
|
65
|
+
render :partial => 'tasks'
|
55
66
|
end
|
56
67
|
|
57
68
|
def update
|
@@ -42,6 +42,7 @@ class TasksController < ApplicationController
|
|
42
42
|
|
43
43
|
def edit
|
44
44
|
@task = Task.find(params[:id])
|
45
|
+
@task.period_id = params[:task][:period_id] if params[:task] && params[:task][:period_id]
|
45
46
|
@periods = Period.find_active_or_future
|
46
47
|
@backlogs = Backlog.find(:all, :order => 'name')
|
47
48
|
end
|
@@ -117,9 +118,9 @@ class TasksController < ApplicationController
|
|
117
118
|
end
|
118
119
|
|
119
120
|
def move_to
|
120
|
-
task = Task.find(params[:id])
|
121
|
+
task = Task.find(params[:id][5..-1])
|
121
122
|
task.insert_at params[:position]
|
122
|
-
|
123
|
+
back_or_redirect_to :controller => 'periods', :action => :show_nolayout, :id => task.period, :task => task.id
|
123
124
|
end
|
124
125
|
|
125
126
|
def move_to_period(with_layout = false)
|
@@ -144,8 +145,12 @@ class TasksController < ApplicationController
|
|
144
145
|
|
145
146
|
def move_to_next_period
|
146
147
|
task = Task.find(params[:id])
|
147
|
-
|
148
|
-
|
148
|
+
if task.period
|
149
|
+
params[:period_id] = task.period.lower_item && task.period.lower_item.id
|
150
|
+
move_to_period(true)
|
151
|
+
else
|
152
|
+
detour_to :action => :edit, :id => task
|
153
|
+
end
|
149
154
|
end
|
150
155
|
|
151
156
|
def finish
|
@@ -12,7 +12,13 @@ module ApplicationHelper
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def detour_to(title, options, html_options = nil)
|
15
|
-
link_to title, options
|
15
|
+
link_to title, options_for_detour(options), html_options
|
16
|
+
end
|
17
|
+
|
18
|
+
def options_for_detour(options)
|
19
|
+
detour_options = {:detour => params.reject {|k, v| [:detour, :return_from_detour].include? k.to_sym}}.update(options)
|
20
|
+
detour_options[:detour].update({:action => params[:action] + '_no_layout'}) if (not options[:layout].nil?) && params[:action] !~ /_no_layout$/
|
21
|
+
detour_options
|
16
22
|
end
|
17
23
|
|
18
24
|
def image_detour_to(image_source, title, url_options, image_options = nil, post = false)
|
data/app/models/task.rb
CHANGED
@@ -8,7 +8,7 @@ class Task < ActiveRecord::Base
|
|
8
8
|
|
9
9
|
belongs_to :backlog
|
10
10
|
belongs_to :period
|
11
|
-
acts_as_list :scope =>
|
11
|
+
acts_as_list :scope => :period_id
|
12
12
|
has_many :estimates, :order => 'created_at', :dependent => :destroy
|
13
13
|
has_many :works, :order => 'completed_at', :dependent => :destroy
|
14
14
|
acts_as_tree :order => 'position'
|
@@ -18,7 +18,7 @@ class Task < ActiveRecord::Base
|
|
18
18
|
#validates_absence_of :position, :if => :finished_at
|
19
19
|
#validates_absence_of :finished_at, :if => :position
|
20
20
|
validates_presence_of :resolution, :if => :finished_at
|
21
|
-
validates_presence_of :description
|
21
|
+
validates_presence_of :description, :if => :backlog_id
|
22
22
|
|
23
23
|
validates_size_of :description, :maximum => 80, :if => :description
|
24
24
|
validates_size_of :customer, :maximum => 64, :if => :customer
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="mainblock">
|
2
|
+
<div class="btitle">
|
3
|
+
<h4><%=l :tasks%></h4>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<table>
|
7
|
+
<%= render :partial => '/tasks/backlog_header', :locals => {:backlog => @backlog, :track_times => tasks.find {|t|t.period && t.period.active?}} %>
|
8
|
+
<% i = 0 %>
|
9
|
+
<% for @task in tasks %>
|
10
|
+
<%= render :partial => '/tasks/task/', :locals => {:task => @task, :i => i += 1, :active => true, :highlight => false, :update => :maincontent} %>
|
11
|
+
<% end %>
|
12
|
+
</table>
|
13
|
+
</div>
|
@@ -1,26 +1,13 @@
|
|
1
1
|
<% @page_title = "#{l(:editing)} #{l(:backlog)}" %>
|
2
2
|
|
3
3
|
<div id="spotlight">
|
4
|
-
<% form_tag :action => 'update', :id => @backlog do %>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
<% end %>
|
4
|
+
<% form_tag :action => 'update', :id => @backlog do %>
|
5
|
+
<%= render :partial => 'form' %>
|
6
|
+
<%= submit_tag l(:save) %>
|
7
|
+
<%= back_or_link_to l(:back), :action => 'show', :id => @backlog %>
|
8
|
+
<% end %>
|
9
9
|
</div>
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
<h4><%=l :tasks%></h4>
|
15
|
-
</div>
|
16
|
-
|
17
|
-
<table>
|
18
|
-
<%= render :partial => '/tasks/backlog_header', :locals => {:backlog => @backlog} %>
|
19
|
-
<% i = 0 %>
|
20
|
-
<% for @task in @tasks %>
|
21
|
-
<%= render :partial => '/tasks/task/', :locals => {:task => @task, :i => i += 1, :active => true, :highlight => false} %>
|
22
|
-
<% end %>
|
23
|
-
</table>
|
24
|
-
</div>
|
25
|
-
|
26
|
-
</div>
|
11
|
+
<div id="maincontent">
|
12
|
+
<%=render :partial => 'tasks', :locals => {:tasks => @tasks}%>
|
13
|
+
</div>
|
@@ -37,10 +37,10 @@ function handleEvent(field, event, id) {
|
|
37
37
|
<% for task in @tasks %>
|
38
38
|
<% if task.backlog != current_backlog %>
|
39
39
|
<%= '<tr><td> </td></tr>' if current_backlog %>
|
40
|
-
<%=render :partial => '/tasks/backlog_header', :locals => { :backlog => task.backlog } %>
|
40
|
+
<%=render :partial => '/tasks/backlog_header', :locals => { :backlog => task.backlog, :track_times => @tasks.find {|t|t.period && t.period.active?} } %>
|
41
41
|
<% current_backlog = task.backlog %>
|
42
42
|
<% end %>
|
43
|
-
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => true, :highlight => task == @selected_task } %>
|
43
|
+
<%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => true, :highlight => task == @selected_task, :update => :spotlight } %>
|
44
44
|
<% i += 1 %>
|
45
45
|
<% end %>
|
46
46
|
</table>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<th/>
|
16
16
|
<th align="center">#</th>
|
17
17
|
<th><%=l :task %></th>
|
18
|
-
<th><%=l :start if @backlog.track_times? &&
|
18
|
+
<th><%=l :start if @backlog.track_times? && track_times %></th>
|
19
19
|
<th><%=l :done if @backlog.track_done? %></th>
|
20
20
|
<th width="*"><% l :todo if @backlog.track_todo? %></th>
|
21
21
|
</tr>
|
data/app/views/tasks/_task.rhtml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
<% @task = task %>
|
2
|
-
<tr valign="top" <%=
|
2
|
+
<tr valign="top" <%='class="highlight"' if highlight %>>
|
3
3
|
<td width="1">
|
4
|
-
<% if @task.enable_subtasks? && @task.period
|
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 %>
|
@@ -13,12 +13,14 @@
|
|
13
13
|
<%= l(@task.resolution.downcase) if @task.finished_at %>
|
14
14
|
<%= "-" if @task.children.size > 0 %>
|
15
15
|
</td>
|
16
|
-
<td
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
<td>
|
17
|
+
<div id="task_<%=@task.id%>"<%=' 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?)%>>
|
18
|
+
<% if @task.active? -%>
|
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
|
+
<% else -%>
|
21
|
+
<%= @task.description -%>
|
22
|
+
<% end -%>
|
23
|
+
</div>
|
22
24
|
</td>
|
23
25
|
<td align="right" nowrap="true" width="1">
|
24
26
|
<% if active && @task.loggable? -%>
|
@@ -83,14 +85,14 @@
|
|
83
85
|
</td>
|
84
86
|
</tr>
|
85
87
|
|
86
|
-
<% if active && @task.period
|
87
|
-
<%= draggable_element "#{@task.id}", :revert => true, :constraint => "'vertical'" %>
|
88
|
-
<%= drop_receiving_element "#{@task.id}",
|
89
|
-
:update =>
|
88
|
+
<% if active && (@task.period.nil? || @task.period.active_or_future?) %>
|
89
|
+
<%= draggable_element "task_#{@task.id}", :revert => true, :constraint => "'vertical'" %>
|
90
|
+
<%= drop_receiving_element "task_#{@task.id}",
|
91
|
+
:update => update, :url => options_for_detour({:controller => 'tasks', :action => "move_to", :position => @task.position, :layout => false}),
|
90
92
|
:accept => "tasks",
|
91
93
|
:loading => "",
|
92
94
|
:complete => "",
|
93
|
-
:hoverclass => '
|
95
|
+
:hoverclass => 'dropzone-hover'
|
94
96
|
%>
|
95
97
|
<% end %>
|
96
98
|
|
data/app/views/tasks/edit.rhtml
CHANGED
data/lang/en.yaml
CHANGED
data/lang/no.yaml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
.task_description { width: 300px; }
|
2
2
|
.task_hours { width: 32px; }
|
3
|
-
.task_time { width: 40px; border:
|
3
|
+
.task_time { width: 40px; border: 1px solid black }
|
4
4
|
.image-submit {height: 22px; border: 0; margin-bottom: 1px; padding: 0; vertical-align: bottom; float: none;}
|
5
5
|
table.input {border-collapse: collapse}
|
6
6
|
table.input td {vertical-align: top; margin: 0; border: 0; padding: 0 1px;}
|
@@ -8,6 +8,9 @@ table.input td {vertical-align: top; margin: 0; border: 0; padding: 0 1px;}
|
|
8
8
|
#spotlight div.btitle img.image-submit {float: right;}
|
9
9
|
#spotlight div.btitle h4 {margin-top: 6px;}
|
10
10
|
.highlight {background: yellow;}
|
11
|
+
.tasks {cursor: move;}
|
12
|
+
.dragable-hover {background: yellow; border: 1px solid black;}
|
13
|
+
.dropzone-hover {background: yellow; border: 1px solid black;}
|
11
14
|
th.hours {text-align: right;}
|
12
15
|
|
13
16
|
.fieldWithErrors {
|
@@ -56,7 +59,7 @@ div.progressBar {
|
|
56
59
|
|
57
60
|
div.progressBar div.border {
|
58
61
|
background-color: #fff;
|
59
|
-
border: 1px solid
|
62
|
+
border: 1px solid gray;
|
60
63
|
width: 100%;
|
61
64
|
}
|
62
65
|
|
metadata
CHANGED
@@ -3,15 +3,15 @@ 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-08-
|
6
|
+
version: 0.4.0
|
7
|
+
date: 2007-08-06 00:00:00 +02:00
|
8
8
|
summary: Application to aid collecting, processing, organizing, reviewing and doing tasks.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: ryand-ruby@zenspider.com
|
12
12
|
homepage: http://www.zenspider.com/ZSS/Products/backlog/
|
13
13
|
rubyforge_project: backlog
|
14
|
-
description: "== Backlog Welcome to Backlog! Backlog is a tool to help you collect and organize all your tasks, wether you are a single persion or a small or large group. A timekeeping module is also included to track time spent on the different tasks. === Backlog is not meant to be * an issue tracker with customer communication. === Installation * Install ruby * Install RubyGems * Install PostgreSQL * run <tt>sudo gem install backlog -y</tt> * run <tt>sudo backlog setup_linux</tt> * run <tt>sudo backlog start</tt> === Updates * run <tt>sudo backlog stop</tt> * run <tt>sudo gem update -y</tt> * run <tt>sudo backlog start</tt> === Configuration You can set configuration parameters for
|
14
|
+
description: "== Backlog Welcome to Backlog! Backlog is a tool to help you collect and organize all your tasks, wether you are a single persion or a small or large group. A timekeeping module is also included to track time spent on the different tasks. === Backlog is not meant to be * an issue tracker with customer communication. === Installation * Install ruby * Install RubyGems * Install PostgreSQL * run <tt>sudo gem install backlog -y</tt> * run <tt>sudo backlog setup_linux</tt> * run <tt>sudo backlog start</tt> === Updates * run <tt>sudo backlog stop</tt> * run <tt>sudo gem update -y</tt> * run <tt>sudo backlog start</tt> === Configuration You can set configuration parameters for backlog using the /etc/backlog.conf file. The format is YAML. Currently only port number is settable. Example: port: 3000"
|
15
15
|
autorequire:
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
@@ -223,6 +223,7 @@ files:
|
|
223
223
|
- config/environments/datek_production.rb
|
224
224
|
- LICENSE_LOCALIZATION
|
225
225
|
- README.txt
|
226
|
+
- doc
|
226
227
|
- Manifest.txt
|
227
228
|
- vendor
|
228
229
|
- vendor/plugins
|
@@ -1710,6 +1711,7 @@ files:
|
|
1710
1711
|
- app/views/backlogs/_form.rhtml
|
1711
1712
|
- app/views/backlogs/new.rhtml
|
1712
1713
|
- app/views/backlogs/edit.rhtml
|
1714
|
+
- app/views/backlogs/_tasks.rhtml
|
1713
1715
|
- app/views/estimates
|
1714
1716
|
- app/views/groups
|
1715
1717
|
- app/views/groups/list.rhtml
|