Skip to content

Commit

Permalink
#1249 Fix advanced enrichment validation
Browse files Browse the repository at this point in the history
  • Loading branch information
j3nsch committed Dec 4, 2024
1 parent 2bf6340 commit eae446b
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 12 deletions.
30 changes: 27 additions & 3 deletions modules/admin/forms/Document/Enrichment.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,15 @@ private function createValueFormElement($enrichmentValue, $enrichmentKey = null,
// vom Benutzer nicht verändert wurde)
$elementValue = $element->getValue();
$isValidValue = false;
if (! ($elementValue === false)) {
$isValidValue = $element->isValid($value);
if ($elementValue !== false) {
$isValidValue = $element->isValid($value); // TODO always needed because of side effects
if ($enrichmentType->getFormElementName() === 'Select') {
$values = $enrichmentType->getValues();
$isValidValue = in_array($value, $values);
if ($isValidValue) {
$element->removeDecorator('Errors');
}
}

// der Aufruf der isValid-Methode hat einen Seiteneffekt, der bei Select-Elementen
// zum Ersetzen des Index durch den tatsächlichen Wert führt
Expand All @@ -195,6 +202,23 @@ private function createValueFormElement($enrichmentValue, $enrichmentKey = null,
}
}
}
} else {
/* TODO show error message immediately if value cannot be saved (strict validation)
The message does not disappear right if another value is selected. The
Javascript in validation.js does not support 'errors', just 'datahint'.
*/
if ($enrichmentType->getFormElementName() === 'Select') {
$values = $enrichmentType->getValues();
if (! in_array($value, $values)) {
$this->getElement(self::ELEMENT_VALUE)->markAsError();
$element->setAttrib('data-opusValidationError', 'true'); // wird vom JavaScript-Code ausgewertet
}
} else {
if (! $element->isValid($value)) {
$this->getElement(self::ELEMENT_VALUE)->markAsError();
$element->setAttrib('data-opusValidationError', 'true'); // wird vom JavaScript-Code ausgewertet
}
}
}
}

Expand Down Expand Up @@ -261,7 +285,7 @@ public function updateModel($enrichment)
// keine Behandlung von Enrichments, die noch nicht in der Datenbank gespeichert sind,
// (nach dem Hinzufügen von Enrichments über Hinzufügen-Button)
if (! in_array($enrichment->getValue(), $enrichmentType->getValues())) {
if ($enrichmentValue === 0) {
if ((int) $enrichmentValue === 0) {
return; // keine Änderung des Enrichment-Werts
}

Expand Down
24 changes: 15 additions & 9 deletions public/layouts/opus4/js/validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -277,25 +277,31 @@ $(document).ready(function () {
* darauf hinweist, dass der aktuelle Formularwert gegen die Typkonfiguration des Enrichment-Keys verstößt,
* ausgeblendet werden, wenn der Formularwert geändert wird. Wird der Wert auf den ursprünglichen Formularwert
* zurückgesetzt, so soll der Hinweistext wieder eingeblendet werden (ohne Interaktion mit dem Server).
*
* TODO Fehlermeldungen bei der strikten Validierung sollen sich genauso verhalten.
*/
$("input[data-opusValidationError='true'], select[data-opusValidationError='true']").on('input', function (event) {
var element = $(this);
var errorMessage = element.next(".datahint");
if (errorMessage) {
var oldValue = errorMessage.data('errorValue');
var messageElement = element.next(".datahint");
var errorMessage = element.next(".errors");
if (errorMessage.length ) {
messageElement = errorMessage;
}
if (messageElement) {
var oldValue = messageElement.data('errorValue');
if (typeof oldValue === 'undefined' && (typeof event.target.defaultValue !== 'undefined')) {
// Input-Element wird das erste Mal behandelt (beim Select-Element brauchen wir den Ursprungswert nicht speichern)
errorMessage.data('errorValue', event.target.defaultValue);
messageElement.data('errorValue', event.target.defaultValue);
}

if (errorMessage.is(":visible")) {
errorMessage.hide();
if (messageElement.is(":visible")) {
messageElement.hide();
} else {
if (element.val() === errorMessage.data('errorValue') ||
((typeof errorMessage.data('errorValue') === 'undefined') && element.val() === '0')) {
if (element.val() === messageElement.data('errorValue') ||
((typeof messageElement.data('errorValue') === 'undefined') && element.val() === '0')) {
// beim Zurücksetzen auf den Ursprungswert Fehlermeldung wieder einblenden
// Sonderbehandlung für Select-Element: dort steht der Ursprungswert in der Auswahlliste immer an Position 0
errorMessage.show();
messageElement.show();
}
}
}
Expand Down

0 comments on commit eae446b

Please sign in to comment.