From a35414f6b51774df9f2773bfd5c8b2d4a858c752 Mon Sep 17 00:00:00 2001 From: Bartek Wajda <bartlomiej.wajda@ibexa.co> Date: Tue, 17 Jan 2023 11:20:24 +0100 Subject: [PATCH 1/9] IBX-4629: Implement Meta fieldgroups --- .../Configuration/Parser/AdminUiForms.php | 19 ++++++++ .../Resources/config/admin_ui_forms.yaml | 2 + .../content/components/meta_fields.html.twig | 2 +- .../ContentEditMetaFieldsComponent.php | 20 ++++++-- .../SetViewParametersListener.php | 13 ++++- .../GroupedNonMetaFormFieldsProvider.php | 23 ++++++++- src/lib/Menu/ContentEditAnchorMenuBuilder.php | 20 +++++++- .../Configuration/Parser/AdminUiFormsTest.php | 41 ++++++++++++++++ .../SetViewParametersListenerTest.php | 47 ++++++++++++++----- 9 files changed, 168 insertions(+), 19 deletions(-) diff --git a/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php b/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php index b58add3a4d..100136773e 100644 --- a/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php +++ b/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php @@ -29,6 +29,7 @@ class AdminUiForms extends AbstractParser { public const FORM_TEMPLATES_PARAM = 'admin_ui_forms.content_edit_form_templates'; public const FIELD_TYPES_PARAM = 'admin_ui_forms.content_edit.fieldtypes'; + public const META_FIELDGROUP_LIST_PARAM = 'admin_ui_forms.content_edit.meta_fieldgroup_list'; public const CONTENT_TYPE_FIELD_TYPES_PARAM = 'admin_ui_forms.content_type_edit.field_types'; public const CONTENT_TYPE_DEFAULT_META_FIELD_TYPE_GROUP_PARAM = 'admin_ui_forms.content_type_edit.default_meta_field_type_group'; @@ -87,6 +88,12 @@ public function addSemanticConfig(NodeBuilder $nodeBuilder) ->end() ->end() ->end() + ->arrayNode('meta_fieldgroup_list') + ->performNoDeepMerging() + ->scalarPrototype()->end() + ->info('List of field groups that would be placed under a meta section in a content form') + ->defaultValue(['metadata']) + ->end() ->end() ->end() ->arrayNode('content_type_edit') @@ -156,6 +163,12 @@ public function mapConfig( unset($scopeSettings['admin_ui_forms']['content_edit']['fieldtypes']); } + if (!empty($scopeSettings['admin_ui_forms']['content_edit']['meta_fieldgroup_list'])) { + $scopeSettings['admin_ui_forms.content_edit.meta_fieldgroup_list'] = + $scopeSettings['admin_ui_forms']['content_edit']['meta_fieldgroup_list']; + unset($scopeSettings['admin_ui_forms']['content_edit']['meta_fieldgroup_list']); + } + if (!empty($scopeSettings['admin_ui_forms']['content_type_edit']['field_types'])) { $scopeSettings['admin_ui_forms.content_type_edit.field_types'] = $scopeSettings['admin_ui_forms']['content_type_edit']['field_types']; @@ -178,6 +191,11 @@ public function mapConfig( $currentScope, $scopeSettings['admin_ui_forms.content_edit.fieldtypes'] ?? [] ); + $contextualizer->setContextualParameter( + self::META_FIELDGROUP_LIST_PARAM, + $currentScope, + $scopeSettings['admin_ui_forms.content_edit.meta_fieldgroup_list'] ?? [] + ); $contextualizer->setContextualParameter( self::CONTENT_TYPE_FIELD_TYPES_PARAM, $currentScope, @@ -197,6 +215,7 @@ public function postMap(array $config, ContextualizerInterface $contextualizer) { $contextualizer->mapConfigArray('admin_ui_forms.content_edit_form_templates', $config); $contextualizer->mapConfigArray('admin_ui_forms.content_edit.fieldtypes', $config); + $contextualizer->mapConfigArray('admin_ui_forms.content_edit.meta_fieldgroup_list', $config); $contextualizer->mapConfigArray('admin_ui_forms.content_type_edit.field_types', $config); $contextualizer->mapSetting('admin_ui_forms.content_type_edit.default_meta_field_type_group', $config); } diff --git a/src/bundle/Resources/config/admin_ui_forms.yaml b/src/bundle/Resources/config/admin_ui_forms.yaml index 83e09af8c5..c9e26dfab4 100644 --- a/src/bundle/Resources/config/admin_ui_forms.yaml +++ b/src/bundle/Resources/config/admin_ui_forms.yaml @@ -2,6 +2,8 @@ system: admin_group: admin_ui_forms: content_edit: + meta_fieldgroup_list: + - metadata form_templates: - { template: '@ibexadesign/content/form_fields.html.twig', priority: 0 } diff --git a/src/bundle/Resources/views/themes/admin/content/components/meta_fields.html.twig b/src/bundle/Resources/views/themes/admin/content/components/meta_fields.html.twig index 2915273f34..2f82bd5cf2 100644 --- a/src/bundle/Resources/views/themes/admin/content/components/meta_fields.html.twig +++ b/src/bundle/Resources/views/themes/admin/content/components/meta_fields.html.twig @@ -5,7 +5,7 @@ {% block sections %} {% for identifier in meta_fields %} {% embed '@ibexadesign/ui/component/anchor_navigation/section.html.twig' with {'form': form, 'identifier': identifier} %} - {% set data_id = 'ibexa-edit-content-sections-meta-' ~ identifier %} + {% set data_id = '#ibexa-edit-content-sections-meta-' ~ identifier %} {% block content %} {% from '@ibexadesign/content/edit_macros.html.twig' import render_form_field %} diff --git a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php index b72a34ddb0..227a51d439 100644 --- a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php +++ b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php @@ -10,6 +10,7 @@ use Ibexa\Contracts\AdminUi\Component\Renderable; use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; +use Ibexa\Core\Repository\Values\ContentType\FieldDefinition; use Twig\Environment; class ContentEditMetaFieldsComponent implements Renderable @@ -39,17 +40,30 @@ public function render(array $parameters = []): string $contentType = $parameters['content_type']; $metaFieldTypeIdentifiers = $this->getMetaFieldTypeIdentifiers(); + $metaFieldGroups = $this->configResolver->getParameter( + 'admin_ui_forms.content_edit.meta_fieldgroup_list' + ); + $metaFieldDefinitionCollection = $contentType->fieldDefinitions->filter( + static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), + ); - if (empty($metaFieldTypeIdentifiers)) { + if (empty($metaFieldTypeIdentifiers) && $metaFieldDefinitionCollection->isEmpty()) { return self::NO_CONTENT; } - $parameters['meta_fields'] = []; + $metaFields = []; + + foreach ($metaFieldDefinitionCollection as $fieldDefinition) { + $metaFields[] = $fieldDefinition->identifier; + } + foreach ($metaFieldTypeIdentifiers as $identifier) { $fields = $contentType->getFieldDefinitionsOfType($identifier); - $parameters['meta_fields'] = array_merge($parameters['meta_fields'], array_column($fields->toArray(), 'identifier')); + $metaFields = array_merge($metaFields, array_column($fields->toArray(), 'identifier')); } + $parameters['meta_fields'] = array_unique($metaFields); + return $this->twig->render( '@ibexadesign/content/components/meta_fields.html.twig', $parameters diff --git a/src/lib/EventListener/SetViewParametersListener.php b/src/lib/EventListener/SetViewParametersListener.php index 4761e6d5be..d46a9b0975 100644 --- a/src/lib/EventListener/SetViewParametersListener.php +++ b/src/lib/EventListener/SetViewParametersListener.php @@ -27,6 +27,7 @@ use Ibexa\Core\MVC\Symfony\View\View; use Ibexa\Core\MVC\Symfony\View\ViewEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Form\FormInterface; /** * @todo It should use ViewEvents::FILTER_VIEW_PARAMETERS event instead. @@ -276,7 +277,17 @@ private function getIgnoredContentFields(array $fieldsData): array $ignoredFieldIdentifiers[] = $fieldIdentifier; } - return $ignoredFieldIdentifiers; + $metaFieldGroups = $this->configResolver->getParameter( + 'admin_ui_forms.content_edit.meta_fieldgroup_list' + ); + $metaFieldIdentifiers = array_keys( + array_filter( + $fieldsData, + static fn (FormInterface $field): bool => true === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) + ) + ); + + return array_merge($ignoredFieldIdentifiers, $metaFieldIdentifiers); } } diff --git a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php index 90f90b73df..55a62ccf59 100644 --- a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php +++ b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php @@ -10,6 +10,7 @@ use Ibexa\Contracts\ContentForms\Content\Form\Provider\GroupedContentFormFieldsProviderInterface; use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; +use Symfony\Component\Form\FormInterface; final class GroupedNonMetaFormFieldsProvider implements GroupedContentFormFieldsProviderInterface { @@ -28,16 +29,26 @@ public function __construct( public function getGroupedFields(array $fieldsDataForm): array { $identifiers = $this->getMetaFields(); + $metaFieldGroups = $this->getMetaFieldGroups(); + + $metaFieldIdentifiers = array_keys( + array_filter( + $fieldsDataForm, + static fn (FormInterface $field): bool => true === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) + ) + ); $groupedFields = $this->innerGroupedContentFormFieldsProvider->getGroupedFields($fieldsDataForm); foreach ($groupedFields as $group => $fields) { $groupedFields[$group] = array_filter( $fields, - static function (string $fieldIdentifier) use ($fieldsDataForm, $identifiers): bool { + static function (string $fieldIdentifier) use ($fieldsDataForm, $identifiers, $metaFieldIdentifiers): bool { $fieldData = $fieldsDataForm[$fieldIdentifier]->getNormData(); $fieldTypeIdentifier = $fieldData->fieldDefinition->fieldTypeIdentifier; + $fieldIdentifier = $fieldData->fieldDefinition->identifier; - return !in_array($fieldTypeIdentifier, $identifiers, true); + return !in_array($fieldTypeIdentifier, $identifiers, true) + && !in_array($fieldIdentifier, $metaFieldIdentifiers); } ); } @@ -59,4 +70,12 @@ private function getMetaFields(): array ) ); } + + /** + * @return array<string> + */ + private function getMetaFieldGroups(): array + { + return $this->configResolver->getParameter('admin_ui_forms.content_edit.meta_fieldgroup_list'); + } } diff --git a/src/lib/Menu/ContentEditAnchorMenuBuilder.php b/src/lib/Menu/ContentEditAnchorMenuBuilder.php index 58fc73090f..cfc63531f2 100644 --- a/src/lib/Menu/ContentEditAnchorMenuBuilder.php +++ b/src/lib/Menu/ContentEditAnchorMenuBuilder.php @@ -126,8 +126,24 @@ private function getMetaFieldItems(ContentType $contentType): array static fn (array $config): bool => true === $config['meta'] )); + $metaFieldGroups = $this->configResolver->getParameter( + 'admin_ui_forms.content_edit.meta_fieldgroup_list' + ); + $metaFieldDefinitionCollection = $contentType->fieldDefinitions->filter( + static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), + ); + $items = []; $order = 0; + foreach ($metaFieldDefinitionCollection as $fieldDefinition) { + $order += self::ITEM_ORDER_SPAN; + $items[$fieldDefinition->identifier] = $this->createSecondLevelItem( + $fieldDefinition->identifier, + $fieldDefinition, + $order + ); + } + foreach ($metaFieldTypeIdentifiers as $metaFieldTypeIdentifier) { if (false === $contentType->hasFieldDefinitionOfType($metaFieldTypeIdentifier)) { continue; @@ -137,7 +153,9 @@ private function getMetaFieldItems(ContentType $contentType): array foreach ($fieldDefinitions as $fieldDefinition) { $fieldDefIdentifier = $fieldDefinition->identifier; $order += self::ITEM_ORDER_SPAN; - $items[$fieldDefIdentifier] = $this->createSecondLevelItem($fieldDefIdentifier, $fieldDefinition, $order); + if (!isset($items[$fieldDefIdentifier])) { + $items[$fieldDefIdentifier] = $this->createSecondLevelItem($fieldDefIdentifier, $fieldDefinition, $order); + } } } diff --git a/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php b/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php index 0aa1755b1f..1a78e5b947 100644 --- a/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php +++ b/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php @@ -116,6 +116,47 @@ public function testContentEditFieldTypesAreMapped(): void $this->parser->mapConfig($scopeSettings, $currentScope, $this->contextualizer); } + + /** + * Test 'meta_fieldgroup_list' fieldtype settings are mapped. + */ + public function testContentEditMetaFieldgroupListIsMapped(): void + { + $scopeSettings = [ + 'admin_ui_forms' => [ + 'content_edit' => [ + 'meta_fieldgroup_list' => [ + 'metadata', + 'seo', + ], + ], + ], + ]; + $currentScope = 'admin_group'; + + $this->contextualizer + ->expects($this->atLeast(2)) + ->method('setContextualParameter') + ->withConsecutive( + [ + AdminUiForms::FORM_TEMPLATES_PARAM, + $currentScope, + [], + ], + [ + AdminUiForms::FIELD_TYPES_PARAM, + $currentScope, + [], + ], + [ + AdminUiForms::META_FIELDGROUP_LIST_PARAM, + $currentScope, + ['metadata', 'seo'], + ], + ); + + $this->parser->mapConfig($scopeSettings, $currentScope, $this->contextualizer); + } } class_alias(AdminUiFormsTest::class, 'EzSystems\EzPlatformAdminUiBundle\Tests\DependencyInjection\Configuration\Parser\AdminUiFormsTest'); diff --git a/tests/lib/EventListener/SetViewParametersListenerTest.php b/tests/lib/EventListener/SetViewParametersListenerTest.php index b1a3ef8c53..9efc4be3b2 100644 --- a/tests/lib/EventListener/SetViewParametersListenerTest.php +++ b/tests/lib/EventListener/SetViewParametersListenerTest.php @@ -75,13 +75,17 @@ public function setUp(): void $this->configResolver = $this->createMock(ConfigResolverInterface::class); $this->configResolver ->method('getParameter') - ->with('admin_ui_forms.content_edit.fieldtypes') - ->willReturn( + ->withConsecutive( + ['admin_ui_forms.content_edit.fieldtypes'], + ['admin_ui_forms.content_edit.meta_fieldgroup_list'] + ) + ->willReturnOnConsecutiveCalls( [ 'ibexa_taxonomy_entry_assignment' => [ 'meta' => true, ], - ] + ], + ['metadata'] ); $this->groupedContentFormFieldsProvider = $this->createMock(GroupedContentFormFieldsProviderInterface::class); @@ -227,15 +231,35 @@ public function testSetUserUpdateViewTemplateParameters(): void public function testSetContentFieldsParameters(): void { $fields = [ - 'name' => 'ezstring', - 'short_name' => 'ezstring', - 'description' => 'ezrichtext', - 'tags' => 'ibexa_taxonomy_entry_assignment', + 'name' => [ + 'type' => 'ezstring', + 'group' => 'content', + ], + 'short_name' => [ + 'type' => 'ezstring', + 'group' => 'content', + ], + 'description' => [ + 'type' => 'ezrichtext', + 'group' => 'content', + ], + 'tags' => [ + 'type' => 'ibexa_taxonomy_entry_assignment', + 'group' => 'content', + ], + 'metadata_field' => [ + 'type' => 'ezstring', + 'group' => 'metadata', + ], ]; $fieldsDataChildren = []; - foreach ($fields as $identifier => $type) { - $fieldsDataChildren[$identifier] = $this->createFieldMock($identifier, $type); + foreach ($fields as $identifier => $data) { + $fieldsDataChildren[$identifier] = $this->createFieldMock( + $identifier, + $data['type'], + $data['group'] + ); } $fieldsDataForm = $this->createMock(FormInterface::class); @@ -255,7 +279,7 @@ public function testSetContentFieldsParameters(): void $groupedFields = [ 'Content' => ['name', 'short_name', 'description'], ]; - $ignoredContentFields = ['tags']; + $ignoredContentFields = ['tags', 'metadata_field']; $this->groupedContentFormFieldsProvider ->method('getGroupedFields') @@ -347,7 +371,7 @@ private function generateUser(int $ownerId): APIUser /** * @return \Ibexa\Contracts\Core\Repository\Values\Content\Field|\PHPUnit\Framework\MockObject\MockObject */ - private function createFieldMock(string $identifier, string $type): MockObject + private function createFieldMock(string $identifier, string $type, string $fieldGroup = 'content'): MockObject { $data = new FieldData([ 'field' => new Field([ @@ -356,6 +380,7 @@ private function createFieldMock(string $identifier, string $type): MockObject ]), 'fieldDefinition' => new FieldDefinition([ 'fieldTypeIdentifier' => $type, + 'fieldGroup' => $fieldGroup, ]), ]); From 1feec11581a1483dbd793904e9028e83c7e03402 Mon Sep 17 00:00:00 2001 From: Bartek Wajda <bartlomiej.wajda@ibexa.co> Date: Tue, 17 Jan 2023 11:35:34 +0100 Subject: [PATCH 2/9] IBX-4629: CS --- src/lib/EventListener/SetViewParametersListener.php | 3 ++- src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib/EventListener/SetViewParametersListener.php b/src/lib/EventListener/SetViewParametersListener.php index d46a9b0975..3a4ae8be0a 100644 --- a/src/lib/EventListener/SetViewParametersListener.php +++ b/src/lib/EventListener/SetViewParametersListener.php @@ -283,7 +283,8 @@ private function getIgnoredContentFields(array $fieldsData): array $metaFieldIdentifiers = array_keys( array_filter( $fieldsData, - static fn (FormInterface $field): bool => true === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) + static fn (FormInterface $field): bool => true + === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) ) ); diff --git a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php index 55a62ccf59..02beec74ad 100644 --- a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php +++ b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php @@ -42,7 +42,11 @@ public function getGroupedFields(array $fieldsDataForm): array foreach ($groupedFields as $group => $fields) { $groupedFields[$group] = array_filter( $fields, - static function (string $fieldIdentifier) use ($fieldsDataForm, $identifiers, $metaFieldIdentifiers): bool { + static function (string $fieldIdentifier) use ( + $fieldsDataForm, + $identifiers, + $metaFieldIdentifiers + ): bool { $fieldData = $fieldsDataForm[$fieldIdentifier]->getNormData(); $fieldTypeIdentifier = $fieldData->fieldDefinition->fieldTypeIdentifier; $fieldIdentifier = $fieldData->fieldDefinition->identifier; From 14ed3f1fab027ebbd7fbbe5cc4d61fbe411926e2 Mon Sep 17 00:00:00 2001 From: Bartek Wajda <bartlomiej.wajda@ibexa.co> Date: Tue, 17 Jan 2023 11:39:37 +0100 Subject: [PATCH 3/9] IBX-4629: CS --- src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php index 02beec74ad..0ea40bfc49 100644 --- a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php +++ b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php @@ -34,7 +34,8 @@ public function getGroupedFields(array $fieldsDataForm): array $metaFieldIdentifiers = array_keys( array_filter( $fieldsDataForm, - static fn (FormInterface $field): bool => true === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) + static fn (FormInterface $field): bool => true + === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) ) ); From 3f03c20dbac00c3ca0925d76c8c065eee592724e Mon Sep 17 00:00:00 2001 From: Bartek Wajda <bartlomiej.wajda@ibexa.co> Date: Wed, 18 Jan 2023 14:11:08 +0100 Subject: [PATCH 4/9] IBX-4629: Applied review remarks --- .../Configuration/Parser/AdminUiForms.php | 18 +++++------ .../Resources/config/admin_ui_forms.yaml | 2 +- .../ContentEditMetaFieldsComponent.php | 32 ++++++++++++------- .../SetViewParametersListener.php | 2 +- .../GroupedNonMetaFormFieldsProvider.php | 2 +- src/lib/Menu/ContentEditAnchorMenuBuilder.php | 2 +- .../Configuration/Parser/AdminUiFormsTest.php | 6 ++-- .../SetViewParametersListenerTest.php | 2 +- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php b/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php index 100136773e..dbbb5ece64 100644 --- a/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php +++ b/src/bundle/DependencyInjection/Configuration/Parser/AdminUiForms.php @@ -29,7 +29,7 @@ class AdminUiForms extends AbstractParser { public const FORM_TEMPLATES_PARAM = 'admin_ui_forms.content_edit_form_templates'; public const FIELD_TYPES_PARAM = 'admin_ui_forms.content_edit.fieldtypes'; - public const META_FIELDGROUP_LIST_PARAM = 'admin_ui_forms.content_edit.meta_fieldgroup_list'; + public const META_FIELD_GROUPS_LIST_PARAM = 'admin_ui_forms.content_edit.meta_field_groups_list'; public const CONTENT_TYPE_FIELD_TYPES_PARAM = 'admin_ui_forms.content_type_edit.field_types'; public const CONTENT_TYPE_DEFAULT_META_FIELD_TYPE_GROUP_PARAM = 'admin_ui_forms.content_type_edit.default_meta_field_type_group'; @@ -88,7 +88,7 @@ public function addSemanticConfig(NodeBuilder $nodeBuilder) ->end() ->end() ->end() - ->arrayNode('meta_fieldgroup_list') + ->arrayNode('meta_field_groups_list') ->performNoDeepMerging() ->scalarPrototype()->end() ->info('List of field groups that would be placed under a meta section in a content form') @@ -163,10 +163,10 @@ public function mapConfig( unset($scopeSettings['admin_ui_forms']['content_edit']['fieldtypes']); } - if (!empty($scopeSettings['admin_ui_forms']['content_edit']['meta_fieldgroup_list'])) { - $scopeSettings['admin_ui_forms.content_edit.meta_fieldgroup_list'] = - $scopeSettings['admin_ui_forms']['content_edit']['meta_fieldgroup_list']; - unset($scopeSettings['admin_ui_forms']['content_edit']['meta_fieldgroup_list']); + if (!empty($scopeSettings['admin_ui_forms']['content_edit']['meta_field_groups_list'])) { + $scopeSettings['admin_ui_forms.content_edit.meta_field_groups_list'] = + $scopeSettings['admin_ui_forms']['content_edit']['meta_field_groups_list']; + unset($scopeSettings['admin_ui_forms']['content_edit']['meta_field_groups_list']); } if (!empty($scopeSettings['admin_ui_forms']['content_type_edit']['field_types'])) { @@ -192,9 +192,9 @@ public function mapConfig( $scopeSettings['admin_ui_forms.content_edit.fieldtypes'] ?? [] ); $contextualizer->setContextualParameter( - self::META_FIELDGROUP_LIST_PARAM, + self::META_FIELD_GROUPS_LIST_PARAM, $currentScope, - $scopeSettings['admin_ui_forms.content_edit.meta_fieldgroup_list'] ?? [] + $scopeSettings['admin_ui_forms.content_edit.meta_field_groups_list'] ?? [] ); $contextualizer->setContextualParameter( self::CONTENT_TYPE_FIELD_TYPES_PARAM, @@ -215,7 +215,7 @@ public function postMap(array $config, ContextualizerInterface $contextualizer) { $contextualizer->mapConfigArray('admin_ui_forms.content_edit_form_templates', $config); $contextualizer->mapConfigArray('admin_ui_forms.content_edit.fieldtypes', $config); - $contextualizer->mapConfigArray('admin_ui_forms.content_edit.meta_fieldgroup_list', $config); + $contextualizer->mapConfigArray('admin_ui_forms.content_edit.meta_field_groups_list', $config); $contextualizer->mapConfigArray('admin_ui_forms.content_type_edit.field_types', $config); $contextualizer->mapSetting('admin_ui_forms.content_type_edit.default_meta_field_type_group', $config); } diff --git a/src/bundle/Resources/config/admin_ui_forms.yaml b/src/bundle/Resources/config/admin_ui_forms.yaml index c9e26dfab4..8667e680f2 100644 --- a/src/bundle/Resources/config/admin_ui_forms.yaml +++ b/src/bundle/Resources/config/admin_ui_forms.yaml @@ -2,7 +2,7 @@ system: admin_group: admin_ui_forms: content_edit: - meta_fieldgroup_list: + meta_field_groups_list: - metadata form_templates: - { template: '@ibexadesign/content/form_fields.html.twig', priority: 0 } diff --git a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php index 227a51d439..a444ab21e1 100644 --- a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php +++ b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php @@ -9,6 +9,8 @@ namespace Ibexa\AdminUi\Component\Content; use Ibexa\Contracts\AdminUi\Component\Renderable; +use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType; +use Ibexa\Contracts\Core\Repository\Values\ContentType\FieldDefinitionCollection; use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; use Ibexa\Core\Repository\Values\ContentType\FieldDefinition; use Twig\Environment; @@ -40,22 +42,13 @@ public function render(array $parameters = []): string $contentType = $parameters['content_type']; $metaFieldTypeIdentifiers = $this->getMetaFieldTypeIdentifiers(); - $metaFieldGroups = $this->configResolver->getParameter( - 'admin_ui_forms.content_edit.meta_fieldgroup_list' - ); - $metaFieldDefinitionCollection = $contentType->fieldDefinitions->filter( - static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), - ); + $metaFieldDefinitionCollection = $this->getMetaFieldDefinitionCollection($contentType); if (empty($metaFieldTypeIdentifiers) && $metaFieldDefinitionCollection->isEmpty()) { return self::NO_CONTENT; } - $metaFields = []; - - foreach ($metaFieldDefinitionCollection as $fieldDefinition) { - $metaFields[] = $fieldDefinition->identifier; - } + $metaFields = $this->mapMetaFieldDefinitionCollectionToIdentifiers($metaFieldDefinitionCollection); foreach ($metaFieldTypeIdentifiers as $identifier) { $fields = $contentType->getFieldDefinitionsOfType($identifier); @@ -84,4 +77,21 @@ private function getMetaFieldTypeIdentifiers(): array ) ); } + + private function getMetaFieldDefinitionCollection(ContentType $contentType): FieldDefinitionCollection + { + $metaFieldGroups = $this->configResolver->getParameter( + 'admin_ui_forms.content_edit.meta_field_groups_list' + ); + + return $contentType->fieldDefinitions->filter( + static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), + ); + } + + private function mapMetaFieldDefinitionCollectionToIdentifiers( + FieldDefinitionCollection $metaFieldDefinitionCollection + ): array { + return array_column($metaFieldDefinitionCollection->toArray(), 'identifier'); + } } diff --git a/src/lib/EventListener/SetViewParametersListener.php b/src/lib/EventListener/SetViewParametersListener.php index 3a4ae8be0a..fcc6013a59 100644 --- a/src/lib/EventListener/SetViewParametersListener.php +++ b/src/lib/EventListener/SetViewParametersListener.php @@ -278,7 +278,7 @@ private function getIgnoredContentFields(array $fieldsData): array } $metaFieldGroups = $this->configResolver->getParameter( - 'admin_ui_forms.content_edit.meta_fieldgroup_list' + 'admin_ui_forms.content_edit.meta_field_groups_list' ); $metaFieldIdentifiers = array_keys( array_filter( diff --git a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php index 0ea40bfc49..0a827fab4b 100644 --- a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php +++ b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php @@ -81,6 +81,6 @@ private function getMetaFields(): array */ private function getMetaFieldGroups(): array { - return $this->configResolver->getParameter('admin_ui_forms.content_edit.meta_fieldgroup_list'); + return $this->configResolver->getParameter('admin_ui_forms.content_edit.meta_field_groups_list'); } } diff --git a/src/lib/Menu/ContentEditAnchorMenuBuilder.php b/src/lib/Menu/ContentEditAnchorMenuBuilder.php index cfc63531f2..b1e514ba88 100644 --- a/src/lib/Menu/ContentEditAnchorMenuBuilder.php +++ b/src/lib/Menu/ContentEditAnchorMenuBuilder.php @@ -127,7 +127,7 @@ private function getMetaFieldItems(ContentType $contentType): array )); $metaFieldGroups = $this->configResolver->getParameter( - 'admin_ui_forms.content_edit.meta_fieldgroup_list' + 'admin_ui_forms.content_edit.meta_field_groups_list' ); $metaFieldDefinitionCollection = $contentType->fieldDefinitions->filter( static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), diff --git a/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php b/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php index 1a78e5b947..23b0d92a54 100644 --- a/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php +++ b/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php @@ -118,14 +118,14 @@ public function testContentEditFieldTypesAreMapped(): void } /** - * Test 'meta_fieldgroup_list' fieldtype settings are mapped. + * Test 'meta_field_groups_list' fieldtype settings are mapped. */ public function testContentEditMetaFieldgroupListIsMapped(): void { $scopeSettings = [ 'admin_ui_forms' => [ 'content_edit' => [ - 'meta_fieldgroup_list' => [ + 'meta_field_groups_list' => [ 'metadata', 'seo', ], @@ -149,7 +149,7 @@ public function testContentEditMetaFieldgroupListIsMapped(): void [], ], [ - AdminUiForms::META_FIELDGROUP_LIST_PARAM, + AdminUiForms::META_FIELD_GROUPS_LIST_PARAM, $currentScope, ['metadata', 'seo'], ], diff --git a/tests/lib/EventListener/SetViewParametersListenerTest.php b/tests/lib/EventListener/SetViewParametersListenerTest.php index 9efc4be3b2..9a6bb0023f 100644 --- a/tests/lib/EventListener/SetViewParametersListenerTest.php +++ b/tests/lib/EventListener/SetViewParametersListenerTest.php @@ -77,7 +77,7 @@ public function setUp(): void ->method('getParameter') ->withConsecutive( ['admin_ui_forms.content_edit.fieldtypes'], - ['admin_ui_forms.content_edit.meta_fieldgroup_list'] + ['admin_ui_forms.content_edit.meta_field_groups_list'] ) ->willReturnOnConsecutiveCalls( [ From a26caca647290538cc29f01d80281a8c674cb877 Mon Sep 17 00:00:00 2001 From: Bartek Wajda <bartlomiej.wajda@ibexa.co> Date: Thu, 19 Jan 2023 15:34:25 +0100 Subject: [PATCH 5/9] IBX-4629: Applied review remarks --- .../Content/ContentEditMetaFieldsComponent.php | 2 +- src/lib/EventListener/SetViewParametersListener.php | 7 +++++-- .../Form/Provider/GroupedNonMetaFormFieldsProvider.php | 9 ++++++--- src/lib/Menu/ContentEditAnchorMenuBuilder.php | 10 ++++++---- .../Configuration/Parser/AdminUiFormsTest.php | 6 +++--- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php index a444ab21e1..dddf5972e6 100644 --- a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php +++ b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php @@ -85,7 +85,7 @@ private function getMetaFieldDefinitionCollection(ContentType $contentType): Fie ); return $contentType->fieldDefinitions->filter( - static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), + static fn (FieldDefinition $field): bool => in_array($field->fieldGroup, $metaFieldGroups, true), ); } diff --git a/src/lib/EventListener/SetViewParametersListener.php b/src/lib/EventListener/SetViewParametersListener.php index fcc6013a59..627a68181a 100644 --- a/src/lib/EventListener/SetViewParametersListener.php +++ b/src/lib/EventListener/SetViewParametersListener.php @@ -283,8 +283,11 @@ private function getIgnoredContentFields(array $fieldsData): array $metaFieldIdentifiers = array_keys( array_filter( $fieldsData, - static fn (FormInterface $field): bool => true - === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) + static fn (FormInterface $field): bool => in_array( + $field->getData()->fieldDefinition->fieldGroup, + $metaFieldGroups, + true + ) ) ); diff --git a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php index 0a827fab4b..7563d5ce5f 100644 --- a/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php +++ b/src/lib/Form/Provider/GroupedNonMetaFormFieldsProvider.php @@ -34,8 +34,11 @@ public function getGroupedFields(array $fieldsDataForm): array $metaFieldIdentifiers = array_keys( array_filter( $fieldsDataForm, - static fn (FormInterface $field): bool => true - === in_array($field->getData()->fieldDefinition->fieldGroup, $metaFieldGroups) + static fn (FormInterface $field): bool => in_array( + $field->getData()->fieldDefinition->fieldGroup, + $metaFieldGroups, + true + ) ) ); @@ -53,7 +56,7 @@ static function (string $fieldIdentifier) use ( $fieldIdentifier = $fieldData->fieldDefinition->identifier; return !in_array($fieldTypeIdentifier, $identifiers, true) - && !in_array($fieldIdentifier, $metaFieldIdentifiers); + && !in_array($fieldIdentifier, $metaFieldIdentifiers, true); } ); } diff --git a/src/lib/Menu/ContentEditAnchorMenuBuilder.php b/src/lib/Menu/ContentEditAnchorMenuBuilder.php index b1e514ba88..06896a46e4 100644 --- a/src/lib/Menu/ContentEditAnchorMenuBuilder.php +++ b/src/lib/Menu/ContentEditAnchorMenuBuilder.php @@ -130,7 +130,7 @@ private function getMetaFieldItems(ContentType $contentType): array 'admin_ui_forms.content_edit.meta_field_groups_list' ); $metaFieldDefinitionCollection = $contentType->fieldDefinitions->filter( - static fn (FieldDefinition $field): bool => true === in_array($field->fieldGroup, $metaFieldGroups), + static fn (FieldDefinition $field): bool => in_array($field->fieldGroup, $metaFieldGroups, true), ); $items = []; @@ -153,9 +153,11 @@ private function getMetaFieldItems(ContentType $contentType): array foreach ($fieldDefinitions as $fieldDefinition) { $fieldDefIdentifier = $fieldDefinition->identifier; $order += self::ITEM_ORDER_SPAN; - if (!isset($items[$fieldDefIdentifier])) { - $items[$fieldDefIdentifier] = $this->createSecondLevelItem($fieldDefIdentifier, $fieldDefinition, $order); - } + $items[$fieldDefIdentifier] ??= $this->createSecondLevelItem( + $fieldDefIdentifier, + $fieldDefinition, + $order + ); } } diff --git a/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php b/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php index 23b0d92a54..4d81dc2bc3 100644 --- a/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php +++ b/tests/bundle/DependencyInjection/Configuration/Parser/AdminUiFormsTest.php @@ -58,7 +58,7 @@ public function testContentEditFormTemplatesAreMapped() ]; $this->contextualizer - ->expects($this->atLeast(2)) + ->expects(self::atLeast(2)) ->method('setContextualParameter') ->withConsecutive( [ @@ -99,7 +99,7 @@ public function testContentEditFieldTypesAreMapped(): void ]; $this->contextualizer - ->expects($this->atLeast(2)) + ->expects(self::atLeast(2)) ->method('setContextualParameter') ->withConsecutive( [ @@ -135,7 +135,7 @@ public function testContentEditMetaFieldgroupListIsMapped(): void $currentScope = 'admin_group'; $this->contextualizer - ->expects($this->atLeast(2)) + ->expects(self::atLeast(2)) ->method('setContextualParameter') ->withConsecutive( [ From 47ffdffece70371ecc6301d58675863be848992f Mon Sep 17 00:00:00 2001 From: Bartek Wajda <bartlomiej.wajda@ibexa.co> Date: Tue, 24 Jan 2023 12:41:04 +0100 Subject: [PATCH 6/9] IBX-4629: Added missing PHPDoc --- src/lib/Component/Content/ContentEditMetaFieldsComponent.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php index dddf5972e6..087d1b9c24 100644 --- a/src/lib/Component/Content/ContentEditMetaFieldsComponent.php +++ b/src/lib/Component/Content/ContentEditMetaFieldsComponent.php @@ -89,6 +89,9 @@ private function getMetaFieldDefinitionCollection(ContentType $contentType): Fie ); } + /** + * @return array<string> + */ private function mapMetaFieldDefinitionCollectionToIdentifiers( FieldDefinitionCollection $metaFieldDefinitionCollection ): array { From a4ad45cc1273a7148d703c96759b338a2e46b2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Szo=C5=82tysek?= <michal.szoltysek@ez.no> Date: Fri, 27 Jan 2023 16:34:28 +0100 Subject: [PATCH 7/9] IBX-4629: Updated tests --- .../BrowserContext/ContentUpdateContext.php | 17 +++++++++++++++++ src/lib/Behat/Page/ContentUpdateItemPage.php | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/lib/Behat/BrowserContext/ContentUpdateContext.php b/src/lib/Behat/BrowserContext/ContentUpdateContext.php index 8a5efeb33c..7ee326e3c4 100644 --- a/src/lib/Behat/BrowserContext/ContentUpdateContext.php +++ b/src/lib/Behat/BrowserContext/ContentUpdateContext.php @@ -59,6 +59,14 @@ public function theFieldCannotBeEditedDueToLimitation(string $fieldName, string $this->contentUpdateItemPage->verifyFieldCannotBeEditedDueToLimitation($fieldName); } + /** + * @When the :fieldName field cannot be edited due to limitation + */ + public function FieldCannotBeEditedDueToLimitation(string $fieldName): void + { + $this->contentUpdateItemPage->verifyFieldCannotBeEditedDueToLimitation($fieldName); + } + /** * @When I set content fields for user */ @@ -114,6 +122,15 @@ public function iSwitchToContentTab(string $tabName) $this->contentUpdateItemPage->switchToFieldGroup($tabName); } + /** + * @When I switch to :tabName field tab + */ + public function iSwitchToContentGroup(string $tabName) + { + $this->contentUpdateItemPage->verifyIsLoaded(); + $this->contentUpdateItemPage->switchToFieldTab($tabName); + } + /** * @When I wait for Content Item to be autosaved */ diff --git a/src/lib/Behat/Page/ContentUpdateItemPage.php b/src/lib/Behat/Page/ContentUpdateItemPage.php index 57f4c336dc..9a54836121 100644 --- a/src/lib/Behat/Page/ContentUpdateItemPage.php +++ b/src/lib/Behat/Page/ContentUpdateItemPage.php @@ -100,6 +100,7 @@ protected function specifyLocators(): array new VisibleCSSLocator('noneditableFieldClass', 'ibexa-field-edit--eznoneditable'), new VisibleCSSLocator('fieldOfType', '.ibexa-field-edit--%s'), new VisibleCSSLocator('navigationTabs', '.ibexa-anchor-navigation-menu__sections-item-btn'), + new VisibleCSSLocator('navigationGroups', '.ibexa-anchor-navigation-menu__section-groups-item'), new VisibleCSSLocator('autosaveIsOnInfo', '.ibexa-autosave__status-on'), new VisibleCSSLocator('autosaveSavedInfo', '.ibexa-autosave__status-saved'), new VisibleCSSLocator('autosaveIsOffInfo', '.ibexa-autosave__status-off'), @@ -189,6 +190,17 @@ public function switchToFieldGroup(string $tabName): void ->waitUntilCondition(new ElementHasTextCondition($this->getHTMLPage(), new VisibleCSSLocator('activeSection', '.ibexa-anchor-navigation-menu__sections-item-btn--active'), $tabName)); } + public function switchToFieldTab(string $tabName): void + { + $this->getHTMLPage()->setTimeout(3) + ->findAll($this->getLocator('navigationGroups')) + ->getByCriterion(new ElementTextCriterion($tabName)) + ->click(); + $this->getHTMLPage() + ->setTimeout(10) + ->waitUntilCondition(new ElementHasTextCondition($this->getHTMLPage(), new VisibleCSSLocator('activeSection', '.ibexa-anchor-navigation-menu__section-groups-item--active'), $tabName)); + } + public function verifyFieldCannotBeEditedDueToLimitation(string $fieldName) { $activeSections = $this->getHTMLPage()->findAll(new VisibleCSSLocator('activeSection', '.ibexa-anchor-navigation-menu__sections-item-btn--active')); From be2686eeac20117049d82f576e056f3528bd3b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Szo=C5=82tysek?= <michal.szoltysek@ez.no> Date: Fri, 27 Jan 2023 18:01:03 +0100 Subject: [PATCH 8/9] IBX-4629: Fixed locator --- src/lib/Behat/Page/ContentUpdateItemPage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/Behat/Page/ContentUpdateItemPage.php b/src/lib/Behat/Page/ContentUpdateItemPage.php index 9a54836121..409880bd57 100644 --- a/src/lib/Behat/Page/ContentUpdateItemPage.php +++ b/src/lib/Behat/Page/ContentUpdateItemPage.php @@ -203,7 +203,7 @@ public function switchToFieldTab(string $tabName): void public function verifyFieldCannotBeEditedDueToLimitation(string $fieldName) { - $activeSections = $this->getHTMLPage()->findAll(new VisibleCSSLocator('activeSection', '.ibexa-anchor-navigation-menu__sections-item-btn--active')); + $activeSections = $this->getHTMLPage()->findAll(new VisibleCSSLocator('activeSection', '.ibexa-anchor-navigation-menu__section-groups-item--active')); $fieldLocator = new VisibleCSSLocator('', sprintf($this ->getLocator('fieldGroupNthField')->getSelector(), $activeSections->single()->getAttribute('data-target-id'), $this->getFieldPosition($fieldName))); $this->getHTMLPage()->find($fieldLocator)->assert()->hasClass('ibexa-field-edit--disabled'); From 3d204bc22e65edf59c3bfc23fef8abce2341e703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Szo=C5=82tysek?= <michal.szoltysek@ez.no> Date: Mon, 30 Jan 2023 16:04:00 +0100 Subject: [PATCH 9/9] IBX-4629: Removed redundant step --- src/lib/Behat/BrowserContext/ContentUpdateContext.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/lib/Behat/BrowserContext/ContentUpdateContext.php b/src/lib/Behat/BrowserContext/ContentUpdateContext.php index 7ee326e3c4..c8f18480e7 100644 --- a/src/lib/Behat/BrowserContext/ContentUpdateContext.php +++ b/src/lib/Behat/BrowserContext/ContentUpdateContext.php @@ -50,19 +50,10 @@ public function verifyFieldIsNotEditable(string $fieldName): void Assert::assertEquals(NonEditableField::EXPECTED_NON_EDITABLE_TEXT, $field->getValue()[0]); } - /** - * @When the :fieldName field in :fieldGroup field group cannot be edited due to limitation - */ - public function theFieldCannotBeEditedDueToLimitation(string $fieldName, string $fieldGroup): void - { - $this->contentUpdateItemPage->switchToFieldGroup($fieldGroup); - $this->contentUpdateItemPage->verifyFieldCannotBeEditedDueToLimitation($fieldName); - } - /** * @When the :fieldName field cannot be edited due to limitation */ - public function FieldCannotBeEditedDueToLimitation(string $fieldName): void + public function fieldCannotBeEditedDueToLimitation(string $fieldName): void { $this->contentUpdateItemPage->verifyFieldCannotBeEditedDueToLimitation($fieldName); }