From a6f88903ee3d2b0e86a6aeecd2274587d2f264b9 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms Date: Tue, 28 Nov 2023 09:07:03 +0000 Subject: prevent tabbing to disabled action menu links and in institute basic data, fixes #3010, fixes #3007 Closes #3010 and #3007 Merge request studip/studip!2039 --- app/controllers/institute/basicdata.php | 2 +- app/views/institute/basicdata/index.php | 4 +- lib/classes/ActionMenu.php | 7 +- lib/classes/LinkButton.class.php | 7 ++ resources/assets/stylesheets/scss/actionmenu.scss | 28 +++--- resources/vue/components/StudipActionMenu.vue | 108 ++++++++++++---------- resources/vue/mixins/MyCoursesMixin.js | 2 +- templates/shared/action-menu-single.php | 18 +++- templates/shared/action-menu.php | 25 ++++- 9 files changed, 121 insertions(+), 80 deletions(-) diff --git a/app/controllers/institute/basicdata.php b/app/controllers/institute/basicdata.php index 030749f..fb1ce96 100644 --- a/app/controllers/institute/basicdata.php +++ b/app/controllers/institute/basicdata.php @@ -76,7 +76,7 @@ class Institute_BasicdataController extends AuthenticatedController $this->question = (string) QuestionBox::create( $message, $this->url_for('institute/basicdata/delete/' . $i_view, $post), - $this->url_for('institute/basicdata/delete/' . $i_view, []) + $this->url_for('institute/basicdata/index/' . $i_view) ); } diff --git a/app/views/institute/basicdata/index.php b/app/views/institute/basicdata/index.php index 5d29572..abb0487 100644 --- a/app/views/institute/basicdata/index.php +++ b/app/views/institute/basicdata/index.php @@ -131,8 +131,8 @@ url_for('institute/basicdata/index/' . $i_view, ['i_trykill' => 1]), - !$may_delete ? ['disabled' => ''] : []) ?> + $controller->url_for('institute/basicdata/index/' . $i_view, ['i_trykill' => 1]), + !$may_delete ? ['disabled' => ''] : []) ?> 0): ?> diff --git a/lib/classes/ActionMenu.php b/lib/classes/ActionMenu.php index 613bea5..0822f72 100644 --- a/lib/classes/ActionMenu.php +++ b/lib/classes/ActionMenu.php @@ -143,6 +143,7 @@ class ActionMenu 'attributes' => $attributes, ]; } + $index = $index ?: md5($action['link'] . json_encode($action['attributes'])); $action['index'] = $index; //now insert it possibly at the desired position: @@ -326,10 +327,10 @@ class ActionMenu : self::TEMPLATE_FILE_MULTIPLE; ; $template = $GLOBALS['template_factory']->open($template_file); - $template->actions = array_map(function ($action) { - $disabled = isset($action['attributes']['disabled']) + $template->actions = array_map(function ($action): array { + $action['disabled'] = isset($action['attributes']['disabled']) && $action['attributes']['disabled'] !== false; - if ($disabled && $action['icon']) { + if ($action['disabled'] && $action['icon']) { $action['icon'] = $action['icon']->copyWithRole(Icon::ROLE_INACTIVE); } return $action; diff --git a/lib/classes/LinkButton.class.php b/lib/classes/LinkButton.class.php index 848d2e6..40044b6 100644 --- a/lib/classes/LinkButton.class.php +++ b/lib/classes/LinkButton.class.php @@ -35,6 +35,13 @@ class LinkButton extends Interactable */ public function __toString() { + if ( + isset($this->attributes['disabled']) + && $this->attributes['disabled'] !== false + ) { + return (string) Button::create($this->label, 'none', $this->attributes); + } + // add "button" to attribute @class if (empty($this->attributes['class'])) { $this->attributes['class'] = ''; diff --git a/resources/assets/stylesheets/scss/actionmenu.scss b/resources/assets/stylesheets/scss/actionmenu.scss index a25beed..dfc1fd1 100644 --- a/resources/assets/stylesheets/scss/actionmenu.scss +++ b/resources/assets/stylesheets/scss/actionmenu.scss @@ -102,21 +102,7 @@ $action-menu-shadow: 1px 1px 1px var(--dark-gray-color-60); display: block; } - &.action-menu-item-disabled { - > a, - > label { - &, - &:hover { - color: var(--dark-gray-color-80); - cursor: default; - } - } - } - - a img, - a svg, - .action-menu-no-icon, - input[type="image"] { + .action-menu-item-icon { display: inline-block; margin: 0 0.25em; vertical-align: middle; @@ -147,6 +133,18 @@ $action-menu-shadow: 1px 1px 1px var(--dark-gray-color-60); border-top: thin solid var(--dark-gray-color-45); margin: 4px 0; } + + &.action-menu-item-disabled { + > label, + > button { + color: var(--dark-gray-color-80); + cursor: default; + + &:hover { + color: var(--dark-gray-color-80); + } + } + } } &.is-open { diff --git a/resources/vue/components/StudipActionMenu.vue b/resources/vue/components/StudipActionMenu.vue index 434336f..918814c 100644 --- a/resources/vue/components/StudipActionMenu.vue +++ b/resources/vue/components/StudipActionMenu.vue @@ -10,28 +10,40 @@ {{ title }}