279 lines
7.5 KiB
PHP
279 lines
7.5 KiB
PHP
|
<?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( );
|
||
|
}
|
||
|
|
||
|
}
|