diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index e43325f..26c793e 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -550,53 +550,106 @@
 
 erpnext.select_batch_and_serial_no = (frm) => {
 
-	let show_modal = (item_code, qty) => {
-		let d = new frappe.ui.Dialog({
-			fields: [
-				{fieldname: 'item_code', read_only: 1, fieldtype:'Link', options: 'Item',
-					label: __('Item Code'), 'default': item_code},
-				{fieldtype:'Column Break'},
-				{fieldname: 'qty', fieldtype:'Float', label: __('Qty'), 'default': qty},
-				{fieldtype:'Section Break'},
+	let set_available_qty = (item_code, batch_no, warehouse, field) => {
+		frappe.call({
+			method: 'erpnext.stock.doctype.batch.batch.get_batch_qty',
+			args: {
+				batch_no: batch_no,
+				warehouse: warehouse,
+				item_code: item_code
+			},
+			callback: (r) => {
+				if (r.message) {
+					field.set_value(r.message);
+					field.$input.trigger('change');
+				}
+			}
+		});
+	}
+
+	let get_warehouse = (i) => {
+		// console.log("i", i);
+		// console.log("cstr(i.s_warehouse) || cstr(i.t_warehouse)", cstr(i.s_warehouse) || cstr(i.t_warehouse));
+		return cstr(i.s_warehouse) ? cstr(i.s_warehouse) : cstr(i.t_warehouse);
+	}
+	// console.log("available_qty", get_available_qty("_Test FG Item", 'tfi', 'Stores - A'));
+
+	// get_warehouse();
+
+	let show_modal = (item_code, qty, warehouse, has_batch, has_serial) => {
+		// get_warehouse(i);
+		let fields = [
+			{fieldname: 'item_code', read_only: 1, fieldtype:'Link', options: 'Item',
+				label: __('Item Code'), 'default': item_code},
+			{fieldtype:'Column Break'},
+			{fieldname: 'qty', fieldtype:'Float', label: __('Qty'), 'default': qty},
+			{fieldtype:'Section Break'}
+		];
+		if(has_batch) {
+			fields.push(
 				{fieldname: 'batches', fieldtype: 'Table',
 					fields: [
 						{fieldtype:'Link', fieldname:'batch_no', options: 'Batch',
 							label: __('Select Batch'), in_list_view:1, get_query: function(doc) {
 								return {filters: {item: item_code }};
 							}},
-						{fieldtype:'Float', fieldname:'available_qty',
+						{fieldtype:'Float', read_only: 1, fieldname:'available_qty',
 							label: __('Available'), in_list_view:1},
 						{fieldtype:'Float', fieldname:'selected_qty',
 							label: __('Qty'), in_list_view:1},
 					],
+					data: [],
+					// data_length: 3,
 					get_data: function() {
-						console.log("in get data");
-						return [
-							{
-
-							},
-							{
-
-							},
-							{
-
-							}
-						]
+						return this.data;
+					},
+					bind_events: function(grid) {
+						var me = this;
+						grid.wrapper.on('change', 'input[data-fieldname="batch_no"]', function(e) {
+							let $row = $(this).closest('.grid-row');
+							let name = $row.attr('data-name');
+							let row = grid.grid_rows_by_docname[name];
+							// console.log("bind changed: ", $(this), name, row.doc.batch_no, row.doc.idx);
+							// console.log(grid.grid_rows_by_docname);
+							set_available_qty(item_code, row.doc.batch_no, warehouse, row.on_grid_fields[1]);
+						});
 					}
-				}
-			]
+			});
+		}
+		if(has_serial) {
+			fields.push(
+				{fieldname: 'serial_no', fieldtype: 'Small Text', label: __('Serial No')}
+			)
+		}
+		let d = new frappe.ui.Dialog({
+			fields: fields
 		});
 
+		d.set_primary_action(__('Get Items'), function() {
+			var values = d.get_values();
+			d.hide();
+		})
+
 		d.show();
 	}
 
-	show_modal("_Test FG Item", 1);
+	show_modal("_Test FG Item", 10, 'Stores - A', 1, 0);
 
-	// frm.doc.items.forEach(function(d) {
-	// 	if(d.has_batch_no && !d.batch_no) {
-	// 		show_modal(d.item_code, d.qty);
-	// 	}
-	// });
+	frm.doc.items.forEach(function(d){
+		if(d.has_batch_no && !d.batch_no) {
+			console.log("item code, ");
+
+		}
+	});
+
+	frm.doc.items.forEach(function(d) {
+		if(d.has_batch_no && !d.batch_no) {
+			show_modal(d.item_code, d.qty, get_warehouse(d), 1, 0);
+		}
+		if(d.has_serial_no && !d.serial_no) {
+			show_modal(d.item_code, d.qty, get_warehouse(d), 0, 1);
+		}
+	});
 
 
 }
\ No newline at end of file
