fix: mobile and lesson issues
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="batch.data" class="shadow rounded-md p-5" style="width: 300px">
|
<div v-if="batch.data" class="shadow rounded-md p-5 lg:w-72">
|
||||||
<Badge
|
<Badge
|
||||||
v-if="batch.data.seat_count && seats_left > 0"
|
v-if="batch.data.seat_count && seats_left > 0"
|
||||||
theme="green"
|
theme="green"
|
||||||
|
|||||||
@@ -29,15 +29,42 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { getSidebarLinks } from '../utils'
|
import { getSidebarLinks } from '../utils'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import { computed, inject } from 'vue'
|
import { computed } from 'vue'
|
||||||
import { sessionStore } from '@/stores/session'
|
import { sessionStore } from '@/stores/session'
|
||||||
|
import { usersStore } from '@/stores/user'
|
||||||
|
import { LogOut, LogIn, UserRound } from 'lucide-vue-next'
|
||||||
|
|
||||||
const { logout, user } = sessionStore()
|
const { logout, user, username } = sessionStore()
|
||||||
let { isLoggedIn } = sessionStore()
|
let { isLoggedIn } = sessionStore()
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
let { userResource } = usersStore()
|
||||||
|
|
||||||
const tabs = computed(() => {
|
const tabs = computed(() => {
|
||||||
return getSidebarLinks()
|
let links = getSidebarLinks()
|
||||||
|
|
||||||
|
if (user) {
|
||||||
|
links.push({
|
||||||
|
label: 'Profile',
|
||||||
|
icon: UserRound,
|
||||||
|
activeFor: [
|
||||||
|
'Profile',
|
||||||
|
'ProfileAbout',
|
||||||
|
'ProfileCertification',
|
||||||
|
'ProfileEvaluator',
|
||||||
|
'ProfileRoles',
|
||||||
|
],
|
||||||
|
})
|
||||||
|
links.push({
|
||||||
|
label: 'Log out',
|
||||||
|
icon: LogOut,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
links.push({
|
||||||
|
label: 'Log in',
|
||||||
|
icon: LogIn,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return links
|
||||||
})
|
})
|
||||||
|
|
||||||
let isActive = (tab) => {
|
let isActive = (tab) => {
|
||||||
@@ -50,6 +77,13 @@ const handleClick = (tab) => {
|
|||||||
logout.submit().then(() => {
|
logout.submit().then(() => {
|
||||||
isLoggedIn = false
|
isLoggedIn = false
|
||||||
})
|
})
|
||||||
|
else if (tab.label == 'Profile')
|
||||||
|
router.push({
|
||||||
|
name: 'Profile',
|
||||||
|
params: {
|
||||||
|
username: userResource.data?.username,
|
||||||
|
},
|
||||||
|
})
|
||||||
else router.push({ name: tab.to })
|
else router.push({ name: tab.to })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,17 +11,23 @@
|
|||||||
<div class="my-3">
|
<div class="my-3">
|
||||||
{{ batch.data.description }}
|
{{ batch.data.description }}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center justify-between w-1/2">
|
<div
|
||||||
|
class="flex flex-col gap-2 lg:gap-0 lg:flex-row lg:items-center justify-between lg:w-1/2"
|
||||||
|
>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<BookOpen class="h-4 w-4 text-gray-700 mr-2" />
|
<BookOpen class="h-4 w-4 text-gray-700 mr-2" />
|
||||||
<span> {{ batch.data?.courses?.length }} {{ __('Courses') }} </span>
|
<span> {{ batch.data?.courses?.length }} {{ __('Courses') }} </span>
|
||||||
</div>
|
</div>
|
||||||
<span v-if="batch.data.courses">·</span>
|
<span class="hidden lg:block" v-if="batch.data.courses"
|
||||||
|
>·</span
|
||||||
|
>
|
||||||
<DateRange
|
<DateRange
|
||||||
:startDate="batch.data.start_date"
|
:startDate="batch.data.start_date"
|
||||||
:endDate="batch.data.end_date"
|
:endDate="batch.data.end_date"
|
||||||
/>
|
/>
|
||||||
<span v-if="batch.data.start_date">·</span>
|
<span class="hidden lg:block" v-if="batch.data.start_date"
|
||||||
|
>·</span
|
||||||
|
>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<Clock class="h-4 w-4 text-gray-700 mr-2" />
|
<Clock class="h-4 w-4 text-gray-700 mr-2" />
|
||||||
<span>
|
<span>
|
||||||
@@ -31,14 +37,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-[60%,20%] gap-20 mt-10">
|
<div class="grid lg:grid-cols-[60%,20%] gap-4 lg:gap-20 mt-10">
|
||||||
<div class="">
|
<div class="order-2 lg:order-none">
|
||||||
<div
|
<div
|
||||||
class="ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none !whitespace-normal mt-6"
|
class="ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none !whitespace-normal mt-6"
|
||||||
v-html="batch.data.batch_details"
|
v-html="batch.data.batch_details"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="order-1 lg:order-none">
|
||||||
<BatchOverlay :batch="batch" />
|
<BatchOverlay :batch="batch" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -48,7 +54,7 @@
|
|||||||
{{ __('Courses') }}
|
{{ __('Courses') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-8 mt-5">
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mt-5">
|
||||||
<div
|
<div
|
||||||
v-if="batch.data.courses"
|
v-if="batch.data.courses"
|
||||||
v-for="course in courses.data"
|
v-for="course in courses.data"
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
<div
|
<div
|
||||||
v-show="openInstructorEditor"
|
v-show="openInstructorEditor"
|
||||||
id="instructor-notes"
|
id="instructor-notes"
|
||||||
class="py-3"
|
class="ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none !whitespace-normal mt-6 py-3"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -52,7 +52,10 @@
|
|||||||
<label class="block font-medium text-gray-600 mb-1">
|
<label class="block font-medium text-gray-600 mb-1">
|
||||||
{{ __('Content') }}
|
{{ __('Content') }}
|
||||||
</label>
|
</label>
|
||||||
<div id="content" class="py-3"></div>
|
<div
|
||||||
|
id="content"
|
||||||
|
class="ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none !whitespace-normal mt-6 py-3"
|
||||||
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,8 +35,8 @@
|
|||||||
</EditCoverImage>
|
</EditCoverImage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mx-auto -mt-4 max-w-4xl translate-x-0 sm:px-5">
|
<div class="mx-auto -mt-10 md:-mt-4 max-w-4xl translate-x-0 px-5">
|
||||||
<div class="flex items-center">
|
<div class="flex flex-col md:flex-row items-center">
|
||||||
<div>
|
<div>
|
||||||
<img
|
<img
|
||||||
v-if="profile.data.user_image"
|
v-if="profile.data.user_image"
|
||||||
@@ -57,7 +57,11 @@
|
|||||||
{{ profile.data.headline }}
|
{{ profile.data.headline }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Button v-if="isSessionUser()" class="ml-auto" @click="editProfile()">
|
<Button
|
||||||
|
v-if="isSessionUser()"
|
||||||
|
class="mt-3 sm:mt-0 md:ml-auto"
|
||||||
|
@click="editProfile()"
|
||||||
|
>
|
||||||
<template #prefix>
|
<template #prefix>
|
||||||
<Edit class="w-4 h-4 stroke-1.5 text-gray-700" />
|
<Edit class="w-4 h-4 stroke-1.5 text-gray-700" />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mt-7">
|
<div class="mt-7 mb-10">
|
||||||
<h2 class="mb-3 text-lg font-semibold text-gray-900">
|
<h2 class="mb-3 text-lg font-semibold text-gray-900">
|
||||||
{{ __('About') }}
|
{{ __('About') }}
|
||||||
</h2>
|
</h2>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mt-7">
|
<div class="mt-7 mb-10">
|
||||||
<h2 class="mb-3 text-lg font-semibold text-gray-900">
|
<h2 class="mb-3 text-lg font-semibold text-gray-900">
|
||||||
{{ __('Certificates') }}
|
{{ __('Certificates') }}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="grid grid-cols-3 gap-4">
|
<div class="grid grod-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||||
<div
|
<div
|
||||||
v-for="certificate in certificates.data"
|
v-for="certificate in certificates.data"
|
||||||
:key="certificate.name"
|
:key="certificate.name"
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div class="">
|
<div class="">
|
||||||
<div class="grid grid-cols-4 gap-4 text-sm text-gray-700 mb-4">
|
<div
|
||||||
|
class="grid grid-cols-3 md:grid-cols-4 gap-4 text-sm text-gray-700 mb-4"
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
{{ __('Day') }}
|
{{ __('Day') }}
|
||||||
</div>
|
</div>
|
||||||
@@ -20,7 +22,7 @@
|
|||||||
<div
|
<div
|
||||||
v-if="evaluator.data"
|
v-if="evaluator.data"
|
||||||
v-for="slot in evaluator.data.slots.schedule"
|
v-for="slot in evaluator.data.slots.schedule"
|
||||||
class="grid grid-cols-4 gap-4 mb-4 group"
|
class="grid grid-cols-3 md:grid-cols-4 gap-4 mb-4 group"
|
||||||
>
|
>
|
||||||
<FormControl
|
<FormControl
|
||||||
type="select"
|
type="select"
|
||||||
@@ -44,7 +46,10 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-4 gap-4 mb-4" v-show="showSlotsTemplate">
|
<div
|
||||||
|
class="grid grid-cols-3 md:grod-cols-4 gap-4 mb-4"
|
||||||
|
v-show="showSlotsTemplate"
|
||||||
|
>
|
||||||
<FormControl
|
<FormControl
|
||||||
type="select"
|
type="select"
|
||||||
:options="days"
|
:options="days"
|
||||||
@@ -74,7 +79,7 @@
|
|||||||
<h2 class="mb-4 text-lg font-semibold text-gray-900">
|
<h2 class="mb-4 text-lg font-semibold text-gray-900">
|
||||||
{{ __('I am unavailable') }}
|
{{ __('I am unavailable') }}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="grid grid-cols-4 gap-4">
|
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||||
<FormControl
|
<FormControl
|
||||||
type="date"
|
type="date"
|
||||||
:label="__('From')"
|
:label="__('From')"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
<h2 class="mb-3 text-lg font-semibold text-gray-900">
|
<h2 class="mb-3 text-lg font-semibold text-gray-900">
|
||||||
{{ __('Settings') }}
|
{{ __('Settings') }}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="flex justify-between w-3/4 mt-5">
|
<div
|
||||||
|
class="flex flex-col md:flex-row gap-4 md:gap-0 justify-between w-3/4 mt-5"
|
||||||
|
>
|
||||||
<FormControl
|
<FormControl
|
||||||
:label="__('Moderator')"
|
:label="__('Moderator')"
|
||||||
v-model="moderator"
|
v-model="moderator"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<Breadcrumbs class="h-7" :items="breadcrumbs" />
|
<Breadcrumbs class="h-7" :items="breadcrumbs" />
|
||||||
</header>
|
</header>
|
||||||
<div v-if="chartDetails.data" class="p-5">
|
<div v-if="chartDetails.data" class="p-5">
|
||||||
<div class="grid grid-cols-2 lg:grid-cols-5 gap-4">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4">
|
||||||
<div class="flex items-center shadow py-2 px-3 rounded-md">
|
<div class="flex items-center shadow py-2 px-3 rounded-md">
|
||||||
<div class="p-2 rounded-md bg-gray-100 mr-3">
|
<div class="p-2 rounded-md bg-gray-100 mr-3">
|
||||||
<BookOpen class="w-18 h-18 stroke-1.5 text-gray-700" />
|
<BookOpen class="w-18 h-18 stroke-1.5 text-gray-700" />
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ export const sessionStore = defineStore('lms-session', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let user = ref(sessionUser())
|
let user = ref(sessionUser())
|
||||||
|
let username = ref(null)
|
||||||
const isLoggedIn = computed(() => !!user.value)
|
const isLoggedIn = computed(() => !!user.value)
|
||||||
|
|
||||||
const login = createResource({
|
const login = createResource({
|
||||||
@@ -43,6 +44,7 @@ export const sessionStore = defineStore('lms-session', () => {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
user,
|
user,
|
||||||
|
username,
|
||||||
isLoggedIn,
|
isLoggedIn,
|
||||||
login,
|
login,
|
||||||
logout,
|
logout,
|
||||||
|
|||||||
@@ -86,4 +86,5 @@ lms.patches.v1_0.change_jobs_url #19-01-2024
|
|||||||
lms.patches.v1_0.custom_perm_for_discussions #14-01-2024
|
lms.patches.v1_0.custom_perm_for_discussions #14-01-2024
|
||||||
lms.patches.v1_0.rename_evaluator_role
|
lms.patches.v1_0.rename_evaluator_role
|
||||||
lms.patches.v1_0.change_navbar_urls
|
lms.patches.v1_0.change_navbar_urls
|
||||||
lms.patches.v1_0.set_published_on
|
lms.patches.v1_0.set_published_on
|
||||||
|
lms.patches.v2_0.fix_progress_percentage
|
||||||
10
lms/patches/v2_0/fix_progress_percentage.py
Normal file
10
lms/patches/v2_0/fix_progress_percentage.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import frappe
|
||||||
|
from lms.lms.utils import get_course_progress
|
||||||
|
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
enrollments = frappe.get_all("LMS Enrollment", fields=["name", "course", "member"])
|
||||||
|
|
||||||
|
for enrollment in enrollments:
|
||||||
|
progress = get_course_progress(enrollment.course, enrollment.member)
|
||||||
|
frappe.db.set_value("LMS Enrollment", enrollment.name, "progress", progress)
|
||||||
Reference in New Issue
Block a user