Hub Seller Profile and Timeline
- profile details fetched from server
- timeline updates on publishing items
diff --git a/erpnext/hub_node/__init__.py b/erpnext/hub_node/__init__.py
index 471f039..6ac0aba 100644
--- a/erpnext/hub_node/__init__.py
+++ b/erpnext/hub_node/__init__.py
@@ -93,22 +93,23 @@
})
if response:
- # frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 1)
+ frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 1)
return response
else:
return ''
def item_sync_postprocess(obj):
response = call_hub_method('update_activity_for_seller', {
- 'hub_seller': frappe.db.get_value("Hub Settings", "Hub Settings", "company_email"),
- 'name': obj["remote_id"],
- 'status': obj["status"]
+ 'hub_seller': frappe.db.get_value('Hub Settings', 'Hub Settings', 'company_email'),
+ 'name': obj['remote_id'],
+ 'status': obj['status'],
+ 'stats': obj['stats']
})
if response:
- frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 0)
+ frappe.db.set_value('Hub Settings', 'Hub Settings', 'sync_in_progress', 0)
else:
- frappe.throw("Unable to update remote activity")
+ frappe.throw('Unable to update remote activity')
@frappe.whitelist()
def get_item_favourites(start=0, limit=20, fields=["*"], order_by=None):
diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js
index 5261c3f..2214956 100644
--- a/erpnext/public/js/hub/marketplace.js
+++ b/erpnext/public/js/hub/marketplace.js
@@ -724,9 +724,36 @@
erpnext.hub.Profile = class Profile extends SubPage {
make_wrapper() {
super.make_wrapper();
+ }
- // Shorthand for profile data;
- const p = hub.settings;
+ refresh() {
+ this.get_hub_seller_profile(this.keyword)
+ .then(profile => this.render(profile));
+ }
+
+ get_hub_seller_profile() {
+ return hub.call('get_hub_seller_profile', { hub_seller: hub.settings.company_email });
+ }
+
+ render(profile) {
+ const p = profile;
+ const content_by_log_type = this.get_content_by_log_type();
+
+ let activity_logs = (p.hub_seller_activity || []).sort((a, b) => {
+ return new Date(b.creation) - new Date(a.creation);
+ });
+
+ const timeline_items_html = activity_logs
+ .map(log => {
+ const stats = JSON.parse(log.stats);
+ const no_of_items = stats && stats.push_update || '';
+
+ const content = content_by_log_type[log.type];
+ const message = content.get_message(no_of_items);
+ const icon = content.icon;
+ return this.get_timeline_log_item(log.pretty_date, message, icon);
+ })
+ .join('');
const profile_html = `<div class="hub-item-container">
<div class="row visible-xs">
@@ -737,33 +764,58 @@
<div class="row">
<div class="col-md-3">
<div class="hub-item-image">
- <img src="${'gd'}">
+ <img src="${p.logo}">
</div>
</div>
<div class="col-md-6">
- <h2>${'title'}</h2>
+ <h2>${p.company}</h2>
<div class="text-muted">
- <p>${'where'}${'dot_spacer'}${'when'}</p>
- <p>${'rating_html'}${'rating_count'}</p>
+ <p>${p.country}</p>
+ <p>${p.site_name}</p>
</div>
<hr>
<div class="hub-item-description">
- ${'description' ?
- `<b>${__('Description')}</b>
- <p>${'description'}</p>
- ` : __('No description')
+ ${'description'
+ ? `<p>${p.company_description}</p>`
+ : `<p>__('No description')</p`
}
</div>
</div>
</div>
+
+ <div class="timeline">
+ <div class="timeline-items">
+ ${timeline_items_html}
+ </div>
+ </div>
+
</div>`;
this.$wrapper.html(profile_html);
}
- refresh() {}
+ get_timeline_log_item(pretty_date, message, icon) {
+ return `<div class="media timeline-item notification-content">
+ <div class="small">
+ <i class="octicon ${icon} fa-fw"></i>
+ <span title="Administrator"><b>${pretty_date}</b> ${message}</span>
+ </div>
+ </div>`;
+ }
- render() {}
+ get_content_by_log_type() {
+ return {
+ "Created": {
+ icon: 'octicon-heart',
+ get_message: () => 'Joined Marketplace'
+ },
+ "Items Publish": {
+ icon: 'octicon-bookmark',
+ get_message: (no_of_items) =>
+ `Published ${no_of_items} product${no_of_items > 1 ? 's' : ''} to Marketplace`
+ }
+ }
+ }
}
erpnext.hub.Publish = class Publish extends SubPage {