From 2e3db16cbdef2ba1c5935cd96e4b05e819afe253 Mon Sep 17 00:00:00 2001 From: Lukasz Ostafin Date: Tue, 19 Aug 2025 16:23:38 +0200 Subject: [PATCH 1/3] IBX-10362: No validation of matrix field without columns when creating content type --- dependencies.json | 11 +++++ .../js/scripts/admin.contenttype.edit.js | 43 +++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 dependencies.json diff --git a/dependencies.json b/dependencies.json new file mode 100644 index 0000000000..a22e7c9c27 --- /dev/null +++ b/dependencies.json @@ -0,0 +1,11 @@ +{ + "recipesEndpoint": "", + "packages": [ + { + "requirement": "dev-IBX-10362 as 4.6.x-dev", + "repositoryUrl": "https://github.com/ibexa/fieldtype-matrix", + "package": "ibexa/fieldtype-matrix", + "shouldBeAddedAsVCS": false + } + ] +} \ No newline at end of file diff --git a/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js b/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js index a88491860a..4f5cfe047f 100644 --- a/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js +++ b/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js @@ -371,8 +371,8 @@ const validateInput = (input) => { const isInputEmpty = !input.value; const field = input.closest('.form-group'); - const labelNode = field.querySelector('.ibexa-label'); - const errorNode = field.querySelector('.ibexa-form-error'); + const labelNode = field?.querySelector('.ibexa-label'); + const errorNode = field?.querySelector('.ibexa-form-error'); input.classList.toggle('is-invalid', isInputEmpty); @@ -390,8 +390,21 @@ isEditFormValid = isEditFormValid && !isInputEmpty; }; + const validateMatrixColumns = (columnSettingsNode) => { + const columns = columnSettingsNode.querySelectorAll('.ibexa-matrix-settings__column'); + const requiredInputs = columnSettingsNode.querySelectorAll('.ibexa-input[required]'); + const hasAddedColumns = columns.length > 0; + const hasEmptyRequiredInputs = [...requiredInputs].some((input) => !input.value); + const isValid = hasAddedColumns && !hasEmptyRequiredInputs; + const errorNode = columnSettingsNode.querySelector('.ibexa-form-error'); + + errorNode.toggleAttribute('hidden', hasAddedColumns); + + return isValid; + }; const validateForm = () => { const fieldDefinitionsStatuses = {}; + const matrixColumnsSettingsNodes = doc.querySelectorAll('.ibexa-matrix-settings__columns'); isEditFormValid = true; inputsToValidate = editForm.querySelectorAll(SELECTOR_INPUTS_TO_VALIDATE); @@ -413,6 +426,19 @@ validateInput(input); }); + matrixColumnsSettingsNodes.forEach((columnSettingsNode) => { + const fieldDefinition = columnSettingsNode.closest('.ibexa-collapse--field-definition'); + const { fieldDefinitionIdentifier } = fieldDefinition.dataset; + const hasError = !validateMatrixColumns(columnSettingsNode); + + if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) { + fieldDefinitionsStatuses[fieldDefinitionIdentifier] = []; + } + + fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(hasError); + isEditFormValid = isEditFormValid && !hasError; + }); + Object.entries(fieldDefinitionsStatuses).forEach(([fieldDefinitionIdentifier, inputsStatus]) => { const isFieldDefinitionValid = inputsStatus.every((hasError) => !hasError); const fieldDefinitionNode = doc.querySelector(`[data-field-definition-identifier="${fieldDefinitionIdentifier}"]`); @@ -427,8 +453,8 @@ }; const scrollToInvalidInput = () => { const firstInvalidInput = editForm.querySelector('.ibexa-input.is-invalid'); - const fieldDefinition = firstInvalidInput.closest('.ibexa-collapse--field-definition'); - const scrollToNode = fieldDefinition ?? firstInvalidInput; + const firstInvalidFieldDefinition = editForm.querySelector('.ibexa-collapse--field-definition.is-invalid'); + const scrollToNode = firstInvalidFieldDefinition ?? firstInvalidInput; scrollToNode.scrollIntoView({ behavior: 'smooth' }); }; @@ -629,6 +655,15 @@ draggableGroups.push(draggable); }); + doc.body.addEventListener('ibexa-fieldtype-matrix:added-column', (event) => { + const { columnNode } = event.detail; + const inputs = columnNode.querySelectorAll('.ibexa-input[required]'); + + [...inputs].forEach((input) => { + attachValidateEvents(input); + }); + }); + fieldDefinitionsGroups.forEach((group) => group.addEventListener('click', () => setActiveGroup(group), false)); inputsToValidate.forEach(attachValidateEvents); From a0917dc4b7d737cb2cd3ef1a1e311f515725be2d Mon Sep 17 00:00:00 2001 From: Lukasz Ostafin Date: Mon, 25 Aug 2025 09:21:05 +0200 Subject: [PATCH 2/3] After CR --- .../public/js/scripts/admin.contenttype.edit.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js b/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js index 4f5cfe047f..800c8eb06d 100644 --- a/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js +++ b/src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js @@ -376,7 +376,7 @@ input.classList.toggle('is-invalid', isInputEmpty); - if (errorNode) { + if (errorNode && labelNode) { errorNode.innerHTML = ''; if (isInputEmpty) { @@ -416,10 +416,7 @@ const { fieldDefinitionIdentifier } = fieldDefinition.dataset; const isInputEmpty = !input.value; - if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) { - fieldDefinitionsStatuses[fieldDefinitionIdentifier] = []; - } - + fieldDefinitionsStatuses[fieldDefinitionIdentifier] ??= []; fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(isInputEmpty); } @@ -431,10 +428,7 @@ const { fieldDefinitionIdentifier } = fieldDefinition.dataset; const hasError = !validateMatrixColumns(columnSettingsNode); - if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) { - fieldDefinitionsStatuses[fieldDefinitionIdentifier] = []; - } - + fieldDefinitionsStatuses[fieldDefinitionIdentifier] ??= []; fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(hasError); isEditFormValid = isEditFormValid && !hasError; }); @@ -659,7 +653,7 @@ const { columnNode } = event.detail; const inputs = columnNode.querySelectorAll('.ibexa-input[required]'); - [...inputs].forEach((input) => { + inputs.forEach((input) => { attachValidateEvents(input); }); }); From f9836374ba64ab96c1e129ae421220102957e048 Mon Sep 17 00:00:00 2001 From: Lukasz Ostafin Date: Mon, 1 Sep 2025 13:24:43 +0200 Subject: [PATCH 3/3] Removed dependecies file --- dependencies.json | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 dependencies.json diff --git a/dependencies.json b/dependencies.json deleted file mode 100644 index a22e7c9c27..0000000000 --- a/dependencies.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "recipesEndpoint": "", - "packages": [ - { - "requirement": "dev-IBX-10362 as 4.6.x-dev", - "repositoryUrl": "https://github.com/ibexa/fieldtype-matrix", - "package": "ibexa/fieldtype-matrix", - "shouldBeAddedAsVCS": false - } - ] -} \ No newline at end of file