Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/setup/doctype/price_list/price_list.js b/setup/doctype/price_list/price_list.js
index f3adc72..6dfbd0f 100644
--- a/setup/doctype/price_list/price_list.js
+++ b/setup/doctype/price_list/price_list.js
@@ -5,4 +5,305 @@
 	onload: function() {
 		erpnext.add_for_territory();
 	},
+});
+
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
+	cur_frm.cscript.show_item_prices();
+}
+
+cur_frm.cscript.show_item_prices = function() {
+	var counter = 0;
+	var item_price = wn.model.get("Item Price", {parent: cur_frm.doc.name});
+	
+	new wn.ui.form.TableGrid({
+		parent: cur_frm.fields_dict.item_prices.wrapper,
+		frm: cur_frm,
+		table_field: wn.model.get("DocField", {parent:"Price List", fieldname:"item_prices"})[0]
+	});
+}
+
+wn.ui.form.TableGrid = Class.extend({
+	init: function(opts) {
+		$.extend(this, opts);
+		this.fields = wn.model.get("DocField", {parent: this.table_field.options});
+		this.make_table();
+	},
+	make_table: function() {
+		var me = this;
+		// Creating table & assigning attributes
+		var grid_table = document.createElement("table");
+		$(grid_table).attr("class", "table table-hover table-bordered grid");
+		
+		// Appending header & rows to table
+
+		$(this.make_table_headers()).appendTo(grid_table);
+		$(this.make_table_rows()).appendTo(grid_table);
+				
+		// Creating button to add new row
+		var btn_div = document.createElement("div");
+		var new_row_btn = document.createElement("button");
+		$new_row_btn = $(new_row_btn);
+		$new_row_btn.attr({
+			"class": "btn btn-success table-new-row",
+			"title": "Add new row"
+		});
+		var btn_icon = document.createElement("i");
+		$(btn_icon).attr("class", "icon-plus");
+		$(btn_icon).appendTo(new_row_btn);
+		$new_row_btn.append(" Add new row");
+		$new_row_btn.appendTo(btn_div);
+
+		// Appending table & button to parent
+		var $grid_table = $(grid_table).appendTo($(this.parent));
+		var $btn_div = $(btn_div).appendTo($(this.parent));
+
+		$btn_div.on("click", ".table-new-row", function() {
+			me.make_dialog();
+			return false;
+		});
+
+		$grid_table.on("click", ".table-row", function() {
+			me.make_dialog(this);
+			return false;
+		});
+	},
+	make_table_headers: function() {
+		var me = this;
+		var header = document.createElement("thead");
+		
+		// Creating header row
+		var row = document.createElement("tr");
+		$(row).attr({
+			"class": "active",
+			"style": "height:50px"
+		});
+		$(row).appendTo(header);
+
+		// Creating head first cell
+		var th = document.createElement("th");
+		$(th).attr({
+			"width": "8%",
+			"style": "vertical-align:middle",
+			"class": "text-center"
+		});
+		$(th).html("#");
+		$(th).appendTo(row);
+
+		// Make other headers with label as heading
+		$.each(this.fields, function(i, obj) {
+			if (obj.in_list_view===1)
+				var th = document.createElement("th");
+				$(th).attr("style", "vertical-align:middle");
+				$(th).html(obj.label);
+				$(th).appendTo(row);
+		});
+
+		return header;
+	},
+	make_table_rows: function() {
+		var me = this;
+
+		// Creating table body
+		var table_body = document.createElement("tbody");
+		$(table_body).attr("style", "cursor:pointer");
+
+		$.each(wn.model.get_children(this.table_field.options, this.frm.doc.name, 
+			this.table_field.fieldname, this.frm.doctype), function(index, d) {
+
+				// Creating table row
+				var tr = document.createElement("tr");
+				$(tr).attr({
+					"class": "table-row",
+					"data-idx": d.idx
+				});
+
+				// Creating table data & appending to row
+				var td = document.createElement("td");
+				$(td).attr("class", "text-center");
+				$(td).html(d.idx);
+				$(td).appendTo(tr);
+
+				$.each(me.fields, function(i, obj) {
+					if (obj.in_list_view===1) {
+						var td = document.createElement("td");
+						$(td).attr({
+							"data-fieldtype": obj.fieldtype,
+							"data-fieldname": obj.fieldname,
+							"data-fieldvalue": d[obj.fieldname],
+							"data-doc_name": d["name"]
+						});
+						$(td).html(d[obj.fieldname]);
+						
+						// if field is currency then add style & change text
+						if (obj.fieldtype=="Currency") {
+							$(td).attr("style", "text-align:right");
+							$(td).html(format_currency(d[obj.fieldname], me.frm.doc.currency));
+						}
+						
+						// Append td to row
+						$(td).appendTo(tr);
+					}
+				});
+
+				// Append row to table body
+				$(tr).appendTo(table_body);
+		});
+		
+		return table_body;
+	},
+	make_dialog: function(row) {
+		var me = this;
+
+		this.dialog = new wn.ui.Dialog({
+			title: this.table_field.options, 
+			fields: this.fields
+		});
+
+		this.dialog.set_values(this.make_dialog_values(row));
+
+		$a(this.dialog.body, 'div', '', '', this.make_dialog_buttons());
+		this.dialog.show();
+
+		this.dialog.$wrapper.find('button.update').on('click', function() {
+			me.update_row(row);
+		});
+
+		this.dialog.$wrapper.find('button.delete').on('click', function() {
+			me.delete_row(row);
+		});
+		return row;
+	},
+	// make_dialog_fields: function() {
+	// 	var me = this;
+	// 	var fields = [];
+		
+	// 	$.each(this.fields, function(i, obj) {
+	// 		var dialog_field = {
+	// 			fieldtype: obj.fieldtype, 
+	// 			fieldname: obj.fieldname, 
+	// 			label: obj.label
+	// 		}
+
+	// 		// check if fields has options
+	// 		if (obj.options) {
+	// 			var options = {options: obj.options}
+	// 			$.extend(dialog_field, options);
+	// 		}
+
+	// 		// check if field is mandatory
+	// 		if (obj.reqd == 1) {
+	// 			var reqd = {reqd: obj.reqd}
+	// 			$.extend(dialog_field, reqd);
+	// 		}
+
+	// 		fields.push(obj);
+	// 	});
+
+	// 	return fields;
+	// },
+	make_dialog_values: function(row) {
+		var me = this;
+		var dialog_values = {};
+
+		$.each(this.fields, function(i, item) {
+			dialog_values[item.fieldname] = $(row).find('td[data-fieldname="'+ item.fieldname +'"]').data('fieldvalue');
+		});
+
+		return dialog_values;
+	},
+	make_dialog_buttons: function() {
+		var me = this;
+		var buttons = '<button class="btn btn-primary update">Update</button>';
+
+		// if user can delete then only add the delete button in dialog
+		if (wn.model.can_delete(me.frm.doc.doctype))
+			buttons += ' <button class="btn btn-default delete">Delete</button>';
+
+		return buttons;
+	},
+	update_row: function(row) {
+		var me = this;
+
+		if (!row) {
+			me.add_new_row();
+		}
+		else {
+			$.each(me.fields, function(i, item) {
+				var $td = $(row).find('td[data-fieldname="'+ item.fieldname +'"]');
+				var val = me.dialog.get_values()[item.fieldname];
+				
+				wn.model.set_value(me.table_field.options, $td.attr('data-doc_name'), 
+					item.fieldname, me.dialog.get_values()[item.fieldname]);
+				$td.attr('data-fieldvalue', val);
+				
+				// If field type is currency the update with format currency
+				if ($td.attr('data-fieldtype') == "Currency")
+					$td.html(format_currency(val, me.frm.doc.currency));
+				else
+					$td.html(val);
+			});
+		}
+		
+		this.dialog.hide();
+	},
+	delete_row: function(row) {
+		var me = this;
+		var doc_name = $(row).find('td:last').attr('data-doc_name');
+		wn.model.clear_doc(me.table_field.options, doc_name);
+		$(row).remove();
+
+		// Re-assign idx
+		$.each($(this.parent).find(".grid tbody tr"), function(idx, data) {
+			$(data).attr("data-idx", idx + 1);
+			var $td = $(data).find('td:first');
+			$td.html(idx + 1);
+		});
+		this.dialog.hide();
+	},
+	add_new_row: function() {
+		var me = this;
+		var row = $(this.parent).find(".grid tbody tr");
+
+		// Creating new row
+		var new_row = document.createElement("tr");
+		$(new_row).attr({
+			"class": "table-row",
+			"data-idx": row.length + 1
+		});
+
+		// Creating first table data
+		var td = document.createElement("td");
+		$(td).attr("class", "text-center");
+		$(td).html(row.length + 1);
+		$(td).appendTo(new_row);
+
+		var child = wn.model.add_child(this.frm.doc, this.table_field.options, 
+			this.table_field.fieldname);
+		
+		$.each(this.fields, function(i, obj) {
+			if (obj.in_list_view===1) {
+				child[obj.fieldname] = me.dialog.get_values()[obj.fieldname];
+				
+				var td = document.createElement("td");
+				$(td).attr({
+					"data-fieldtype": obj.fieldtype,
+					"data-fieldname": obj.fieldname,
+					"data-fieldvalue": child[obj.fieldname],
+					"data-doc_name": child["name"]
+				});
+				$(td).html(child[obj.fieldname]);
+				
+				// if field is currency then add style & change text
+				if (obj.fieldtype=="Currency") {
+					$(td).attr("style", "text-align:right");
+					$(td).html(format_currency(child[obj.fieldname], me.frm.doc.currency));
+				}
+				
+				// Append td to row
+				$(td).appendTo(new_row);
+			}
+		});
+
+		$(new_row).appendTo($(this.parent).find(".grid tbody"));
+	}
 });
\ No newline at end of file