backlog 0.3.9 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 abcklog using the /etc/backlog.conf file.
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
- # @period = Period.find(:first, params[:id]) if params[:id]
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
- @tasks = @backlog.tasks.sort do |t1, t2|
52
- (t1.position && (t2.position ? t1.position <=> t2.position : -1)) ||
53
- (t2.position ? 1 : t1.finished_at <=> t2.finished_at)
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
@@ -30,7 +30,7 @@ class PeriodsController < ApplicationController
30
30
  @completed_tasks = @period.completed_tasks.reverse
31
31
  end
32
32
 
33
- def show_nolayout
33
+ def show_no_layout
34
34
  show
35
35
  render :partial => 'show_active', :layout => false, :locals => {:i => 0}
36
36
  end
@@ -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
- redirect_to :controller => 'periods', :action => :show_nolayout, :id => task.period, :task => task.id
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
- params[:period_id] = task.period.lower_item && task.period.lower_item.id
148
- move_to_period(true)
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.update({:detour => params.reject {|k, v| [:detour, :return_from_detour].include? k.to_sym}}), html_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)
@@ -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 => '#{period_id ? "period_id = #{period_id}" : parent_id ? "parent_id = #{parent_id}" : "backlog_id = #{backlog_id}"} AND finished_at IS NULL'
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
@@ -1,5 +1,3 @@
1
- <%= error_messages_for 'backlog' %>
2
-
3
1
  <!--[form:task]-->
4
2
  <p>
5
3
  <label for="backlog_name"><%=l :name%></label><br/>
@@ -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
- <%= render :partial => 'form' %>
6
- <%= submit_tag l(:save) %>
7
- <%= back_or_link_to l(:back), :action => 'show', :id => @backlog %>
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
- <div id="maincontent">
12
- <div class="mainblock">
13
- <div class="btitle">
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>&nbsp;</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? && @tasks.find {|t|t.period && t.period.active?} %></th>
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>
@@ -1,7 +1,7 @@
1
1
  <% @task = task %>
2
- <tr valign="top" <%= 'class="highlight"' if highlight %>>
2
+ <tr valign="top" <%='class="highlight"' if highlight %>>
3
3
  <td width="1">
4
- <% if @task.enable_subtasks? && @task.period && @task.period.active_or_future? && active %>
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 id="<%=@task.id%>" <%if active && @task.period && @task.period.active_or_future?%>class="tasks" style=cursor:move;"<%end%>>
17
- <% if @task.active? -%>
18
- <%= in_place_editor_field(:task, :description, {:id => "#{@task.id}_description", :tabindex => i}, :url => url_for(:controller => 'tasks', :action => "set_task_description", :id => @task)) %>
19
- <% else -%>
20
- <%= @task.description -%>
21
- <% end -%>
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 && @task.period.active_or_future? %>
87
- <%= draggable_element "#{@task.id}", :revert => true, :constraint => "'vertical'" %>
88
- <%= drop_receiving_element "#{@task.id}",
89
- :update => "spotlight", :url => {:controller => 'tasks', :action => "move_to", :position => @task.position},
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 => 'highlight'
95
+ :hoverclass => 'dropzone-hover'
94
96
  %>
95
97
  <% end %>
96
98
 
@@ -4,7 +4,7 @@
4
4
  <% form_tag :action => 'update', :id => @task do %>
5
5
  <%= render :partial => 'form' %>
6
6
  <%= submit_tag l(:save) %>
7
- <%= link_to l(:back), :action => 'list' %>
7
+ <%= back_or_link_to l(:back), :action => 'list' %>
8
8
  <% end %>
9
9
 
10
10
  </div>
@@ -32,6 +32,7 @@ groups: Groups
32
32
  home: Home
33
33
  hours: Hours
34
34
  invoice: Invoice
35
+ invoice_code: Invoice Code
35
36
  invoice_short: Inv.
36
37
  left: Left
37
38
  listing_works: Recorded work
@@ -32,6 +32,7 @@ groups: Grupper
32
32
  home: Hjem
33
33
  hours: Timer
34
34
  invoice: Fakturerbart
35
+ invoice_code: Faktureringskode
35
36
  invoice_short: Fakt
36
37
  left: Venstre
37
38
  listing_works: Registrert arbeid
@@ -1,6 +1,6 @@
1
1
  .task_description { width: 300px; }
2
2
  .task_hours { width: 32px; }
3
- .task_time { width: 40px; border: 1 }
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 grey;
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.3.9
7
- date: 2007-08-03 00:00:00 +02:00
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 abcklog using the /etc/backlog.conf file. The format is YAML. Currently only port number is settable. port: 3000"
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