Merge branch 'develop' of https://github.com/frappe/lms into certification-redesign
This commit is contained in:
@@ -38,7 +38,7 @@
|
||||
<div class="mb-4">
|
||||
<Button @click="openFileSelector" :loading="uploading">
|
||||
{{
|
||||
uploading ? `Uploading ${progress}%` : 'Upload an zip file'
|
||||
uploading ? `Uploading ${progress}%` : 'Upload an ZIP file'
|
||||
}}
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -8,98 +8,109 @@
|
||||
{{ __('Save') }}
|
||||
</Button>
|
||||
</header>
|
||||
<div class="w-1/2 mx-auto py-5">
|
||||
<div class="w-3/4 mx-auto py-5">
|
||||
<div class="">
|
||||
<div class="text-lg font-semibold mb-4">
|
||||
{{ __('Details') }}
|
||||
</div>
|
||||
<div class="space-y-4 mb-4">
|
||||
<FormControl
|
||||
v-model="batch.title"
|
||||
:label="__('Title')"
|
||||
:required="true"
|
||||
class="w-full"
|
||||
/>
|
||||
<div class="flex items-center space-x-5">
|
||||
<div class="space-y-10 mb-4">
|
||||
<div class="grid grid-cols-2 gap-10">
|
||||
<FormControl
|
||||
v-model="batch.published"
|
||||
type="checkbox"
|
||||
:label="__('Published')"
|
||||
v-model="batch.title"
|
||||
:label="__('Title')"
|
||||
:required="true"
|
||||
class="w-full"
|
||||
/>
|
||||
<FormControl
|
||||
v-model="batch.allow_self_enrollment"
|
||||
type="checkbox"
|
||||
:label="__('Allow self enrollment')"
|
||||
/>
|
||||
<FormControl
|
||||
v-model="batch.certification"
|
||||
type="checkbox"
|
||||
:label="__('Certification')"
|
||||
<MultiSelect
|
||||
v-model="instructors"
|
||||
doctype="User"
|
||||
:label="__('Instructors')"
|
||||
:required="true"
|
||||
:filters="{ ignore_user_type: 1 }"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="text-xs text-ink-gray-5 mb-2">
|
||||
{{ __('Meta Image') }}
|
||||
</div>
|
||||
<FileUploader
|
||||
v-if="!batch.image"
|
||||
:fileTypes="['image/*']"
|
||||
:validateFile="validateFile"
|
||||
@success="(file) => saveImage(file)"
|
||||
>
|
||||
<template v-slot="{ file, progress, uploading, openFileSelector }">
|
||||
<div class="flex items-center">
|
||||
<div class="border rounded-md w-fit py-5 px-20">
|
||||
<Image class="size-5 stroke-1 text-ink-gray-7" />
|
||||
|
||||
<div class="grid grid-cols-2 gap-10">
|
||||
<div class="flex flex-col space-y-5">
|
||||
<FormControl
|
||||
v-model="batch.published"
|
||||
type="checkbox"
|
||||
:label="__('Published')"
|
||||
/>
|
||||
<FormControl
|
||||
v-model="batch.allow_self_enrollment"
|
||||
type="checkbox"
|
||||
:label="__('Allow self enrollment')"
|
||||
/>
|
||||
<FormControl
|
||||
v-model="batch.certification"
|
||||
type="checkbox"
|
||||
:label="__('Certification')"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="text-xs text-ink-gray-5 mb-2">
|
||||
{{ __('Meta Image') }}
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<Button @click="openFileSelector">
|
||||
{{ __('Upload') }}
|
||||
</Button>
|
||||
<div class="mt-2 text-ink-gray-5 text-sm">
|
||||
{{
|
||||
__(
|
||||
'Appears when the batch URL is shared on any online platform'
|
||||
)
|
||||
}}
|
||||
<FileUploader
|
||||
v-if="!batch.image"
|
||||
:fileTypes="['image/*']"
|
||||
:validateFile="validateFile"
|
||||
@success="(file) => saveImage(file)"
|
||||
>
|
||||
<template
|
||||
v-slot="{ file, progress, uploading, openFileSelector }"
|
||||
>
|
||||
<div class="flex items-center">
|
||||
<div class="border rounded-md w-fit py-5 px-20">
|
||||
<Image class="size-5 stroke-1 text-ink-gray-7" />
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<Button @click="openFileSelector">
|
||||
{{ __('Upload') }}
|
||||
</Button>
|
||||
<div class="mt-2 text-ink-gray-5 text-sm">
|
||||
{{
|
||||
__(
|
||||
'Appears when the batch URL is shared on any online platform'
|
||||
)
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</FileUploader>
|
||||
<div v-else class="mb-4">
|
||||
<div class="flex items-center">
|
||||
<img
|
||||
:src="batch.image.file_url"
|
||||
class="border rounded-md w-40"
|
||||
/>
|
||||
<div class="ml-4">
|
||||
<Button @click="removeImage()">
|
||||
{{ __('Remove') }}
|
||||
</Button>
|
||||
<div class="mt-2 text-ink-gray-5 text-sm">
|
||||
{{
|
||||
__(
|
||||
'Appears when the batch URL is shared on any online platform'
|
||||
)
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</FileUploader>
|
||||
<div v-else class="mb-4">
|
||||
<div class="flex items-center">
|
||||
<img :src="batch.image.file_url" class="border rounded-md w-40" />
|
||||
<div class="ml-4">
|
||||
<Button @click="removeImage()">
|
||||
{{ __('Remove') }}
|
||||
</Button>
|
||||
<div class="mt-2 text-ink-gray-5 text-sm">
|
||||
{{
|
||||
__(
|
||||
'Appears when the batch URL is shared on any online platform'
|
||||
)
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<MultiSelect
|
||||
v-model="instructors"
|
||||
doctype="User"
|
||||
:label="__('Instructors')"
|
||||
:required="true"
|
||||
:filters="{ ignore_user_type: 1 }"
|
||||
/>
|
||||
|
||||
<div class="my-10">
|
||||
<div class="text-lg font-semibold mb-4">
|
||||
{{ __('Date and Time') }}
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-10">
|
||||
<div class="grid grid-cols-3 gap-10">
|
||||
<div>
|
||||
<FormControl
|
||||
v-model="batch.start_date"
|
||||
@@ -115,14 +126,6 @@
|
||||
class="mb-4"
|
||||
:required="true"
|
||||
/>
|
||||
<FormControl
|
||||
v-model="batch.timezone"
|
||||
:label="__('Timezone')"
|
||||
type="text"
|
||||
:placeholder="__('Example: IST (+5:30)')"
|
||||
class="mb-4"
|
||||
:required="true"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<FormControl
|
||||
@@ -140,6 +143,16 @@
|
||||
:required="true"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<FormControl
|
||||
v-model="batch.timezone"
|
||||
:label="__('Timezone')"
|
||||
type="text"
|
||||
:placeholder="__('Example: IST (+5:30)')"
|
||||
class="mb-4"
|
||||
:required="true"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -147,7 +160,7 @@
|
||||
<div class="text-lg font-semibold mb-4">
|
||||
{{ __('Settings') }}
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-10">
|
||||
<div class="grid grid-cols-3 gap-10">
|
||||
<div>
|
||||
<FormControl
|
||||
v-model="batch.seat_count"
|
||||
@@ -162,11 +175,6 @@
|
||||
type="date"
|
||||
class="mb-4"
|
||||
/>
|
||||
<Link
|
||||
doctype="Email Template"
|
||||
:label="__('Email Template')"
|
||||
v-model="batch.confirmation_email_template"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<FormControl
|
||||
@@ -191,6 +199,13 @@
|
||||
v-model="batch.category"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<Link
|
||||
doctype="Email Template"
|
||||
:label="__('Email Template')"
|
||||
v-model="batch.confirmation_email_template"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -198,17 +213,16 @@
|
||||
<div class="text-lg font-semibold mb-4">
|
||||
{{ __('Payment') }}
|
||||
</div>
|
||||
<div>
|
||||
<FormControl
|
||||
v-model="batch.paid_batch"
|
||||
type="checkbox"
|
||||
:label="__('Paid Batch')"
|
||||
/>
|
||||
<FormControl
|
||||
v-model="batch.paid_batch"
|
||||
type="checkbox"
|
||||
:label="__('Paid Batch')"
|
||||
/>
|
||||
<div class="grid grid-cols-3 gap-10 mt-4">
|
||||
<FormControl
|
||||
v-model="batch.amount"
|
||||
:label="__('Amount')"
|
||||
type="number"
|
||||
class="my-4"
|
||||
/>
|
||||
<Link
|
||||
doctype="Currency"
|
||||
@@ -445,7 +459,7 @@ const createNewBatch = () => {
|
||||
})
|
||||
},
|
||||
onError(err) {
|
||||
showToast('Error', err.messages?.[0] || err, 'x')
|
||||
showToast('Message', err.messages?.[0] || err, 'alert-circle')
|
||||
},
|
||||
}
|
||||
)
|
||||
@@ -464,7 +478,7 @@ const editBatchDetails = () => {
|
||||
})
|
||||
},
|
||||
onError(err) {
|
||||
showToast('Error', err.messages?.[0] || err, 'x')
|
||||
showToast('Message', err.messages?.[0] || err, 'alert-circle')
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
@@ -50,8 +50,7 @@ export const sessionStore = defineStore('lms-session', () => {
|
||||
brand.name = data.app_name
|
||||
brand.logo = data.app_logo
|
||||
brand.favicon =
|
||||
data.favicon?.file_url ||
|
||||
'/assets/lms/frontend/public/learning.svg'
|
||||
data.favicon?.file_url || '/assets/lms/frontend/learning.svg'
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ export function showToast(title, text, icon, iconClasses = null) {
|
||||
icon: icon,
|
||||
iconClasses: iconClasses,
|
||||
position: icon == 'check' ? 'bottom-right' : 'top-center',
|
||||
timeout: 5,
|
||||
timeout: icon != 'check' ? 10 : 5,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ on_login = "lms.lms.user.on_login"
|
||||
add_to_apps_screen = [
|
||||
{
|
||||
"name": "lms",
|
||||
"logo": "/assets/lms/images/lms-logo.png",
|
||||
"logo": "/assets/lms/frontend/learning.svg",
|
||||
"title": "Learning",
|
||||
"route": "/lms",
|
||||
"has_permission": "lms.lms.api.check_app_permission",
|
||||
|
||||
@@ -53,7 +53,12 @@ class LMSBatch(Document):
|
||||
if self.paid_batch:
|
||||
installed_apps = frappe.get_installed_apps()
|
||||
if "payments" not in installed_apps:
|
||||
frappe.throw(_("Please install the Payments app to create a paid batches."))
|
||||
documentation_link = "https://docs.frappe.io/learning/setting-up-payment-gateway"
|
||||
frappe.throw(
|
||||
_(
|
||||
"Please install the Payments App to create a paid batch. Refer to the documentation for more details. {0}"
|
||||
).format(documentation_link)
|
||||
)
|
||||
|
||||
def validate_amount_and_currency(self):
|
||||
if self.paid_batch and (not self.amount or not self.currency):
|
||||
|
||||
@@ -50,7 +50,12 @@ class LMSCourse(Document):
|
||||
if self.paid_course:
|
||||
installed_apps = frappe.get_installed_apps()
|
||||
if "payments" not in installed_apps:
|
||||
frappe.throw(_("Please install the Payments app to create a paid courses."))
|
||||
documentation_link = "https://docs.frappe.io/learning/setting-up-payment-gateway"
|
||||
frappe.throw(
|
||||
_(
|
||||
"Please install the Payments App to create a paid course. Refer to the documentation for more details. {0}"
|
||||
).format(documentation_link)
|
||||
)
|
||||
|
||||
def validate_certification(self):
|
||||
if self.enable_certification and self.paid_certificate:
|
||||
|
||||
@@ -20,10 +20,11 @@ frappe.ui.form.on("LMS Settings", {
|
||||
frm.get_field("payments_app_is_not_installed").html(`
|
||||
<div class="alert alert-warning">
|
||||
Please install the
|
||||
<a target="_blank" style="color: var(--alert-text-warning); background: var(--alert-bg-warning);" href="https://frappecloud.com/marketplace/apps/payments">
|
||||
Payments app
|
||||
</a>
|
||||
to enable payment gateway.
|
||||
<a target="_blank" style="text-decoration: underline; color: var(--alert-text-warning); background: var(--alert-bg-warning);" href="https://frappecloud.com/marketplace/apps/payments">Payments app</a>
|
||||
to enable payment gateway. Refer to the
|
||||
<a target="_blank" style="text-decoration: underline; color: var(--alert-text-warning); background: var(--alert-bg-warning);" href="https://docs.frappe.io/learning/setting-up-payment-gateway">Documentation</a>
|
||||
for more information.
|
||||
</div>
|
||||
`);
|
||||
},
|
||||
});
|
||||
|
||||
390
lms/locale/ar.po
390
lms/locale/ar.po
File diff suppressed because it is too large
Load Diff
392
lms/locale/bs.po
392
lms/locale/bs.po
File diff suppressed because it is too large
Load Diff
390
lms/locale/de.po
390
lms/locale/de.po
File diff suppressed because it is too large
Load Diff
392
lms/locale/eo.po
392
lms/locale/eo.po
File diff suppressed because it is too large
Load Diff
390
lms/locale/es.po
390
lms/locale/es.po
File diff suppressed because it is too large
Load Diff
390
lms/locale/fa.po
390
lms/locale/fa.po
File diff suppressed because it is too large
Load Diff
388
lms/locale/fr.po
388
lms/locale/fr.po
File diff suppressed because it is too large
Load Diff
388
lms/locale/hr.po
388
lms/locale/hr.po
File diff suppressed because it is too large
Load Diff
388
lms/locale/hu.po
388
lms/locale/hu.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
388
lms/locale/pl.po
388
lms/locale/pl.po
File diff suppressed because it is too large
Load Diff
717
lms/locale/pt.po
717
lms/locale/pt.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
390
lms/locale/ru.po
390
lms/locale/ru.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
392
lms/locale/sv.po
392
lms/locale/sv.po
File diff suppressed because it is too large
Load Diff
388
lms/locale/th.po
388
lms/locale/th.po
File diff suppressed because it is too large
Load Diff
390
lms/locale/tr.po
390
lms/locale/tr.po
File diff suppressed because it is too large
Load Diff
392
lms/locale/zh.po
392
lms/locale/zh.po
File diff suppressed because it is too large
Load Diff
@@ -168,6 +168,11 @@ def get_meta_from_document(app_path):
|
||||
["job_title", "company_logo", "description"],
|
||||
as_dict=True,
|
||||
)
|
||||
|
||||
if job_opening.description:
|
||||
soup = BeautifulSoup(job_opening.description, "html.parser")
|
||||
job_opening.description = soup.get_text()
|
||||
|
||||
return {
|
||||
"title": job_opening.job_title,
|
||||
"image": job_opening.company_logo,
|
||||
|
||||
Reference in New Issue
Block a user