From b263ff98a23987cc6571bd2af07e6c7322e233c9 Mon Sep 17 00:00:00 2001 From: Bastian Lederer Date: Tue, 10 Feb 2026 15:36:43 +0100 Subject: [PATCH] Add ColumnChooser form Add a new form that supports adding and removing dispalyed columns in tabular viewmode. --- .../Icingadb/Web/Control/ColumnChooser.php | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 library/Icingadb/Web/Control/ColumnChooser.php diff --git a/library/Icingadb/Web/Control/ColumnChooser.php b/library/Icingadb/Web/Control/ColumnChooser.php new file mode 100644 index 00000000..bae6b1a2 --- /dev/null +++ b/library/Icingadb/Web/Control/ColumnChooser.php @@ -0,0 +1,108 @@ +suggestionUrl = $suggestionUrl; + $this->resolver = $resolver; + } + + public function getPartUpdates(): array + { + $this->ensureAssembled(); + + return $this->getElement('columns')->prepareMultipartUpdate($this->getRequest()); + } + + public function isValid() + { + if (! parent::isValid()) { + return false; + } + + foreach ($this->getElement('columns')->getTerms() as $term) { + if ($term->getMessage() !== null) { + return false; + } + } + + return true; + } + + /** + * Validate terms, mark invalid ones, and set labels + * + * @param Term[] $terms + */ + protected function validateTermsAndSetLabels(array $terms): void + { + foreach ($terms as $term) { + try { + $columnDefinition = $this->resolver->getColumnDefinition($term->getSearchValue()); + $label = $columnDefinition->getLabel(); + if ($label !== null) { + $term->setLabel($label); + } + } catch (\Exception) { + $term->setMessage($this->translate('Is not a valid column')); + } + } + } + + /** + * Get the columns from the request + * + * @param ServerRequestInterface $request + * + * @return string + */ + protected function getColumns(ServerRequestInterface $request): string + { + $columns = $request->getQueryParams()['columns']; + + return $columns; + } + protected function assemble() + { + $termInput = (new TermInput( + 'columns', + [ + 'type' => 'text', + 'label' => $this->translate('Selected Columns'), + ] + )) + ->setRequired() + ->setVerticalTermDirection() + ->setReadOnly() + ->setOrdered() + ->setSuggestionUrl($this->suggestionUrl) + ->setValue($this->getColumns($this->getRequest())) + ->on(TermInput::ON_ENRICH, $this->validateTermsAndSetLabels(...)) + ->on(TermInput::ON_ADD, $this->validateTermsAndSetLabels(...)) + ->on(TermInput::ON_SAVE, $this->validateTermsAndSetLabels(...)) + ->on(TermInput::ON_PASTE, $this->validateTermsAndSetLabels(...)); + + $this->addElement($termInput); + $this->addElement('submit', 'apply', ['label' => $this->translate('Apply')]); + } +}