From ad0be6aaa2fe9b29530d6b535608696361fdc83f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 3 Sep 2018 15:42:00 +0530 Subject: [PATCH] fix: Messages - update messages according to new doctype - sync logo in seller registration - hub.is_seller_registered() and hub.is_user_registered() api - Add Users dialog --- erpnext/hub_node/api.py | 9 ++ .../marketplace_settings.py | 10 +- erpnext/public/js/hub/Sidebar.vue | 2 +- .../public/js/hub/components/ReviewArea.vue | 2 - .../js/hub/components/profile_dialog.js | 14 +-- erpnext/public/js/hub/marketplace.js | 109 +++++++++++------- erpnext/public/js/hub/pages/Buying.vue | 7 +- erpnext/public/js/hub/pages/Item.vue | 6 +- erpnext/public/js/hub/pages/Messages.vue | 7 +- .../public/js/hub/pages/PublishedItems.vue | 19 +-- erpnext/public/js/hub/vue-plugins.js | 2 +- 11 files changed, 105 insertions(+), 82 deletions(-) diff --git a/erpnext/hub_node/api.py b/erpnext/hub_node/api.py index 2a928d44a2..df3e7efb8f 100644 --- a/erpnext/hub_node/api.py +++ b/erpnext/hub_node/api.py @@ -19,6 +19,7 @@ current_user = frappe.session.user @frappe.whitelist() def register_marketplace(company, company_description): validate_registerer() + settings = frappe.get_single('Marketplace Settings') message = settings.register_seller(company, company_description) @@ -151,6 +152,14 @@ def publish_selected_items(items_to_publish): except Exception as e: frappe.log_error(message=e, title='Hub Sync Error') +@frappe.whitelist() +def get_unregistered_users(): + settings = frappe.get_single('Marketplace Settings') + registered_users = [user.user for user in settings.users] + ['Administrator', 'Guest'] + all_users = [user.name for user in frappe.db.get_all('User', filters={'enabled': 1})] + unregistered_users = [user for user in all_users if user not in registered_users] + return unregistered_users + def item_sync_preprocess(intended_item_publish_count): response = call_hub_method('pre_items_publish', { diff --git a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py index ebe8b702ab..5ea3011a86 100644 --- a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py +++ b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py @@ -15,18 +15,16 @@ class MarketplaceSettings(Document): def register_seller(self, company, company_description): - country, currency, description = frappe.db.get_value('Company', company, - ['country', 'default_currency', 'company_description']) + country, currency, company_logo = frappe.db.get_value('Company', company, + ['country', 'default_currency', 'company_logo']) company_details = { 'company': company, 'country': country, - # 'city': '', 'currency': currency, 'company_description': company_description, - # 'company_logo': company_logo, - - 'site_name': frappe.utils.get_url(), + 'company_logo': company_logo, + 'site_name': frappe.utils.get_url() } hub_connection = self.get_connection() diff --git a/erpnext/public/js/hub/Sidebar.vue b/erpnext/public/js/hub/Sidebar.vue index 6e0b26ce58..164e78d30d 100644 --- a/erpnext/public/js/hub/Sidebar.vue +++ b/erpnext/public/js/hub/Sidebar.vue @@ -19,7 +19,7 @@ export default { data() { return { - hub_registered: hub.settings.registered, + hub_registered: hub.is_user_registered(), items: [ { label: __('Browse'), diff --git a/erpnext/public/js/hub/components/ReviewArea.vue b/erpnext/public/js/hub/components/ReviewArea.vue index 070d0a69cb..159fdd112f 100644 --- a/erpnext/public/js/hub/components/ReviewArea.vue +++ b/erpnext/public/js/hub/components/ReviewArea.vue @@ -56,8 +56,6 @@ export default { }, on_submit_review(values) { - values.user = hub.settings.company_email; - this.review_area.reset(); hub.call('add_item_review', { diff --git a/erpnext/public/js/hub/components/profile_dialog.js b/erpnext/public/js/hub/components/profile_dialog.js index ea827ff3bf..636bf1436a 100644 --- a/erpnext/public/js/hub/components/profile_dialog.js +++ b/erpnext/public/js/hub/components/profile_dialog.js @@ -24,16 +24,10 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => { } } }, - // { - // fieldname: 'company_logo', - // label: __('Logo'), - // fieldtype: 'Attach Image', - // read_only: true - // }, { + label: __('About your company'), fieldname: 'company_description', - label: __('About Your Company'), - fieldtype: 'Long Text' + fieldtype: 'Text' } ]; @@ -48,7 +42,7 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => { // TODO: Say "we notice that the company description and logo isn't set. Please set them in master." // Only then allow to register - const mandatory_fields = ['company']; + const mandatory_fields = ['company', 'company_description']; mandatory_fields.forEach(field => { const value = form_values[field]; if (!value) { @@ -65,7 +59,7 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => { // Post create const default_company = frappe.defaults.get_default('company'); dialog.set_value('company', default_company); - dialog.set_value('company_email', frappe.session.user); + dialog.set_value('email', frappe.session.user); return dialog; } diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js index 9df6303f6b..bacca47545 100644 --- a/erpnext/public/js/hub/marketplace.js +++ b/erpnext/public/js/hub/marketplace.js @@ -22,17 +22,20 @@ erpnext.hub.Marketplace = class Marketplace { frappe.model.with_doc('Marketplace Settings').then(doc => { hub.settings = doc; - const is_registered = hub.settings.registered; - const is_registered_seller = hub.settings.company_email === frappe.session.user; + this.setup_header(); this.make_sidebar(); this.make_body(); this.setup_events(); this.refresh(); - if (!is_registered && !is_registered_seller && frappe.user_roles.includes('System Manager')) { - this.page.set_primary_action('Become a Seller', this.show_register_dialog.bind(this)) - } else { - this.page.set_secondary_action('Add Users', this.show_add_user_dialog.bind(this)); + + if (is_subset(['System Manager', 'Item Manager'], frappe.user_roles)) { + // show buttons only to System Manager + if (!hub.is_seller_registered()) { + this.page.set_primary_action('Become a Seller', this.show_register_dialog.bind(this)) + } else { + this.page.set_secondary_action('Add Users', this.show_add_user_dialog.bind(this)); + } } }); } @@ -118,45 +121,73 @@ erpnext.hub.Marketplace = class Marketplace { } show_add_user_dialog() { - const user_list = Object.keys(frappe.boot.user_info) - .filter(user => !['Administrator', 'Guest', frappe.session.user].includes(user)); - const d = new frappe.ui.Dialog({ - title: __('Add Users to Marketplace'), - fields: [ - { - label: __('Users'), - fieldname: 'users', - fieldtype: 'MultiSelect', - reqd: 1, - get_data() { - return user_list; - } - } - ], - primary_action({ users }) { - const selected_users = users.split(',').map(d => d.trim()).filter(Boolean); + this.get_unregistered_users() + .then(r => { + const user_list = r.message; - if (!selected_users.every(user => user_list.includes(user))) { - d.set_df_property('users', 'description', __('Some emails are invalid')); - return; - } else { - d.set_df_property('users', 'description', ''); - } + const d = new frappe.ui.Dialog({ + title: __('Add Users to Marketplace'), + fields: [ + { + label: __('Users'), + fieldname: 'users', + fieldtype: 'MultiSelect', + reqd: 1, + get_data() { + return user_list; + } + } + ], + primary_action({ users }) { + const selected_users = users.split(',').map(d => d.trim()).filter(Boolean); - frappe.call('erpnext.hub_node.api.register_users', { - user_list: selected_users - }) - .then(r => { - d.hide(); + if (!selected_users.every(user => user_list.includes(user))) { + d.set_df_property('users', 'description', __('Some emails are invalid')); + return; + } else { + d.set_df_property('users', 'description', ''); + } - if (r.message && r.message.length) { - frappe.show_alert('Added {0} users', [r.message.length]); + frappe.call('erpnext.hub_node.api.register_users', { + user_list: selected_users + }) + .then(r => { + d.hide(); + + if (r.message && r.message.length) { + frappe.show_alert(__('Added {0} users', [r.message.length])); + } + }); } }); - } - }); - d.show(); + d.show(); + }); + } + + get_unregistered_users() { + return frappe.call('erpnext.hub_node.api.get_unregistered_users') } } + +Object.assign(hub, { + is_seller_registered() { + return hub.settings.registered; + }, + + is_user_registered() { + return this.is_seller_registered() && hub.settings.users + .filter(hub_user => hub_user.user === frappe.session.user) + .length === 1; + }, +}); + +/** + * Returns true if list_a is subset of list_b + * @param {Array} list_a + * @param {Array} list_b + */ +function is_subset(list_a, list_b) { + return list_a.every(item => list_b.includes(item)); +} diff --git a/erpnext/public/js/hub/pages/Buying.vue b/erpnext/public/js/hub/pages/Buying.vue index ddb4b11db9..ebf593aca4 100644 --- a/erpnext/public/js/hub/pages/Buying.vue +++ b/erpnext/public/js/hub/pages/Buying.vue @@ -13,8 +13,8 @@ v-route="'marketplace/buying/' + item.name" >
- {{item.recent_message.sender}}: - {{item.recent_message.content | striphtml}} + {{ get_sender(item.recent_message) }}: + {{ item.recent_message.message | striphtml }}
@@ -47,6 +47,9 @@ export default { methods: { get_items_for_messages() { return hub.call('get_buying_items_for_messages', {}, 'action:send_message'); + }, + get_sender(message) { + return message.sender === frappe.session.user ? __('You') : (message.sender_name || message.sender); } } } diff --git a/erpnext/public/js/hub/pages/Item.vue b/erpnext/public/js/hub/pages/Item.vue index 5d07bcd620..272be58133 100644 --- a/erpnext/public/js/hub/pages/Item.vue +++ b/erpnext/public/js/hub/pages/Item.vue @@ -81,7 +81,7 @@ export default { is_own_item() { let is_own_item = false; if(this.item) { - if(this.item.hub_seller === hub.setting.company_email) { + if(this.item.hub_seller === hub.settings.hub_seller_name) { is_own_item = true; } } @@ -224,13 +224,11 @@ export default { if (!message) return; hub.call('send_message', { - from_seller: hub.settings.company_email, - to_seller: this.item.hub_seller, hub_item: this.item.name, message }) .then(() => { - d.hide(); + this.contact_seller_dialog.hide(); frappe.set_route('marketplace', 'buying', this.item.name); erpnext.hub.trigger('action:send_message') }); diff --git a/erpnext/public/js/hub/pages/Messages.vue b/erpnext/public/js/hub/pages/Messages.vue index 1930bcb22a..73506e9926 100644 --- a/erpnext/public/js/hub/pages/Messages.vue +++ b/erpnext/public/js/hub/pages/Messages.vue @@ -16,7 +16,7 @@
-
+
@@ -64,13 +64,12 @@ export default { methods: { send_message(message) { this.messages.push({ - sender: hub.settings.company_email, - content: message, + sender: frappe.session.user, + message: message, creation: Date.now(), name: frappe.utils.get_random(6) }); hub.call('send_message', { - from_seller: hub.settings.company_email, to_seller: this.get_against_seller(), hub_item: this.item_details.name, message diff --git a/erpnext/public/js/hub/pages/PublishedItems.vue b/erpnext/public/js/hub/pages/PublishedItems.vue index 52df2850a9..6559f7910a 100644 --- a/erpnext/public/js/hub/pages/PublishedItems.vue +++ b/erpnext/public/js/hub/pages/PublishedItems.vue @@ -5,10 +5,10 @@ >
-
{{ page_title }}
+
{{ __('Published Items') }}

- {{ published_items_message }} + {{ __('You can publish upto 200 items.') }}

@@ -16,7 +16,7 @@ class="btn btn-default btn-xs publish-items" v-route="'marketplace/publish'" > - {{ publish_button_text }} + {{ __('Publish More Items') }}
@@ -26,7 +26,7 @@ :items="items" :item_id_fieldname="item_id_fieldname" :on_click="go_to_item_details_page" - :empty_state_message="empty_state_message" + :empty_state_message="__('You haven\'t published any items yet.')" :empty_state_action="publish_page_action" > @@ -44,16 +44,9 @@ export default { publish_page_action: { label: __('Publish Your First Items'), on_click: () => { - frappe.set_route(`marketplace/home`); + frappe.set_route(`marketplace/publish`); } - }, - - // Constants - page_title: __('Published Items'), - publish_button_text: __('Publish More Items'), - published_items_message: __('You can publish upto 200 items.'), - // TODO: Add empty state action - empty_state_message: __('You haven\'t published any items yet.') + } }; }, created() { diff --git a/erpnext/public/js/hub/vue-plugins.js b/erpnext/public/js/hub/vue-plugins.js index e18af0c428..439c1f24e2 100644 --- a/erpnext/public/js/hub/vue-plugins.js +++ b/erpnext/public/js/hub/vue-plugins.js @@ -62,5 +62,5 @@ Vue.directive('img-src', { }); Vue.filter('striphtml', function (text) { - return strip_html(text); + return strip_html(text || ''); }); \ No newline at end of file