diff --git a/application/forms/EventRuleConfigElements/EscalationCondition.php b/application/forms/EventRuleConfigElements/EscalationCondition.php index 1bbbc1ff3..b94fffc37 100644 --- a/application/forms/EventRuleConfigElements/EscalationCondition.php +++ b/application/forms/EventRuleConfigElements/EscalationCondition.php @@ -116,6 +116,7 @@ protected function assemble(): void ] ); + $valUnit = null; switch ($this->getPopulatedValue('column_' . $i)) { case 'incident_severity': /** @var BaseFormElement $val */ @@ -154,28 +155,25 @@ protected function assemble(): void case 'incident_age': /** @var BaseFormElement $val */ $val = $this->createElement( - 'text', + 'number', $valName, [ 'required' => true, - 'class' => ['autosubmit', 'right-operand'], - 'validators' => [ - new CallbackValidator(function ($value, $validator) { - if (! preg_match('~^\d+(?:\.?\d*)?[hms]{1}$~', $value)) { - $validator->addMessage( - $this->translate( - 'Only numbers with optional fractions (separated by a dot)' - . ' and one of these suffixes are allowed: h, m, s' - ) - ); - - return false; - } - - $validator->clearMessages(); - return true; - }) - ] + 'class' => ['right-operand'], + 'value' => 1 + ] + ); + + $valUnit = $this->createElement( + 'select', + 'age_unit_' . $i, + [ + 'options' => [ + 's' => 's', + 'm' => 'm', + 'h' => 'h' + ], + 'class' => 'age-unit' ] ); @@ -191,6 +189,7 @@ protected function assemble(): void 'value' => 'incident_age' ]); + $this->registerElement($valUnit); break; default: /** @var BaseFormElement $val */ @@ -213,6 +212,7 @@ protected function assemble(): void $col, $op, $val, + $valUnit, $removeButton ); } @@ -230,6 +230,10 @@ protected function assemble(): void $this->conditions[$nextCount]->conditionType->setName('column_' . $n); $this->conditions[$nextCount]->operator->setName('operator_' . $n); $this->conditions[$nextCount]->conditionVal->setName('val_' . $n); + if ($this->conditions[$nextCount]->conditionUnit) { + $this->conditions[$nextCount]->conditionUnit->setName('age_unit_' . $n); + } + if ($conditionCount === 1) { $this->conditions[$nextCount]->removeButton = null; } elseif ($this->conditions[$nextCount]->removeButton) { @@ -308,7 +312,8 @@ public function getCondition(): string $filterStr = $chosenType . $this->getValue('operator_' . $count) - . ($this->getValue('val_' . $count) ?? ($chosenType === 'incident_severity' ? 'ok' : '')); + . ($this->getValue('val_' . $count) ?? ($chosenType === 'incident_severity' ? 'ok' : '')) + . $this->getValue('age_unit_' . $count, ''); $filter->add(QueryString::parse($filterStr)); } diff --git a/application/forms/EventRuleConfigForm.php b/application/forms/EventRuleConfigForm.php index 84cf98dc8..c730222d1 100644 --- a/application/forms/EventRuleConfigForm.php +++ b/application/forms/EventRuleConfigForm.php @@ -340,7 +340,14 @@ public function populate($values): self } $conditionFormValues['operator_' . $count] = QueryString::getRuleSymbol($filter); - $conditionFormValues['val_' . $count] = $filter->getValue(); + $conditionValue = $filter->getValue(); + $incidentAgeCondition = preg_split('~^\d+(?:\.?\d*)?[hms]$~', $filter->getValue()); + if ($incidentAgeCondition !== false && count($incidentAgeCondition) === 2) { + $conditionFormValues['val_' . $count] = $incidentAgeCondition[0]; + $conditionFormValues['age_unit_' . $count] = $incidentAgeCondition[1]; + } else { + $conditionFormValues['val_' . $count] = $conditionValue; + } } $formValues['escalation-condition_' . bin2hex($position)] = $conditionFormValues; diff --git a/library/Notifications/Widget/ItemList/EscalationConditionListItem.php b/library/Notifications/Widget/ItemList/EscalationConditionListItem.php index ce9c33d9e..3308a6723 100644 --- a/library/Notifications/Widget/ItemList/EscalationConditionListItem.php +++ b/library/Notifications/Widget/ItemList/EscalationConditionListItem.php @@ -26,15 +26,20 @@ class EscalationConditionListItem extends BaseHtmlElement /** @var BaseFormElement Condition value */ public $conditionVal; + /** @var ?BaseFormElement Condition value */ + public $conditionUnit; + public function __construct( BaseFormElement $conditionType, BaseFormElement $operator, BaseFormElement $conditionVal, + ?BaseFormElement $conditionUnit, ?SubmitButtonElement $removeButton ) { $this->conditionType = $conditionType; $this->operator = $operator; $this->conditionVal = $conditionVal; + $this->conditionUnit = $conditionUnit; $this->removeButton = $removeButton; } @@ -44,6 +49,7 @@ protected function assemble(): void $this->conditionType, $this->operator, $this->conditionVal, + $this->conditionUnit, $this->removeButton ]); } diff --git a/public/css/event-rule-config.less b/public/css/event-rule-config.less index 241976a90..602d4713f 100644 --- a/public/css/event-rule-config.less +++ b/public/css/event-rule-config.less @@ -178,6 +178,12 @@ margin: 0; } + .age-unit { + border-radius: 0.4em; + min-width: 3.5em; + margin-left: 1px; + } + .errors + .remove-button { margin: 0; }