company page, deprecate custom page
diff --git a/erpnext/hub_node/__init__.py b/erpnext/hub_node/__init__.py
index dc6c789..ea1693d 100644
--- a/erpnext/hub_node/__init__.py
+++ b/erpnext/hub_node/__init__.py
@@ -15,7 +15,7 @@
 	return hub_settings
 
 @frappe.whitelist()
-def get_items(doctype, start=0, limit=20, fields=["*"], filters="{}", order_by=None):
+def get_list(doctype, start=0, limit=20, fields=["*"], filters="{}", order_by=None):
 	connection = get_client_connection()
 	filters = json.loads(filters)
 
@@ -25,19 +25,14 @@
 	return response
 
 @frappe.whitelist()
-def get_hub_item_meta():
+def get_meta(doctype):
 	connection = get_client_connection()
-	meta = connection.get_doc('DocType', 'Hub Item')
-	return meta
-
-@frappe.whitelist()
-def get_hub_company_meta():
-	connection = get_client_connection()
-	meta = connection.get_doc('DocType', 'Hub Company')
+	meta = connection.get_doc('DocType', doctype)
 	return meta
 
 @frappe.whitelist()
 def get_categories():
+	# get categories info with parent category and stuff
 	connection = get_client_connection()
 	response = connection.get_list('Hub Category')
 	return response
@@ -48,7 +43,6 @@
 		return
 	connection = get_client_connection()
 	item_details = connection.get_doc('Hub Item', hub_sync_id)
-	print("============details=============")
 	print(item_details)
 	return item_details
 
diff --git a/erpnext/hub_node/page/__init__.py b/erpnext/hub_node/page/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/hub_node/page/__init__.py
+++ /dev/null
diff --git a/erpnext/hub_node/page/hub/__init__.py b/erpnext/hub_node/page/hub/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/hub_node/page/hub/__init__.py
+++ /dev/null
diff --git a/erpnext/hub_node/page/hub/hub.js b/erpnext/hub_node/page/hub/hub.js
deleted file mode 100644
index 6926191..0000000
--- a/erpnext/hub_node/page/hub/hub.js
+++ /dev/null
@@ -1,872 +0,0 @@
-/* globals Hub, HubList */
-
-frappe.provide('erpnext.hub');
-
-frappe.pages['hub'].on_page_load = function(wrapper) {
-	const page = frappe.ui.make_app_page({
-		parent: wrapper,
-		title: 'Hub',
-		single_col: false
-	});
-
-	// wrapper.hub_page = new erpnext.hub.Hub({ page });
-};
-
-frappe.pages['hub'].on_page_show = function(wrapper) {
-	const hub_page = wrapper.hub_page;
-	const [hub, type, id] = frappe.get_route();
-
-	if (!(hub || type || id)) {
-		hub_page.go_to_home_page();
-		return;
-	}
-
-	if (type === "Products") {
-		hub_page.go_to_item_page(id);
-	} else if (type === "Company") {
-		hub_page.go_to_company_page(id);
-	}
-}
-
-erpnext.hub.Hub = class Hub {
-	constructor({ page }) {
-		this.page = page;
-		frappe.require('/assets/erpnext/css/hub.css', () => {
-			this.setup();
-		});
-	}
-
-	setup() {
-		this.setup_header();
-		this.company_cache = {};
-		this.item_cache = {};
-		this.filters = {};
-		this.order_by = '';
-
-		this.$hub_main_section =
-			$(`<div class='hub-main-section'>`).appendTo(this.page.body);
-		this.bind_events();
-		this.refresh();
-	}
-
-	refresh() {
-		this.$hub_main_section.empty();
-		this.page.page_form.hide();
-
-		const $layout_main = this.page.wrapper.find('.layout-main');
-		const $page_head = this.page.wrapper.find('.page-head');
-
-		frappe.model.with_doc('Hub Settings', 'Hub Settings', () => {
-			this.hub_settings = frappe.get_doc('Hub Settings');
-
-			if(this.hub_settings.enabled == 0) {
-				let $empty_state = this.page.get_empty_state(
-					__("Register for Hub"),
-					__(`Let other ERPNext users discover your products
-						and automate workflow with Supplier from within ERPNext.`),
-					__("Register")
-				);
-
-				$page_head.hide();
-				$layout_main
-					.find('.layout-side-section, .layout-main-section-wrapper')
-					.hide();
-				$layout_main.append($empty_state);
-
-				$empty_state.find('.btn-primary').on('click', () => {
-					this.register_for_hub();
-				});
-			} else {
-				$page_head.show();
-				$layout_main.find('.page-card-container').remove();
-				$layout_main.find('.layout-side-section, .layout-main-section-wrapper').show();
-				this.setup_live_state();
-			}
-		});
-	}
-
-	register_for_hub() {
-		if (frappe.session.user.includes('Administrator')) {
-			frappe.throw(__('Please login as another user.'))
-		}
-		frappe.verify_password(() => {
-			frappe.call({
-				method: 'erpnext.hub_node.enable_hub',
-				callback: (r) => {
-					if(r.message.enabled == 1) {
-						Object.assign(this.hub_settings, r.message);
-						this.refresh();
-						this.prompt_for_item_sync();
-					}
-				}
-			});
-		});
-	}
-
-	prompt_for_item_sync() {
-		frappe.call({
-			method: 'frappe.client.get_list',
-			args: {
-				doctype: 'Data Migration Run',
-				filters: {
-					'data_migration_plan': 'Hub Sync'
-				},
-				limit_page_length: 1
-			},
-			callback: function(r) {
-				if (!r) {
-					frappe.confirm(__('Do you want to publish your Items to Hub ?'), () => {
-						this.sync_items_to_hub();
-					});
-				}
-			}
-		})
-	}
-
-	setup_header() {
-		this.page.page_title = this.page.wrapper.find('.page-title');
-		this.tag_line = $(`
-			<div class='tag-line-container'>
-				<span class='tag-line text-muted small'>
-					${__('Product listing and discovery for ERPNext users')}
-				</span>
-			</div>`)
-			.appendTo(this.page.page_title);
-
-		this.bind_title();
-	}
-
-	setup_live_state() {
-		if(!this.$search) {
-			this.setup_filters();
-		}
-		this.page.page_form.show();
-		this.setup_menu();
-		this.setup_sidebar();
-		this.render_body();
-		this.setup_lists();
-	}
-
-	setup_filters() {
-
-		// frappe.call({
-		// 	method: 'erpnext.hub_node.get_categories'
-		// }).then((r) => {
-		// 	if (r.message) {
-		// 		const categories = r.message;
-		// 		console.log("categories", categories);
-		// 		categories
-		// 			.map(c => c.hub_category_name)
-		// 			.map(c => this.sidebar.add_item({
-		// 				label: c,
-		// 				on_click: () => {
-		// 					this.home_item_list &&
-		// 					this.home_item_list.refresh({
-		// 						text: '',
-		// 						start: 0,
-		// 						limit: 20,
-		// 						category: c && c !== 'All Categories' ? c : undefined
-		// 					});
-		// 				}
-		// 			}, __('Hub Category')));
-
-
-		// 	}
-		// });
-
-		// this.category_select = this.page.add_select(__('Category'),
-		// 	[
-		// 		{label: __('Sort by Price ...'), value: '' },
-		// 		{label: __('High to Low'), value: 'price desc' },
-		// 		{label: __('Low to High'), value: 'price' },
-		// 	]
-		// );
-
-		this.price_sort_select = this.page.add_select(__('Sort by Price'),
-			[
-				{label: __('Sort by Price ...'), value: '' },
-				{label: __('High to Low'), value: 'price desc' },
-				{label: __('Low to High'), value: 'price' },
-			]
-		);
-
-		this.criteria_select = this.page.add_select(__('Sort by Criteria'),
-			[
-				{label: __('Most Popular'), value: 'request_count' },
-				{label: __('Newest'), value: 'creation' },
-			]
-		);
-
-		this.price_sort_select.on('change', () => {
-			this.refresh_item_only_page();
-		});
-
-		this.criteria_select.on('change', () => {
-			this.refresh_item_only_page();
-		});
-
-		this.setup_hub_category_filter();
-		this.setup_search();
-	}
-
-	bind_events() {
-		const me = this;
-		this.$hub_main_section
-			.on('click', '.company-link a', function(e) {
-				e.preventDefault();
-				const company_name = $(this).attr('data-company-name');
-				frappe.set_route('hub', 'Company', company_name);
-			})
-			.on('click', '.breadcrumb li', function(e) {
-				e.preventDefault();
-				const $li = $(this);
-				if ($li.attr('data-route') === 'Home') {
-					me.go_to_home_page();
-				}
-			});
-	}
-
-	update_filters() {
-		let price_sort = $(this.price_sort_select).val() || '';
-		let criteria = $(this.criteria_select).val() || '';
-
-		let order_by_params = [];
-		let query_string = '';
-		if(criteria) {
-			order_by_params.push(criteria);
-			// query_string += 'sort_by=' + criteria
-		}
-		if(price_sort) order_by_params.push(price_sort);
-		this.order_by = order_by_params.join(",");
-		// return query_string;
-	}
-
-	reset_filters() {
-		this.order_by = '';
-		$(this.category_select).val('');
-		$(this.price_sort_select).val('');
-		$(this.criteria_select).val('Most Popular');
-	}
-
-	refresh_item_only_page() {
-		this.reset_search();
-		this.update_filters();
-		this.go_to_items_only_page(
-			['hub', 'Products'],
-			'', 'product-list'
-		);
-	}
-
-	bind_title() {
-		this.page.page_title.find('.title-text').on('click', () => {
-			this.go_to_home_page();
-		});
-	}
-
-	render_body() {
-		this.$home_page = $(`
-			<div class = 'hub-home-page'>
-				<div class='banner'></div>
-				<div class='listing-body row'>
-					<div class='main-list-section'></div>
-				</div>
-			</div>
-		`).appendTo(this.$hub_main_section);
-
-		this.$banner = this.$hub_main_section.find('.banner');
-		this.$listing_body = this.$hub_main_section.find('.listing-body');
-		this.$main_list_section = this.$hub_main_section.find('.main-list-section');
-		this.$side_list_section = this.$hub_main_section.find('.side-list-section');
-	}
-
-	setup_lists() {
-		this.home_item_list = new erpnext.hub.HubList({
-			parent: this.$main_list_section,
-			title: 'New',
-			page_length: 20,
-			list_css_class: 'home-product-list',
-			method: 'erpnext.hub_node.get_items',
-			// order_by: 'request_count',
-			filters: {text: '', country: this.country}, // filters at the time of creation
-			on_item_click: (item_code) => {
-				frappe.set_route('hub', 'Products', item_code);
-			}
-		});
-
-		this.home_item_list.setup();
-	}
-
-	setup_hub_category_filter() {
-		const me = this;
-
-		this.hub_category_field = this.page.add_field({
-			fieldtype: 'Autocomplete',
-			label: 'Hub Category',
-			change() {
-				let value = this.get_value();
-				let title = value;
-				if (value === 'All Categories') {
-					// show all items
-					value = null;
-				}
-
-				me.home_item_list.title = title;
-				me.home_item_list.refresh({
-					text: '',
-					start: 0,
-					limit: 20,
-					category: value
-				});
-			}
-		});
-
-		frappe.call('erpnext.hub_node.get_categories')
-			.then((r) => {
-				if (r.message) {
-					const categories = r.message;
-
-					this.hub_category_field.set_data(
-						categories.map(c => c.hub_category_name)
-					);
-				}
-			});
-	}
-
-	setup_search() {
-		this.$search = this.page.add_data(__('Search'));
-		this.$search.on('keypress', (e) => {
-			if(e.which === 13) {
-				var search_term = ($(this.$search).val() || '').toLowerCase();
-				this.go_to_items_only_page(
-					['hub', 'search', search_term],
-					'Search results for \''  + search_term + '\'',
-					'search-product-list',
-					{text: search_term}
-				);
-			}
-		});
-	}
-
-	go_to_items_only_page(route, title, class_name, filters = {text: ''}, by_item_codes=0) {
-		frappe.set_route(route);
-		this.$hub_main_section.empty();
-		this.filtered_item_list = new erpnext.hub.HubList({
-			parent: this.$hub_main_section,
-			title: title,
-			page_length: 20,
-			list_css_class: class_name,
-			method: 'erpnext.hub_node.get_items',
-			order_by: this.order_by,
-			filters: filters,
-			by_item_codes: by_item_codes
-		});
-		this.filtered_item_list.on_item_click = (item_code) => {
-			frappe.set_route('hub', 'Products', item_code);
-		}
-		this.filtered_item_list.setup();
-	}
-
-	go_to_item_page(item_code) {
-		if(this.item_cache) {
-			let item = this.item_cache[item_code];
-			if(item) {
-				this.render_item_page(item);
-				return;
-			}
-		} else {
-			this.item_cache = {};
-		}
-		frappe.call({
-			args:{
-				hub_sync_id: item_code
-			},
-			method: "erpnext.hub_node.get_item_details",
-			callback: (r) => {
-				if (!r || !r.message) return;
-				let item = r.message;
-				this.item_cache[item_code] = item;
-				this.render_item_page(item);
-			}
-		});
-	}
-
-	render_item_page(item) {
-		this.$hub_main_section.empty();
-
-
-		let $item_page =
-			$(this.get_item_page(item))
-				.appendTo(this.$hub_main_section);
-
-		let $company_items = $item_page.find('.company-items');
-
-		let company_item_list = new erpnext.hub.HubList({
-			parent: $company_items,
-			title: 'More by ' + item.company_name,
-			page_length: 5,
-			list_css_class: 'company-item-list',
-			method: 'erpnext.hub_node.get_items',
-			// order_by: 'request_count',
-			filters: {text: '', company_name: item.company_name, country: this.country},
-			paginated: 0,
-			img_size: 150
-		});
-
-		company_item_list.on_item_click = (item_code) => {
-			frappe.set_route('hub', 'Products', item_code);
-		}
-		company_item_list.setup();
-
-		$item_page.find('.rfq-btn')
-			.click((e) => {
-				const $btn = $(e.target);
-
-				this.show_rfq_modal(item)
-					.then(values => {
-						item.item_code = values.item_code;
-						delete values.item_code;
-
-						const supplier = values;
-						return [item, supplier];
-					})
-					.then(([item, supplier]) => {
-						return this.make_rfq(item, supplier, $btn);
-					})
-					.then(r => {
-						console.log(r);
-						if (r.message && r.message.rfq) {
-							$btn.addClass('disabled').html(`<span><i class='fa fa-check'></i> ${__('Quote Requested')}</span>`);
-						} else {
-							throw r;
-						}
-					})
-					.catch((e) => {
-						console.log(e); //eslint-disable-line
-					});
-			});
-	}
-
-	show_rfq_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();
-		});
-	}
-
-	get_company_details(company_id) {
-		this.company_cache = this.company_cache || {};
-
-		return new Promise(resolve => {
-			// get from cache if exists
-			let company_details = this.company_cache[company_id];
-			if(company_details) {
-				resolve(company_details);
-				return;
-			}
-			frappe.call({
-				method: 'erpnext.hub_node.get_company_details',
-				args: {hub_sync_id: company_id}
-			}).then((r) => {
-				if (r.message) {
-					const company_details = r.message;
-					this.company_cache[company_id] = company_details;
-					resolve(company_details)
-				}
-			});
-		})
-	}
-
-	go_to_company_page(company_id) {
-		this.get_company_details(company_id)
-			.then(this.show_company_page.bind(this));
-	}
-
-	show_company_page(company_details) {
-		this.$hub_main_section.empty();
-
-		let $company_page =
-			$(this.get_company_page(company_details))
-				.appendTo(this.$hub_main_section);
-
-		let $company_items = $company_page.find('.company-items');
-
-		let company_item_list = new erpnext.hub.HubList({
-			parent: $company_items,
-			title: 'More by ' + company_details.company_name,
-			page_length: 5,
-			list_css_class: 'company-item-list',
-			method: 'erpnext.hub_node.get_items',
-			// order_by: 'request_count',
-			filters: {text: '', company: company_details.company_name, country: this.country},
-			paginated: 0,
-			img_size: 150
-		});
-
-		company_item_list.on_item_click = (item_code) => {
-			frappe.set_route('hub', 'Products', item_code);
-		}
-		company_item_list.setup();
-	}
-
-	get_item_page(item) {
-		return `
-			<div class="hub-item-page">
-				<div class="item-header">
-					<div class="item-page-image">
-						${ this.home_item_list.get_item_image(item) }
-					</div>
-					<div class="title-content">
-						<div class="breadcrumbs">
-							${this.get_breadcrumb(item.item_name, "Products") }
-						</div>
-						<div class="title">
-							<h2>${ item.item_name }</h2>
-						</div>
-						<div class="company">
-							<span class="">${ item.company_name }</span>
-						</div>
-						<div class="category">
-							<span class="text-muted">Products</span>
-						</div>
-						<div class="description">
-							<span class="small">${ item.description ? item.description : "" }</span>
-						</div>
-						<div class="price">
-							${ item.formatted_price ? item.formatted_price : '' }
-						</div>
-						<div class="actions">
-							<a class="btn btn-primary rfq-btn">Request A Quote</a>
-						</div>
-					</div>
-
-				</div>
-				<div class="item-more-info"></div>
-				<div class="company-items">
-
-				</div>
-			</div>
-		`;
-	}
-
-	get_company_page(company_details) {
-		return `
-			<div class="hub-item-page">
-				<div class="item-header">
-					<div class="title-content">
-						<div class="breadcrumbs">
-							${this.get_breadcrumb(company_details.company_name, "Company") }
-						</div>
-						<div class="title">
-							<h2>${ company_details.company_name }</h2>
-						</div>
-						<div class="company">
-							<span class="">${ company_details.country }</span>
-						</div>
-						<div class="description">
-							<span class="small">${ company_details.site_name }</span>
-						</div>
-					</div>
-
-				</div>
-				<div class="item-more-info"></div>
-				<div class="company-items">
-
-				</div>
-			</div>
-		`;
-	}
-
-	get_breadcrumb(name, type) {
-		return `
-			<ul class="breadcrumb">
-				<li data-route="Home">
-					<a href><span>Home</span></a>
-				</li>
-				<li data-route="List">
-					<a href><span>${type}</span></a>
-				</li>
-				<li class="active">
-					<span>${name}</span>
-				</li>
-			</ul>
-		`;
-	}
-
-	go_to_home_page() {
-		frappe.set_route('hub');
-		this.reset_filters();
-		this.refresh();
-	}
-
-	setup_menu() {
-		if (this.menu_setup) return;
-
-		this.page.add_menu_item(__('Hub Settings'),
-			() => frappe.set_route('Form', 'Hub Settings'));
-		this.page.add_menu_item(__('Refresh'), () => this.refresh());
-		this.page.add_menu_item(__('Sync'), () => this.sync_items_to_hub());
-
-		this.menu_setup = true;
-	}
-
-	sync_items_to_hub() {
-		frappe.call('erpnext.hub_node.doctype.hub_settings.hub_settings.sync')
-	}
-
-	setup_sidebar() {
-		var me = this;
-		this.sidebar = new frappe.ui.Sidebar({
-			wrapper: this.page.wrapper.find('.layout-side-section'),
-			css_class: 'hub-sidebar'
-		});
-
-		this.add_account_to_sidebar();
-	}
-
-	add_account_to_sidebar() {
-		this.sidebar.add_item({
-			label: this.hub_settings.company,
-			on_click: () => frappe.set_route('Form', 'Company', this.hub_settings.company)
-		}, __("Account"));
-
-		this.sidebar.add_item({
-			label: __("My Orders"),
-			on_click: () => frappe.set_route('List', 'Request for Quotation')
-		}, __("Account"));
-	}
-
-	get_search_term() {
-		return this.$search.val();
-	}
-
-	reset_search() {
-		this.$search.val('');
-	}
-
-	make_rfq(item, supplier, btn) {
-		console.log(supplier);
-		return new Promise((resolve, reject) => {
-			frappe.call({
-				method: 'erpnext.hub_node.make_rfq_and_send_opportunity',
-				args: { item, supplier },
-				callback: resolve,
-				btn,
-			}).fail(reject);
-		});
-	}
-
-	go_to_seen_items() {
-		this.go_to_items_only_page(
-			['hub', 'Requested Products'],
-			__('Requested Products'),
-			'requested-product-list',
-			{}, 1
-		);
-	}
-}
-
-erpnext.hub.HubList = class HubList {
-	constructor({
-		parent = null,
-		title = 'Products',
-		page_length = 20,
-		list_css_class = '',
-		method = 'erpnext.hub_node.get_items',
-		filters = {text: ''},
-		order_by = '',
-		by_item_codes = 0,
-		paginated = 1,
-		on_item_click = null,
-		img_size = 200
-	}) {
-		this.parent = parent;
-		this.title = title;
-		this.page_length = page_length;
-		this.list_css_class = list_css_class;
-		this.method = method;
-		this.filters = filters;
-		this.order_by = order_by;
-		this.by_item_codes = by_item_codes;
-		this.paginated = paginated;
-
-		this.on_item_click = on_item_click;
-		this.img_size = img_size;
-	}
-
-	// to be called on demand
-	setup() {
-		this.container = $(`
-			<div class='item-list-container ${this.list_css_class}' data-page-length='${this.page_length}'>
-				<div class='item-list-header'>
-					<h3>${this.title}</h3>
-				</div>
-				<div class='item-list'></div>
-				<div class='list-state'>
-					<div class='loading'>
-						<p class='text-muted text-center'>${__('Loading...')}</p>
-					</div>
-					<div class='done hide'>
-						<p class='text-muted text-center'>${__('No more results')}</p>
-					</div>
-					<div class='more text-right'>
-						<button class='btn btn-default btn-sm'>${__('More')}</div>
-					</div>
-				</div>
-			</div>`)
-			.appendTo(this.parent);
-
-		this.$item_list_title = this.container.find('.item-list-header h3');
-		this.$list = this.container.find('.item-list');
-		this.$loading = this.container.find('.loading').hide();
-		this.$more = this.container.find('.more').hide();
-		this.$done = this.container.find('.done');
-
-		this.$more.on('click', () => {
-			this.next_page();
-		});
-
-		this.next_page();
-	}
-
-	refresh(filters = this.filters) {
-		this.reset();
-		this.set_filters(filters);
-		this.next_page();
-	}
-
-	reset() {
-		this.$list.empty();
-	}
-
-	set_filters(filters) {
-		this.filters = filters;
-	}
-
-	next_page() {
-		this.$item_list_title.html(this.title);
-		const start = this.$list.find('.hub-item-wrapper').length;
-		this.$loading.show();
-
-		// build args
-		let args = {
-			start: start,
-			// query one extra
-			limit: this.page_length + 1
-		};
-		Object.assign(args, this.filters);
-		// console.log("filters: ", args);
-		args.order_by = this.order_by;
-		args.by_item_codes = this.by_item_codes;
-
-		frappe.call({
-			method: this.method,
-			args: args,
-			callback: (r) => {
-				let items = r.message;
-				// console.log("items: ", items);
-				this.render_items(items);
-			}
-		});
-	}
-
-	render_items(items) {
-		if(items) {
-			// clear any filler divs
-			this.$list.find('.filler').remove();
-			let done = 0;
-			if(items.length && items.length > this.page_length) {
-				// remove the extra queried
-				items.pop();
-			} else {
-				done = 1;
-			}
-			items.forEach((item) => {
-				this.make_item_card(item).appendTo(this.$list);
-			});
-
-			const remainder = items.length % 4;
-			if (remainder > 0) {
-				// fill with filler divs to make flexbox happy
-				Array.from(Array(remainder))
-					.map(r => $('<div class="filler">').css('width', '200px').appendTo(this.$list));
-			}
-			this.update_list_state(done);
-		} else {
-			this.update_list_state(1);
-		}
-	}
-
-	update_list_state(done=0) {
-		this.$loading.hide();
-		if(done) {
-			this.$done.removeClass('hide');
-			this.$more.hide();
-		} else {
-			this.$more.show();
-			this.$done.addClass('hide');
-		}
-	}
-
-	make_item_card(item) {
-		let $item_card = $(`
-			<div class="hub-item-wrapper" style="max-width: ${this.img_size}px;">
-				<a class="item-link" href>
-					<div class="hub-item-image">
-						${ this.get_item_image(item) }
-					</div>
-					<div class="hub-item-title">
-						<h5 class="bold">
-							${!item.seen ? item.item_name : `<span class="indicator blue">${item.item_name}</span>`}
-						<h5>
-					</div>
-				</a>
-				<div class="company-link">
-					<a data-company-name="${ item.company_name }" class="">${ item.company_name }</a>
-				</div>
-				<div>${ item.formatted_price ? item.formatted_price : ''}</div>
-			</div>
-		`);
-
-		$item_card.find(".item-link").click((e) => {
-			e.preventDefault();
-			this.on_item_click && this.on_item_click(item.name);
-		});
-
-		return $item_card;
-	}
-
-	get_item_image(item, size=this.img_size) {
-		const _size = size + 'px';
-		const item_image = item.image ?
-			`<img src="${item.image}"><span class="helper"></span>` :
-			`<div class="standard-image">${item.item_name[0]}</div>`;
-
-		return `
-			<div class="img-wrapper"
-				style="max-width: ${_size}; width: ${_size}; height: ${_size};">
-				${item_image}
-			</div>`;
-	}
-}
diff --git a/erpnext/hub_node/page/hub/hub.json b/erpnext/hub_node/page/hub/hub.json
deleted file mode 100644
index 2d7c899..0000000
--- a/erpnext/hub_node/page/hub/hub.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "content": null, 
- "creation": "2015-02-18 05:17:17.301735", 
- "docstatus": 0, 
- "doctype": "Page", 
- "modified": "2015-02-18 05:17:17.301735", 
- "modified_by": "Administrator", 
- "module": "Hub Node", 
- "name": "hub", 
- "owner": "Administrator", 
- "page_name": "hub", 
- "roles": [
-  {
-   "role": "All"
-  }
- ], 
- "script": null, 
- "standard": "Yes", 
- "style": null, 
- "title": "Hub"
-}
\ No newline at end of file
diff --git a/erpnext/public/css/pos.css b/erpnext/public/css/pos.css
index bc81182..e2d301d 100644
--- a/erpnext/public/css/pos.css
+++ b/erpnext/public/css/pos.css
@@ -169,5 +169,8 @@
   height: 60px;
 }
 .grand-total .grand-total-value {
-  font-size: 24px;
+  font-size: 18px;
+}
+.rounded-total-value {
+  font-size: 18px;
 }
diff --git a/erpnext/public/js/hub/hub_factory.js b/erpnext/public/js/hub/hub_factory.js
index c43dfa5..6789b80 100644
--- a/erpnext/public/js/hub/hub_factory.js
+++ b/erpnext/public/js/hub/hub_factory.js
@@ -15,10 +15,8 @@
 				'/assets/erpnext/css/hub.css',
 			]
 		};
-		console.log("make factory?");
 
 		if (!erpnext.hub.pages[page_name]) {
-			console.log("pages?");
 			if (page === 'Item' && !route[2]) {
 				frappe.require(assets['List'], () => {
 					erpnext.hub.pages[page_name] = new erpnext.hub.ItemListing({
@@ -36,7 +34,6 @@
 					window.hub_page = erpnext.hub.pages[page_name];
 				});
 			} else if(route[2]) {
-				console.log("form?");
 				frappe.require(assets['Form'], () => {
 					erpnext.hub.pages[page_name] = new erpnext.hub.HubForm({
 						hub_item_code: route[2],
@@ -47,7 +44,6 @@
 				});
 			}
 		} else {
-			console.log("else?");
 			frappe.container.change_to(page_name);
 			window.hub_page = erpnext.hub.pages[page_name];
 		}
diff --git a/erpnext/public/js/hub/hub_page.js b/erpnext/public/js/hub/hub_page.js
index 20fcf4d..6e5ab98 100644
--- a/erpnext/public/js/hub/hub_page.js
+++ b/erpnext/public/js/hub/hub_page.js
@@ -1,89 +1,52 @@
 frappe.provide('erpnext.hub');
 
-erpnext.hub.ItemListing = class ItemListing extends frappe.views.BaseList {
+erpnext.hub.HubListing = class HubListing extends frappe.views.BaseList {
 	setup_defaults() {
 		super.setup_defaults();
 		this.page_title = __('Hub');
-		this.method = 'erpnext.hub_node.get_items';
+		this.method = 'erpnext.hub_node.get_list';
 
 		const route = frappe.get_route();
 		this.page_name = route[1];
+	}
 
-		return this.get_hub_item_meta()
+	setup_fields() {
+		return this.get_meta()
 			.then(r => {
+				console.log('fields then', this.doctype);
 				this.meta = r.message || this.meta;
-				this.doctype = 'Hub Item';
 				frappe.model.sync(this.meta);
 			});
 	}
 
-	get_hub_item_meta() {
+	get_meta() {
+		console.log('get_meta', this.doctype);
 		return new Promise(resolve =>
-			frappe.call('erpnext.hub_node.get_hub_item_meta', {}, resolve));
-	}
-
-	setup_fields() {
-		this.fields = ['name', 'hub_item_code', 'image', 'item_name', 'item_code', 'company_name'];
+			frappe.call('erpnext.hub_node.get_meta', {doctype: this.doctype}, resolve));
 	}
 
 	set_breadcrumbs() { }
 
 	setup_side_bar() { }
 
-	setup_filter_area() {
-		this.custom_filter_configs = [
-			{
-				fieldtype: 'Data',
-				label: 'Company',
-				condition: 'like',
-				fieldname: 'company_name',
-			},
-			{
-				fieldtype: 'Link',
-				label: 'Country',
-				options: 'Country',
-				condition: 'like',
-				fieldname: 'country'
-			}
-		];
-		this.filter_area = new FilterArea(this);
-	}
-
 	setup_sort_selector() { }
 
 	setup_view() { }
 
-	get_filters_for_args() {
-		let filters = {};
-		this.filter_area.get().forEach(f => {
-			let field = f[1] !== 'name' ? f[1] : 'item_name';
-			filters[field] = [f[2], f[3]];
-		});
-		if(this.current_category) {
-			filters['hub_category'] = this.current_category;
-		}
-		return filters;
-	}
-
 	get_args() {
-		console.log('filters', this.get_filters_for_args());
 		return {
-			doctype: 'Hub Item'
+			doctype: this.doctype,
 			start: this.start,
 			limit: this.page_length,
 			order_by: this.order_by,
 			fields: this.fields,
 			filters: this.get_filters_for_args()
-
-			// category: this.category || '',
-			// company: this.company || '',
-			// text: this.search_text || '',
 		};
 	}
 
 	update_data(r) {
 		const data = r.message;
-		// console.log('update data', data);
+		console.log('update data', data);
 
 		if (this.start === 0) {
 			this.data = data;
@@ -98,8 +61,8 @@
 		if (this.$freeze.find('.image-view-container').length) return;
 
 		const html = Array.from(new Array(4)).map(d => this.card_html({
-			name: 'freeze',
-			item_name: 'freeze'
+			name: 'Loading...',
+			item_name: 'Loading...'
 		})).join('');
 
 		this.$freeze.html(`<div class="image-view-container border-top">${html}</div>`);
@@ -120,12 +83,48 @@
 		var html = data.map(this.card_html.bind(this)).join("");
 		this.$result.find('.image-view-container').append(html);
 	}
+}
+
+erpnext.hub.ItemListing = class ItemListing extends erpnext.hub.HubListing {
+	setup_defaults() {
+		super.setup_defaults();
+		this.doctype = 'Hub Item';
+		this.fields = ['name', 'hub_item_code', 'image', 'item_name', 'item_code', 'company_name'];
+		this.filters = [];
+		this.custom_filter_configs = [
+			{
+				fieldtype: 'Data',
+				label: 'Company',
+				condition: 'like',
+				fieldname: 'company_name',
+			},
+			{
+				fieldtype: 'Link',
+				label: 'Country',
+				options: 'Country',
+				condition: 'like',
+				fieldname: 'country'
+			}
+		];
+	}
+
+	get_filters_for_args() {
+		let filters = {};
+		this.filter_area.get().forEach(f => {
+			let field = f[1] !== 'name' ? f[1] : 'item_name';
+			filters[field] = [f[2], f[3]];
+		});
+		if(this.current_category) {
+			filters['hub_category'] = this.current_category;
+		}
+		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);
+		// console.log(item);
 		const company_name = item['company_name'];
 
 		const route = `#Hub/Item/${item.hub_item_code}`;
@@ -155,6 +154,68 @@
 	}
 };
 
-erpnext.hub.CompanyListing = class CompanyListing extends frappe.views.BaseList {
+erpnext.hub.CompanyListing = class CompanyListing extends erpnext.hub.HubListing {
+	setup_defaults() {
+		super.setup_defaults();
+		this.doctype = 'Hub Company';
+		this.fields = ['name', 'site_name', 'seller_city', 'seller_description', 'seller', 'country', 'company_name'];
+		this.filters = [];
+		this.custom_filter_configs = [
+			{
+				fieldtype: 'Data',
+				label: 'Company',
+				condition: 'like',
+				fieldname: 'company_name',
+			},
+			{
+				fieldtype: 'Link',
+				label: 'Country',
+				options: 'Country',
+				condition: 'like',
+				fieldname: 'country'
+			}
+		];
+	}
 
+	get_filters_for_args() {
+		let filters = {};
+		this.filter_area.get().forEach(f => {
+			let field = f[1] !== 'name' ? f[1] : 'company_name';
+			filters[field] = [f[2], f[3]];
+		});
+		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'];
+
+		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>`;
+
+		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}
+						</div>
+					</div>
+					<div class="hub-item-title">
+						<h5 class="bold">
+							${ title }
+						</h5>
+						<p>${ company_name }</p>
+					</div>
+				</a>
+			</div>
+		`;
+	}
 };
\ No newline at end of file