Merge branch 'develop' of https://github.com/frappe/lms into full-text-search

This commit is contained in:
Jannat Patel
2025-12-11 11:45:36 +05:30
82 changed files with 5629 additions and 3748 deletions

View File

@@ -48,7 +48,7 @@ const settingsStore = useSettings()
const sendMail = (close: Function) => {
call('frappe.core.doctype.communication.email.make', {
recipients: settingsStore.contactUsEmail?.data,
recipients: settingsStore.settings?.data?.contact_us_email,
subject: subject.value,
content: message.value,
send_email: true,

View File

@@ -66,7 +66,7 @@
<script setup lang="ts">
import { Button, Dialog, FormControl, TextEditor, toast } from 'frappe-ui'
import { computed, reactive, watch } from 'vue'
import { escapeHTML } from '@/utils'
import { escapeHTML, sanitizeHTML } from '@/utils'
const show = defineModel()
const assignments = defineModel<Assignments>('assignments')
@@ -122,12 +122,13 @@ watch(show, (newVal) => {
}
})
const validateTitle = () => {
const validateFields = () => {
assignment.title = escapeHTML(assignment.title.trim())
assignment.question = sanitizeHTML(assignment.question)
}
const saveAssignment = () => {
validateTitle()
validateFields()
if (props.assignmentID == 'new') {
createAssignment()
} else {

View File

@@ -104,9 +104,8 @@ import {
} from 'frappe-ui'
import { ref, reactive, watch } from 'vue'
import { X } from 'lucide-vue-next'
import { getFileSize, decodeEntities } from '@/utils'
import { getFileSize, sanitizeHTML } from '@/utils'
import Link from '@/components/Controls/Link.vue'
import DOMPurify from 'dompurify'
const reloadProfile = defineModel('reloadProfile')
const hasLanguageChanged = ref(false)
@@ -157,22 +156,7 @@ const updateProfile = createResource({
})
const saveProfile = (close) => {
profile.bio = DOMPurify.sanitize(decodeEntities(profile.bio), {
ALLOWED_TAGS: [
'b',
'i',
'em',
'strong',
'a',
'p',
'br',
'ul',
'ol',
'li',
'img',
],
ALLOWED_ATTR: ['href', 'target', 'src'],
})
profile.bio = sanitizeHTML(profile.bio)
updateProfile.submit(
{},
{

View File

@@ -120,6 +120,13 @@ const tabsStructure = computed(() => {
description:
'If enabled, users will no able to move forward in a video',
},
{
label: 'Disable PWA',
name: 'disable_pwa',
type: 'checkbox',
description:
'If checked, users will not be able to install the application as a Progressive Web App.',
},
{
label: 'Send calendar invite for evaluations',
name: 'send_calendar_invite_for_evaluations',

View File

@@ -240,8 +240,7 @@ const showPageModal = ref(false)
const isModerator = ref(false)
const isInstructor = ref(false)
const pageToEdit = ref(null)
const settingsStore = useSettings()
const { sidebarSettings } = settingsStore
const { settings, sidebarSettings, activeTab, isSettingsOpen } = useSettings()
const showOnboarding = ref(false)
const showIntermediateModal = ref(false)
const currentStep = ref({})
@@ -412,7 +411,7 @@ const addPrograms = async () => {
}
const addContactUsDetails = () => {
if (!settingsStore.contactUsEmail?.data && !settingsStore.contactUsURL?.data)
if (!settings?.data?.contact_us_email && !settings?.data?.contact_us_url)
return
const contactUsLinkExists = sidebarLinks.value.some(
@@ -422,10 +421,10 @@ const addContactUsDetails = () => {
sidebarLinks.value.push({
label: 'Contact Us',
icon: settingsStore.contactUsURL?.data ? 'Headset' : 'Mail',
to: settingsStore.contactUsURL?.data
? settingsStore.contactUsURL.data
: settingsStore.contactUsEmail?.data,
icon: settings.data?.contact_us_url ? 'Headset' : 'Mail',
to: settings.data?.contact_us_url
? settings.data?.contact_us_url
: settings.data?.contact_us_email,
})
}
@@ -559,8 +558,8 @@ const steps = reactive([
completed: false,
onClick: () => {
minimize.value = true
settingsStore.activeTab = 'Members'
settingsStore.isSettingsOpen = true
activeTab.value = 'Members'
isSettingsOpen.value = true
},
},
{

View File

@@ -171,7 +171,7 @@ const showQuizLoader = ref(false)
const quizLoadTimer = ref(0)
const currentQuiz = ref(null)
const nextQuiz = ref({})
const { preventSkippingVideos } = useSettings()
const { settings } = useSettings()
const props = defineProps({
file: {
@@ -299,7 +299,7 @@ const toggleMute = () => {
const changeCurrentTime = () => {
if (
preventSkippingVideos.data &&
settings.data?.prevent_skipping_videos &&
currentTime.value > videoRef.value.currentTime
)
return