Initial import of tasks application
This initial import is a heavily modified version of the code I had here, as Arse was modified for other purposes in the meantime and the application no longer worked with it. In addition: * I did not import the user management part yet, * task dependencies are supported in-base, but there is no interface for that yet.
This commit is contained in:
commit
9677ad4dd3
36 changed files with 3919 additions and 0 deletions
309
includes/t-tasks/controllers.inc.php
Normal file
309
includes/t-tasks/controllers.inc.php
Normal file
|
@ -0,0 +1,309 @@
|
|||
<?php
|
||||
|
||||
|
||||
class Ctrl_AddTask
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$item = $this->form->field( 'item' );
|
||||
$name = $this->form->field( 'title' );
|
||||
$priority = $this->form->field( 'priority' );
|
||||
$description = $this->form->field( 'description' );
|
||||
|
||||
$error = Loader::DAO( 'tasks' )->addTask( (int) $item->value( ) , $name->value( ) ,
|
||||
(int) $priority->value( ) , $description->value( ) );
|
||||
switch ( $error ) {
|
||||
|
||||
case 0:
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
$name->putError( 'Duplicate task name for this item.' );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
$item->putError( 'This item has been deleted' );
|
||||
break;
|
||||
|
||||
default:
|
||||
$name->putError( "An unknown error occurred ($error)" );
|
||||
break;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_TaskDetails
|
||||
extends Controller
|
||||
{
|
||||
private $task;
|
||||
|
||||
public function __construct( $task )
|
||||
{
|
||||
$this->task = $task;
|
||||
}
|
||||
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
if ( $this->task->completed_at !== null ) {
|
||||
$bTitle = "Completed task";
|
||||
} else {
|
||||
$bTitle = "Active task";
|
||||
}
|
||||
$items = Loader::DAO( 'items' );
|
||||
$items->getLineage( $this->task->item = $items->get( $this->task->item ) );
|
||||
|
||||
$box = Loader::View( 'box' , $bTitle , Loader::View( 'task_details' , $this->task ) );
|
||||
if ( $this->task->completed_by === null ) {
|
||||
$box->addButton( BoxButton::create( 'Edit task' , 'tasks/edit?id=' . $this->task->id )
|
||||
->setClass( 'icon edit' ) )
|
||||
->addButton( BoxButton::create( 'Mark as completed' ,
|
||||
'tasks/finish?id=' . $this->task->id )
|
||||
->setClass( 'icon stop' ) );
|
||||
} else {
|
||||
$box->addButton( BoxButton::create( 'Re-activate' , 'tasks/restart?id=' . $this->task->id )
|
||||
->setClass( 'icon start' ) );
|
||||
$timestamp = strtotime( $this->task->completed_at );
|
||||
}
|
||||
|
||||
if ( Loader::DAO( 'tasks' )->canDelete( $this->task ) ) {
|
||||
$box->addButton( BoxButton::create( 'Delete' , 'tasks/delete?id=' . $this->task->id )
|
||||
->setClass( 'icon delete' ) );
|
||||
}
|
||||
|
||||
return $box;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_TaskNotes
|
||||
extends Controller
|
||||
{
|
||||
private $task;
|
||||
|
||||
public function __construct( $task )
|
||||
{
|
||||
$this->task = $task;
|
||||
}
|
||||
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$result = array( );
|
||||
foreach ( $this->task->notes as $note ) {
|
||||
$box = Loader::View( 'box' , null , Loader::View( 'task_note' , $note ) );
|
||||
if ( $this->task->completed_at === null && $note->uid == $_SESSION[ 'uid' ] ) {
|
||||
$box->addButton( BoxButton::create( 'Edit comment' , 'tasks/notes/edit?id=' . $note->id )
|
||||
->setClass( 'icon edit' ) )
|
||||
->addButton( BoxButton::create( 'Delete comment' , 'tasks/notes/delete?id=' . $note->id )
|
||||
->setClass( 'icon delete' ) );
|
||||
}
|
||||
array_push( $result , $box );
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_DeleteTask
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
Loader::DAO( 'tasks' )->delete( (int) $this->form->field( 'id' )->value( ) );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_ToggleTask
|
||||
extends Controller
|
||||
{
|
||||
private $restart;
|
||||
|
||||
public function __construct( $restart )
|
||||
{
|
||||
$this->isRestart = $restart;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected task
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' , 'GET' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
$tasks = Loader::DAO( 'tasks' );
|
||||
$task = $tasks->get( $id );
|
||||
if ( $task === null ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
if ( $this->isRestart ) {
|
||||
$tasks->restart( $id , '[AUTO] Task re-activated.' );
|
||||
} else {
|
||||
$tasks->finish( $id , '[AUTO] Task completed.' );
|
||||
}
|
||||
|
||||
return 'tasks/view?id=' . $id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_EditTask
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$id = $this->form->field( 'id' );
|
||||
$item = $this->form->field( 'item' );
|
||||
$name = $this->form->field( 'title' );
|
||||
$priority = $this->form->field( 'priority' );
|
||||
$description = $this->form->field( 'description' );
|
||||
|
||||
$error = Loader::DAO( 'tasks' )->updateTask( (int) $id->value( ) ,
|
||||
(int) $item->value( ) , $name->value( ) ,
|
||||
(int) $priority->value( ) , $description->value( ) );
|
||||
|
||||
switch ( $error ) {
|
||||
|
||||
case 0:
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
$name->putError( "Une tâche porte déjà ce nom à cet endroit" );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
$item->putError( "Cet endroit a été supprimé" );
|
||||
break;
|
||||
|
||||
default:
|
||||
$name->putError( "Une erreur inconnue s'est produite ($error)" );
|
||||
break;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_AddTaskNoteForm
|
||||
extends Controller
|
||||
{
|
||||
private $task;
|
||||
|
||||
public function __construct( $task )
|
||||
{
|
||||
$this->task = $task;
|
||||
}
|
||||
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
return Loader::Create( 'Form' , 'Add' , 'add-note' , 'Add a comment' )
|
||||
->setSuccessURL( 'tasks/view?id=' . $this->task->id )
|
||||
->setAction( '?id=' . $this->task->id . '#add-note-form' )
|
||||
->addField( Loader::Create( 'Field' , 'text' , 'textarea' )
|
||||
->setDescription( 'Comment:' )
|
||||
->setValidator( Loader::Create( 'Validator_StringLength' , 'This comment' , 5 ) ) )
|
||||
->addController( Loader::Ctrl( 'add_task_note' , $this->task ) )
|
||||
->controller( );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_AddTaskNote
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $task;
|
||||
private $form;
|
||||
|
||||
public function __construct( $task )
|
||||
{
|
||||
$this->task = $task;
|
||||
}
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
Loader::DAO( 'tasks' )->addNote( $this->task->id , $this->form->field( 'text' )->value( ) );
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_DeleteNote
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
Loader::DAO( 'tasks' )->deleteNote( (int) $this->form->field( 'id' )->value( ) );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_EditNote
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$id = (int) $this->form->field( 'id' )->value( );
|
||||
$text = $this->form->field( 'text' )->value( );
|
||||
Loader::DAO( 'tasks' )->updateNote( $id , $text );
|
||||
return true;
|
||||
}
|
||||
}
|
35
includes/t-tasks/package.inc.php
Normal file
35
includes/t-tasks/package.inc.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
$package[ 'requires' ][] = 'form';
|
||||
$package[ 'requires' ][] = 't-data';
|
||||
$package[ 'requires' ][] = 't-basics';
|
||||
|
||||
$package[ 'files' ][] = 'controllers';
|
||||
$package[ 'files' ][] = 'page_controllers';
|
||||
$package[ 'files' ][] = 'pages';
|
||||
$package[ 'files' ][] = 'views';
|
||||
|
||||
$package[ 'ctrls' ][] = 'all_tasks';
|
||||
$package[ 'ctrls' ][] = 'add_task_form';
|
||||
$package[ 'ctrls' ][] = 'add_task';
|
||||
$package[ 'ctrls' ][] = 'add_task_note_form';
|
||||
$package[ 'ctrls' ][] = 'add_task_note';
|
||||
$package[ 'ctrls' ][] = 'delete_note_form';
|
||||
$package[ 'ctrls' ][] = 'delete_note';
|
||||
$package[ 'ctrls' ][] = 'delete_task_form';
|
||||
$package[ 'ctrls' ][] = 'delete_task';
|
||||
$package[ 'ctrls' ][] = 'edit_note_form';
|
||||
$package[ 'ctrls' ][] = 'edit_note';
|
||||
$package[ 'ctrls' ][] = 'edit_task_form';
|
||||
$package[ 'ctrls' ][] = 'edit_task';
|
||||
$package[ 'ctrls' ][] = 'task_details';
|
||||
$package[ 'ctrls' ][] = 'task_notes';
|
||||
$package[ 'ctrls' ][] = 'toggle_task';
|
||||
$package[ 'ctrls' ][] = 'view_task';
|
||||
|
||||
$package[ 'views' ][] = 'all_tasks';
|
||||
$package[ 'views' ][] = 'tasks';
|
||||
$package[ 'views' ][] = 'task_details';
|
||||
$package[ 'views' ][] = 'task_note';
|
||||
|
||||
$package[ 'pages' ][] = 'tasks_tasks';
|
352
includes/t-tasks/page_controllers.inc.php
Normal file
352
includes/t-tasks/page_controllers.inc.php
Normal file
|
@ -0,0 +1,352 @@
|
|||
<?php
|
||||
|
||||
class Ctrl_AllTasks
|
||||
extends Controller
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
try {
|
||||
$mode = $this->getParameter( 'mode' , 'GET' );
|
||||
} catch ( ParameterException $e ) {
|
||||
$mode = 'active';
|
||||
}
|
||||
|
||||
if ( $mode == 'active' ) {
|
||||
$tasks = Loader::DAO( 'tasks' )->getAllActiveTasks( );
|
||||
$title = 'Active tasks';
|
||||
$bTitle = 'Display all tasks';
|
||||
$bMode = 'all';
|
||||
} else {
|
||||
$mode = 'all';
|
||||
$tasks = Loader::DAO( 'tasks' )->getAllTasks( );
|
||||
$title = 'All tasks';
|
||||
$bTitle = 'Display active tasks only';
|
||||
$bMode = 'active';
|
||||
}
|
||||
|
||||
$tree = Loader::DAO( 'items' )->getTree( );
|
||||
$box = Loader::View( 'box' , $title , Loader::View( 'all_tasks' , $tasks , $mode ) )
|
||||
->addButton( BoxButton::create( $bTitle , 'tasks?mode=' . $bMode )
|
||||
->setClass( 'icon refresh' ) );
|
||||
if ( !empty( $tree ) ) {
|
||||
$box ->addButton( BoxButton::create( 'New task' , 'tasks/add' )
|
||||
->setClass( 'list-add' ) );
|
||||
}
|
||||
return $box;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
abstract class Ctrl_TaskFormBase
|
||||
extends Controller
|
||||
{
|
||||
|
||||
protected final function createPrioritySelector( )
|
||||
{
|
||||
$select = Loader::Create( 'Field' , 'priority' , 'select' )
|
||||
->setDescription( 'Priority:' )
|
||||
->setValidator( Loader::Create( 'Validator_IntValue' , 'Priorité invalide' )
|
||||
->setMinValue( 1 )->setMaxValue( 5 ) );
|
||||
$tasks = Loader::DAO( 'tasks' );
|
||||
|
||||
for ( $i = 5 ; $i >= 1 ; $i -- ) {
|
||||
$select->addOption( $i , $tasks->translatePriority( $i ) );
|
||||
}
|
||||
|
||||
return $select;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
class Ctrl_AddTaskForm
|
||||
extends Ctrl_TaskFormBase
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
try {
|
||||
$target = (int) $this->getParameter( 'to' );
|
||||
} catch ( ParameterException $e ) {
|
||||
$target = null;
|
||||
}
|
||||
|
||||
$form = Loader::Create( 'Form' , 'Add this task' , 'create-task' );
|
||||
|
||||
if ( $target === null ) {
|
||||
$returnURL = 'tasks';
|
||||
if ( ! $this->addItemSelector( $form ) ) {
|
||||
return 'items';
|
||||
}
|
||||
} else {
|
||||
$item = Loader::DAO( 'items' )->get( $target );
|
||||
if ( $item === null ) {
|
||||
return 'items';
|
||||
}
|
||||
$returnURL = 'items/view?id=' . $target;
|
||||
|
||||
$form->addField( Loader::Create( 'Field' , 'to' , 'hidden' )
|
||||
->setDefaultValue( $target ) )
|
||||
->addField( Loader::Create( 'Field' , 'item' , 'hidden' )
|
||||
->setDefaultValue( $target ) );
|
||||
}
|
||||
|
||||
$page->setTitle( 'New task' );
|
||||
|
||||
return $form->addField( Loader::Create( 'Field' , 'title' , 'text' )
|
||||
->setDescription( 'Task title:' )
|
||||
->setModifier( Loader::Create( 'Modifier_TrimString' ) )
|
||||
->setValidator( Loader::Create( 'Validator_StringLength' , 'This title' , 5 , 256 ) ) )
|
||||
->addField( $this->createPrioritySelector( )
|
||||
->setDefaultValue( 3 ) )
|
||||
->addField( Loader::Create( 'Field' , 'description' , 'textarea' )
|
||||
->setDescription( 'Description:' )
|
||||
->setMandatory( false ) )
|
||||
->setURL( $returnURL )
|
||||
->addController( Loader::Ctrl( 'add_task' ) )
|
||||
->controller( );
|
||||
}
|
||||
|
||||
|
||||
private function addItemSelector( $form )
|
||||
{
|
||||
$form->addField( $select = Loader::Create( 'Field' , 'item' , 'select' )
|
||||
->setDescription( 'Item:' )
|
||||
->addOption( '' , '(please select an item)' ) );
|
||||
|
||||
$items = Loader::DAO( 'items' )->getTreeList( );
|
||||
if ( empty( $items ) ) {
|
||||
return false;
|
||||
}
|
||||
foreach ( $items as $item ) {
|
||||
$name = '-' . str_repeat( '--' , $item->depth ) . ' ' . $item->name;
|
||||
$select->addOption( $item->id , $name );
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_ViewTask
|
||||
extends Controller
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' , 'GET' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
$task = Loader::DAO( 'tasks' )->get( $id );
|
||||
if ( $task === null ) {
|
||||
return 'tasks';
|
||||
}
|
||||
$page->setTitle( $task->title . ' (task)' );
|
||||
|
||||
$result = array( Loader::Ctrl( 'task_details' , $task ) );
|
||||
|
||||
if ( $task->completed_by === null ) {
|
||||
array_push( $result , Loader::Ctrl( 'add_task_note_form' , $task ) );
|
||||
}
|
||||
|
||||
array_push( $result , Loader::Ctrl( 'task_notes' , $task ) );
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_DeleteTaskForm
|
||||
extends Controller
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected task
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
$tasks = Loader::DAO( 'tasks' );
|
||||
$task = $tasks->get( $id );
|
||||
if ( $task === null ) {
|
||||
return 'tasks';
|
||||
}
|
||||
if ( ! $tasks->canDelete( $task ) ) {
|
||||
return 'tasks/view?id=' . $id;
|
||||
}
|
||||
$page->setTitle( $task->title . ' (task)' );
|
||||
|
||||
// Generate confirmation text
|
||||
$confText = HTML::make( 'div' )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( "You are about to delete this task, and any comment attached to it." ) )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( "This operation cannot be undone." ) );
|
||||
|
||||
// Generate form
|
||||
return Loader::Create( 'Form' , 'Delete the task' , 'delete-task' , 'Task deletion' )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )
|
||||
->setDefaultValue( $task->id ) )
|
||||
->addField( Loader::Create( 'Field' , 'confirm' , 'html' )->setDefaultValue( $confText ) )
|
||||
->setCancelURL( 'tasks/view?id=' . $task->id )
|
||||
->setSuccessURL( 'items/view?id=' . $task->item )
|
||||
->addController( Loader::Ctrl( 'delete_task' ) )
|
||||
->controller( );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
class Ctrl_EditTaskForm
|
||||
extends Ctrl_TaskFormBase
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
$task = Loader::DAO( 'tasks' )->get( $id );
|
||||
if ( $task === null ) {
|
||||
return 'tasks';
|
||||
}
|
||||
$page->setTitle( $task->title . ' (task)' );
|
||||
|
||||
|
||||
return Loader::Create( 'Form' , 'Update task' , 'edit-task' , 'Editing task' )
|
||||
->setURL( 'tasks/view?id=' . $task->id )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )
|
||||
->setDefaultValue( $task->id ) )
|
||||
->addField( $this->createItemSelector( )
|
||||
->setDefaultValue( $task->item ) )
|
||||
->addField( Loader::Create( 'Field' , 'title' , 'text' )
|
||||
->setDescription( 'Title:' )
|
||||
->setModifier( Loader::Create( 'Modifier_TrimString' ) )
|
||||
->setValidator( Loader::Create( 'Validator_StringLength' , 'This title' , 5 , 256 ) )
|
||||
->setDefaultValue( $task->title ) )
|
||||
->addField( $this->createPrioritySelector( )
|
||||
->setDefaultValue( $task->priority ) )
|
||||
->addField( Loader::Create( 'Field' , 'description' , 'textarea' )
|
||||
->setDescription( 'Description:' )
|
||||
->setMandatory( false )
|
||||
->setDefaultValue( $task->description ) )
|
||||
->addController( Loader::Ctrl( 'edit_task' ) )
|
||||
->controller( );
|
||||
}
|
||||
|
||||
|
||||
private function createItemSelector( )
|
||||
{
|
||||
$select = Loader::Create( 'Field' , 'item' , 'select' )
|
||||
->setDescription( 'On item:' );
|
||||
|
||||
$items = Loader::DAO( 'items' )->getTreeList( );
|
||||
foreach ( $items as $item ) {
|
||||
$name = '-' . str_repeat( '--' , $item->depth ) . ' ' . $item->name;
|
||||
$select->addOption( $item->id , $name );
|
||||
}
|
||||
return $select;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_DeleteNoteForm
|
||||
extends Controller
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected note
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
$tasks = Loader::DAO( 'tasks' );
|
||||
$note = $tasks->getNote( $id );
|
||||
if ( $note === null ) {
|
||||
return 'tasks';
|
||||
}
|
||||
if ( !$note->editable ) {
|
||||
return 'tasks/view?id=' . $note->task;
|
||||
}
|
||||
$task = $tasks->get( $note->task );
|
||||
$page->setTitle( $task->title . ' (task)' );
|
||||
|
||||
// Generate confirmation text
|
||||
$confText = HTML::make( 'div' )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( 'You are about to delete a comment attached to this task.' ) )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( 'This operation cannot be undone.' ) );
|
||||
|
||||
// Generate form
|
||||
return Loader::Create( 'Form' , 'Delete this comment' , 'delete-note' , 'Comment deletion' )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )
|
||||
->setDefaultValue( $note->id ) )
|
||||
->addField( Loader::Create( 'Field' , 'confirm' , 'html' )->setDefaultValue( $confText ) )
|
||||
->setURL( 'tasks/view?id=' . $note->task )
|
||||
->addController( Loader::Ctrl( 'delete_note' ) )
|
||||
->controller( );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_EditNoteForm
|
||||
extends Controller
|
||||
{
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected note
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'tasks';
|
||||
}
|
||||
|
||||
$tasks = Loader::DAO( 'tasks' );
|
||||
$note = $tasks->getNote( $id );
|
||||
if ( $note === null ) {
|
||||
return 'tasks';
|
||||
}
|
||||
if ( !$note->editable ) {
|
||||
return 'tasks/view?id=' . $note->task;
|
||||
}
|
||||
$task = $tasks->get( $note->task );
|
||||
$page->setTitle( $task->title . ' (task)' );
|
||||
|
||||
// Generate form
|
||||
return Loader::Create( 'Form' , 'Update comment' , 'edit-note' )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )
|
||||
->setDefaultValue( $note->id ) )
|
||||
->addField( Loader::Create( 'Field' , 'text' , 'textarea' )
|
||||
->setDescription( 'Comment:' )
|
||||
->setValidator( Loader::Create( 'Validator_StringLength' , 'Le texte' , 5 ) )
|
||||
->setDefaultValue( $note->text ) )
|
||||
->setURL( 'tasks/view?id=' . $note->task )
|
||||
->addController( Loader::Ctrl( 'edit_note' ) )
|
||||
->controller( );
|
||||
|
||||
}
|
||||
|
||||
}
|
22
includes/t-tasks/pages.inc.php
Normal file
22
includes/t-tasks/pages.inc.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
class Page_TasksTasks
|
||||
extends AuthenticatedPage
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct( array(
|
||||
'' => 'all_tasks' ,
|
||||
'add' => 'add_task_form' ,
|
||||
'delete' => 'delete_task_form' ,
|
||||
'edit' => 'edit_task_form' ,
|
||||
'finish' => array( 'toggle_task' , false ) ,
|
||||
'restart' => array( 'toggle_task' , true ) ,
|
||||
'view' => 'view_task' ,
|
||||
'notes/edit' => 'edit_note_form' ,
|
||||
'notes/delete' => 'delete_note_form' ,
|
||||
));
|
||||
}
|
||||
|
||||
}
|
301
includes/t-tasks/views.inc.php
Normal file
301
includes/t-tasks/views.inc.php
Normal file
|
@ -0,0 +1,301 @@
|
|||
<?php
|
||||
|
||||
abstract class View_TasksBase
|
||||
extends BaseURLAwareView
|
||||
{
|
||||
protected $tasks;
|
||||
protected $dao;
|
||||
|
||||
|
||||
protected function __construct( )
|
||||
{
|
||||
$this->dao = Loader::DAO( 'tasks' );
|
||||
}
|
||||
|
||||
|
||||
public final function render( )
|
||||
{
|
||||
if ( empty( $this->tasks ) ) {
|
||||
return HTML::make( 'div' )
|
||||
->setAttribute( 'class' , 'no-table' )
|
||||
->appendText( 'No tasks to display.' );
|
||||
}
|
||||
return HTML::make( 'dl' )
|
||||
->append( $this->generateList( ) )
|
||||
->setAttribute( 'class' , 'tasks' );
|
||||
}
|
||||
|
||||
|
||||
private function generateList( )
|
||||
{
|
||||
$result = array( );
|
||||
$prevPriority = 6;
|
||||
foreach ( $this->tasks as $task ) {
|
||||
$priority = ( $task->completed_by === null ) ? $task->priority : -1;
|
||||
if ( $priority !== $prevPriority ) {
|
||||
if ( $priority == -1 ) {
|
||||
$text = 'Completed tasks';
|
||||
$extraClass = ' completed';
|
||||
} else {
|
||||
$text = $this->dao->translatePriority( $priority ) . ' priority';
|
||||
$extraClass = '';
|
||||
}
|
||||
$prevPriority = $priority;
|
||||
|
||||
array_push( $result , HTML::make( 'dt' )
|
||||
->setAttribute( 'class' , 'sub-title' . $extraClass )
|
||||
->appendText( $text ) );
|
||||
}
|
||||
$result = array_merge( $result , $this->generateItem( $task ) );
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected abstract function generateItem( $task );
|
||||
}
|
||||
|
||||
|
||||
class View_AllTasks
|
||||
extends View_TasksBase
|
||||
{
|
||||
|
||||
public function __construct( $tasks )
|
||||
{
|
||||
parent::__construct( );
|
||||
$this->tasks = $tasks;
|
||||
}
|
||||
|
||||
protected function generateItem( $task )
|
||||
{
|
||||
$cell = array( );
|
||||
array_push( $cell , HTML::make( 'dt' )
|
||||
->appendElement( HTML::make( 'a' )
|
||||
->setAttribute( 'href' , $this->base . '/tasks/view?id=' . $task->id )
|
||||
->appendText( $task->title ) ) );
|
||||
|
||||
array_push( $cell , HTML::make( 'dd' )->append( $this->formatPlaceLineage( $task->item ) ) );
|
||||
|
||||
$addedAt = strtotime( $task->added_at );
|
||||
$addedAtDate = date( 'd/m/o' , $addedAt );
|
||||
$addedAtTime = date( 'H:i:s' , $addedAt );
|
||||
array_push( $cell ,
|
||||
HTML::make( 'dd' )->appendText( "Added $addedAtDate at $addedAtTime by {$task->added_by}" ) );
|
||||
|
||||
if ( $task->completed_by !== null ) {
|
||||
$completedAt = strtotime( $task->completed_at );
|
||||
$completedAtDate = date( 'd/m/o' , $completedAt );
|
||||
$completedAtTime = date( 'H:i:s' , $completedAt );
|
||||
array_push( $cell , HTML::make( 'dd' )->appendText(
|
||||
"Completed $completedAtDate at $completedAtTime by {$task->completed_by}" ) );
|
||||
|
||||
foreach ( $cell as $entry ) {
|
||||
$entry->setAttribute( 'class' , 'completed' );
|
||||
}
|
||||
}
|
||||
|
||||
return $cell;
|
||||
}
|
||||
|
||||
private function formatPlaceLineage( $item )
|
||||
{
|
||||
$item = Loader::DAO( 'items' )->get( $item );
|
||||
$lineage = $item->lineage;
|
||||
array_push( $lineage , $item->id );
|
||||
|
||||
$contents = array( );
|
||||
foreach ( Loader::DAO( 'items' )->getAll( $lineage ) as $ancestor ) {
|
||||
if ( ! empty( $contents ) ) {
|
||||
array_push( $contents , ' » ' );
|
||||
}
|
||||
array_push( $contents , HTML::make( 'a' )
|
||||
->setAttribute( 'href' , $this->base . '/items/view?id=' . $ancestor->id )
|
||||
->appendText( $ancestor->name ) );
|
||||
}
|
||||
array_unshift( $contents, 'On ' );
|
||||
|
||||
return $contents;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class View_Tasks
|
||||
extends View_TasksBase
|
||||
{
|
||||
public function __construct( $tasks )
|
||||
{
|
||||
parent::__construct( );
|
||||
$this->tasks = $tasks;
|
||||
}
|
||||
|
||||
|
||||
protected function generateItem( $task )
|
||||
{
|
||||
$cell = array( );
|
||||
array_push( $cell , HTML::make( 'dt' )
|
||||
->appendElement( HTML::make( 'a' )
|
||||
->setAttribute( 'href' , $this->base . '/tasks/view?id=' . $task->id )
|
||||
->appendText( $task->title ) ) );
|
||||
|
||||
$addedAt = strtotime( $task->added_at );
|
||||
$addedAtDate = date( 'd/m/o' , $addedAt );
|
||||
$addedAtTime = date( 'H:i:s' , $addedAt );
|
||||
array_push( $cell ,
|
||||
HTML::make( 'dd' )->appendText( "Added $addedAtDate at $addedAtTime by {$task->added_by}" ) );
|
||||
|
||||
if ( $task->completed_by !== null ) {
|
||||
$completedAt = strtotime( $task->completed_at );
|
||||
$completedAtDate = date( 'd/m/o' , $completedAt );
|
||||
$completedAtTime = date( 'H:i:s' , $completedAt );
|
||||
array_push( $cell , HTML::make( 'dd' )->appendText(
|
||||
"Completed $completedAtDate at $completedAtTime by {$task->completed_by}" ) );
|
||||
foreach ( $cell as $entry ) {
|
||||
$entry->setAttribute( 'class' , 'completed' );
|
||||
}
|
||||
}
|
||||
|
||||
return $cell;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class View_TaskDetails
|
||||
extends BaseURLAwareView
|
||||
{
|
||||
private $task;
|
||||
|
||||
public function __construct( $task )
|
||||
{
|
||||
$this->task = $task;
|
||||
}
|
||||
|
||||
public function render( )
|
||||
{
|
||||
$list = HTML::make( 'dl' )
|
||||
->setAttribute( 'class' , 'tasks' )
|
||||
->appendElement( HTML::make( 'dt' )
|
||||
->appendText( 'On item:' ) )
|
||||
->appendElement( HTML::make( 'dd' )
|
||||
->append( $this->formatPlaceLineage( $this->task->item ) ) );
|
||||
|
||||
if ( $this->task->description != '' ) {
|
||||
$list->appendElement( HTML::make( 'dt' )
|
||||
->appendText( 'Description:' ) )
|
||||
->appendElement( HTML::make( 'dd' )
|
||||
->appendRaw( $this->formatDescription( ) ) );
|
||||
}
|
||||
|
||||
$list->appendElement( HTML::make( 'dt' )
|
||||
->appendText( 'Added:' ) )
|
||||
->appendElement( HTML::make( 'dd' )
|
||||
->appendText( $this->formatAction( $this->task->added_at , $this->task->added_by ) ) );
|
||||
|
||||
if ( $this->task->completed_by === null ) {
|
||||
$list->appendElement( HTML::make( 'dt' )
|
||||
->appendText( 'Priority:' ) )
|
||||
->appendElement( HTML::make( 'dd' )
|
||||
->appendText( Loader::DAO( 'tasks' )
|
||||
->translatePriority( $this->task->priority ) ) );
|
||||
} else {
|
||||
$list->appendElement( HTML::make( 'dt' )
|
||||
->appendText( 'Completed:' ) )
|
||||
->appendElement( HTML::make( 'dd' )
|
||||
->appendText( $this->formatAction(
|
||||
$this->task->completed_at , $this->task->completed_by ) ) );
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
private function formatPlaceLineage( $item )
|
||||
{
|
||||
$lineage = $item->lineage;
|
||||
array_push( $lineage , $item->id );
|
||||
|
||||
$contents = array( );
|
||||
foreach ( Loader::DAO( 'items' )->getAll( $lineage ) as $ancestor ) {
|
||||
if ( ! empty( $contents ) ) {
|
||||
array_push( $contents , ' » ' );
|
||||
}
|
||||
array_push( $contents , HTML::make( 'a' )
|
||||
->setAttribute( 'href' , $this->base . '/items/view?id=' . $ancestor->id )
|
||||
->appendText( $ancestor->name ) );
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
|
||||
private function formatDescription( )
|
||||
{
|
||||
$description = HTML::from( $this->task->description );
|
||||
return preg_replace( '/\n/s' , '<br/>' , $description );
|
||||
}
|
||||
|
||||
|
||||
private function formatAction( $timestamp , $user )
|
||||
{
|
||||
$ts = strtotime( $timestamp );
|
||||
$tsDate = date( 'd/m/o' , $ts );
|
||||
$tsTime = date( 'H:i:s' , $ts );
|
||||
return "$tsDate at $tsTime by $user";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class View_TaskNote
|
||||
implements View
|
||||
{
|
||||
private $note;
|
||||
|
||||
public function __construct( $note )
|
||||
{
|
||||
$this->note = $note;
|
||||
}
|
||||
|
||||
public function render( )
|
||||
{
|
||||
$text = HTML::make( 'p' )
|
||||
->appendRaw( preg_replace( '/\n/s' , '<br/>' , HTML::from( $this->note->text ) ) );
|
||||
|
||||
$ts = strtotime( $this->note->added_at );
|
||||
$tsDate = date( 'd/m/o' , $ts );
|
||||
$tsTime = date( 'H:i:s' , $ts );
|
||||
$details = HTML::make( 'div')
|
||||
->setAttribute( 'style' , 'font-size: 9pt' )
|
||||
->appendElement( HTML::make( 'em' )
|
||||
->appendText( "Note added $tsDate at $tsTime by {$this->note->author}" ) );
|
||||
|
||||
return array( $text , $details );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class View_TaskDependencies
|
||||
implements View
|
||||
{
|
||||
private $task;
|
||||
private $reverse;
|
||||
|
||||
public function __construct( $task , $reverse )
|
||||
{
|
||||
$this->task = $task;
|
||||
$this->reverse = $reverse;
|
||||
}
|
||||
|
||||
public function render( )
|
||||
{
|
||||
$source = $this->reverse ? 'reverseDependencies' : 'dependencies';
|
||||
$list = HTML::make( 'ul' )->setAttribute( 'class' , 'dep-list' );
|
||||
foreach ( $this->task->$source as $dependency ) {
|
||||
$link = HTML::make( 'a' )
|
||||
->setAttribute( 'href' , 'tasks/view?id=' . $dependency->id )
|
||||
->appendText( $dependency->title );
|
||||
if ( ! $this->reverse ) {
|
||||
$link->setAttribute( 'class' , ( $dependency->completed == 't' )
|
||||
? 'satisfied' : 'missing' );
|
||||
}
|
||||
$list->appendElement( HTML::make( 'li' )->appendElement( $link ) );
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue