From cb83f800b979169ba3faab020ac5bd74deeeb9de Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 3 Aug 2023 10:26:50 +0200 Subject: [PATCH] Drop class `AddNodeForm` --- application/controllers/ProcessController.php | 10 +- application/forms/AddNodeForm.php | 513 ------------------ 2 files changed, 1 insertion(+), 522 deletions(-) delete mode 100644 application/forms/AddNodeForm.php diff --git a/application/controllers/ProcessController.php b/application/controllers/ProcessController.php index 0cfced2..4a6495e 100644 --- a/application/controllers/ProcessController.php +++ b/application/controllers/ProcessController.php @@ -268,15 +268,7 @@ class ProcessController extends Controller $canEdit = $bp->getMetadata()->canModify(); - if ($action === 'add' && $canEdit) { - $form = $this->loadForm('AddNode') - ->setSuccessUrl(Url::fromRequest()->without('action')) - ->setStorage($this->storage()) - ->setProcess($bp) - ->setParentNode($node) - ->setSession($this->session()) - ->handleRequest(); - } elseif ($action === 'cleanup' && $canEdit) { + if ($action === 'cleanup' && $canEdit) { $form = $this->loadForm('CleanupNode') ->setSuccessUrl(Url::fromRequest()->without('action')) ->setProcess($bp) diff --git a/application/forms/AddNodeForm.php b/application/forms/AddNodeForm.php deleted file mode 100644 index 4759d99..0000000 --- a/application/forms/AddNodeForm.php +++ /dev/null @@ -1,513 +0,0 @@ -getView(); - if ($this->hasParentNode()) { - $this->addHtml( - '

' . $view->escape( - sprintf($this->translate('Add a node to %s'), $this->parent->getAlias()) - ) . '

' - ); - } else { - $this->addHtml( - '

' . $this->translate('Add a new root node') . '

' - ); - } - - $type = $this->selectNodeType(); - switch ($type) { - case 'host': - $this->selectHost(); - break; - case 'service': - $this->selectService(); - break; - case 'process': - $this->selectProcess(); - break; - case 'new-process': - $this->addNewProcess(); - break; - case 'hosts_from_filter': - $this->selectHostsFromFilter(); - break; - case 'services_from_filter': - $this->selectServicesFromFilter(); - break; - case null: - $this->setSubmitLabel($this->translate('Next')); - return; - } - } - - protected function addNewProcess() - { - $this->addElement('text', 'name', array( - 'label' => $this->translate('ID'), - 'required' => true, - 'description' => $this->translate( - 'This is the unique identifier of this process' - ), - 'validators' => [ - ['Callback', true, [ - 'callback' => function ($value) { - if ($this->hasParentNode()) { - return ! $this->parent->hasChild($value); - } - - return ! $this->bp->hasRootNode($value); - }, - 'messages' => [ - 'callbackValue' => $this->translate('%value% is already defined in this process') - ] - ]] - ] - )); - - $this->addElement('text', 'alias', array( - 'label' => $this->translate('Display Name'), - 'description' => $this->translate( - 'Usually this name will be shown for this node. Equals ID' - . ' if not given' - ), - )); - - $this->addElement('select', 'operator', array( - 'label' => $this->translate('Operator'), - 'required' => true, - 'multiOptions' => Node::getOperators() - )); - - $display = 1; - if ($this->bp->getMetadata()->isManuallyOrdered() && ! $this->bp->isEmpty()) { - $rootNodes = self::applyManualSorting($this->bp->getRootNodes()); - $display = end($rootNodes)->getDisplay() + 1; - } - $this->addElement('select', 'display', array( - 'label' => $this->translate('Visualization'), - 'required' => true, - 'description' => $this->translate( - 'Where to show this process' - ), - 'value' => $this->hasParentNode() ? '0' : "$display", - 'multiOptions' => array( - "$display" => $this->translate('Toplevel Process'), - '0' => $this->translate('Subprocess only'), - ) - )); - - $this->addElement('text', 'infoUrl', array( - 'label' => $this->translate('Info URL'), - 'description' => $this->translate( - 'URL pointing to more information about this node' - ) - )); - } - - /** - * @return string|null - */ - protected function selectNodeType() - { - $types = array(); - if ($this->hasParentNode()) { - $types['host'] = $this->translate('Host'); - $types['service'] = $this->translate('Service'); - $types['hosts_from_filter'] = $this->translate('Hosts from filter'); - $types['services_from_filter'] = $this->translate('Services from filter'); - } elseif (! $this->hasProcesses()) { - $this->addElement('hidden', 'node_type', array( - 'ignore' => true, - 'decorators' => array('ViewHelper'), - 'value' => 'new-process' - )); - - return 'new-process'; - } - - if ($this->hasProcesses() || ($this->hasParentNode() && $this->hasMoreConfigs())) { - $types['process'] = $this->translate('Existing Process'); - } - - $types['new-process'] = $this->translate('New Process Node'); - - $this->addElement('select', 'node_type', array( - 'label' => $this->translate('Node type'), - 'required' => true, - 'description' => $this->translate( - 'The node type you want to add' - ), - 'ignore' => true, - 'class' => 'autosubmit', - 'multiOptions' => $this->optionalEnum($types) - )); - - return $this->getSentValue('node_type'); - } - - protected function selectHost() - { - $this->addElement('multiselect', 'children', [ - 'label' => $this->translate('Hosts'), - 'required' => true, - 'size' => 8, - 'multiOptions' => $this->enumHostList(), - 'description' => $this->translate( - 'Hosts that should be part of this business process node' - ), - 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] - ]); - - $this->addHostOverrideCheckbox(); - if ($this->getSentValue('host_override') === '1') { - $this->addHostOverrideElement(); - } - } - - protected function selectService() - { - $this->addHostElement(); - if ($host = $this->getSentValue('host')) { - $this->addServicesElement($host); - $this->addServiceOverrideCheckbox(); - - if ($this->getSentValue('service_override') === '1') { - $this->addServiceOverrideElement(); - } - } else { - $this->setSubmitLabel($this->translate('Next')); - } - } - - protected function addHostElement() - { - $this->addElement('select', 'host', array( - 'label' => $this->translate('Host'), - 'required' => true, - 'ignore' => true, - 'class' => 'autosubmit', - 'multiOptions' => $this->optionalEnum($this->enumHostForServiceList()), - )); - } - - protected function addServicesElement($host) - { - $this->addElement('multiselect', 'children', [ - 'label' => $this->translate('Services'), - 'required' => true, - 'size' => 8, - 'multiOptions' => $this->enumServiceList($host), - 'description' => $this->translate( - 'Services that should be part of this business process node' - ), - 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] - ]); - } - - protected function addFilteredHostsElement($filter) - { - $this->addElement('submit', 'refresh', [ - 'label' => $this->translate('Refresh'), - 'class' => 'refresh-filter' - ]); - $this->addElement('multiselect', 'children', [ - 'label' => $this->translate('Hosts'), - 'required' => true, - 'size' => 8, - 'multiOptions' => $this->enumHostListByFilter($filter), - 'description' => $this->translate( - 'Hosts that should be part of this business process node' - ), - 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] - ]); - } - - protected function addFilteredServicesElement($filter) - { - $this->addElement('submit', 'refresh', [ - 'label' => $this->translate('Refresh'), - 'class' => 'refresh-filter' - ]); - $this->addElement('multiselect', 'children', [ - 'label' => $this->translate('Services'), - 'required' => true, - 'size' => 8, - 'multiOptions' => $this->enumServiceListByFilter($filter), - 'description' => $this->translate( - 'Services that should be part of this business process node' - ), - 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] - ]); - } - - protected function addFilterElement() - { - $this->addElement('text', 'filter', array( - 'label' => $this->translate('Filter'), - 'required' => true, - 'ignore' => true - )); - } - - protected function addFileElement() - { - $this->addElement('select', 'file', [ - 'label' => $this->translate('File'), - 'required' => true, - 'ignore' => true, - 'value' => $this->bp->getName(), - 'class' => 'autosubmit', - 'multiOptions' => $this->optionalEnum($this->enumConfigs()), - 'description' => $this->translate( - 'Choose a different configuration file to import its processes' - ) - ]); - } - - protected function addHostOverrideCheckbox() - { - $this->addElement('checkbox', 'host_override', [ - 'ignore' => true, - 'class' => 'autosubmit', - 'label' => $this->translate('Override Host State'), - 'description' => $this->translate('Enable host state overrides') - ]); - } - - protected function addHostOverrideElement() - { - $this->addElement('stateOverrides', 'stateOverrides', [ - 'required' => true, - 'label' => $this->translate('State Overrides'), - 'states' => $this->enumHostStateList() - ]); - } - - protected function addServiceOverrideCheckbox() - { - $this->addElement('checkbox', 'service_override', [ - 'ignore' => true, - 'class' => 'autosubmit', - 'label' => $this->translate('Override Service State'), - 'description' => $this->translate('Enable service state overrides') - ]); - } - - protected function addServiceOverrideElement() - { - $this->addElement('stateOverrides', 'stateOverrides', [ - 'required' => true, - 'label' => $this->translate('State Overrides'), - 'states' => $this->enumServiceStateList() - ]); - } - - protected function selectHostsFromFilter() - { - $this->addFilterElement(); - if ($filter = $this->getSentValue('filter')) { - $this->addFilteredHostsElement($filter); - } else { - $this->setSubmitLabel($this->translate('Next')); - } - } - - protected function selectServicesFromFilter() - { - $this->addFilterElement(); - if ($filter = $this->getSentValue('filter')) { - $this->addFilteredServicesElement($filter); - } else { - $this->setSubmitLabel($this->translate('Next')); - } - } - - protected function selectProcess() - { - if ($this->hasParentNode()) { - $this->addFileElement(); - } - - if (($file = $this->getSentValue('file')) || !$this->hasParentNode()) { - $this->addElement('multiselect', 'children', [ - 'label' => $this->translate('Process nodes'), - 'required' => true, - 'size' => 8, - 'multiOptions' => $this->enumProcesses($file), - 'description' => $this->translate( - 'Other processes that should be part of this business process node' - ), - 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] - ]); - } else { - $this->setSubmitLabel($this->translate('Next')); - } - } - - /** - * @param BpNode|null $node - * @return $this - */ - public function setParentNode(BpNode $node = null) - { - $this->parent = $node; - return $this; - } - - /** - * @return bool - */ - public function hasParentNode() - { - return $this->parent !== null; - } - - protected function hasProcesses() - { - return count($this->enumProcesses()) > 0; - } - - /** - * @param string $file - * @return array - */ - protected function enumProcesses($file = null) - { - $list = array(); - - $parents = array(); - - $differentFile = $file !== null && $file !== $this->bp->getName(); - - if (! $differentFile && $this->hasParentNode()) { - $this->collectAllParents($this->parent, $parents); - $parents[$this->parent->getName()] = $this->parent; - } - - $bp = $this->bp; - if ($differentFile) { - try { - $bp = $this->storage->loadProcess($file); - } catch (Exception $e) { - $this->addError('Cannot add invalid config file'); - - return $list; - } - } - - foreach ($bp->getNodes() as $node) { - if (! $node instanceof ImportedNode && $node instanceof BpNode && ! isset($parents[$node->getName()])) { - $name = $node->getName(); - if ($differentFile) { - $name = '@' . $file . ':' . $name; - } - - $list[$name] = $node->getName(); // display name? - } - } - - return $list; - } - - protected function hasMoreConfigs() - { - $configs = $this->enumConfigs(); - return !empty($configs); - } - - protected function enumConfigs() - { - return $this->storage->listProcesses(); - } - - /** - * Collect the given node's parents recursively into the given array by their names - * - * @param BpNode $node - * @param BpNode[] $parents - */ - protected function collectAllParents(BpNode $node, array &$parents) - { - foreach ($node->getParents() as $parent) { - $parents[$parent->getName()] = $parent; - $this->collectAllParents($parent, $parents); - } - } - - public function onSuccess() - { - $changes = ProcessChanges::construct($this->bp, $this->session); - switch ($this->getValue('node_type')) { - case 'host': - case 'service': - $stateOverrides = $this->getValue('stateOverrides'); - if (! empty($stateOverrides)) { - $childOverrides = []; - foreach ($this->getValue('children') as $service) { - $childOverrides[$service] = $stateOverrides; - } - - $changes->modifyNode($this->parent, [ - 'stateOverrides' => array_merge($this->parent->getStateOverrides(), $childOverrides) - ]); - } - - // Fallthrough - case 'process': - case 'hosts_from_filter': - case 'services_from_filter': - if ($this->hasParentNode()) { - $changes->addChildrenToNode($this->getValue('children'), $this->parent); - } else { - foreach ($this->getValue('children') as $nodeName) { - $changes->copyNode($nodeName); - } - } - - break; - case 'new-process': - $properties = $this->getValues(); - unset($properties['name']); - if (! $properties['alias']) { - unset($properties['alias']); - } - if ($this->hasParentNode()) { - $properties['parentName'] = $this->parent->getName(); - } - $changes->createNode(BpConfig::escapeName($this->getValue('name')), $properties); - break; - } - - // Trigger session destruction to make sure it get's stored. - // TODO: figure out why this is necessary, might be an unclean shutdown on redirect - unset($changes); - - parent::onSuccess(); - } -}