Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@ before starting to add changes. Use example [placed in the end of the page](#exa

## [Unreleased]

- [PR-315](https://github.com/OS2Forms/os2forms/pull/315)
Added “Display on“ options to Map element
- [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
- Fasit
- FBS
- Digital signature

## [5.1.0] 2026-06-03

- [PR-326](https://github.com/OS2Forms/os2forms/pull/326)
Expand Down
32 changes: 32 additions & 0 deletions modules/os2forms_digital_post/os2forms_digital_post.install
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

use Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper;
use Drupal\webform\WebformSubmissionInterface;

/**
* Implements hook_schema().
Expand All @@ -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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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],
],
];
}

Expand Down Expand Up @@ -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('<b>draft is created</b>.'),
WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('<b>draft is updated</b>.'),
WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous <b>submission is converted</b> to authenticated.'),
WebformSubmissionInterface::STATE_COMPLETED => $this->t('<b>submission is completed</b>.'),
WebformSubmissionInterface::STATE_UPDATED => $this->t('<b>submission is updated</b>.'),
WebformSubmissionInterface::STATE_DELETED => $this->t('<b>submission is deleted</b>.'),
WebformSubmissionInterface::STATE_LOCKED => $this->t('<b>submission is locked</b>.'),
],
'#access' => !$resultsDisabled,
'#default_value' => $resultsDisabled ? [WebformSubmissionInterface::STATE_COMPLETED] : $states,
];

return $this->setSettingsParents($form);
}

Expand Down Expand Up @@ -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;
}

/**
Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

/**
* @file
* Install hooks for os2forms_digital_signature.
*/

use Drupal\webform\WebformSubmissionInterface;

/**
* Set states config to completed on existing digital signature handlers.
*/
function os2forms_digital_signature_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_digital_signature') {
continue;
}
$handlers[$handlerKey]['settings']['additional']['states'] = [WebformSubmissionInterface::STATE_COMPLETED];
$changed = TRUE;
}

if ($changed) {
$config->set('handlers', $handlers)->save();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -88,6 +89,9 @@ class DigitalSignatureWebformHandler extends WebformHandlerBase {
*/
private readonly Settings $settings;

private const string ADDITIONAL = 'additional';
private const string STATES = 'states';

/**
* {@inheritdoc}
*/
Expand All @@ -107,14 +111,78 @@ public static function create(ContainerInterface $container, array $configuratio

/**
* {@inheritdoc}
*
* @phpstan-return array<string, mixed>
*/
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<string, mixed> $form
* @phpstan-return array<string, mixed>
*/
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('<b>draft is created</b>.'),
WebformSubmissionInterface::STATE_DRAFT_UPDATED => $this->t('<b>draft is updated</b>.'),
WebformSubmissionInterface::STATE_CONVERTED => $this->t('anonymous <b>submission is converted</b> to authenticated.'),
WebformSubmissionInterface::STATE_COMPLETED => $this->t('<b>submission is completed</b>.'),
WebformSubmissionInterface::STATE_UPDATED => $this->t('<b>submission is updated</b>.'),
WebformSubmissionInterface::STATE_DELETED => $this->t('<b>submission is deleted</b>.'),
// 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<string, mixed> $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',
Expand Down
33 changes: 33 additions & 0 deletions modules/os2forms_fasit/os2forms_fasit.install
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
* Install hooks for os2forms_fasit.
*/

use Drupal\webform\WebformSubmissionInterface;

/**
* Install Key module.
*/
Expand All @@ -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();
}
}
}
Loading
Loading