- // Remove violations of inaccessible fields and not edited fields.
- $violations
- ->filterByFieldAccess($this->currentUser())
- ->filterByFields(array_diff(array_keys($entity->getFieldDefinitions()), $this->getEditedFieldNames($form_state)));
+ // Remove violations of inaccessible fields.
+ $violations->filterByFieldAccess($this->currentUser());
+
+ // In case a field-level submit button is clicked, for example the 'Add
+ // another item' button for multi-value fields or the 'Upload' button for a
+ // File or an Image field, make sure that we only keep violations for that
+ // specific field.
+ $edited_fields = [];
+ if ($limit_validation_errors = $form_state->getLimitValidationErrors()) {
+ foreach ($limit_validation_errors as $section) {
+ $field_name = reset($section);
+ if ($entity->hasField($field_name)) {
+ $edited_fields[] = $field_name;
+ }
+ }
+ $edited_fields = array_unique($edited_fields);
+ }
+ else {
+ $edited_fields = $this->getEditedFieldNames($form_state);
+ }
+
+ // Remove violations for fields that are not edited.
+ $violations->filterByFields(array_diff(array_keys($entity->getFieldDefinitions()), $edited_fields));