fix: customer/supplier quick entry dialog (#33496)

* fix: readonly primary contact fields.

* refactor: supplier and customer quick entry form into common class.
diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js
index 14a088e..7b230af 100644
--- a/erpnext/public/js/erpnext.bundle.js
+++ b/erpnext/public/js/erpnext.bundle.js
@@ -13,6 +13,7 @@
 import "./agriculture/ternary_plot";
 import "./templates/item_quick_entry.html";
 import "./utils/item_quick_entry";
+import "./utils/contact_address_quick_entry";
 import "./utils/customer_quick_entry";
 import "./utils/supplier_quick_entry";
 import "./call_popup/call_popup";
diff --git a/erpnext/public/js/utils/contact_address_quick_entry.js b/erpnext/public/js/utils/contact_address_quick_entry.js
new file mode 100644
index 0000000..adabf08
--- /dev/null
+++ b/erpnext/public/js/utils/contact_address_quick_entry.js
@@ -0,0 +1,100 @@
+frappe.provide('frappe.ui.form');
+
+frappe.ui.form.ContactAddressQuickEntryForm = class ContactAddressQuickEntryForm extends frappe.ui.form.QuickEntryForm {
+	constructor(doctype, after_insert, init_callback, doc, force) {
+		super(doctype, after_insert, init_callback, doc, force);
+		this.skip_redirect_on_error = true;
+	}
+
+	render_dialog() {
+		this.mandatory = this.mandatory.concat(this.get_variant_fields());
+		super.render_dialog();
+	}
+
+	insert() {
+		/**
+		 * Using alias fieldnames because the doctype definition define "email_id" and "mobile_no" as readonly fields.
+		 * Therefor, resulting in the fields being "hidden".
+		 */
+		const map_field_names = {
+			"email_address": "email_id",
+			"mobile_number": "mobile_no",
+		};
+
+		Object.entries(map_field_names).forEach(([fieldname, new_fieldname]) => {
+			this.dialog.doc[new_fieldname] = this.dialog.doc[fieldname];
+			delete this.dialog.doc[fieldname];
+		});
+
+		return super.insert();
+	}
+
+	get_variant_fields() {
+		var variant_fields = [{
+			fieldtype: "Section Break",
+			label: __("Primary Contact Details"),
+			collapsible: 1
+		},
+		{
+			label: __("Email Id"),
+			fieldname: "email_address",
+			fieldtype: "Data",
+			options: "Email",
+		},
+		{
+			fieldtype: "Column Break"
+		},
+		{
+			label: __("Mobile Number"),
+			fieldname: "mobile_number",
+			fieldtype: "Data"
+		},
+		{
+			fieldtype: "Section Break",
+			label: __("Primary Address Details"),
+			collapsible: 1
+		},
+		{
+			label: __("Address Line 1"),
+			fieldname: "address_line1",
+			fieldtype: "Data"
+		},
+		{
+			label: __("Address Line 2"),
+			fieldname: "address_line2",
+			fieldtype: "Data"
+		},
+		{
+			label: __("ZIP Code"),
+			fieldname: "pincode",
+			fieldtype: "Data"
+		},
+		{
+			fieldtype: "Column Break"
+		},
+		{
+			label: __("City"),
+			fieldname: "city",
+			fieldtype: "Data"
+		},
+		{
+			label: __("State"),
+			fieldname: "state",
+			fieldtype: "Data"
+		},
+		{
+			label: __("Country"),
+			fieldname: "country",
+			fieldtype: "Link",
+			options: "Country"
+		},
+		{
+			label: __("Customer POS Id"),
+			fieldname: "customer_pos_id",
+			fieldtype: "Data",
+			hidden: 1
+		}];
+
+		return variant_fields;
+	}
+}
diff --git a/erpnext/public/js/utils/customer_quick_entry.js b/erpnext/public/js/utils/customer_quick_entry.js
index d2c5c72..b253208 100644
--- a/erpnext/public/js/utils/customer_quick_entry.js
+++ b/erpnext/public/js/utils/customer_quick_entry.js
@@ -1,81 +1,3 @@
 frappe.provide('frappe.ui.form');
 
-frappe.ui.form.CustomerQuickEntryForm = class CustomerQuickEntryForm extends frappe.ui.form.QuickEntryForm {
-	constructor(doctype, after_insert, init_callback, doc, force) {
-		super(doctype, after_insert, init_callback, doc, force);
-		this.skip_redirect_on_error = true;
-	}
-
-	render_dialog() {
-		this.mandatory = this.mandatory.concat(this.get_variant_fields());
-		super.render_dialog();
-	}
-
-	get_variant_fields() {
-		var variant_fields = [{
-			fieldtype: "Section Break",
-			label: __("Primary Contact Details"),
-			collapsible: 1
-		},
-		{
-			label: __("Email Id"),
-			fieldname: "email_id",
-			fieldtype: "Data"
-		},
-		{
-			fieldtype: "Column Break"
-		},
-		{
-			label: __("Mobile Number"),
-			fieldname: "mobile_no",
-			fieldtype: "Data"
-		},
-		{
-			fieldtype: "Section Break",
-			label: __("Primary Address Details"),
-			collapsible: 1
-		},
-		{
-			label: __("Address Line 1"),
-			fieldname: "address_line1",
-			fieldtype: "Data"
-		},
-		{
-			label: __("Address Line 2"),
-			fieldname: "address_line2",
-			fieldtype: "Data"
-		},
-		{
-			label: __("ZIP Code"),
-			fieldname: "pincode",
-			fieldtype: "Data"
-		},
-		{
-			fieldtype: "Column Break"
-		},
-		{
-			label: __("City"),
-			fieldname: "city",
-			fieldtype: "Data"
-		},
-		{
-			label: __("State"),
-			fieldname: "state",
-			fieldtype: "Data"
-		},
-		{
-			label: __("Country"),
-			fieldname: "country",
-			fieldtype: "Link",
-			options: "Country"
-		},
-		{
-			label: __("Customer POS Id"),
-			fieldname: "customer_pos_id",
-			fieldtype: "Data",
-			hidden: 1
-		}];
-
-		return variant_fields;
-	}
-}
+frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.ContactAddressQuickEntryForm;
diff --git a/erpnext/public/js/utils/supplier_quick_entry.js b/erpnext/public/js/utils/supplier_quick_entry.js
index 8d591a9..687b014 100644
--- a/erpnext/public/js/utils/supplier_quick_entry.js
+++ b/erpnext/public/js/utils/supplier_quick_entry.js
@@ -1,77 +1,3 @@
 frappe.provide('frappe.ui.form');
 
-frappe.ui.form.SupplierQuickEntryForm = class SupplierQuickEntryForm extends frappe.ui.form.QuickEntryForm {
-	constructor(doctype, after_insert, init_callback, doc, force) {
-		super(doctype, after_insert, init_callback, doc, force);
-		this.skip_redirect_on_error = true;
-	}
-
-	render_dialog() {
-		this.mandatory = this.mandatory.concat(this.get_variant_fields());
-		super.render_dialog();
-	}
-
-	get_variant_fields() {
-		var variant_fields = [
-			{
-				fieldtype: "Section Break",
-				label: __("Primary Contact Details"),
-				collapsible: 1
-			},
-			{
-				label: __("Email Id"),
-				fieldname: "email_id",
-				fieldtype: "Data"
-			},
-			{
-				fieldtype: "Column Break"
-			},
-			{
-				label: __("Mobile Number"),
-				fieldname: "mobile_no",
-				fieldtype: "Data"
-			},
-			{
-				fieldtype: "Section Break",
-				label: __("Primary Address Details"),
-				collapsible: 1
-			},
-			{
-				label: __("Address Line 1"),
-				fieldname: "address_line1",
-				fieldtype: "Data"
-			},
-			{
-				label: __("Address Line 2"),
-				fieldname: "address_line2",
-				fieldtype: "Data"
-			},
-			{
-				label: __("ZIP Code"),
-				fieldname: "pincode",
-				fieldtype: "Data"
-			},
-			{
-				fieldtype: "Column Break"
-			},
-			{
-				label: __("City"),
-				fieldname: "city",
-				fieldtype: "Data"
-			},
-			{
-				label: __("State"),
-				fieldname: "state",
-				fieldtype: "Data"
-			},
-			{
-				label: __("Country"),
-				fieldname: "country",
-				fieldtype: "Link",
-				options: "Country"
-			}
-		];
-
-		return variant_fields;
-	}
-};
+frappe.ui.form.SupplierQuickEntryForm = frappe.ui.form.ContactAddressQuickEntryForm;