From f8594feb555d79d95a9101f0877fbfd1dbcc5f33 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 25 May 2015 14:25:58 +0530 Subject: [PATCH] [enhancement] add bom tree view --- erpnext/manufacturing/doctype/bom/bom.js | 9 +- erpnext/manufacturing/page/__init__.py | 0 .../page/bom_browser/__init__.py | 0 .../page/bom_browser/bom_browser.js | 90 +++++++++++++++++++ .../page/bom_browser/bom_browser.json | 21 +++++ .../page/bom_browser/bom_browser.py | 15 ++++ 6 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 erpnext/manufacturing/page/__init__.py create mode 100644 erpnext/manufacturing/page/bom_browser/__init__.py create mode 100644 erpnext/manufacturing/page/bom_browser/bom_browser.js create mode 100644 erpnext/manufacturing/page/bom_browser/bom_browser.json create mode 100644 erpnext/manufacturing/page/bom_browser/bom_browser.py diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js index 720575ac02..65ecfd8b90 100644 --- a/erpnext/manufacturing/doctype/bom/bom.js +++ b/erpnext/manufacturing/doctype/bom/bom.js @@ -1,6 +1,8 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt +frappe.provide("erpnext.bom"); + frappe.ui.form.on("BOM", { onload_post_render: function(frm) { frm.get_field("items").grid.set_multiple_add("item_code", "qty"); @@ -13,6 +15,9 @@ frappe.ui.form.on("BOM", { frm.add_custom_button(__("Update Cost"), function() { frm.events.update_cost(frm); }); + frm.add_custom_button(__("Browse BOM"), function() { + frappe.set_route("bom-browser", frm.doc.name); + }); } }, update_cost: function(frm) { @@ -27,10 +32,6 @@ frappe.ui.form.on("BOM", { } }); - -// On REFRESH -frappe.provide("erpnext.bom"); - cur_frm.add_fetch("item", "description", "description"); cur_frm.add_fetch("item", "image", "image"); cur_frm.add_fetch("item", "item_name", "item_name"); diff --git a/erpnext/manufacturing/page/__init__.py b/erpnext/manufacturing/page/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/manufacturing/page/bom_browser/__init__.py b/erpnext/manufacturing/page/bom_browser/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/manufacturing/page/bom_browser/bom_browser.js b/erpnext/manufacturing/page/bom_browser/bom_browser.js new file mode 100644 index 0000000000..453d8c57a9 --- /dev/null +++ b/erpnext/manufacturing/page/bom_browser/bom_browser.js @@ -0,0 +1,90 @@ +// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +// License: GNU General Public License v3. See license.txt + +frappe.pages['bom-browser'].on_page_load = function(wrapper) { + var page = frappe.ui.make_app_page({ + parent: wrapper, + title: 'BOM Browser', + single_column: true + }); + + page.main.css({ + "min-height": "300px", + "padding-bottom": "25px" + }); + + page.tree_area = $('

'+ + __("Select BOM to start") + +'

').appendTo(page.main); + + frappe.breadcrumbs.add(frappe.breadcrumbs.last_module || "Manufacturing"); + + var make_tree = function() { + erpnext.bom_tree = new erpnext.BOMTree(page.$bom_select.val(), page, page.tree_area); + } + + page.$bom_select = wrapper.page.add_field({fieldname: "bom", + fieldtype:"Link", options: "BOM", label: __("BOM")}).$input + .change(function() { + make_tree(); + }); + + page.set_secondary_action(__('Refresh'), function() { + make_tree(); + }); +} + + +frappe.pages['bom-browser'].on_page_show = function(wrapper){ + // set from route + var bom = null; + if(frappe.get_route()[1]) { + var bom = frappe.get_route().splice(1).join("/"); + } + if(frappe.route_options && frappe.route_options.bom) { + var bom = frappe.route_options.bom; + } + if(bom) { + wrapper.page.$bom_select.val(bom).trigger("change"); + } +}; + +erpnext.BOMTree = Class.extend({ + init: function(root, page, parent) { + $(parent).empty(); + var me = this; + me.page = page; + me.bom = page.$bom_select.val(); + me.can_read = frappe.model.can_read("BOM"); + me.can_create = frappe.boot.user.can_create.indexOf("BOM") !== -1 || + frappe.boot.user.in_create.indexOf("BOM") !== -1; + me.can_write = frappe.model.can_write("BOM"); + me.can_delete = frappe.model.can_delete("BOM"); + + this.tree = new frappe.ui.Tree({ + parent: $(parent), + label: me.bom, + args: {parent: me.bom}, + method: 'erpnext.manufacturing.page.bom_browser.bom_browser.get_children', + toolbar: [ + {toggle_btn: true}, + { + label:__("Edit"), + condition: function(node) { + return node.expandable; + }, + click: function(node) { + frappe.set_route("Form", "BOM", node.data.parent); + } + } + ], + get_label: function(node) { + if(node.data.qty) { + return node.data.qty + " x " + node.data.value; + } else { + return node.data.value; + } + } + }); + } +}); diff --git a/erpnext/manufacturing/page/bom_browser/bom_browser.json b/erpnext/manufacturing/page/bom_browser/bom_browser.json new file mode 100644 index 0000000000..5b75463457 --- /dev/null +++ b/erpnext/manufacturing/page/bom_browser/bom_browser.json @@ -0,0 +1,21 @@ +{ + "content": null, + "creation": "2015-05-25 02:57:33.472044", + "docstatus": 0, + "doctype": "Page", + "modified": "2015-05-25 02:57:33.472044", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "bom-browser", + "owner": "Administrator", + "page_name": "bom-browser", + "roles": [ + { + "role": "Manufacturing User" + } + ], + "script": null, + "standard": "Yes", + "style": null, + "title": "BOM Browser" +} \ No newline at end of file diff --git a/erpnext/manufacturing/page/bom_browser/bom_browser.py b/erpnext/manufacturing/page/bom_browser/bom_browser.py new file mode 100644 index 0000000000..8051e69b9d --- /dev/null +++ b/erpnext/manufacturing/page/bom_browser/bom_browser.py @@ -0,0 +1,15 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +@frappe.whitelist() +def get_children(parent): + return frappe.db.sql("""select item_code as value, + bom_no as parent, qty, + if(ifnull(bom_no, "")!="", 1, 0) as expandable + from `tabBOM Item` + where parent=%s + order by idx + """, parent, as_dict=True)