Skip to content
Snippets Groups Projects
Commit 3c2e7bd9 authored by Tim Steiner's avatar Tim Steiner
Browse files

Added Approval Chain Manager (can only edit links at this time)

parent 7b5c9eec
No related branches found
Tags
No related merge requests found
<?php
class Requests_ApprovalChainManagerController extends App_Controller_Action
{
public function indexAction()
{
$in = $this->getRequest()->getParams();
$approvalChains = Requests_ApprovalChainModel::findAll();
$approvalChain = null;
if ($id = $in['id']) {
$approvalChain = Requests_ApprovalChainModel::find($id);
$user = Auth_UserModel::findCurrentUser();
$userGroups = Auth_GroupModel::findByUser($user);
$approvalBodies = Requests_ApprovalBodyModel::findWithAdminGroups($userGroups);
$bodies = new Unl_Model_Collection('Requests_ApprovalBodyModel');
foreach ($approvalBodies as $approvalBody) {
$bodies->merge($approvalBody);
}
$approvalLinks = Requests_ApprovalLinkModel::findForApprovalChains($approvalChain);
$approvalActions = Requests_ApprovalActionModel::findForApprovalChains($approvalChain);
}
$this->view->approvalChains = $approvalChains;
$this->view->approvalChain = $approvalChain;
$this->view->approvalBodies = $bodies;
$this->view->approvalLinks = $approvalLinks;
$this->view->approvalActions = $approvalActions;
}
public function getActionDetailXmlAction()
{
$in = $this->getRequest()->getParams();
$id = $in['id'];
$action = Requests_ApprovalActionModel::find($id);
if (!$action) {
exit;
}
$dom = new DOMDocument();
$actionNode = $dom->createElement('action');
$dom->appendChild($actionNode);
$actionNode->setAttribute('id', $action->getId());
$actionNode->setAttribute('name', $action->getName());
foreach ($action->getResultStatusStrings() as $key => $value) {
$result = $dom->createElement('result');
$result->setAttribute('value', $key);
$result->setAttribute('name', $value);
$actionNode->appendChild($result);
}
header('Content-type: text/xml');
echo $dom->saveXML();
exit;
}
public function editChainPostAction()
{
$in = $this->getRequest()->getParams();
$chain = Requests_ApprovalChainModel::find($in['id']);
if ($chain) {
$chain->setName($in['name']);
$chain->setOwnerBodyId($in['owner']);
Requests_ApprovalChainModel::save($chain);
}
$this->_redirect('/requests/approval-chain-manager/index/id/' . $in['id']);
}
public function addLinkPostAction()
{
$in = $this->getRequest()->getParams();
$link = Requests_ApprovalLinkModel::fetchNew();
$link->setChainId($in['approvalChain']);
if ($in['currentAction'] != '_null') {
$link->setCurrentActionId($in['currentAction']);
}
if ($in['currentState'] != '_null') {
$link->setCurrentState($in['currentState']);
}
if ($in['nextAction'] != '_null') {
$link->setNextActionId($in['nextAction']);
}
Requests_ApprovalLinkModel::save($link);
$this->_redirect('/requests/approval-chain-manager/index/id/' . $in['approvalChain']);
}
public function editLinksPostAction()
{
$in = $this->getRequest()->getParams();
$linkIds = array_keys($in['currentAction']);
$links = Requests_ApprovalLinkModel::find($linkIds);
$linksToDelete = new Unl_Model_Collection('Requests_ApprovalLinkModel');
$linksToSave = new Unl_Model_Collection('Requests_ApprovalLinkModel');
foreach ($links as $link) {
if ($in['currentAction'][$link->getId()] != '_null') {
$link->setCurrentActionId($in['currentAction'][$link->getId()]);
}
if ($in['currentState'][$link->getId()] != '_null') {
$link->setCurrentState($in['currentState'][$link->getId()]);
}
if ($in['nextAction'][$link->getId()] != '_null') {
$link->setNextActionId($in['nextAction'][$link->getId()]);
}
if ($in['delete'][$link->getId()]) {
$linksToDelete[] = $link;
} else {
$linksToSave[] = $link;
}
}
Requests_ApprovalLinkModel::save($linksToSave);
Requests_ApprovalLinkModel::delete($linksToDelete);
$this->_redirect('/requests/approval-chain-manager/index/id/' . $in['approvalChain']);
}
}
\ No newline at end of file
<?php $this->headLink()->appendStylesheet($this->baseUrl() . '/css/requests/approval-chain-manager.css'); ?>
<?php $this->headScript()->appendFile($this->baseUrl() . '/javascript/requests/approval-chain-manager.js'); ?>
<?php $this->layout()->tagline = 'Approval Chain Manager'; ?>
<?php $this->layout()->hideMenu = true; ?>
<ul class="editMenu">
<?php $this->approvalChains->orderBy('getName'); ?>
<?php foreach ($this->approvalChains as $key => $approvalChain) { ?>
<li <?php if ($approvalChain == $this->approvalChain) {?>class="selected"<?php } ?>>
<a href="<?php echo $this->baseUrl(); ?>/requests/approval-chain-manager/index/id/<?php echo $approvalChain->getId(); ?>">
<?php echo Zend_Filter_HtmlEntities::filter($approvalChain->getName()); ?>
</a>
</li>
<?php } ?>
</ul>
<?php if (!$this->approvalChain) { return; } ?>
<?php $this->approvalBodies->orderBy('getName'); ?>
<div class="editMain">
<form method="post" action="<?php echo $this->baseUrl(); ?>/requests/approval-chain-manager/edit-chain.post">
<?php echo $this->formHidden('id', $this->approvalChain->getId()); ?>
Chain Name: <?php echo $this->formText('name', $this->approvalChain->getName()); ?> <br />
Owner: <?php echo $this->formSelect('owner', $this->approvalChain->getOwnerBody(), null, $this->approvalBodies->arrayFromMethod('getName')); ?> <br />
<?php echo $this->formSubmit('submit', 'Update'); ?>
</form>
<div>
<a href="#">Links</a> |
<a href="#">Actions</a>
</div>
<div>
<h3>Add Link to Chain</h3>
<form method="post" action="<?php echo $this->baseUrl(); ?>/requests/approval-chain-manager/add-link.post">
<?php echo $this->formHidden('approvalChain', $this->approvalChain->getId()); ?>
<table>
<tr>
<th>Previous Action</th>
<th>Resulted In</th>
<th>Next Action</th>
</tr>
<tr>
<td>
<?php echo $this->formSelect(
'currentAction',
null,
array('class' => 'actionSelectElement'),
array('_null' => '--Just Entered Chain--')
+ $this->approvalActions->arrayFromMethod('getName')
); ?>
</td>
<td>
<?php echo $this->formSelect(
'currentState',
null,
null,
array('_null' => '--N/A--')
); ?>
</td>
<td>
<?php echo $this->formSelect(
'nextAction',
null,
null,
$this->approvalActions->arrayFromMethod('getName')
); ?>
</td>
</tr>
</table>
<?php echo $this->formSubmit('submitAddLink', 'Add Link'); ?>
</form>
</div>
<div>
<h3>Edit/Remove Links in Chain</h3>
<form method="post" action="<?php echo $this->baseUrl(); ?>/requests/approval-chain-manager/edit-links.post">
<?php echo $this->formHidden('approvalChain', $this->approvalChain->getId()); ?>
<table>
<tr>
<th>Previous Action</th>
<th>Resulted In</th>
<th>Next Action</th>
<th>Delete</th>
</tr>
<?php foreach ($this->approvalLinks as $approvalLink) { ?>
<tr>
<td>
<?php echo $this->formSelect(
'currentAction[' . $approvalLink->getId() . ']',
$approvalLink->getCurrentAction(),
array('class' => 'actionSelectElement'),
array('_null' => '--Just Entered Chain--')
+ $this->approvalActions->arrayFromMethod('getName')
); ?>
</td>
<td>
<?php echo $this->formSelect(
'currentState[' . $approvalLink->getId() . ']',
$approvalLink->getCurrentState(),
null,
array('_null' => '--N/A--')
+ ($approvalLink->getCurrentAction()
? $this->approvalActions[$approvalLink->getCurrentAction()]->getResultStatusStrings()
: array())
); ?>
</td>
<td>
<?php echo $this->formSelect(
'nextAction[' . $approvalLink->getId() . ']',
$approvalLink->getNextAction(),
null,
$this->approvalActions->arrayFromMethod('getName')
); ?>
</td>
<td>
<?php echo $this->formCheckbox('delete[' . $approvalLink->getId() . ']'); ?>
</td>
</tr>
<?php } ?>
</table>
<?php echo $this->formSubmit('submitEditLinks', 'Update Links'); ?>
</form>
</div>
</div>
ul.editMenu {float: left;}
li.selected {font-weight: bold; font-size: 110%;}
div.editMain {float: left; overflow: hidden; padding: 0px 1em;}
\ No newline at end of file
var actionTypeSelectAjaxResponder = AjaxClient.extend(
{
selectElement: null,
processResponse: function() {
var resultNodes = this.requestObject.responseXML.childNodes[0].childNodes;
var resultStrings = new Array();
for (var i = 0; i < resultNodes.length; i++) {
var resultNode = resultNodes[i];
resultStrings.push(resultNode.getAttribute("name"));
}
this.selectElement.options.length = 0;
this.selectElement.add(new Option('--N/A--', '_null', false, false), null);
for (var i = 0; i < resultStrings.length; i++) {
var resultString = resultStrings[i]
this.selectElement.add(new Option(resultString, resultString, false, false), null);
}
}
});
function loadApprovalChainManager()
{
var actionSelectElements = getElementsByClass('actionSelectElement');
for(var i = 0; i < actionSelectElements.length; i++) {
var actionSelectElement = actionSelectElements[i];
actionSelectElement.onchange = updateActionResults;
}
/*
document.getElementById('select_manage_links').onclick = selectLinksOrActions;
document.getElementById('select_manage_actions').onclick = selectLinksOrActions;
var actionTypeSelects = getElementsByClass('action_type_select');
for (var i = 0; i < actionTypeSelects.length; i++) {
actionTypeSelects[i].onchange = updateEditActionDetails;
}
var addButtons = getElementsByClass('add_record_button');
for(var i = 0; i < addButtons.length; i++) {
addButtons[i].onclick = handleAddRecord;
}
var removeButtons = getElementsByClass('remove_record_button');
for(var i = 0; i < removeButtons.length; i++) {
removeButtons[i].onclick = handleRemoveRecord;
}
*/
}
addLoadEvent(loadApprovalChainManager);
function selectLinksOrActions()
{
if(this.id == 'select_manage_links') {
document.getElementById('manage_links').style.display = '';
document.getElementById('manage_actions').style.display = 'none';
} else {
document.getElementById('manage_links').style.display = 'none';
document.getElementById('manage_actions').style.display = '';
}
}
var _serverActionList = new Array();
function saveActionList(response)
{
if (req.readyState != 4) {
return;
}
if (req.status != 200) {
return;
}
_serverActionList = new Array();
actionXML = req.responseXML;
for (var i = 0; i < actionXML.childNodes.length; i++) {
var currentActionNode = actionXML.childNodes[i];
var currentAction = new Object();
currentAction.name = currentActionNode.getAttribute('name');
currentAction.className = currentActionNode.getAttribute('className');
currentAction.results = new Array();
for (var j = 0; j < currentActionNode.childNodes.length; j++) {
currentAction.results[j] = currentActionNode.childNodes[j].getAttribute('name');
}
_serverActionList[i] = currentAction;
}
}
function updateActionResults()
{
var actionResultElement = this.parentNode;
for(actionResultElement = actionResultElement.nextSibling;
actionResultElement.nodeName.toLowerCase() != 'td';
actionResultElement = actionResultElement.nextSibling);
actionResultElement = actionResultElement.getElementsByTagName('select').item(0);
if (this.value == '_null') {
actionResultElement.options.length = 0;
actionResultElement.add(new Option('--N/A--', '_null', false, false), null);
} else {
var responder = new actionTypeSelectAjaxResponder();
responder.selectElement = actionResultElement;
responder.sendRequest(baseUrl + '/requests/approval-chain-manager/get-action-detail-xml/id/' + this.value);
}
}
function updateEditActionDetails()
{
var chainId = document.getElementById('chainId').value;
var url = '/ApprovalChainManager/GetActionEditXhtml/' + this.value + '/' + chainId;
var responder = new updateEditActionDetailsAjaxResponder();
responder.actionElement = this;
responder.sendRequest(url);
}
function handleAddRecord()
{
var currentTR = this.parentNode.parentNode;
var currentTable = currentTR.parentNode;
var hiddenTR = currentTR.previousSibling.previousSibling;
var currentIndex = currentTable.getElementsByTagName('tr').length - 2;
var newNode = hiddenTR.cloneNode(true);
for(var i = 1; i < newNode.childNodes.length; i+=2) {
var inputElement = newNode.childNodes[i].childNodes[1];
inputElement.disabled = false;
var keyIndex = inputElement.name.indexOf('__key__');
if(keyIndex > 0) {
inputElement.name = inputElement.name.substr(0, keyIndex) + '-' + currentIndex + inputElement.name.substr(keyIndex + 7);
inputElement.id = inputElement.name;
}
}
newNode.childNodes[newNode.childNodes.length - 2].childNodes[1].onclick = handleRemoveRecord;
currentTable.insertBefore(newNode, hiddenTR);
newNode.className = '';
return false;
}
function handleRemoveRecord()
{
var currentTR = this.parentNode.parentNode;
var currentTable = currentTR.parentNode;
if(this.id.substr(0, 20) == 'remove_tie_in_button') {
var addButtonId = 'add' + this.id.substr(6);
document.getElementById(addButtonId).style.display = 'inline';
}
currentTable.removeChild(currentTR);
return false;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment