diff --git a/composer.json b/composer.json index 5f0a1e624e9a58fbb84f48a18f548b4dee58991d..a046fa40f2463a30859b3a9971c31bc3d3eeb449 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "drupal/core": "^8.9 || ^9.1", "drupal/ui_patterns": "^1.0", "drupal/ui_patterns_settings": "^1.0", - "openeuropa/oe_bootstrap_theme": "0.281020211203" + "openeuropa/oe_bootstrap_theme": "0.031120211510" }, "require-dev": { "composer/installers": "^1.11", diff --git a/modules/oe_whitelabel_helper/README.md b/modules/oe_whitelabel_helper/README.md index 82b94a61e29892ec2c08ada3b984b742f82c0fcc..70f129d332b098e790d9608d8f7f09708b57d3aa 100644 --- a/modules/oe_whitelabel_helper/README.md +++ b/modules/oe_whitelabel_helper/README.md @@ -18,6 +18,23 @@ Enables the [OpenEuropa Authentication](https://github.com/openeuropa/oe_authent Enables the [OpenEuropa Multilingual](https://github.com/openeuropa/oe_multilingual) module. The language switcher block is themed out of the box. +### Twig helpers +#### bcl_timeago filter +Filters a timestamp in "time ago" format, result can be something like "8 hours ago". +``` +node.getCreatedTime|bcl_timeago +``` +#### bcl_footer_links function +Processes oe_corporate_blocks links to make them compatible with BCL formatting. +``` +bcl_footer_links(links) +``` +#### bcl_block function +Builds the render array for a block. +``` +bcl_block(block) +``` + ## Requirements To be able to enable this module you will have to provide the dependent modules in your projects composer.json diff --git a/modules/oe_whitelabel_helper/src/Plugin/better_exposed_filters/sort/FloatEndSortWidget.php b/modules/oe_whitelabel_helper/src/Plugin/better_exposed_filters/sort/FloatEndSortWidget.php index cdda606a199e635533ae2c818aed1f1feb740242..bd4d89656993ac4b5895346957f73ce8ac56c6e2 100644 --- a/modules/oe_whitelabel_helper/src/Plugin/better_exposed_filters/sort/FloatEndSortWidget.php +++ b/modules/oe_whitelabel_helper/src/Plugin/better_exposed_filters/sort/FloatEndSortWidget.php @@ -23,7 +23,9 @@ class FloatEndSortWidget extends DefaultWidget { public function exposedFormAlter(array &$form, FormStateInterface $form_state) { parent::exposedFormAlter($form, $form_state); $form['#attributes']['class'][] = 'float-lg-end'; - $form['#attributes']['class'][] = 'd-md-block'; + $form['#attributes']['class'][] = 'd-none'; + $form['#attributes']['class'][] = 'd-md-flex'; + $form['#attributes']['class'][] = 'align-items-baseline'; } } diff --git a/modules/oe_whitelabel_helper/src/TwigExtension/TwigExtension.php b/modules/oe_whitelabel_helper/src/TwigExtension/TwigExtension.php index 532c8071e44a5c99edaf114a5bd36e0363592462..6a6ab8549cf75bb2f8b16405f8d15ab2996de6be 100644 --- a/modules/oe_whitelabel_helper/src/TwigExtension/TwigExtension.php +++ b/modules/oe_whitelabel_helper/src/TwigExtension/TwigExtension.php @@ -5,7 +5,9 @@ declare(strict_types = 1); namespace Drupal\oe_whitelabel_helper\TwigExtension; use Drupal\Core\Cache\CacheableDependencyInterface; +use Drupal\Core\StringTranslation\PluralTranslatableMarkup; use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; use Twig\TwigFunction; /** @@ -27,6 +29,15 @@ class TwigExtension extends AbstractExtension { $this->pluginManagerBlock = $plugin_manager_block; } + /** + * {@inheritdoc} + */ + public function getFilters(): array { + return [ + new TwigFilter('bcl_timeago', [$this, 'bclTimeAgo']), + ]; + } + /** * {@inheritdoc} */ @@ -37,6 +48,63 @@ class TwigExtension extends AbstractExtension { ]; } + /** + * Filters a timestamp in "time ago" format. + * + * @param string $timestamp + * Datetime to be parsed. + * + * @return \Drupal\Core\StringTranslation\PluralTranslatableMarkup + * The translated time ago string. + */ + public function bclTimeAgo(string $timestamp): PluralTranslatableMarkup { + $time = \Drupal::time()->getCurrentTime() - $timestamp; + $time_ago = new PluralTranslatableMarkup(0, 'N/A', 'N/A'); + $units = [ + 31536000 => [ + 'singular' => '@number year ago', + 'plural' => '@number years ago', + ], + 2592000 => [ + 'singular' => '@number month ago', + 'plural' => '@number months ago', + ], + 604800 => [ + 'singular' => '@number week ago', + 'plural' => '@number weeks ago', + ], + 86400 => [ + 'singular' => '@number day ago', + 'plural' => '@number days ago', + ], + 3600 => [ + 'singular' => '@number hour ago', + 'plural' => '@number hours ago', + ], + 60 => [ + 'singular' => '@number minute ago', + 'plural' => '@number minutes ago', + ], + 1 => [ + 'singular' => '@number second ago', + 'plural' => '@number seconds ago', + ], + ]; + + foreach ($units as $unit => $format) { + if ($time < $unit) { + continue; + } + + $number_of_units = floor($time / $unit); + $time_ago = \Drupal::translation() + ->formatPlural($number_of_units, $format['singular'], $format['plural'], ['@number' => $number_of_units]); + break; + } + + return $time_ago; + } + /** * Processes footer links to make them compatible with BCL formatting. * diff --git a/oe_whitelabel.theme b/oe_whitelabel.theme index 363986d03d091d52830c85413a94ccba475e4fb2..1941cd054fbb8da2cdf4dd0f6d99349b8425de0b 100644 --- a/oe_whitelabel.theme +++ b/oe_whitelabel.theme @@ -72,10 +72,15 @@ function oe_whitelabel_preprocess_links__language_block(&$variables) { */ function oe_whitelabel_form_facets_form_alter(&$form, FormStateInterface $form_state, $form_id) { if (isset($form['actions'])) { - $form['actions']['#attributes']['class'][] = 'mt-4'; + $action_classes = ['mt-4', 'd-grid', 'gap-4', 'd-md-block']; + foreach ($action_classes as $action_class) { + if (!isset($action_class, $form['actions']['#attributes']['class']) || !in_array($action_class, $form['actions']['#attributes']['class'], TRUE)) { + $form['actions']['#attributes']['class'][] = $action_class; + } + } } if (isset($form['actions']['submit'])) { - $submit_classes = ['me-2', 'btn', 'btn-primary']; + $submit_classes = ['me-md-3', 'btn', 'btn-primary', 'btn-md']; foreach ($submit_classes as $submit_class) { if (!isset($submit_class, $form['actions']['submit']['#attributes']['class']) || !in_array($submit_class, $form['actions']['submit']['#attributes']['class'], TRUE)) { $form['actions']['submit']['#attributes']['class'][] = $submit_class; @@ -83,7 +88,7 @@ function oe_whitelabel_form_facets_form_alter(&$form, FormStateInterface $form_s } } if (isset($form['actions']['reset'])) { - $reset_classes = ['btn', 'btn-secondary']; + $reset_classes = ['btn', 'btn-light', 'btn-md']; foreach ($reset_classes as $reset_class) { if (!isset($form['actions']['reset']['#attributes']['class']) || !in_array($reset_class, $form['actions']['reset']['#attributes']['class'], TRUE)) { $form['actions']['reset']['#attributes']['class'][] = $reset_class; diff --git a/templates/overrides/navigation/oe-corporate-blocks-ec-footer.html.twig b/templates/overrides/navigation/oe-corporate-blocks-ec-footer.html.twig index d61ecda3f9e78b1c6ffa7f96d0d9586d6718d8e6..ee165afbfa1a5abf064bcf7d59023316d7c0c035 100644 --- a/templates/overrides/navigation/oe-corporate-blocks-ec-footer.html.twig +++ b/templates/overrides/navigation/oe-corporate-blocks-ec-footer.html.twig @@ -108,7 +108,7 @@ 'links': bcl_footer_links(corporate_footer.class_navigation), } ] %} -<footer class="ec__footer bcl-footer"> +<footer class="ec__footer bcl-footer mt-4"> <div class="container"> {{ pattern('footer', { 'variant': 'ec', diff --git a/templates/overrides/navigation/oe-corporate-blocks-eu-footer.html.twig b/templates/overrides/navigation/oe-corporate-blocks-eu-footer.html.twig index 8e2fcfde9a458aabf7e41097e13bfd6e9585388f..4003bb752a549b78bba4b3e4957fb545dd89d03a 100644 --- a/templates/overrides/navigation/oe-corporate-blocks-eu-footer.html.twig +++ b/templates/overrides/navigation/oe-corporate-blocks-eu-footer.html.twig @@ -99,7 +99,7 @@ 'eu_institutions_links': bcl_footer_links(corporate_footer.institution_links) } ] %} -<footer class="bcl-footer"> +<footer class="bcl-footer mt-4"> <div class="container"> {{ pattern('footer', { 'variant': 'eu', diff --git a/templates/overrides/page/page.html.twig b/templates/overrides/page/page.html.twig index 6a8aabe895b5f2113dd745c5f3ccbb83927140ee..c54e90a088a3b4512954645be054df5150aedb1b 100644 --- a/templates/overrides/page/page.html.twig +++ b/templates/overrides/page/page.html.twig @@ -84,10 +84,10 @@ {% if page.content or page.content_top %} <div{{ attributes.addClass(grid_classes) }}> {% if page.content_top %} - <div class="mb-3 clearfix"> - {{ page.content_top }} - </div> - <hr class="d-none d-md-block mb-4"> + <div class="mb-3 clearfix"> + {{ page.content_top }} + </div> + <hr class="d-none d-md-block mt-4 mb-4-75"> {% endif %} {{ page.content }} diff --git a/templates/overrides/search/block--facets-form.html.twig b/templates/overrides/search/block--facets-form.html.twig index 3e5c4ab43a0cd851b06b2c797721220a8df0967f..749b340ad09473904d60aa997286d17c12eb2a40 100644 --- a/templates/overrides/search/block--facets-form.html.twig +++ b/templates/overrides/search/block--facets-form.html.twig @@ -37,7 +37,7 @@ 'url': content.actions['reset']['#url'].toString(), 'style': 'secondary', 'attributes': extra_attributes.addClass('ms-2') - }) + }) %} {% set actions = content.actions %} {% set actions = actions|merge({('reset'): reset}) %} @@ -49,7 +49,7 @@ 'label': label, 'heading': 4, 'extra_classes': "mb-lg-4", - }, + }, 'attributes': attributes.addClass('bcl-offcanvas'), 'offcanvas_id': 'bcl-offcanvas', 'body': content, @@ -61,6 +61,9 @@ 'extra_classes_header': "p-lg-0", 'with_trigger': true, 'toggle_button_label': label, - 'icon_name': 'sliders' + 'icon_position': 'before', + 'icon': { + 'name': 'filter', + }, }) }} {% endblock %} diff --git a/templates/overrides/search/facets-result-item.html.twig b/templates/overrides/search/facets-result-item.html.twig index d37b19301540b0ff4b959befde21ec09dddd21bc..1ee3de657de9ae5d7af08478ff81a8116e6ae037 100644 --- a/templates/overrides/search/facets-result-item.html.twig +++ b/templates/overrides/search/facets-result-item.html.twig @@ -16,8 +16,9 @@ * @ingroup themeable */ #} -{% set attributes = create_attribute({'class': ['me-2']}) %} +{% set attributes = create_attribute({'class': ['me-2', 'fs-6']}) %} {{ pattern('badge', { + 'background': 'light', 'label': value, 'assistive_text': assistive_text, 'dismissible': true, diff --git a/templates/overrides/search/pager.html.twig b/templates/overrides/search/pager.html.twig deleted file mode 100755 index aebfe1fff870fbfdc2dc459b162b058aef1084cf..0000000000000000000000000000000000000000 --- a/templates/overrides/search/pager.html.twig +++ /dev/null @@ -1,27 +0,0 @@ -{# -/** - * @file - * Template for a full pager. - */ -#} -{% if items %} - {% set previous = items.previous ? {'label': items.previous.text, 'path': items.previous.href } : {} %} - {% set next = items.next ? {'label': items.next.text, 'path': items.next.href } : {} %} - {% set pages = {} %} - {% for key, item in items.pages %} - {% set values = { 'label': key, 'path': item.href } %} - {% if current == key %} - {% set values = values|merge({ 'active': true }) %} - {% endif %} - {% set pages = pages|merge([values]) %} - {% endfor %} - {% block content %} - <hr class="mb-5"> - {{ pattern('pagination', { - items: pages, - alignment: 'center', - prev: previous, - next: next - }) }} - {% endblock %} -{% endif %} diff --git a/templates/overrides/search/views-mini-pager.html.twig b/templates/overrides/search/views-mini-pager.html.twig deleted file mode 100755 index c5600033eb1819819224a0c84a29308863a1cd88..0000000000000000000000000000000000000000 --- a/templates/overrides/search/views-mini-pager.html.twig +++ /dev/null @@ -1,21 +0,0 @@ -{# -/** - * @file - * Template for a mini pager. - */ -#} -{% if items %} - {% set previous = items.previous ? {'label': items.previous.text, 'path': items.previous.href } : {} %} - {% set next = items.next ? {'label': items.next.text, 'path': items.next.href } : {} %} - {% set pages = {} %} - {% set pages = pages|merge([{ 'label': items.current, 'disabled': true }]) %} - {% block content %} - <hr class="mb-5"> - {{ pattern('pagination', { - items: pages, - alignment: 'center', - prev: previous, - next: next, - }) }} - {% endblock %} -{% endif %} diff --git a/tests/src/Kernel/AuthenticationBlockTest.php b/tests/src/Kernel/AuthenticationBlockTest.php index eb6514f2b6727126b087a6a749a4ecbe5d25ff4a..3e07981eb407b84eac9f5d6a738ce99c64a94a38 100644 --- a/tests/src/Kernel/AuthenticationBlockTest.php +++ b/tests/src/Kernel/AuthenticationBlockTest.php @@ -71,7 +71,7 @@ class AuthenticationBlockTest extends KernelTestBase { $actual = $crawler->filter('.oe-authentication'); $this->assertCount(1, $actual); $icon = $actual->filter('svg'); - $this->assertSame('bi icon--xs', $icon->attr('class')); + $this->assertSame('ms-2-5 bi icon--xs', $icon->attr('class')); $use = $icon->filter('use'); $expected = '/themes/contrib/oe_bootstrap_theme/assets/icons/bootstrap-icons.svg#person-fill'; $this->assertSame($expected, $use->attr('xlink:href'));