[hub] form (info) view for items
diff --git a/erpnext/public/css/hub.css b/erpnext/public/css/hub.css
index 559c203..5f86cf4 100644
--- a/erpnext/public/css/hub.css
+++ b/erpnext/public/css/hub.css
@@ -1,3 +1,29 @@
+body[data-route^="Hub/"] .freeze .image-view-container .list-row-col {
+  background-color: #fafbfc;
+  color: #fafbfc;
+}
+body[data-route^="Hub/"] .freeze .image-view-container .placeholder-text {
+  color: #fafbfc;
+}
+body[data-route^="Hub/"] .freeze {
+  display: none;
+}
+body[data-route^="Hub/"] .image-view-container {
+  justify-content: space-around;
+}
+.img-wrapper {
+  border: 1px solid #d1d8dd;
+  border-radius: 3px;
+  padding: 12px;
+  overflow: hidden;
+  text-align: center;
+  white-space: nowrap;
+}
+.img-wrapper .helper {
+  height: 100%;
+  display: inline-block;
+  vertical-align: middle;
+}
 /* hub */
 div[data-page-route="hub"] .page-head {
   height: 80px;
diff --git a/erpnext/public/css/pos.css b/erpnext/public/css/pos.css
index e2d301d..bc81182 100644
--- a/erpnext/public/css/pos.css
+++ b/erpnext/public/css/pos.css
@@ -169,8 +169,5 @@
   height: 60px;
 }
 .grand-total .grand-total-value {
-  font-size: 18px;
-}
-.rounded-total-value {
-  font-size: 18px;
+  font-size: 24px;
 }
diff --git a/erpnext/public/js/hub/hub_factory.js b/erpnext/public/js/hub/hub_factory.js
index f260fcc..a341c22 100644
--- a/erpnext/public/js/hub/hub_factory.js
+++ b/erpnext/public/js/hub/hub_factory.js
@@ -5,9 +5,22 @@
 		const page_name = frappe.get_route_str();
 		const page = route[1];
 
+		const assets = {
+			'List': [
+				'/assets/erpnext/js/hub/hub_page.js',
+				'/assets/erpnext/css/hub.css',
+			],
+			'Form': [
+				'/assets/erpnext/js/hub/hub_form.js',
+				'/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/erpnext/js/hub/hub_page.js', () => {
+				frappe.require(assets['List'], () => {
 					erpnext.hub.pages[page_name] = new erpnext.hub.HubPage({
 						doctype: 'Hub Settings',
 						parent: this.make_page(true, page_name)
@@ -15,7 +28,8 @@
 					window.hub_page = erpnext.hub.pages[page_name];
 				});
 			} else if(route[2]) {
-				frappe.require('/assets/erpnext/js/hub/hub_form.js', () => {
+				console.log("form?");
+				frappe.require(assets['Form'], () => {
 					erpnext.hub.pages[page_name] = new erpnext.hub.HubForm({
 						hub_item_code: route[2],
 						doctype: 'Hub Settings',
@@ -25,6 +39,7 @@
 				});
 			}
 		} 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_form.js b/erpnext/public/js/hub/hub_form.js
index 0a8b5b0..208af41 100644
--- a/erpnext/public/js/hub/hub_form.js
+++ b/erpnext/public/js/hub/hub_form.js
@@ -8,7 +8,7 @@
 	}
 
 	setup_fields() {
-
+		this.fields = ['hub_item_code', 'item_name', 'item_code', 'description', 'seller', 'company_name', 'country'];
 	}
 
 	set_breadcrumbs() {
@@ -40,9 +40,12 @@
 		};
 	}
 
+	prepare_data(r) {
+		this.data = r.message;
+	}
+
 	update_data(r) {
-		const data = r.message;
-		this.data = data;
+		this.data = r.message;
 	}
 
 	render() {
@@ -51,13 +54,14 @@
 		});
 
 		let fields = [];
-		for (let fieldname in this.data) {
+		this.fields.map(fieldname => {
 			fields.push({
-				label: toTitle(fieldname),
+				label: toTitle(frappe.model.unscrub(fieldname)),
 				fieldname,
-				fieldtype: 'Data'
+				fieldtype: 'Data',
+				read_only: 1
 			});
-		}
+		});
 
 		this.form = new frappe.ui.FieldGroup({
 			parent: this.$result,
diff --git a/erpnext/public/js/hub/hub_page.js b/erpnext/public/js/hub/hub_page.js
index 8ecd28b..9b6c4f4 100644
--- a/erpnext/public/js/hub/hub_page.js
+++ b/erpnext/public/js/hub/hub_page.js
@@ -8,10 +8,22 @@
 
 		const route = frappe.get_route();
 		this.page_name = route[1];
+
+		return this.get_hub_item_meta()
+			.then(r => {
+				this.meta = r.message || this.meta;
+				this.doctype = 'Hub Item';
+				frappe.model.sync(this.meta);
+			});
+	}
+
+	get_hub_item_meta() {
+		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'];
 	}
 
 	set_breadcrumbs() {
@@ -23,13 +35,32 @@
 	}
 
 	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_args() {
 		return {
 			start: this.start,
@@ -37,18 +68,33 @@
 			category: this.category || '',
 			order_by: this.order_by,
 			company: this.company || '',
-			text: this.search_text || ''
+			text: this.search_text || '',
+			fields: this.fields
 		};
 	}
 
 	update_data(r) {
 		const data = r.message;
+		console.log('update data', data);
 
 		if (this.start === 0) {
 			this.data = data;
 		} else {
 			this.data = this.data.concat(data);
 		}
+
+	}
+
+	freeze(toggle) {
+		this.$freeze.toggle(toggle);
+		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'
+		})).join('');
+
+		this.$freeze.html(`<div class="image-view-container border-top">${html}</div>`);
 	}
 
 	render() {
@@ -56,13 +102,15 @@
 	}
 
 	render_image_view() {
-		var html = this.data.map(this.card_html.bind(this)).join("");
+		let data = this.data;
+		console.log('this.data render', this.data);
+		if (this.start === 0) {
+			this.$result.html('<div class="image-view-container small padding-top">');
+			data = this.data.slice(this.start);
+		}
 
-		this.$result.html(`
-			<div class="image-view-container small">
-				${html}
-			</div>
-		`);
+		var html = data.map(this.card_html.bind(this)).join("");
+		this.$result.find('.image-view-container').append(html);
 	}
 
 	card_html(item) {
@@ -70,39 +118,28 @@
 		const encoded_name = item._name;
 		const title = strip_html(item['item_name' || 'item_code']);
 
-		const _class = !item.image ? 'no-image' : '';
-		const _html = item.image ?
-			`<img data-name="${encoded_name}" src="${ item.image }" alt="${ title }">` :
-			`<span class="placeholder-text">
-				${ frappe.get_abbr(title) }
-			</span>`;
+		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="image-view-item">
-				<div class="image-view-header">
-					<div class="list-row-col list-subject ellipsis level">
-						<div class="list-row-col">
-							<span>${title}</span>
+			<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>
-				<div class="image-view-body">
-					<a  data-name="${encoded_name}"
-						title="${encoded_name}"
-						href="#Hub/Item/${item.hub_item_code}"
-					>
-						<div class="image-field ${_class}"
-							data-name="${encoded_name}"
-						>
-							${_html}
-						</div>
-					</a>
-				</div>
+					<div class="hub-item-title">
+						<h5 class="bold">
+							${ title }
+						</h5>
+					</div>
+				</a>
 			</div>
 		`;
 	}
-
-	show_hub_form() {
-
-	}
-};
+};
\ No newline at end of file
diff --git a/erpnext/public/less/hub.less b/erpnext/public/less/hub.less
index 1cae692..66199a4 100644
--- a/erpnext/public/less/hub.less
+++ b/erpnext/public/less/hub.less
@@ -1,5 +1,41 @@
 @import "../../../../frappe/frappe/public/less/variables.less";
 
+body[data-route^="Hub/"] {
+	.freeze .image-view-container {
+		.list-row-col {
+			background-color: @light-bg;
+			color: @light-bg;
+		}
+
+		.placeholder-text {
+			color: @light-bg;
+		}
+	}
+
+	.freeze {
+		display: none;
+	}
+
+	.image-view-container {
+		justify-content: space-around;
+	}
+}
+
+.img-wrapper {
+	border: 1px solid #d1d8dd;
+	border-radius: 3px;
+	padding: 12px;
+	overflow: hidden;
+	text-align: center;
+	white-space: nowrap;
+
+	.helper {
+		height: 100%;
+		display: inline-block;
+		vertical-align: middle;
+	}
+}
+
 /* hub */
 div[data-page-route="hub"] {
 	.page-head {