From 8b5da1acae37d9bc983394c3f27508c24024d69b Mon Sep 17 00:00:00 2001 From: Murtaza Sultani Date: Wed, 30 Jul 2025 09:48:20 +0200 Subject: Resolve "Forum in freien Veranstaltungen sind nicht aufrufbar" Closes #5699 Merge request studip/studip!4371 --- app/controllers/course/forum/BaseController.php | 64 ----------- app/controllers/course/forum/categories.php | 1 - app/controllers/course/forum/configs.php | 5 +- app/controllers/course/forum/discussions.php | 62 +++++----- app/controllers/course/forum/recent.php | 1 - app/controllers/course/forum/search.php | 1 - app/controllers/course/forum/subscriptions.php | 5 +- app/controllers/course/forum/topics.php | 20 ++-- lib/classes/Forum/BaseController.php | 72 ++++++++++++ lib/classes/JsonApi/RouteMap.php | 54 ++++++--- .../JsonApi/Routes/Forum/DiscussionPostings.php | 4 +- .../JsonApi/Routes/Forum/ForumAuthority.php | 14 +++ lib/classes/JsonApi/Routes/Forum/PostingShow.php | 1 + .../JsonApi/Schemas/Forum/PostingReaction.php | 9 +- lib/models/Forum/Category.php | 2 +- lib/models/Forum/Discussion.php | 2 +- lib/models/Forum/Topic.php | 2 +- resources/assets/javascripts/lib/dates.js | 4 +- resources/assets/stylesheets/scss/buttons.scss | 35 +++--- resources/assets/stylesheets/scss/forum.scss | 112 +++++++++--------- resources/assets/stylesheets/studip.scss | 4 +- resources/vue/apps/forum/categories/Index.vue | 3 +- resources/vue/apps/forum/discussions/Show.vue | 114 +++++------------- resources/vue/apps/forum/topics/Index.vue | 6 +- resources/vue/apps/forum/topics/Show.vue | 7 +- resources/vue/components/Dropdown.vue | 1 + resources/vue/components/UserAvatar.vue | 10 +- resources/vue/components/forum/ForumApp.vue | 13 ++- .../vue/components/forum/SubscriptionDropdown.vue | 127 +++++++++++---------- .../vue/components/forum/UserAvatarDropdown.vue | 1 + .../components/forum/categories/CategoryItem.vue | 31 +++-- .../vue/components/forum/categories/Create.vue | 3 + .../components/forum/categories/ShowCategory.vue | 64 +++++++++++ .../vue/components/forum/discussions/Create.vue | 3 + .../forum/discussions/DiscussionFooter.vue | 65 +++++++++++ .../forum/discussions/DiscussionIndex.vue | 43 +++---- resources/vue/components/forum/posts/Post.vue | 22 +++- .../components/forum/posts/PostReactionShow.vue | 5 + .../vue/components/forum/posts/PostReactions.vue | 45 +++++--- .../vue/components/forum/topics/CreateTopic.vue | 3 + .../components/forum/topics/SelectTopicInput.vue | 1 - .../vue/components/forum/topics/ShowTopic.vue | 71 ++++++++++++ .../vue/components/forum/topics/TopicItem.vue | 29 +++-- resources/vue/store/pinia/forum/ForumConfig.js | 18 +-- 44 files changed, 723 insertions(+), 436 deletions(-) delete mode 100644 app/controllers/course/forum/BaseController.php create mode 100644 lib/classes/Forum/BaseController.php create mode 100644 lib/classes/JsonApi/Routes/Forum/ForumAuthority.php create mode 100644 resources/vue/components/forum/categories/ShowCategory.vue create mode 100644 resources/vue/components/forum/discussions/DiscussionFooter.vue create mode 100644 resources/vue/components/forum/topics/ShowTopic.vue diff --git a/app/controllers/course/forum/BaseController.php b/app/controllers/course/forum/BaseController.php deleted file mode 100644 index 6525250..0000000 --- a/app/controllers/course/forum/BaseController.php +++ /dev/null @@ -1,64 +0,0 @@ -range_id = Context::getId(); - $this->is_moderator = CoreForum::isModerator($this->range_id); - $this->is_admin = CoreForum::isAdmin($this->range_id); - - $this->buildSidebar(); - - parent::before_filter($action, $args); - } - - protected function buildSidebar(): void - { - $actions = new ActionsWidget(); - - $actions->addLink( - _('Neue Diskussion starten'), - $this->url_for('course/forum/discussions/edit'), - Icon::create('add', Icon::ROLE_CLICKABLE, ['title' => _('Neue Diskussion starten')]) - )->asDialog('width=900;height=750'); - - if ($this->is_admin) { - $actions->addLink( - _('Forum verwalten'), - $this->url_for('course/forum/configs/edit'), - Icon::create('admin', Icon::ROLE_CLICKABLE, ['title' => _('Forum verwalten')]), - ['data-dialog' => 'width=500;height=300'] - ); - } - - Sidebar::Get()->addWidget($actions); - - $search = new SearchWidget($this->url_for('course/forum/search', [ - 'begin' => Request::int('begin'), - 'end' => Request::int('end') - ])); - - $search->addNeedle( - _('Suche nach Diskussionen oder Beiträge'), - 'q', - true - ); - - Sidebar::Get()->addWidget($search, 'forum_search'); - } -} diff --git a/app/controllers/course/forum/categories.php b/app/controllers/course/forum/categories.php index 8ed7950..df86089 100644 --- a/app/controllers/course/forum/categories.php +++ b/app/controllers/course/forum/categories.php @@ -1,5 +1,4 @@ user_id) { + throw new LoginException(); + } + if (! $this->is_admin) { throw new AccessDeniedException(); } diff --git a/app/controllers/course/forum/discussions.php b/app/controllers/course/forum/discussions.php index ee6e1d1..e6cec64 100644 --- a/app/controllers/course/forum/discussions.php +++ b/app/controllers/course/forum/discussions.php @@ -1,5 +1,4 @@ title); - $auth_user = User::findCurrent(); - $discussion->view_count += 1; $discussion->store(); - $posting_read = PostingRead::findOneBySQL( - "discussion_id = :discussion_id AND user_id = :user_id", - [ - 'discussion_id' => $discussion->getId(), - 'user_id' => User::findCurrent()->user_id - ] - ); - - $user_subscription = Subscription::findOneBySQL( - "subject = :subject AND subject_id = :subject_id AND user_id = :user_id", - [ - 'subject' => 'discussion', - 'subject_id' => $discussion->getId(), - 'user_id' => $auth_user->user_id - ] - ); + $auth = User::findCurrent(); + $posting_read = null; + $auth_user = []; + if ($auth) { + $posting_read = PostingRead::findOneBySQL( + "discussion_id = :discussion_id AND user_id = :user_id", + [ + 'discussion_id' => $discussion->getId(), + 'user_id' => $auth->user_id + ] + ); + + $user_subscription = Subscription::findOneBySQL( + "subject = :subject AND subject_id = :subject_id AND user_id = :user_id", + [ + 'subject' => 'discussion', + 'subject_id' => $discussion->getId(), + 'user_id' => $auth->user_id + ] + ); + + $auth_user = [ + 'id' => $auth->id, + 'username' => $auth->username, + 'name' => $auth->getFullName(), + 'avatar_url' => Avatar::getAvatar($auth->user_id)->getURL(Avatar::NORMAL), + 'subscription' => $user_subscription ? $user_subscription->toRawArray() : [] + ]; + } $category = $discussion->getCategory(); $tags = array_map(fn(TagDTO $tag) => $tag->toRawArray(), $discussion->tags); @@ -88,13 +98,7 @@ class Course_Forum_DiscussionsController extends Forum\BaseController $this->render_vue_app( Studip\VueApp::create('forum/discussions/Show') ->withProps([ - 'auth_user' => [ - 'id' => $auth_user->id, - 'username' => $auth_user->username, - 'name' => $auth_user->getFullName(), - 'avatar_url' => Avatar::getAvatar($auth_user->user_id)->getURL(Avatar::NORMAL), - 'subscription' => $user_subscription ? $user_subscription->toRawArray() : [] - ], + 'auth_user' => $auth_user, 'discussion' => [ ...$discussion->transformData(), 'topic' => $discussion->topic->toRawArray(), @@ -157,7 +161,7 @@ class Course_Forum_DiscussionsController extends Forum\BaseController $discussion = Discussion::find($discussion_id); } else { $discussion = new Discussion(); - $discussion->user_id = User::findCurrent()->user_id; + $discussion->user_id = $this->user_id; } $discussion->title = Request::get('title'); @@ -189,7 +193,7 @@ class Course_Forum_DiscussionsController extends Forum\BaseController 'range_id' => $this->range_id, 'discussion_id' => $discussion->discussion_id, 'content' => Markup::purifyHtml(Markup::markAsHtml(Request::get('content'))), - 'user_id' => User::findCurrent()->user_id + 'user_id' => $this->user_id ]); } else { TagRelation::deleteBySQL("range_id = ? AND range_type = 'forum'", [$discussion->discussion_id]); @@ -228,7 +232,7 @@ class Course_Forum_DiscussionsController extends Forum\BaseController throw new AccessDeniedException(); } - if (!$this->is_moderator && $discussion->user_id !== User::findCurrent()->user_id) { + if (!$this->is_moderator && $discussion->user_id !== $this->user_id) { throw new AccessDeniedException(); } diff --git a/app/controllers/course/forum/recent.php b/app/controllers/course/forum/recent.php index 7a117cd..3585c2c 100644 --- a/app/controllers/course/forum/recent.php +++ b/app/controllers/course/forum/recent.php @@ -1,5 +1,4 @@ user_id) { + throw new LoginException(); + } + Navigation::activateItem('course/forum/subscriptions'); } diff --git a/app/controllers/course/forum/topics.php b/app/controllers/course/forum/topics.php index b6a1307..ca22f89 100644 --- a/app/controllers/course/forum/topics.php +++ b/app/controllers/course/forum/topics.php @@ -1,5 +1,4 @@ name); - $user_subscription = Subscription::findOneBySQL( - "subject = :subject AND subject_id = :subject_id AND user_id = :user_id", - [ - 'subject' => 'topic', - 'subject_id' => $topic->getId(), - 'user_id' => User::findCurrent()->user_id - ] - ); + $user_subscription = null; + if ($this->user_id) { + $user_subscription = Subscription::findOneBySQL( + "subject = :subject AND subject_id = :subject_id AND user_id = :user_id", + [ + 'subject' => 'topic', + 'subject_id' => $topic->getId(), + 'user_id' => $this->user_id + ] + ); + } $this->render_vue_app( Studip\VueApp::create('forum/topics/Show') diff --git a/lib/classes/Forum/BaseController.php b/lib/classes/Forum/BaseController.php new file mode 100644 index 0000000..aa1bfd2 --- /dev/null +++ b/lib/classes/Forum/BaseController.php @@ -0,0 +1,72 @@ +range_id = Context::getId(); + $this->user_id = User::findCurrent()?->user_id; + + if ($this->user_id) { + $this->is_admin = CoreForum::isAdmin($this->range_id); + $this->is_moderator = CoreForum::isModerator($this->range_id); + } + + $this->buildSidebar(); + parent::before_filter($action, $args); + } + + protected function buildSidebar(): void + { + $actions = new ActionsWidget(); + + if ($this->user_id) { + $actions->addLink( + _('Neue Diskussion starten'), + $this->url_for('course/forum/discussions/edit'), + Icon::create('add', Icon::ROLE_CLICKABLE, ['title' => _('Neue Diskussion starten')]) + )->asDialog('width=900;height=750'); + } + + if ($this->is_admin) { + $actions->addLink( + _('Forum verwalten'), + $this->url_for('course/forum/configs/edit'), + Icon::create('admin', Icon::ROLE_CLICKABLE, ['title' => _('Forum verwalten')]), + ['data-dialog' => 'width=500;height=300'] + ); + } + + Sidebar::Get()->addWidget($actions); + + $search = new SearchWidget($this->url_for('course/forum/search', [ + 'begin' => Request::int('begin'), + 'end' => Request::int('end') + ])); + + $search->addNeedle( + _('Suche nach Diskussionen oder Beiträge'), + 'q', + true + ); + + Sidebar::Get()->addWidget($search, 'forum_search'); + } +} diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php index 235f4b6..47bd666 100644 --- a/lib/classes/JsonApi/RouteMap.php +++ b/lib/classes/JsonApi/RouteMap.php @@ -169,6 +169,7 @@ class RouteMap } $this->addUnauthenticatedTreeRoutes($group); + $this->addUnAuthenticatedForumRoutes($group); } private function getAuthenticator(): callable @@ -675,44 +676,31 @@ class RouteMap { $group->group('/courses/{range_id}', function ($forum) { $forum->get('/forum-configs', Routes\Forum\ConfigIndex::class); - $forum->get('/forum-categories', Routes\Forum\CategoryIndex::class); - $forum->get('/forum-discussions', Routes\Forum\DiscussionIndex::class); - $forum->get('/forum-topics', Routes\Forum\TopicIndex::class); $forum->get('/forum-subscriptions', Routes\Forum\SubscriptionIndex::class); }); - $group->group('/forum-subscriptions', function ($forum) { - $forum->post('', Routes\Forum\SubscriptionStore::class); - $forum->get('/{subscription_id}', Routes\Forum\SubscriptionShow::class); - $forum->delete('/{subscription_id}', Routes\Forum\SubscriptionDelete::class); - }); - $group->group('/forum-topics', function ($forum) { - $forum->get('/{topic_id}', Routes\Forum\TopicShow::class); - $forum->get('/{topic_id}/discussions', Routes\Forum\TopicDiscussions::class); $forum->patch('/sort', Routes\Forum\TopicUpdateSort::class); }); $group->group('/forum-categories', function ($forum) { - $forum->get('/{category_id}', Routes\Forum\CategoryShow::class); - $forum->get('/{category_id}/topics', Routes\Forum\CategoryTopics::class); $forum->patch('/sort', Routes\Forum\CategoryUpdateSort::class); }); + $group->group('/forum-subscriptions', function ($forum) { + $forum->post('', Routes\Forum\SubscriptionStore::class); + $forum->get('/{subscription_id}', Routes\Forum\SubscriptionShow::class); + $forum->delete('/{subscription_id}', Routes\Forum\SubscriptionDelete::class); + }); + $group->group('/forum-discussion-types', function ($forum) { $forum->get('', Routes\Forum\DiscussionTypeIndex::class); $forum->get('/{type_id}', Routes\Forum\DiscussionTypeShow::class); }); - $group->group('/forum-discussions', function ($forum) { - $forum->get('/{discussion_id}', Routes\Forum\DiscussionShow::class); - $forum->get('/{discussion_id}/postings', Routes\Forum\DiscussionPostings::class); - }); - $group->group('/forum-postings', function ($forum) { $forum->post('', Routes\Forum\PostingStore::class); $forum->get('/{posting_id}', Routes\Forum\PostingShow::class); - $forum->get('/{posting_id}/reactions', Routes\Forum\PostingReactions::class); $forum->patch('/{posting_id}', Routes\Forum\PostingUpdate::class); $forum->delete('/{posting_id}', Routes\Forum\PostingDelete::class); }); @@ -724,6 +712,34 @@ class RouteMap }); } + private function addUnAuthenticatedForumRoutes(RouteCollectorProxy $group): void + { + $group->group('/courses/{range_id}', function ($forum) { + $forum->get('/forum-categories', Routes\Forum\CategoryIndex::class); + $forum->get('/forum-discussions', Routes\Forum\DiscussionIndex::class); + $forum->get('/forum-topics', Routes\Forum\TopicIndex::class); + }); + + $group->group('/forum-topics', function ($forum) { + $forum->get('/{topic_id}', Routes\Forum\TopicShow::class); + $forum->get('/{topic_id}/discussions', Routes\Forum\TopicDiscussions::class); + }); + + $group->group('/forum-categories', function ($forum) { + $forum->get('/{category_id}', Routes\Forum\CategoryShow::class); + $forum->get('/{category_id}/topics', Routes\Forum\CategoryTopics::class); + }); + + $group->group('/forum-discussions', function ($forum) { + $forum->get('/{discussion_id}', Routes\Forum\DiscussionShow::class); + $forum->get('/{discussion_id}/postings', Routes\Forum\DiscussionPostings::class); + }); + + $group->group('/forum-postings', function ($forum) { + $forum->get('/{posting_id}/reactions', Routes\Forum\PostingReactions::class); + }); + } + private function addAuthenticatedStockImagesRoutes(RouteCollectorProxy $group): void { $group->get('/stock-images', Routes\StockImages\StockImagesIndex::class); diff --git a/lib/classes/JsonApi/Routes/Forum/DiscussionPostings.php b/lib/classes/JsonApi/Routes/Forum/DiscussionPostings.php index 8b64021..b40e4c4 100644 --- a/lib/classes/JsonApi/Routes/Forum/DiscussionPostings.php +++ b/lib/classes/JsonApi/Routes/Forum/DiscussionPostings.php @@ -40,7 +40,9 @@ class DiscussionPostings extends JsonApiController $postings = $discussion->postings ?? \SimpleORMapCollection::createFromArray([]); - PostingRead::updateUserReadPoint($user->user_id, $discussion->discussion_id, count($postings)); + if ($user) { + PostingRead::updateUserReadPoint($user->user_id, $discussion->discussion_id, count($postings)); + } return $this->getPaginatedContentResponse( $postings->limit(...$this->getOffsetAndLimit()), diff --git a/lib/classes/JsonApi/Routes/Forum/ForumAuthority.php b/lib/classes/JsonApi/Routes/Forum/ForumAuthority.php new file mode 100644 index 0000000..0a0017f --- /dev/null +++ b/lib/classes/JsonApi/Routes/Forum/ForumAuthority.php @@ -0,0 +1,14 @@ +isAccessibleToUser($user?->id); + } +} diff --git a/lib/classes/JsonApi/Routes/Forum/PostingShow.php b/lib/classes/JsonApi/Routes/Forum/PostingShow.php index c062169..730dc4f 100644 --- a/lib/classes/JsonApi/Routes/Forum/PostingShow.php +++ b/lib/classes/JsonApi/Routes/Forum/PostingShow.php @@ -12,6 +12,7 @@ class PostingShow extends JsonApiController { protected $allowedIncludePaths = [ \JsonApi\Schemas\Forum\Posting::REL_DISCUSSION, + \JsonApi\Schemas\Forum\Posting::REL_AUTHOR, \JsonApi\Schemas\Forum\Posting::REL_POSTING, \JsonApi\Schemas\Forum\Posting::REL_OPENGRAPH_URLS, \JsonApi\Schemas\Forum\Posting::REL_REACTIONS, diff --git a/lib/classes/JsonApi/Schemas/Forum/PostingReaction.php b/lib/classes/JsonApi/Schemas/Forum/PostingReaction.php index 9441b63..4104e01 100644 --- a/lib/classes/JsonApi/Schemas/Forum/PostingReaction.php +++ b/lib/classes/JsonApi/Schemas/Forum/PostingReaction.php @@ -55,14 +55,15 @@ class PostingReaction extends SchemaProvider return $relationships; } - private function addUserRelationship(array $relationships, $discussion, bool $withUser = false) + private function addUserRelationship(array $relationships, $postingReaction, bool $withUser = false) { - if ($withUser) { + $user = $postingReaction->user; + if ($withUser && $user) { $relationships[self::REL_USER] = [ self::RELATIONSHIP_LINKS => [ - Link::RELATED => $this->createLinkToResource($discussion->user) + Link::RELATED => $this->createLinkToResource($user) ], - self::RELATIONSHIP_DATA => $discussion->user + self::RELATIONSHIP_DATA => $user ]; } diff --git a/lib/models/Forum/Category.php b/lib/models/Forum/Category.php index 73c96e1..6ee52c8 100644 --- a/lib/models/Forum/Category.php +++ b/lib/models/Forum/Category.php @@ -80,7 +80,7 @@ class Category extends \SimpleORMap WHERE `forum_topics`.`category_id` = :category_id", [ 'category_id' => $this->category_id, - 'user_id' => User::findCurrent()->user_id + 'user_id' => User::findCurrent()?->user_id ] ); } diff --git a/lib/models/Forum/Discussion.php b/lib/models/Forum/Discussion.php index 96bd85a..de82422 100644 --- a/lib/models/Forum/Discussion.php +++ b/lib/models/Forum/Discussion.php @@ -242,7 +242,7 @@ class Discussion extends SimpleORMap public function getMetaData(int $last_visit = 0): array { - $user_id = \User::findCurrent()->user_id; + $user_id = User::findCurrent()?->user_id; if (!$last_visit) { $plugin_id = \PluginEngine::getPlugin(\CoreForum::class)->getPluginId(); diff --git a/lib/models/Forum/Topic.php b/lib/models/Forum/Topic.php index a6b298f..4ea8361 100644 --- a/lib/models/Forum/Topic.php +++ b/lib/models/Forum/Topic.php @@ -141,7 +141,7 @@ class Topic extends SimpleORMap WHERE `forum_discussions`.`topic_id` = :topic_id", [ 'topic_id' => $this->topic_id, - 'user_id' => User::findCurrent()->user_id + 'user_id' => User::findCurrent()?->user_id ] ); } diff --git a/resources/assets/javascripts/lib/dates.js b/resources/assets/javascripts/lib/dates.js index ccb67a8..04b2ec5 100644 --- a/resources/assets/javascripts/lib/dates.js +++ b/resources/assets/javascripts/lib/dates.js @@ -52,7 +52,9 @@ const Dates = { }).done(function() { $('.topic_' + termin_id + '_' + topic_id).remove(); }); - } + }, + stringToUnixTimestamp: date => ((new Date(date)).getTime() / 1000), + unixTimestampToISO: timestamp => new Date(timestamp * 1000).toISOString() }; export default Dates; diff --git a/resources/assets/stylesheets/scss/buttons.scss b/resources/assets/stylesheets/scss/buttons.scss index 0f39cb7..63457fd 100644 --- a/resources/assets/stylesheets/scss/buttons.scss +++ b/resources/assets/stylesheets/scss/buttons.scss @@ -98,8 +98,23 @@ button.button { } } +@mixin button-base() { + color: var(--base-color); + transition: color var(--transition-duration); + + &:hover, + &:active, + &.active, + &[aria-pressed="true"] { + color: var(--active-color); + text-decoration: none; + } +} + button, .button { + @include button-base; + &.as-link, &.styleless, &.undecorated, @@ -114,22 +129,10 @@ button, margin: 0; padding: 0; } +} - &.as-link, - &.undecorated[formaction] { - color: var(--base-color); - transition: color var(--transition-duration); - - &:hover, - &:active { - color: var(--active-color); - text-decoration: none; - } - - &[disabled] { - pointer-events: none; - } - } +.button-base { + @include button-base; } label { @@ -203,4 +206,4 @@ $square-button-size: 130px; color: var(--color--highlight-hover); border-color: var(--color--highlight); } -} \ No newline at end of file +} diff --git a/resources/assets/stylesheets/scss/forum.scss b/resources/assets/stylesheets/scss/forum.scss index 72c66a9..68a5967 100644 --- a/resources/assets/stylesheets/scss/forum.scss +++ b/resources/assets/stylesheets/scss/forum.scss @@ -63,7 +63,7 @@ $card-max-width: 300px; justify-content: end; padding: 0; &:hover { - color: var(--color--highlight); + color: var(--active-color); } } } @@ -304,6 +304,8 @@ $card-max-width: 300px; p { margin-top: 5px; color: var(--color--font-secondary); + word-break: break-word; + overflow-wrap: break-word; } } @@ -318,6 +320,8 @@ $card-max-width: 300px; p { margin-top: 5px; color: var(--color--font-secondary); + word-break: break-word; + overflow-wrap: break-word; } .discussion-category { @@ -437,6 +441,8 @@ $card-max-width: 300px; p { margin-top: 5px; color: var(--color--font-secondary); + word-break: break-word; + overflow-wrap: break-word; } &__content { @@ -500,9 +506,8 @@ $card-max-width: 300px; } &__text { - p { - color: var(--color--font-primary); - } + word-break: break-word; + overflow-wrap: break-word; img { max-width: 100% !important; @@ -765,7 +770,7 @@ $card-max-width: 300px; &:hover, &:focus, - &.active { + &[aria-ppressed="true"] { position: relative; z-index: 1; @@ -1094,60 +1099,58 @@ $card-max-width: 300px; .dropdown__items { max-width: 300px; + li { - display: flex; - align-items: center; - gap: 15px; - padding: 10px 15px; + padding: 0; - .subscription-option { - flex: 1; + button { + cursor: pointer; + background: none; + border: none; + width: 100%; display: flex; align-items: center; - justify-content: space-between; - gap: 5px; - } + gap: 15px; + padding: 10px 15px; - .option-title { - font-size: 14px; - color: var(--color--font-primary); - font-weight: 400; - margin: 0; - } + &:disabled { + cursor: not-allowed; + opacity: 0.5; + } - p { - color: var(--color--font-secondary); - margin-top: 6px; - font-size: small; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - } + .subscription-option { + flex: 1; + display: flex; + align-items: center; + justify-content: space-between; + gap: 5px; + } - &.all { - background-color: $green-20; - cursor: default; - } + .option-title { + font-size: 14px; + font-weight: 400; + margin: 0; + } - &.replies_only { - background-color: $activity-color-20; - cursor: default; - } + &.all { + background-color: $green-20; + cursor: default; + } - &.none { - background-color: $dark-gray-color-20; - cursor: default; - } + &.replies_only { + background-color: $activity-color-20; + cursor: default; + } - &.--active { - background-color: $dark-gray-color-10; - cursor: default; - } + &.none { + background-color: $dark-gray-color-20; + cursor: default; + } - &.--disabled { - opacity: 0.5; - cursor: not-allowed; + &.active { + background-color: $dark-gray-color-10; + cursor: default; + } } } } @@ -1301,6 +1304,10 @@ $card-max-width: 300px; .color-font-secondary { color: var(--color--font-secondary); } + + .break-word { + word-break: break-word; + } } .vs__actions { @@ -1468,6 +1475,7 @@ $card-max-width: 300px; .tab { &__buttons { display: flex; + flex-wrap: wrap; gap: 10px; border-bottom: 2px solid var(--color--divider); } @@ -1475,8 +1483,6 @@ $card-max-width: 300px; &__button { label { position: relative; - transition: color 0.3s ease; - color: var(--color--highlight); font-weight: bold; padding: 6px 12px; cursor: pointer; @@ -1485,15 +1491,13 @@ $card-max-width: 300px; gap: 5px; &:hover { - color: var(--color--highlight-hover); - &::after { background-color: var(--color--focus); } } &:hover, - &.is-checked { + &.active { &::after { content: ''; position: absolute; @@ -1504,7 +1508,7 @@ $card-max-width: 300px; } } - &.is-checked { + &.active { &::after { background-color: var(--color--highlight); } diff --git a/resources/assets/stylesheets/studip.scss b/resources/assets/stylesheets/studip.scss index f0f17d4..284734c 100644 --- a/resources/assets/stylesheets/studip.scss +++ b/resources/assets/stylesheets/studip.scss @@ -788,8 +788,8 @@ input.allow-plaintext-toggle { display: flex; align-items: center; justify-content: center; - background: transparent; - border: transparent; + background: none; + border: none; height: 20px; width: 20px; cursor: pointer; diff --git a/resources/vue/apps/forum/categories/Index.vue b/resources/vue/apps/forum/categories/Index.vue index 93977cf..647a6a5 100644 --- a/resources/vue/apps/forum/categories/Index.vue +++ b/resources/vue/apps/forum/categories/Index.vue @@ -122,7 +122,7 @@ const swapCategory = (categoryId, step) => {
- +