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[]) => {