Skip to content

Commit

Permalink
Merge pull request #15 from nutso/develop
Browse files Browse the repository at this point in the history
v1.2
  • Loading branch information
teresan committed Dec 30, 2013
2 parents a2801ec + 21a2b7e commit faacc45
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 27 deletions.
24 changes: 12 additions & 12 deletions app/controllers/recurring_tasks_controller.rb
Expand Up @@ -6,10 +6,9 @@ class RecurringTasksController < ApplicationController
before_filter :find_optional_project # this also checks permissions
before_filter :find_recurring_task, :except => [:index, :new, :create]
before_filter :set_interval_units, :except => [:index, :show]
before_filter :set_recurrable_issues, :except => [:index, :show]

def index
# TODO authorize

@recurring_tasks = RecurringTask.all_for_project(@project)
end

Expand All @@ -19,6 +18,10 @@ def show

def new
@recurring_task = RecurringTask.new

if params[:issue_id]
@recurring_task.issue = Issue.find(params[:issue_id])
end
end

# creates a new recurring task
Expand Down Expand Up @@ -63,16 +66,13 @@ def destroy
end

private
# def find_project
# @project = nil
# if params[:project_id]
# begin
# @project = Project.find(params[:project_id])
# rescue ActiveRecord::RecordNotFound
# show_error "#{l(:error_project_not_found)} #{params[:project_id]}" # TODO localize
## end
# end
# end
def set_recurrable_issues
if @project
@recurrable_issues = @project.issues
else
@recurrable_issues = Issue.all
end
end

def find_recurring_task
begin
Expand Down
4 changes: 2 additions & 2 deletions app/helpers/recurring_tasks_helper.rb
Expand Up @@ -6,13 +6,13 @@ def show_error msg

def delete_button recurring_task
if User.current.allowed_to?(:delete_issue_recurrence, recurring_task.project)
button_to(l(:button_delete), {:action => 'destroy', :id => recurring_task}, :method => :delete, :class => 'icon icon-del', :confirm => l(:text_are_you_sure))
button_to(l(:button_delete), {:action => 'destroy', :id => recurring_task, :project_id => recurring_task.project.id}, :method => :delete, :class => 'icon icon-del', :confirm => l(:text_are_you_sure))
end
end

def edit_button recurring_task
if User.current.allowed_to?(:edit_issue_recurrence, recurring_task.project)
link_to(l(:button_edit), {:action => 'edit', :id => recurring_task}, :class => 'icon icon-edit')
link_to(l(:button_edit), {:action => 'edit', :id => recurring_task, :project_id => recurring_task.project.id}, :class => 'icon icon-edit')
end
end
end
5 changes: 5 additions & 0 deletions app/models/recurring_task.rb
Expand Up @@ -31,6 +31,11 @@ def recurrence_pattern
end
end

def self.find_by_issue issue
# it's possible there is more than one recurrence associated with an issue
RecurringTask.where(current_issue_id: issue.id)
end

# retrieve all recurring tasks given a project
def self.all_for_project project
if project.nil? then all else RecurringTask.includes(:issue).where("issues.project_id" => project.id) end
Expand Down
18 changes: 18 additions & 0 deletions app/views/issues/_show_recurrence.html.erb
@@ -0,0 +1,18 @@
<hr />
<tr>
<td class="recurrence" colspan="2"></th>
<% if User.current.allowed_to?(:add_issue_recurrence, project) %>
<div class="contextual"><%= link_to(l(:label_add_recurring_task), new_recurring_task_path(:issue_id => issue.id, :project_id => project.id), :class => 'icon icon-add') %></div>
<% end %>
<p><strong><%= l(:field_recurrence)%></strong></p>
<% if issue.recurs? %>
<ul>
<% issue.recurring_tasks.each do |rt| %>
<li><%= if User.current.allowed_to?(:view_issue_recurrence, project) then link_to(rt.to_s, recurring_task_path(:id => rt.id, :project_id => project.id)) else rt.to_s end %></li>
<% end %>
</ul>
<% else %>
<p><%= l(:label_no_recurrence)%></p>
<% end %>
</td>
</tr>
2 changes: 1 addition & 1 deletion app/views/recurring_tasks/_form.html.erb
Expand Up @@ -2,7 +2,7 @@
<%= labelled_form_for rt, :url => { :action => next_step, :id=>rt } do |f| %>
<p><%= error_messages_for 'recurring_task' %></p>
<p><%= f.hidden_field :id %></p>
<p><%= label(:recurring_task, :current_issue_id, l(:field_issue)) %><%= collection_select('recurring_task', 'current_issue_id', Issue.all, :id, :subj_date) %></p>
<p><%= label(:recurring_task, :current_issue_id, l(:field_issue)) %><%= collection_select('recurring_task', 'current_issue_id', @recurrable_issues, :id, :subj_date) %></p>
<p><%= f.number_field :interval_number %></p>
<p><%= label(:recurring_task, :interval_unit, l(:field_interval_unit)) %><%= select 'recurring_task', 'interval_unit', @interval_units %></p>
<p><%= f.check_box :fixed_schedule %> </p>
Expand Down
8 changes: 3 additions & 5 deletions app/views/recurring_tasks/index.html.erb
@@ -1,9 +1,5 @@
<h2><%= l(:label_recurring_tasks) %></h2>

<div class="contextual">
<%= link_to(l(:label_add_recurring_task), {:action => 'new'}, :class => 'icon icon-add') %>
</div>

<% if @recurring_tasks.nil? or @recurring_tasks.empty? %>
<p><%= l(:label_no_recurring_tasks)%></p>

Expand All @@ -12,6 +8,7 @@
<table class="list">
<thead>
<tr>
<% if !@project %><th><%= l(:field_project)%></th><% end %>
<th><%= l(:label_current_issue)%></th>
<th><%= l(:label_recurrence_pattern)%></th>
<th><%= l(:field_fixed_schedule)%></th>
Expand All @@ -22,7 +19,8 @@
<tbody>
<% @recurring_tasks.each do |rt| %>
<tr class="<%= cycle('odd', 'even') %>">
<td><%= rt.issue.nil? ? l(:label_recurring_task_issue_empty) : link_to(rt.issue.subj_date, {:action => 'show', :id => rt.id}) %></td>
<% if !@project %><td><%= link_to(rt.project, project_path(rt.project)) %></td><% end %>
<td><%= rt.issue.nil? ? l(:label_recurring_task_issue_empty) : link_to(rt.issue.subj_date, {:action => 'show', :id => rt.id, :project_id => rt.project.id}) %></td>
<td><%= pluralize(rt.interval_number, rt.interval_unit) %></td>
<td><%= rt.fixed_schedule %></td>
<td><%= format_date(rt.next_scheduled_recurrence) %></td>
Expand Down
4 changes: 3 additions & 1 deletion config/locales/en.yml
Expand Up @@ -3,9 +3,10 @@ en:
label_recurring_tasks: "Recurring Tasks"
label_current_issue: "Current Issue for Recurrence"
label_recurrence_pattern: "Recurs every"
label_add_recurring_task: "Add Recurring Task"
label_add_recurring_task: "Add Recurrence"
label_no_recurring_tasks: "No recurring tasks found on the system."
label_next_scheduled_run: "Next scheduled run"
label_no_recurrence: "No recurrence."

label_recurs_fixed: "on a fixed schedule"
label_recurs_dependent: "after previous task completion"
Expand All @@ -22,6 +23,7 @@ en:
field_interval_number: "Interval number"
field_interval_unit: "Interval Unit(s)"
field_fixed_schedule: "Fixed Schedule?"
field_recurrence: "Recurrence"

interval_day: "day"
interval_week: "week"
Expand Down
10 changes: 5 additions & 5 deletions config/routes.rb
Expand Up @@ -4,10 +4,10 @@
match 'recurring_tasks', :to => 'recurring_tasks#index'

# project view
match 'projects/:project_id/recurring_tasks', :to => 'recurring_tasks#index'
match 'projects/:project_id/recurring_tasks/:id', :to => 'recurring_tasks#show'
match 'projects/:project_id/recurring_tasks/new', :to => 'recurring_tasks#new'
match 'projects/:project_id/recurring_tasks', :to => 'recurring_tasks#index', :as => :recurring_tasks
match 'projects/:project_id/recurring_tasks/new(/:issue_id)', :to => 'recurring_tasks#new', :as => :new_recurring_task
match 'projects/:project_id/recurring_tasks/create', :to => 'recurring_tasks#create'
match 'projects/:project_id/recurring_tasks/:id/edit', :to => 'recurring_tasks#edit'
match 'projects/:project_id/recurring_tasks/:id', :to => 'recurring_tasks#show', :as => :recurring_task
match 'projects/:project_id/recurring_tasks/:id/edit', :to => 'recurring_tasks#edit', :as => :edit_recurring_task
match 'projects/:project_id/recurring_tasks/:id/update', :to => 'recurring_tasks#update'
match 'projects/:project_id/recurring_tasks/:id/destroy', :to => 'recurring_tasks#destroy'
match 'projects/:project_id/recurring_tasks/:id/destroy', :to => 'recurring_tasks#destroy', :as => :destroy_recurring_task
6 changes: 5 additions & 1 deletion init.rb
@@ -1,12 +1,16 @@
require 'redmine'
require 'issues_patch'

# view hooks
require_dependency 'recurring_tasks/hooks'

Redmine::Plugin.register :recurring_tasks do
name 'Recurring Tasks (Issues)'
author 'Teresa N.'
author_url 'https://github.com/nutso/'
url 'https://github.com/nutso/redmine-plugin-recurring-tasks'
description 'Allows you to set a task to recur on a regular schedule, or when marked complete, regenerate a new task due in the future. Plugin is based -- very loosely -- on the periodic tasks plugin published by Tanguy de Courson'
version '1.1.0'
version '1.2'

Redmine::MenuManager.map :top_menu do |menu|
menu.push :recurring_tasks, { :controller => 'recurring_tasks', :action => 'index' }, :caption => 'Recurring Issues', :if => Proc.new { User.current.admin? } # TODO localize string
Expand Down
10 changes: 10 additions & 0 deletions lib/issues_patch.rb
Expand Up @@ -6,6 +6,16 @@ def self.included(base)
def subj_date
"#{self.subject} (#{format_date self.due_date})"
end #subj_date

# whether this issue recurs
def recurs?
!(recurring_tasks.nil? || recurring_tasks.length <= 0)
# TODO determine if it was a historically recurring task
end

def recurring_tasks
RecurringTask.find_by_issue(self)
end
end # base.class_eval
end # self.included
end # issues patch
Expand Down
7 changes: 7 additions & 0 deletions lib/recurring_tasks/hooks.rb
@@ -0,0 +1,7 @@
module RecurringTasks
class Hooks < Redmine::Hook::ViewListener
# view issue
render_on :view_issues_show_description_bottom,
:partial => 'issues/show_recurrence'
end
end

0 comments on commit faacc45

Please sign in to comment.