Improved tasks.

This commit is contained in:
benni 2012-10-08 21:52:03 +02:00
parent 52e62f8ddb
commit acdb331e36
29 changed files with 1186 additions and 198 deletions

View file

@ -3,6 +3,8 @@
//= require jquery_ujs
//= require twitter/bootstrap
//= require jquery.tokeninput
//= require bootstrap-datepicker
//= require bootstrap-datepicker.de
//= require jquery.observe_field
//= require jquery.fancybox-1.3.4.pack
//= require rails.validations
@ -91,6 +93,9 @@ $(function() {
$('form[data-remote]').bind('ajax:beforeSend', function() {
$(this).children('input[type="submit"]').attr('disabled', 'disabled');
});
// Use bootstrap datepicker for dateinput
$('.datepicker').datepicker({format: 'yyyy-mm-dd', weekStart: 1, language: 'de'});
});

View file

@ -1,6 +1,5 @@
/*
*= require bootstrap_and_overrides
*= require foodsoft
*= require token-input-bootstrappy
*= require jquery.fancybox-1.3.4
*/

View file

@ -30,3 +30,10 @@ body {
//
// Example:
// @linkColor: #ff0000;
// Bootstrap datepicker
@import "datepicker";
// Custom styles
@import "foodsoft";

View file

@ -0,0 +1,147 @@
/*!
* Datepicker for Bootstrap
*
* Copyright 2012 Stefan Petre
* Improvements by Andrew Rowls
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
.datepicker {
top: 0;
left: 0;
padding: 4px;
margin-top: 1px;
.border-radius(4px);
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0,0,0,.2);
position: absolute;
top: -7px;
left: 6px;
}
&:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid @white;
position: absolute;
top: -6px;
left: 7px;
}
>div {
display: none;
}
&.days div.datepicker-days {
display: block;
}
&.months div.datepicker-months {
display: block;
}
&.years div.datepicker-years {
display: block;
}
table{
margin: 0;
}
td,
th{
text-align: center;
width: 20px;
height: 20px;
.border-radius(4px);
}
td {
&.day:hover {
background: @grayLighter;
cursor: pointer;
}
&.old,
&.new {
color: @grayLight;
}
&.disabled,
&.disabled:hover {
background: none;
color: @grayLight;
cursor: default;
}
&.today,
&.today:hover,
&.today.disabled,
&.today.disabled:hover {
@todayBackground: lighten(@orange, 30%);
.buttonBackground(@todayBackground, spin(@todayBackground, 20));
}
&.active,
&.active:hover,
&.active.disabled,
&.active.disabled:hover {
.buttonBackground(@btnPrimaryBackground, spin(@btnPrimaryBackground, 20));
color: #fff;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
}
span {
display: block;
width: 23%;
height: 54px;
line-height: 54px;
float: left;
margin: 1%;
cursor: pointer;
.border-radius(4px);
&:hover {
background: @grayLighter;
}
&.disabled,
&.disabled:hover {
background:none;
color: @grayLight;
cursor: default;
}
&.active,
&.active:hover,
&.active.disabled,
&.active.disabled:hover {
.buttonBackground(@btnPrimaryBackground, spin(@btnPrimaryBackground, 20));
color: #fff;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
}
&.old {
color: @grayLight;
}
}
}
th.switch {
width: 145px;
}
thead tr:first-child th,
tfoot tr:first-child th {
cursor: pointer;
&:hover{
background: @grayLighter;
}
}
/*.dow {
border-top: 1px solid #ddd !important;
}*/
}
.input-append,
.input-prepend {
&.date {
.add-on i {
display: block;
cursor: pointer;
width: 16px;
height: 16px;
}
}
}

View file

@ -2,4 +2,12 @@ section {
padding-bottom: 30px;
margin-bottom: 30px;
border-bottom: 1px solid #d3d3d3;
}
.accepted {
color: #468847;
}
.unaccepted {
color: #B94A48;
}

View file

@ -72,14 +72,14 @@ class TasksController < ApplicationController
redirect_to :action => "index"
end
def update_status
Task.find(params[:id]).update_attribute("done", params[:task][:done])
def set_done
Task.find(params[:id]).update_attribute :done, true
redirect_to tasks_url, :notice => "Aufgabenstatus wurde aktualisiert"
end
# Shows all tasks, which are already done
def archive
@tasks = Task.done.paginate :page => params[:page], :per_page => 30
@tasks = Task.done.page(params[:page]).per(@per_page)
end
# shows workgroup (normal group) to edit weekly_tasks_template

View file

@ -10,7 +10,8 @@ module TasksHelper
def highlighted_required_users(task)
unless task.enough_users_assigned?
still_required = task.required_users - task.assignments.select { |ass| ass.accepted }.size
"<small style='color:red;font-weight:bold'>(#{still_required})</small>".html_safe
content_tag :span, still_required, class: 'badge badge-important',
title: "Es fehlen #{still_required} Mitstreiterinnen!"
end
end
end

View file

@ -0,0 +1,5 @@
class DatePickerInput < SimpleForm::Inputs::StringInput
def input
@builder.text_field(attribute_name, input_html_options.merge({class: 'datepicker'}))
end
end

View file

@ -37,8 +37,7 @@
- unless Message.public.empty?
%section
%h2 Neuste Nachrichten
= render :partial => 'messages/messages',
:locals => {:messages => Message.public.order('created_at DESC').limit(5), :subject_length => 70}
= render 'messages/messages', messages: Message.public.order('created_at DESC').limit(5), pagination: false
%p= link_to "Alle Nachrichten einsehen", messages_path
- if current_user.ordergroup

View file

@ -1,13 +1,14 @@
- if Message.public.count > 20
= items_per_page
= pagination_links_remote messages
- if pagination
- if Message.public.count > 20
= items_per_page
= pagination_links_remote messages
- unless messages.empty?
%table.table.table-striped
%tbody
- for message in messages
%tr
%td= format_subject(message, subject_length)
%td= format_subject(message, 130)
%td= h(message.sender_name)
%td= format_time(message.created_at)
%td= link_to 'Antworten', new_message_path(:message => {:reply_to => message.id}), class: 'btn'

View file

@ -2,4 +2,4 @@
= link_to 'Neue Nachricht', new_message_path, class: 'btn btn-primary'
#messages
= render :partial => 'messages', :locals => { :messages => @messages, :subject_length => 130 }
= render 'messages', messages: @messages, pagination: true

View file

@ -1,6 +1,14 @@
- for workgroup in Workgroup.all
%h4= link_to workgroup.name, "#", 'data-toggle-this' => "#workgroup_#{workgroup.id}"
%ul{:style => "display:none"}[workgroup]
- for user in workgroup.users.order("nick")
%li= "#{user.nick} (#{user.ordergroup.try(:name)})"
.well.well-small
%h4 Mitglieder der Gruppen
#groupMembers.accordion
- Workgroup.all.each do |workgroup|
.accordion-group
.accoridon-heading
= link_to workgroup.name, "#collapse#{workgroup.id}", data: {toggle: 'collapse', parent: '#groupMembers'}
%div{id: "collapse#{workgroup.id}", class: 'accordion-body collapse'}
.accordion-inner
%ul.unstyled
- workgroup.users.includes(:groups).order('nick').each do |user|
%li
= user.nick
%small (#{user.ordergroup.try(:name)})

View file

@ -0,0 +1,19 @@
- if Task.done.count > 20
= items_per_page
= pagination_links_remote @tasks
%table.table.table-striped
%thead
%tr
%th Fälligkeitsdatum
%th Betreff
%th Verantwortliche Menschen
%th
%tbody
- @tasks.each do |task|
%tr
%td= task.due_date unless task.due_date.nil?
%td= link_to "#{task.name} (#{task.duration}h)", :controller => "tasks", :action => "show", :id => task
%td
- unless task.users.empty?
= task.users.map(&:nick).join(", ")

View file

@ -1,4 +1,4 @@
- content_for :head do
- content_for :javascript do
:javascript
$(function() {
$("#task_user_list").tokenInput("#{users_path(:format => :json)}", {
@ -6,10 +6,14 @@
prePopulate: $("#task_user_list").data("pre"),
hintText: 'Nach Nutzerin suchen',
noResultText: 'Keine Nutzerin gefunden',
searchingText: 'Suche ...'
searchingText: 'Suche ...',
theme: 'facebook'
});
});
- content_for :sidebar do
= render "shared/workgroup_members"
= simple_form_for @task do |f|
= f.input :name
= f.input :description, as: :text, input_html: {rows: 10}
@ -17,5 +21,8 @@
= f.input :user_list, :as => :string, :input_html => { 'data-pre' => @task.users.map { |u| u.token_attributes }.to_json }
= f.input :required_users
= f.association :workgroup
= f.input :due_date, :include_blank => true
= f.submit
= f.input :due_date, as: :date_picker
= f.input :done
.form-actions
= f.submit class: 'btn'
= link_to 'oder abbrechen', :back

View file

@ -1,25 +1,29 @@
%table
%tr
%th Fälligkeit
%th Betreff
%th{:colspan => '2'}
Wer machts?
%small (Wie viele werden noch benötigt?)
- for task in @tasks
- done = task.done ? " done" : ""
%tr{:class => cycle('even','odd', :name => "tasks") + done }
%td= format_date(task.due_date) unless task.due_date.nil?
%td= link_to "#{task.name} (#{task.duration}h)", task_path(task)
%td
= task_assignments task
= highlighted_required_users task
%td
- unless task.is_accepted?(@current_user)
%span{:style => "float:left"}= button_to "Aufgabe übernehmen", :controller => "tasks", :action => "accept", :id => task
= button_to "Aufgabe ablehnen", :controller => "tasks", :action => "reject", :id => task if task.is_assigned?(@current_user)
- else
- form_for :task, :url => {:action => "update_status", :id => task} do |f|
Erledigt?
= f.check_box :done, {:onchange => "submit()", :title => "Die Aufgabe wandert in das Archiv"}
= "Erledigt" if task.done
- reset_cycle("tasks")
%table.table.table-striped
%thead
%tr
%th Fälligkeit
%th Betreff
%th{:colspan => '2'}
Wer machts?
%small (Wie viele werden noch benötigt?)
%tbody
- tasks.each do |task|
- done = task.done ? " done" : ""
%tr{:class => done }
%td= format_date(task.due_date) unless task.due_date.nil?
%td= link_to "#{task.name} (#{task.duration}h)", task_path(task)
%td
= task_assignments task
= highlighted_required_users task
%td
- if !task.is_accepted?(current_user)
= link_to "Aufgabe übernehmen", accept_task_path(task), method: :post, class: 'btn'
= link_to "Aufgabe ablehnen", reject_task_path(task), method: :post, class: 'btn' if task.is_assigned?(current_user)
- elsif !task.done
= link_to set_done_task_path(task), method: :post, class: 'btn',
title: 'Aufgabe als erledigt markieren' do
%i.icon-ok
Erledigt?
- else
%i.icon-ok
Erledigt

View file

@ -1,19 +1,10 @@
#start_nav{:style => "float:right"}
%h2 Aufgabenmenü
%ul
%li
Aktionen
%ul
%li= link_to "Neue Aufgabe erstellen", :action => "new"
%li
Seiten
%ul
%li= link_to "Meine Aufgaben", user_tasks_path
%li= link_to "Alle Aufgaben", tasks_path
%li= link_to "Erledigt Aufgaben (Archiv)", archive_tasks_path
%li
Gruppenaufgaben
%ul
- for group in Workgroup.all
%li= link_to group.name, workgroup_tasks_path(workgroup_id: group.id)
%p= link_to "Neue Aufgabe erstellen", new_task_path, class: 'btn btn-primary'
.well.well-small
%ul.nav.nav-list
%li.nav-header Seiten
%li= link_to "Meine Aufgaben", user_tasks_path
%li= link_to "Alle Aufgaben", tasks_path
%li= link_to "Erledigte Aufgaben (Archiv)", archive_tasks_path
%li.nav-header Gruppenaufgaben
- for group in Workgroup.all
%li= link_to group.name, workgroup_tasks_path(workgroup_id: group.id)

View file

@ -1,20 +1,5 @@
- title "Aufgabenarchiv"
= render :partial => "nav"
- content_for :sidebar do
= render 'nav'
= will_paginate @orders
%br/
%table{:style => "width: 76%"}
%tr
%th Fälligkeitsdatum
%th Betreff
%th Verantwortliche Menschen
%th
- for task in @tasks
%tr{:class => cycle('even','odd')}
%td= task.due_date unless task.due_date.nil?
%td= link_to "#{task.name} (#{task.duration}h)", :controller => "tasks", :action => "show", :id => task
%td
- unless task.users.empty?
= task.users.map(&:nick).join(", ")
%p
= link_to_top
#tasks= render 'archive_tasks'

View file

@ -0,0 +1 @@
$('#tasks').html('<%= escape_javascript(render("archive_tasks")) %>');

View file

@ -1,8 +1,3 @@
- title "Aufgabe bearbeiten"
#form{:style => "float:left; width:39em"}
= render('form')
#workgroup_members{:style => "padding-left:41em"}
%h3 Mitglieder der Gruppe
#list
= render :partial => "shared/workgroup_members"
= render 'form'

View file

@ -1,21 +1,19 @@
- title "Aufgabenübersicht"
= render :partial => "nav"
- title "Aufgaben"
- content_for :sidebar do
= render 'nav'
- unless @non_group_tasks.empty?
.left_column{:style => "width:75%"}
- @tasks = @non_group_tasks
.box_title
%h2 Aufgaben für alle!
.column_content
= render :partial => "list"
%section
%h3 Aufgaben für alle!
= render 'list', tasks: @non_group_tasks
- for @group in @groups
- @tasks = @group.open_tasks
- unless @tasks.empty?
.left_column{:style => "width:75%"}
.box_title
%h2= link_to @group.name, :action => 'workgroup', :id => @group
.column_content
= render :partial => "list"
- for group in @groups
- tasks = group.open_tasks
- unless tasks.empty?
%section
%h3
= group.name
%small= link_to "Gruppenaufgaben anzeigen", workgroup_tasks_path(group)
= render 'list', tasks: tasks
= link_to_top

View file

@ -1,10 +1,3 @@
- title "Neue Aufgabe erstellen"
#form{:style => "float:left; width:39em"}
= render('form')
#workgroup_members{:style => "padding-left:41em"}
%h3 Mitglieder der Arbeitsgruppen
%i Klicke auf den Gruppennamen um die Mitglieder zu sehen
#list
= render :partial => "shared/workgroup_members"
= render 'form'

View file

@ -1,38 +1,27 @@
- title "Aufgabe im Detail"
= render :partial => "nav"
- content_for :sidebar do
= render 'nav'
%section
%dl.dl-horizontal
%dt Name
%dd= @task.name
%dt Beschreibung
%dd= simple_format(@task.description)
%dt Fälligkeitsdatum
%dd= format_date(@task.due_date)
%dt Dauer in Stunden
%dd= @task.duration
%dt Verantwortliche Menschen
%dd= task_assignments(@task)
%dt Arbeitsgruppe
%dd
- if @task.workgroup
= link_to @task.workgroup.name, workgroup_tasks_path(workgroup_id: @task.workgroup_id)
#task{:style => 'width:70%'}
%table
%tr
%td{:style => "width: 10em"} Name
%td
%b= @task.name
%tr
%td{:style => "vertical-align:top;"} Beschreibung
%td= simple_format(@task.description)
%tr
%td Fälligkeitsdatum
%td= format_date(@task.due_date)
%tr
%td Dauer in Stunden
%td= @task.duration
%tr
%td Verantwortliche Menschen
%td= task_assignments(@task)
%tr
%td Arbeitsgruppe
%td
- if @task.workgroup
= link_to @task.workgroup.name, workgroup_tasks_path(workgroup_id: @task.workgroup_id)
%tr
%td{:colspan => "2"}
%div{:style => "float:left"} Als erledigt markieren
- form_for :task, :url => {:action => "update_status", :id => @task} do |f|
= f.check_box :done, {:onchange => "submit()", :title => "Die Aufgabe wandert in das Archiv"}
%p
= link_to "Bearbeiten", edit_task_path(@task)
|
= link_to "Löschen", task_path(@task), :method => :delete, :confirm => "Die Aufgabe wirklich löschen?"
- unless @task.done?
= link_to 'Als erledigt markieren', set_done_task_path(@task), method: :post, class: 'btn'
= link_to "Bearbeiten", edit_task_path(@task), class: 'btn'
= link_to "Löschen", task_path(@task), :method => :delete, :confirm => "Die Aufgabe wirklich löschen?",
class: 'btn btn-danger'

View file

@ -1,27 +1,20 @@
- title "Meine Aufgaben"
= render :partial => "nav"
- content_for :sidebar do
= render 'nav'
- unless @unaccepted_tasks.empty?
%section
%h3 Offene Aufgaben
= render 'list', tasks: @unaccepted_tasks
%section
%h3 Anstehende Aufgaben
- unless @accepted_tasks.empty?
= render 'list', tasks: @accepted_tasks
- else
Nichts zu tun?
= link_to "Hier", tasks_path
gibt es bestimmt Arbeit.
%br/
= link_to_top
- @tasks = @unaccepted_tasks
- unless @tasks.empty?
.left_column{:style => "width:75%"}
.box_title
%h2 Offene Aufgaben
.column_content
= render :partial => "list"
.left_column{:style => "width:75%"}
.box_title
%h2 Anstehende Aufgaben
.column_content
- @tasks = @accepted_tasks
- unless @tasks.empty?
= render :partial => "list"
- else
Nichts zu tun?
= link_to "Hier", :action => "index"
gibt es bestimmt Arbeit.
%br/
= link_to_top

View file

@ -1,27 +1,22 @@
%h1
Aufgaben verwalten für
= @group.name
= render :partial => "nav"
- title "Aufgaben für #{@group.name}"
- content_for :sidebar do
= render 'nav'
.left_column{:style => "width:45em"}
.box_title
%h2 Wöchentliche Aufgaben verwalten
.column_content
- if @group.weekly_task
%p Jeden <b>#{weekday(@group.weekday)}</b> hat diese Arbeitsgruppe folgenden Job: <b>#{@group.task_name}</b>
%p Die Wochenaufgaben werden von der Foodsoft automatisch erstellt. Eintragen müsst Ihr Euch aber selber.
- else
Noch keine Wochenaufgaben angelegt.
- if @current_user.member_of?(@group) or @current_user.role_admin?
= link_to "Wochenaufgaben bearbeiten", edit_foodcoop_workgroup_path(@group)
%section.well
%h3 Wöchentliche Aufgaben
- if @group.weekly_task
%p Jeden <b>#{weekday(@group.weekday)}</b> hat diese Arbeitsgruppe folgenden Job: <b>#{@group.task_name}</b>
%p Die Wochenaufgaben werden von der Foodsoft automatisch erstellt. Eintragen müsst Ihr Euch aber selber.
- else
Noch keine Wochenaufgaben angelegt.
.left_column{:style => "width:75%"}
.box_title
%h2 Alle Aufgaben der Gruppe
.column_content
- @tasks = @group.open_tasks
= render :partial => "list"
%br/
= link_to_top
- if @current_user.member_of?(@group) or @current_user.role_admin?
= link_to "Wöchentliche Aufgaben anpassen", edit_foodcoop_workgroup_path(@group), class: 'btn'
%section
%h3 Alle Aufgaben der Gruppe
= render 'list', tasks: @group.open_tasks
%br/
= link_to_top