From 43a145d448d353f153fbf78cc85512fdbaa9c360 Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:15:56 +0100 Subject: [PATCH 1/9] JE-403: Added project lead to client when syncing projects --- migrations/Version20231219130737.php | 31 ++++++++++++++++++++++++++++ src/Entity/Client.php | 30 +++++++++++++++++++++++++++ src/Model/Invoices/ClientData.php | 2 ++ src/Service/BillingService.php | 2 ++ src/Service/JiraApiService.php | 2 ++ 5 files changed, 67 insertions(+) create mode 100644 migrations/Version20231219130737.php diff --git a/migrations/Version20231219130737.php b/migrations/Version20231219130737.php new file mode 100644 index 00000000..91ba64f1 --- /dev/null +++ b/migrations/Version20231219130737.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE client ADD project_lead_name VARCHAR(255) DEFAULT NULL, ADD project_lead_mail VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE client DROP project_lead_name, DROP project_lead_mail'); + } +} diff --git a/src/Entity/Client.php b/src/Entity/Client.php index d60ec7fe..cf27cbd8 100644 --- a/src/Entity/Client.php +++ b/src/Entity/Client.php @@ -57,6 +57,12 @@ class Client #[ORM\Column(length: 255, nullable: true)] private ?string $customerKey = null; + #[ORM\Column(length: 255, nullable: true)] + private ?string $projectLeadName = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $projectLeadMail = null; + public function __construct() { $this->invoices = new ArrayCollection(); @@ -243,4 +249,28 @@ public function setCustomerKey(?string $customerKey): self return $this; } + + public function getProjectLeadName(): ?string + { + return $this->projectLeadName; + } + + public function setProjectLeadName(?string $projectLeadName): static + { + $this->projectLeadName = $projectLeadName; + + return $this; + } + + public function getProjectLeadMail(): ?string + { + return $this->projectLeadMail; + } + + public function setProjectLeadMail(?string $projectLeadMail): static + { + $this->projectLeadMail = $projectLeadMail; + + return $this; + } } diff --git a/src/Model/Invoices/ClientData.php b/src/Model/Invoices/ClientData.php index 9b128a6a..60af6844 100644 --- a/src/Model/Invoices/ClientData.php +++ b/src/Model/Invoices/ClientData.php @@ -16,4 +16,6 @@ class ClientData public ?string $psp = null; public ?string $ean = null; public ?string $salesChannel = null; + public ?string $projectLeadName = null; + public ?string $projectLeadMail = null; } diff --git a/src/Service/BillingService.php b/src/Service/BillingService.php index d1bcab56..d81d87eb 100644 --- a/src/Service/BillingService.php +++ b/src/Service/BillingService.php @@ -348,6 +348,8 @@ public function syncProjects(callable $progressCallback): void $client->setStandardPrice($clientData->standardPrice); $client->setCustomerKey($clientData->customerKey); $client->setSalesChannel($clientData->salesChannel); + $client->setProjectLeadName($clientData->projectLeadName); + $client->setProjectLeadMail($clientData->projectLeadMail); if (!$client->getProjects()->contains($client)) { $client->addProject($project); diff --git a/src/Service/JiraApiService.php b/src/Service/JiraApiService.php index 9a491bcc..cc2424e3 100644 --- a/src/Service/JiraApiService.php +++ b/src/Service/JiraApiService.php @@ -1059,6 +1059,8 @@ public function getClientDataForProject(string $projectId): array $client->account = $account->key ?? null; $client->customerKey = $account->customer->key ?? null; $client->salesChannel = $account->category->key ?? null; + $client->projectLeadName = $account->lead->displayName ?? null; + $client->projectLeadMail = $account->lead->emailAddress ?? null; switch ($account->category->name ?? null) { case 'INTERN': From cc39d3f4259a3e7cd4981aa01eca2faaa3f86632 Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:17:49 +0100 Subject: [PATCH 2/9] JE-403: Updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29be8db0..64b2cc65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +* Added project lead to client when syncing projects. + ## [1.1.2] * Changed how project billing is put on record, to allow for finishing a partially From 1f2b288bb952ec5a92e498f57214083caaf5dc0a Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Wed, 20 Dec 2023 12:46:52 +0100 Subject: [PATCH 3/9] Remove description from create invoice page. Added generate description button to invoice when client is set --- .env | 2 +- CHANGELOG.md | 2 ++ .../generate-description_controller.js | 33 +++++++++++++++++++ config/packages/monolog.yaml | 2 +- config/services.yaml | 4 ++- src/Controller/InvoiceController.php | 23 +++++++++++++ src/Form/InvoiceNewType.php | 5 --- src/Form/InvoiceType.php | 4 +-- templates/invoices/edit.html.twig | 7 +++- templates/invoices/new.html.twig | 1 - translations/messages.da.yaml | 1 + 11 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 assets/controllers/generate-description_controller.js diff --git a/.env b/.env index ce952d41..8fb3b93d 100644 --- a/.env +++ b/.env @@ -34,7 +34,7 @@ API_SERVICE_SPRINT_NAME_REGEX="/(?(?:-?\d+-?)*)\.(?\d+)$/" APP_WEEK_GOAL_LOW=25.0 APP_WEEK_GOAL_HIGH=34.5 APP_INVOICE_RECEIVER_ACCOUNT=APP_INVOICE_RECEIVER_ACCOUNT -APP_INVOICE_DEFAULT_DESCRIPTION=APP_INVOICE_DEFAULT_DESCRIPTION +APP_INVOICE_DEFAULT_DESCRIPTION="Spørgsmål vedrørende fakturaen rettes til %name%, %email%." ###< Planning ### ###> itk-dev/openid-connect-bundle ### diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b2cc65..c6c75a10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] * Added project lead to client when syncing projects. +* Remove description from create invoice page. +* Added generate description button to invoice when client is set. ## [1.1.2] diff --git a/assets/controllers/generate-description_controller.js b/assets/controllers/generate-description_controller.js new file mode 100644 index 00000000..b319c961 --- /dev/null +++ b/assets/controllers/generate-description_controller.js @@ -0,0 +1,33 @@ +import {Controller} from '@hotwired/stimulus'; + +export default class extends Controller { + static targets = ['description']; + + endpoint; + + connect() { + this.endpoint = this.element.dataset.endpoint; + } + + generate() { + fetch(this.endpoint, { + method: 'GET', + mode: 'same-origin', + cache: 'no-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json' + }, + redirect: 'follow', + referrerPolicy: 'no-referrer', + }).then(async (resp) => { + if (resp.ok) { + const target = this.descriptionTarget; + + resp.json().then((data) => { + target.value = data.description; + }); + } + }); + } +} diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index 8c9efa91..8e03cfb2 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -9,7 +9,7 @@ when@dev: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug - channels: ["!event"] + channels: ["!event", "!doctrine", "!deprecation"] # uncomment to get logging in your browser # you may have to allow bigger header sizes in your Web server configuration #firephp: diff --git a/config/services.yaml b/config/services.yaml index 2b2f0ca0..29665fb5 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -7,7 +7,6 @@ imports: # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: - app.default_invoice_description: '%env(APP_INVOICE_DEFAULT_DESCRIPTION)%' app.jira_custom_fields: 'Epic Link': '%env(JIRA_API_SERVICE_CUSTOM_FIELD_EPIC_LINK)%' 'Account': '%env(JIRA_API_SERVICE_CUSTOM_FIELD_ACCOUNT)%' @@ -19,6 +18,9 @@ services: autowire: true # Automatically injects dependencies in your services. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + bind: + $defaultInvoiceDescriptionTemplate: '%env(APP_INVOICE_DEFAULT_DESCRIPTION)%' + # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name App\: diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index 93d1b809..8bab9439 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -18,6 +18,7 @@ use PhpOffice\PhpSpreadsheet\Writer\Csv; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; @@ -170,6 +171,28 @@ public function edit(Request $request, Invoice $invoice, InvoiceRepository $invo ]); } + #[Route('/{id}/generate-description', name: 'app_invoices_generate_description', methods: ['GET'])] + public function generateDescription(Invoice $invoice, $defaultInvoiceDescriptionTemplate): JsonResponse + { + $description = $defaultInvoiceDescriptionTemplate; + + // Default description. + if (!empty($invoice->getClient())) { + $projectLeadName = $invoice->getClient()?->getProjectLeadName() ?? null; + $projectLeadMail = $invoice->getClient()?->getProjectLeadMail() ?? null; + + if ($projectLeadName) { + $description = str_replace('%name%', $projectLeadName, $description); + } + + if ($projectLeadMail) { + $description = str_replace('%email%', $projectLeadMail, $description); + } + } + + return new JsonResponse(['description' => $description]); + } + #[Route('/{id}', name: 'app_invoices_delete', methods: ['POST'])] public function delete(Request $request, Invoice $invoice, InvoiceRepository $invoiceRepository): Response { diff --git a/src/Form/InvoiceNewType.php b/src/Form/InvoiceNewType.php index f84619e6..fa49f372 100644 --- a/src/Form/InvoiceNewType.php +++ b/src/Form/InvoiceNewType.php @@ -5,7 +5,6 @@ use App\Entity\Invoice; use Doctrine\ORM\EntityRepository; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -18,10 +17,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'required' => true, 'attr' => ['class' => 'form-element'], ]) - ->add('description', TextareaType::class, [ - 'required' => true, - 'attr' => ['class' => 'form-element', 'rows' => 4], - ]) ->add('project', null, [ 'required' => true, 'query_builder' => function (EntityRepository $er) { diff --git a/src/Form/InvoiceType.php b/src/Form/InvoiceType.php index 32c69eb8..7918141e 100644 --- a/src/Form/InvoiceType.php +++ b/src/Form/InvoiceType.php @@ -26,11 +26,11 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'help' => 'invoices.name_helptext', ]) ->add('description', TextareaType::class, [ - 'required' => true, + 'required' => false, 'label' => 'invoices.description', 'label_attr' => ['class' => 'label'], 'row_attr' => ['class' => 'form-row'], - 'attr' => ['class' => 'form-element', 'rows' => 4], + 'attr' => ['class' => 'form-element', 'data-generate-description-target' => 'description', 'rows' => 4], 'help' => 'invoices.description_helptext', ]) ->add('client', null, [ diff --git a/templates/invoices/edit.html.twig b/templates/invoices/edit.html.twig index 91fbdff2..a80f3de3 100644 --- a/templates/invoices/edit.html.twig +++ b/templates/invoices/edit.html.twig @@ -9,7 +9,12 @@
{{ form_row(form.name) }} - {{ form_row(form.description) }} +
+ {% if invoice.client %} + + {% endif %} + {{ form_row(form.description) }} +
{{ form_row(form.client) }} {{ form_row(form.periodFrom) }} {{ form_row(form.periodTo) }} diff --git a/templates/invoices/new.html.twig b/templates/invoices/new.html.twig index e2c27715..4be51f8f 100644 --- a/templates/invoices/new.html.twig +++ b/templates/invoices/new.html.twig @@ -8,7 +8,6 @@ {{ form_start(form) }}
{{ form_row(form.name) }} - {{ form_row(form.description) }} {{ form_row(form.project) }} diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index 06d4c074..c6ddc0d1 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -226,6 +226,7 @@ invoices: action_export_selected: 'Eksporter valg' action_view: 'Se' list_exported_date: 'Eksportdato' + generate_description: 'Autoudfyld' material_number_enum: internal: "Interne: 103361" From 9e83d9ead357040ea99ba83d3cb402475fdc7664 Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Wed, 20 Dec 2023 12:50:16 +0100 Subject: [PATCH 4/9] JE-403: Added class for choice form element --- src/Controller/InvoiceController.php | 2 +- src/Form/InvoiceType.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index 8bab9439..bb610613 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -133,7 +133,7 @@ public function edit(Request $request, Invoice $invoice, InvoiceRepository $invo $form->add('client', null, [ 'label' => 'invoices.client', 'label_attr' => ['class' => 'label'], - 'row_attr' => ['class' => 'form-row'], + 'row_attr' => ['class' => 'form-row form-choices'], 'attr' => [ 'class' => 'form-element', 'data-choices-target' => 'choices', diff --git a/src/Form/InvoiceType.php b/src/Form/InvoiceType.php index 7918141e..e364c7cd 100644 --- a/src/Form/InvoiceType.php +++ b/src/Form/InvoiceType.php @@ -36,7 +36,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ->add('client', null, [ 'label' => 'invoices.client', 'label_attr' => ['class' => 'label'], - 'row_attr' => ['class' => 'form-row'], + 'row_attr' => ['class' => 'form-row form-choices'], 'attr' => ['class' => 'form-element'], 'help' => 'invoices.client_helptext', ]) From 2928ecc8c1f2a4435bb9136a5884115e6f5b20c2 Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Wed, 20 Dec 2023 13:08:24 +0100 Subject: [PATCH 5/9] JE-403: Fixed texts. Fixed classes for choices.js fields and disabled state --- CHANGELOG.md | 2 ++ assets/controllers/choices_controller.js | 6 +++++- src/Controller/InvoiceEntryWorklogController.php | 4 ++-- translations/messages.da.yaml | 3 ++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6c75a10..de3335fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added project lead to client when syncing projects. * Remove description from create invoice page. * Added generate description button to invoice when client is set. +* Fixed texts. +* Fixed classes for choices.js fields and disabled state. ## [1.1.2] diff --git a/assets/controllers/choices_controller.js b/assets/controllers/choices_controller.js index ba216904..b8438352 100644 --- a/assets/controllers/choices_controller.js +++ b/assets/controllers/choices_controller.js @@ -10,7 +10,11 @@ export default class extends Controller { connect() { this.choicesTargets.forEach((target) => { - new Choices(target, {allowHTML: true, itemSelectText: ''}); + const notDisabled = !target.disabled; + + if (notDisabled) { + new Choices(target, {allowHTML: true, itemSelectText: ''}); + } }) } } diff --git a/src/Controller/InvoiceEntryWorklogController.php b/src/Controller/InvoiceEntryWorklogController.php index 6b33536a..fed90a5d 100644 --- a/src/Controller/InvoiceEntryWorklogController.php +++ b/src/Controller/InvoiceEntryWorklogController.php @@ -47,7 +47,7 @@ public function worklogs(Request $request, Invoice $invoice, InvoiceEntry $invoi 'required' => false, 'label' => 'worklog.version', 'label_attr' => ['class' => 'label'], - 'row_attr' => ['class' => 'form-row'], + 'row_attr' => ['class' => 'form-row form-choices'], 'attr' => [ 'class' => 'form-element', 'data-choices-target' => 'choices', @@ -69,7 +69,7 @@ public function worklogs(Request $request, Invoice $invoice, InvoiceEntry $invoi 'required' => false, 'label' => 'worklog.epic', 'label_attr' => ['class' => 'label'], - 'row_attr' => ['class' => 'form-row'], + 'row_attr' => ['class' => 'form-row form-choices'], 'attr' => [ 'class' => 'form-element', 'data-choices-target' => 'choices', diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index c6ddc0d1..cb4a478d 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -172,7 +172,7 @@ invoices: client_helptext: 'Vælg hvilken kundekonto fakturaen skal udstedes til.' default_material_number_helptext: 'Vælg forudvalgt "Materialenummer". Det bliver sat automatisk i alle fakturaindgange.' default_receiver_account_helptext: 'Vælg forudvalgt "Til konto". Det bliver sat automatisk i alle fakturaindgange.' - payer_account_helptext: 'Hvis valgt indsættes følgende først i tekstfeltet i fakturaen: "Betales af [KONTO]".' + payer_account_helptext: 'Anvendes kun når der er tale om ITK projekt posteringer på PSP-element. Hvis valgt indsættes følgende i starten af tekstfeltet i fakturaen: "Betales af [KONTO]".' client_type_internal: 'Intern' client_type_external: 'Ekstern' client_ean: 'EAN' @@ -269,6 +269,7 @@ worklog: period_to_helptext: '' worker_helptext: '' version_helptext: '' + epic_helptext: '' owned_by_other: 'Anden faktura' action_save: 'Gem valgte worklogs' error_already_billed: 'Fejl: Indeholder worklog der allerede er faktureret. Prøv at genindlæse siden...' From 6d8f11f8d1734a174cd56bb2a569721dd1354741 Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Thu, 21 Dec 2023 07:08:08 +0100 Subject: [PATCH 6/9] Update translations/messages.da.yaml Co-authored-by: Mikkel Ricky --- translations/messages.da.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index cb4a478d..4a387ac9 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -172,7 +172,7 @@ invoices: client_helptext: 'Vælg hvilken kundekonto fakturaen skal udstedes til.' default_material_number_helptext: 'Vælg forudvalgt "Materialenummer". Det bliver sat automatisk i alle fakturaindgange.' default_receiver_account_helptext: 'Vælg forudvalgt "Til konto". Det bliver sat automatisk i alle fakturaindgange.' - payer_account_helptext: 'Anvendes kun når der er tale om ITK projekt posteringer på PSP-element. Hvis valgt indsættes følgende i starten af tekstfeltet i fakturaen: "Betales af [KONTO]".' + payer_account_helptext: 'Anvendes kun når der er tale om ITK-projektposteringer på PSP-element. Hvis valgt indsættes følgende i starten af tekstfeltet i fakturaen: "Betales af [KONTO]".' client_type_internal: 'Intern' client_type_external: 'Ekstern' client_ean: 'EAN' From 4a444d0752d7ffd17509b9e5d684fab3d1a38cb6 Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Thu, 21 Dec 2023 07:24:36 +0100 Subject: [PATCH 7/9] Update src/Controller/InvoiceController.php Co-authored-by: Mikkel Ricky --- src/Controller/InvoiceController.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index bb610613..fad442ce 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -177,9 +177,10 @@ public function generateDescription(Invoice $invoice, $defaultInvoiceDescription $description = $defaultInvoiceDescriptionTemplate; // Default description. - if (!empty($invoice->getClient())) { - $projectLeadName = $invoice->getClient()?->getProjectLeadName() ?? null; - $projectLeadMail = $invoice->getClient()?->getProjectLeadMail() ?? null; + $client = $invoice->getClient(); + if (!empty($client)) { + $projectLeadName = $client->getProjectLeadName() ?? null; + $projectLeadMail = $client->getProjectLeadMail() ?? null; if ($projectLeadName) { $description = str_replace('%name%', $projectLeadName, $description); From 85366e4f83708fd03021ec749d9a2328fd5c186d Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Thu, 21 Dec 2023 07:54:38 +0100 Subject: [PATCH 8/9] JE-403: Fixed issues raised in review --- CHANGELOG.md | 1 + .../generate-description_controller.js | 4 +++- src/Controller/InvoiceController.php | 18 +++++------------- templates/invoices/edit.html.twig | 3 ++- translations/messages.da.yaml | 3 ++- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de3335fb..f1d24192 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added generate description button to invoice when client is set. * Fixed texts. * Fixed classes for choices.js fields and disabled state. +* Added project lead to invoice edit page. ## [1.1.2] diff --git a/assets/controllers/generate-description_controller.js b/assets/controllers/generate-description_controller.js index b319c961..74053e57 100644 --- a/assets/controllers/generate-description_controller.js +++ b/assets/controllers/generate-description_controller.js @@ -25,7 +25,9 @@ export default class extends Controller { const target = this.descriptionTarget; resp.json().then((data) => { - target.value = data.description; + if (data.description !== null) { + target.value = data.description; + } }); } }); diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index fad442ce..6ca4d143 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -174,24 +174,16 @@ public function edit(Request $request, Invoice $invoice, InvoiceRepository $invo #[Route('/{id}/generate-description', name: 'app_invoices_generate_description', methods: ['GET'])] public function generateDescription(Invoice $invoice, $defaultInvoiceDescriptionTemplate): JsonResponse { - $description = $defaultInvoiceDescriptionTemplate; - - // Default description. $client = $invoice->getClient(); - if (!empty($client)) { - $projectLeadName = $client->getProjectLeadName() ?? null; - $projectLeadMail = $client->getProjectLeadMail() ?? null; - if ($projectLeadName) { - $description = str_replace('%name%', $projectLeadName, $description); - } + if (!empty($client) && !(empty($client->getProjectLeadName())) && !empty($client->getProjectLeadMail())) { + $description = $defaultInvoiceDescriptionTemplate; - if ($projectLeadMail) { - $description = str_replace('%email%', $projectLeadMail, $description); - } + $description = str_replace('%name%', $client->getProjectLeadName() ?? '', $description); + $description = str_replace('%email%', $client->getProjectLeadMail() ?? '', $description); } - return new JsonResponse(['description' => $description]); + return new JsonResponse(['description' => $description ?? null]); } #[Route('/{id}', name: 'app_invoices_delete', methods: ['POST'])] diff --git a/templates/invoices/edit.html.twig b/templates/invoices/edit.html.twig index a80f3de3..4435c17b 100644 --- a/templates/invoices/edit.html.twig +++ b/templates/invoices/edit.html.twig @@ -10,7 +10,7 @@
{{ form_row(form.name) }}
- {% if invoice.client %} + {% if invoice.client and invoice.client.projectLeadName and invoice.client.projectLeadMail %} {% endif %} {{ form_row(form.description) }} @@ -40,6 +40,7 @@
  • {{ 'invoices.client_information'|trans }}
  • {% if invoice.client != null %}
  • {{ 'invoices.client_name'|trans }}: {{ invoice.client.name }}
  • +
  • {{ 'invoices.client_project_lead'|trans }}: {{ invoice.client.projectLeadName }} ({{ invoice.client.projectLeadMail }})
  • {{ 'invoices.client_contact'|trans }}: {{ invoice.client.contact }}
  • {{ 'invoices.client_standard_price'|trans }}: {{ invoice.client.standardPrice }}
  • {{ 'invoices.client_sales_channel'|trans }}: {{ invoice.client.salesChannel }}
  • diff --git a/translations/messages.da.yaml b/translations/messages.da.yaml index 4a387ac9..59e32f5b 100644 --- a/translations/messages.da.yaml +++ b/translations/messages.da.yaml @@ -167,7 +167,7 @@ invoices: period_from_helptext: 'Dette felt skal udfyldes på eksterne fakturaer.' period_to_helptext: 'Dette felt skal udfyldes på eksterne fakturaer.' name_helptext: 'Vælg faktuens navn.' - description_helptext: 'Indsættes i tekstfeltet i fakturaen.' + description_helptext: 'Indsættes i tekstfeltet i fakturaen. Autoudfyld er tilgængelig, hvis der er valgt en kundekonto med en project lead.' project_helptext: 'Vælg projekt.' client_helptext: 'Vælg hvilken kundekonto fakturaen skal udstedes til.' default_material_number_helptext: 'Vælg forudvalgt "Materialenummer". Det bliver sat automatisk i alle fakturaindgange.' @@ -227,6 +227,7 @@ invoices: action_view: 'Se' list_exported_date: 'Eksportdato' generate_description: 'Autoudfyld' + client_project_lead: 'Project Lead' material_number_enum: internal: "Interne: 103361" From af28947b18cfa7393b34be3fd5cf1edddbcc7a2e Mon Sep 17 00:00:00 2001 From: Troels Ugilt Jensen <6103205+tuj@users.noreply.github.com> Date: Wed, 3 Jan 2024 08:30:06 +0100 Subject: [PATCH 9/9] #223: NPM audit --- package-lock.json | 296 ++++++++++++++++++++++++---------------------- 1 file changed, 156 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index c94f9546..51ecc2df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,7 @@ "requires": true, "packages": { "": { + "name": "app", "license": "UNLICENSED", "devDependencies": { "@babel/core": "^7.17.0", @@ -41,12 +42,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -92,13 +94,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -219,9 +222,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -240,25 +243,25 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -388,30 +391,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -456,13 +459,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -470,9 +473,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1579,34 +1582,34 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1614,13 +1617,13 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -5690,10 +5693,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6197,9 +6206,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -6209,10 +6218,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -8653,6 +8666,7 @@ } }, "vendor/symfony/stimulus-bundle/assets": { + "name": "@symfony/stimulus-bundle", "version": "1.0.0", "dev": true, "license": "MIT", @@ -8674,12 +8688,13 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" } }, "@babel/compat-data": { @@ -8712,13 +8727,14 @@ } }, "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -8808,9 +8824,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -8823,22 +8839,22 @@ } }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { @@ -8935,24 +8951,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -8985,20 +9001,20 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -9736,42 +9752,42 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -12802,9 +12818,9 @@ } }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, "negotiator": { @@ -13172,12 +13188,12 @@ } }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }