]> git.agnieray.net Git - galette.git/commitdiff
Merge branch 'hotfix/1.0.4' master
authorJohan Cwiklinski <johan@x-tnd.be>
Sat, 23 Mar 2024 20:04:12 +0000 (21:04 +0100)
committerJohan Cwiklinski <johan@x-tnd.be>
Sat, 23 Mar 2024 20:04:12 +0000 (21:04 +0100)
24 files changed:
.composer-require-checker.config.json
galette/docs/CHANGES
galette/lib/Galette/Controllers/AbstractController.php
galette/lib/Galette/Controllers/Crud/DynamicFieldsController.php
galette/lib/Galette/Controllers/Crud/MembersController.php
galette/lib/Galette/Core/Mailing.php
galette/lib/Galette/Core/Picture.php
galette/lib/Galette/Core/PluginControllerTrait.php
galette/lib/Galette/Entity/Adherent.php
galette/lib/Galette/Features/Replacements.php
galette/lib/Galette/Filters/MembersList.php
galette/templates/default/components/forms/groups.html.twig
galette/templates/default/elements/logged_user.html.twig
galette/templates/default/modals/mailing_preview.html.twig
galette/templates/default/pages/mailing_form.html.twig
galette/templates/default/pages/member_form.html.twig
galette/templates/default/pages/preferences.html.twig
phpstan.neon
tests/Galette/Controllers/tests/units/PdfController.php
tests/Galette/Core/tests/units/Preferences.php
tests/Galette/Entity/tests/units/PdfModel.php
tests/Galette/IO/tests/units/CsvIn.php
ui/semantic/galette/collections/menu.overrides
ui/semantic/galette/globals/site.overrides

index 3350ddec3db22ffcd7d3830ea659afcaf1ed4ee1..e98c422d0fb72a0653151cf0db737c7302105e1d 100644 (file)
@@ -93,6 +93,7 @@
     "DI\\autowire",
     "DI\\Container",
     "DI\\ContainerBuilder",
+    "DI\\Attribute\\Inject",
 
     "// Not detected, do not know why.",
     "Psr\\Http\\Server\\RequestHandlerInterface"
index 0c0f5ad4226eebf83475ab433dea646df7415d73..3e24efb46f8d375034c1da6b4bf8e4326025ccfb 100644 (file)
@@ -1,16 +1,29 @@
 Changes
 -------
 
+1.0.3 -> 1.0.4
+
+- Cannot access tabs definition on some resolutions
+- HTML Email preview shows source
+- Fix scrolling in emailing preview's modal
+- Few fixes on dependency injection usage
+- Number of show member automatically set to "all"
+- Groups modification not visually added on member form
+- Fix redirection when dynamic file does not exists
+- Menu horizontal scroll when name is too long
+- Should not select a member as its own parent
+- Add preferences footer in replacements
+
 1.0.2 -> 1.0.3
 
-* Logo in mail signature is not shown
-* Missing HTML editor for dynamic fields information field
-* Update and maintainance pages are no longer working
-* Do not throw events on mass edition
-* Make cache version dependent
-* Check preferences website is valid
-* Link to asso website from logo
-* Rework UI messages
+- Logo in mail signature is not shown
+- Missing HTML editor for dynamic fields information field
+- Update and maintainance pages are no longer working
+- Do not throw events on mass edition
+- Make cache version dependent
+- Check preferences website is valid
+- Link to asso website from logo
+- Rework UI messages
 
 1.0.1 -> 1.0.2
 
index 75bda451a3a1f95fb6352c07d8af87bacb1364ec..d5ff6c1ffa18ab67406ff5176559ad4f71f8ccaf 100644 (file)
 
 namespace Galette\Controllers;
 
+use Galette\Core\Db;
+use Galette\Core\History;
+use Galette\Core\I18n;
+use Galette\Core\L10n;
+use Galette\Core\Login;
+use Galette\Core\Logo;
+use Galette\Core\Plugins;
+use Galette\Core\Preferences;
+use Galette\Core\PrintLogo;
+use Galette\Entity\FieldsConfig;
+use Galette\Entity\ListsConfig;
 use Psr\Container\ContainerInterface;
+use RKA\Session;
+use Slim\Flash\Messages;
 use Slim\Psr7\Request;
 use Slim\Psr7\Response;
 use Slim\Routing\RouteContext;
 use Slim\Routing\RouteParser;
+use DI\Attribute\Inject;
+use Slim\Views\Twig;
 
 /**
  * Galette abstract controller
@@ -59,94 +74,95 @@ abstract class AbstractController
 {
     private $container;
     /**
-     * @var \Galette\Core\Db
+     * @var Db
      */
     #[Inject]
-    protected $zdb;
+    protected Db $zdb;
     /**
-     * @var \Galette\Core\Login
+     * @var Login
      */
     #[Inject]
-    protected $login;
+    protected Login $login;
     /**
-     * @var \Galette\Core\Preferences
+     * @var Preferences
      */
     #[Inject]
-    protected $preferences;
+    protected Preferences $preferences;
     /**
-     * @var \Slim\Views\Twig
+     * @var Twig
      */
-    protected $view;
+    #[Inject]
+    protected Twig $view;
     /**
-     * @var \Galette\Core\Logo
+     * @var Logo
      */
     #[Inject]
-    protected $logo;
+    protected Logo $logo;
     /**
-     * @var \Galette\Core\PrintLogo
+     * @var PrintLogo
      */
     #[Inject]
-    protected $print_logo;
+    protected PrintLogo $print_logo;
     /**
-     * @var \Galette\Core\Plugins
+     * @var Plugins
      */
     #[Inject]
-    protected $plugins;
+    protected Plugins $plugins;
     /**
-     * @var \Slim\Routing\RouteParser
+     * @var RouteParser
      */
     #[Inject]
-    protected $routeparser;
+    protected RouteParser $routeparser;
     /**
-     * @var \Galette\Core\History
+     * @var History
      */
     #[Inject]
-    protected $history;
+    protected History $history;
     /**
-     * @var \Galette\Core\I18n
+     * @var I18n
      */
     #[Inject]
-    protected $i18n;
+    protected I18n $i18n;
     /**
-     * @var \Galette\Core\L10n
+     * @var L10n
      */
     #[Inject]
-    protected $l10n;
+    protected L10n $l10n;
     /**
-     * Session
+     * @var Session
      */
     #[Inject("session")]
-    protected $session;
+    protected Session $session;
     /**
-     * @var \Slim\Flash\Messages
+     * @var Messages
      */
     #[Inject]
-    protected $flash;
+    protected Messages $flash;
     /**
-     * @var \Galette\Entity\FieldsConfig
+     * @var FieldsConfig
      */
     #[Inject]
-    protected $fields_config;
+    protected FieldsConfig $fields_config;
     /**
-     * @var \Galette\Entity\ListsConfig
+     * @var ListsConfig
      */
     #[Inject]
-    protected $lists_config;
+    protected ListsConfig $lists_config;
     /**
      * @var array
      */
     #[Inject("members_fields")]
-    protected $members_fields;
+    protected array $members_fields;
     /**
      * @var array
      */
     #[Inject("members_form_fields")]
-    protected $members_form_fields;
+    protected array $members_form_fields;
     /**
      * @var array
      */
     #[Inject("members_fields_cats")]
-    protected $members_fields_cats;
+    protected array $members_fields_cats;
 
     /**
      * Constructor
@@ -156,25 +172,6 @@ abstract class AbstractController
     public function __construct(ContainerInterface $container)
     {
         $this->container = $container;
-        //set various services we need
-        $this->zdb = $container->get('zdb');
-        $this->login = $container->get('login');
-        $this->preferences = $container->get('preferences');
-        $this->view = $container->get(\Slim\Views\Twig::class);
-        $this->logo = $container->get('logo');
-        $this->print_logo = $container->get('print_logo');
-        $this->routeparser = $container->get(RouteParser::class);
-        $this->history = $container->get('history');
-        $this->i18n = $container->get('i18n');
-        $this->l10n = $container->get('l10n');
-        $this->session = $container->get('session');
-        $this->flash = $container->get('flash');
-        $this->fields_config = $container->get('fields_config');
-        $this->lists_config = $container->get('lists_config');
-        $this->members_fields = $container->get('members_fields');
-        $this->members_form_fields = $container->get('members_form_fields');
-        $this->members_fields_cats = $container->get('members_fields_cats');
-        $this->plugins = $container->get('plugins');
     }
 
     /**
index e275bec0d2d218e5f8f573c54e4bbe8fcc548569..76b9522df70ce6c453f72636b26e15cc2a9006f1 100644 (file)
@@ -386,10 +386,17 @@ class DynamicFieldsController extends CrudController
                 _T("The file does not exists or cannot be read :(")
             );
 
+            $route_name = 'member';
+            if ($form_name == 'contrib') {
+                $route_name = 'contribution';
+            } elseif ($form_name == 'trans') {
+                $route_name = 'transaction';
+            }
+
             return $response
                 ->withHeader(
                     'Location',
-                    $this->routeparser->urlFor('member', ['id' => $id])
+                    $this->routeparser->urlFor($route_name, ['id' => (string)$id])
                 );
         }
     }
index 6891ee25da4d6b4592e907260358c826e5867ef9..8ee229f58904c249c45e6a2073eed11ae06c5e18 100644 (file)
@@ -1791,7 +1791,7 @@ class MembersController extends CrudController
         $navigate = array();
 
         if (isset($this->session->{$this->getFilterName()})) {
-            $filters = $this->session->{$this->getFilterName()};
+            $filters = clone $this->session->{$this->getFilterName()};
         } else {
             $filters = new MembersList();
         }
index d3b2802fc9d80c6af4dfe9128956e9b12af81e0c..e2344014d58341e623a48eff892a3558d1337966 100644 (file)
@@ -211,6 +211,7 @@ class Mailing extends GaletteMail
         $this->setRecipients($_recipients);
         $this->subject = $rs->mailing_subject;
         $this->message = $rs->mailing_body;
+        $this->html = $this->message != strip_tags($this->message) ? true : false;
         if ($rs->mailing_sender_name !== null || $rs->mailing_sender_address !== null) {
             $this->setSender(
                 $rs->mailing_sender_name,
index b0bcaef967dee8854d091c87af59c40cd5505718..8390a21c481fa709f64f50e6e787170031d85748 100644 (file)
@@ -303,7 +303,7 @@ class Picture implements FileInterface
     }
 
     /**
-     * Get image file contents
+     * Get image file content
      *
      * @return mixed
      */
index 2108bf125890b74288e9f23a8fc1ca5d8b2af57a..184a7e4db4c20ab2a8347da5f6eb0fa5c23f861f 100644 (file)
@@ -36,6 +36,8 @@
 
 namespace Galette\Core;
 
+use DI\Attribute\Inject;
+
 /**
  * Plugin controllers trait
  *
index e6d67b4d94282f039c845efa3ac25c9182bf9686..f8de8e0f03d78e69bf3de823d63f85501372e7a0 100644 (file)
@@ -1457,8 +1457,14 @@ class Adherent
                 }
                 break;
             case 'parent_id':
-                $this->$prop = ($value instanceof Adherent) ? (int)$value->id : (int)$value;
-                $this->loadParent();
+                $pid = ($value instanceof Adherent) ? (int)$value->id : (int)$value;
+                if ($pid === $this->id) {
+                    $this->errors[] = _T("A member cannot be its own parent!");
+                    $this->$prop = null;
+                } else {
+                    $this->$prop = $pid;
+                    $this->loadParent();
+                }
                 break;
         }
     }
index 8f25d717138c20b578edc2dff161b25cf4520217..391f1907fe50253c8b44c7574b3ad99338dd2891 100644 (file)
@@ -53,6 +53,7 @@ use Analog\Analog;
 use NumberFormatter;
 use PHPMailer\PHPMailer\PHPMailer;
 use Slim\Routing\RouteParser;
+use DI\Attribute\Inject;
 
 /**
  * Replacements feature
@@ -235,6 +236,10 @@ trait Replacements
             'login_uri'             => [
                 'title'     => _T("Galette's login URI"),
                 'pattern'   => '/{LOGIN_URI}/'
+            ],
+            'asso_footer' => [
+                'title'     => trim(trim(_T("Footer text:"), ':')),
+                'pattern'   => '/{ASSO_FOOTER}/'
             ]
         ];
     }
@@ -521,6 +526,7 @@ trait Replacements
                 //TRANS: see https://www.php.net/manual/datetime.format.php
                 'date_now'           => date(_T('Y-m-d')),
                 'login_uri'          => $this->preferences->getURL() . $this->routeparser->urlFor('login'),
+                'asso_footer'        => $this->preferences->pref_footer
             )
         );
 
index ee9ba98130c803a4ff5abba427c3d68379686f17..b95759dfd2ba1e09cc1639b610434dde18809dd0 100644 (file)
@@ -270,7 +270,7 @@ class MembersList extends Pagination
                     break;
                 default:
                     Analog::log(
-                        '[MembersList] Unable to set proprety `' . $name . '`',
+                        '[MembersList] Unable to set property `' . $name . '`',
                         Analog::WARNING
                     );
                     break;
index f59cbcdac5c5f01729a74c7cd97db0f741957ba3..6ed1424b9e37dacfab07c2870a87ac77a540eb75 100644 (file)
     <div class="ui large labels">
         {% for group in groups %}
             {% if member.isGroupMember(group.getName()) or member.isGroupManager(group.getName()) %}
-                <span class="ui label">
                 {% if member.isGroupMember(group.getName()) %}
+                <span class="ui label member">
                     <i class="ui tag icon tooltip" title="{{ _T("Member of group") }}" aria-hidden="true"></i>
                 {% endif %}
                 {% if member.isGroupManager(group.getName()) %}
+                <span class="ui label manager">
                     <i class="ui shield icon tooltip" title="{{ _T("Group manager") }}" aria-hidden="true"></i>
                 {% endif %}
                     {{ group.getName() }}
index b5366db09d836d2047ff327b8600412bf113419f..b7fb6ad96ab6c463d776b275f870d161673f4b69 100644 (file)
@@ -57,7 +57,9 @@
                     </div>
                 </div>
             </nav>
-            {% include "elements/modes.html.twig" %}
+            <div class="ui basic compact fitted segment">
+                {% include "elements/modes.html.twig" %}
+            </div>
         {% else %}
             {% set component_classes = "ui vertical centered tiny icon fluid menu" %}
             <nav id="logoutmenu" class="{{ component_classes }}" aria-label="{{ _T('User menu') }}">
index 88292c7ddd680b7d7da809ea0c8853254fe2ced1..f768f88b2c9a6a87a6421df24bca6badd5a3692c 100644 (file)
@@ -51,9 +51,9 @@
         <div class="ui top attached accordion-styled header">
             {{ _T("Mail body") }}
         </div>
-        <div class="ui bottom attached accordion-styled segment">
+        <div class="ui bottom attached accordion-styled{% if mode == 'ajax' %} scrolling{% endif %} segment">
     {% if mailing.html %}
-            {{ mailing.message }}
+            {{ mailing.message|raw }}
     {% else %}
             <pre>{{ mailing.wrapped_message|escape }}</pre>
     {% endif %}
index 68d73b57ff848878b994f26d3a89d63fda12c897..364b237541d432f0e9eeadd54d86c2479c485e89 100644 (file)
             {% include "elements/js/modal.js.twig" with {
                 modal_title_twig: _T("Mailing preview")|e("js"),
                 modal_content: "res",
-                modal_content_class: "scrolling",
+                modal_class: "scrolling",
                 modal_deny_only: true,
                 modal_cancel_text: _T("Close")|e("js")
             } %}
index e3cd2b3ac7c1adb82bd4510073e7ca5307da9945..cbd0e0bc4bceedb9e14bd64a5859edc800599187 100644 (file)
                         //remove actual groups
                         var _form = (_managed) ? 'managed' : 'user';
                         $('#' + _form + 'groups_form').empty();
-                        var _groups = new Array();
-                        var _groups_str = '<br/><strong>';
-                        if ( _managed ) {
-                            _groups_str += '{{ _T("Manager for:")|e('js') }}';
+                        var _existing_labels = $('#groups_field .labels').children().length;
+                        var _new_labels = 0;
+                        if ($('#groups_field .labels').length === 0) {
+                            var _labels_container = '<div class="ui large labels"></div>';
+                            $('#btngroups').before(_labels_container);
                         } else {
-                            _groups_str += '{{ _T("Member of:")|e('js') }}';
+                            if (_managed) {
+                                $('#groups_field .labels').find('.label.manager').remove();
+                            } else {
+                                $('#groups_field .labels').find('.label.member').remove();
+                            }
                         }
-                        _groups_str += '</strong> ';
+                        var _groups = new Array();
+                        var _groups_str = '';
 
                         $('li[id^="group_"]').each(function(){
                             //get group values
                                 _gid + '|' + _gname + '|' +
                                 '" name="' + _iname + '[]">'
                             );
-                            if ( _groups.length > 1 ) {
-                                _groups_str += ', ';
+                            if (_managed) {
+                                _groups_str += '<span class="ui orange basic label manager">';
+                                _groups_str += '<i class="ui shield icon tooltip" title="' + '{{ _T("Group manager")|e('js') }}' + '" aria-hidden="true"></i>';
+                            } else {
+                                _groups_str += '<span class="ui orange basic label member">';
+                                _groups_str += '<i class="ui tag icon tooltip" title="' + '{{ _T("Member of group")|e('js') }}' + '" aria-hidden="true"></i>';
                             }
                             _groups_str += _gname;
+                            _groups_str += '</span>';
+                            _new_labels += 1;
                         });
-                        $('#' + _form + 'groups').html(_groups_str);
+                        $('#groups_field .labels').append(_groups_str);
+                        var _modified = '<div class="ui yellow tiny message with-transition">{{ _T("Items in this list have been modified. Don't forget to save your changes.")|e('js') }}</div>';
+                        if (_existing_labels != _new_labels) {
+                            $('#groups_field').find('.message').remove();
+                            $('#groups_field').append(_modified);
+                        }
+                        $('.message.with-transition').transition('flash');
                         $('.groups-selection').modal('hide');
                     });
 
index 8459ffb88da3c01e10796c068b81ccbbc6635174..5473a221eb39ebdf39ff59d4fc512877861ee128 100644 (file)
@@ -2,7 +2,7 @@
 
 {% block content %}
         <form action="{{ url_for('store-preferences') }}" method="post" enctype="multipart/form-data" class="ui form">
-        <div class="ui stackable pointing inverted menu tabbed">
+        <div class="ui stackable pointing inverted wrapping centered fluid menu tabbed">
             <a href="{{ url_for('preferences') }}?tab=general" class="item{{ tab == 'general' ? ' active' }}" data-tab="general">{{ _T("General") }}</a>
             <a href="{{ url_for('preferences') }}?tab=social" class="item{{ tab == 'social' ? ' active' }}" data-tab="social">{{ _T("Social networks") }}</a>
             <a href="{{ url_for('preferences') }}?tab=parameters" class="item{{ tab == 'parameters' ? ' active' }}" data-tab="parameters">{{ _T("Parameters") }}</a>
index 8fe578f0cb531107d46cca498e880ca62485eea7..25f1d73ccdbf341e9cc3990c5d5dc43eb8b01638 100644 (file)
@@ -13,8 +13,9 @@ parameters:
         - galette/includes/
     dynamicConstantNames:
         - GALETTE_NIGHTLY
+    universalObjectCratesClasses:
+        - RKA\Session
     ignoreErrors:
         - '/Instantiated class XHProfRuns_Default not found/'
-        - '/Attribute class .*\\Inject does not exist./'
         - '/Cannot access property .* on .*ArrayObject.*/'
         - '/Access to an undefined property ArrayObject.*/'
index 00b79b07f8c4bec0a5e798273575ac6afb9aba8a..b8bafd838deabe9763234769f2ff4d6a83f6b88c 100644 (file)
@@ -141,6 +141,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         $test_response = $controller->storeModels($request, $response);
         $this->assertSame(
@@ -179,6 +180,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test with non-logged-in user
         $test_response = $controller->membersCards($request, $response, $this->adh->id);
@@ -243,6 +245,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test logged-in as superadmin
         $this->logSuperAdmin();
@@ -285,6 +288,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test with non-logged-in user
         $test_response = $controller->membersLabels($request, $response, $this->adh->id);
@@ -356,6 +360,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test logged-in as superadmin
         $this->logSuperAdmin();
@@ -397,6 +402,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test with non-logged-in user
         $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
@@ -447,6 +453,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test no selection
         $test_response = null;
@@ -504,6 +511,7 @@ class PdfController extends GaletteTestCase
 
         $response = new \Slim\Psr7\Response();
         $controller = new \Galette\Controllers\PdfController($this->container);
+        $this->container->injectOn($controller);
 
         //test not logged
         $test_response = $controller->contribution($request, $response, $this->contrib->id);
index 5b92752ef4acf36b309c09c12691f50ddb3c773a..ba6fa8fc7b14a523b468ad79bf1b84b1e03c1428 100644 (file)
@@ -626,7 +626,7 @@ class Preferences extends TestCase
     {
         $legend = $this->preferences->getLegend();
         $this->assertCount(2, $legend);
-        $this->assertCount(8, $legend['main']['patterns']);
+        $this->assertCount(9, $legend['main']['patterns']);
         $this->assertCount(10, $legend['socials']['patterns']);
         $this->assertSame(
             [
index 9221379cd1f79bb3750beb22395f0781fdcbe735..fe2718310026eea0652dacba86e400aefef4cf49 100644 (file)
@@ -127,7 +127,8 @@ class PdfModel extends GaletteTestCase
             'asso_website'       => '/{ASSO_WEBSITE}/',
             'asso_logo'          => '/{ASSO_LOGO}/',
             'date_now'           => '/{DATE_NOW}/',
-            'login_uri'          => '/{LOGIN_URI}/'
+            'login_uri'          => '/{LOGIN_URI}/',
+            'asso_footer'        => '/{ASSO_FOOTER}/',
         ];
         $this->assertSame($main_expected, $model->getPatterns());
 
@@ -363,7 +364,7 @@ Au milieu
         $this->assertArrayHasKey('member', $legend);
         $this->assertArrayHasKey('contribution', $legend);
 
-        $this->assertCount(8, $legend['main']['patterns']);
+        $this->assertCount(9, $legend['main']['patterns']);
         $this->assertCount(28, $legend['member']['patterns']);
         $this->assertTrue(isset($legend['member']['patterns']['label_dynfield_' . $adf->getId() . '_adh']));
         $this->assertCount(14, $legend['contribution']['patterns']);
index 9fdc169a925d2b89c9deddad7e9955044c2deccb..5b27481713c057f368af3821dfbfe5f1ba77514b 100644 (file)
@@ -140,6 +140,7 @@ class CsvIn extends GaletteTestCase
 
         //get csv model file to add data in
         $controller = new \Galette\Controllers\CsvController($this->container);
+        $this->container->injectOn($controller);
 
         $rfactory = new \Slim\Psr7\Factory\RequestFactory();
         $request = $rfactory->createRequest('GET', 'http://localhost/models/csv');
index e368d4e722956b34c5ada4d9756bc109bbaba92f..bcbbb4e0ee1aa84f764169d539d527a8322b34dd 100644 (file)
     color: @hoveredTextColor;
 }
 
+/* -----------------------------------------------
+      Wrapping pointing inverted tabbed menus
+------------------------------------------------ */
+.ui.wrapping.menu.tabbed .item:last-child,
+.ui.wrapping.menu.tabbed .item:last-of-type {
+  border-right-color: transparent !important;
+}
+.ui.wrapping.menu.tabbed .item::before {
+  right: 0;
+  left: auto;
+}
+
 /*------------------
      Pagination
 -------------------*/
index 14c9a9403f790983318741c826a5b0179c9c73c0..57ec3a4af5c515cd9ad0e2eada44c1bba2b9d74f 100644 (file)
@@ -173,6 +173,10 @@ aside .ui.vertical.menu {
   max-width: 100%;
 }
 
+aside .ui.small.compact.fluid.menu .ui.item {
+  max-width: 14.688rem;
+}
+
 .loggedin .content {
   .ui.horizontal.segments.header {
     flex-direction: row-reverse;