add company pages
diff --git a/erpnext/hub_node/__init__.py b/erpnext/hub_node/__init__.py
index ea1693d..df36552 100644
--- a/erpnext/hub_node/__init__.py
+++ b/erpnext/hub_node/__init__.py
@@ -34,22 +34,29 @@
 def get_categories():
 	# get categories info with parent category and stuff
 	connection = get_client_connection()
-	response = connection.get_list('Hub Category')
+	categories = connection.get_list('Hub Category')
+	print("============================================================")
+	print(categories)
+	response = [{'value': c.get('name'), 'expandable': c.get('is_group')} for c in categories]
 	return response
 
+	# return [
+	# 	{'value': 'Men', 'expandable': 1},
+	# 	{'value': 'Women', 'expandable': 0}
+	# ]
+
 @frappe.whitelist()
-def get_item_details(hub_sync_id=None):
+def get_details(hub_sync_id=None, doctype='Hub Item'):
 	if not hub_sync_id:
 		return
 	connection = get_client_connection()
-	item_details = connection.get_doc('Hub Item', hub_sync_id)
-	print(item_details)
-	return item_details
+	details = connection.get_doc(doctype, hub_sync_id)
+	return details
 
-@frappe.whitelist()
-def get_company_details(hub_sync_id):
-	connection = get_client_connection()
-	return connection.get_doc('Hub Company', hub_sync_id)
+# @frappe.whitelist()
+# def get_company_details(hub_sync_id):
+# 	connection = get_client_connection()
+# 	return connection.get_doc('Hub Company', hub_sync_id)
 
 def get_client_connection():
 	# frappeclient connection
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 69d8a47..45a5b11 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -484,7 +484,7 @@
 erpnext.patches.v10_0.update_asset_calculate_depreciation
 erpnext.patches.v10_0.add_guardian_role_for_parent_portal
 erpnext.patches.v10_0.set_numeric_ranges_in_template_if_blank
-erpnext.patches.v10_0.update_reserved_qty_for_purchase_order
+#erpnext.patches.v10_0.update_reserved_qty_for_purchase_order
 erpnext.patches.v10_0.fichier_des_ecritures_comptables_for_france
 erpnext.patches.v10_0.update_assessment_plan
 erpnext.patches.v10_0.update_assessment_result
@@ -493,4 +493,4 @@
 erpnext.patches.v10_0.set_default_payment_terms_based_on_company
 erpnext.patches.v10_0.update_sales_order_link_to_purchase_order
 erpnext.patches.v10_0.added_extra_gst_custom_field_in_gstr2
-erpnext.patches.v10_0.item_barcode_childtable_migrate
+#erpnext.patches.v10_0.item_barcode_childtable_migrate
diff --git a/erpnext/public/js/hub/hub_factory.js b/erpnext/public/js/hub/hub_factory.js
index 6789b80..0318c99 100644
--- a/erpnext/public/js/hub/hub_factory.js
+++ b/erpnext/public/js/hub/hub_factory.js
@@ -17,26 +17,19 @@
 		};
 
 		if (!erpnext.hub.pages[page_name]) {
-			if (page === 'Item' && !route[2]) {
+			if (!route[2]) {
+				// page === 'Item' &&
 				frappe.require(assets['List'], () => {
-					erpnext.hub.pages[page_name] = new erpnext.hub.ItemListing({
+					erpnext.hub.pages[page_name] = new erpnext.hub[page+'Listing']({
 						doctype: 'Hub Settings',
 						parent: this.make_page(true, page_name)
 					});
 					window.hub_page = erpnext.hub.pages[page_name];
 				});
-			} if (page === 'Company' && !route[2]) {
-				frappe.require(assets['List'], () => {
-					erpnext.hub.pages[page_name] = new erpnext.hub.CompanyListing({
-						doctype: 'Hub Settings',
-						parent: this.make_page(true, page_name)
-					});
-					window.hub_page = erpnext.hub.pages[page_name];
-				});
-			} else if(route[2]) {
+			} else {
 				frappe.require(assets['Form'], () => {
-					erpnext.hub.pages[page_name] = new erpnext.hub.HubForm({
-						hub_item_code: route[2],
+					erpnext.hub.pages[page_name] = new erpnext.hub[page+'Page']({
+						unique_id: route[2],
 						doctype: 'Hub Settings',
 						parent: this.make_page(true, page_name)
 					});
diff --git a/erpnext/public/js/hub/hub_form.js b/erpnext/public/js/hub/hub_form.js
index 208af41..eb7c6b4 100644
--- a/erpnext/public/js/hub/hub_form.js
+++ b/erpnext/public/js/hub/hub_form.js
@@ -3,22 +3,23 @@
 erpnext.hub.HubForm = class HubForm extends frappe.views.BaseList {
 	setup_defaults() {
 		super.setup_defaults();
-		this.page_title = this.data.item_name || this.hub_item_code || __('Hub Item');
-		this.method = 'erpnext.hub_node.get_item_details';
-	}
-
-	setup_fields() {
-		this.fields = ['hub_item_code', 'item_name', 'item_code', 'description', 'seller', 'company_name', 'country'];
+		this.method = 'erpnext.hub_node.get_details';
+		//doctype, unique_id,
 	}
 
 	set_breadcrumbs() {
+		this.set_title();
 		frappe.breadcrumbs.add({
 			label: __('Hub'),
-			route: '#Hub/Item',
+			route: '#Hub/' + this.doctype,
 			type: 'Custom'
 		});
 	}
 
+	set_title() {
+		this.page_title = this.data.item_name || this.hub_item_code || 'Hub' + this.doctype;
+	}
+
 	setup_side_bar() {
 		this.sidebar = new frappe.ui.Sidebar({
 			wrapper: this.$page.find('.layout-side-section'),
@@ -26,17 +27,14 @@
 		});
 	}
 
-	setup_filter_area() {
+	setup_filter_area() { }
 
-	}
-
-	setup_sort_selector() {
-
-	}
+	setup_sort_selector() { }
 
 	get_args() {
 		return {
-			hub_sync_id: this.hub_item_code
+			hub_sync_id: this.unique_id,
+			doctype: 'Hub ' + this.doctype
 		};
 	}
 
@@ -49,8 +47,13 @@
 	}
 
 	render() {
+		const image_html = this.data[this.image_field_name] ?
+			`<img src="${this.data[this.image_field_name]}">
+			<span class="helper"></span>` :
+			`<div class="standard-image">${frappe.get_abbr(this.page_title)}</div>`;
+
 		this.sidebar.add_item({
-			label: `<img src="${this.data.image}" />`
+			label: image_html
 		});
 
 		let fields = [];
@@ -73,7 +76,7 @@
 	}
 
 	toggle_result_area() {
-		this.$result.toggle(this.data.hub_item_code);
+		this.$result.toggle(this.unique_id);
 		this.$paging_area.toggle(this.data.length > 0);
 		this.$no_result.toggle(this.data.length == 0);
 
@@ -82,3 +85,57 @@
 			.toggle(show_more);
 	}
 };
+
+erpnext.hub.ItemPage = class ItemPage extends erpnext.hub.HubForm{
+	setup_defaults() {
+		super.setup_defaults();
+		this.doctype = 'Item';
+		this.image_field_name = 'image';
+	}
+
+	setup_fields() {
+		this.fields = ['hub_item_code', 'item_name', 'item_code', 'description',
+			'seller', 'company_name', 'country', 'hub_category'];
+	}
+
+	show_action_modal(item) {
+		return new Promise(res => {
+			let fields = [
+				{ label: __('Item Code'), fieldtype: 'Data', fieldname: 'item_code', default: item.item_code },
+				{ fieldtype: 'Column Break' },
+				{ label: __('Item Group'), fieldtype: 'Link', fieldname: 'item_group', default: item.item_group },
+				{ label: __('Supplier Details'), fieldtype: 'Section Break' },
+				{ label: __('Supplier Name'), fieldtype: 'Data', fieldname: 'supplier_name', default: item.company_name },
+				{ label: __('Supplier Email'), fieldtype: 'Data', fieldname: 'supplier_email', default: item.seller },
+				{ fieldtype: 'Column Break' },
+				{ label: __('Supplier Type'), fieldname: 'supplier_type',
+					fieldtype: 'Link', options: 'Supplier Type' }
+			];
+			fields = fields.map(f => { f.reqd = 1; return f; });
+
+			const d = new frappe.ui.Dialog({
+				title: __('Request for Quotation'),
+				fields: fields,
+				primary_action_label: __('Send'),
+				primary_action: (values) => {
+					res(values);
+					d.hide();
+				}
+			});
+
+			d.show();
+		});
+	}
+}
+
+erpnext.hub.CompanyPage = class CompanyPage extends erpnext.hub.HubForm{
+	setup_defaults() {
+		super.setup_defaults();
+		this.doctype = 'Company';
+		this.image_field_name = 'company_logo';
+	}
+
+	setup_fields() {
+		this.fields = ['company_name', 'description', 'route', 'country', 'seller', 'site_name'];
+	}
+}
diff --git a/erpnext/public/js/hub/hub_page.js b/erpnext/public/js/hub/hub_page.js
index 6e5ab98..2ca5eac 100644
--- a/erpnext/public/js/hub/hub_page.js
+++ b/erpnext/public/js/hub/hub_page.js
@@ -13,21 +13,26 @@
 	setup_fields() {
 		return this.get_meta()
 			.then(r => {
-				console.log('fields then', this.doctype);
+				// console.log('fields then', this.doctype);
 				this.meta = r.message || this.meta;
 				frappe.model.sync(this.meta);
 			});
 	}
 
 	get_meta() {
-		console.log('get_meta', this.doctype);
+		// console.log('get_meta', this.doctype);
 		return new Promise(resolve =>
 			frappe.call('erpnext.hub_node.get_meta', {doctype: this.doctype}, resolve));
 	}
 
 	set_breadcrumbs() { }
 
-	setup_side_bar() { }
+	setup_side_bar() {
+		this.sidebar = new frappe.ui.Sidebar({
+			wrapper: this.page.wrapper.find('.layout-side-section'),
+			css_class: 'hub-sidebar'
+		});
+	}
 
 	setup_sort_selector() { }
 
@@ -108,6 +113,26 @@
 		];
 	}
 
+	setup_side_bar() {
+		super.setup_side_bar();
+		this.category_tree = new frappe.ui.Tree({
+			parent: this.sidebar.$sidebar,
+			label: 'All Categories',
+			expandable: true,
+
+			args: {},
+			method: 'erpnext.hub_node.get_categories',
+			on_click: (node) => {
+				this.update_category(node.label);
+			}
+		});
+	}
+
+	update_category(label) {
+		this.current_category = (label=='All Categories') ? undefined : label;
+		this.refresh();
+	}
+
 	get_filters_for_args() {
 		let filters = {};
 		this.filter_area.get().forEach(f => {
@@ -139,7 +164,7 @@
 				<a href="${route}">
 					<div class="hub-item-image">
 						<div class="img-wrapper" style="height: 200px; width: 200px">
-							${image_html}
+							${ image_html }
 						</div>
 					</div>
 					<div class="hub-item-title">
@@ -158,7 +183,7 @@
 	setup_defaults() {
 		super.setup_defaults();
 		this.doctype = 'Hub Company';
-		this.fields = ['name', 'site_name', 'seller_city', 'seller_description', 'seller', 'country', 'company_name'];
+		this.fields = ['company_logo', 'name', 'site_name', 'seller_city', 'seller_description', 'seller', 'country', 'company_name'];
 		this.filters = [];
 		this.custom_filter_configs = [
 			{
@@ -186,33 +211,26 @@
 		return filters;
 	}
 
-	card_html(item) {
-		item._name = encodeURI(item.name);
-		const encoded_name = item._name;
-		const title = strip_html(item['item_name' || 'item_code']);
-		// console.log(item);
-		const company_name = item['company_name'];
+	card_html(company) {
+		company._name = encodeURI(company.name);
+		const route = `#Hub/Company/${company.company_name}`;
 
-		const route = `#Hub/Item/${item.hub_item_code}`;
-
-		const image_html = item.image ?
-			`<img src="${item.image}">
-			<span class="helper"></span>` :
-			`<div class="standard-image">${frappe.get_abbr(title)}</div>`;
+		let image_html = company.company_logo ?
+			`<img src="${company.company_logo}"><span class="helper"></span>` :
+			`<div class="standard-image">${frappe.get_abbr(company.company_name)}</div>`;
 
 		return `
 			<div class="hub-item-wrapper margin-bottom" style="width: 200px;">
 				<a href="${route}">
 					<div class="hub-item-image">
 						<div class="img-wrapper" style="height: 200px; width: 200px">
-							${image_html}
+							${ image_html }
 						</div>
 					</div>
 					<div class="hub-item-title">
 						<h5 class="bold">
-							${ title }
+							${ company.company_name }
 						</h5>
-						<p>${ company_name }</p>
 					</div>
 				</a>
 			</div>