Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 38 additions & 9 deletions src/bundle/Resources/public/js/scripts/admin.contenttype.edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,12 @@
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);

if (errorNode) {
if (errorNode && labelNode) {
errorNode.innerHTML = '';

if (isInputEmpty) {
Expand All @@ -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);
Expand All @@ -403,16 +416,23 @@
const { fieldDefinitionIdentifier } = fieldDefinition.dataset;
const isInputEmpty = !input.value;

if (!fieldDefinitionsStatuses[fieldDefinitionIdentifier]) {
fieldDefinitionsStatuses[fieldDefinitionIdentifier] = [];
}

fieldDefinitionsStatuses[fieldDefinitionIdentifier] ??= [];
fieldDefinitionsStatuses[fieldDefinitionIdentifier].push(isInputEmpty);
}

validateInput(input);
});

matrixColumnsSettingsNodes.forEach((columnSettingsNode) => {
const fieldDefinition = columnSettingsNode.closest('.ibexa-collapse--field-definition');
const { fieldDefinitionIdentifier } = fieldDefinition.dataset;
const hasError = !validateMatrixColumns(columnSettingsNode);

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}"]`);
Expand All @@ -427,8 +447,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' });
};
Expand Down Expand Up @@ -629,6 +649,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);

Expand Down
Loading