Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
25 / 25
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
AbstractTableWidgetRenderer
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 renderModuleTable
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5/** @license For full copyright and license information, please see the LICENSE.md file. */
6
7namespace App\Core\Grid\Widget;
8
9defined('AMMONLY_APP') || exit('Direct script access is forbidden.');
10
11use App\Core\Engine\Application\Service\UniversalCrudService;
12use App\Core\Engine\Domain\Model\PermissionContext;
13use App\Core\Engine\Domain\Model\RelationGridMetadata;
14use App\Core\Grid\GridRequest;
15use Psr\Http\Message\ServerRequestInterface;
16use Twig\Environment as TwigEnvironment;
17
18/**
19 * Base Abstract Table Widget Renderer.
20 *
21 * Provides shared widget rendering and grid payload extraction for table widget tiles.
22 *
23 * @package App\Core\Grid\Widget
24 */
25abstract readonly class AbstractTableWidgetRenderer implements WidgetRendererInterface
26{
27    /**
28     * AbstractTableWidgetRenderer constructor.
29     *
30     * @param UniversalCrudService $crudService Central engine CRUD service.
31     * @param TwigEnvironment      $twig        Twig template renderer.
32     */
33    public function __construct(
34        protected UniversalCrudService $crudService,
35        protected TwigEnvironment      $twig,
36    ) {
37    }
38
39    /**
40     * Renders standard table widget tile for a resolved module name.
41     */
42    protected function renderModuleTable(
43        string                 $moduleName,
44        RelationGridMetadata   $relation,
45        ServerRequestInterface $request,
46        PermissionContext      $context,
47        string                 $template = 'engine/partials/widget_physical_table.twig'
48    ): string {
49        try {
50            $gridRequest = GridRequest::fromRequest($request, 'id');
51            $meta        = $this->crudService->getMetadataRepository();
52            $module      = $meta->findModule($moduleName);
53            $fields      = $meta->findFields($module->id);
54            $filter      = $meta->findFilter($module->id, null);
55            $result      = $this->crudService->list($moduleName, $gridRequest, $context, $filter->id);
56
57            $viewData = [
58                'relation'     => $relation,
59                'module'       => $module,
60                'fields'       => $fields,
61                'filter'       => $filter,
62                'result'       => $result,
63                'grid_request' => $gridRequest,
64                'widget_id'    => $relation->id,
65                'total_count'  => $result->totalRecords,
66            ];
67
68            return $this->twig->render($template, $viewData);
69        } catch (\Throwable $e) {
70            return sprintf(
71                '<div class="alert alert-danger m-3">%s: %s</div>',
72                'Error loading widget table data',
73                htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8')
74            );
75        }
76    }
77}