diff --git a/src/Plugin/Block/ConsentBannerBlock.php b/src/Plugin/Block/ConsentBannerBlock.php new file mode 100644 index 0000000000000000000000000000000000000000..b8dd3abb6f49b46c792d52ddf70a914538bf7f52 --- /dev/null +++ b/src/Plugin/Block/ConsentBannerBlock.php @@ -0,0 +1,225 @@ +<?php + +namespace Drupal\ui_suite_dsfr_ft\Plugin\Block; + +use Drupal\Component\Utility\SortArray; +use Drupal\Core\Block\BlockBase; +use Drupal\Core\Form\FormStateInterface; + + +/** + * Provides a block with multiple menu rendered inside patterns. + * + * @Block( + * id = "ui_suite_dsfr_consent_banner", + * admin_label = @Translation("Consent banner"), + * category = @Translation("UI Suite DSFR"), + * ) + */ +class ConsentBannerBlock extends BlockBase { + + /** + * {@inheritdoc} + */ + public function blockForm($form, FormStateInterface $form_state) { + $form = parent::blockForm($form, $form_state); + $defaults = $this->getConfiguration(); + $form['title'] = [ + '#type' => 'textfield', + '#default_value' => $defaults['title'] ?? t('About cookies on sitename.fr'), + '#required' => TRUE, + '#title' => t('Title of modal'), + ]; + // Cannot use the checkboxes element cause the #states/required not working. + $form['content'] = [ + '#type' => 'textarea', + '#default_value' => $defaults['text'] ?? t('Welcome! We use cookies to improve your experience and the services available on this site. To find out more, visit the <a href="#">Personal data and cookies</a> page. You can, at any time, have control over the cookies you want to activate.'), + '#required' => TRUE, + '#title' => t('Body of modal'), + ]; + $form['modal_title'] = [ + '#type' => 'textfield', + '#default_value' => $defaults['modal_title'] ?? t('Cookie management panel'), + '#required' => TRUE, + '#title' => t('Title of modal'), + ]; + $form['modal_text'] = [ + '#type' => 'textarea', + '#default_value' => $defaults['modal_text'] ?? t('Preferences for all services'), + '#required' => TRUE, + '#title' => t('Body of modal'), + ]; + $form['services'] = [ + '#type' => 'details', + '#tree' => TRUE, + '#open' => TRUE, + '#title' => t('Services'), + // '#description' => $description, + '#prefix' => '<div id="ui-suite-dsfr-ft-services">', + '#suffix' => '</div>', + ]; + + $triggering_element = $form_state->getTriggeringElement(); + + $services = $defaults['services'] ?? []; + $default_count = 0; + if (!empty($services)) { + uasort($services, [SortArray::class, 'sortByWeightElement']); + $default_count = count($services); + } + $count_service = $form_state->get('count_server') ?? $default_count; + // Trigger ajax or default value. + if (!empty($triggering_element['#name']) && $triggering_element['#name'] === 'add_service') { + $count_service++; + $form_state->set('count_server', $count_service); + } + $delta_key_remove = -1; + if (!empty($triggering_element['#name']) && strpos($triggering_element['#name'], 'remove_service_') === 0) { + $triger_explode = explode('_', $triggering_element['#name']); + $delta_key_remove = $triger_explode[2] ?? -1; + } + $form['services']['table'] = [ + '#type' => 'table', + '#header' => [ + $this->t('Title'), + $this->t('ID'), + $this->t('Link title'), + $this->t('Remove'), + $this->t('Weight'), + ], + '#empty' => $this->t('No servers added.'), + '#tabledrag' => [ + [ + 'action' => 'order', + 'relationship' => 'sibling', + 'group' => 'table-sort-weight', + ], + ], + ]; + // Add our names fields. + for ($delta = 0; $delta < $count_service; $delta++) { + if ($delta_key_remove == $delta) { + continue; + } + $form['services']['table'][$delta]['#attributes']['class'][] = 'draggable'; + $form['services']['table'][$delta]['#weight'] = $services[$delta]['weight'] ?? 0; + $form['services']['table'][$delta]['title'] = [ + '#type' => 'textfield', + '#default_value' => $services[$delta]['title'] ?? '', + '#required' => TRUE, + ]; + $form['services']['table'][$delta]['id'] = [ + '#type' => 'textfield', + '#default_value' => $services[$delta]['id'] ?? '', + '#required' => TRUE, + ]; + $form['services']['table'][$delta]['link_title'] = [ + '#type' => 'textfield', + '#default_value' => $services[$delta]['link_title'] ?? '', + ]; + + $form['services']['table'][$delta]['remove'] = [ + '#type' => 'button', + '#value' => $this->t('Remove'), + '#name' => 'remove_service_' . $delta, + ]; + $form['services']['table'][$delta]['weight'] = [ + '#type' => 'weight', + '#title' => t('Weight'), + // '#title_display' => 'invisible', + '#default_value' => $services[$delta]['weight'] ?? $delta, + '#attributes' => [ + 'class' => [ + 'table-sort-weight', + ], + ], + ]; + } + if (!empty($triggering_element['#name']) && strpos($triggering_element['#name'], 'remove_service_') === 0) { + $count_service--; + if ($count_service < 0) { + $count_service = 0; + } + $form_state->set('count_server', $count_service); + } + // Button to add more names. + $form['services']['add_service'] = [ + '#type' => 'button', + '#name' => 'add_service', + '#value' => $this->t('Add service'), + '#ajax' => [ + 'callback' => [$this, 'ajaxService'], + 'wrapper' => 'ui-suite-dsfr-ft-services', + 'method' => 'replaceWith', + ], + ]; + + return $form; + } + + /** + * Generate bundle form options. + * + * @param array $form + * @param \Drupal\Core\Form\FormStateInterface $form_state + * + */ + public static function ajaxService(array &$form, FormStateInterface $form_state) { + // $form_state->setRebuild(); + return $form['settings']['services']; + } + + /** + * Ajax callback to add field. + * + * {@inheritdoc} + */ + public function ajaxAddService(array &$form, FormStateInterface $form_state) { + return $form['services']; + } + + /** + * {@inheritdoc} + */ + public function blockSubmit($form, FormStateInterface $form_state) { + $services = $form_state->getValue('services'); + $this->configuration['services'] = $services['table'] ?? []; + $this->configuration['title'] = $form_state->getValue('title'); + $this->configuration['content'] = $form_state->getValue('content'); + $this->configuration['modal_title'] = $form_state->getValue('modal_title'); + $this->configuration['modal_text'] = $form_state->getValue('modal_text'); + } + + /** + * {@inheritdoc} + */ + public function build() { + $services = $this->configuration['services']; + $pattern_services = []; + foreach ($services as $service) { + $pattern_services[] = ['title' => $service['title'], + 'attributes' => [ + 'id' => $service['id'], + 'title' => $service['link_title'], + ], + ]; + } + $build_pattern['menu'] = [ + '#type' => 'pattern', + '#id' => 'consent_banner', + '#fields' => [ + 'title' => $this->configuration['title'] ?? t('About cookies on sitename.fr'), + 'content' => $this->configuration['content'] ?? t('Welcome! We use cookies to improve your experience and the services available on this site. To find out more, visit the <a href="#">Personal data and cookies</a> page. You can, at any time, have control over the cookies you want to activate..'), + 'modal_title' => $this->configuration['modal_title'] ?? t('Cookie management panel'), + 'modal_text' => $this->configuration['modal_text'] ?? t('Preferences for all services'), + ], + '#settings' => [ + 'services' => $pattern_services, + ] + ]; + + return $build_pattern; + } + +} +