From b95a308f7a05fc4c6cd5efbfdb8f228667a3378d Mon Sep 17 00:00:00 2001 From: raizasafeel <89463672+raizasafeel@users.noreply.github.com> Date: Mon, 2 Mar 2026 12:10:31 +0530 Subject: [PATCH 1/3] fix(payment gateway): include reqd, options, default, and description in fields --- .../src/components/Settings/SettingFields.vue | 2 ++ lms/lms/api.py | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/Settings/SettingFields.vue b/frontend/src/components/Settings/SettingFields.vue index 7dfacb3d..11a9a3f3 100644 --- a/frontend/src/components/Settings/SettingFields.vue +++ b/frontend/src/components/Settings/SettingFields.vue @@ -20,6 +20,7 @@ :doctype="field.doctype" :label="__(field.label)" :description="__(field.description)" + :required="field.reqd" />
@@ -115,6 +116,7 @@ :rows="field.rows" :options="field.options" :description="field.description" + :required="field.reqd" placeholder="" />
diff --git a/lms/lms/api.py b/lms/lms/api.py index b38ee35e..22cad460 100644 --- a/lms/lms/api.py +++ b/lms/lms/api.py @@ -751,13 +751,25 @@ def get_transformed_fields(meta: list, data: dict = None): else: fieldtype = row.fieldtype - transformed_fields.append( - { - "label": row.label, - "name": row.fieldname, - "type": fieldtype, - } - ) + field = { + "label": row.label, + "name": row.fieldname, + "type": fieldtype, + } + + if row.reqd: + field["reqd"] = 1 + + if row.options: + field["options"] = row.options + + if row.default: + field["default"] = row.default + + if row.description: + field["description"] = row.description + + transformed_fields.append(field) return transformed_fields From 5ae56347531a2a049d07619fab15557fa4bd24f8 Mon Sep 17 00:00:00 2001 From: raizasafeel <89463672+raizasafeel@users.noreply.github.com> Date: Mon, 2 Mar 2026 13:02:06 +0530 Subject: [PATCH 2/3] fix(payment gateway): add missing removeAccount function --- .../components/Settings/PaymentGateways.vue | 20 +++++++++++++++++++ lms/lms/api.py | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/frontend/src/components/Settings/PaymentGateways.vue b/frontend/src/components/Settings/PaymentGateways.vue index c1f2c809..a35b8344 100644 --- a/frontend/src/components/Settings/PaymentGateways.vue +++ b/frontend/src/components/Settings/PaymentGateways.vue @@ -88,6 +88,7 @@ import { Badge, Button, + call, createListResource, FeatherIcon, ListView, @@ -97,10 +98,12 @@ import { ListRow, ListRowItem, ListSelectBanner, + toast, } from 'frappe-ui' import { computed, ref } from 'vue' import { Plus, Trash2 } from 'lucide-vue-next' import PaymentGatewayDetails from '@/components/Settings/PaymentGatewayDetails.vue' +import { cleanError } from '@/utils' const showForm = ref(false) const currentGateway = ref(null) @@ -128,6 +131,23 @@ const openForm = (gatewayID) => { showForm.value = true } +const removeAccount = (selections, unselectAll) => { + call('lms.lms.api.delete_documents', { + doctype: 'Payment Gateway', + documents: Array.from(selections), + }) + .then(() => { + paymentGateways.reload() + toast.success(__('Payment gateways deleted successfully')) + unselectAll() + }) + .catch((err) => { + toast.error( + cleanError(err.messages[0]) || __('Error deleting payment gateways') + ) + }) +} + const columns = computed(() => { return [ { diff --git a/lms/lms/api.py b/lms/lms/api.py index 22cad460..5140bf60 100644 --- a/lms/lms/api.py +++ b/lms/lms/api.py @@ -702,7 +702,13 @@ def save_certificate_details( @frappe.whitelist() def delete_documents(doctype: str, documents: list): frappe.only_for("Moderator") + meta = frappe.get_meta(doctype) + non_lms_allowed = ["Payment Gateway", "Email Template"] + if meta.module != "LMS" and doctype not in non_lms_allowed: + frappe.throw(_("Deletion not allowed for {0}").format(doctype)) for doc in documents: + if not isinstance(doc, str) or not doc.strip(): + frappe.throw(_("Invalid document name")) frappe.delete_doc(doctype, doc) From 1223ca8f29363e2f9b62b3c8d6dec774ff0257fb Mon Sep 17 00:00:00 2001 From: raizasafeel <89463672+raizasafeel@users.noreply.github.com> Date: Mon, 2 Mar 2026 13:21:04 +0530 Subject: [PATCH 3/3] fix(payment gateway): default values not pre-filling in new form --- .../components/Settings/PaymentGatewayDetails.vue | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/Settings/PaymentGatewayDetails.vue b/frontend/src/components/Settings/PaymentGatewayDetails.vue index feb21f88..b6d5cb0d 100644 --- a/frontend/src/components/Settings/PaymentGatewayDetails.vue +++ b/frontend/src/components/Settings/PaymentGatewayDetails.vue @@ -131,7 +131,7 @@ watch(newGateway, () => { let fields = gatewayFields.data || [] arrangeFields(fields) newGatewayFields.value = makeSections(fields) - prepareGatewayData() + prepareGatewayData(fields) }) }) @@ -209,13 +209,11 @@ const allGatewayOptions = computed(() => { return options.map((gateway: string) => ({ label: gateway, value: gateway })) }) -const prepareGatewayData = () => { +const prepareGatewayData = (fields: any[]) => { newGatewayData.value = {} - if (newGatewayFields.value.length) { - newGatewayFields.value.forEach((field: any) => { - newGatewayData.value[field.fieldname] = field.default || '' - }) - } + fields.forEach((field: any) => { + newGatewayData.value[field.name] = field.default || '' + }) } const makeSections = (fields: any[]) => {