diff --git a/composer.json b/composer.json index 4f41ef6d..541857ba 100644 --- a/composer.json +++ b/composer.json @@ -28,9 +28,8 @@ "drupal/entity_print": "^2.1", "drupal/webform_migrate": "^1.1", "drupal/maillog": "1.x-dev", - "drupal/webform_permissions_by_term": "^1.2", - "drupal/permissions_by_term": "^3.1", - "phpoffice/phpword": "^0.17.0", + "drupal/permissions_by_term": "^3.1 || ^2.25", + "phpoffice/phpword": "^0.18.2", "tecnickcom/tcpdf": "~6", "vaimo/composer-patches": "^4.20", "os2web/os2web_datalookup": "^1.0", diff --git a/modules/os2forms_autocomplete/README.md b/modules/os2forms_autocomplete/README.md new file mode 100644 index 00000000..d5902385 --- /dev/null +++ b/modules/os2forms_autocomplete/README.md @@ -0,0 +1,15 @@ +# OS2Forms Autocomplete Drupal module + +# Module purpose + +The aim of this module is to provide a genetic OS2Forms Autocomplete element which can return options from an external webservice. + +# How does it work + +Module exposes OS2Forms Autocomplete component that are available in the webform build process. + +Build page: + +``` +admin/structure/webform/manage/[webform] +``` diff --git a/modules/os2forms_autocomplete/os2forms_autocomplete.info.yml b/modules/os2forms_autocomplete/os2forms_autocomplete.info.yml new file mode 100644 index 00000000..3a17f404 --- /dev/null +++ b/modules/os2forms_autocomplete/os2forms_autocomplete.info.yml @@ -0,0 +1,9 @@ +name: 'OS2forms Autocomplete' +type: module +description: 'Provides autocomplete field' +package: OS2Forms +core: 8.x +core_version_requirement: ^8 || ^9 + +dependencies: + - os2forms diff --git a/modules/os2forms_autocomplete/os2forms_autocomplete.module b/modules/os2forms_autocomplete/os2forms_autocomplete.module new file mode 100644 index 00000000..a4abe2da --- /dev/null +++ b/modules/os2forms_autocomplete/os2forms_autocomplete.module @@ -0,0 +1,2 @@ +query->get('q') ?: ''; + if ($q === '') { + return new JsonResponse([]); + } + + // Get the initialized webform element. + $element = $webform->getElement($key); + if (!$element) { + return new JsonResponse([]); + } + + // Loading #autocomplete_items. + /** @var \Drupal\os2forms_autocomplete\Service\AutocompleteService $acService */ + $acService = \Drupal::service('os2forms_autocomplete.service'); + $element['#autocomplete_items'] = $acService->getAutocompleteItemsFromApi($element['#autocomplete_api_url']); + + // Set default autocomplete properties. + $element += [ + '#autocomplete_items' => [], + '#autocomplete_match' => 3, + '#autocomplete_limit' => 10, + '#autocomplete_match_operator' => 'CONTAINS', + ]; + + // Check minimum number of characters. + if (mb_strlen($q) < (int) $element['#autocomplete_match']) { + return new JsonResponse([]); + } + + $matches = []; + + // Get items (aka options) matches. + if (!empty($element['#autocomplete_items'])) { + $element['#options'] = $element['#autocomplete_items']; + $options = WebformOptions::getElementOptions($element); + $matches += $this->getMatchesFromOptions($q, $options, $element['#autocomplete_match_operator'], $element['#autocomplete_limit']); + } + + // Sort matches by label and enforce the limit. + if ($matches) { + uasort($matches, function (array $a, array $b) { + return $a['label'] > $b['label']; + }); + $matches = array_values($matches); + $matches = array_slice($matches, 0, $element['#autocomplete_limit']); + } + + return new JsonResponse($matches); + } + +} diff --git a/modules/os2forms_autocomplete/src/Element/AutocompleteElement.php b/modules/os2forms_autocomplete/src/Element/AutocompleteElement.php new file mode 100644 index 00000000..6813321b --- /dev/null +++ b/modules/os2forms_autocomplete/src/Element/AutocompleteElement.php @@ -0,0 +1,22 @@ + $webform_submission->getWebform()->id(), + 'key' => $element['#webform_key'], + ]; + + if ($webform_submission->isNew() && isset($element['#default_value'])) { + /** @var \Drupal\os2forms_autocomplete\Service\AutocompleteService $acService */ + $acService = \Drupal::service('os2forms_autocomplete.service'); + $autocompleteDefaultValue = $acService->getFirstMatchingValue($element['#autocomplete_api_url'], $element['#default_value']); + + if ($autocompleteDefaultValue) { + $element['#default_value'] = $autocompleteDefaultValue; + } + } + } + } + + /** + * {@inheritdoc} + */ + public function form(array $form, FormStateInterface $form_state) { + $form = parent::form($form, $form_state); + + // Unsetting the parametes that we are not using. + unset($form['autocomplete']['autocomplete_items']); + unset($form['autocomplete']['autocomplete_existing']); + + $form['autocomplete']['autocomplete_api_url'] = [ + '#type' => 'textfield', + '#title' => $this->t('API Url where the autocomplete values are coming from'), + '#description' => $this->t('The returned result must be in JSON format. Values from multiple keys will be combined'), + ]; + + return $form; + } + +} diff --git a/modules/os2forms_autocomplete/src/Service/AutocompleteService.php b/modules/os2forms_autocomplete/src/Service/AutocompleteService.php new file mode 100644 index 00000000..1152ee99 --- /dev/null +++ b/modules/os2forms_autocomplete/src/Service/AutocompleteService.php @@ -0,0 +1,69 @@ +get($requestUrl); + if ($res->getStatusCode() == 200) { + $body = $res->getBody(); + $jsonDecoded = json_decode($body, TRUE); + if (!empty($jsonDecoded) && is_array($jsonDecoded)) { + foreach ($jsonDecoded as $key => $values) { + $options = array_merge($options, $values); + } + } + } + } catch (RequestException $e) { + \Drupal::logger('OS2Forms Autocomplete')->notice('Autocomplete request failed: %e', ['%e' => $e->getMessage()]); + } + + return $options; + } + + /** + * Gets a first option from a fetched options list matching the criteria. + * + * @param string $requestUrl + * URL for getting the results from. + * @param $needle + * Search criteria. + * + * @return mixed + * First available option or FALSE. + */ + public function getFirstMatchingValue($requestUrl, $needle) { + $options = $this->getAutocompleteItemsFromApi($requestUrl); + + if (!empty($options)) { + foreach ($options as $option) { + if (stripos($option, $needle) !== FALSE) { + return $option; + } + } + } + + return FALSE; + } + +} diff --git a/modules/os2forms_nemid/os2forms_nemid.module b/modules/os2forms_nemid/os2forms_nemid.module index 63b3686c..fc212606 100644 --- a/modules/os2forms_nemid/os2forms_nemid.module +++ b/modules/os2forms_nemid/os2forms_nemid.module @@ -308,3 +308,26 @@ function os2forms_nemid_migrate_prepare_row(\Drupal\migrate\Row $row, \Drupal\mi $row->setDestinationProperty('dependencies', $dependencies); } } + +/** + * Add a flag that this webform submission has a protected address field. + * + * @param array $form + * Form object. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * Form state object. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ +function os2forms_nemid_submission_set_address_protected(array $form, \Drupal\Core\Form\FormStateInterface &$form_state){ + /** @var \Drupal\webform\WebformSubmissionForm $webformSubmissionForm */ + $webformSubmissionForm = $form_state->getFormObject(); + + /** @var \Drupal\webform\WebformSubmissionInterface $webformSubmission */ + $webformSubmission = $webformSubmissionForm->getEntity(); + + $data = $webformSubmission->getData(); + $data['os2forms_nemid_elements_nemid_address_protected'] = TRUE; + $webformSubmission->setData($data); + $webformSubmission->save(); +} diff --git a/modules/os2forms_nemid/src/Plugin/WebformElement/NemidAddress.php b/modules/os2forms_nemid/src/Plugin/WebformElement/NemidAddress.php index c54cd8fd..b784082a 100644 --- a/modules/os2forms_nemid/src/Plugin/WebformElement/NemidAddress.php +++ b/modules/os2forms_nemid/src/Plugin/WebformElement/NemidAddress.php @@ -2,6 +2,10 @@ namespace Drupal\os2forms_nemid\Plugin\WebformElement; +use Drupal\Component\Utility\NestedArray; +use Drupal\Core\Form\FormStateInterface; +use Drupal\webform\WebformSubmissionInterface; + /** * Provides a 'os2forms_nemid_address' element. * @@ -24,4 +28,49 @@ public function getPrepopulateFieldFieldKey() { return 'address'; } + /** + * {@inheritdoc} + */ + public function alterForm(array &$element, array &$form, FormStateInterface $form_state) { + parent::alterForm($element, $form, $form_state); + + $spCrpData = $form_state->get('servicePlatformenCprData'); + + /** @var \Drupal\webform\WebformSubmissionForm $webformSubmissionForm */ + $webformSubmissionForm = $form_state->getFormObject(); + + /** @var \Drupal\webform\WebformSubmissionInterface $webformSubmission */ + $webformSubmission = $webformSubmissionForm->getEntity(); + + // Only manipulate element on submission create form. + if (!$webformSubmission->isCompleted()) { + if ($spCrpData['name_address_protected']) { + $element['#info_message'] = 'adresse beskyttelse'; + NestedArray::setValue($form['elements'], $element['#webform_parents'], $element); + $form['actions']['submit']['#submit'][] = 'os2forms_nemid_submission_set_address_protected'; + } + } + else { + $data = $webformSubmission->getData(); + if (array_key_exists('os2forms_nemid_elements_nemid_address_protected', $data)) { + $element['#description'] = '(adresse beskyttelse)'; + NestedArray::setValue($form['elements'], $element['#webform_parents'], $element); + } + } + } + + /** + * {@inheritdoc} + */ + public function getValue(array $element, WebformSubmissionInterface $webform_submission, array $options = []) { + $value = parent::getValue($element, $webform_submission, $options = []); + + $data = $webform_submission->getData(); + if (array_key_exists('os2forms_nemid_elements_nemid_address_protected', $data)) { + $value .= ' (adresse beskyttelse)'; + } + + return $value; + } + } diff --git a/modules/os2forms_sbsys/src/Plugin/WebformElement/WebformAttachmentSbsysXml.php b/modules/os2forms_sbsys/src/Plugin/WebformElement/WebformAttachmentSbsysXml.php index 65995594..9991b271 100644 --- a/modules/os2forms_sbsys/src/Plugin/WebformElement/WebformAttachmentSbsysXml.php +++ b/modules/os2forms_sbsys/src/Plugin/WebformElement/WebformAttachmentSbsysXml.php @@ -47,7 +47,7 @@ public static function create(ContainerInterface $container, array $configuratio * {@inheritdoc} */ public function getDefaultProperties() { - return array_merge($this->getSbsysDefaultProperties(), parent::getDefaultProperties()); + return array_merge(parent::getDefaultProperties(), $this->getSbsysDefaultProperties()); } /** @@ -80,6 +80,7 @@ public static function getSbsysDefaultProperties($only_basic = FALSE) { $properties[$key . '_custom'] = ''; } $properties['MaaSendesTilDFF'] = ''; + $properties['filename'] = 'os2forms.xml'; return $properties; } @@ -167,8 +168,6 @@ public function form(array $form, FormStateInterface $form_state) { '#description' => $this->t('Select a value from form submitted fields or provide a custom static value'), ]; - $form['attachment']['filename']['#value'] = 'os2forms.xml'; - return $form; } diff --git a/os2forms.info.yml b/os2forms.info.yml index 2f0d080c..8dfea74f 100644 --- a/os2forms.info.yml +++ b/os2forms.info.yml @@ -30,4 +30,3 @@ dependencies: - taxonomy - editor - ckeditor - - webform_permissions_by_term diff --git a/os2forms.module b/os2forms.module index f539d0e4..866ca483 100644 --- a/os2forms.module +++ b/os2forms.module @@ -30,7 +30,7 @@ function os2forms_webform_admin_third_party_settings_form_alter(&$form, FormStat ]; /** @var \Drupal\webform\WebformThirdPartySettingsManagerInterface $third_party_settings_manager */ $third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager'); - $webform_entity_storage = \Drupal::service('entity.manager')->getStorage('webform'); + $webform_entity_storage = \Drupal::service('entity_type.manager')->getStorage('webform'); $form['third_party_settings']['os2forms']['migrate_to_category'] = [ '#type' => 'webform_select_other', '#title' => t('Migrate webforms to category'), @@ -304,3 +304,33 @@ function _os2forms_migrate_prepare_webform2pdf_get_template($nid, $source) { return $template; } + +/** + * Implements hook_menu_local_tasks_alter(). + */ +function os2forms_menu_local_tasks_alter(&$data, $route_name) { + $webform = \Drupal::routeMatch()->getParameter('webform'); + $routeName = \Drupal::routeMatch()->getRouteName(); + if ($webform && $routeName == $route_name) { + if (is_object($webform)) { + $webform = $webform->id(); + } + if (isset ($data['tabs'][0]['entity.webform.embed']) && !\Drupal::currentUser()->hasPermission('os2forms embed webform access') ) { + unset($data['tabs'][0]['entity.webform.embed']); + } + } +} + +/** + * Implements hook_module_implements_alter(). + */ +function os2forms_module_implements_alter(&$implementations, $hook) { + switch ($hook) { + // Move our hook_entity_type_alter() implementation to the end of the list. + case 'menu_local_tasks_alter': + $group = $implementations['os2forms']; + unset($implementations['os2forms']); + $implementations['os2forms'] = $group; + break; + } +} diff --git a/os2forms.permissions.yml b/os2forms.permissions.yml new file mode 100644 index 00000000..513f3bd7 --- /dev/null +++ b/os2forms.permissions.yml @@ -0,0 +1,4 @@ +os2forms embed webform access: + title: 'Access to Embed webform tab' + description: 'Permission for access to Embed webform tab.' + restrict access: TRUE