- {{ __(label) }}
+
+
+
+
-
+
{{ __(description) }}
-
-
-
-
+
@@ -31,7 +31,7 @@ import { Button, Badge, toast } from 'frappe-ui'
import SettingFields from '@/components/Settings/SettingFields.vue'
const props = defineProps({
- fields: {
+ sections: {
type: Array,
required: true,
},
@@ -49,13 +49,6 @@ const props = defineProps({
})
const update = () => {
- props.fields.forEach((f) => {
- if (f.type == 'Upload') {
- props.data.doc[f.name] = f.value ? f.value.file_url : null
- } else if (f.type != 'Column Break') {
- props.data.doc[f.name] = f.value
- }
- })
props.data.save.submit(
{},
{
diff --git a/frontend/src/components/Settings/SettingFields.vue b/frontend/src/components/Settings/SettingFields.vue
index 189a486c..efb9c071 100644
--- a/frontend/src/components/Settings/SettingFields.vue
+++ b/frontend/src/components/Settings/SettingFields.vue
@@ -1,115 +1,123 @@
-
-
+
+
+
+ {{ section.label }}
+
-
-
-
-
-
+
+
-
-
+ :doctype="field.doctype"
+ :label="__(field.label)"
+ :description="__(field.description)"
+ />
-
-
-
- {{ __(field.label) }}
-
-
- {{ __(field.description) }}
-
-
-
(data[field.name] = file)"
- >
-
+
-
-
+
+
+
+
+
+
+ {{ __(field.label) }}
-
-
-
-
-
+ {{ __(field.description) }}
+
+
+
(data[field.name] = file)"
+ >
+
-
+
+
+
+
+
+
+
+
![]()
+
+
+
+ {{
+ data[field.name]?.file_name ||
+ data[field.name].split('/').pop()
+ }}
+
+
+ {{ getFileSize(data[field.name]?.file_size) }}
+
+
+
-
-
- {{
- data[field.name]?.file_name ||
- data[field.name].split('/').pop()
- }}
-
-
- {{ getFileSize(data[field.name]?.file_size) }}
-
-
-
+
+
+
-
-
-
-
@@ -117,14 +125,14 @@
diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue
index dc2bef49..f65510a6 100644
--- a/frontend/src/components/Settings/Settings.vue
+++ b/frontend/src/components/Settings/Settings.vue
@@ -11,7 +11,7 @@
{{ __(tab.label) }}
@@ -38,7 +38,7 @@
label: activeTab.label,
description: activeTab.description,
...(activeTab.label == 'Branding'
- ? { fields: activeTab.fields }
+ ? { sections: activeTab.sections }
: {}),
...(activeTab.label == 'Evaluators' ||
activeTab.label == 'Members' ||
@@ -47,16 +47,9 @@
: {}),
}"
/>
-
{
return [
{
- label: 'Settings',
+ label: 'Configuration',
hideLabel: true,
items: [
{
label: 'General',
icon: 'Wrench',
- fields: [
+ sections: [
{
- label: 'Allow Guest Access',
- name: 'allow_guest_access',
- description:
- 'If enabled, users can access the course and batch lists without logging in.',
- type: 'checkbox',
+ label: 'System Configurations',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Allow Guest Access',
+ name: 'allow_guest_access',
+ description:
+ 'If enabled, users can access the course and batch lists without logging in.',
+ type: 'checkbox',
+ },
+ {
+ label: 'Prevent Skipping Videos',
+ name: 'prevent_skipping_videos',
+ type: 'checkbox',
+ description:
+ 'If enabled, users will no able to move forward in a video',
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ 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',
+ description:
+ 'If enabled, it sends google calendar invite to the student for evaluations.',
+ type: 'checkbox',
+ },
+ ],
+ },
+ ],
},
{
- label: 'Prevent Skipping Videos',
- name: 'prevent_skipping_videos',
- type: 'checkbox',
- description:
- 'If enabled, users will no able to move forward in a video',
+ label: 'Notifications',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Send Notification for Published Courses',
+ name: 'send_notification_for_published_courses',
+ type: 'select',
+ options: [' ', 'Email', 'In-app'],
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ label: 'Send Notification for Published Batches',
+ name: 'send_notification_for_published_batches',
+ type: 'select',
+ options: [' ', 'Email', 'In-app'],
+ },
+ ],
+ },
+ ],
},
{
- 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: 'Email Templates',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Batch Confirmation Email Template',
+ name: 'batch_confirmation_template',
+ doctype: 'Email Template',
+ type: 'Link',
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ label: 'Certification Email Template',
+ name: 'certification_template',
+ doctype: 'Email Template',
+ type: 'Link',
+ },
+ ],
+ },
+ ],
},
{
- label: 'Send calendar invite for evaluations',
- name: 'send_calendar_invite_for_evaluations',
- description:
- 'If enabled, it sends google calendar invite to the student for evaluations.',
- type: 'checkbox',
+ label: 'Contact Information',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Email',
+ name: 'contact_us_email',
+ type: 'text',
+ description:
+ 'Users can reach out to this email for support or inquiries.',
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ label: 'URL',
+ name: 'contact_us_url',
+ type: 'text',
+ description:
+ 'Users can reach out to this URL for support or inquiries.',
+ },
+ ],
+ },
+ ],
},
{
- type: 'Column Break',
- },
- {
- label: 'Livecode URL',
- name: 'livecode_url',
- doctype: 'Livecode URL',
- type: 'text',
- description:
- 'https://docs.frappe.io/learning/falcon-self-hosting-guide',
- },
- {
- label: 'Batch Confirmation Email Template',
- name: 'batch_confirmation_template',
- doctype: 'Email Template',
- type: 'Link',
- },
- {
- label: 'Certification Email Template',
- name: 'certification_template',
- doctype: 'Email Template',
- type: 'Link',
- },
- {
- label: 'Unsplash Access Key',
- name: 'unsplash_access_key',
- description:
- 'Allows users to pick a profile cover image from Unsplash. https://unsplash.com/documentation#getting-started.',
- type: 'password',
- },
- ],
- },
- {
- label: 'Contact Us',
- icon: 'Phone',
- fields: [
- {
- label: 'Email',
- name: 'contact_us_email',
- type: 'text',
- description:
- 'Users can reach out to this email for support or inquiries.',
- },
- {
- label: 'URL',
- name: 'contact_us_url',
- type: 'text',
- description:
- 'Users can reach out to this URL for support or inquiries.',
+ label: '',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Livecode URL',
+ name: 'livecode_url',
+ doctype: 'Livecode URL',
+ type: 'text',
+ description:
+ 'https://docs.frappe.io/learning/falcon-self-hosting-guide',
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ label: 'Unsplash Access Key',
+ name: 'unsplash_access_key',
+ description:
+ 'Allows users to pick a profile cover image from Unsplash. https://unsplash.com/documentation#getting-started.',
+ type: 'password',
+ },
+ ],
+ },
+ ],
},
],
},
@@ -243,36 +304,45 @@ const tabsStructure = computed(() => {
label: 'Configuration',
icon: 'CreditCard',
description: 'Manage all your payment related settings and defaults',
- fields: [
+ sections: [
{
- label: 'Default Currency',
- name: 'default_currency',
- type: 'Link',
- doctype: 'Currency',
- },
- {
- label: 'Payment Gateway',
- name: 'payment_gateway',
- type: 'Link',
- doctype: 'Payment Gateway',
- },
- {
- type: 'Column Break',
- },
- {
- label: 'Apply GST for India',
- name: 'apply_gst',
- type: 'checkbox',
- },
- {
- label: 'Show USD equivalent amount',
- name: 'show_usd_equivalent',
- type: 'checkbox',
- },
- {
- label: 'Apply rounding on equivalent',
- name: 'apply_rounding',
- type: 'checkbox',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Default Currency',
+ name: 'default_currency',
+ type: 'Link',
+ doctype: 'Currency',
+ },
+ {
+ label: 'Payment Gateway',
+ name: 'payment_gateway',
+ type: 'Link',
+ doctype: 'Payment Gateway',
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ label: 'Apply GST for India',
+ name: 'apply_gst',
+ type: 'checkbox',
+ },
+ {
+ label: 'Show USD equivalent amount',
+ name: 'show_usd_equivalent',
+ type: 'checkbox',
+ },
+ {
+ label: 'Apply rounding on equivalent',
+ name: 'apply_rounding',
+ type: 'checkbox',
+ },
+ ],
+ },
+ ],
},
],
},
@@ -304,25 +374,33 @@ const tabsStructure = computed(() => {
label: 'Branding',
icon: 'Blocks',
template: markRaw(BrandSettings),
- fields: [
+ sections: [
{
- label: 'Brand Name',
- name: 'app_name',
- type: 'text',
- },
- {
- label: 'Logo',
- name: 'banner_image',
- type: 'Upload',
- description:
- 'Appears in the top left corner of the application to represent your brand.',
- },
- {
- label: 'Favicon',
- name: 'favicon',
- type: 'Upload',
- description:
- 'Appears in the browser tab next to the page title to help users quickly identify the application.',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Brand Name',
+ name: 'app_name',
+ type: 'text',
+ },
+ {
+ label: 'Logo',
+ name: 'banner_image',
+ type: 'Upload',
+ description:
+ 'Appears in the top left corner of the application to represent your brand.',
+ },
+ {
+ label: 'Favicon',
+ name: 'favicon',
+ type: 'Upload',
+ description:
+ 'Appears in the browser tab next to the page title to help users quickly identify the application.',
+ },
+ ],
+ },
+ ],
},
],
},
@@ -330,105 +408,124 @@ const tabsStructure = computed(() => {
label: 'Sidebar',
icon: 'PanelLeftIcon',
description: 'Choose the items you want to show in the sidebar',
- fields: [
+ sections: [
{
- label: 'Courses',
- name: 'courses',
- type: 'checkbox',
- },
- {
- label: 'Batches',
- name: 'batches',
- type: 'checkbox',
- },
- {
- label: 'Programming Exercises',
- name: 'programming_exercises',
- type: 'checkbox',
- },
- {
- label: 'Certifications',
- name: 'certifications',
- type: 'checkbox',
- },
- {
- type: 'Column Break',
- },
- {
- label: 'Jobs',
- name: 'jobs',
- type: 'checkbox',
- },
- {
- label: 'Statistics',
- name: 'statistics',
- type: 'checkbox',
- },
- {
- label: 'Notifications',
- name: 'notifications',
- type: 'checkbox',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Courses',
+ name: 'courses',
+ type: 'checkbox',
+ },
+ {
+ label: 'Batches',
+ name: 'batches',
+ type: 'checkbox',
+ },
+ {
+ label: 'Programming Exercises',
+ name: 'programming_exercises',
+ type: 'checkbox',
+ },
+ {
+ label: 'Certifications',
+ name: 'certifications',
+ type: 'checkbox',
+ },
+ ],
+ },
+ {
+ fields: [
+ {
+ label: 'Jobs',
+ name: 'jobs',
+ type: 'checkbox',
+ },
+ {
+ label: 'Statistics',
+ name: 'statistics',
+ type: 'checkbox',
+ },
+ {
+ label: 'Notifications',
+ name: 'notifications',
+ type: 'checkbox',
+ },
+ ],
+ },
+ ],
},
],
},
{
label: 'Signup',
icon: 'LogIn',
- fields: [
+ sections: [
{
- label: 'Identify User Category',
- name: 'user_category',
- type: 'checkbox',
- description:
- 'Enable this option to identify the user category during signup.',
- },
- {
- label: 'Disable signup',
- name: 'disable_signup',
- type: 'checkbox',
- description:
- 'New users will have to be manually registered by Admins.',
- },
- {
- type: 'Column Break',
- },
- {
- label: 'Signup Consent HTML',
- name: 'custom_signup_content',
- type: 'Code',
- mode: 'htmlmixed',
- rows: 10,
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Identify User Category',
+ name: 'user_category',
+ type: 'checkbox',
+ description:
+ 'Enable this option to identify the user category during signup.',
+ },
+ {
+ label: 'Disable signup',
+ name: 'disable_signup',
+ type: 'checkbox',
+ description:
+ 'New users will have to be manually registered by Admins.',
+ },
+ {
+ label: 'Signup Consent HTML',
+ name: 'custom_signup_content',
+ type: 'Code',
+ mode: 'htmlmixed',
+ rows: 10,
+ },
+ ],
+ },
+ ],
},
],
},
{
label: 'SEO',
icon: 'Search',
- fields: [
+ sections: [
{
- label: 'Meta Description',
- name: 'meta_description',
- type: 'textarea',
- rows: 4,
- description:
- "This description will be shown on lists and pages that don't have meta description",
- },
- {
- label: 'Meta Keywords',
- name: 'meta_keywords',
- type: 'textarea',
- rows: 4,
- description:
- 'Comma separated keywords for search engines to find your website.',
- },
- {
- type: 'Column Break',
- },
- {
- label: 'Meta Image',
- name: 'meta_image',
- type: 'Upload',
- size: 'lg',
+ columns: [
+ {
+ fields: [
+ {
+ label: 'Meta Description',
+ name: 'meta_description',
+ type: 'textarea',
+ rows: 4,
+ description:
+ "This description will be shown on lists and pages that don't have meta description",
+ },
+ {
+ label: 'Meta Keywords',
+ name: 'meta_keywords',
+ type: 'textarea',
+ rows: 4,
+ description:
+ 'Comma separated keywords for search engines to find your website.',
+ },
+ {
+ label: 'Meta Image',
+ name: 'meta_image',
+ type: 'Upload',
+ size: 'lg',
+ },
+ ],
+ },
+ ],
},
],
},
diff --git a/lms/lms/doctype/lms_settings/lms_settings.json b/lms/lms/doctype/lms_settings/lms_settings.json
index 6abac433..e9207e91 100644
--- a/lms/lms/doctype/lms_settings/lms_settings.json
+++ b/lms/lms/doctype/lms_settings/lms_settings.json
@@ -6,16 +6,20 @@
"engine": "InnoDB",
"field_order": [
"general_tab",
- "default_home",
- "send_calendar_invite_for_evaluations",
- "persona_captured",
- "column_break_zdel",
"allow_guest_access",
"prevent_skipping_videos",
+ "send_calendar_invite_for_evaluations",
+ "column_break_zdel",
"disable_pwa",
+ "persona_captured",
+ "default_home",
"column_break_bjis",
"unsplash_access_key",
"livecode_url",
+ "notifications_section",
+ "send_notification_for_published_courses",
+ "column_break_dtns",
+ "send_notification_for_published_batches",
"section_break_szgq",
"show_day_view",
"column_break_2",
@@ -446,13 +450,34 @@
"fieldname": "disable_pwa",
"fieldtype": "Check",
"label": "Disable PWA"
+ },
+ {
+ "fieldname": "send_notification_for_published_courses",
+ "fieldtype": "Select",
+ "label": "Send Notification for Published Courses",
+ "options": "\nEmail\nIn-app"
+ },
+ {
+ "fieldname": "send_notification_for_published_batches",
+ "fieldtype": "Select",
+ "label": "Send Notification for Published Batches",
+ "options": "\nEmail\nIn-app"
+ },
+ {
+ "fieldname": "notifications_section",
+ "fieldtype": "Section Break",
+ "label": "Notifications"
+ },
+ {
+ "fieldname": "column_break_dtns",
+ "fieldtype": "Column Break"
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
- "modified": "2025-12-22 11:30:13.868031",
+ "modified": "2026-01-01 19:36:54.443390",
"modified_by": "sayali@frappe.io",
"module": "LMS",
"name": "LMS Settings",