From 1e83f8db36394cbfb461e39902b7819ca0134291 Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Sat, 26 Sep 2009 17:07:29 -0400 Subject: [PATCH] UI support for creating and maintaining resource groups. --- kronolith/lib/Driver/Resource.php | 13 ++-- kronolith/lib/Forms/CreateResourceGroup.php | 53 +++++++++++++++ kronolith/lib/Forms/DeleteResourceGroup.php | 62 +++++++++++++++++ kronolith/lib/Forms/EditResourceGroup.php | 73 ++++++++++++++++++++ kronolith/lib/Resource/Base.php | 6 +- kronolith/lib/Resource/Group.php | 8 ++- kronolith/lib/Resource/Single.php | 2 +- kronolith/resources/groups/create.php | 40 +++++++++++ kronolith/resources/groups/delete.php | 53 +++++++++++++++ kronolith/resources/groups/edit.php | 61 +++++++++++++++++ kronolith/resources/groups/index.php | 89 +++++++++++++++++++++++++ kronolith/resources/index.php | 3 +- kronolith/templates/resources/form-header.inc | 14 ++++ kronolith/templates/resources/resource-form.php | 1 + 14 files changed, 464 insertions(+), 14 deletions(-) create mode 100644 kronolith/lib/Forms/CreateResourceGroup.php create mode 100644 kronolith/lib/Forms/DeleteResourceGroup.php create mode 100644 kronolith/lib/Forms/EditResourceGroup.php create mode 100644 kronolith/resources/groups/create.php create mode 100644 kronolith/resources/groups/delete.php create mode 100644 kronolith/resources/groups/edit.php create mode 100644 kronolith/resources/groups/index.php create mode 100644 kronolith/templates/resources/form-header.inc create mode 100644 kronolith/templates/resources/resource-form.php diff --git a/kronolith/lib/Driver/Resource.php b/kronolith/lib/Driver/Resource.php index 216891191..b17350bd8 100644 --- a/kronolith/lib/Driver/Resource.php +++ b/kronolith/lib/Driver/Resource.php @@ -368,17 +368,16 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql throw new Horde_Exception($result->getMessage()); } } else { - $query = 'INSERT INTO kronolith_resources (resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type)'; - $cols_values = ' VALUES (?, ?, ?, ?, ?, ?)'; + $query = 'INSERT INTO kronolith_resources (resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members)'; + $cols_values = ' VALUES (?, ?, ?, ?, ?, ?, ?, ?)'; $id = $this->_db->nextId('kronolith_resources'); - $values = array($id, $resource->get('name'), $resource->get('calendar'), $resource->get('category'), $resource->get('description'), $resource->get('response_type')); + $values = array($id, $resource->get('name'), $resource->get('calendar'), $resource->get('category'), $resource->get('description'), $resource->get('response_type'), $resource->get('type'), $resource->get('members')); $result = $this->_write_db->query($query . $cols_values, $values); - if (!($result instanceof PEAR_Error)) { - return true; - } else { + if ($result instanceof PEAR_Error) { throw new Horde_Exception($result->getMessage()); } - $resource->setUid($id); + + $resource->setId($id); } return $resource; diff --git a/kronolith/lib/Forms/CreateResourceGroup.php b/kronolith/lib/Forms/CreateResourceGroup.php new file mode 100644 index 000000000..6902ae10d --- /dev/null +++ b/kronolith/lib/Forms/CreateResourceGroup.php @@ -0,0 +1,53 @@ + + * @author Michael J. Rubinsky + * @package Kronolith + */ +class Kronolith_CreateResourceGroupForm extends Horde_Form { + + function Kronolith_CreateResourceGroupForm(&$vars) + { + parent::Horde_Form($vars, _("Create Resource")); + + $resources = Kronolith_Resource::listResources(PERMS_READ, array('type' => 'Single')); + $enum = array(); + foreach ($resources as $resource) { + $enum[$resource->getId()] = htmlspecialchars($resource->get('name')); + } + $this->addVariable(_("Name"), 'name', 'text', true); + $this->addVariable(_("Description"), 'description', 'longtext', false, false, null, array(4, 60)); + $this->addVariable(_("Resources"), 'members', 'multienum', false, false, null, array('enum' => $enum)); + $this->setButtons(array(_("Create"))); + } + + function execute() + { + $members = serialize($this->_vars->get('members')); + $new = array('name' => $this->_vars->get('name'), + 'description' => $this->_vars->get('description'), + 'members' => $members); + + $resource = new Kronolith_Resource_Group($new); + return $results = Kronolith_Resource::addResource($resource); + } + +} diff --git a/kronolith/lib/Forms/DeleteResourceGroup.php b/kronolith/lib/Forms/DeleteResourceGroup.php new file mode 100644 index 000000000..d8455c196 --- /dev/null +++ b/kronolith/lib/Forms/DeleteResourceGroup.php @@ -0,0 +1,62 @@ + + * @package Kronolith + */ +class Kronolith_DeleteResourceGroupForm extends Horde_Form { + + /** + * Calendar being deleted + */ + var $_calendar; + + function Kronolith_DeleteResourceGroupForm(&$vars, &$resource) + { + $this->_resource = &$resource; + parent::Horde_Form($vars, sprintf(_("Delete %s"), $resource->get('name'))); + + $this->addHidden('', 'c', 'text', true); + $this->addVariable(sprintf(_("Really delete the resource \"%s\"? This cannot be undone and all data on this resource will be permanently removed."), $this->_resource->get('name')), 'desc', 'description', false); + + $this->setButtons(array(_("Delete"), _("Cancel"))); + } + + function execute() + { + // If cancel was clicked, return false. + if ($this->_vars->get('submitbutton') == _("Cancel")) { + return false; + } + + if (!($this->_resource->hasPermission(Horde_Auth::getAuth(), PERMS_DELETE))) { + return PEAR::raiseError(_("Permission denied")); + } + + // Delete the resource. + $result = Kronolith::getDriver('Resource')->delete($this->_resource); + if ($result instanceof PEAR_Error) { + return PEAR::raiseError(sprintf(_("Unable to delete \"%s\": %s"), $this->_resource->get('name'), $result->getMessage())); + } + + return true; + } + +} diff --git a/kronolith/lib/Forms/EditResourceGroup.php b/kronolith/lib/Forms/EditResourceGroup.php new file mode 100644 index 000000000..210fc555e --- /dev/null +++ b/kronolith/lib/Forms/EditResourceGroup.php @@ -0,0 +1,73 @@ + + * @package Kronolith + */ +class Kronolith_EditResourceGroupForm extends Horde_Form { + + /** + * Calendar being edited + */ + var $_resource; + + function Kronolith_EditResourceGroupForm(&$vars, &$resource) + { + $this->_resource = &$resource; + parent::Horde_Form($vars, sprintf(_("Edit %s"), $resource->get('name'))); + + $resources = Kronolith_Resource::listResources(PERMS_READ, array('type' => 'Single')); + $enum = array(); + foreach ($resources as $r) { + $enum[$r->getId()] = htmlspecialchars($r->get('name')); + } + + $this->addHidden('', 'c', 'text', true); + $this->addVariable(_("Name"), 'name', 'text', true); + $this->addVariable(_("Description"), 'description', 'longtext', false, false, null, array(4, 60)); + $this->addVariable(_("Resources"), 'members', 'multienum', false, false, null, array('enum' => $enum)); + + $this->setButtons(array(_("Save"))); + } + + function execute() + { + $original_name = $this->_resource->get('name'); + $new_name = $this->_vars->get('name'); + $this->_resource->set('name', $new_name); + $this->_resource->set('description', $this->_vars->get('description')); + $this->_resource->set('members', serialize($this->_vars->get('members'))); + if ($original_name != $new_name) { + $result = Kronolith::getDriver()->rename($original_name, $new_name); + if (is_a($result, 'PEAR_Error')) { + return PEAR::raiseError(sprintf(_("Unable to rename \"%s\": %s"), $original_name, $result->getMessage())); + } + } + + $result = $this->_resource->save(); + if (is_a($result, 'PEAR_Error')) { + return PEAR::raiseError(sprintf(_("Unable to save resource \"%s\": %s"), $new_name, $result->getMessage())); + } + + return $this->_resource; + + } + +} diff --git a/kronolith/lib/Resource/Base.php b/kronolith/lib/Resource/Base.php index 20ad8965e..c59091f38 100644 --- a/kronolith/lib/Resource/Base.php +++ b/kronolith/lib/Resource/Base.php @@ -12,12 +12,10 @@ abstract class Kronolith_Resource_Base * * name - Display name of resource. * calendar - The calendar associated with this resource. - * category - The category of this resource...an arbitrary label used - * to group multiple resources for the resource_group implementation + * * description - * email - * response_type - a RESPONSETYPE_* constant - * max_reservations * * @var array */ @@ -99,7 +97,7 @@ abstract class Kronolith_Resource_Base { $property = str_replace('resource_', '', $property); if ($property == 'type' && empty($this->_params['type'])) { - return (self instanceof Kronolith_Resource_Single) ? 'Single' : 'Group'; + return ($this instanceof Kronolith_Resource_Single) ? 'Single' : 'Group'; } return !empty($this->_params[$property]) ? $this->_params[$property] : false; diff --git a/kronolith/lib/Resource/Group.php b/kronolith/lib/Resource/Group.php index 457814ee2..575a0cb83 100644 --- a/kronolith/lib/Resource/Group.php +++ b/kronolith/lib/Resource/Group.php @@ -38,6 +38,8 @@ class Kronolith_Resource_Group extends Kronolith_Resource_Base */ public function __construct($params) { + $params['resource_type'] = 'Group'; + parent::__construct($params); $this->_driver = $this->getDriver(); } @@ -178,7 +180,11 @@ class Kronolith_Resource_Group extends Kronolith_Resource_Base public function setId($id) { - throw new Horde_Exception('Unsupported'); + if (empty($this->_id)) { + $this->_id = $id; + } else { + throw new Horde_Exception(_("Resource already exists. Cannot change the id.")); + } } /** diff --git a/kronolith/lib/Resource/Single.php b/kronolith/lib/Resource/Single.php index 82f4bdffc..b40e175e8 100644 --- a/kronolith/lib/Resource/Single.php +++ b/kronolith/lib/Resource/Single.php @@ -134,7 +134,7 @@ class Kronolith_Resource_Single extends Kronolith_Resource_Base public function setId($id) { - if (!empty($this->_id)) { + if (empty($this->_id)) { $this->_id = $id; } else { throw new Horde_Exception(_("Resource already exists. Cannot change the id.")); diff --git a/kronolith/resources/groups/create.php b/kronolith/resources/groups/create.php new file mode 100644 index 000000000..03b3a33fa --- /dev/null +++ b/kronolith/resources/groups/create.php @@ -0,0 +1,40 @@ + + */ + +require_once dirname(__FILE__) . '/../../lib/base.php'; +require_once KRONOLITH_BASE . '/lib/Forms/CreateResourceGroup.php'; + +// Exit if this isn't an authenticated, administrative user +if (!Horde_Auth::isAdmin()) { + header('Location: ' . Horde::applicationUrl($prefs->getValue('defaultview') . '.php', true)); + exit; +} + +$vars = Horde_Variables::getDefaultVariables(); +$form = new Kronolith_CreateResourceGroupForm($vars); + +// Execute if the form is valid. +if ($form->validate($vars)) { + $result = $form->execute(); + if (is_a($result, 'PEAR_Error')) { + $notification->push($result, 'horde.error'); + } else { + $notification->push(sprintf(_("The calendar \"%s\" has been created."), $vars->get('name')), 'horde.success'); + } + + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} + +$title = $form->getTitle(); +require KRONOLITH_TEMPLATES . '/common-header.inc'; +require KRONOLITH_TEMPLATES . '/menu.inc'; +echo $form->renderActive($form->getRenderer(), $vars, 'create.php', 'post'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/kronolith/resources/groups/delete.php b/kronolith/resources/groups/delete.php new file mode 100644 index 000000000..f0e2b580d --- /dev/null +++ b/kronolith/resources/groups/delete.php @@ -0,0 +1,53 @@ + + */ + +require_once dirname(__FILE__) . '/../../lib/base.php'; +require_once KRONOLITH_BASE . '/lib/Forms/DeleteResourceGroup.php'; + +// Exit if this isn't an authenticated administrative user. +if (!Horde_Auth::isAdmin()) { + header('Location: ' . Horde::applicationUrl($prefs->getValue('defaultview') . '.php', true)); + exit; +} + +$vars = Horde_Variables::getDefaultVariables(); +$d = Kronolith::getDriver('Resource'); +$resource = $d->getResource($vars->get('c')); + +if ($resource instanceof PEAR_Error) { + $notification->push($resoruce, 'horde.error'); + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} elseif (!$resource->hasPermission(Horde_Auth::getAuth(), PERMS_DELETE)) { + $notification->push(_("You are not allowed to delete this resource group."), 'horde.error'); + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} + +$form = new Kronolith_DeleteResourceGroupForm($vars, $resource); + +// Execute if the form is valid (must pass with POST variables only). +if ($form->validate(new Horde_Variables($_POST))) { + $result = $form->execute(); + if ($result instanceof PEAR_Error) { + $notification->push($result, 'horde.error'); + } elseif ($result) { + $notification->push(sprintf(_("The resource group \"%s\" has been deleted."), $resource->get('name')), 'horde.success'); + } + + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} + +$title = $form->getTitle(); +require KRONOLITH_TEMPLATES . '/common-header.inc'; +require KRONOLITH_TEMPLATES . '/menu.inc'; +echo $form->renderActive($form->getRenderer(), $vars, 'delete.php', 'post'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/kronolith/resources/groups/edit.php b/kronolith/resources/groups/edit.php new file mode 100644 index 000000000..f53bfe5bd --- /dev/null +++ b/kronolith/resources/groups/edit.php @@ -0,0 +1,61 @@ + + */ + +require_once dirname(__FILE__) . '/../../lib/base.php'; +require_once KRONOLITH_BASE . '/lib/Forms/EditResourceGroup.php'; + +// Exit if this isn't an authenticated administrative user. +if (!Horde_Auth::isAdmin()) { + header('Location: ' . Horde::applicationUrl($prefs->getValue('defaultview') . '.php', true)); + exit; +} + +$vars = Horde_Variables::getDefaultVariables(); +$d = Kronolith::getDriver('Resource'); +$group = $d->getResource($vars->get('c')); + +if ($group instanceof PEAR_Error) { + $notification->push($group, 'horde.error'); + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} elseif (!$group->hasPermission(Horde_Auth::getAuth(), PERMS_EDIT)) { + $notification->push(_("You are not allowed to change this resource."), 'horde.error'); + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} +$form = new Kronolith_EditResourceGroupForm($vars, $group); + +// Execute if the form is valid. +if ($form->validate($vars)) { + $original_name = $group->get('name'); + $result = $form->execute(); + if ($result instanceof PEAR_Error) { + $notification->push($result, 'horde.error'); + } else { + if ($result->get('name') != $original_name) { + $notification->push(sprintf(_("The resource group \"%s\" has been renamed to \"%s\"."), $original_name, $group->get('name')), 'horde.success'); + } else { + $notification->push(sprintf(_("The resource group \"%s\" has been saved."), $original_name), 'horde.success'); + } + } + + header('Location: ' . Horde::applicationUrl('resources/groups/', true)); + exit; +} + +$vars->set('name', $group->get('name')); +$vars->set('description', $group->get('description')); +$vars->set('members', unserialize($group->get('members'))); + +$title = $form->getTitle(); +require KRONOLITH_TEMPLATES . '/common-header.inc'; +require KRONOLITH_TEMPLATES . '/menu.inc'; +echo $form->renderActive($form->getRenderer(), $vars, 'edit.php', 'post'); +require $registry->get('templates', 'horde') . '/common-footer.inc'; diff --git a/kronolith/resources/groups/index.php b/kronolith/resources/groups/index.php new file mode 100644 index 000000000..046cf6df8 --- /dev/null +++ b/kronolith/resources/groups/index.php @@ -0,0 +1,89 @@ +getValue('defaultview') . '.php')); + exit; +} +$edit_url_base = Horde::applicationUrl('resources/groups/edit.php'); +$edit_img = Horde::img('edit.png', _("Edit"), null, $registry->getImageDir('horde')); + +$resources = Kronolith_Resource::listResources(PERMS_EDIT, array('type' => 'Group')); +//$display_url_base = Horde::applicationUrl('month.php', true, -1); +$delete_url_base = Horde::applicationUrl('resources/groups/delete.php'); +$delete_img = Horde::img('delete.png', _("Delete"), null, $registry->getImageDir('horde')); +?> + + +
+ +

+ +

+ +
+ + " /> + +
+ +" cellspacing="0" id="calendar-list" class="striped sortable"> + + + + + + + + + + + + + + + + + + +
 
+ getId()), _("Delete")) . $delete_img . '' ?> + getId()), _("Edit")) . $edit_img . '' ?> + +  get('name')) ?>get('description')) ?>
+ + $max_length) { + return substr_replace($url, $separator, $first_chunk_length, -$last_chunk_length); + } + + return $url; +} +?> +
\ No newline at end of file diff --git a/kronolith/resources/index.php b/kronolith/resources/index.php index dcd3dfbd7..0d21a40eb 100644 --- a/kronolith/resources/index.php +++ b/kronolith/resources/index.php @@ -17,7 +17,7 @@ if (!Horde_Auth::getAuth()) { } $edit_url_base = Horde::applicationUrl('resources/edit.php'); $edit_img = Horde::img('edit.png', _("Edit"), null, $registry->getImageDir('horde')); -$resources = Kronolith_Resource::listResources(); +$resources = Kronolith_Resource::listResources(PERMS_READ, array('type' => 'Single')); $display_url_base = Horde::applicationUrl('month.php', true, -1); $delete_url_base = Horde::applicationUrl('resources/delete.php'); $delete_img = Horde::img('delete.png', _("Delete"), null, $registry->getImageDir('horde')); @@ -41,6 +41,7 @@ function performAction(action, rid)
" /> +
" cellspacing="0" id="calendar-list" class="striped sortable"> diff --git a/kronolith/templates/resources/form-header.inc b/kronolith/templates/resources/form-header.inc new file mode 100644 index 000000000..3c25e3401 --- /dev/null +++ b/kronolith/templates/resources/form-header.inc @@ -0,0 +1,14 @@ + + + + diff --git a/kronolith/templates/resources/resource-form.php b/kronolith/templates/resources/resource-form.php new file mode 100644 index 000000000..b3d9bbc7f --- /dev/null +++ b/kronolith/templates/resources/resource-form.php @@ -0,0 +1 @@ +