diff --git a/Classes/Controller/QueueController.php b/Classes/Controller/QueueController.php index 9b1178d491cdbfd3c10091c3706ead290e13a56e..893b354f0e2ae0c3521b7e7922dae69a219a3fb9 100644 --- a/Classes/Controller/QueueController.php +++ b/Classes/Controller/QueueController.php @@ -182,6 +182,18 @@ class QueueController extends ActionController { $this->redirect('index', NULL, NULL, $this->request->getArguments()); } + /** + * Preview for a mail + * + * @param int $uid + */ + public function previewAction($uid): void { + $mailService = new MailTemplateService(); + $mailToPreview = $mailService->getMailObjectByUid($uid); + + $this->view->assign('mail', $mailToPreview); + } + /** * Download the queue data as a csv file, respecting the filter settings * @@ -225,7 +237,8 @@ class QueueController extends ActionController { // save the Template filter to the session if (!isset($_SESSION[$this->session->getSessionKey()]['filterTemplate']) - || (isset($_POST['filterTemplate']) && $this->session->getDataByKey('filterTemplate') !== $_POST['filterTemplate'])) { + || (isset($_POST['filterTemplate']) + && $this->session->getDataByKey('filterTemplate') !== $_POST['filterTemplate'])) { $this->session->setDataByKey('filterTemplate', $_POST['filterTemplate']); } diff --git a/Classes/Service/MailTemplateService.php b/Classes/Service/MailTemplateService.php index 83676e37fb1f933936cd83e47a76eab3811be098..4ff49106aacc60da944710ac379421ab256902eb 100644 --- a/Classes/Service/MailTemplateService.php +++ b/Classes/Service/MailTemplateService.php @@ -1263,7 +1263,7 @@ class MailTemplateService { * @param int $uid * @return bool|object */ - private function getMailObjectByUid($uid) { + public function getMailObjectByUid($uid) { if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '10.4.0', '<')) { /** @var MailRepository $mailRepository */ $mailRepository = $this->objectManager->get(MailRepository::class); diff --git a/Resources/Private/Language/de.locallang.xlf b/Resources/Private/Language/de.locallang.xlf index 98b68fbbe1efc6aba403768f1ce3c0012ce549a2..0bdcf046cf34bee82dc787995eddab63063673e4 100644 --- a/Resources/Private/Language/de.locallang.xlf +++ b/Resources/Private/Language/de.locallang.xlf @@ -589,6 +589,30 @@ Die Templates declined und approved der Extension sg_comments sind fÞr alle Dom <source><![CDATA[Do you want to send the newsletter to all recipients?]]></source> <target><![CDATA[MÃķchten Sie den Newsletter an allen EmpfÃĪnger senden?]]></target> </trans-unit> + <trans-unit id="backend.preview.date"> + <source><![CDATA[Date]]></source> + <target><![CDATA[Datum]]></target> + </trans-unit> + <trans-unit id="backend.preview.from"> + <source><![CDATA[From]]></source> + <target><![CDATA[Von]]></target> + </trans-unit> + <trans-unit id="backend.preview.subject"> + <source><![CDATA[Subject]]></source> + <target><![CDATA[Betreff]]></target> + </trans-unit> + <trans-unit id="backend.preview.to"> + <source><![CDATA[To]]></source> + <target><![CDATA[An]]></target> + </trans-unit> + <trans-unit id="backend.preview.cc"> + <source><![CDATA[CC]]></source> + <target><![CDATA[CC]]></target> + </trans-unit> + <trans-unit id="backend.preview.bcc"> + <source><![CDATA[BCC]]></source> + <target><![CDATA[BCC]]></target> + </trans-unit> </body> </file> </xliff> diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf index 779454c18c6016855a4c2b68cb4d4a50d4643c33..5634e05a510907168fb333a0d85c9265cf0fbec4 100644 --- a/Resources/Private/Language/locallang.xlf +++ b/Resources/Private/Language/locallang.xlf @@ -441,6 +441,24 @@ The templates declined and approved of the sg_comments extension are blacklisted <trans-unit id="backend.newsletter.confirm_send"> <source><![CDATA[Do you want to send the newsletter to all recipients?]]></source> </trans-unit> + <trans-unit id="backend.preview.date"> + <source><![CDATA[Date]]></source> + </trans-unit> + <trans-unit id="backend.preview.from"> + <source><![CDATA[From]]></source> + </trans-unit> + <trans-unit id="backend.preview.subject"> + <source><![CDATA[Subject]]></source> + </trans-unit> + <trans-unit id="backend.preview.to"> + <source><![CDATA[To]]></source> + </trans-unit> + <trans-unit id="backend.preview.cc"> + <source><![CDATA[CC]]></source> + </trans-unit> + <trans-unit id="backend.preview.bcc"> + <source><![CDATA[BCC]]></source> + </trans-unit> </body> </file> </xliff> diff --git a/Resources/Private/Layouts/Preview.html b/Resources/Private/Layouts/Preview.html new file mode 100644 index 0000000000000000000000000000000000000000..380ad79e7b4f847028c637b6d3c690ec01aac724 --- /dev/null +++ b/Resources/Private/Layouts/Preview.html @@ -0,0 +1,7 @@ +{namespace sgm=SGalinski\SgMail\ViewHelpers} +<head> + <link rel="stylesheet" href="{f:uri.resource(path: 'StyleSheets/preview.css')}"> +</head> +<body> +<f:render section="mailPreview"></f:render> +</body> diff --git a/Resources/Private/Templates/Queue/Index.html b/Resources/Private/Templates/Queue/Index.html index 78f27d7829e45e8b2b79068dac468b204e21924c..c75f7eeb34a2560755db9897f0b76cb27419845f 100644 --- a/Resources/Private/Templates/Queue/Index.html +++ b/Resources/Private/Templates/Queue/Index.html @@ -1,91 +1,113 @@ {namespace sgm=SGalinski\SgMail\ViewHelpers} -<f:layout name="Queue" /> +<f:layout name="Queue"/> <f:section name="iconButtons"> </f:section> <f:section name="content"> - <f:flashMessages /> + <f:flashMessages/> <f:if condition="!{pages}"> - <f:render partial="Queue/Filter" arguments="{filterFields: filterFields, filters: filters, languages: languages, templatesFilter: templatesFilter, selectedTemplateFilter: selectedTemplateFilter, selectedExtensionFilter: selectedExtensionFilter}" /> + <f:render partial="Queue/Filter" + arguments="{filterFields: filterFields, filters: filters, languages: languages, templatesFilter: templatesFilter, selectedTemplateFilter: selectedTemplateFilter, selectedExtensionFilter: selectedExtensionFilter}"/> <f:if condition="{queue -> f:count()} > 0"> <f:then> <div class="panel panel-default recordlist"> <div class="table-fit"> <table data-table="tx_sgmail_domain_model_mail" class="table table-striped table-hover"> - <sgm:backend.widget.paginate objects="{queue}" as="paginatedMails" configuration="{insertAbove: 1, itemsPerPage: 20}"> + <sgm:backend.widget.paginate objects="{queue}" as="paginatedMails" + configuration="{insertAbove: 1, itemsPerPage: 20}"> <thead> - <tr> - <th></th> - <th><f:translate key="backend.from" /> <br> <f:translate key="backend.to" /> - </th> - <th><f:translate key="backend.filter.extension" />: - <f:translate key="backend.filter.template" /> <br> - <f:translate key="backend.subject" /></th> - <th><f:translate key="backend.entry_date" /> <br> - <f:translate key="backend.last_sent" /></th> - <th></th> - <th></th> - </tr> + <tr> + <th></th> + <th> + <f:translate key="backend.from"/> + <br> + <f:translate key="backend.to"/> + </th> + <th> + <f:translate key="backend.filter.extension"/> + : + <f:translate key="backend.filter.template"/> + <br> + <f:translate key="backend.subject"/> + </th> + <th> + <f:translate key="backend.entry_date"/> + <br> + <f:translate key="backend.last_sent"/> + </th> + <th></th> + <th></th> + </tr> </thead> <tbody> - <f:for each="{paginatedMails}" as="mail"> - <tr data-uid="{mail.uid}"> - <td nowrap="nowrap" class="col-icon"> - <sgm:backend.icon table="tx_sgmail_domain_model_mail" row="{mail}" /> - </td> - <td> - <span>{mail.from_address}</span> - <hr> - <span>{mail.to_address}</span> - </td> - <td> - <span>{mail.extension_key}: {mail.template_name}</span> - <hr> - <f:if condition="{mail.mail_subject}"> - <f:then> - <span><f:format.crop maxCharacters="40" append="...">{mail.mail_subject}</f:format.crop></span> - </f:then> - <f:else> - - </f:else> - </f:if> + <f:for each="{paginatedMails}" as="mail"> + <tr data-uid="{mail.uid}"> + <td nowrap="nowrap" class="col-icon"> + <sgm:backend.icon table="tx_sgmail_domain_model_mail" row="{mail}"/> + </td> + <td> + <span>{mail.from_address}</span> + <hr> + <span>{mail.to_address}</span> + </td> + <td> + <span>{mail.extension_key}: {mail.template_name}</span> + <hr> + <f:if condition="{mail.mail_subject}"> + <f:then> + <span><f:format.crop maxCharacters="40" append="...">{mail.mail_subject}</f:format.crop></span> + </f:then> + <f:else> + + </f:else> + </f:if> - </td> - <td> - <span><f:format.date format="d.m.Y H:i">{mail.crdate}</f:format.date></span> - <hr> - <f:if condition="{mail.last_sending_time} != 0"> - <f:then> - <span><f:format.date format="d.m.Y H:i">{mail.last_sending_time}</f:format.date></span> - </f:then> - <f:else> - <f:translate key="backend.not_sent" /> - </f:else> - </f:if> - </td> - <td nowrap="nowrap" class="col-control"> - <sgm:backend.control table="tx_sgmail_domain_model_mail" row="{mail}" /> - </td> - <td> - <f:if condition="{mail.blacklisted}"> - <f:then> - <b><f:translate key="backend.queue.blacklisted" /></b> - </f:then> - <f:else> - <f:link.action class="btn btn-default btn-send-now" controller="Queue" action="sendMail" arguments="{uid: mail.uid, selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}"> - <span class="t3js-icon icon icon-size-small icon-state-default actions-document-import-t3d"> + </td> + <td> + <span><f:format.date format="d.m.Y H:i">{mail.crdate}</f:format.date></span> + <hr> + <f:if condition="{mail.last_sending_time} != 0"> + <f:then> + <span><f:format.date + format="d.m.Y H:i">{mail.last_sending_time}</f:format.date></span> + </f:then> + <f:else> + <f:translate key="backend.not_sent"/> + </f:else> + </f:if> + </td> + <td nowrap="nowrap" class="col-control"> + <sgm:backend.control table="tx_sgmail_domain_model_mail" row="{mail}"/> + </td> + <td> + <f:if condition="{mail.blacklisted}"> + <f:then> + <b> + <f:translate key="backend.queue.blacklisted"/> + </b> + </f:then> + <f:else> + <f:link.action class="btn btn-default btn-send-now" + controller="Queue" action="sendMail" + arguments="{uid: mail.uid, selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}"> + <span + class="t3js-icon icon icon-size-small icon-state-default actions-document-import-t3d"> <span class="icon-markup"> - <img src="/typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-document-import-t3d.svg" width="16" height="16"> + <core:icon identifier="actions-document-import-t3d"/> </span> </span> - <f:translate key="backend.send_now" /> - </f:link.action> - </f:else> - </f:if> - </td> - </f:for> + <f:translate key="backend.send_now"/> + </f:link.action> + </f:else> + </f:if> + <button class="btn btn-default btn-preview" + onClick="MailPreviewWindow{mail.uid}=window.open('{f:uri.action( controller: 'Queue', action: 'preview', noCacheHash: true, arguments: {uid: mail.uid, selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey})}','MailPreviewWindow{mail.uid}','width=1200,height=768'); return false;"> + <core:icon identifier="actions-view-page"/> + </button> + </td> + </f:for> </tbody> </sgm:backend.widget.paginate> </table> @@ -93,27 +115,27 @@ </div> </f:then> <f:else> - <f:render partial="Queue/Empty" /> + <f:render partial="Queue/Empty"/> </f:else> </f:if> </f:if> <f:if condition="{pages}"> - <f:render partial="Mail/Empty" /> + <f:render partial="Mail/Empty"/> <div class="panel panel-default recordlist"> <div class="table-fit"> <table data-table="pages" class="table table-striped table-hover"> <tbody> - <f:for each="{pages}" as="page"> - <tr data-uid="{page.pid}"> - <td nowrap="nowrap" class="col-title"> - <f:link.action action="index" additionalParams="{id: page.uid, returnUrl: returnUrl}"> - <sgm:backend.icon table="pages" row="{page}" clickMenu="0" /> - {page._thePathFull} - </f:link.action> - </td> - </tr> - </f:for> + <f:for each="{pages}" as="page"> + <tr data-uid="{page.pid}"> + <td nowrap="nowrap" class="col-title"> + <f:link.action action="index" additionalParams="{id: page.uid, returnUrl: returnUrl}"> + <sgm:backend.icon table="pages" row="{page}" clickMenu="0"/> + {page._thePathFull} + </f:link.action> + </td> + </tr> + </f:for> </tbody> </table> </div> diff --git a/Resources/Private/Templates/Queue/Preview.html b/Resources/Private/Templates/Queue/Preview.html new file mode 100644 index 0000000000000000000000000000000000000000..ee57f58fde17f7d903aa2afe96641b35b1e57bec --- /dev/null +++ b/Resources/Private/Templates/Queue/Preview.html @@ -0,0 +1,74 @@ +<f:layout name="Preview"/> + +<f:section name="mailPreview"> + <div class="mail-header"> + <table> + <tr> + <th> + <f:translate key="backend.preview.date"/> + </th> + <td> + <f:format.date format="d.m.Y H:i"> + <f:format.stripTags>{mail.sendingTime}</f:format.stripTags> + </f:format.date> + </td> + </tr> + + <tr> + <th> + <f:translate key="backend.preview.from"/> + </th> + <td> + <f:format.stripTags>{mail.fromName}</f:format.stripTags> + <<f:format.stripTags>{mail.fromAddress}</f:format.stripTags>> + </td> + </tr> + + <tr> + <th> + <f:translate key="backend.preview.subject"/> + </th> + <td> + <strong> + <f:format.stripTags>{mail.mailSubject}</f:format.stripTags> + </strong> + </td> + </tr> + + <tr> + <th> + <f:translate key="backend.preview.to"/> + </th> + <td class="ng-binding"> + <f:format.stripTags>{mail.toAddress}</f:format.stripTags> + </td> + </tr> + + <f:if condition="{mail.ccAddresses}"> + <tr> + <th> + <f:translate key="backend.preview.cc"/> + </th> + <td class="ng-binding"> + <f:format.stripTags>{mail.ccAddresses}</f:format.stripTags> + </td> + </tr> + </f:if> + + <f:if condition="{mail.bccAddresses}"> + <tr> + <th> + <f:translate key="backend.preview.bcc"/> + </th> + <td class="ng-binding"> + <f:format.stripTags>{mail.bccAddresses}</f:format.stripTags> + </td> + </tr> + </f:if> + </table> + </div> + + <div class="mail-body"> + <iframe class="mail-body-iframe" srcdoc="{mail.mailBody}" sandbox></iframe> + </div> +</f:section> diff --git a/Resources/Public/StyleSheets/preview.css b/Resources/Public/StyleSheets/preview.css new file mode 100644 index 0000000000000000000000000000000000000000..0ff0c1f1e077c78c6842a6a9cef27073e727a86c --- /dev/null +++ b/Resources/Public/StyleSheets/preview.css @@ -0,0 +1,41 @@ +* { + font-family: Sans-Serif; +} + +body { + margin: 0; +} + +.mail-header { + border-bottom: 1px solid #666; + padding: 5px 7px; +} + +.mail-header tbody td { + width: 100%; + font-size: 15px; +} + +.mail-header tbody th { + white-space: nowrap; + text-align: right; + color: #666; + font-weight: normal; + font-size: 15px; +} + +.mail-header table td, +.mail-header table th { + padding: 2px 7px; +} + +.mail-body { + padding: 10px; +} + +.mail-body-iframe{ + border: none; + width: 100%; + max-width: 1280px; + height:100vh; +} diff --git a/ext_tables.php b/ext_tables.php index 2b892c35fa7be3437adfa0de3fe0d4091de37450..e1195c77f357bc301a5ff5dc0d4c754716393f7d 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -32,7 +32,7 @@ call_user_func( '', [ 'Mail' => 'index, sendTestMail, empty, reset', - 'Queue' => 'index, sendMail, export', + 'Queue' => 'index, sendMail, export, preview', 'Configuration' => 'index, create, edit, delete', 'Layout' => 'index', 'Newsletter' => 'index, sendTestMail, empty',