feat: discussions

This commit is contained in:
Jannat Patel
2024-01-15 23:26:31 +05:30
parent bcee74ce77
commit 3a5977a718
14 changed files with 771 additions and 336 deletions

View File

@@ -165,6 +165,14 @@
</div>
</div>
</div>
<div class="mt-20">
<Discussions
v-if="allowDiscussions()"
:title="'Questions'"
:doctype="'Course Lesson'"
:docname="lesson.data.name"
/>
</div>
</div>
<div class="sticky top-10">
<div class="bg-gray-50 p-5 border-b-2">
@@ -194,13 +202,13 @@
<script setup>
import { createResource, Breadcrumbs, Button } from 'frappe-ui'
import { computed, watch, onBeforeMount, onUnmounted, inject } from 'vue'
import { useStorage } from '@vueuse/core'
import CourseOutline from '@/components/CourseOutline.vue'
import UserAvatar from '@/components/UserAvatar.vue'
import { useRoute } from 'vue-router'
import MarkdownIt from 'markdown-it'
import { ChevronLeft, ChevronRight } from 'lucide-vue-next'
import Quiz from '@/components/Quiz.vue'
import Discussions from '@/components/Discussions.vue'
const user = inject('$user')
const route = useRoute()
@@ -327,6 +335,14 @@ const getId = (block) => {
const redirectToLogin = () => {
window.location.href = `/login?redirect_to=/courses/${props.courseName}/learn/${route.params.chapterNumber}-${route.params.lessonNumber}`
}
const allowDiscussions = () => {
return (
course.data?.membership ||
user.data?.is_moderator ||
user.data?.is_instructor
)
}
</script>
<style>
.avatar-group {

View File

@@ -0,0 +1,139 @@
<template>
<div class="h-screen">
<header
class="sticky top-0 z-10 flex items-center justify-between border-b bg-white px-3 py-2.5 sm:px-5"
>
<Breadcrumbs class="h-7" :items="breadcrumbs" />
</header>
<div class="p-5">
<div class="grid grid-cols-5 gap-5">
<div class="flex items-center border py-2 px-3 rounded-md">
<div class="p-15 bg-gray-100">
<BookOpen class="w-18 h-18 stroke-1.5" />
</div>
<div>
<div>
{{ courseCount.data }}
</div>
<div>
{{ __('Published Courses') }}
</div>
</div>
</div>
<div class="border py-2 px-3 rounded-md">
<BookOpenCheck class="w-4 h-4 stroke-1.5" />
<div>
{{ enrollmentCount.data }}
</div>
<div>
{{ __('Course Enrollments') }}
</div>
</div>
<div class="border py-2 px-3 rounded-md">
<LogIn class="w-4 h-4 stroke-1.5" />
<div>
{{ userCount.data }}
</div>
<div>
{{ __('Total Signups') }}
</div>
</div>
<div class="border py-2 px-3 rounded-md">
<FileCheck class="w-4 h-4 stroke-1.5" />
<div>
{{ coursesCompleted.data }}
</div>
<div>
{{ __('Courses Completed') }}
</div>
</div>
<div class="border py-2 px-3 rounded-md">
<FileCheck2 class="w-4 h-4 stroke-1.5" />
<div>
{{ lessonsCompleted.data }}
</div>
<div>
{{ __('Lessons Completed') }}
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { createResource, Breadcrumbs } from 'frappe-ui'
import { computed } from 'vue'
import {
BookOpen,
LogIn,
FileCheck,
FileCheck2,
BookOpenCheck,
} from 'lucide-vue-next'
const breadcrumbs = computed(() => {
return [
{
label: 'Statistics',
route: {
name: 'Statistics',
},
},
]
})
const enrollmentCount = createResource({
url: 'frappe.client.get_count',
params: {
doctype: 'LMS Enrollment',
},
auto: true,
cache: ['enrollment_count'],
})
const courseCount = createResource({
url: 'frappe.client.get_count',
params: {
doctype: 'LMS Course',
filters: {
published: 1,
upcoming: 0,
},
},
auto: true,
cache: ['course_count'],
})
const userCount = createResource({
url: 'frappe.client.get_count',
params: {
doctype: 'User',
filters: {
enabled: 1,
},
},
auto: true,
cache: ['user_count'],
})
const coursesCompleted = createResource({
url: 'frappe.client.get_count',
params: {
doctype: 'LMS Enrollment',
filters: {
progress: ['like', '%100%'],
},
},
auto: true,
cache: ['courses_completed'],
})
const lessonsCompleted = createResource({
url: 'frappe.client.get_count',
params: {
doctype: 'LMS Course Progress',
},
auto: true,
cache: ['lessons_completed'],
})
</script>