aboutsummaryrefslogtreecommitdiff
path: root/resources/vue/components/forum/topics
diff options
context:
space:
mode:
authorMurtaza Sultani <sultani@data-quest.de>2025-07-30 09:48:20 +0200
committerDavid Siegfried <david.siegfried@uni-vechta.de>2025-07-30 07:48:20 +0000
commit8b5da1acae37d9bc983394c3f27508c24024d69b (patch)
tree93360533b83eeff9f6c78e60cedadeb026bcad8e /resources/vue/components/forum/topics
parentd6ce47b2ea667524acafda4e539a81695158c07d (diff)
Resolve "Forum in freien Veranstaltungen sind nicht aufrufbar"issue-5760
Closes #5699 Merge request studip/studip!4371
Diffstat (limited to 'resources/vue/components/forum/topics')
-rw-r--r--resources/vue/components/forum/topics/CreateTopic.vue3
-rw-r--r--resources/vue/components/forum/topics/SelectTopicInput.vue1
-rw-r--r--resources/vue/components/forum/topics/ShowTopic.vue71
-rw-r--r--resources/vue/components/forum/topics/TopicItem.vue29
4 files changed, 96 insertions, 8 deletions
diff --git a/resources/vue/components/forum/topics/CreateTopic.vue b/resources/vue/components/forum/topics/CreateTopic.vue
index 03b7542..88a9ad9 100644
--- a/resources/vue/components/forum/topics/CreateTopic.vue
+++ b/resources/vue/components/forum/topics/CreateTopic.vue
@@ -2,7 +2,9 @@
<script setup>
import StudipIcon from "@/vue/components/StudipIcon.vue";
import {computed} from "vue";
+import {useForumConfig} from "../../../store/pinia/forum/ForumConfig";
+const forumConfig = useForumConfig();
const props = defineProps({
category_id: {
type: String,
@@ -24,6 +26,7 @@ const topicCreateURL = computed(() => {
<template>
<a
+ v-if="forumConfig.isModerator"
:href="topicCreateURL"
data-dialog="width=700"
:title="$gettext('Neues Thema anlegen')"
diff --git a/resources/vue/components/forum/topics/SelectTopicInput.vue b/resources/vue/components/forum/topics/SelectTopicInput.vue
index 24c0e00..0b4d0c1 100644
--- a/resources/vue/components/forum/topics/SelectTopicInput.vue
+++ b/resources/vue/components/forum/topics/SelectTopicInput.vue
@@ -2,7 +2,6 @@
import StudipIcon from "@/vue/components/StudipIcon.vue";
import {$gettext} from "@/assets/javascripts/lib/gettext";
import StudipSelect from "@/vue/components/StudipSelect.vue";
-
const selectedTopics = defineModel();
</script>
diff --git a/resources/vue/components/forum/topics/ShowTopic.vue b/resources/vue/components/forum/topics/ShowTopic.vue
new file mode 100644
index 0000000..0682fba
--- /dev/null
+++ b/resources/vue/components/forum/topics/ShowTopic.vue
@@ -0,0 +1,71 @@
+<script setup>
+import StudipDialog from "../../StudipDialog.vue";
+import {$gettext} from "../../../../assets/javascripts/lib/gettext";
+import StudipDateTime from "../../StudipDateTime.vue";
+
+defineEmits(['close']);
+
+defineProps({
+ topic: {
+ type: Object,
+ required: true,
+ }
+});
+
+const isOpen = defineModel('isOpen');
+</script>
+
+<template>
+ <StudipDialog
+ v-if="isOpen"
+ :title="$gettext('Informationen')"
+ :closeText="$gettext('Schließen')"
+ closeClass="cancel"
+ height="700"
+ width="600"
+ @close="isOpen = false"
+ >
+ <template #dialogContent>
+ <div class="forum">
+ <dl class="use-utility-classes">
+ <dt>{{ $gettext('Title') }}</dt>
+ <dd>{{ topic.name }}</dd>
+
+ <dt>{{ $gettext('Beschreibung') }}</dt>
+ <dd class="break-word">
+ <p>{{ topic.description }}</p>
+ </dd>
+
+ <template v-if="topic.category">
+ <dt>{{ $gettext('Kategorie') }}</dt>
+ <dd>{{ topic.category.name }}</dd>
+ </template>
+
+ <dt>{{ $gettext('Anzahl der Diskussionen') }}</dt>
+ <dd>{{ topic.meta.discussions_count }}</dd>
+
+ <dt>{{ $gettext('Anzahl der Beiträge') }}</dt>
+ <dd>{{ topic.meta.postings_count }}</dd>
+
+ <dt>{{ $gettext('Anzahl der Teilnehmenden am Thema') }}</dt>
+ <dd>{{ topic.meta.users_count }}</dd>
+
+ <dt>{{ $gettext('Letzte Aktivität') }}</dt>
+ <dd>
+ <template v-if="topic.meta.recent_activity">
+ <StudipDateTime :iso="topic.meta.recent_activity" />
+ </template>
+ <template v-else>
+ {{ $gettext('Keine Aktivität') }}
+ </template>
+ </dd>
+
+ <dt>{{ $gettext('Erstellt am') }}</dt>
+ <dd>
+ <StudipDateTime :iso="topic.mkdate" />
+ </dd>
+ </dl>
+ </div>
+ </template>
+ </StudipDialog>
+</template>
diff --git a/resources/vue/components/forum/topics/TopicItem.vue b/resources/vue/components/forum/topics/TopicItem.vue
index 82f573d..544c49d 100644
--- a/resources/vue/components/forum/topics/TopicItem.vue
+++ b/resources/vue/components/forum/topics/TopicItem.vue
@@ -5,7 +5,8 @@ import {useForumConfig} from "../../../store/pinia/forum/ForumConfig";
import StudipActionMenu from "@/vue/components/StudipActionMenu.vue";
import StudipIcon from "@/vue/components/StudipIcon.vue";
import StudipDateTime from "@/vue/components/StudipDateTime.vue";
-import {computed} from "vue";
+import {computed, ref} from "vue";
+import ShowTopic from "./ShowTopic.vue";
const emit = defineEmits(['swapTopic']);
const forumConfig = useForumConfig();
@@ -22,16 +23,26 @@ const props = defineProps({
});
const topicActionMenus = computed(() => {
+ let menu = [
+ { label: $gettext('Informationen'), icon: 'info', emit: 'show'},
+ ];
+
if (forumConfig.isModerator) {
- return [
+ menu.push(
{ label: $gettext('Thema bearbeiten'), icon: 'edit', emit: 'edit'},
{ label: $gettext('Thema löschen'), icon: 'trash', emit: 'delete'}
- ];
+ );
}
- return [];
+ return menu;
});
+const isTopicDialogOpen = ref(false);
+
+const displayTopic = () => {
+ isTopicDialogOpen.value = true;
+}
+
const editTopic = () => STUDIP.Dialog.fromURL(getTopicEditURL(props.topic.id),{ width: '700' });
const deleteTopic = () => STUDIP.Dialog.confirm(
@@ -66,13 +77,13 @@ const swapTopic = event => {
</a>
</div>
<div class="content">
- <div>
+ <div class="flex-1">
<div class="title-with-actions">
<div class="title-with-actions__content">
<a class="title-with-actions__link" :href="getTopicURL(topic.id)" :title="$gettext('Zum Thema')">
<span class="topic-title line-clamp-2">{{ topic.name }}</span>
<span
- v-if="topic.meta.postings_count > topic.meta.user_read_index"
+ v-if="!forumConfig.allowGuestAccess && topic.meta.postings_count > topic.meta.user_read_index"
class="unread-items-badge"
role="status"
aria-live="polite"
@@ -87,6 +98,7 @@ const swapTopic = event => {
<div class="title-with-actions__actions-xs">
<StudipActionMenu
:items="topicActionMenus"
+ @show="displayTopic"
@edit="editTopic"
@delete="deleteTopic"
/>
@@ -157,6 +169,7 @@ const swapTopic = event => {
<td class="actions">
<StudipActionMenu
:items="topicActionMenus"
+ @show="displayTopic"
@edit="editTopic"
@delete="deleteTopic"
/>
@@ -178,7 +191,7 @@ const swapTopic = event => {
</span>
<span
- v-if="topic.meta.postings_count > topic.meta.user_read_index"
+ v-if="!forumConfig.allowGuestAccess && topic.meta.postings_count > topic.meta.user_read_index"
class="unread-items-badge"
role="status"
aria-live="polite"
@@ -192,6 +205,7 @@ const swapTopic = event => {
<div class="actions">
<StudipActionMenu
:items="topicActionMenus"
+ @show="displayTopic"
@edit="editTopic"
@delete="deleteTopic"
/>
@@ -235,4 +249,5 @@ const swapTopic = event => {
</div>
</div>
</a>
+ <ShowTopic :topic="topic" v-model:isOpen="isTopicDialogOpen" />
</template>