diff --git a/config/pimcore/config.yaml b/config/pimcore/config.yaml index d05be1955..e75733478 100644 --- a/config/pimcore/config.yaml +++ b/config/pimcore/config.yaml @@ -42,6 +42,15 @@ pimcore_studio_backend: group: system - key: preview group: system + data_object: + predefined_columns: + - key: type + group: system + - key: fullpath + group: system + - key: classname + group: system + grid: asset: predefined_columns: diff --git a/src/Asset/Controller/Search/GetConfigurationController.php b/src/Asset/Controller/Search/GetConfigurationController.php index 522331984..e5ead212a 100644 --- a/src/Asset/Controller/Search/GetConfigurationController.php +++ b/src/Asset/Controller/Search/GetConfigurationController.php @@ -68,7 +68,7 @@ public function __construct( HttpResponseCodes::BAD_REQUEST, HttpResponseCodes::UNAUTHORIZED, ])] - public function getAssetGridConfiguration(): JsonResponse + public function getAssetSearchConfiguration(): JsonResponse { $configuration = $this->configurationService->getAssetSearchConfiguration(); diff --git a/src/DataObject/Controller/Search/GetConfigurationController.php b/src/DataObject/Controller/Search/GetConfigurationController.php new file mode 100644 index 000000000..547a68057 --- /dev/null +++ b/src/DataObject/Controller/Search/GetConfigurationController.php @@ -0,0 +1,86 @@ +value)] + #[Get( + path: self::PREFIX . '/data-object/search/configuration/{classId}', + operationId: 'data_object_get_search_configuration', + description: 'data_object_get_search_configuration_description', + summary: 'data_object_get_search_configuration_summary', + tags: [Tags::DataObjectsSearch->value] + )] + #[StringParameter( + name: 'classId', + example: 'EV', + description: 'Class Id of the data object', + required: false, + )] + #[SuccessResponse( + description: 'data_object_get_search_configuration_success_response', + content: new JsonContent(ref: DetailedConfiguration::class) + )] + #[DefaultResponses([ + HttpResponseCodes::BAD_REQUEST, + HttpResponseCodes::NOT_FOUND, + HttpResponseCodes::UNAUTHORIZED, + ])] + public function getDataObjectSearchConfiguration(?string $classId): JsonResponse + { + $configuration = $this->gridConfigurationService->getDataObjectSearchConfiguration($classId); + + return $this->jsonResponse($configuration); + } +} diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index d6f4ac855..c8db92763 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -251,6 +251,18 @@ private function addSearchGridConfiguration(ArrayNodeDefinition $node): void ->end() ->end() ->end() + ->arrayNode('data_object') + ->children() + ->arrayNode('predefined_columns') + ->arrayPrototype() + ->children() + ->scalarNode('group')->end() + ->scalarNode('key')->end() + ->end() + ->end() + ->end() + ->end() + ->end() ->end() ->end(); } diff --git a/src/DependencyInjection/PimcoreStudioBackendExtension.php b/src/DependencyInjection/PimcoreStudioBackendExtension.php index c02764eeb..3e111fbf1 100644 --- a/src/DependencyInjection/PimcoreStudioBackendExtension.php +++ b/src/DependencyInjection/PimcoreStudioBackendExtension.php @@ -110,11 +110,17 @@ public function load(array $configs, ContainerBuilder $container): void $definition->setArgument('$assetPredefinedColumns', $config['grid']['asset']['predefined_columns']); $definition = $container->getDefinition(ConfigurationServiceInterface::class); + $definition->setArgument( '$assetSearchPredefinedColumns', $config['search_grid']['asset']['predefined_columns'] ); + $definition->setArgument( + '$dataObjectSearchPredefinedColumns', + $config['search_grid']['data_object']['predefined_columns'] + ); + $definition = $container->getDefinition(ConfigurationServiceInterface::class); $definition->setArgument('$dataObjectPredefinedColumns', $config['grid']['data_object']['predefined_columns']); diff --git a/src/Grid/Service/ColumnConfigurationService.php b/src/Grid/Service/ColumnConfigurationService.php index 67c461d19..5303bf76b 100644 --- a/src/Grid/Service/ColumnConfigurationService.php +++ b/src/Grid/Service/ColumnConfigurationService.php @@ -16,6 +16,7 @@ namespace Pimcore\Bundle\StudioBackendBundle\Grid\Service; +use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ClassIdInterface; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\FolderIdInterface; use Pimcore\Bundle\StudioBackendBundle\Grid\Event\GridColumnConfigurationEvent; @@ -91,6 +92,22 @@ public function getAvailableDataObjectColumnConfiguration(string $classId, int $ } + /** + * @return ColumnConfiguration[] + * + * @throws InvalidArgumentException + */ + public function getSystemDataObjectColumnConfiguration(): array + { + $systemCollector = $this->gridService->getColumnCollectors()['system.dataobject']; + + if (!in_array(ElementTypes::TYPE_DATA_OBJECT, $systemCollector->supportedElementTypes(), true)) { + throw new InvalidArgumentException('collector does not support data objects'); + } + + return $systemCollector->getColumnConfigurations($this->gridService->getColumnDefinitions()); + } + public function buildDataObjectAdapterColumnConfiguration( ColumnFieldDefinition $definition, ?string $type = null, diff --git a/src/Grid/Service/ColumnConfigurationServiceInterface.php b/src/Grid/Service/ColumnConfigurationServiceInterface.php index 0da0311bd..0aaf3dd37 100644 --- a/src/Grid/Service/ColumnConfigurationServiceInterface.php +++ b/src/Grid/Service/ColumnConfigurationServiceInterface.php @@ -34,6 +34,11 @@ public function getAvailableAssetColumnConfiguration(): array; */ public function getAvailableDataObjectColumnConfiguration(string $classId, int $folderId): array; + /** + * @return ColumnConfiguration[] + */ + public function getSystemDataObjectColumnConfiguration(): array; + /** * Builds a column configuration for a data object adapter column. * key type and is optional and can be used to build a column configuration for a specific key type. diff --git a/src/Grid/Service/ConfigurationService.php b/src/Grid/Service/ConfigurationService.php index 6c17cba14..f0ae4c775 100644 --- a/src/Grid/Service/ConfigurationService.php +++ b/src/Grid/Service/ConfigurationService.php @@ -52,6 +52,7 @@ public function __construct( private array $assetPredefinedColumns, private array $dataObjectPredefinedColumns, private array $assetSearchPredefinedColumns, + private array $dataObjectSearchPredefinedColumns, ) { } @@ -117,6 +118,26 @@ public function getAssetSearchConfiguration(): DetailedConfiguration return $this->buildDefaultConfiguration($availableColumns, $this->assetSearchPredefinedColumns); } + /** + * {@inheritdoc} + */ + public function getDataObjectSearchConfiguration(?string $classId): DetailedConfiguration + { + if (!$classId) { + return $this->buildDefaultConfiguration( + $this->columnConfigurationService->getSystemDataObjectColumnConfiguration(), + $this->dataObjectSearchPredefinedColumns, + true + ); + } + + return $this->buildDefaultConfiguration( + $this->columnConfigurationService->getAvailableDataObjectColumnConfiguration($classId, 1), + $this->dataObjectPredefinedColumns, + true + ); + } + /** * {@inheritdoc} */ @@ -296,7 +317,7 @@ private function getDefaultColumnsForSearchAndGrid(array $availableColumns, bool /** @var Data $fieldDefinition */ $fieldDefinition = $column->getConfig()['fieldDefinition']; - if ($search && !$fieldDefinition->getVisibleSearch()) { + if ($search && $fieldDefinition->getVisibleSearch()) { $defaultColumns[] = new ColumnSchema( key: $column->getKey(), locale: $column->getLocale(), diff --git a/src/Grid/Service/ConfigurationServiceInterface.php b/src/Grid/Service/ConfigurationServiceInterface.php index cbf3706c6..1a857fe07 100644 --- a/src/Grid/Service/ConfigurationServiceInterface.php +++ b/src/Grid/Service/ConfigurationServiceInterface.php @@ -34,6 +34,11 @@ public function getAssetGridConfiguration(?int $configurationId, int $folderId): public function getAssetSearchConfiguration(): DetailedConfiguration; + /** + * @throws NotFoundException + */ + public function getDataObjectSearchConfiguration(?string $classId): DetailedConfiguration; + /** * @throws NotFoundException */ diff --git a/src/Grid/Service/SystemColumnService.php b/src/Grid/Service/SystemColumnService.php index f3d3421a0..e5500800c 100644 --- a/src/Grid/Service/SystemColumnService.php +++ b/src/Grid/Service/SystemColumnService.php @@ -51,6 +51,9 @@ public function getSystemColumnsForDataObjects(): array $columns[$column] = $this->columnMapper->getType($column); } + // Add missing columns + $columns['type'] = 'string'; + return $columns; } diff --git a/src/OpenApi/Config/Tags.php b/src/OpenApi/Config/Tags.php index 78fc169d1..d4609d739 100644 --- a/src/OpenApi/Config/Tags.php +++ b/src/OpenApi/Config/Tags.php @@ -57,6 +57,10 @@ name: Tags::DataObjectsGrid->value, description: 'tag_dataobject_grid_description' )] +#[Tag( + name: Tags::DataObjectsSearch->value, + description: 'tag_dataobject_search_description' +)] #[Tag( name: Tags::Dependencies->value, description: 'tag_dependencies_description' @@ -160,6 +164,7 @@ enum Tags: string case CustomReports = 'Custom Reports'; case DataObjects = 'Data Objects'; case DataObjectsGrid = 'Data Object Grid'; + case DataObjectsSearch = 'Data Object Search'; case Dependencies = 'Dependencies'; case Documents = 'Documents'; case Elements = 'Elements'; diff --git a/tests/Unit/Grid/Service/SystemColumnServiceTest.php b/tests/Unit/Grid/Service/SystemColumnServiceTest.php index 8d351133e..101919908 100644 --- a/tests/Unit/Grid/Service/SystemColumnServiceTest.php +++ b/tests/Unit/Grid/Service/SystemColumnServiceTest.php @@ -58,6 +58,7 @@ public function testGetSystemColumnsForDataObjects(): void 'filename' => 'string', 'classname' => 'string', 'index' => 'integer', + 'type' => 'string', ], $systemColumnService->getSystemColumnsForDataObjects()); } } diff --git a/translations/studio_api_docs.en.yaml b/translations/studio_api_docs.en.yaml index af581783d..2f15062bb 100644 --- a/translations/studio_api_docs.en.yaml +++ b/translations/studio_api_docs.en.yaml @@ -227,6 +227,9 @@ data_object_get_grid_configuration_description: | Get data object saved grid configuration by {folderId} {classId} if a configuration-id is set, otherwise get the default configuration will be returned. data_object_get_grid_configuration__success_response: Data Object grid configuration data_object_get_grid_configuration_summary: Get data object grid configuration for a specific folder and class-id +data_object_get_search_configuration_description: Get data object search configuration +data_object_get_search_configuration_summary: Get data object search configuration +data_object_get_search_configuration_success_response: Data object search configuration data_object_update_by_id_description: | You can create/update/delete list entries like properties or data object editable fields.
If you want to update (add/remove) only some data of a field (e.g data of multi-relation fields), use the PATCH method. data_object_update_by_id_success_response: Successfully updated data object @@ -554,6 +557,7 @@ tag_create_summary: Create a new tag tag_dataobjects_description: DataObject operations to get/update/create/delete data objects tag_dataobject_grid_description: DataObject Grid operations +tag_dataobject_search_description: DataObject Search operations tag_delete_by_id_description: | Delete a specific tag based on the given {id} tag_delete_by_id_success_response: ID of successfully deleted tag