From 70fe8d34463b36ae577a7bdb7aaaf1b82d3918e6 Mon Sep 17 00:00:00 2001 From: jekuaitk Date: Tue, 23 Jun 2026 14:02:58 +0200 Subject: [PATCH 1/4] Allow configurating on which submission states handlers should run --- CHANGELOG.md | 8 ++ .../os2forms_digital_post.install | 32 ++++++++ .../WebformHandler/WebformHandlerSF1601.php | 41 ++++++++++ .../os2forms_digital_signature.install | 39 ++++++++++ .../DigitalSignatureWebformHandler.php | 74 ++++++++++++++++++- modules/os2forms_fasit/os2forms_fasit.install | 33 +++++++++ .../WebformHandler/FasitWebformHandler.php | 51 +++++++++++++ .../os2forms_fbs_handler.install | 39 ++++++++++ .../WebformHandler/FbsWebformHandler.php | 51 +++++++++++++ 9 files changed, 365 insertions(+), 3 deletions(-) create mode 100644 modules/os2forms_digital_signature/os2forms_digital_signature.install create mode 100644 modules/os2forms_fbs_handler/os2forms_fbs_handler.install diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ddc05a..e57aca6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,14 @@ before starting to add changes. Use example [placed in the end of the page](#exa ## [Unreleased] +- Added the ability to configure on which submission states handlers should run. + The default option is to run on the completed state. Changes was made to the + following handlers: + - Digital post + - Fasit + - FBS + - Digital signature + ## [5.1.0] 2026-06-03 - [PR-326](https://github.com/OS2Forms/os2forms/pull/326) diff --git a/modules/os2forms_digital_post/os2forms_digital_post.install b/modules/os2forms_digital_post/os2forms_digital_post.install index 48768e2..cb410b1 100644 --- a/modules/os2forms_digital_post/os2forms_digital_post.install +++ b/modules/os2forms_digital_post/os2forms_digital_post.install @@ -6,6 +6,7 @@ */ use Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper; +use Drupal\webform\WebformSubmissionInterface; /** * Implements hook_schema(). @@ -26,3 +27,34 @@ function os2forms_digital_post_update_9001(): void { 'os2web_key', ], TRUE); } + +/** + * Set states config to completed on existing digital post handlers. + */ +function os2forms_digital_post_update_10001(): void { + // To avoid having to load full webforms we load and update webform configs. + $configFactory = \Drupal::configFactory(); + + foreach ($configFactory->listAll('webform.webform.') as $name) { + $config = $configFactory->getEditable($name); + $handlers = $config->get('handlers'); + if (!is_array($handlers)) { + continue; + } + + $changed = FALSE; + + foreach ($handlers as $handlerKey => $handler) { + // $handler['id'] is the handler plugin id. + if (($handler['id'] ?? NULL) !== 'digital_post_sf1601') { + continue; + } + $handlers[$handlerKey]['settings']['additional']['states'] = [WebformSubmissionInterface::STATE_COMPLETED]; + $changed = TRUE; + } + + if ($changed) { + $config->set('handlers', $handlers)->save(); + } + } +} diff --git a/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php b/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php index 6f0e06a..ae633c0 100644 --- a/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php +++ b/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php @@ -32,6 +32,8 @@ final class WebformHandlerSF1601 extends WebformHandlerBase { public const RECIPIENT_ELEMENT = 'recipient_element'; public const ATTACHMENT_ELEMENT = 'attachment_element'; public const SENDER_ADDRESS = 'sender_address'; + private const string ADDITIONAL = 'additional'; + private const string STATES = 'states'; /** * Maximum length of sender label. @@ -76,6 +78,9 @@ public static function create(ContainerInterface $container, array $configuratio public function defaultConfiguration() { return [ 'debug' => FALSE, + self::ADDITIONAL => [ + self::STATES => [WebformSubmissionInterface::STATE_COMPLETED], + ], ]; } @@ -203,6 +208,31 @@ public function buildConfigurationForm(array $form, FormStateInterface $formStat '#default_value' => $this->configuration['debug'] ?? NULL, ]; + // Additional. + // Lifted from EmailWebformHandler::buildConfigurationForm(). + $resultsDisabled = (bool) $this->getWebform()->getSetting('results_disabled'); + $form[self::ADDITIONAL] = [ + '#type' => 'fieldset', + '#title' => $this->t('Additional settings'), + ]; + // Settings: States. + $states = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + $form[self::ADDITIONAL][self::STATES] = [ + '#type' => 'checkboxes', + '#title' => $this->t('Run handler when …'), + '#options' => [ + WebformSubmissionInterface::STATE_DRAFT_CREATED => $this->t('draft is created.'), + WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('draft is updated.'), + WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), + WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), + WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), + WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), + WebformSubmissionInterface::STATE_LOCKED => $this->t('submission is locked.'), + ], + '#access' => !$resultsDisabled, + '#default_value' => $resultsDisabled ? [WebformSubmissionInterface::STATE_COMPLETED] : $states, + ]; + return $this->setSettingsParents($form); } @@ -333,6 +363,11 @@ static function (array $action) { $this->configuration[self::MEMO_ACTIONS] = $actions; $this->configuration['debug'] = (bool) $formState->getValue('debug'); + + $additional = $formState->getValue(self::ADDITIONAL); + // Clean up states. + $additional[self::STATES] = array_values(array_filter($additional[self::STATES])); + $this->configuration[self::ADDITIONAL] = $additional; } /** @@ -341,6 +376,12 @@ static function (array $action) { * @phpstan-return void */ public function postSave(WebformSubmissionInterface $webformSubmission, $update = TRUE) { + $submissionState = $webformSubmission->getWebform()->getSetting('results_disabled') ? WebformSubmissionInterface::STATE_COMPLETED : $webformSubmission->getState(); + $enabledStates = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + if (!in_array($submissionState, $enabledStates)) { + return; + } + $this->helper->createJob($webformSubmission, $this->configuration); } diff --git a/modules/os2forms_digital_signature/os2forms_digital_signature.install b/modules/os2forms_digital_signature/os2forms_digital_signature.install new file mode 100644 index 0000000..4e5cb76 --- /dev/null +++ b/modules/os2forms_digital_signature/os2forms_digital_signature.install @@ -0,0 +1,39 @@ +listAll('webform.webform.') as $name) { + $config = $configFactory->getEditable($name); + $handlers = $config->get('handlers'); + if (!is_array($handlers)) { + continue; + } + + $changed = FALSE; + + foreach ($handlers as $handlerKey => $handler) { + // $handler['id'] is the handler plugin id. + if (($handler['id'] ?? NULL) !== 'os2forms_digital_signature') { + continue; + } + $handlers[$handlerKey]['settings']['additional']['states'] = [WebformSubmissionInterface::STATE_COMPLETED]; + $changed = TRUE; + } + + if ($changed) { + $config->set('handlers', $handlers)->save(); + } + } +} diff --git a/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php b/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php index 9a616bf..78252c0 100644 --- a/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php +++ b/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php @@ -7,6 +7,7 @@ use Drupal\Core\File\FileExists; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\File\FileUrlGeneratorInterface; +use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Site\Settings; use Drupal\Core\Url; use Drupal\file\FileRepositoryInterface; @@ -88,6 +89,9 @@ class DigitalSignatureWebformHandler extends WebformHandlerBase { */ private readonly Settings $settings; + private const string ADDITIONAL = 'additional'; + private const string STATES = 'states'; + /** * {@inheritdoc} */ @@ -107,14 +111,78 @@ public static function create(ContainerInterface $container, array $configuratio /** * {@inheritdoc} + * + * @phpstan-return array */ - public function preSave(WebformSubmissionInterface $webform_submission) { - $webform = $webform_submission->getWebform(); + public function defaultConfiguration() { + return [ + self::ADDITIONAL => [ + self::STATES => [WebformSubmissionInterface::STATE_COMPLETED], + ], + ]; + } + + /** + * {@inheritdoc} + * + * @phpstan-param array $form + * @phpstan-return array + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + // Additional. + // Lifted from EmailWebformHandler::buildConfigurationForm(). + $resultsDisabled = (bool) $this->getWebform()->getSetting('results_disabled'); + $form[self::ADDITIONAL] = [ + '#type' => 'fieldset', + '#title' => $this->t('Additional settings'), + ]; + // Settings: States. + $states = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + $form[self::ADDITIONAL][self::STATES] = [ + '#type' => 'checkboxes', + '#title' => $this->t('Run handler when …'), + '#options' => [ + WebformSubmissionInterface::STATE_DRAFT_CREATED => $this->t('draft is created.'), + WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('draft is updated.'), + WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), + WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), + WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), + WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), + // The digital signature logic locks after the first signing. Resigning + // does not make sense, so 'locked' is not an option here. + ], + '#access' => !$resultsDisabled, + '#default_value' => $resultsDisabled ? [WebformSubmissionInterface::STATE_COMPLETED] : $states, + ]; + + return $this->setSettingsParents($form); + } - if ($webform_submission->isLocked()) { + /** + * {@inheritdoc} + * + * @phpstan-param array $form + * @phpstan-return void + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + $additional = $form_state->getValue(self::ADDITIONAL); + // Clean up states. + $additional[self::STATES] = array_values(array_filter($additional[self::STATES])); + $this->configuration[self::ADDITIONAL] = $additional; + } + + /** + * {@inheritdoc} + */ + public function preSave(WebformSubmissionInterface $webform_submission) { + $submissionState = $webform_submission->getWebform()->getSetting('results_disabled') ? WebformSubmissionInterface::STATE_COMPLETED : $webform_submission->getState(); + $enabledStates = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + if (!in_array($submissionState, $enabledStates)) { return; } + $webform = $webform_submission->getWebform(); + $attachment = $this->getSubmissionAttachment($webform_submission); if (!$attachment) { $this->logger->error('Attachment cannot be created webform: %webform, webform_submission: %webform_submission', diff --git a/modules/os2forms_fasit/os2forms_fasit.install b/modules/os2forms_fasit/os2forms_fasit.install index f862baf..8d471f4 100644 --- a/modules/os2forms_fasit/os2forms_fasit.install +++ b/modules/os2forms_fasit/os2forms_fasit.install @@ -5,6 +5,8 @@ * Install hooks for os2forms_fasit. */ +use Drupal\webform\WebformSubmissionInterface; + /** * Install Key module. */ @@ -13,3 +15,34 @@ function os2forms_fasit_update_9001(): void { 'key', ], TRUE); } + +/** + * Set states config to completed on existing fasit handlers. + */ +function os2forms_fasit_update_10001(): void { + // To avoid having to load full webforms we load and update webform configs. + $configFactory = \Drupal::configFactory(); + + foreach ($configFactory->listAll('webform.webform.') as $name) { + $config = $configFactory->getEditable($name); + $handlers = $config->get('handlers'); + if (!is_array($handlers)) { + continue; + } + + $changed = FALSE; + + foreach ($handlers as $handlerKey => $handler) { + // $handler['id'] is the handler plugin id. + if (($handler['id'] ?? NULL) !== 'os2forms_fasit') { + continue; + } + $handlers[$handlerKey]['settings']['additional']['states'] = [WebformSubmissionInterface::STATE_COMPLETED]; + $changed = TRUE; + } + + if ($changed) { + $config->set('handlers', $handlers)->save(); + } + } +} diff --git a/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php b/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php index 84eef37..e726bf4 100644 --- a/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php +++ b/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php @@ -35,6 +35,8 @@ class FasitWebformHandler extends WebformHandlerBase { public const FASIT_HANDLER_DOCUMENT_DESCRIPTION = 'document_description'; public const FASIT_HANDLER_CPR_ELEMENT = 'cpr_element'; public const FASIT_HANDLER_ATTACHMENT_ELEMENT = 'attachment_element'; + private const string ADDITIONAL = 'additional'; + private const string STATES = 'states'; /** * The submission logger. @@ -79,6 +81,19 @@ public static function create(ContainerInterface $container, array $configuratio ); } + /** + * {@inheritdoc} + * + * @phpstan-return array + */ + public function defaultConfiguration() { + return [ + self::ADDITIONAL => [ + self::STATES => [WebformSubmissionInterface::STATE_COMPLETED], + ], + ]; + } + /** * {@inheritdoc} * @@ -129,6 +144,31 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta '#size' => 5, ]; + // Additional. + // Lifted from EmailWebformHandler::buildConfigurationForm(). + $resultsDisabled = (bool) $this->getWebform()->getSetting('results_disabled'); + $form[self::ADDITIONAL] = [ + '#type' => 'fieldset', + '#title' => $this->t('Additional settings'), + ]; + // Settings: States. + $states = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + $form[self::ADDITIONAL][self::STATES] = [ + '#type' => 'checkboxes', + '#title' => $this->t('Run handler when …'), + '#options' => [ + WebformSubmissionInterface::STATE_DRAFT_CREATED => $this->t('draft is created.'), + WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('draft is updated.'), + WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), + WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), + WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), + WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), + WebformSubmissionInterface::STATE_LOCKED => $this->t('submission is locked.'), + ], + '#access' => !$resultsDisabled, + '#default_value' => $resultsDisabled ? [WebformSubmissionInterface::STATE_COMPLETED] : $states, + ]; + return $this->setSettingsParents($form); } @@ -143,12 +183,23 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s $this->configuration[self::FASIT_HANDLER_GENERAL][self::FASIT_HANDLER_DOCUMENT_DESCRIPTION] = $form_state->getValue(self::FASIT_HANDLER_GENERAL)[self::FASIT_HANDLER_DOCUMENT_DESCRIPTION]; $this->configuration[self::FASIT_HANDLER_GENERAL][self::FASIT_HANDLER_CPR_ELEMENT] = $form_state->getValue(self::FASIT_HANDLER_GENERAL)[self::FASIT_HANDLER_CPR_ELEMENT]; $this->configuration[self::FASIT_HANDLER_GENERAL][self::FASIT_HANDLER_ATTACHMENT_ELEMENT] = $form_state->getValue(self::FASIT_HANDLER_GENERAL)[self::FASIT_HANDLER_ATTACHMENT_ELEMENT]; + + $additional = $form_state->getValue(self::ADDITIONAL); + // Clean up states. + $additional[self::STATES] = array_values(array_filter($additional[self::STATES])); + $this->configuration[self::ADDITIONAL] = $additional; } /** * {@inheritdoc} */ public function postSave(WebformSubmissionInterface $webform_submission, $update = TRUE): void { + $submissionState = $webform_submission->getWebform()->getSetting('results_disabled') ? WebformSubmissionInterface::STATE_COMPLETED : $webform_submission->getState(); + $enabledStates = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + if (!in_array($submissionState, $enabledStates)) { + return; + } + $queueStorage = $this->entityTypeManager->getStorage('advancedqueue_queue'); /** @var \Drupal\advancedqueue\Entity\Queue $queue */ $queue = $queueStorage->load('fasit_queue'); diff --git a/modules/os2forms_fbs_handler/os2forms_fbs_handler.install b/modules/os2forms_fbs_handler/os2forms_fbs_handler.install new file mode 100644 index 0000000..4fa0422 --- /dev/null +++ b/modules/os2forms_fbs_handler/os2forms_fbs_handler.install @@ -0,0 +1,39 @@ +listAll('webform.webform.') as $name) { + $config = $configFactory->getEditable($name); + $handlers = $config->get('handlers'); + if (!is_array($handlers)) { + continue; + } + + $changed = FALSE; + + foreach ($handlers as $handlerKey => $handler) { + // $handler['id'] is the handler plugin id. + if (($handler['id'] ?? NULL) !== 'os2forms_fbs') { + continue; + } + $handlers[$handlerKey]['settings']['additional']['states'] = [WebformSubmissionInterface::STATE_COMPLETED]; + $changed = TRUE; + } + + if ($changed) { + $config->set('handlers', $handlers)->save(); + } + } +} diff --git a/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php b/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php index aa1ae33..33c479c 100644 --- a/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php +++ b/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php @@ -42,6 +42,8 @@ final class FbsWebformHandler extends WebformHandlerBase { * The queue id. */ private const QUEUE_ID = 'os2forms_fbs_handler'; + private const string ADDITIONAL = 'additional'; + private const string STATES = 'states'; /** * Constructs an FbsWebformHandler object. @@ -89,6 +91,19 @@ public static function create(ContainerInterface $container, array $configuratio ); } + /** + * {@inheritdoc} + * + * @phpstan-return array + */ + public function defaultConfiguration() { + return [ + self::ADDITIONAL => [ + self::STATES => [WebformSubmissionInterface::STATE_COMPLETED], + ], + ]; + } + /** * {@inheritdoc} * @@ -146,6 +161,31 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta '#default_value' => $this->configuration['password'] ?? '', ]; + // Additional. + // Lifted from EmailWebformHandler::buildConfigurationForm(). + $resultsDisabled = (bool) $this->getWebform()->getSetting('results_disabled'); + $form[self::ADDITIONAL] = [ + '#type' => 'fieldset', + '#title' => $this->t('Additional settings'), + ]; + // Settings: States. + $states = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + $form[self::ADDITIONAL][self::STATES] = [ + '#type' => 'checkboxes', + '#title' => $this->t('Run handler when …'), + '#options' => [ + WebformSubmissionInterface::STATE_DRAFT_CREATED => $this->t('draft is created.'), + WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('draft is updated.'), + WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), + WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), + WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), + WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), + WebformSubmissionInterface::STATE_LOCKED => $this->t('submission is locked.'), + ], + '#access' => !$resultsDisabled, + '#default_value' => $resultsDisabled ? [WebformSubmissionInterface::STATE_COMPLETED] : $states, + ]; + return $this->setSettingsParents($form); } @@ -164,12 +204,23 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s ->getValue(['wrapper', 'username']); $this->configuration['password'] = $form_state ->getValue(['wrapper', 'password']); + + $additional = $form_state->getValue(self::ADDITIONAL); + // Clean up states. + $additional[self::STATES] = array_values(array_filter($additional[self::STATES])); + $this->configuration[self::ADDITIONAL] = $additional; } /** * {@inheritdoc} */ public function postSave(WebformSubmissionInterface $webform_submission, $update = TRUE): void { + $submissionState = $webform_submission->getWebform()->getSetting('results_disabled') ? WebformSubmissionInterface::STATE_COMPLETED : $webform_submission->getState(); + $enabledStates = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); + if (!in_array($submissionState, $enabledStates)) { + return; + } + $logger_context = [ 'handler_id' => 'os2forms_fbs', 'channel' => 'webform_submission', From 48d83071a0c404f773477707711459e7ea1d9d4f Mon Sep 17 00:00:00 2001 From: jekuaitk Date: Tue, 23 Jun 2026 14:08:20 +0200 Subject: [PATCH 2/4] Updated CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e57aca6..e5b2a42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,8 @@ before starting to add changes. Use example [placed in the end of the page](#exa ## [Unreleased] -- Added the ability to configure on which submission states handlers should run. +- [PR-333](https://github.com/OS2Forms/os2forms/pull/333) + Added the ability to configure on which submission states handlers should run. The default option is to run on the completed state. Changes was made to the following handlers: - Digital post From 19d8e41213b6d73b75cf7501a50758f31cfed061 Mon Sep 17 00:00:00 2001 From: jekuaitk Date: Tue, 1 Sep 2026 10:05:33 +0200 Subject: [PATCH 3/4] Reverted handler states on Digital Signature --- CHANGELOG.md | 1 - .../os2forms_digital_signature.install | 39 ---------- .../DigitalSignatureWebformHandler.php | 73 +------------------ 3 files changed, 4 insertions(+), 109 deletions(-) delete mode 100644 modules/os2forms_digital_signature/os2forms_digital_signature.install diff --git a/CHANGELOG.md b/CHANGELOG.md index e5b2a42..e9560e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,6 @@ before starting to add changes. Use example [placed in the end of the page](#exa - Digital post - Fasit - FBS - - Digital signature ## [5.1.0] 2026-06-03 diff --git a/modules/os2forms_digital_signature/os2forms_digital_signature.install b/modules/os2forms_digital_signature/os2forms_digital_signature.install deleted file mode 100644 index 4e5cb76..0000000 --- a/modules/os2forms_digital_signature/os2forms_digital_signature.install +++ /dev/null @@ -1,39 +0,0 @@ -listAll('webform.webform.') as $name) { - $config = $configFactory->getEditable($name); - $handlers = $config->get('handlers'); - if (!is_array($handlers)) { - continue; - } - - $changed = FALSE; - - foreach ($handlers as $handlerKey => $handler) { - // $handler['id'] is the handler plugin id. - if (($handler['id'] ?? NULL) !== 'os2forms_digital_signature') { - continue; - } - $handlers[$handlerKey]['settings']['additional']['states'] = [WebformSubmissionInterface::STATE_COMPLETED]; - $changed = TRUE; - } - - if ($changed) { - $config->set('handlers', $handlers)->save(); - } - } -} diff --git a/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php b/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php index 78252c0..4068251 100644 --- a/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php +++ b/modules/os2forms_digital_signature/src/Plugin/WebformHandler/DigitalSignatureWebformHandler.php @@ -7,7 +7,6 @@ use Drupal\Core\File\FileExists; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\File\FileUrlGeneratorInterface; -use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Site\Settings; use Drupal\Core\Url; use Drupal\file\FileRepositoryInterface; @@ -89,9 +88,6 @@ class DigitalSignatureWebformHandler extends WebformHandlerBase { */ private readonly Settings $settings; - private const string ADDITIONAL = 'additional'; - private const string STATES = 'states'; - /** * {@inheritdoc} */ @@ -109,75 +105,14 @@ public static function create(ContainerInterface $container, array $configuratio return $instance; } - /** - * {@inheritdoc} - * - * @phpstan-return array - */ - public function defaultConfiguration() { - return [ - self::ADDITIONAL => [ - self::STATES => [WebformSubmissionInterface::STATE_COMPLETED], - ], - ]; - } - - /** - * {@inheritdoc} - * - * @phpstan-param array $form - * @phpstan-return array - */ - public function buildConfigurationForm(array $form, FormStateInterface $form_state) { - // Additional. - // Lifted from EmailWebformHandler::buildConfigurationForm(). - $resultsDisabled = (bool) $this->getWebform()->getSetting('results_disabled'); - $form[self::ADDITIONAL] = [ - '#type' => 'fieldset', - '#title' => $this->t('Additional settings'), - ]; - // Settings: States. - $states = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); - $form[self::ADDITIONAL][self::STATES] = [ - '#type' => 'checkboxes', - '#title' => $this->t('Run handler when …'), - '#options' => [ - WebformSubmissionInterface::STATE_DRAFT_CREATED => $this->t('draft is created.'), - WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('draft is updated.'), - WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), - WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), - WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), - WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), - // The digital signature logic locks after the first signing. Resigning - // does not make sense, so 'locked' is not an option here. - ], - '#access' => !$resultsDisabled, - '#default_value' => $resultsDisabled ? [WebformSubmissionInterface::STATE_COMPLETED] : $states, - ]; - - return $this->setSettingsParents($form); - } - - /** - * {@inheritdoc} - * - * @phpstan-param array $form - * @phpstan-return void - */ - public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { - $additional = $form_state->getValue(self::ADDITIONAL); - // Clean up states. - $additional[self::STATES] = array_values(array_filter($additional[self::STATES])); - $this->configuration[self::ADDITIONAL] = $additional; - } - /** * {@inheritdoc} */ public function preSave(WebformSubmissionInterface $webform_submission) { - $submissionState = $webform_submission->getWebform()->getSetting('results_disabled') ? WebformSubmissionInterface::STATE_COMPLETED : $webform_submission->getState(); - $enabledStates = (array) ($this->configuration[self::ADDITIONAL][self::STATES] ?? NULL); - if (!in_array($submissionState, $enabledStates)) { + // Signing redirects the user to the signing flow, so it only makes sense + // on an actual submission. Drafts are skipped, and a locked submission is + // already signed (signing locks it). + if ($webform_submission->isDraft() || $webform_submission->isLocked()) { return; } From eeb2c86add5ccaf4e351ff892bf897a30d338c40 Mon Sep 17 00:00:00 2001 From: jekuaitk Date: Tue, 27 Oct 2026 09:28:34 +0100 Subject: [PATCH 4/4] Remove delete state from handlers and require php 8.3 --- composer.json | 2 +- .../src/Plugin/WebformHandler/WebformHandlerSF1601.php | 1 - .../src/Plugin/WebformHandler/FasitWebformHandler.php | 1 - .../src/Plugin/WebformHandler/FbsWebformHandler.php | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/composer.json b/composer.json index ba5f18b..75ede35 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "license": "EUPL-1.2", "type": "drupal-module", "require": { - "php": "^8.1", + "php": "^8.3", "ext-dom": "*", "ext-soap": "*", "cweagans/composer-patches": "^1.6.5", diff --git a/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php b/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php index ae633c0..db1506f 100644 --- a/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php +++ b/modules/os2forms_digital_post/src/Plugin/WebformHandler/WebformHandlerSF1601.php @@ -226,7 +226,6 @@ public function buildConfigurationForm(array $form, FormStateInterface $formStat WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), - WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), WebformSubmissionInterface::STATE_LOCKED => $this->t('submission is locked.'), ], '#access' => !$resultsDisabled, diff --git a/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php b/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php index e726bf4..891a463 100644 --- a/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php +++ b/modules/os2forms_fasit/src/Plugin/WebformHandler/FasitWebformHandler.php @@ -162,7 +162,6 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), - WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), WebformSubmissionInterface::STATE_LOCKED => $this->t('submission is locked.'), ], '#access' => !$resultsDisabled, diff --git a/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php b/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php index 33c479c..0b318ae 100644 --- a/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php +++ b/modules/os2forms_fbs_handler/src/Plugin/WebformHandler/FbsWebformHandler.php @@ -179,7 +179,6 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous submission is converted to authenticated.'), WebformSubmissionInterface::STATE_COMPLETED => $this->t('submission is completed.'), WebformSubmissionInterface::STATE_UPDATED => $this->t('submission is updated.'), - WebformSubmissionInterface::STATE_DELETED => $this->t('submission is deleted.'), WebformSubmissionInterface::STATE_LOCKED => $this->t('submission is locked.'), ], '#access' => !$resultsDisabled,