From 2a81b4acd6173be6da3650d943d16fca78dfaf79 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 1 Aug 2018 19:19:53 +0530 Subject: [PATCH] Messages: first cut --- erpnext/public/js/hub/marketplace.js | 6 +- erpnext/public/js/hub/pages/messages.js | 113 +++++++++++++++++++++++- erpnext/public/less/hub.less | 40 +++++++++ 3 files changed, 155 insertions(+), 4 deletions(-) diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js index d393605d05..e29ae6fc23 100644 --- a/erpnext/public/js/hub/marketplace.js +++ b/erpnext/public/js/hub/marketplace.js @@ -131,12 +131,12 @@ erpnext.hub.Marketplace = class Marketplace { } update_sidebar() { - const route = frappe.get_route_str(); - const $sidebar_item = this.$sidebar.find(`[data-route="${route}"]`); + const route = frappe.get_route(); + const route_str = route.slice(0, 2).join('/'); + const $sidebar_item = this.$sidebar.find(`[data-route="${route_str}"]`); const $siblings = this.$sidebar.find('[data-route]'); $siblings.removeClass('active').addClass('text-muted'); - $sidebar_item.addClass('active').removeClass('text-muted'); } diff --git a/erpnext/public/js/hub/pages/messages.js b/erpnext/public/js/hub/pages/messages.js index ac2057dcf3..7bc99a7253 100644 --- a/erpnext/public/js/hub/pages/messages.js +++ b/erpnext/public/js/hub/pages/messages.js @@ -1,7 +1,118 @@ import SubPage from './subpage'; +import { make_search_bar } from '../helpers'; erpnext.hub.Messages = class Messages extends SubPage { - refresh() { + make_wrapper() { + super.make_wrapper(); + const html = ` +
+
+
+
+
+ ${get_message_area_html()} +
+
+ `; + + make_search_bar({ + wrapper: this.$wrapper, + on_search: keyword => { + + }, + placeholder: __('Search for messages') + }) + + this.$wrapper.append(html); + + this.message_input = new frappe.ui.CommentArea({ + parent: this.$wrapper.find('.message-input'), + on_submit: (message) => { + this.message_input.reset(); + + // append message html + const $message_list = this.$wrapper.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); + + const to_seller = frappe.get_route()[2]; + hub.call('send_message', { + from_seller: hub.settings.company_email, + to_seller, + message + }); + }, + no_wrapper: true + }); } + + refresh() { + this.get_interactions() + .then(sellers => { + const html = sellers.map(get_list_item_html).join(''); + this.$wrapper.find('.seller-list').html(html); + }); + + this.get_messages() + .then(messages => { + const $message_list = this.$wrapper.find('.message-list'); + const html = messages.map(get_message_html).join(''); + $message_list.html(html); + frappe.dom.scroll_to_bottom($message_list); + }); + } + + get_interactions() { + return hub.call('get_sellers_with_interactions', { for_seller: hub.settings.company_email }); + } + + get_messages() { + const against_seller = frappe.get_route()[2]; + if (!against_seller) return Promise.resolve([]); + + return hub.call('get_messages', { + for_seller: hub.settings.company_email, + against_seller: against_seller + }); + } +} + +function get_message_area_html() { + return ` +
+
+
+
+
+
+ `; +} + +function get_list_item_html(seller) { + const active_class = frappe.get_route()[2] === seller.email ? 'active' : ''; + + return ` +
+
+ +
+
+ ${seller.company} +
+
+ `; +} + +function get_message_html(message) { + return ` +
+
${message.sender}
+

${message.content}

+
+ `; } \ No newline at end of file diff --git a/erpnext/public/less/hub.less b/erpnext/public/less/hub.less index c7277f28d9..da51260e6d 100644 --- a/erpnext/public/less/hub.less +++ b/erpnext/public/less/hub.less @@ -221,4 +221,44 @@ body[data-route^="marketplace/"] { .hub-item-dropdown { margin-top: 20px; } + + /* messages page */ + + .message-list-item { + display: flex; + align-items: center; + padding: 8px 12px; + cursor: pointer; + + &:not(.active) { + filter: grayscale(1); + color: @text-muted; + } + + &:hover { + background-color: @light-bg; + } + + .list-item-left { + width: 30px; + border-radius: 4px; + overflow: hidden; + margin-right: 15px; + } + + .list-item-body { + font-weight: bold; + padding-bottom: 1px; + } + } + + .message-list { + overflow: scroll; + } + + .message-area { + border-radius: 4px; + justify-content: space-between; + height: calc(100vh - 220px); + } }