mirror of
https://github.com/SuiteCRM/SuiteCRM-Core.git
synced 2025-09-04 10:14:13 +08:00
Add ViewDefinition API
- Add initial ViewDefinition entity for list-view. - Add ViewDefinitionHandler. - Add ViewDefinitionDataProvider. - Add ViewDefinitionProviderInterface. - Add ViewDefinitionsHandlerTest. Signed-off-by: Dillon-Brown <dillon.brown@salesagility.com>
This commit is contained in:
parent
be1e0ca5cf
commit
4fd431d97d
5 changed files with 445 additions and 0 deletions
110
core/legacy/ViewDefinitionsHandler.php
Normal file
110
core/legacy/ViewDefinitionsHandler.php
Normal file
|
@ -0,0 +1,110 @@
|
|||
<?php
|
||||
|
||||
namespace SuiteCRM\Core\Legacy;
|
||||
|
||||
use App\Entity\ViewDefinition;
|
||||
use App\Service\ModuleNameMapperInterface;
|
||||
use App\Service\ViewDefinitionsProviderInterface;
|
||||
use BeanFactory;
|
||||
use Exception;
|
||||
use InvalidArgumentException;
|
||||
use ListViewFacade;
|
||||
|
||||
/**
|
||||
* Class ViewDefinitions
|
||||
*/
|
||||
class ViewDefinitionsHandler extends LegacyHandler implements ViewDefinitionsProviderInterface
|
||||
{
|
||||
public const HANDLER_KEY = 'view-definitions';
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected static $listViewColumnInterface = [
|
||||
'fieldname' => '',
|
||||
'width' => '',
|
||||
'label' => '',
|
||||
'link' => false,
|
||||
'default' => false,
|
||||
'module' => '',
|
||||
'id' => '',
|
||||
'sortable' => false
|
||||
];
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getHandlerKey(): string
|
||||
{
|
||||
return self::HANDLER_KEY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var ModuleNameMapperInterface
|
||||
*/
|
||||
protected $moduleNameMapper;
|
||||
|
||||
|
||||
/**
|
||||
* SystemConfigHandler constructor.
|
||||
* @param string $projectDir
|
||||
* @param string $legacyDir
|
||||
* @param string $legacySessionName
|
||||
* @param string $defaultSessionName
|
||||
* @param LegacyScopeState $legacyScopeState
|
||||
* @param ModuleNameMapperInterface $moduleNameMapper
|
||||
*/
|
||||
public function __construct(
|
||||
string $projectDir,
|
||||
string $legacyDir,
|
||||
string $legacySessionName,
|
||||
string $defaultSessionName,
|
||||
LegacyScopeState $legacyScopeState,
|
||||
ModuleNameMapperInterface $moduleNameMapper
|
||||
) {
|
||||
parent::__construct($projectDir, $legacyDir, $legacySessionName, $defaultSessionName, $legacyScopeState);
|
||||
$this->moduleNameMapper = $moduleNameMapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $moduleName
|
||||
* @return ViewDefinition
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getListViewDef(string $moduleName): ViewDefinition
|
||||
{
|
||||
$this->init();
|
||||
/* @noinspection PhpIncludeInspection */
|
||||
include_once 'include/ListView/ListViewFacade.php';
|
||||
$moduleName = $this->validateModuleName($moduleName);
|
||||
$displayColumns = ListViewFacade::getDisplayColumns($moduleName);
|
||||
$data = [];
|
||||
foreach ($displayColumns as $key => $column) {
|
||||
$column = array_merge(self::$listViewColumnInterface, $column);
|
||||
$column['fieldname'] = $key;
|
||||
$data[] = $column;
|
||||
}
|
||||
$viewDef = new ViewDefinition();
|
||||
$viewDef->setId($moduleName);
|
||||
$viewDef->setListView($data);
|
||||
|
||||
$this->close();
|
||||
|
||||
return $viewDef;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $moduleName
|
||||
* @return string
|
||||
*/
|
||||
private function validateModuleName($moduleName): string
|
||||
{
|
||||
$moduleName = $this->moduleNameMapper->toLegacy($moduleName);
|
||||
|
||||
if (!$this->moduleNameMapper->isValidModule($moduleName)) {
|
||||
throw new InvalidArgumentException('Invalid module name: ' . $moduleName);
|
||||
}
|
||||
|
||||
return $moduleName;
|
||||
}
|
||||
}
|
57
core/src/DataProvider/ViewDefinitionItemDataProvider.php
Normal file
57
core/src/DataProvider/ViewDefinitionItemDataProvider.php
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace App\DataProvider;
|
||||
|
||||
use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
|
||||
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
|
||||
use App\Entity\ViewDefinition;
|
||||
use App\Service\ViewDefinitionsProviderInterface;
|
||||
|
||||
/**
|
||||
* Class ViewDefinitionItemDataProvider
|
||||
* @package App\DataProvider
|
||||
*/
|
||||
class ViewDefinitionItemDataProvider implements ItemDataProviderInterface, RestrictedDataProviderInterface
|
||||
{
|
||||
/**
|
||||
* @var ViewDefinitionsProviderInterface
|
||||
*/
|
||||
protected $viewDefHandler;
|
||||
|
||||
/**
|
||||
* ViewDefinitionItemDataProvider constructor.
|
||||
* @param ViewDefinitionsProviderInterface $viewDefHandler
|
||||
*/
|
||||
public function __construct(ViewDefinitionsProviderInterface $viewDefHandler)
|
||||
{
|
||||
$this->viewDefHandler = $viewDefHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define supported resources
|
||||
* @param string $resourceClass
|
||||
* @param string|null $operationName
|
||||
* @param array $context
|
||||
* @return bool
|
||||
*/
|
||||
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
|
||||
{
|
||||
return ViewDefinition::class === $resourceClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $resourceClass
|
||||
* @param array|int|string $id
|
||||
* @param string|null $operationName
|
||||
* @param array $context
|
||||
* @return ViewDefinition|null
|
||||
*/
|
||||
public function getItem(
|
||||
string $resourceClass,
|
||||
$id,
|
||||
string $operationName = null,
|
||||
array $context = []
|
||||
): ?ViewDefinition {
|
||||
return $this->viewDefHandler->getListViewDef($id);
|
||||
}
|
||||
}
|
198
core/src/Entity/ViewDefinition.php
Normal file
198
core/src/Entity/ViewDefinition.php
Normal file
|
@ -0,0 +1,198 @@
|
|||
<?php
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use ApiPlatform\Core\Annotation\ApiProperty;
|
||||
use ApiPlatform\Core\Annotation\ApiResource;
|
||||
|
||||
/**
|
||||
* @ApiResource(
|
||||
* routePrefix="/metadata",
|
||||
* itemOperations={
|
||||
* "get"
|
||||
* },
|
||||
* collectionOperations={
|
||||
* "get"
|
||||
* },
|
||||
* graphql={
|
||||
* "item_query",
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
class ViewDefinition
|
||||
{
|
||||
/**
|
||||
* The module
|
||||
*
|
||||
* @var string
|
||||
*
|
||||
* @ApiProperty(
|
||||
* identifier=true,
|
||||
* attributes={
|
||||
* "openapi_context"={
|
||||
* "type"="string",
|
||||
* "description"="The module.",
|
||||
* "example"="Accounts"
|
||||
* }
|
||||
* },
|
||||
*
|
||||
* )
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* Detail View metadata
|
||||
*
|
||||
* @var array
|
||||
*
|
||||
* @ApiProperty(
|
||||
* attributes={
|
||||
* "openapi_context"={
|
||||
* "type"="array",
|
||||
* "description"="The detail-view metadata",
|
||||
* },
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
public $detailView;
|
||||
|
||||
/**
|
||||
* Edit View metadata
|
||||
*
|
||||
* @var array
|
||||
*
|
||||
* @ApiProperty(
|
||||
* attributes={
|
||||
* "openapi_context"={
|
||||
* "type"="array",
|
||||
* "description"="The edit-view metadata",
|
||||
* },
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
public $editView;
|
||||
|
||||
/**
|
||||
* List View metadata
|
||||
*
|
||||
* @var array
|
||||
*
|
||||
* @ApiProperty(
|
||||
* attributes={
|
||||
* "openapi_context"={
|
||||
* "type"="array",
|
||||
* "description"="The list-view metadata",
|
||||
* },
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
public $listView;
|
||||
|
||||
/**
|
||||
* Search metadata
|
||||
*
|
||||
* @var array
|
||||
*
|
||||
* @ApiProperty(
|
||||
* attributes={
|
||||
* "openapi_context"={
|
||||
* "type"="array",
|
||||
* "description"="The search metadata",
|
||||
* },
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
public $search;
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getId(): string
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $id
|
||||
*/
|
||||
public function setId($id): void
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Detail View metadata
|
||||
* @return array
|
||||
*/
|
||||
public function getDetailView(): ?array
|
||||
{
|
||||
return $this->detailView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Detail view metadata
|
||||
* @param array $detailView
|
||||
*/
|
||||
public function setDetailView(array $detailView): void
|
||||
{
|
||||
$this->detailView = $detailView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get EditView Metadata
|
||||
* @return array
|
||||
*/
|
||||
public function getEditView(): ?array
|
||||
{
|
||||
return $this->editView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set EditView Metadata
|
||||
* @param array $editView
|
||||
*/
|
||||
public function setEditView(array $editView): void
|
||||
{
|
||||
$this->editView = $editView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get List View Metadata
|
||||
* @return array
|
||||
*/
|
||||
public function getListView(): ?array
|
||||
{
|
||||
return $this->listView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set List View metadata
|
||||
* @param array $listView
|
||||
*/
|
||||
public function setListView(array $listView): void
|
||||
{
|
||||
$this->listView = $listView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Search Metadata
|
||||
* @return array
|
||||
*/
|
||||
public function getSearch(): ?array
|
||||
{
|
||||
return $this->search;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Search Metadata
|
||||
* @param array $search
|
||||
* @return ViewDefinition
|
||||
*/
|
||||
public function setSearch(array $search): ViewDefinition
|
||||
{
|
||||
$this->search = $search;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
16
core/src/Service/ViewDefinitionsProviderInterface.php
Normal file
16
core/src/Service/ViewDefinitionsProviderInterface.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use App\Entity\ViewDefinition;
|
||||
|
||||
interface ViewDefinitionsProviderInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* Get list-view defs
|
||||
* @param string $moduleName
|
||||
* @return ViewDefinition
|
||||
*/
|
||||
public function getListViewDef(string $moduleName): ViewDefinition;
|
||||
}
|
64
tests/unit/core/legacy/ViewDefinitionsHandlerTest.php
Normal file
64
tests/unit/core/legacy/ViewDefinitionsHandlerTest.php
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tests;
|
||||
|
||||
use App\Entity\ViewDefinition;
|
||||
use AspectMock\Test;
|
||||
use Codeception\Test\Unit;
|
||||
use Exception;
|
||||
use SuiteCRM\Core\Legacy\ActionNameMapperHandler;
|
||||
use SuiteCRM\Core\Legacy\ModuleNameMapperHandler;
|
||||
use SuiteCRM\Core\Legacy\ModuleRegistryHandler;
|
||||
use SuiteCRM\Core\Legacy\ViewDefinitionsHandler;
|
||||
use SuiteCRM\Core\Legacy\RouteConverterHandler;
|
||||
|
||||
final class ViewDefinitionsHandlerTest extends Unit
|
||||
{
|
||||
/**
|
||||
* @var UnitTester
|
||||
*/
|
||||
protected $tester;
|
||||
|
||||
/**
|
||||
* @var ViewDefinition
|
||||
*/
|
||||
protected $viewDefinition;
|
||||
|
||||
/**
|
||||
* @var ViewDefinitionsHandler
|
||||
*/
|
||||
private $viewDefinitionHandler;
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
* @noinspection StaticClosureCanBeUsedInspection
|
||||
*/
|
||||
protected function _before(): void
|
||||
{
|
||||
$projectDir = $this->tester->getProjectDir();
|
||||
$legacyDir = $this->tester->getLegacyDir();
|
||||
$legacySessionName = $this->tester->getLegacySessionName();
|
||||
$defaultSessionName = $this->tester->getDefaultSessionName();
|
||||
|
||||
$legacyScope = $this->tester->getLegacyScope();
|
||||
|
||||
$moduleNameMapper = new ModuleNameMapperHandler(
|
||||
$projectDir,
|
||||
$legacyDir,
|
||||
$legacySessionName,
|
||||
$defaultSessionName,
|
||||
$legacyScope
|
||||
);
|
||||
|
||||
$this->viewDefinitionHandler = new ViewDefinitionsHandler(
|
||||
$projectDir,
|
||||
$legacyDir,
|
||||
$legacySessionName,
|
||||
$defaultSessionName,
|
||||
$legacyScope,
|
||||
$moduleNameMapper
|
||||
);
|
||||
|
||||
$this->viewDefinition = $this->viewDefinitionHandler->getListViewDef('Accounts');
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue