Merge branch 'feature/edit-recurring-task'
Conflicts: config/locales/en.yml
This commit is contained in:
commit
ec03d579d0
8 changed files with 97 additions and 55 deletions
|
@ -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])
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
15
app/views/tasks/_form_sidebar.html.haml
Normal file
15
app/views/tasks/_form_sidebar.html.haml
Normal 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"
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue