Merge branch 'feature/edit-recurring-task'

Conflicts:
	config/locales/en.yml
This commit is contained in:
wvengen 2015-05-08 20:10:23 +02:00
commit ec03d579d0
8 changed files with 97 additions and 55 deletions

View file

@ -1,21 +1,21 @@
# encoding: utf-8 # encoding: utf-8
class TasksController < ApplicationController class TasksController < ApplicationController
#auto_complete_for :user, :nick #auto_complete_for :user, :nick
def index def index
@non_group_tasks = Task.non_group.includes(assignments: :user) @non_group_tasks = Task.non_group.includes(assignments: :user)
@groups = Workgroup.includes(open_tasks: {assignments: :user}) @groups = Workgroup.includes(open_tasks: {assignments: :user})
end end
def user def user
@unaccepted_tasks = Task.unaccepted_tasks_for(current_user) @unaccepted_tasks = Task.unaccepted_tasks_for(current_user)
@accepted_tasks = Task.accepted_tasks_for(current_user) @accepted_tasks = Task.accepted_tasks_for(current_user)
end end
def new def new
@task = Task.new(current_user_id: current_user.id) @task = Task.new(current_user_id: current_user.id)
end end
def create def create
@task = Task.new(params[:task]) @task = Task.new(params[:task])
if params[:periodic] if params[:periodic]
@ -27,24 +27,25 @@ class TasksController < ApplicationController
render :template => "tasks/new" render :template => "tasks/new"
end end
end end
def show def show
@task = Task.find(params[:id]) @task = Task.find(params[:id])
end end
def edit def edit
@task = Task.find(params[:id]) @task = Task.find(params[:id])
@periodic = !!params[:periodic]
@task.current_user_id = current_user.id @task.current_user_id = current_user.id
if @task.periodic?
flash.now[:alert] = I18n.t('tasks.edit.warning_periodic').html_safe
end
end end
def update def update
@task = Task.find(params[:id]) @task = Task.find(params[:id])
task_group = @task.periodic_task_group
was_periodic = @task.periodic? was_periodic = @task.periodic?
prev_due_date = @task.due_date
@task.attributes=(params[:task]) @task.attributes=(params[:task])
if @task.errors.empty? && @task.save if @task.errors.empty? && @task.save
task_group.update_tasks_including(@task, prev_due_date) if params[:periodic]
flash[:notice] = I18n.t('tasks.update.notice') flash[:notice] = I18n.t('tasks.update.notice')
if was_periodic && !@task.periodic? if was_periodic && !@task.periodic?
flash[:notice] = I18n.t('tasks.update.notice_converted') flash[:notice] = I18n.t('tasks.update.notice_converted')
@ -58,7 +59,7 @@ class TasksController < ApplicationController
render :template => "tasks/edit" render :template => "tasks/edit"
end end
end end
def destroy def destroy
task = Task.find(params[:id]) task = Task.find(params[:id])
# Save user_ids to update apple statistics after destroy # Save user_ids to update apple statistics after destroy
@ -73,7 +74,7 @@ class TasksController < ApplicationController
redirect_to tasks_url, :notice => I18n.t('tasks.destroy.notice') redirect_to tasks_url, :notice => I18n.t('tasks.destroy.notice')
end end
# assign current_user to the task and set the assignment to "accepted" # assign current_user to the task and set the assignment to "accepted"
# if there is already an assignment, only accepted will be set to true # if there is already an assignment, only accepted will be set to true
def accept def accept
@ -85,23 +86,23 @@ class TasksController < ApplicationController
end end
redirect_to user_tasks_path, :notice => I18n.t('tasks.accept.notice') redirect_to user_tasks_path, :notice => I18n.t('tasks.accept.notice')
end end
# deletes assignment between current_user and given task # deletes assignment between current_user and given task
def reject def reject
Task.find(params[:id]).users.delete(current_user) Task.find(params[:id]).users.delete(current_user)
redirect_to :action => "index" redirect_to :action => "index"
end end
def set_done def set_done
Task.find(params[:id]).update_attribute :done, true Task.find(params[:id]).update_attribute :done, true
redirect_to tasks_url, :notice => I18n.t('tasks.set_done.notice') redirect_to tasks_url, :notice => I18n.t('tasks.set_done.notice')
end end
# Shows all tasks, which are already done # Shows all tasks, which are already done
def archive def archive
@tasks = Task.done.page(params[:page]).per(@per_page).order('tasks.updated_on DESC').includes(assignments: :user) @tasks = Task.done.page(params[:page]).per(@per_page).order('tasks.updated_on DESC').includes(assignments: :user)
end end
# shows workgroup (normal group) to edit weekly_tasks_template # shows workgroup (normal group) to edit weekly_tasks_template
def workgroup def workgroup
@group = Group.find(params[:workgroup_id]) @group = Group.find(params[:workgroup_id])

View file

@ -25,6 +25,22 @@ class PeriodicTaskGroup < ActiveRecord::Base
end end
end end
def update_tasks_including(template_task, prev_due_date)
group_tasks = tasks + [template_task]
due_date_delta = template_task.due_date - prev_due_date
tasks.each do |task|
task.update!(name: template_task.name,
description: template_task.description,
duration: template_task.duration,
required_users: template_task.required_users,
workgroup: template_task.workgroup,
due_date: task.due_date + due_date_delta)
end
group_tasks.each do |task|
task.update_columns(periodic_task_group_id: self.id)
end
end
protected protected
# @return [Number] Number of days between two periodic tasks # @return [Number] Number of days between two periodic tasks

View file

@ -1,31 +1,11 @@
- content_for :javascript do = form.hidden_field :current_user_id
:javascript = form.input :name
$(function() { = form.input :description, as: :text, input_html: {rows: 10}
$("#task_user_list").tokenInput("#{users_path(:format => :json)}", { = form.input :duration, :as => :select, :collection => 1..3
crossDomain: false, - unless local_assigns[:periodic]
prePopulate: $("#task_user_list").data("pre"), = form.input :user_list, :as => :string, :input_html => { 'data-pre' => form.object.users.map(&:token_attributes).to_json }
hintText: '#{escape_javascript(t('.search.hint'))}', = form.input :required_users
noResultText: '#{escape_javascript(t('.search.noresult'))}', = form.association :workgroup
searchingText: '#{escape_javascript(t('.search.placeholder'))}', = form.input :due_date, as: :date_picker
theme: 'facebook' - unless local_assigns[:periodic]
}); = form.input :done
});
- content_for :sidebar do
= render "shared/workgroup_members"
= simple_form_for @task do |f|
= f.hidden_field :current_user_id
= f.input :name
= f.input :description, as: :text, input_html: {rows: 10}
= f.input :duration, :as => :select, :collection => 1..3
= f.input :user_list, :as => :string, :input_html => { 'data-pre' => @task.users.map(&:token_attributes).to_json }
= f.input :required_users
= f.association :workgroup
= f.input :due_date, as: :date_picker
= f.input :done
.form-actions
= f.submit class: 'btn btn-primary'
- if @task.new_record?
= f.submit t('.submit.periodic'), name: 'periodic', class: 'btn'
= link_to t('ui.or_cancel'), :back

View file

@ -0,0 +1,15 @@
- content_for :javascript do
:javascript
$(function() {
$("#task_user_list").tokenInput("#{users_path(:format => :json)}", {
crossDomain: false,
prePopulate: $("#task_user_list").data("pre"),
hintText: '#{escape_javascript(t('.search.hint'))}',
noResultText: '#{escape_javascript(t('.search.noresult'))}',
searchingText: '#{escape_javascript(t('.search.placeholder'))}',
theme: 'facebook'
});
});
- content_for :sidebar do
= render "shared/workgroup_members"

View file

@ -1,3 +1,15 @@
- title t('.title') - title @periodic ? t('.title_periodic') : t('.title')
= render 'form' - if @task.periodic? && !@periodic
.alert.alert-info= raw t('tasks.edit.warning_periodic')
= render 'form_sidebar'
= simple_form_for @task do |form|
= render 'form', form: form, periodic: @periodic
.form-actions
- if @periodic
= form.submit t('.submit_periodic'), name: 'periodic', class: 'btn btn-primary'
- else
= form.submit class: 'btn btn-primary'
= link_to t('ui.or_cancel'), :back

View file

@ -1,3 +1,10 @@
- title t('.title') - title t('.title')
= render 'form' = render 'form_sidebar'
= simple_form_for @task do |form|
= render 'form', form: form, periodic: nil
.form-actions
= form.submit class: 'btn btn-primary'
= form.submit t('.submit_periodic'), name: 'periodic', class: 'btn'
= link_to t('ui.or_cancel'), :back

View file

@ -10,7 +10,7 @@
%dd= simple_format(@task.description) %dd= simple_format(@task.description)
- if @task.due_date.present? - if @task.due_date.present?
%dt= heading_helper Task, :due_date %dt= heading_helper Task, :due_date
%dd %dd
= format_date(@task.due_date) = format_date(@task.due_date)
- if @task.periodic? - if @task.periodic?
%i.icon-repeat{title: t('tasks.repeated')} %i.icon-repeat{title: t('tasks.repeated')}
@ -30,8 +30,14 @@
- unless @task.done? - unless @task.done?
= link_to t('.mark_done'), set_done_task_path(@task), method: :post, class: 'btn' = link_to t('.mark_done'), set_done_task_path(@task), method: :post, class: 'btn'
= link_to t('ui.edit'), edit_task_path(@task), class: 'btn' = link_to t('ui.edit'), edit_task_path(@task), class: 'btn'
= link_to t('ui.delete'), task_path(@task), :method => :delete, :data => {:confirm => t('.confirm_delete_single')},
class: 'btn btn-danger'
- if @task.periodic? - if @task.periodic?
= link_to t('.delete_group'), task_path(@task, periodic: true), method: :delete, = link_to edit_task_path(@task, periodic: true), class: 'btn' do
:data => {confirm: t('.confirm_delete_group')}, class: 'btn btn-danger' %i.icon.icon-repeat
= t('.edit_group')
= link_to t('ui.delete'), task_path(@task), method: :delete, class: 'btn btn-danger',
data: {confirm: @task.periodic? ? t('.confirm_delete_single_from_group') : t('.confirm_delete_single')}
- if @task.periodic?
= link_to task_path(@task, periodic: true), method: :delete, class: 'btn btn-danger',
data: {confirm: t('.confirm_delete_group')} do
%i.icon.icon-repeat
= t('.delete_group')

View file

@ -1624,6 +1624,8 @@ en:
notice: Task has been deleted notice: Task has been deleted
edit: edit:
title: Edit task title: Edit task
title_periodic: Edit recurring task
submit_periodic: Save recurring task
warning_periodic: "<strong>Warning:</strong> This task is part of a group of <em>recurring tasks</em>. When saving it will be excluded from the group and it will be converted to a <em>regular task</em>." warning_periodic: "<strong>Warning:</strong> This task is part of a group of <em>recurring tasks</em>. When saving it will be excluded from the group and it will be converted to a <em>regular task</em>."
error_not_found: No workgroup found error_not_found: No workgroup found
form: form:
@ -1654,6 +1656,7 @@ en:
pages: Pages pages: Pages
new: new:
title: Create new task title: Create new task
submit_periodic: Create recurring task
repeated: Task is recurring repeated: Task is recurring
set_done: set_done:
notice: The state of the task has been updated notice: The state of the task has been updated
@ -1661,7 +1664,9 @@ en:
accept_task: Accept task accept_task: Accept task
confirm_delete_group: Really delete this and all subsequent tasks? confirm_delete_group: Really delete this and all subsequent tasks?
confirm_delete_single: Are you sure you want to delete the task? confirm_delete_single: Are you sure you want to delete the task?
confirm_delete_single_from_group: Are you sure you want to delete this task (and keep related recurring tasks)?
delete_group: Delete task and subsequent delete_group: Delete task and subsequent
edit_group: Edit recurring
hours: "%{count}h" hours: "%{count}h"
mark_done: Mark task as done mark_done: Mark task as done
reject_task: Reject task reject_task: Reject task