fix: logout issue
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
"qalendar": "^3.6.1",
|
"qalendar": "^3.6.1",
|
||||||
"tailwindcss": "^3.2.7",
|
"tailwindcss": "^3.2.7",
|
||||||
"vue": "^3.2.25",
|
"vue": "^3.2.25",
|
||||||
|
"dayjs": "^1.11.6",
|
||||||
"vue-router": "^4.0.12"
|
"vue-router": "^4.0.12"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import UserDropdown from '@/components/UserDropdown.vue'
|
import UserDropdown from '@/components/UserDropdown.vue'
|
||||||
import LMSLogo from '@/components/Icons/LMSLogo.vue'
|
|
||||||
import CollapseSidebar from '@/components/Icons/CollapseSidebar.vue'
|
import CollapseSidebar from '@/components/Icons/CollapseSidebar.vue'
|
||||||
import SidebarLink from '@/components/SidebarLink.vue'
|
import SidebarLink from '@/components/SidebarLink.vue'
|
||||||
import { useStorage } from '@vueuse/core'
|
import { useStorage } from '@vueuse/core'
|
||||||
|
|||||||
@@ -1,23 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="shadow rounded-md">
|
<div class="shadow rounded-md p-4 h-full" style="min-height: 150px;">
|
||||||
<div>
|
<div class="text-xl font-semibold mb-1">
|
||||||
{{ batch.title }}
|
{{ batch.title }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="short-introduction">
|
||||||
{{ batch.description }}
|
{{ batch.description }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="mt-auto">
|
||||||
<Calendar class="h-4 w-4 stroke-1" />
|
<div class="flex items-center mb-1">
|
||||||
{{ batch.start_date }} - {{ batch.end_date }}
|
<Calendar class="h-4 w-4 stroke-1 mr-2" />
|
||||||
</div>
|
{{ dayjs(batch.start_date).format("DD MMM YYYY") }} - {{ dayjs(batch.end_date).format("DD MMM YYYY") }}
|
||||||
<div>
|
</div>
|
||||||
<Clock class="h-4 w-4 stroke-1" />
|
<div class="flex items-center">
|
||||||
{{ batch.start_time }} - {{ batch.end_time }}
|
<Clock class="h-4 w-4 stroke-1 mr-2" />
|
||||||
|
{{ batch.start_time }} - {{ batch.end_time }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Calendar, Clock } from "lucide-vue-next"
|
import { Calendar, Clock } from "lucide-vue-next"
|
||||||
|
import { inject } from "vue"
|
||||||
|
|
||||||
|
const dayjs = inject("$dayjs")
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
batch: {
|
batch: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@@ -25,3 +30,15 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.short-introduction {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 0.25rem 0 1.25rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -69,8 +69,7 @@ import { computed } from 'vue'
|
|||||||
import UserAvatar from '@/components/UserAvatar.vue'
|
import UserAvatar from '@/components/UserAvatar.vue'
|
||||||
import { sessionStore } from '@/stores/session'
|
import { sessionStore } from '@/stores/session'
|
||||||
|
|
||||||
const { isLoggedIn, getUser } = sessionStore()
|
const { isLoggedIn, user } = sessionStore()
|
||||||
const user = computed(() => isLoggedIn && getUser())
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
course: {
|
course: {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<Disclosure v-slot="{ open }" v-for="chapter in outline.data" :key="chapter.name">
|
<Disclosure v-slot="{ open }" v-for="chapter in outline.data" :key="chapter.name">
|
||||||
<DisclosureButton
|
<DisclosureButton
|
||||||
class="flex w-full px-2 py-4"
|
class="flex w-full px-2 pt-2 pb-2"
|
||||||
>
|
>
|
||||||
<ChevronUp
|
<ChevronUp
|
||||||
:class="open ? 'rotate-180 transform' : ''"
|
:class="open ? 'rotate-180 transform' : ''"
|
||||||
@@ -16,9 +16,9 @@
|
|||||||
{{ chapter.title }}
|
{{ chapter.title }}
|
||||||
</div>
|
</div>
|
||||||
</DisclosureButton>
|
</DisclosureButton>
|
||||||
<DisclosurePanel class="px-10 pb-4">
|
<DisclosurePanel class="px-10 pb-2">
|
||||||
<div v-for="lesson in chapter.lessons" :key="lesson.name">
|
<div v-for="lesson in chapter.lessons" :key="lesson.name">
|
||||||
<div class="flex items-center text-lg mb-2">
|
<div class="flex items-center text-lg mb-4">
|
||||||
<MonitorPlay v-if="lesson.icon === 'icon-youtube'" class="h-4 w-4 text-gray-900 stroke-1 mr-2"/>
|
<MonitorPlay v-if="lesson.icon === 'icon-youtube'" class="h-4 w-4 text-gray-900 stroke-1 mr-2"/>
|
||||||
<HelpCircle v-else-if="lesson.icon === 'icon-quiz'" class="h-4 w-4 text-gray-900 stroke-1 mr-2"/>
|
<HelpCircle v-else-if="lesson.icon === 'icon-quiz'" class="h-4 w-4 text-gray-900 stroke-1 mr-2"/>
|
||||||
<FileText v-else-if="lesson.icon === 'icon-list'" class="h-4 w-4 text-gray-900 stroke-1 mr-2"/>
|
<FileText v-else-if="lesson.icon === 'icon-list'" class="h-4 w-4 text-gray-900 stroke-1 mr-2"/>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
LMS
|
LMS
|
||||||
</div>
|
</div>
|
||||||
<div v-if="user" class="mt-1 text-sm text-gray-700 leading-none">
|
<div v-if="user" class="mt-1 text-sm text-gray-700 leading-none">
|
||||||
{{ user.full_name }}
|
{{ convertToTitleCase(user.split('@')[0]) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="duration-300 ease-in-out" :class="isCollapsed
|
<div class="duration-300 ease-in-out" :class="isCollapsed
|
||||||
@@ -35,7 +35,6 @@ import LMSLogo from '@/components/Icons/LMSLogo.vue'
|
|||||||
import { sessionStore } from '@/stores/session'
|
import { sessionStore } from '@/stores/session'
|
||||||
import { Dropdown } from 'frappe-ui'
|
import { Dropdown } from 'frappe-ui'
|
||||||
import { ChevronDown } from 'lucide-vue-next'
|
import { ChevronDown } from 'lucide-vue-next'
|
||||||
import { computed } from 'vue'
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
isCollapsed: {
|
isCollapsed: {
|
||||||
@@ -44,9 +43,9 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const { getUser, logout } = sessionStore()
|
const { logout, user } = sessionStore()
|
||||||
let { isLoggedIn } = sessionStore();
|
let { isLoggedIn } = sessionStore();
|
||||||
const user = computed(() => isLoggedIn && getUser())
|
|
||||||
const userDropdownOptions = [
|
const userDropdownOptions = [
|
||||||
{
|
{
|
||||||
icon: 'log-out',
|
icon: 'log-out',
|
||||||
@@ -70,5 +69,15 @@ const userDropdownOptions = [
|
|||||||
return !isLoggedIn
|
return !isLoggedIn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
];
|
||||||
|
|
||||||
|
function convertToTitleCase(str) {
|
||||||
|
if (!str) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.toLowerCase().split(' ').map(function (word) {
|
||||||
|
return word.charAt(0).toUpperCase().concat(word.substr(1));
|
||||||
|
}).join(' ');
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -4,21 +4,15 @@ import { createApp } from 'vue'
|
|||||||
import router from './router'
|
import router from './router'
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import { createPinia } from 'pinia'
|
import { createPinia } from 'pinia'
|
||||||
|
import dayjs from '@/utils/dayjs'
|
||||||
import translationPlugin from './translation'
|
import translationPlugin from './translation'
|
||||||
|
import { usersStore } from './stores/user'
|
||||||
|
import { sessionStore } from './stores/session'
|
||||||
|
|
||||||
import {
|
import { FrappeUI, setConfig, frappeRequest, resourcesPlugin } from 'frappe-ui'
|
||||||
FrappeUI,
|
|
||||||
Button,
|
|
||||||
setConfig,
|
|
||||||
frappeRequest,
|
|
||||||
resourcesPlugin,
|
|
||||||
} from 'frappe-ui'
|
|
||||||
|
|
||||||
// create a pinia instance
|
|
||||||
let pinia = createPinia()
|
let pinia = createPinia()
|
||||||
|
|
||||||
let app = createApp(App)
|
let app = createApp(App)
|
||||||
|
|
||||||
setConfig('resourceFetcher', frappeRequest)
|
setConfig('resourceFetcher', frappeRequest)
|
||||||
|
|
||||||
app.use(FrappeUI)
|
app.use(FrappeUI)
|
||||||
@@ -26,6 +20,16 @@ app.use(pinia)
|
|||||||
app.use(router)
|
app.use(router)
|
||||||
app.use(resourcesPlugin)
|
app.use(resourcesPlugin)
|
||||||
app.use(translationPlugin)
|
app.use(translationPlugin)
|
||||||
|
app.provide('$dayjs', dayjs)
|
||||||
|
|
||||||
app.component('Button', Button)
|
|
||||||
app.mount('#app')
|
app.mount('#app')
|
||||||
|
|
||||||
|
const { userResource } = usersStore()
|
||||||
|
let { isLoggedIn } = sessionStore()
|
||||||
|
|
||||||
|
if (isLoggedIn) {
|
||||||
|
await userResource.reload()
|
||||||
|
}
|
||||||
|
|
||||||
|
app.provide('$user', userResource)
|
||||||
|
app.config.globalProperties.$user = userResource
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="h-screen">
|
<div class="h-screen text-base">
|
||||||
<header
|
<header
|
||||||
class="sticky top-0 z-10 flex items-center justify-between border-b bg-white px-3 py-2.5 sm:px-5"
|
class="sticky top-0 z-10 flex items-center justify-between border-b bg-white px-3 py-2.5 sm:px-5"
|
||||||
>
|
>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="mx-5 my-10">
|
<div class="mx-5 my-10">
|
||||||
<div class="grid grid-cols-3 gap-8 mt-5">
|
<div class="grid grid-cols-4 gap-8 mt-5">
|
||||||
<BatchCard v-for="batch in batches.data" :batch="batch" />
|
<BatchCard v-for="batch in batches.data" :batch="batch" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,41 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="h-screen">
|
<div v-if="courses.data" class="h-screen">
|
||||||
<header
|
<header class="sticky top-0 z-10 flex items-center justify-between border-b bg-white px-3 py-2.5 sm:px-5">
|
||||||
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="[{ label: __('All Courses'), route: { name: 'Courses' } }]" />
|
||||||
>
|
<div class="flex">
|
||||||
<Breadcrumbs
|
<Select class="mr-2" :options="orderOptions" v-model="orderBy" />
|
||||||
class="h-7"
|
<Button variant="solid">
|
||||||
:items="[{ label: __('All Courses'), route: { name: 'Courses' } }]"
|
<template #prefix>
|
||||||
/>
|
<Plus class="h-4 w-4" />
|
||||||
<div class="flex">
|
</template>
|
||||||
<Select class="mr-2"
|
{{ __("New Course") }}
|
||||||
:options="orderOptions"
|
</Button>
|
||||||
v-model="orderBy"
|
</div>
|
||||||
/>
|
</header>
|
||||||
<Button variant="solid">
|
<div class="mx-5 py-5">
|
||||||
<template #prefix>
|
|
||||||
<Plus class="h-4 w-4" />
|
|
||||||
</template>
|
|
||||||
{{ __("New Course") }}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="mx-5 my-10">
|
|
||||||
<Tabs class="overflow-hidden" v-model="tabIndex" :tabs="tabs">
|
<Tabs class="overflow-hidden" v-model="tabIndex" :tabs="tabs">
|
||||||
<template #tab="{ tab, selected }">
|
<template #tab="{ tab, selected }">
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class="group -mb-px flex items-center gap-2 border-b border-transparent py-2.5 text-base text-gray-600 duration-300 ease-in-out hover:border-gray-400 hover:text-gray-900"
|
class="group -mb-px flex items-center gap-2 border-b border-transparent py-2.5 text-base text-gray-600 duration-300 ease-in-out hover:border-gray-400 hover:text-gray-900"
|
||||||
:class="{ 'text-gray-900': selected }"
|
:class="{ 'text-gray-900': selected }">
|
||||||
>
|
|
||||||
<component v-if="tab.icon" :is="tab.icon" class="h-5" />
|
<component v-if="tab.icon" :is="tab.icon" class="h-5" />
|
||||||
{{ __(tab.label) }}
|
{{ __(tab.label) }}
|
||||||
<Badge
|
<Badge :class="{ 'text-gray-900 border border-gray-900': selected }" variant="subtle" theme="gray"
|
||||||
:class="{ 'text-gray-900 border border-gray-900': selected }"
|
size="sm">
|
||||||
variant="subtle"
|
|
||||||
theme="gray"
|
|
||||||
size="sm"
|
|
||||||
>
|
|
||||||
{{ tab.count }}
|
{{ tab.count }}
|
||||||
</Badge>
|
</Badge>
|
||||||
</button>
|
</button>
|
||||||
@@ -43,7 +30,8 @@
|
|||||||
</template>
|
</template>
|
||||||
<template #default="{ tab }">
|
<template #default="{ tab }">
|
||||||
<div v-if="tab.courses && tab.courses.value.length" class="grid grid-cols-3 gap-8 mt-5">
|
<div v-if="tab.courses && tab.courses.value.length" class="grid grid-cols-3 gap-8 mt-5">
|
||||||
<router-link v-for="course in tab.courses.value" :to="{ name: 'CourseDetail', params: { courseName: course.name } }">
|
<router-link v-for="course in tab.courses.value"
|
||||||
|
:to="{ name: 'CourseDetail', params: { courseName: course.name } }">
|
||||||
<CourseCard :course="course" />
|
<CourseCard :course="course" />
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
@@ -58,39 +46,34 @@
|
|||||||
</Tabs>
|
</Tabs>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { sessionStore } from '@/stores/session'
|
import { sessionStore } from '@/stores/session'
|
||||||
import { createListResource, Breadcrumbs, Tabs, Badge, Select } from 'frappe-ui';
|
import { createListResource, Breadcrumbs, Tabs, Badge, Select, Button } from 'frappe-ui';
|
||||||
import CourseCard from '@/components/CourseCard.vue';
|
import CourseCard from '@/components/CourseCard.vue';
|
||||||
import { Plus } from 'lucide-vue-next'
|
import { Plus } from 'lucide-vue-next'
|
||||||
import { ref, computed } from 'vue'
|
import { ref, computed, inject } from 'vue'
|
||||||
|
|
||||||
|
const user = inject("$user")
|
||||||
|
|
||||||
const { isLoggedIn, getUser } = sessionStore()
|
|
||||||
const user = computed(() => isLoggedIn && getUser())
|
|
||||||
console.log(user)
|
|
||||||
const courses = createListResource({
|
const courses = createListResource({
|
||||||
type: 'list',
|
type: 'list',
|
||||||
cache: ["courses", user.email],
|
|
||||||
doctype: 'LMS Course',
|
doctype: 'LMS Course',
|
||||||
|
cache: ["courses", user?.data?.email],
|
||||||
url: "lms.lms.utils.get_courses",
|
url: "lms.lms.utils.get_courses",
|
||||||
auto: true,
|
auto: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const is_moderator = computed(() => {
|
const is_moderator = computed(() => {
|
||||||
if (user && user.value?.roles?.includes('Moderator')) {
|
if (user.data?.roles?.includes('Moderator')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
const is_instructor = computed(() => {
|
const is_instructor = computed(() => {
|
||||||
if (user && user.value?.roles?.includes('Course Creator')) {
|
return user.data.roles.includes("Course Creator") ? true : false;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const tabIndex = ref(0)
|
const tabIndex = ref(0)
|
||||||
@@ -106,8 +89,8 @@ const tabs = [
|
|||||||
count: computed(() => courses.data?.upcoming?.length),
|
count: computed(() => courses.data?.upcoming?.length),
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
console.log(user.data)
|
||||||
if (user.value) {
|
if (user.data) {
|
||||||
tabs.push({
|
tabs.push({
|
||||||
label: 'Enrolled',
|
label: 'Enrolled',
|
||||||
courses: computed(() => courses.data?.enrolled),
|
courses: computed(() => courses.data?.enrolled),
|
||||||
@@ -151,19 +134,4 @@ const orderOptions = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
const orderBy = 'enrollment';
|
const orderBy = 'enrollment';
|
||||||
|
|
||||||
function sort_courses(order) {
|
|
||||||
const categories = ['live', 'upcoming', 'enrolled', 'created', 'under_review'];
|
|
||||||
categories.forEach(category => {
|
|
||||||
courses.data[category] = courses.data[category].sort((a, b) => {
|
|
||||||
if (order === 'enrollment') {
|
|
||||||
return b.enrollment_count - a.enrollment_count;
|
|
||||||
} else if (order === 'rating') {
|
|
||||||
return b.avg_rating - a.avg_rating;
|
|
||||||
} else if (order === 'newest') {
|
|
||||||
return new Date(b.creation).getTime() - new Date(a.creation).getTime();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
@@ -3,7 +3,9 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { createResource, Button } from "frappe-ui";
|
import { createResource, Button } from "frappe-ui";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
const route = useRoute();
|
||||||
|
console.log(route)
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
courseName: {
|
courseName: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -14,7 +16,7 @@ const props = defineProps({
|
|||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
/*
|
||||||
const lesson = createResource({
|
const lesson = createResource({
|
||||||
url: "lms.lms.utils.get_lesson",
|
url: "lms.lms.utils.get_lesson",
|
||||||
cache: ["lesson", props.courseName, props.lessonNumber],
|
cache: ["lesson", props.courseName, props.lessonNumber],
|
||||||
@@ -23,5 +25,5 @@ const lesson = createResource({
|
|||||||
lesson: props.lessonNumber,
|
lesson: props.lessonNumber,
|
||||||
},
|
},
|
||||||
auto: true,
|
auto: true,
|
||||||
});
|
}); */
|
||||||
</script>
|
</script>
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
import { createRouter, createWebHistory } from 'vue-router'
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
|
import { usersStore } from './stores/user'
|
||||||
|
import { sessionStore } from './stores/session'
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
@@ -19,10 +21,10 @@ const routes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Create a route for path /courses/inventory-management/learn/1.1
|
// Create a route for path /courses/inventory-management/learn/1.1
|
||||||
path: '/courses/:courseName/learn/:chapterId',
|
path: '/courses/:courseName/learn/:lessonNumber',
|
||||||
name: 'Lesson',
|
name: 'Lesson',
|
||||||
component: () => import('@/pages/Lesson.vue'),
|
component: () => import('@/pages/Lesson.vue'),
|
||||||
props: true,
|
props: {},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/batches',
|
path: '/batches',
|
||||||
@@ -36,4 +38,18 @@ let router = createRouter({
|
|||||||
routes,
|
routes,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
router.beforeEach(async (to, from, next) => {
|
||||||
|
const { userResource } = usersStore()
|
||||||
|
let { isLoggedIn } = sessionStore()
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (isLoggedIn) {
|
||||||
|
await userResource.reload()
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
isLoggedIn = false
|
||||||
|
}
|
||||||
|
return next()
|
||||||
|
})
|
||||||
|
|
||||||
export default router
|
export default router
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import router from '@/router'
|
|||||||
import { ref, computed } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
|
|
||||||
export const sessionStore = defineStore('lms-session', () => {
|
export const sessionStore = defineStore('lms-session', () => {
|
||||||
const { user, usersByName } = usersStore()
|
let { userResource } = usersStore()
|
||||||
|
|
||||||
function currentUser() {
|
function sessionUser() {
|
||||||
let cookies = new URLSearchParams(document.cookie.split('; ').join('&'))
|
let cookies = new URLSearchParams(document.cookie.split('; ').join('&'))
|
||||||
let _sessionUser = cookies.get('user_id')
|
let _sessionUser = cookies.get('user_id')
|
||||||
if (_sessionUser === 'Guest') {
|
if (_sessionUser === 'Guest') {
|
||||||
@@ -16,18 +16,8 @@ export const sessionStore = defineStore('lms-session', () => {
|
|||||||
return _sessionUser
|
return _sessionUser
|
||||||
}
|
}
|
||||||
|
|
||||||
let sessionUser = ref(currentUser())
|
let user = ref(sessionUser())
|
||||||
const isLoggedIn = ref(!!sessionUser.value)
|
const isLoggedIn = computed(() => !!user.value)
|
||||||
|
|
||||||
function getUser() {
|
|
||||||
if (!sessionUser.value) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
if (usersByName[sessionUser.value]) {
|
|
||||||
return usersByName[sessionUser.value]
|
|
||||||
}
|
|
||||||
return user.value
|
|
||||||
}
|
|
||||||
|
|
||||||
const login = createResource({
|
const login = createResource({
|
||||||
url: 'login',
|
url: 'login',
|
||||||
@@ -35,8 +25,8 @@ export const sessionStore = defineStore('lms-session', () => {
|
|||||||
throw new Error('Invalid email or password')
|
throw new Error('Invalid email or password')
|
||||||
},
|
},
|
||||||
onSuccess() {
|
onSuccess() {
|
||||||
user.reload()
|
userResource.reload()
|
||||||
sessionUser.value = currentUser()
|
user.value = sessionUser()
|
||||||
login.reset()
|
login.reset()
|
||||||
router.replace({ path: '/' })
|
router.replace({ path: '/' })
|
||||||
},
|
},
|
||||||
@@ -45,16 +35,16 @@ export const sessionStore = defineStore('lms-session', () => {
|
|||||||
const logout = createResource({
|
const logout = createResource({
|
||||||
url: 'logout',
|
url: 'logout',
|
||||||
onSuccess() {
|
onSuccess() {
|
||||||
user.reset()
|
userResource.reset()
|
||||||
sessionUser.value = null
|
user.value = null
|
||||||
|
window.location.reload()
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
sessionUser,
|
user,
|
||||||
isLoggedIn,
|
isLoggedIn,
|
||||||
login,
|
login,
|
||||||
logout,
|
logout,
|
||||||
getUser,
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,20 +1,9 @@
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { createResource } from 'frappe-ui'
|
import { createResource } from 'frappe-ui'
|
||||||
import { reactive } from 'vue'
|
|
||||||
|
|
||||||
export const usersStore = defineStore('lms-users', () => {
|
export const usersStore = defineStore('lms-users', () => {
|
||||||
let usersByName = reactive({})
|
let userResource = createResource({
|
||||||
|
|
||||||
const user = createResource({
|
|
||||||
url: 'lms.lms.api.get_user_info',
|
url: 'lms.lms.api.get_user_info',
|
||||||
cache: 'Users',
|
|
||||||
initialData: [],
|
|
||||||
auto: true,
|
|
||||||
transform: (data) => {
|
|
||||||
if (data?.name && !usersByName[data.name]) {
|
|
||||||
usersByName[data.name] = data
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onError(error) {
|
onError(error) {
|
||||||
if (error && error.exc_type === 'AuthenticationError') {
|
if (error && error.exc_type === 'AuthenticationError') {
|
||||||
router.push('/login')
|
router.push('/login')
|
||||||
@@ -23,7 +12,6 @@ export const usersStore = defineStore('lms-users', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
user,
|
userResource,
|
||||||
usersByName,
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
12
frontend/src/utils/dayjs.js
Normal file
12
frontend/src/utils/dayjs.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import dayjs from 'dayjs/esm'
|
||||||
|
import relativeTime from 'dayjs/esm/plugin/relativeTime'
|
||||||
|
import localizedFormat from 'dayjs/esm/plugin/localizedFormat'
|
||||||
|
import updateLocale from 'dayjs/esm/plugin/updateLocale'
|
||||||
|
import isToday from 'dayjs/esm/plugin/isToday'
|
||||||
|
|
||||||
|
dayjs.extend(updateLocale)
|
||||||
|
dayjs.extend(relativeTime)
|
||||||
|
dayjs.extend(localizedFormat)
|
||||||
|
dayjs.extend(isToday)
|
||||||
|
|
||||||
|
export default dayjs
|
||||||
@@ -12,12 +12,22 @@
|
|||||||
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz"
|
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz"
|
||||||
integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==
|
integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==
|
||||||
|
|
||||||
|
"@esbuild/android-arm@0.15.18":
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80"
|
||||||
|
integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64@0.15.18":
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239"
|
||||||
|
integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==
|
||||||
|
|
||||||
"@fortawesome/fontawesome-common-types@6.5.1":
|
"@fortawesome/fontawesome-common-types@6.5.1":
|
||||||
version "6.5.1"
|
version "6.5.1"
|
||||||
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz"
|
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz"
|
||||||
integrity sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==
|
integrity sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==
|
||||||
|
|
||||||
"@fortawesome/fontawesome-svg-core@^6.3.0", "@fortawesome/fontawesome-svg-core@~1 || ~6":
|
"@fortawesome/fontawesome-svg-core@^6.3.0":
|
||||||
version "6.5.1"
|
version "6.5.1"
|
||||||
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz"
|
resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz"
|
||||||
integrity sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==
|
integrity sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==
|
||||||
@@ -88,7 +98,7 @@
|
|||||||
"@nodelib/fs.stat" "2.0.5"
|
"@nodelib/fs.stat" "2.0.5"
|
||||||
run-parallel "^1.1.9"
|
run-parallel "^1.1.9"
|
||||||
|
|
||||||
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||||
@@ -159,7 +169,7 @@
|
|||||||
lodash.merge "^4.6.2"
|
lodash.merge "^4.6.2"
|
||||||
postcss-selector-parser "6.0.10"
|
postcss-selector-parser "6.0.10"
|
||||||
|
|
||||||
"@tiptap/core@^2.0.0", "@tiptap/core@^2.1.13":
|
"@tiptap/core@^2.1.13":
|
||||||
version "2.1.13"
|
version "2.1.13"
|
||||||
resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.1.13.tgz"
|
resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.1.13.tgz"
|
||||||
integrity sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==
|
integrity sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==
|
||||||
@@ -320,7 +330,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.13.tgz"
|
resolved "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.13.tgz"
|
||||||
integrity sha512-ZmbGpi5FHGsWyzt+8DceXERr/Vwxhjpm2VKWZyFTVz8uNJVj+/ou196JQJZqxbp5VtKkS7UYujaO++G5eflb0Q==
|
integrity sha512-ZmbGpi5FHGsWyzt+8DceXERr/Vwxhjpm2VKWZyFTVz8uNJVj+/ou196JQJZqxbp5VtKkS7UYujaO++G5eflb0Q==
|
||||||
|
|
||||||
"@tiptap/extension-text-style@^2.0.0", "@tiptap/extension-text-style@^2.0.3":
|
"@tiptap/extension-text-style@^2.0.3":
|
||||||
version "2.1.13"
|
version "2.1.13"
|
||||||
resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.1.13.tgz"
|
resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.1.13.tgz"
|
||||||
integrity sha512-K9/pNHxpZKQoc++crxrsppVUSeHv8YevfY2FkJ4YMaekGcX+q4BRrHR0tOfii4izAUPJF2L0/PexLQaWXtAY1w==
|
integrity sha512-K9/pNHxpZKQoc++crxrsppVUSeHv8YevfY2FkJ4YMaekGcX+q4BRrHR0tOfii4izAUPJF2L0/PexLQaWXtAY1w==
|
||||||
@@ -335,7 +345,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-2.1.13.tgz"
|
resolved "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-2.1.13.tgz"
|
||||||
integrity sha512-//90Gzkci4/77CCmdWYyRGTcMUvsQ64jv3mqlL+JqWgLCffMHvWPGKhPMgSzoyHRlAIIACMhxniRtB7HixhTHQ==
|
integrity sha512-//90Gzkci4/77CCmdWYyRGTcMUvsQ64jv3mqlL+JqWgLCffMHvWPGKhPMgSzoyHRlAIIACMhxniRtB7HixhTHQ==
|
||||||
|
|
||||||
"@tiptap/pm@^2.0.0", "@tiptap/pm@^2.0.3":
|
"@tiptap/pm@^2.0.3":
|
||||||
version "2.1.13"
|
version "2.1.13"
|
||||||
resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.13.tgz"
|
resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.13.tgz"
|
||||||
integrity sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==
|
integrity sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==
|
||||||
@@ -384,7 +394,7 @@
|
|||||||
"@tiptap/extension-strike" "^2.1.13"
|
"@tiptap/extension-strike" "^2.1.13"
|
||||||
"@tiptap/extension-text" "^2.1.13"
|
"@tiptap/extension-text" "^2.1.13"
|
||||||
|
|
||||||
"@tiptap/suggestion@^2.0.0", "@tiptap/suggestion@^2.0.3":
|
"@tiptap/suggestion@^2.0.3":
|
||||||
version "2.1.13"
|
version "2.1.13"
|
||||||
resolved "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.1.13.tgz"
|
resolved "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.1.13.tgz"
|
||||||
integrity sha512-Y05TsiXTFAJ5SrfoV+21MAxig5UNbY0AVa03lQlh/yicTRPpIc6hgZzblB0uxDSYoj6+kaHE4MIZvPvhUD8BJQ==
|
integrity sha512-Y05TsiXTFAJ5SrfoV+21MAxig5UNbY0AVa03lQlh/yicTRPpIc6hgZzblB0uxDSYoj6+kaHE4MIZvPvhUD8BJQ==
|
||||||
@@ -599,7 +609,7 @@ braces@^3.0.2, braces@~3.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fill-range "^7.0.1"
|
fill-range "^7.0.1"
|
||||||
|
|
||||||
browserslist@^4.21.10, "browserslist@>= 4.21.0":
|
browserslist@^4.21.10:
|
||||||
version "4.22.2"
|
version "4.22.2"
|
||||||
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz"
|
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz"
|
||||||
integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
|
integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
|
||||||
@@ -684,6 +694,11 @@ dash-get@^1.0.2:
|
|||||||
resolved "https://registry.npmjs.org/dash-get/-/dash-get-1.0.2.tgz"
|
resolved "https://registry.npmjs.org/dash-get/-/dash-get-1.0.2.tgz"
|
||||||
integrity sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==
|
integrity sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==
|
||||||
|
|
||||||
|
dayjs@^1.11.6:
|
||||||
|
version "1.11.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0"
|
||||||
|
integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==
|
||||||
|
|
||||||
debug@~4.3.1, debug@~4.3.2:
|
debug@~4.3.1, debug@~4.3.2:
|
||||||
version "4.3.4"
|
version "4.3.4"
|
||||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
|
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
|
||||||
@@ -732,11 +747,106 @@ entities@~3.0.1:
|
|||||||
resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz"
|
resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz"
|
||||||
integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
|
integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
|
||||||
|
|
||||||
|
esbuild-android-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5"
|
||||||
|
integrity sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==
|
||||||
|
|
||||||
|
esbuild-android-arm64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz#9cc0ec60581d6ad267568f29cf4895ffdd9f2f04"
|
||||||
|
integrity sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==
|
||||||
|
|
||||||
|
esbuild-darwin-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz#428e1730ea819d500808f220fbc5207aea6d4410"
|
||||||
|
integrity sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==
|
||||||
|
|
||||||
esbuild-darwin-arm64@0.15.18:
|
esbuild-darwin-arm64@0.15.18:
|
||||||
version "0.15.18"
|
version "0.15.18"
|
||||||
resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz"
|
resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz"
|
||||||
integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==
|
integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==
|
||||||
|
|
||||||
|
esbuild-freebsd-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz#4e190d9c2d1e67164619ae30a438be87d5eedaf2"
|
||||||
|
integrity sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==
|
||||||
|
|
||||||
|
esbuild-freebsd-arm64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz#18a4c0344ee23bd5a6d06d18c76e2fd6d3f91635"
|
||||||
|
integrity sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==
|
||||||
|
|
||||||
|
esbuild-linux-32@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz#9a329731ee079b12262b793fb84eea762e82e0ce"
|
||||||
|
integrity sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==
|
||||||
|
|
||||||
|
esbuild-linux-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz#532738075397b994467b514e524aeb520c191b6c"
|
||||||
|
integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==
|
||||||
|
|
||||||
|
esbuild-linux-arm64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz#5372e7993ac2da8f06b2ba313710d722b7a86e5d"
|
||||||
|
integrity sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==
|
||||||
|
|
||||||
|
esbuild-linux-arm@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz#e734aaf259a2e3d109d4886c9e81ec0f2fd9a9cc"
|
||||||
|
integrity sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==
|
||||||
|
|
||||||
|
esbuild-linux-mips64le@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz#c0487c14a9371a84eb08fab0e1d7b045a77105eb"
|
||||||
|
integrity sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==
|
||||||
|
|
||||||
|
esbuild-linux-ppc64le@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz#af048ad94eed0ce32f6d5a873f7abe9115012507"
|
||||||
|
integrity sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==
|
||||||
|
|
||||||
|
esbuild-linux-riscv64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz#423ed4e5927bd77f842bd566972178f424d455e6"
|
||||||
|
integrity sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==
|
||||||
|
|
||||||
|
esbuild-linux-s390x@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz#21d21eaa962a183bfb76312e5a01cc5ae48ce8eb"
|
||||||
|
integrity sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==
|
||||||
|
|
||||||
|
esbuild-netbsd-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz#ae75682f60d08560b1fe9482bfe0173e5110b998"
|
||||||
|
integrity sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==
|
||||||
|
|
||||||
|
esbuild-openbsd-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz#79591a90aa3b03e4863f93beec0d2bab2853d0a8"
|
||||||
|
integrity sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==
|
||||||
|
|
||||||
|
esbuild-sunos-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz#fd528aa5da5374b7e1e93d36ef9b07c3dfed2971"
|
||||||
|
integrity sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==
|
||||||
|
|
||||||
|
esbuild-windows-32@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz#0e92b66ecdf5435a76813c4bc5ccda0696f4efc3"
|
||||||
|
integrity sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==
|
||||||
|
|
||||||
|
esbuild-windows-64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz#0fc761d785414284fc408e7914226d33f82420d0"
|
||||||
|
integrity sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==
|
||||||
|
|
||||||
|
esbuild-windows-arm64@0.15.18:
|
||||||
|
version "0.15.18"
|
||||||
|
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz#5b5bdc56d341d0922ee94965c89ee120a6a86eb7"
|
||||||
|
integrity sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==
|
||||||
|
|
||||||
esbuild@^0.15.9:
|
esbuild@^0.15.9:
|
||||||
version "0.15.18"
|
version "0.15.18"
|
||||||
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz"
|
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz"
|
||||||
@@ -1221,14 +1331,6 @@ postcss-nested@^6.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
postcss-selector-parser "^6.0.11"
|
postcss-selector-parser "^6.0.11"
|
||||||
|
|
||||||
postcss-selector-parser@^6.0.11:
|
|
||||||
version "6.0.13"
|
|
||||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
|
|
||||||
integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
|
|
||||||
dependencies:
|
|
||||||
cssesc "^3.0.0"
|
|
||||||
util-deprecate "^1.0.2"
|
|
||||||
|
|
||||||
postcss-selector-parser@6.0.10:
|
postcss-selector-parser@6.0.10:
|
||||||
version "6.0.10"
|
version "6.0.10"
|
||||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
|
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
|
||||||
@@ -1237,12 +1339,20 @@ postcss-selector-parser@6.0.10:
|
|||||||
cssesc "^3.0.0"
|
cssesc "^3.0.0"
|
||||||
util-deprecate "^1.0.2"
|
util-deprecate "^1.0.2"
|
||||||
|
|
||||||
|
postcss-selector-parser@^6.0.11:
|
||||||
|
version "6.0.13"
|
||||||
|
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
|
||||||
|
integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
|
||||||
|
dependencies:
|
||||||
|
cssesc "^3.0.0"
|
||||||
|
util-deprecate "^1.0.2"
|
||||||
|
|
||||||
postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
|
postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
|
||||||
version "4.2.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
|
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
|
||||||
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
||||||
|
|
||||||
postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.18, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.5, postcss@>=8.0.9:
|
postcss@^8.4.18, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.5:
|
||||||
version "8.4.32"
|
version "8.4.32"
|
||||||
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz"
|
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz"
|
||||||
integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
|
integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
|
||||||
@@ -1360,7 +1470,7 @@ prosemirror-schema-list@^1.2.2:
|
|||||||
prosemirror-state "^1.0.0"
|
prosemirror-state "^1.0.0"
|
||||||
prosemirror-transform "^1.7.3"
|
prosemirror-transform "^1.7.3"
|
||||||
|
|
||||||
prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.1, prosemirror-state@^1.4.2:
|
prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.1:
|
||||||
version "1.4.3"
|
version "1.4.3"
|
||||||
resolved "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz"
|
resolved "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz"
|
||||||
integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==
|
integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==
|
||||||
@@ -1396,7 +1506,7 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor
|
|||||||
dependencies:
|
dependencies:
|
||||||
prosemirror-model "^1.0.0"
|
prosemirror-model "^1.0.0"
|
||||||
|
|
||||||
prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.28.2, prosemirror-view@^1.31.0, prosemirror-view@^1.31.2:
|
prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.28.2, prosemirror-view@^1.31.0:
|
||||||
version "1.32.4"
|
version "1.32.4"
|
||||||
resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.32.4.tgz"
|
resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.32.4.tgz"
|
||||||
integrity sha512-WoT+ZYePp0WQvp5coABAysheZg9WttW3TSEUNgsfDQXmVOJlnjkbFbXicKPvWFLiC0ZjKt1ykbyoVKqhVnCiSQ==
|
integrity sha512-WoT+ZYePp0WQvp5coABAysheZg9WttW3TSEUNgsfDQXmVOJlnjkbFbXicKPvWFLiC0ZjKt1ykbyoVKqhVnCiSQ==
|
||||||
@@ -1516,7 +1626,7 @@ supports-preserve-symlinks-flag@^1.0.0:
|
|||||||
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
|
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
|
||||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||||
|
|
||||||
tailwindcss@^3.2.7, "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1", "tailwindcss@>=3.0.0 || insiders":
|
tailwindcss@^3.2.7:
|
||||||
version "3.3.5"
|
version "3.3.5"
|
||||||
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz"
|
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz"
|
||||||
integrity sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==
|
integrity sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==
|
||||||
@@ -1605,7 +1715,7 @@ util-deprecate@^1.0.2:
|
|||||||
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
|
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
|
||||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
||||||
|
|
||||||
vite@^2.5.10, vite@^3.0.0:
|
vite@^3.0.0:
|
||||||
version "3.2.7"
|
version "3.2.7"
|
||||||
resolved "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz"
|
resolved "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz"
|
||||||
integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==
|
integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==
|
||||||
@@ -1622,14 +1732,14 @@ vue-demi@>=0.14.5, vue-demi@>=0.14.6:
|
|||||||
resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz"
|
resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz"
|
||||||
integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
|
integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
|
||||||
|
|
||||||
vue-router@^4.0.12, vue-router@^4.1.6:
|
vue-router@^4.0.12:
|
||||||
version "4.2.5"
|
version "4.2.5"
|
||||||
resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz"
|
resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz"
|
||||||
integrity sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==
|
integrity sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@vue/devtools-api" "^6.5.0"
|
"@vue/devtools-api" "^6.5.0"
|
||||||
|
|
||||||
"vue@^2.6.14 || ^3.3.0", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.45, "vue@>= 3.0.0 < 4", vue@>=3.0.1, vue@3.3.9:
|
vue@^3.2.25:
|
||||||
version "3.3.9"
|
version "3.3.9"
|
||||||
resolved "https://registry.npmjs.org/vue/-/vue-3.3.9.tgz"
|
resolved "https://registry.npmjs.org/vue/-/vue-3.3.9.tgz"
|
||||||
integrity sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==
|
integrity sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==
|
||||||
|
|||||||
Reference in New Issue
Block a user