backlog 0.3.9 → 0.4.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.
@@ -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