Skip to content

Commit 74ba24d

Browse files
authored
IBX-10362: No validation of matrix field without columns when creating content type (#1686)
1 parent 7c7222c commit 74ba24d

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -371,12 +371,12 @@
371371
const validateInput = (input) => {
372372
const isInputEmpty = !input.value;
373373
const field = input.closest('.form-group');
374-
const labelNode = field.querySelector('.ibexa-label');
375-
const errorNode = field.querySelector('.ibexa-form-error');
374+
const labelNode = field?.querySelector('.ibexa-label');
375+
const errorNode = field?.querySelector('.ibexa-form-error');
376376

377377
input.classList.toggle('is-invalid', isInputEmpty);
378378

379-
if (errorNode) {
379+
if (errorNode && labelNode) {
380380
errorNode.innerHTML = '';
381381

382382
if (isInputEmpty) {
@@ -390,8 +390,21 @@
390390

391391
isEditFormValid = isEditFormValid && !isInputEmpty;
392392
};
393+
const validateMatrixColumns = (columnSettingsNode) => {
394+
const columns = columnSettingsNode.querySelectorAll('.ibexa-matrix-settings__column');
395+
const requiredInputs = columnSettingsNode.querySelectorAll('.ibexa-input[required]');
396+
const hasAddedColumns = columns.length > 0;
397+
const hasEmptyRequiredInputs = [...requiredInputs].some((input) => !input.value);
398+
const isValid = hasAddedColumns && !hasEmptyRequiredInputs;
399+
const errorNode = columnSettingsNode.querySelector('.ibexa-form-error');
400+
401+
errorNode.toggleAttribute('hidden', hasAddedColumns);
402+
403+
return isValid;
404+
};
393405
const validateForm = () => {
394406
const fieldDefinitionsStatuses = {};
407+
const matrixColumnsSettingsNodes = doc.querySelectorAll('.ibexa-matrix-settings__columns');
395408

396409
isEditFormValid = true;
397410
inputsToValidate = editForm.querySelectorAll(SELECTOR_INPUTS_TO_VALIDATE);
@@ -403,16 +416,23 @@
403416
const { fieldDefinitionIdentifier } = fieldDefinition.dataset;
404417
const isInputEmpty = !input.value;
405418

406-
if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) {
407-
fieldDefinitionsStatuses[fieldDefinitionIdentifier] = [];
408-
}
409-
419+
fieldDefinitionsStatuses[fieldDefinitionIdentifier] ??= [];
410420
fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(isInputEmpty);
411421
}
412422

413423
validateInput(input);
414424
});
415425

426+
matrixColumnsSettingsNodes.forEach((columnSettingsNode) => {
427+
const fieldDefinition = columnSettingsNode.closest('.ibexa-collapse--field-definition');
428+
const { fieldDefinitionIdentifier } = fieldDefinition.dataset;
429+
const hasError = !validateMatrixColumns(columnSettingsNode);
430+
431+
fieldDefinitionsStatuses[fieldDefinitionIdentifier] ??= [];
432+
fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(hasError);
433+
isEditFormValid = isEditFormValid && !hasError;
434+
});
435+
416436
Object.entries(fieldDefinitionsStatuses).forEach(([fieldDefinitionIdentifier, inputsStatus]) => {
417437
const isFieldDefinitionValid = inputsStatus.every((hasError) => !hasError);
418438
const fieldDefinitionNode = doc.querySelector(`[data-field-definition-identifier="${fieldDefinitionIdentifier}"]`);
@@ -427,8 +447,8 @@
427447
};
428448
const scrollToInvalidInput = () => {
429449
const firstInvalidInput = editForm.querySelector('.ibexa-input.is-invalid');
430-
const fieldDefinition = firstInvalidInput.closest('.ibexa-collapse--field-definition');
431-
const scrollToNode = fieldDefinition ?? firstInvalidInput;
450+
const firstInvalidFieldDefinition = editForm.querySelector('.ibexa-collapse--field-definition.is-invalid');
451+
const scrollToNode = firstInvalidFieldDefinition ?? firstInvalidInput;
432452

433453
scrollToNode.scrollIntoView({ behavior: 'smooth' });
434454
};
@@ -629,6 +649,15 @@
629649
draggableGroups.push(draggable);
630650
});
631651

652+
doc.body.addEventListener('ibexa-fieldtype-matrix:added-column', (event) => {
653+
const { columnNode } = event.detail;
654+
const inputs = columnNode.querySelectorAll('.ibexa-input[required]');
655+
656+
inputs.forEach((input) => {
657+
attachValidateEvents(input);
658+
});
659+
});
660+
632661
fieldDefinitionsGroups.forEach((group) => group.addEventListener('click', () => setActiveGroup(group), false));
633662
inputsToValidate.forEach(attachValidateEvents);
634663

0 commit comments

Comments
 (0)