diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js index 994aebca622..953efe4c71a 100644 --- a/erpnext/public/js/hub/marketplace.js +++ b/erpnext/public/js/hub/marketplace.js @@ -10,6 +10,7 @@ import './pages/profile'; import './pages/publish'; import './pages/published_products'; import './pages/messages'; +import './pages/buying_messages'; import './pages/not_found'; // components @@ -140,7 +141,7 @@ erpnext.hub.Marketplace = class Marketplace { make_body() { this.$body = this.$parent.find('.layout-main-section'); - this.$body.on('seller-registered', () => { + erpnext.hub.on('seller-registered', () => { this.registered = 1; this.make_sidebar_nav_buttons(); }); @@ -213,6 +214,10 @@ erpnext.hub.Marketplace = class Marketplace { this.subpages['messages'] = new erpnext.hub.Messages(this.$body); } + if (route[1] === 'buy' && !this.subpages['buy']) { + this.subpages['buy'] = new erpnext.hub.BuyingMessages(this.$body); + } + // dont allow unregistered users to access registered routes const registered_routes = ['favourites', 'profile', 'publish', 'my-products', 'messages']; if (!hub.settings.registered && registered_routes.includes(route[1])) { @@ -253,8 +258,7 @@ erpnext.hub.Marketplace = class Marketplace { this.register_dialog.hide(); frappe.set_route('marketplace', 'publish'); - // custom jquery event - this.$body.trigger('seller-registered'); + erpnext.hub.trigger('seller-registered'); }); } } diff --git a/erpnext/public/js/hub/pages/buying_messages.js b/erpnext/public/js/hub/pages/buying_messages.js new file mode 100644 index 00000000000..c307b8dfccb --- /dev/null +++ b/erpnext/public/js/hub/pages/buying_messages.js @@ -0,0 +1,96 @@ +import SubPage from './subpage'; + +erpnext.hub.BuyingMessages = class BuyingMessages extends SubPage { + make_wrapper() { + super.make_wrapper(); + this.add_back_link(__('Back to Messages'), 'marketplace/messages'); + this.$message_container = this.add_section({ title: 'Buy' }); + } + + refresh() { + const item_code = frappe.get_route()[2] || null; + if (!item_code) { + frappe.set_route('marketplace/messages'); + return; + } + + this.get_item_details(item_code) + .then(item_details => { + this.item_details = item_details; + + // make chat area + this.$message_container.find('.hub-section-header h4').text(this.item_details.item_name); + this.$message_container.find('.hub-section-body').html(` +
+ `) + this.make_message_input(); + + // fetch messages + this.get_messages(item_details) + .then(messages => { + const $message_list = this.$message_container.find('.message-list'); + const html = messages.map(get_message_html).join(''); + $message_list.html(html); + frappe.dom.scroll_to_bottom($message_list); + }); + }); + + } + + get_messages(item_details) { + return hub.call('get_messages', { + against_seller: item_details.hub_seller, + against_item: item_details.hub_item_code + }); + } + + get_item_details(hub_item_code) { + return hub.call('get_item_details', { hub_item_code }) + } + + make_message_input() { + this.message_input = new frappe.ui.CommentArea({ + parent: this.$message_container.find('.message-input'), + on_submit: (message) => { + this.message_input.reset(); + + // append message html + const $message_list = this.$message_container.find('.message-list'); + const message_html = get_message_html({ + sender: hub.settings.company_email, + content: message + }); + $message_list.append(message_html); + frappe.dom.scroll_to_bottom($message_list); + + // send message + hub.call('send_message', { + from_seller: hub.settings.company_email, + to_seller: this.item_details.hub_seller, + hub_item: this.item_details.hub_item_code, + message + }); + }, + no_wrapper: true + }); + } +} + +function get_message_html(message) { + return ` +