Skip to content

Commit a0cceeb

Browse files
committed
IBX-10362: No validation of matrix field without columns when creating content type
1 parent 260a6ca commit a0cceeb

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

dependencies.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"recipesEndpoint": "",
3+
"packages": [
4+
{
5+
"requirement": "dev-IBX-10362 as 4.6.x-dev",
6+
"repositoryUrl": "https://github.com/ibexa/fieldtype-matrix",
7+
"package": "ibexa/fieldtype-matrix",
8+
"shouldBeAddedAsVCS": false
9+
}
10+
]
11+
}

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,8 @@
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

@@ -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);
@@ -413,6 +426,19 @@
413426
validateInput(input);
414427
});
415428

429+
matrixColumnsSettingsNodes.forEach((columnSettingsNode) => {
430+
const fieldDefinition = columnSettingsNode.closest('.ibexa-collapse--field-definition');
431+
const { fieldDefinitionIdentifier } = fieldDefinition.dataset;
432+
const hasError = !validateMatrixColumns(columnSettingsNode);
433+
434+
if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) {
435+
fieldDefinitionsStatuses[fieldDefinitionIdentifier] = [];
436+
}
437+
438+
fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(hasError);
439+
isEditFormValid = isEditFormValid && !hasError;
440+
});
441+
416442
Object.entries(fieldDefinitionsStatuses).forEach(([fieldDefinitionIdentifier, inputsStatus]) => {
417443
const isFieldDefinitionValid = inputsStatus.every((hasError) => !hasError);
418444
const fieldDefinitionNode = doc.querySelector(`[data-field-definition-identifier="${fieldDefinitionIdentifier}"]`);
@@ -427,8 +453,8 @@
427453
};
428454
const scrollToInvalidInput = () => {
429455
const firstInvalidInput = editForm.querySelector('.ibexa-input.is-invalid');
430-
const fieldDefinition = firstInvalidInput.closest('.ibexa-collapse--field-definition');
431-
const scrollToNode = fieldDefinition ?? firstInvalidInput;
456+
const firstInvalidFieldDefinition = editForm.querySelector('.ibexa-collapse--field-definition.is-invalid');
457+
const scrollToNode = firstInvalidFieldDefinition ?? firstInvalidInput;
432458

433459
scrollToNode.scrollIntoView({ behavior: 'smooth' });
434460
};
@@ -629,6 +655,15 @@
629655
draggableGroups.push(draggable);
630656
});
631657

658+
doc.body.addEventListener('ibexa-fieldtype-matrix:added-column', (event) => {
659+
const { columnNode } = event.detail;
660+
const inputs = columnNode.querySelectorAll('.ibexa-input[required]');
661+
662+
[...inputs].forEach((input) => {
663+
attachValidateEvents(input);
664+
});
665+
});
666+
632667
fieldDefinitionsGroups.forEach((group) => group.addEventListener('click', () => setActiveGroup(group), false));
633668
inputsToValidate.forEach(attachValidateEvents);
634669

0 commit comments

Comments
 (0)