From 159cc7b7a55da551ac1af796f3ff0f8586593a97 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:02:42 +0200 Subject: [PATCH 01/82] Added sane landing page for root requests --- config/routes.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/routes.yaml b/config/routes.yaml index 41ef814..82a87cf 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -3,3 +3,9 @@ controllers: path: ../src/Controller/ namespace: App\Controller type: attribute +root_redirect: + path: / + controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController + defaults: + route: 'qr_index' + permanent: true From f019bab8634088d17319d9241588c459a13d3c9d Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:04:42 +0200 Subject: [PATCH 02/82] renamed theme to design --- src/Controller/Admin/DashboardController.php | 2 +- src/Controller/Admin/QrCrudController.php | 2 ++ src/Controller/Admin/QrVisualConfigCrudController.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index ec392d0..edda0c9 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -36,6 +36,6 @@ public function configureDashboard(): Dashboard public function configureMenuItems(): iterable { yield MenuItem::linkToCrud(new TranslatableMessage('QR Codes'), 'fa fa-qrcode', Qr::class); - yield MenuItem::linkToCrud(new TranslatableMessage('QR Themes'), 'fa fa-palette', QrVisualConfig::class); + yield MenuItem::linkToCrud(new TranslatableMessage('QR Designs'), 'fa fa-palette', QrVisualConfig::class); } } diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index b6b72b1..d582d56 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -25,6 +25,7 @@ use Endroid\QrCode\Exception\ValidationException; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\StreamedResponse; +use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Translation\TranslatableMessage; /** @@ -32,6 +33,7 @@ */ class QrCrudController extends AbstractTenantAwareCrudController { + #[\Symfony\Component\Routing\Attribute\Route('/admin/qr', name: 'qr_index')] public function __construct( private readonly DownloadHelper $downloadHelper, private readonly QrHitTrackerRepository $hitTrackerRepository, diff --git a/src/Controller/Admin/QrVisualConfigCrudController.php b/src/Controller/Admin/QrVisualConfigCrudController.php index 9d59db2..1b048a3 100644 --- a/src/Controller/Admin/QrVisualConfigCrudController.php +++ b/src/Controller/Admin/QrVisualConfigCrudController.php @@ -68,7 +68,7 @@ public function configureFields(string $pageName): iterable ->setFormTypeOption('data', $this->getContext()->getEntity()->getInstance()->getId()), TextField::new('name') ->setLabel(new TranslatableMessage('qr.title')) - ->setHelp(new TranslatableMessage('Name of the theme.')), + ->setHelp(new TranslatableMessage('Name of the design.')), IntegerField::new('size') ->setLabel(new TranslatableMessage('qr.size.label')) ->setHelp(new TranslatableMessage('qr.size.help')), From f0ad1ef062c999f2d168df64043d32f134a0d008 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:23:54 +0200 Subject: [PATCH 03/82] Updated changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9c00e2..35fb025 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ See [keep a changelog] for information about writing changes to this log. ## [Unreleased] +[PR-37](https://github.com/itk-dev/itqr/pull/37) + - Rename "theme" to "design" in general + - Rename "delete" to "archive" in general [PR-36](https://github.com/itk-dev/itqr/pull/36) - Fixed issue with set url - Batch set url only for admins From 1b1da0e208be38a70c3784f10479db18d7cb31a0 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:28:29 +0200 Subject: [PATCH 04/82] Transforming url string from length 255 to TEXT --- src/Entity/Tenant/Url.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/Tenant/Url.php b/src/Entity/Tenant/Url.php index 3f3bb85..c841d18 100644 --- a/src/Entity/Tenant/Url.php +++ b/src/Entity/Tenant/Url.php @@ -13,7 +13,7 @@ class Url extends AbstractTenantScopedEntity { #[Assert\NotBlank(message: new TranslatableMessage('The URL field cannot be empty.'))] #[Assert\Url(message: new TranslatableMessage('The value "{{ value }}" is not a valid URL.'))] - #[ORM\Column(length: 255)] + #[ORM\Column(type: "text")] private string $url = ''; #[ORM\ManyToOne(targetEntity: Qr::class, inversedBy: 'urls')] From 9a2e5a37d1c0ec6f5a2573ddd2ca592063608a53 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:31:02 +0200 Subject: [PATCH 05/82] Explicitly defined length of text, to use text instead of longtext --- src/Entity/Tenant/Url.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/Tenant/Url.php b/src/Entity/Tenant/Url.php index c841d18..6bddd0f 100644 --- a/src/Entity/Tenant/Url.php +++ b/src/Entity/Tenant/Url.php @@ -13,7 +13,7 @@ class Url extends AbstractTenantScopedEntity { #[Assert\NotBlank(message: new TranslatableMessage('The URL field cannot be empty.'))] #[Assert\Url(message: new TranslatableMessage('The value "{{ value }}" is not a valid URL.'))] - #[ORM\Column(type: "text")] + #[ORM\Column(type: "text", length: 65535)] private string $url = ''; #[ORM\ManyToOne(targetEntity: Qr::class, inversedBy: 'urls')] From 8ca25bd7f622b33e2a0202a8fcddf79401102bba Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:31:16 +0200 Subject: [PATCH 06/82] Created migration --- migrations/Version20250826113021.php | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 migrations/Version20250826113021.php diff --git a/migrations/Version20250826113021.php b/migrations/Version20250826113021.php new file mode 100644 index 0000000..50dcffc --- /dev/null +++ b/migrations/Version20250826113021.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE url CHANGE url url TEXT NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE url CHANGE url url VARCHAR(255) NOT NULL'); + } +} From e1ed6d4e17f2a95760b6a31306294a56c1382fde Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Tue, 26 Aug 2025 13:35:09 +0200 Subject: [PATCH 07/82] Configured url field to only contain a single URL --- src/Controller/Admin/QrCrudController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index 7c444c6..6b2b690 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -96,9 +96,9 @@ public function configureFields(string $pageName): iterable ->renderAsNativeWidget(), TextEditorField::new('description', new TranslatableMessage('qr.description')), CollectionField::new('urls', new TranslatableMessage('qr.urls')) - ->allowAdd() - ->allowDelete() - ->renderExpanded() + ->allowAdd(false) + ->allowDelete(false) + ->renderExpanded(false) ->useEntryCrudForm(UrlCrudController::class), ]; } From 895111466fba276f13dbe1b1d36d8d8315b90142 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Thu, 28 Aug 2025 12:49:20 +0200 Subject: [PATCH 08/82] Adjusted allowance of add and delete, and added custom css class for targeting via js --- src/Controller/Admin/QrCrudController.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index 6b2b690..b9ce394 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -4,6 +4,7 @@ use App\Controller\Admin\Embed\UrlCrudController; use App\Entity\Tenant\Qr; +use App\Entity\Tenant\Url; use App\Helper\DownloadHelper; use App\Repository\QrHitTrackerRepository; use EasyCorp\Bundle\EasyAdminBundle\Config\Action; @@ -96,10 +97,11 @@ public function configureFields(string $pageName): iterable ->renderAsNativeWidget(), TextEditorField::new('description', new TranslatableMessage('qr.description')), CollectionField::new('urls', new TranslatableMessage('qr.urls')) - ->allowAdd(false) + ->allowAdd() ->allowDelete(false) ->renderExpanded(false) - ->useEntryCrudForm(UrlCrudController::class), + ->useEntryCrudForm(UrlCrudController::class) + ->addCssClass('qr-urls-collection'), ]; } @@ -115,9 +117,11 @@ public function configureFields(string $pageName): iterable TextEditorField::new('description', new TranslatableMessage('qr.description')), CollectionField::new('urls', new TranslatableMessage('qr.urls')) ->allowAdd() - ->allowDelete() + ->allowDelete(false) + ->useEntryCrudForm(UrlCrudController::class) ->renderExpanded() - ->useEntryCrudForm(UrlCrudController::class), + ->addCssClass('qr-urls-collection'), + ]; } From 42ed2b00fdccaa96d404c3ada261a81d1dd370c1 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Thu, 28 Aug 2025 12:49:35 +0200 Subject: [PATCH 09/82] ADded javascript to handle only setting a single URL --- assets/app.js | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/assets/app.js b/assets/app.js index 1515ee5..5397409 100644 --- a/assets/app.js +++ b/assets/app.js @@ -1,17 +1,22 @@ import './styles/app.css'; const uploadBasePath = 'uploads/qr_codes/'; + document.addEventListener('DOMContentLoaded', () => { + + + handleQrUrlCollection(); + const qrCodeContainer = document.getElementById('qrCodeContainer'); const tabsContainer = document.getElementById('qrCodeTabs'); // Navigation tabs const tabContentContainer = document.getElementById('qrCodeTabContent'); // Tab content const form = document.querySelector('.form-wrapper form'); - const formName = form.getAttribute('name'); + const formName = form ? form.getAttribute('name') : ''; const selectedQrCodes = document.getElementById('selectedQrCodes'); // Ensure all containers and elements exist if (!qrCodeContainer || !tabsContainer || !tabContentContainer || !form) { - console.error('Required elements not found!'); + console.log('Required elements not found'); return; } @@ -200,6 +205,32 @@ function handleBatchDisableConfirm() { }); } +function handleQrUrlCollection() { + const qrUrlCollectionParent = document.querySelector('.qr-urls-collection'); + const qrUrlCollectionAddButton = document.querySelector('.qr-urls-collection .field-collection-add-button'); + const urlCollectionCount = qrUrlCollectionParent ? qrUrlCollectionParent.getAttribute('data-num-items') : null; + + if (qrUrlCollectionAddButton) { + setTimeout(() => { + qrUrlCollectionAddButton.click(); + }, 1) + + if (parseInt(urlCollectionCount) === 1) { + qrUrlCollectionAddButton.classList.add('d-none'); + } + + qrUrlCollectionAddButton.addEventListener('click', () => { + setTimeout(() => { + const urlCollectionCount = qrUrlCollectionParent.getAttribute('data-num-items'); + + if (parseInt(urlCollectionCount) === 1) { + qrUrlCollectionAddButton.classList.add('d-none'); + } + }, 1) + }); + } +} + document.addEventListener('readystatechange', function(event) { if ('complete' === document.readyState) { handleBatchDisableConfirm(); From b8497f301e5b14756a1d7ecd8c6e21a582dc7c02 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Thu, 28 Aug 2025 12:50:08 +0200 Subject: [PATCH 10/82] Coding standards --- src/Controller/Admin/QrCrudController.php | 1 - src/Entity/Tenant/Url.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index b9ce394..31182e0 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -121,7 +121,6 @@ public function configureFields(string $pageName): iterable ->useEntryCrudForm(UrlCrudController::class) ->renderExpanded() ->addCssClass('qr-urls-collection'), - ]; } diff --git a/src/Entity/Tenant/Url.php b/src/Entity/Tenant/Url.php index 6bddd0f..714ea2e 100644 --- a/src/Entity/Tenant/Url.php +++ b/src/Entity/Tenant/Url.php @@ -13,7 +13,7 @@ class Url extends AbstractTenantScopedEntity { #[Assert\NotBlank(message: new TranslatableMessage('The URL field cannot be empty.'))] #[Assert\Url(message: new TranslatableMessage('The value "{{ value }}" is not a valid URL.'))] - #[ORM\Column(type: "text", length: 65535)] + #[ORM\Column(type: 'text', length: 65535)] private string $url = ''; #[ORM\ManyToOne(targetEntity: Qr::class, inversedBy: 'urls')] From e7709b29b87ea5c468987510a7f34f62fc300304 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Thu, 28 Aug 2025 12:54:34 +0200 Subject: [PATCH 11/82] ADded describing comment in js --- assets/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/app.js b/assets/app.js index 5397409..583e860 100644 --- a/assets/app.js +++ b/assets/app.js @@ -3,8 +3,7 @@ import './styles/app.css'; const uploadBasePath = 'uploads/qr_codes/'; document.addEventListener('DOMContentLoaded', () => { - - + // Enforce only one URL per QR code. handleQrUrlCollection(); const qrCodeContainer = document.getElementById('qrCodeContainer'); From 48b9407a26c9db3cd033d17122eaefddb7e453b8 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Thu, 28 Aug 2025 12:58:02 +0200 Subject: [PATCH 12/82] Updated changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35fb025..7c6e471 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ See [keep a changelog] for information about writing changes to this log. ## [Unreleased] +[PR-38](https://github.com/itk-dev/itqr/pull/38) + - Limit number of URLs to 1 + - Increase URL data type from varchar to text [PR-37](https://github.com/itk-dev/itqr/pull/37) - Rename "theme" to "design" in general - Rename "delete" to "archive" in general From f0079661c202ae5595d3a113ef2a3766c69bb3be Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 10:54:07 +0200 Subject: [PATCH 13/82] Refined check, and removed unneccessary accordian button, as field is always rendered expanded --- assets/app.js | 9 +++++++-- assets/styles/app.css | 5 +++++ src/Controller/Admin/QrCrudController.php | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/assets/app.js b/assets/app.js index 583e860..4e8f699 100644 --- a/assets/app.js +++ b/assets/app.js @@ -207,17 +207,22 @@ function handleBatchDisableConfirm() { function handleQrUrlCollection() { const qrUrlCollectionParent = document.querySelector('.qr-urls-collection'); const qrUrlCollectionAddButton = document.querySelector('.qr-urls-collection .field-collection-add-button'); - const urlCollectionCount = qrUrlCollectionParent ? qrUrlCollectionParent.getAttribute('data-num-items') : null; + const urlCollectionCount = qrUrlCollectionParent ? parseInt(qrUrlCollectionParent.getAttribute('data-num-items')) : null; + // If the button exists, and no URL is added - add it! if (qrUrlCollectionAddButton) { setTimeout(() => { - qrUrlCollectionAddButton.click(); + if (urlCollectionCount !== null && urlCollectionCount === 0) { + qrUrlCollectionAddButton.click(); + } }, 1) + // Hide the add-button if there is already an URL added. if (parseInt(urlCollectionCount) === 1) { qrUrlCollectionAddButton.classList.add('d-none'); } + // Handle the click event and hide add-button if an URL was added and the number of URLs is 1. qrUrlCollectionAddButton.addEventListener('click', () => { setTimeout(() => { const urlCollectionCount = qrUrlCollectionParent.getAttribute('data-num-items'); diff --git a/assets/styles/app.css b/assets/styles/app.css index 63dd16f..49a2efe 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -101,3 +101,8 @@ form[name="batch_download"] .accordion-button { background-color: #fff; border-bottom: 1px solid #e9e9e9; } + + +.qr-urls-collection .accordion-button { + display: none; +} diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index 31182e0..160c933 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -99,7 +99,7 @@ public function configureFields(string $pageName): iterable CollectionField::new('urls', new TranslatableMessage('qr.urls')) ->allowAdd() ->allowDelete(false) - ->renderExpanded(false) + ->renderExpanded(true) ->useEntryCrudForm(UrlCrudController::class) ->addCssClass('qr-urls-collection'), ]; From 615a6809ddaeb3568e6e7b133cd74ae4ed3df7c2 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 10:00:44 +0200 Subject: [PATCH 14/82] Changed dashboardController to redirect to qrCrudController until dashboard functionality is implemented --- src/Controller/Admin/DashboardController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index edda0c9..d5bbca7 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -16,7 +16,8 @@ class DashboardController extends AbstractDashboardController #[Route('/admin', name: 'admin')] public function index(): Response { - return $this->render('@EasyAdmin/page/content.html.twig'); + // Redirect to the qr crud page until dashboad functionality is implemented + return $this->redirectToRoute('qr_index'); } public function configureDashboard(): Dashboard From ab186ad3b5d46bc53b2027a8c9989578f938610d Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 10:38:00 +0200 Subject: [PATCH 15/82] Fixed display of description in modal --- src/Controller/Admin/QrCrudController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index 160c933..bae3a25 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -63,7 +63,8 @@ public function configureFields(string $pageName): iterable return [ TextField::new('title', new TranslatableMessage('qr.title')) ->setTemplatePath('fields/link/link_to_edit.html.twig'), - TextEditorField::new('description', new TranslatableMessage('qr.description')), + TextEditorField::new('description', new TranslatableMessage('qr.description')) + ->formatValue(fn ($value) => nl2br($value)), CollectionField::new('urls', new TranslatableMessage('qr.urls')) ->allowAdd() ->allowDelete() From 9d977adbe5992f6e5d3bd17395f5b501f7063ddc Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 10:57:11 +0200 Subject: [PATCH 16/82] Updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c6e471..aff0897 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ See [keep a changelog] for information about writing changes to this log. ## [Unreleased] +[PR-39](https://github.com/itk-dev/itqr/pull/39) + - Added various help texts and in-platform-documentation. [PR-38](https://github.com/itk-dev/itqr/pull/38) - Limit number of URLs to 1 - Increase URL data type from varchar to text From bd6c6371a188d02af5e3dd244b265f16f208e6ea Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 10:01:24 +0200 Subject: [PATCH 17/82] Added styling to static page --- templates/static.html.twig | 104 +++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 3 deletions(-) diff --git a/templates/static.html.twig b/templates/static.html.twig index ac98d07..6c09934 100644 --- a/templates/static.html.twig +++ b/templates/static.html.twig @@ -1,4 +1,102 @@ -
-

{{ title }}

-

{{ description|raw }}

+
+

{{ title }}

+

{{ description|raw }}

+ + From e4cb3404ca56ce7c77e1d8d1e3ccfe42065dbd0c Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 10:59:46 +0200 Subject: [PATCH 18/82] Updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aff0897..ac1af58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ See [keep a changelog] for information about writing changes to this log. ## [Unreleased] +[PR-40](https://github.com/itk-dev/itqr/pull/40) + - Added styling to static page. [PR-39](https://github.com/itk-dev/itqr/pull/39) - Added various help texts and in-platform-documentation. [PR-38](https://github.com/itk-dev/itqr/pull/38) From 9ee57b8e2e5207c651b45266cb6ab1c96ce279ec Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 11:41:23 +0200 Subject: [PATCH 19/82] Added help texts to qr create and edit --- src/Controller/Admin/QrCrudController.php | 26 ++++++++++++++--------- translations/messages.da.yaml | 16 +++++++++----- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index bae3a25..c6ef603 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -92,17 +92,20 @@ public function configureFields(string $pageName): iterable IdField::new('id', 'ID') ->setDisabled() ->hideOnForm(), - TextField::new('title', new TranslatableMessage('qr.title')), - ChoiceField::new('mode', new TranslatableMessage('qr.mode.title')) + TextField::new('title', new TranslatableMessage('qr.title.label')) + ->setHelp(new TranslatableMessage('qr.title.help')), + ChoiceField::new('mode', new TranslatableMessage('qr.mode.label')) ->setHelp(new TranslatableMessage('qr.mode.help')) ->renderAsNativeWidget(), - TextEditorField::new('description', new TranslatableMessage('qr.description')), - CollectionField::new('urls', new TranslatableMessage('qr.urls')) + TextEditorField::new('description', new TranslatableMessage('qr.description.label')) + ->setHelp(new TranslatableMessage('qr.description.help')), + CollectionField::new('urls', new TranslatableMessage('qr.url.label')) ->allowAdd() ->allowDelete(false) ->renderExpanded(true) ->useEntryCrudForm(UrlCrudController::class) - ->addCssClass('qr-urls-collection'), + ->addCssClass('qr-urls-collection') + ->setHelp(new TranslatableMessage('qr.url.help')), ]; } @@ -111,17 +114,20 @@ public function configureFields(string $pageName): iterable IdField::new('id', 'ID') ->setDisabled() ->hideOnForm(), - TextField::new('title', new TranslatableMessage('qr.title')), - ChoiceField::new('mode', new TranslatableMessage('qr.mode.title')) + TextField::new('title', new TranslatableMessage('qr.title.label')) + ->setHelp(new TranslatableMessage('qr.title.help')), + ChoiceField::new('mode', new TranslatableMessage('qr.mode.label')) ->setHelp(new TranslatableMessage('qr.mode.help')) ->renderAsNativeWidget(), - TextEditorField::new('description', new TranslatableMessage('qr.description')), - CollectionField::new('urls', new TranslatableMessage('qr.urls')) + TextEditorField::new('description', new TranslatableMessage('qr.description.label')) + ->setHelp(new TranslatableMessage('qr.description.help')), + CollectionField::new('urls', new TranslatableMessage('qr.url.label')) ->allowAdd() ->allowDelete(false) ->useEntryCrudForm(UrlCrudController::class) ->renderExpanded() - ->addCssClass('qr-urls-collection'), + ->addCssClass('qr-urls-collection') + ->setHelp(new TranslatableMessage('qr.url.help')), ]; } diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index 357b3b3..5c837d1 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -2,12 +2,18 @@ frontpage: hello_world: 'Hej Verden!' qr: - title: 'Titel' - description: 'Beskrivelse' + title: + label: 'Titel' + help: 'Giv QR-koden en beskrivende titel, så andre brugere nemt kan forstå formålet med den.
Hvis QR-koden har typen "Statisk sidevisning", er dette felt overskriften.' + description: + label: 'Beskrivelse' + help: 'Beskrivelsen kan hjælpe med yderligere at beskrive QR-kodens formål.
Hvis QR-koden har typen "Statisk sidevisning", er dette felt brødteksten.' mode: - title: 'Type' - help: 'Standard: Qr-koden leder videre til destinationen.
Statisk sidevisning: En dedikeret side vises med titlen og beskrivelsen.' # @TODO Find a way to exclude html from translation. - urls: 'Destination' + label: 'Type' + help: 'Standard: Qr-koden leder videre til destinationen.
Statisk sidevisning: En dedikeret statisk side vises med titlen og beskrivelsen.' # @TODO Find a way to exclude html from translation. + url: + label: 'Destination' + help: 'Dette felt definerer hvilken URL QR-koden skal lede videre til (f.eks. https://aarhus.dk).
Hvis QR-koden har typen "Statisk sidevisning", ignoreres dette felt.' preview: 'Forhåndsvisning' view: 'Vis' size: From 0899db5fa48c0448c44e0c71c208b8a135d87a63 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 13:07:48 +0200 Subject: [PATCH 20/82] Redirecting to qr crud from dashboard controller until dashboard functionality is implemented --- src/Controller/Admin/DashboardController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index d5bbca7..4dc1666 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -37,6 +37,6 @@ public function configureDashboard(): Dashboard public function configureMenuItems(): iterable { yield MenuItem::linkToCrud(new TranslatableMessage('QR Codes'), 'fa fa-qrcode', Qr::class); - yield MenuItem::linkToCrud(new TranslatableMessage('QR Designs'), 'fa fa-palette', QrVisualConfig::class); + yield MenuItem::linkToCrud(new TranslatableMessage('Designs'), 'fa fa-palette', QrVisualConfig::class); } } From 2d68db9165da2cf73ba1b4e7c6de10cd02d81c64 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 13:08:01 +0200 Subject: [PATCH 21/82] Added help texts and translations to design --- .../Admin/QrVisualConfigCrudController.php | 45 +++++++++-------- translations/messages.da.yaml | 48 +++++++++++++++++-- 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/src/Controller/Admin/QrVisualConfigCrudController.php b/src/Controller/Admin/QrVisualConfigCrudController.php index 1b048a3..6a23547 100644 --- a/src/Controller/Admin/QrVisualConfigCrudController.php +++ b/src/Controller/Admin/QrVisualConfigCrudController.php @@ -53,7 +53,7 @@ public function configureFields(string $pageName): iterable { if (Crud::PAGE_INDEX === $pageName) { return [ - TextField::new('name')->setLabel(new TranslatableMessage('qr.title')), + TextField::new('name')->setLabel(new TranslatableMessage('qr.title.label')), IntegerField::new('size')->setLabel(new TranslatableMessage('qr.size.label')), Field::new('customUrlButton', new TranslatableMessage('qr.preview')) ->setTemplatePath('fields/link/linkExample.html.twig') @@ -67,37 +67,42 @@ public function configureFields(string $pageName): iterable ->setFormTypeOption('mapped', false) ->setFormTypeOption('data', $this->getContext()->getEntity()->getInstance()->getId()), TextField::new('name') - ->setLabel(new TranslatableMessage('qr.title')) - ->setHelp(new TranslatableMessage('Name of the design.')), + ->setLabel(new TranslatableMessage('qr.design.name.label')) + ->setHelp(new TranslatableMessage('qr.design.name.help')), IntegerField::new('size') - ->setLabel(new TranslatableMessage('qr.size.label')) - ->setHelp(new TranslatableMessage('qr.size.help')), + ->setLabel(new TranslatableMessage('qr.design.size.label')) + ->setHelp(new TranslatableMessage('qr.design.size.help')), IntegerField::new('margin') - ->setLabel(new TranslatableMessage('qr.margin.label')) - ->setHelp(new TranslatableMessage('qr.margin.help')), + ->setLabel(new TranslatableMessage('qr.design.margin.label')) + ->setHelp(new TranslatableMessage('qr.design.margin.help')), Field::new('backgroundColor') ->setFormType(ColorType::class) - ->setLabel(new TranslatableMessage('qr.code_background')), + ->setLabel(new TranslatableMessage('qr.design.background_color.label')) + ->setHelp(new TranslatableMessage('qr.design.background_color.help')), Field::new('foregroundColor') ->setFormType(ColorType::class) - ->setLabel(new TranslatableMessage('qr.code_color')), + ->setLabel(new TranslatableMessage('qr.design.foreground_color.label')) + ->setHelp(new TranslatableMessage('qr.design.foreground_color.help')), TextField::new('labelText') - ->setLabel(new TranslatableMessage('qr.text.label')) - ->setHelp(new TranslatableMessage('Label is a text that is displayed below the QR code.')) + ->setLabel(new TranslatableMessage('qr.design.label_text.label')) + ->setHelp(new TranslatableMessage('qr.design.label_text.help')) ->setRequired(false), Field::new('labelSize') - ->setLabel(new TranslatableMessage('qr.text.size')) - ->setHelp(new TranslatableMessage('Text size is the size of the label in pixels.')), + ->setLabel(new TranslatableMessage('qr.design.label_size.label')) + ->setHelp(new TranslatableMessage('qr.design.label_size.help')), Field::new('labelTextColor') ->setFormType(ColorType::class) - ->setLabel(new TranslatableMessage('qr.text.color')), + ->setLabel(new TranslatableMessage('qr.design.label_text_color.label')) + ->setHelp(new TranslatableMessage('qr.design.label_text_color.help')), Field::new('labelMarginTop') - ->setLabel(new TranslatableMessage('qr.text.margin.top.label')) - ->setHelp(new TranslatableMessage('qr.text.margin.top.help')), + ->setLabel(new TranslatableMessage('qr.design.label_margin_top.label')) + ->setHelp(new TranslatableMessage('qr.design.label_margin_top.help')), Field::new('labelMarginBottom') - ->setLabel(new TranslatableMessage('qr.text.margin.bottom.label')) - ->setHelp(new TranslatableMessage('qr.text.margin.bottom.help')), + ->setLabel(new TranslatableMessage('qr.design.label_margin_bottom.label')) + ->setHelp(new TranslatableMessage('qr.design.label_margin_bottom.help')), ImageField::new('logo') + ->setLabel(new TranslatableMessage('qr.design.logo.label')) + ->setHelp(new TranslatableMessage('qr.design.logo.help')) ->setBasePath('uploads/qr-logos') ->setUploadedFileNamePattern('[ulid]-[slug].[extension]') ->setUploadDir('public/uploads/qr-logos') @@ -105,8 +110,8 @@ public function configureFields(string $pageName): iterable 'required' => false, ]), ChoiceField::new('errorCorrectionLevel') - ->setLabel(new TranslatableMessage('error_correction.label')) - ->setHelp(new TranslatableMessage('error_correction.help')) + ->setLabel(new TranslatableMessage('qr.design.error_correction_level.label')) + ->setHelp(new TranslatableMessage('qr.design.error_correction_level.help')) ->setFormType(ChoiceType::class) ->setFormTypeOptions([ 'class' => ErrorCorrectionLevel::class, diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index 5c837d1..2116391 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -43,13 +43,51 @@ qr: bottom: label: 'Nedre tekstmargin' help: 'Margin under tekst defineret i pixels' + design: + name: + label: 'Navn' + help: 'Giv designet et beskrivende navn, så andre brugere nemt kan forstå formålet med det.' + size: + label: 'Størrelse' + help: 'QR-kodens størrelse defineret i pixels.' + margin: + label: 'Margin' + help: 'QR-kodens margin defineret i pixels.' + background_color: + label: 'Baggrundsfarve' + help: 'Farven på baggrunden omkring QR-koden.' + foreground_color: + label: 'QR-kode farve' + help: 'Farven på selve QR-koden.' + label_text: + label: 'Tekst' + help: 'Tekst der vises under QR-koden.' + label_size: + label: 'Tekststørrelse' + help: 'Størrelsen på teksten i pixels.' + label_text_color: + label: 'Tekstfarve' + help: 'Farven på teksten under QR-koden.' + label_margin_top: + label: 'Øvre tekstmargin' + help: 'Margin over teksten defineret i pixels.' + label_margin_bottom: + label: 'Nedre tekstmargin' + help: 'Margin under teksten defineret i pixels.' + logo: + label: 'Logo' + help: 'Upload et logo der skal vises på QR-koden.' + error_correction_level: + label: 'Fejlkorrektionsniveau' + help: 'Højere niveau giver bedre fejlkorrektion men større QR-kode.' + visual: - index: 'QR designs' - new: 'Opret QR design' - delete: 'Slet QR design' - edit: 'Rediger QR design' - label_singular: 'QR design' + index: 'Designs' + new: 'Opret design' + delete: 'Slet design' + edit: 'Rediger design' + label_singular: 'design' logo: label: 'Logo' From 4944d5c621205e06c99f19474e5cd0cbd3f88aa4 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 13:20:29 +0200 Subject: [PATCH 22/82] aligned some qr translations --- src/Controller/Admin/QrCrudController.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index c6ef603..b0501f3 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -61,16 +61,16 @@ public function configureFields(string $pageName): iterable { if (Crud::PAGE_INDEX === $pageName) { return [ - TextField::new('title', new TranslatableMessage('qr.title')) + TextField::new('title', new TranslatableMessage('qr.title.label')) ->setTemplatePath('fields/link/link_to_edit.html.twig'), - TextEditorField::new('description', new TranslatableMessage('qr.description')) + TextEditorField::new('description', new TranslatableMessage('qr.description.label')) ->formatValue(fn ($value) => nl2br($value)), - CollectionField::new('urls', new TranslatableMessage('qr.urls')) + CollectionField::new('urls', new TranslatableMessage('qr.url.label')) ->allowAdd() ->allowDelete() ->renderExpanded() ->useEntryCrudForm(UrlCrudController::class), - ChoiceField::new('mode', new TranslatableMessage('qr.mode.title')) + ChoiceField::new('mode', new TranslatableMessage('qr.mode.label')) ->renderAsNativeWidget(), Field::new('customUrlButton', new TranslatableMessage('qr.preview')) ->setTemplatePath('fields/link/link.html.twig') From 861b1c06510e57ac11942c14a18f2b24f78f9a62 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 29 Aug 2025 14:27:00 +0200 Subject: [PATCH 23/82] Added description to qr index page --- src/Controller/Admin/QrCrudController.php | 5 ++++- templates/admin/qr/index.html.twig | 9 +++++++++ translations/messages.da.yaml | 5 +++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 templates/admin/qr/index.html.twig diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index b0501f3..1ee559a 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -49,7 +49,10 @@ public static function getEntityFqcn(): string public function configureCrud(Crud $crud): Crud { return $crud - ->setDefaultSort(['modifiedAt' => 'DESC']); + ->setDefaultSort(['modifiedAt' => 'DESC']) + ->setPageTitle('index', new TranslatableMessage('qr.index.label')) + ->setEntityLabelInSingular(new TranslatableMessage('qr.label_singular')) + ->overrideTemplate('crud/index', 'admin/qr/index.html.twig'); } public function new(AdminContext $context) diff --git a/templates/admin/qr/index.html.twig b/templates/admin/qr/index.html.twig new file mode 100644 index 0000000..a1a9ce1 --- /dev/null +++ b/templates/admin/qr/index.html.twig @@ -0,0 +1,9 @@ +{% extends '@EasyAdmin/crud/index.html.twig' %} + +{% block content_header_wrapper %} + {{ parent() }} +
+ {{ 'qr.index.description'|trans|raw }} +
+
+{% endblock %} diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index 2116391..3fb46a1 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -2,6 +2,11 @@ frontpage: hello_world: 'Hej Verden!' qr: + index: + label: 'QR koder' + description: 'Her kan du se en oversigt over alle QR-koder i dit magistrat.
Du kan tilføje en ny, redigere eller arkivere eksisterende samt downloade en eller flere QR koder, både med og uden design.' + new: 'Opret QR kode' + label_singular: 'QR kode' title: label: 'Titel' help: 'Giv QR-koden en beskrivende titel, så andre brugere nemt kan forstå formålet med den.
Hvis QR-koden har typen "Statisk sidevisning", er dette felt overskriften.' From b9305c5d07727666ed0f486f475f849e12d3850e Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 1 Sep 2025 08:45:46 +0200 Subject: [PATCH 24/82] Added some api config --- config/packages/security.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/packages/security.yaml b/config/packages/security.yaml index ec28fb1..95ccf17 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -13,6 +13,9 @@ security: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false + api: + pattern: ^/api + stateless: true main: custom_authenticators: - App\Security\AzureOIDCAuthenticator From 9c2b7df972c448013020cd543ba2adf3f32f6bc9 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 1 Sep 2025 11:07:13 +0200 Subject: [PATCH 25/82] Added title and description to design-crud and batch download page --- .../Admin/BatchDownloadController.php | 14 ++-- .../Admin/QrVisualConfigCrudController.php | 54 ++++++------ src/Form/Type/BatchDownloadType.php | 38 +++++---- templates/admin/design/index.html.twig | 9 ++ templates/form/batchDownload.html.twig | 13 ++- translations/messages.da.yaml | 83 ++++++++++--------- 6 files changed, 126 insertions(+), 85 deletions(-) create mode 100644 templates/admin/design/index.html.twig diff --git a/src/Controller/Admin/BatchDownloadController.php b/src/Controller/Admin/BatchDownloadController.php index 405d9aa..d7f34f7 100644 --- a/src/Controller/Admin/BatchDownloadController.php +++ b/src/Controller/Admin/BatchDownloadController.php @@ -5,17 +5,22 @@ use App\Form\Type\BatchDownloadType; use App\Helper\DownloadHelper; use App\Repository\QrRepository; +use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; +use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Translation\TranslatableMessage; +use function GuzzleHttp\json_encode; final class BatchDownloadController extends DashboardController { public function __construct( - private readonly RequestStack $requestStack, - private readonly QrRepository $qrRepository, + private readonly RequestStack $requestStack, + private readonly QrRepository $qrRepository, private readonly DownloadHelper $downloadHelper, - ) { + ) + { } /** @@ -25,7 +30,6 @@ public function __construct( public function index(): Response { $form = $this->createForm(BatchDownloadType::class); - $request = $this->requestStack->getCurrentRequest(); $form->handleRequest($request); @@ -39,7 +43,7 @@ public function index(): Response throw $this->createNotFoundException('No QR codes found'); } - return $this->downloadHelper->generateQrCodes($qrEntities, (array) $data); + return $this->downloadHelper->generateQrCodes($qrEntities, (array)$data); } return $this->render('form/batchDownload.html.twig', [ diff --git a/src/Controller/Admin/QrVisualConfigCrudController.php b/src/Controller/Admin/QrVisualConfigCrudController.php index 6a23547..be8db48 100644 --- a/src/Controller/Admin/QrVisualConfigCrudController.php +++ b/src/Controller/Admin/QrVisualConfigCrudController.php @@ -34,7 +34,9 @@ public function configureCrud(Crud $crud): Crud ->setPageTitle('edit', new TranslatableMessage('visual.edit')) ->setEntityLabelInSingular(new TranslatableMessage('visual.label_singular')) ->overrideTemplate('crud/edit', 'admin/qr_visual_config/edit.html.twig') - ->overrideTemplate('crud/new', 'admin/qr_visual_config/new.html.twig'); + ->overrideTemplate('crud/new', 'admin/qr_visual_config/new.html.twig') + ->setPageTitle('index', new TranslatableMessage('design.index.label')) + ->overrideTemplate('crud/index', 'admin/design/index.html.twig'); } public function new(AdminContext $context) @@ -67,42 +69,42 @@ public function configureFields(string $pageName): iterable ->setFormTypeOption('mapped', false) ->setFormTypeOption('data', $this->getContext()->getEntity()->getInstance()->getId()), TextField::new('name') - ->setLabel(new TranslatableMessage('qr.design.name.label')) - ->setHelp(new TranslatableMessage('qr.design.name.help')), + ->setLabel(new TranslatableMessage('design.name.label')) + ->setHelp(new TranslatableMessage('design.name.help')), IntegerField::new('size') - ->setLabel(new TranslatableMessage('qr.design.size.label')) - ->setHelp(new TranslatableMessage('qr.design.size.help')), + ->setLabel(new TranslatableMessage('design.size.label')) + ->setHelp(new TranslatableMessage('design.size.help')), IntegerField::new('margin') - ->setLabel(new TranslatableMessage('qr.design.margin.label')) - ->setHelp(new TranslatableMessage('qr.design.margin.help')), + ->setLabel(new TranslatableMessage('design.margin.label')) + ->setHelp(new TranslatableMessage('design.margin.help')), Field::new('backgroundColor') ->setFormType(ColorType::class) - ->setLabel(new TranslatableMessage('qr.design.background_color.label')) - ->setHelp(new TranslatableMessage('qr.design.background_color.help')), + ->setLabel(new TranslatableMessage('design.background_color.label')) + ->setHelp(new TranslatableMessage('design.background_color.help')), Field::new('foregroundColor') ->setFormType(ColorType::class) - ->setLabel(new TranslatableMessage('qr.design.foreground_color.label')) - ->setHelp(new TranslatableMessage('qr.design.foreground_color.help')), + ->setLabel(new TranslatableMessage('design.foreground_color.label')) + ->setHelp(new TranslatableMessage('design.foreground_color.help')), TextField::new('labelText') - ->setLabel(new TranslatableMessage('qr.design.label_text.label')) - ->setHelp(new TranslatableMessage('qr.design.label_text.help')) + ->setLabel(new TranslatableMessage('design.label_text.label')) + ->setHelp(new TranslatableMessage('design.label_text.help')) ->setRequired(false), Field::new('labelSize') - ->setLabel(new TranslatableMessage('qr.design.label_size.label')) - ->setHelp(new TranslatableMessage('qr.design.label_size.help')), + ->setLabel(new TranslatableMessage('design.label_size.label')) + ->setHelp(new TranslatableMessage('design.label_size.help')), Field::new('labelTextColor') ->setFormType(ColorType::class) - ->setLabel(new TranslatableMessage('qr.design.label_text_color.label')) - ->setHelp(new TranslatableMessage('qr.design.label_text_color.help')), + ->setLabel(new TranslatableMessage('design.label_text_color.label')) + ->setHelp(new TranslatableMessage('design.label_text_color.help')), Field::new('labelMarginTop') - ->setLabel(new TranslatableMessage('qr.design.label_margin_top.label')) - ->setHelp(new TranslatableMessage('qr.design.label_margin_top.help')), + ->setLabel(new TranslatableMessage('design.label_margin_top.label')) + ->setHelp(new TranslatableMessage('design.label_margin_top.help')), Field::new('labelMarginBottom') - ->setLabel(new TranslatableMessage('qr.design.label_margin_bottom.label')) - ->setHelp(new TranslatableMessage('qr.design.label_margin_bottom.help')), + ->setLabel(new TranslatableMessage('design.label_margin_bottom.label')) + ->setHelp(new TranslatableMessage('design.label_margin_bottom.help')), ImageField::new('logo') - ->setLabel(new TranslatableMessage('qr.design.logo.label')) - ->setHelp(new TranslatableMessage('qr.design.logo.help')) + ->setLabel(new TranslatableMessage('design.logo.label')) + ->setHelp(new TranslatableMessage('design.logo.help')) ->setBasePath('uploads/qr-logos') ->setUploadedFileNamePattern('[ulid]-[slug].[extension]') ->setUploadDir('public/uploads/qr-logos') @@ -110,13 +112,13 @@ public function configureFields(string $pageName): iterable 'required' => false, ]), ChoiceField::new('errorCorrectionLevel') - ->setLabel(new TranslatableMessage('qr.design.error_correction_level.label')) - ->setHelp(new TranslatableMessage('qr.design.error_correction_level.help')) + ->setLabel(new TranslatableMessage('design.error_correction_level.label')) + ->setHelp(new TranslatableMessage('design.error_correction_level.help')) ->setFormType(ChoiceType::class) ->setFormTypeOptions([ 'class' => ErrorCorrectionLevel::class, 'choice_label' => function (ErrorCorrectionLevel $choice) { - return new TranslatableMessage('error_correction.'.$choice->name); + return new TranslatableMessage('error_correction.' . $choice->name); }, 'choices' => ErrorCorrectionLevel::cases(), ]), diff --git a/src/Form/Type/BatchDownloadType.php b/src/Form/Type/BatchDownloadType.php index 4548074..ce897cc 100644 --- a/src/Form/Type/BatchDownloadType.php +++ b/src/Form/Type/BatchDownloadType.php @@ -29,57 +29,63 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'required' => false, ]) ->add('size', IntegerType::class, [ - 'label' => new TranslatableMessage('qr.size.label'), + 'label' => new TranslatableMessage('design.size.label'), 'data' => 400, 'attr' => ['data-controller' => 'advanced-settings'], - 'help' => new TranslatableMessage('qr.size.help'), + 'help' => new TranslatableMessage('design.size.help'), ]) ->add('margin', IntegerType::class, [ - 'label' => new TranslatableMessage('qr.margin.label'), + 'label' => new TranslatableMessage('design.margin.label'), 'data' => '0', 'attr' => ['data-controller' => 'advanced-settings'], - 'help' => new TranslatableMessage('qr.margin.help'), + 'help' => new TranslatableMessage('design.margin.help'), ]) ->add('backgroundColor', ColorType::class, [ - 'label' => new TranslatableMessage('qr.code_background'), + 'label' => new TranslatableMessage('design.background_color.label'), 'data' => '#ffffff', 'attr' => ['data-controller' => 'advanced-settings'], + 'help' => new TranslatableMessage('design.background_color.help'), ]) ->add('foregroundColor', ColorType::class, [ - 'label' => new TranslatableMessage('qr.code_color'), + 'label' => new TranslatableMessage('design.foreground_color.label'), 'data' => '#000000', 'attr' => ['data-controller' => 'advanced-settings'], + 'help' => new TranslatableMessage('design.foreground_color.help'), ]) ->add('labelText', TextType::class, [ - 'label' => new TranslatableMessage('text.label'), + 'label' => new TranslatableMessage('design.label_text.label'), 'required' => false, 'attr' => ['data-controller' => 'advanced-settings'], + 'help' => new TranslatableMessage('design.label_text.help'), ]) ->add('labelSize', IntegerType::class, [ - 'label' => new TranslatableMessage('text.size'), + 'label' => new TranslatableMessage('design.label_size.label'), 'data' => 15, 'attr' => ['data-controller' => 'advanced-settings'], + 'help' => new TranslatableMessage('design.label_size.help'), ]) ->add('labelTextColor', ColorType::class, [ - 'label' => new TranslatableMessage('text.color'), + 'label' => new TranslatableMessage('design.label_text_color.label'), 'attr' => ['data-controller' => 'advanced-settings'], + 'help' => new TranslatableMessage('design.label_text_color.help'), ]) ->add('labelMarginTop', IntegerType::class, [ - 'label' => new TranslatableMessage('text.margin.top.label'), + 'label' => new TranslatableMessage('design.label_margin_top.label'), 'data' => 15, 'attr' => ['data-controller' => 'advanced-settings'], - 'help' => new TranslatableMessage('text.margin.top.help'), + 'help' => new TranslatableMessage('design.label_margin_top.help'), ]) ->add('labelMarginBottom', IntegerType::class, [ - 'label' => new TranslatableMessage('text.margin.bottom.label'), + 'label' => new TranslatableMessage('design.label_margin_bottom.label'), 'data' => 15, 'attr' => ['data-controller' => 'advanced-settings'], - 'help' => new TranslatableMessage('text.margin.bottom.help'), + 'help' => new TranslatableMessage('design.label_margin_bottom.help'), ]) ->add('logo', FileType::class, [ - 'label' => new TranslatableMessage('logo.label'), + 'label' => new TranslatableMessage('design.logo.label'), 'required' => false, 'attr' => ['data-controller' => 'advanced-settings'], + 'help' => new TranslatableMessage('design.logo.help'), ]) ->add('logoPath', HiddenType::class, [ 'label' => false, @@ -87,7 +93,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'attr' => ['data-controller' => 'advanced-settings'], ]) ->add('errorCorrectionLevel', ChoiceType::class, [ - 'label' => new TranslatableMessage('error_correction.label'), + 'label' => new TranslatableMessage('design.error_correction_level.label'), 'choices' => [ 'error_correction.Low' => ErrorCorrectionLevel::Low->value, 'error_correction.Medium' => ErrorCorrectionLevel::Medium->value, @@ -96,7 +102,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ], 'choice_translation_domain' => true, 'attr' => ['data-controller' => 'advanced-settings'], - 'help' => new TranslatableMessage('error_correction.help'), + 'help' => new TranslatableMessage('design.error_correction_level.help'), ]) ->add('download', SubmitType::class, [ 'label' => new TranslatableMessage('qr.download'), diff --git a/templates/admin/design/index.html.twig b/templates/admin/design/index.html.twig new file mode 100644 index 0000000..037781f --- /dev/null +++ b/templates/admin/design/index.html.twig @@ -0,0 +1,9 @@ +{% extends '@EasyAdmin/crud/index.html.twig' %} + +{% block content_header_wrapper %} +{{ parent() }} +
+ {{ 'design.index.description'|trans|raw }} +
+
+{% endblock %} diff --git a/templates/form/batchDownload.html.twig b/templates/form/batchDownload.html.twig index 3066d7e..3bba4d8 100644 --- a/templates/form/batchDownload.html.twig +++ b/templates/form/batchDownload.html.twig @@ -1,7 +1,18 @@ {% extends '@EasyAdmin/content.html.twig' %} {% form_theme form '@EasyAdmin/crud/form_theme.html.twig' %} +{% block content_header %} +
+

{{ 'download.batch.title.label'|trans }}

+ +
+ +{% endblock %} {% block main %} +
+ {{ 'download.batch.title.description'|trans|raw }} +
+
@@ -23,7 +34,7 @@
Du kan tilføje et nyt design, redigere eller slette eksisterende.' + name: + label: 'Navn' + help: 'Giv designet et beskrivende navn, så andre brugere nemt kan forstå formålet med det.' + size: + label: 'Størrelse' + help: 'QR-kodens størrelse defineret i pixels.' + margin: + label: 'Margin' + help: 'QR-kodens margin defineret i pixels.' + background_color: + label: 'Baggrundsfarve' + help: 'Farven på baggrunden omkring QR-koden.' + foreground_color: + label: 'QR-kode farve' + help: 'Farven på selve QR-koden.' + label_text: + label: 'Tekst' + help: 'Tekst der vises under QR-koden.' + label_size: + label: 'Tekststørrelse' + help: 'Størrelsen på teksten i pixels.' + label_text_color: + label: 'Tekstfarve' + help: 'Farven på teksten under QR-koden.' + label_margin_top: + label: 'Øvre tekstmargin' + help: 'Margin over teksten defineret i pixels.' + label_margin_bottom: + label: 'Nedre tekstmargin' + help: 'Margin under teksten defineret i pixels.' + logo: + label: 'Logo' + help: 'Upload et logo der skal vises på QR-koden.' + error_correction_level: + label: 'Fejlkorrektionsniveau' + help: 'Højere niveau giver bedre fejlkorrektion men større QR-kode.' visual: @@ -94,6 +97,12 @@ visual: edit: 'Rediger design' label_singular: 'design' +download: + batch: + advancedsettings: 'Avancerede indstillinger' + title: + label: 'Design og download' + description: 'Vælg et eksisterende design eller opret et nyt design til dine QR-koder.
Se en forhåndsvisning af hver QR-kode i fanerne til højre og download dine QR-koder med det valgte design.' logo: label: 'Logo' From fd1cad8fa595f7eef91c7154b01c9576f5abc886 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 1 Sep 2025 11:31:41 +0200 Subject: [PATCH 26/82] Added more translations, and modified setUrl page to not be contained in modal --- src/Controller/Admin/QrCrudController.php | 3 ++- .../Admin/QrVisualConfigCrudController.php | 3 ++- src/Controller/Admin/SetUrlController.php | 9 ++++--- src/Form/SetUrlType.php | 5 +++- templates/form/setUrl.html.twig | 27 +++++++++---------- translations/messages.da.yaml | 1 + 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/Controller/Admin/QrCrudController.php b/src/Controller/Admin/QrCrudController.php index 1ee559a..b17d0f8 100644 --- a/src/Controller/Admin/QrCrudController.php +++ b/src/Controller/Admin/QrCrudController.php @@ -52,7 +52,8 @@ public function configureCrud(Crud $crud): Crud ->setDefaultSort(['modifiedAt' => 'DESC']) ->setPageTitle('index', new TranslatableMessage('qr.index.label')) ->setEntityLabelInSingular(new TranslatableMessage('qr.label_singular')) - ->overrideTemplate('crud/index', 'admin/qr/index.html.twig'); + ->overrideTemplate('crud/index', 'admin/qr/index.html.twig') + ->setSearchFields(null); } public function new(AdminContext $context) diff --git a/src/Controller/Admin/QrVisualConfigCrudController.php b/src/Controller/Admin/QrVisualConfigCrudController.php index be8db48..f7c2812 100644 --- a/src/Controller/Admin/QrVisualConfigCrudController.php +++ b/src/Controller/Admin/QrVisualConfigCrudController.php @@ -36,7 +36,8 @@ public function configureCrud(Crud $crud): Crud ->overrideTemplate('crud/edit', 'admin/qr_visual_config/edit.html.twig') ->overrideTemplate('crud/new', 'admin/qr_visual_config/new.html.twig') ->setPageTitle('index', new TranslatableMessage('design.index.label')) - ->overrideTemplate('crud/index', 'admin/design/index.html.twig'); + ->overrideTemplate('crud/index', 'admin/design/index.html.twig') + ->setSearchFields(null); } public function new(AdminContext $context) diff --git a/src/Controller/Admin/SetUrlController.php b/src/Controller/Admin/SetUrlController.php index ff0a940..5dcf1aa 100644 --- a/src/Controller/Admin/SetUrlController.php +++ b/src/Controller/Admin/SetUrlController.php @@ -54,16 +54,17 @@ public function index(): Response // Create redirect url. $redirectUrl = $this->adminUrlGenerator - ->setRoute('admin') - ->setController(QrCrudController::class) - ->setAction('index') - ->generateUrl(); + ->setRoute('admin') + ->setController(QrCrudController::class) + ->setAction('index') + ->generateUrl(); return $this->redirect($redirectUrl); } return $this->render('form/setUrl.html.twig', [ 'form' => $form, + 'count' => count($request->query->all()) ]); } } diff --git a/src/Form/SetUrlType.php b/src/Form/SetUrlType.php index 78844f6..94418fe 100644 --- a/src/Form/SetUrlType.php +++ b/src/Form/SetUrlType.php @@ -7,6 +7,7 @@ use Symfony\Component\Form\Extension\Core\Type\UrlType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Translation\TranslatableMessage; /** * @extends AbstractType @@ -18,7 +19,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $builder->add('url', UrlType::class, [ 'default_protocol' => 'https', ]); - $builder->add('Continue', SubmitType::class); + $builder->add('Continue', SubmitType::class, [ + 'label' => new TranslatableMessage('batch.seturl.do'), + ]); } public function configureOptions(OptionsResolver $resolver): void diff --git a/templates/form/setUrl.html.twig b/templates/form/setUrl.html.twig index ce29c1d..65f8592 100644 --- a/templates/form/setUrl.html.twig +++ b/templates/form/setUrl.html.twig @@ -1,21 +1,20 @@ {% extends '@EasyAdmin/content.html.twig' %} {% form_theme form '@EasyAdmin/crud/form_theme.html.twig' %} +{% block content_header %} +
+

Batch change URL

+
+{% endblock %} + {% block main %} -