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
282
includes/t-items/controllers.inc.php
Normal file
282
includes/t-items/controllers.inc.php
Normal file
|
@ -0,0 +1,282 @@
|
|||
<?php
|
||||
|
||||
|
||||
class Ctrl_ItemsTree
|
||||
extends Controller
|
||||
implements TitleProvider
|
||||
{
|
||||
private $useParameter;
|
||||
|
||||
public function __construct( $useParameter = false )
|
||||
{
|
||||
$this->useParameter = $useParameter;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$items = Loader::DAO( 'items' );
|
||||
$tree = $items->getTree( );
|
||||
$items->countActiveTasks( );
|
||||
|
||||
if ( $this->useParameter ) {
|
||||
$root = (int) $this->getParameter( $this->useParameter , 'GET' );
|
||||
} else {
|
||||
$root = null;
|
||||
}
|
||||
|
||||
$buttonURL = 'items/add';
|
||||
if ( $root != null ) {
|
||||
$rootObj = $items->get( $root );
|
||||
$tree = $items->getAll( $rootObj->children );
|
||||
$boxTitle = 'Child items';
|
||||
$buttonURL .= "?from=$root";
|
||||
} else {
|
||||
$boxTitle = null;
|
||||
}
|
||||
|
||||
return Loader::View( 'box' , $boxTitle , Loader::View( 'items_tree' , $tree ) )
|
||||
->setClass( 'list' )
|
||||
->addButton( BoxButton::create( 'Add item' , $buttonURL )
|
||||
->setClass( 'list-add' ) );
|
||||
}
|
||||
|
||||
|
||||
public function getTitle( )
|
||||
{
|
||||
return 'Items';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_ItemDetails
|
||||
extends Controller
|
||||
{
|
||||
private $item;
|
||||
|
||||
public function __construct( Data_Item $item )
|
||||
{
|
||||
$this->item = $item;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$items = Loader::DAO( 'items');
|
||||
$items->getTree( );
|
||||
|
||||
$box = Loader::View( 'box' , 'Details' , Loader::View( 'item_details' , $this->item ) )
|
||||
->addButton( BoxButton::create( 'Edit item' , 'items/edit?id=' . $this->item->id )
|
||||
->setClass( 'icon edit' ) );
|
||||
|
||||
if ( $items->canMove( $this->item ) ) {
|
||||
$box->addButton( BoxButton::create( 'Move item' , 'items/move?id=' . $this->item->id )
|
||||
->setClass( 'icon move' ) );
|
||||
}
|
||||
|
||||
if ( $items->canDelete( $this->item ) ) {
|
||||
$box->addButton( BoxButton::create( 'Delete item' , 'items/delete?id=' . $this->item->id )
|
||||
->setClass( 'icon delete' ) );
|
||||
}
|
||||
|
||||
return $box;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_AddItem
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$name = $this->form->field( 'name' );
|
||||
$before = $this->form->field( 'before' );
|
||||
list( $after , $id ) = explode( ':' , $before->value( ) );
|
||||
|
||||
$items = Loader::DAO( 'items' );
|
||||
if ( $id === '' ) {
|
||||
$error = $items->createLast( $name->value( ) );
|
||||
} elseif ( $after == 1 ) {
|
||||
$error = $items->createUnder( $name->value( ) , $id );
|
||||
} else {
|
||||
$error = $items->createBefore( $name->value( ) , $id );
|
||||
}
|
||||
|
||||
switch ( $error ) {
|
||||
|
||||
case 0:
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
$name->putError( 'This name is not unique' );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
$before->putError( 'The item you selected no longer exists' );
|
||||
break;
|
||||
|
||||
default:
|
||||
$name->putError( 'An unknown error occurred (' . $error . ')' );
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_MoveItem
|
||||
extends Controller
|
||||
implements FormAware
|
||||
{
|
||||
private $form;
|
||||
|
||||
|
||||
public function setForm( Form $form )
|
||||
{
|
||||
$this->form = $form;
|
||||
}
|
||||
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$srcId = (int) $this->form->field( 'id' )->value( );
|
||||
$dest = $this->form->field( 'destination' );
|
||||
list( $after , $id ) = explode( ':' , $dest->value( ) );
|
||||
|
||||
$items = Loader::DAO( 'items' );
|
||||
if ( $id === '' ) {
|
||||
$error = $items->moveLast( $srcId );
|
||||
} elseif ( $after == 1 ) {
|
||||
$error = $items->moveUnder( $srcId , $id );
|
||||
} else {
|
||||
$error = $items->moveBefore( $srcId , $id );
|
||||
}
|
||||
|
||||
switch ( $error ) {
|
||||
|
||||
case 0:
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
$dest->putError( 'Invalid destination' );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
$before->putError( 'The place you selected no longer exists.' );
|
||||
break;
|
||||
|
||||
default:
|
||||
$name->putError( 'An unknown error occurred (' . $error . ')' );
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_DeleteItem
|
||||
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( );
|
||||
|
||||
$items = Loader::DAO( 'items' );
|
||||
if ( ! $items->canDelete( $items->get( $id ) ) ) {
|
||||
return false;
|
||||
}
|
||||
$items->destroy( $id );
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_EditItem
|
||||
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( );
|
||||
$items = Loader::DAO( 'items' );
|
||||
$item = $items->get( $id );
|
||||
|
||||
$name = $this->form->field( 'name' );
|
||||
if ( $name->value( ) === $item->name ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$error = $items->rename( $id , $name->value( ) );
|
||||
switch ( $error ) {
|
||||
|
||||
case 0:
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
$name->putError( 'Ce nom n\'est pas unique' );
|
||||
break;
|
||||
|
||||
default:
|
||||
$name->putError( 'Une erreur inconnue s\'est produite (' . $error . ')' );
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_ItemTasks
|
||||
extends Controller
|
||||
{
|
||||
private $item;
|
||||
|
||||
public function __construct( Data_Item $item )
|
||||
{
|
||||
$this->item = $item;
|
||||
}
|
||||
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$tasks = Loader::DAO( 'tasks' )->getTasksAt( $this->item );
|
||||
|
||||
return Loader::View( 'box' , 'Tasks' , Loader::View( 'tasks' , $tasks ) )
|
||||
->addButton( BoxButton::create( 'Add task' , 'tasks/add?to=' . $this->item->id )
|
||||
->setClass( 'list-add' ) );
|
||||
}
|
||||
}
|
44
includes/t-items/fields.inc.php
Normal file
44
includes/t-items/fields.inc.php
Normal file
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
|
||||
class Item_LocationField
|
||||
implements FieldValidator , FieldModifier
|
||||
{
|
||||
|
||||
private $okLocations;
|
||||
|
||||
public function __construct( $okLocations )
|
||||
{
|
||||
$this->okLocations = $okLocations;
|
||||
}
|
||||
|
||||
public function replace( $value )
|
||||
{
|
||||
$exploded = explode( ':' , $value );
|
||||
if ( count( $exploded ) != 2 ) {
|
||||
$exploded = array( 0 , $value );
|
||||
}
|
||||
|
||||
if ( $exploded[ 1 ] == '' ) {
|
||||
$exploded[ 0 ] = 1;
|
||||
} else {
|
||||
$exploded[ 0 ] = ( $exploded[ 0 ] == '0' ) ? 0 : 1;
|
||||
$exploded[ 1 ] = (int) $exploded[ 1 ];
|
||||
}
|
||||
|
||||
return join( ':' , $exploded );
|
||||
}
|
||||
|
||||
public function validate( $value )
|
||||
{
|
||||
list( $inside , $before ) = explode( ':' , $value );
|
||||
if ( $before != '' && Loader::DAO( 'items' )->get( $before ) == null ) {
|
||||
return array( 'This item no longer exists.' );
|
||||
}
|
||||
if ( ! ( empty( $this->okLocations ) || in_array( $value , $this->okLocations ) ) ) {
|
||||
return array( 'Invalid destination' );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
32
includes/t-items/package.inc.php
Normal file
32
includes/t-items/package.inc.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
$package[ 'requires' ][] = 'form';
|
||||
$package[ 'requires' ][] = 't-basics';
|
||||
$package[ 'requires' ][] = 't-data';
|
||||
|
||||
$package[ 'files' ][] = 'controllers';
|
||||
$package[ 'files' ][] = 'fields';
|
||||
$package[ 'files' ][] = 'page_controllers';
|
||||
$package[ 'files' ][] = 'pages';
|
||||
$package[ 'files' ][] = 'views';
|
||||
|
||||
$package[ 'extras' ][] = 'Item_NameField';
|
||||
$package[ 'extras' ][] = 'Item_LocationField';
|
||||
|
||||
$package[ 'ctrls' ][] = 'add_item';
|
||||
$package[ 'ctrls' ][] = 'add_item_form';
|
||||
$package[ 'ctrls' ][] = 'delete_item';
|
||||
$package[ 'ctrls' ][] = 'delete_item_form';
|
||||
$package[ 'ctrls' ][] = 'edit_item';
|
||||
$package[ 'ctrls' ][] = 'edit_item_form';
|
||||
$package[ 'ctrls' ][] = 'move_item';
|
||||
$package[ 'ctrls' ][] = 'move_item_form';
|
||||
$package[ 'ctrls' ][] = 'item_details';
|
||||
$package[ 'ctrls' ][] = 'item_tasks';
|
||||
$package[ 'ctrls' ][] = 'items_tree';
|
||||
$package[ 'ctrls' ][] = 'view_item';
|
||||
|
||||
$package[ 'views' ][] = 'item_details';
|
||||
$package[ 'views' ][] = 'items_tree';
|
||||
|
||||
$package[ 'pages' ][] = 'tasks_items';
|
278
includes/t-items/page_controllers.inc.php
Normal file
278
includes/t-items/page_controllers.inc.php
Normal file
|
@ -0,0 +1,278 @@
|
|||
<?php
|
||||
|
||||
|
||||
class Ctrl_ViewItem
|
||||
extends Controller
|
||||
{
|
||||
public function handle( Page $page )
|
||||
{
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return $page->getBaseURL() . '/items';
|
||||
}
|
||||
|
||||
$item = Loader::DAO( 'items' )->get( $id );
|
||||
if ( $item === null ) {
|
||||
return $page->getBaseURL() . '/items';
|
||||
}
|
||||
$page->setTitle( $item->name . ' (item)' );
|
||||
|
||||
return array(
|
||||
Loader::Ctrl( 'item_details' , $item ) ,
|
||||
Loader::Ctrl( 'items_tree' , 'id' ) ,
|
||||
Loader::Ctrl( 'item_tasks' , $item )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_AddItemForm
|
||||
extends Controller
|
||||
implements TitleProvider
|
||||
{
|
||||
private $items;
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
$this->items = Loader::DAO( 'items' );
|
||||
|
||||
$locationField = Loader::Create( 'Item_LocationField' , array( ) );
|
||||
|
||||
$form = Loader::Create( 'Form' , 'Add this item' , 'create-item' , 'New item information' )
|
||||
->addField( Loader::Create( 'Field' , 'name' , 'text' )
|
||||
->setDescription( 'Item name:' )
|
||||
->setModifier( Loader::Create( 'Modifier_TrimString' ) )
|
||||
->setValidator( Loader::Create( 'Validator_StringLength' , 'This name' , 2 , 128 ) ) )
|
||||
->addField( $before = Loader::Create( 'Field' , 'before' , 'select' )
|
||||
->setDescription( 'Insert before:' )
|
||||
->setMandatory( false )
|
||||
->setModifier( $locationField )
|
||||
->setValidator( $locationField ) )
|
||||
->addField( Loader::Create( 'Field' , 'from' , 'hidden' ) )
|
||||
->addController( Loader::Ctrl( 'add_item' ) );
|
||||
|
||||
// Add options to the insert location selector
|
||||
$this->addTreeOptions( $before , $this->items->getTree( ) );
|
||||
$before->addOption( '1:' , 'the end of the list' );
|
||||
|
||||
// Try to guess return page and default insert location
|
||||
try {
|
||||
$from = (int) $this->getParameter( 'from' );
|
||||
} catch ( ParameterException $e ) {
|
||||
$from = 0;
|
||||
}
|
||||
if ( $from == 0 ) {
|
||||
$returnURL = 'items';
|
||||
$defBefore = '1:';
|
||||
} else {
|
||||
$returnURL = 'items/view?id=' . $from;
|
||||
$defBefore = '1:' . $from;
|
||||
}
|
||||
$form->setURL( $returnURL );
|
||||
$form->field( 'from' )->setDefaultValue( $from );
|
||||
$before->setDefaultValue( $defBefore );
|
||||
|
||||
return $form->controller( );
|
||||
}
|
||||
|
||||
private function addTreeOptions( $before , $tree )
|
||||
{
|
||||
foreach ( $tree as $item ) {
|
||||
$name = '-' . str_repeat( '--' , $item->getDepth( ) ) . ' ' . $item->getName( );
|
||||
$before->addOption( '0:' . $item->getIdentifier( ) , $name );
|
||||
|
||||
if ( !empty( $item->children ) ) {
|
||||
$this->addTreeOptions( $before , $this->items->getAll( $item->children ) );
|
||||
}
|
||||
|
||||
$name = '-' . str_repeat( '--' , $item->getDepth( ) + 1 ) . ' the end of ' . $item->getName( );
|
||||
$before->addOption( '1:' . $item->getIdentifier( ) , $name );
|
||||
}
|
||||
}
|
||||
|
||||
public function getTitle( )
|
||||
{
|
||||
return 'Add item';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_MoveItemForm
|
||||
extends Controller
|
||||
{
|
||||
private $items;
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected item
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'items';
|
||||
}
|
||||
|
||||
$this->items = Loader::DAO( 'items' );
|
||||
$item = $this->items->get( $id );
|
||||
if ( $item === null ) {
|
||||
return 'items';
|
||||
}
|
||||
|
||||
$destinations = $this->items->getMoveTargets( $item );
|
||||
if ( empty( $destinations ) ) {
|
||||
return 'items/view?id=' . $item->id;
|
||||
}
|
||||
$page->setTitle( $item->name . ' (item)' );
|
||||
|
||||
// Field modifier / validator
|
||||
$locationField = Loader::Create( 'Item_LocationField' , $destinations );
|
||||
|
||||
// Generate form
|
||||
$form = Loader::Create( 'Form' , 'Move item' , 'move-item' )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )->setDefaultValue( $item->id ) )
|
||||
->addField( $dest = Loader::Create( 'Field' , 'destination' , 'select' )
|
||||
->setDescription( 'Move before:' )
|
||||
->setModifier( $locationField )
|
||||
->setValidator( $locationField ) )
|
||||
->setURL( 'items/view?id=' . $item->id )
|
||||
->addController( Loader::Ctrl( 'move_item' ) );
|
||||
$this->addDestinations( $dest , $this->items->getTree( ) , $destinations );
|
||||
if ( in_array( '1:' , $destinations ) ) {
|
||||
$dest->addOption( '1:' , 'the end of the list' );
|
||||
}
|
||||
|
||||
return $form->controller( );
|
||||
}
|
||||
|
||||
|
||||
private function addDestinations( $field , $tree , $destinations )
|
||||
{
|
||||
foreach ( $tree as $item ) {
|
||||
$id = '0:' . $item->id;
|
||||
$disabled = ! in_array( $id , $destinations );
|
||||
if ( $disabled && ! $this->checkChildren( $item , $destinations ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$name = '-' . str_repeat( '--' , $item->getDepth( ) ) . ' ' . $item->getName( );
|
||||
$field->addOption( $id , $name , $disabled );
|
||||
|
||||
if ( !empty( $item->children ) ) {
|
||||
$this->addDestinations( $field , $this->items->getAll( $item->children ) , $destinations );
|
||||
}
|
||||
|
||||
$id = '1:' . $item->id;
|
||||
if ( ! in_array( $id , $destinations ) ) {
|
||||
continue;
|
||||
}
|
||||
$name = '-' . str_repeat( '--' , $item->getDepth( ) + 1 ) . ' the end of ' . $item->getName( );
|
||||
$field->addOption( $id , $name );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function checkChildren( $item , $destinations )
|
||||
{
|
||||
$children = $this->items->getAll( $item->children );
|
||||
foreach ( $children as $child ) {
|
||||
if ( in_array( '0:' . $child->id , $destinations ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( in_array( '1:' . $item->id , $destinations ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach ( $children as $child ) {
|
||||
if ( $this->checkChildren( $child , $destinations ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_DeleteItemForm
|
||||
extends Controller
|
||||
{
|
||||
private $items;
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected item
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'items';
|
||||
}
|
||||
|
||||
$items = Loader::DAO( 'items' );
|
||||
$item = $items->get( $id );
|
||||
if ( $item === null ) {
|
||||
return 'items';
|
||||
}
|
||||
if ( ! $items->canDelete( $item ) ) {
|
||||
return 'items/view?id=' . $id;
|
||||
}
|
||||
$page->setTitle( $item->name . ' (item)' );
|
||||
|
||||
// Generate confirmation text
|
||||
$confText = HTML::make( 'div' )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( 'You are about to delete this item.' ) )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( 'All child items and all tasks the item contains will be deleted permanently.' ) )
|
||||
->appendElement( HTML::make( 'p' )
|
||||
->appendText( 'It is impossible to undo this operation.' ) );
|
||||
|
||||
// Generate form
|
||||
$form = Loader::Create( 'Form' , 'Delete the item' , 'delete-item' , 'Please confirm' )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )
|
||||
->setDefaultValue( $item->id ) )
|
||||
->addField( Loader::Create( 'Field' , 'confirm' , 'html' )->setDefaultValue( $confText ) )
|
||||
->setCancelURL( 'items/view?id=' . $item->id )
|
||||
->setSuccessURL( 'items' ) // XXX: use lineage
|
||||
->addController( Loader::Ctrl( 'delete_item' ) );
|
||||
|
||||
return $form->controller( );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Ctrl_EditItemForm
|
||||
extends Controller
|
||||
{
|
||||
private $items;
|
||||
|
||||
public function handle( Page $page )
|
||||
{
|
||||
// Check selected item
|
||||
try {
|
||||
$id = (int) $this->getParameter( 'id' );
|
||||
} catch ( ParameterException $e ) {
|
||||
return 'items';
|
||||
}
|
||||
|
||||
$this->items = Loader::DAO( 'items' );
|
||||
$item = $this->items->get( $id );
|
||||
if ( $item === null ) {
|
||||
return 'items';
|
||||
}
|
||||
$page->setTitle( $item->name . ' (item)' );
|
||||
|
||||
return Loader::Create( 'Form' , 'Update item' , 'edit-item' )
|
||||
->setURL( 'items/view?id=' . $item->id )
|
||||
->addField( Loader::Create( 'Field' , 'name' , 'text' )
|
||||
->setDescription( 'Name of the item:' )
|
||||
->setModifier( Loader::Create( 'Modifier_TrimString' ) )
|
||||
->setValidator( Loader::Create( 'Validator_StringLength' , 'This name' , 2 , 128 ) )
|
||||
->setDefaultValue( $item->name ) )
|
||||
->addField( Loader::Create( 'Field' , 'id' , 'hidden' )
|
||||
->setDefaultValue( $item->id ) )
|
||||
->addController( Loader::Ctrl( 'edit_item' ) )
|
||||
->controller( );
|
||||
}
|
||||
|
||||
}
|
19
includes/t-items/pages.inc.php
Normal file
19
includes/t-items/pages.inc.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
class Page_TasksItems
|
||||
extends AuthenticatedPage
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct( array(
|
||||
'' => 'items_tree' ,
|
||||
'view' => 'view_item' ,
|
||||
'add' => 'add_item_form' ,
|
||||
'move' => 'move_item_form' ,
|
||||
'edit' => 'edit_item_form' ,
|
||||
'delete' => 'delete_item_form' ,
|
||||
) );
|
||||
}
|
||||
|
||||
}
|
96
includes/t-items/views.inc.php
Normal file
96
includes/t-items/views.inc.php
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
|
||||
class View_ItemsTree
|
||||
extends BaseURLAwareView
|
||||
{
|
||||
private $tree;
|
||||
private $minDepth;
|
||||
|
||||
public function __construct( $tree )
|
||||
{
|
||||
$this->tree = $tree;
|
||||
if ( ! empty( $tree ) ) {
|
||||
$this->minDepth = $tree[ 0 ]->depth;
|
||||
} else {
|
||||
$this->minDepth = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public function render( )
|
||||
{
|
||||
if ( empty( $this->tree ) ) {
|
||||
return HTML::make( 'div' )
|
||||
->setAttribute( 'class' , 'no-table' )
|
||||
->appendText( 'No items have been defined.' );
|
||||
}
|
||||
|
||||
$table = HTML::make( 'table' )
|
||||
->appendElement( HTML::make( 'tr' )
|
||||
->setAttribute( 'class' , 'header' )
|
||||
->appendElement( HTML::make( 'th' )
|
||||
->appendText( 'Item name' ) )
|
||||
->appendElement( HTML::make( 'th' )
|
||||
->setAttribute( 'class' , 'align-right' )
|
||||
->appendText( 'Tasks' ) ) );
|
||||
foreach ( $this->tree as $item ) {
|
||||
$this->renderItem( $table , $item );
|
||||
}
|
||||
return $table;
|
||||
}
|
||||
|
||||
private function renderItem( $table , $item )
|
||||
{
|
||||
$children = Loader::DAO( 'items' )->getAll( $item->children );
|
||||
$padding = 5 + ( $item->depth - $this->minDepth ) * 16;
|
||||
$table->appendElement( HTML::make( 'tr' )
|
||||
->appendElement( HTML::make( 'td' )
|
||||
->setAttribute( 'style' , 'padding-left:' . $padding . 'px' )
|
||||
->appendElement( HTML::make( 'a' )
|
||||
->setAttribute( 'href' , $this->base . '/items/view?id=' . $item->id )
|
||||
->appendText( $item->name ) ) )
|
||||
->appendElement( HTML::make( 'td' )
|
||||
->setAttribute( 'class' , 'align-right' )
|
||||
->appendRaw( (int) $item->activeTasks ) ) );
|
||||
|
||||
foreach ( $children as $child ) {
|
||||
$this->renderItem( $table , $child );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class View_ItemDetails
|
||||
extends BaseURLAwareView
|
||||
{
|
||||
private $item;
|
||||
|
||||
public function __construct( Data_Item $item )
|
||||
{
|
||||
$this->item = $item;
|
||||
}
|
||||
|
||||
public function render( )
|
||||
{
|
||||
$items = Loader::DAO( 'items' );
|
||||
|
||||
$contents = array( );
|
||||
if ( empty( $this->item->lineage ) ) {
|
||||
array_push( $contents , HTML::make( 'em' ) ->appendText( 'None' ) );
|
||||
} else {
|
||||
foreach ( $items->getAll( $this->item->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 HTML::make( 'dl' )
|
||||
->appendElement( HTML::make( 'dt' )->appendText( 'Path:' ) )
|
||||
->appendElement( HTML::make( 'dd' )
|
||||
->setAttribute( 'style' , 'font-size: 10pt' )
|
||||
->append( $contents ) );
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue