Skip to content

Commit 2fa532b

Browse files
committed
Refactored preview
1 parent 08be1fc commit 2fa532b

7 files changed

Lines changed: 146 additions & 210 deletions

os2forms_fordelingskomponent.routing.yml

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,17 @@ os2forms_fordelingskomponent.routing_info:
1919
_permission: "administer site configuration"
2020

2121
os2forms_fordelingskomponent.fordelingskomponent_distribution_object.preview:
22-
path: "/admin/structure/webform/manage/{webform}/os2forms_fordelingskomponent/fordelingsobjekt/{webform_handler}/preview"
22+
path: "/admin/structure/webform/manage/{webform}/os2forms_fordelingskomponent/fordelingsobjekt/{webform_handler}/preview/{webform_submission}"
2323
defaults:
2424
_controller: '\Drupal\os2forms_fordelingskomponent\Controller\Os2formsFordelingskomponentDistributionObjectPreviewController'
2525
_title: "Fordelingskomponent fordelingsobjekt preview"
26+
webform_submission: null
2627
options:
2728
parameters:
2829
webform:
2930
type: "entity:webform"
30-
requirements:
31-
# @todo Harden this permission to allow only access when user has access to webform.
32-
_permission: "view any webform submission"
33-
34-
os2forms_fordelingskomponent.fordelingskomponent_distribution_object.preview_render:
35-
path: "/admin/structure/webform/manage/{webform}/os2forms_fordelingskomponent/fordelingsobjekt/{webform_handler}/preview/render/{submission}"
36-
defaults:
37-
_controller: '\Drupal\os2forms_fordelingskomponent\Controller\Os2formsFordelingskomponentDistributionObjectPreviewRenderController'
38-
_title: "Fordelingskomponent fordelingsobjekt preview"
39-
options:
40-
parameters:
41-
webform:
42-
type: "entity:webform"
43-
submission:
31+
webform_submission:
4432
type: "entity:webform_submission"
4533
requirements:
34+
# @todo Harden this permission to allow only access when user has access to webform.
4635
_permission: "view any webform submission"

src/Controller/Os2formsFordelingskomponentDistributionObjectPreviewController.php

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@
77
use Drupal\Core\Controller\ControllerBase;
88
use Drupal\Core\Entity\EntityTypeManagerInterface;
99
use Drupal\Core\Url;
10+
use Drupal\os2forms_fordelingskomponent\Helper\WebformHelperSF2900;
1011
use Drupal\os2forms_fordelingskomponent\Hook\ThemeHooks;
12+
use Drupal\os2forms_fordelingskomponent\Model\Attachment;
1113
use Drupal\os2forms_fordelingskomponent\Plugin\WebformHandler\WebformHandlerSF2900;
1214
use Drupal\os2forms_fordelingskomponent\Settings;
15+
use Drupal\os2forms_fordelingskomponent\Settings\HandlerSettings;
1316
use Drupal\webform\WebformInterface;
17+
use Drupal\webform\WebformSubmissionInterface;
1418
use Drupal\webform\WebformSubmissionStorageInterface;
1519
use Symfony\Component\HttpFoundation\Request;
1620
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -27,6 +31,7 @@ final class Os2formsFordelingskomponentDistributionObjectPreviewController exten
2731

2832
public function __construct(
2933
private readonly Settings $settings,
34+
private readonly WebformHelperSF2900 $helper,
3035
EntityTypeManagerInterface $entityTypeManager,
3136
) {
3237
$this->submissionStorage = $entityTypeManager->getStorage('webform_submission');
@@ -35,7 +40,7 @@ public function __construct(
3540
/**
3641
* Builds the response.
3742
*/
38-
public function __invoke(Request $request, WebformInterface $webform, string $webform_handler): array {
43+
public function __invoke(Request $request, WebformInterface $webform, string $webform_handler, ?WebformSubmissionInterface $webform_submission): array {
3944
try {
4045
$handler = $webform->getHandler($webform_handler);
4146
}
@@ -55,19 +60,22 @@ public function __invoke(Request $request, WebformInterface $webform, string $we
5560
->condition('webform_id', $webform->id())
5661
->sort('created', 'DESC')
5762
->execute());
58-
$currentSubmissionId = (int) $request->query->get('submission');
63+
$currentSubmissionId = $webform_submission?->id();
5964
$index = array_search($currentSubmissionId, $submissionIds);
6065
if (FALSE === $index) {
6166
$currentSubmissionId = reset($submissionIds) ?: NULL;
6267
$index = array_search($currentSubmissionId, $submissionIds);
6368
}
69+
if ($currentSubmissionId) {
70+
$webform_submission = $this->submissionStorage->load($currentSubmissionId);
71+
}
6472

6573
$routeName = $request->attributes->get('_route');
66-
$previewUrls = array_map(
74+
$links = array_map(
6775
static fn($submission) => Url::fromRoute($routeName, [
6876
'webform' => $webform->id(),
6977
'webform_handler' => $handler->getHandlerId(),
70-
'submission' => $submission,
78+
'webform_submission' => $submission,
7179
]),
7280
array_filter([
7381
'prev' => $submissionIds[$index + 1] ?? NULL,
@@ -76,21 +84,46 @@ public function __invoke(Request $request, WebformInterface $webform, string $we
7684
])
7785
);
7886

79-
$renderUrl = NULL !== $currentSubmissionId
80-
? Url::fromRoute('os2forms_fordelingskomponent.fordelingskomponent_distribution_object.preview_render', [
81-
'webform' => $webform->id(),
82-
'webform_handler' => $handler->getHandlerId(),
83-
'submission' => $currentSubmissionId,
84-
])
85-
: NULL;
86-
8787
return [
8888
'#theme' => ThemeHooks::DISTRIBUTION_OBJECT_PREVIEW,
8989
'#webform' => $webform,
90+
'#submission' => $webform_submission,
9091
'#handler' => $handler,
9192
'#handler_settings' => $handlerSettings,
92-
'#render_url' => $renderUrl,
93-
'#preview_urls' => $previewUrls,
93+
'#preview' => $webform_submission ? $this->renderPreview($handler, $handlerSettings, $webform_submission) : NULL,
94+
'#links' => $links,
95+
];
96+
}
97+
98+
/**
99+
* Render preview of distribution object.
100+
*/
101+
public function renderPreview(WebformHandlerSF2900 $handler, HandlerSettings $handlerSettings, WebformSubmissionInterface $submission): array {
102+
$exceptions = [];
103+
$warnings = [];
104+
105+
$distributionObject = NULL;
106+
$xml = [];
107+
try {
108+
$attachment = new Attachment('preview', Attachment::MIME_TYPE_PDF, 'preview.pdf');
109+
$distributionObject = $this->helper->buildDistributionObject($handlerSettings, $submission, $attachment);
110+
}
111+
catch (\Exception $exception) {
112+
$exceptions[] = $exception;
113+
}
114+
115+
try {
116+
$xml = $this->helper->renderXml($handlerSettings, $submission, validateXml: FALSE);
117+
}
118+
catch (\Throwable) {
119+
// Silently ignore any errors.
120+
}
121+
122+
return [
123+
'exceptions' => $exceptions,
124+
'warnings' => $warnings,
125+
'distribution_object' => $distributionObject,
126+
'xml' => $xml,
94127
];
95128
}
96129

src/Controller/Os2formsFordelingskomponentDistributionObjectPreviewRenderController.php

Lines changed: 0 additions & 83 deletions
This file was deleted.

src/Hook/ThemeHooks.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ public function theme(array $existing, string $type, string $theme, string $path
2929
self::DISTRIBUTION_OBJECT_PREVIEW => [
3030
'variables' => [
3131
'webform' => NULL,
32+
'submission' => NULL,
3233
'handler' => NULL,
3334
'handler_settings' => NULL,
34-
'render_url' => NULL,
35-
'preview_urls' => [
35+
'preview' => NULL,
36+
'links' => [
3637
'prev' => NULL,
3738
'self' => NULL,
3839
'next' => NULL,

templates/base.html.twig

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,26 @@
3131
[disabled] {
3232
opacity: 50%;
3333
}
34+
35+
iframe {
36+
width: 100%;
37+
height: 20rem;
38+
}
3439
}
3540
</style>
3641
{% endblock %}
3742

3843
{% block navigation %}
3944
<div class="navigation">
4045
<div class="paging">
41-
{% if preview_urls is defined %}
42-
{% if preview_urls.prev %}
43-
<a href="{{ preview_urls.prev }}">{{ 'Previous submission'|t }}</a>
46+
{% if links is defined %}
47+
{% if links.prev %}
48+
<a href="{{ links.prev }}">{{ 'Previous submission'|t }}</a>
4449
{% else %}
4550
<span disabled>{{ 'Previous submission'|t }}</span>
4651
{% endif %}
47-
{% if preview_urls.next %}
48-
<a href="{{ preview_urls.next }}">{{ 'Next submission'|t }}</a>
52+
{% if links.next %}
53+
<a href="{{ links.next }}">{{ 'Next submission'|t }}</a>
4954
{% else %}
5055
<span disabled>{{ 'Next submission'|t }}</span>
5156
{% endif %}
@@ -74,6 +79,29 @@
7479
</details>
7580
{% endmacro %}
7681

77-
{% macro render_json(value) %}
78-
<pre><code>{{ value|json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_UNESCAPED_UNICODE')) }}</code></pre>
82+
{% macro render_json(value, label) %}
83+
<fieldset>
84+
<legend>{{ label }}</legend>
85+
86+
{% set data_url = 'data:application/json,' ~ (value|json_encode|url_encode) %}
87+
<iframe src="{{ data_url }}"></iframe>
88+
<a target="_blank" href="{{ data_url }}">{{ 'Open data in new tab'|trans }}</a>
89+
90+
<pre><code>{{ value|json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_UNESCAPED_UNICODE')) }}</code></pre>
91+
</fieldset>
92+
{% endmacro %}
93+
94+
{% macro render_xml(value, label) %}
95+
<fieldset>
96+
<legend>{{ label }}</legend>
97+
98+
{% set data_url = 'data:text/xml,' ~ (value|url_encode) %}
99+
<iframe src="{{ data_url }}"></iframe>
100+
<a target="_blank" href="{{ data_url }}">{{ 'Open data in new tab'|trans }}</a>
101+
102+
<details>
103+
<summary>{{ 'Raw content'|trans }}</summary>
104+
<pre><code>{{ value }}</code></pre>
105+
</details>
106+
</fieldset>
79107
{% endmacro %}

templates/os2forms-fordelingskomponent-distribution-object-preview-render.html.twig

Lines changed: 0 additions & 83 deletions
This file was deleted.

0 commit comments

Comments
 (0)