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
diff --git a/erpnext/hub_node/api.py b/erpnext/hub_node/api.py
index 2a928d4..df3e7ef 100644
--- a/erpnext/hub_node/api.py
+++ b/erpnext/hub_node/api.py
@@ -19,6 +19,7 @@
@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 @@
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 ebe8b70..5ea3011 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 @@
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 6e0b26c..164e78d 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 070d0a6..159fdd1 100644
--- a/erpnext/public/js/hub/components/ReviewArea.vue
+++ b/erpnext/public/js/hub/components/ReviewArea.vue
@@ -56,8 +56,6 @@
},
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 ea827ff..636bf14 100644
--- a/erpnext/public/js/hub/components/profile_dialog.js
+++ b/erpnext/public/js/hub/components/profile_dialog.js
@@ -24,16 +24,10 @@
}
}
},
- // {
- // 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 @@
// 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 @@
// 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 9df6303..bacca47 100644
--- a/erpnext/public/js/hub/marketplace.js
+++ b/erpnext/public/js/hub/marketplace.js
@@ -22,17 +22,20 @@
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 @@
}
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 ddb4b11..ebf593a 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"
>
<div slot="subtitle">
- <span>{{item.recent_message.sender}}: </span>
- <span>{{item.recent_message.content | striphtml}}</span>
+ <span>{{ get_sender(item.recent_message) }}: </span>
+ <span>{{ item.recent_message.message | striphtml }}</span>
</div>
</item-list-card>
</div>
@@ -47,6 +47,9 @@
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 5d07bcd..272be58 100644
--- a/erpnext/public/js/hub/pages/Item.vue
+++ b/erpnext/public/js/hub/pages/Item.vue
@@ -81,7 +81,7 @@
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 @@
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 1930bcb..73506e9 100644
--- a/erpnext/public/js/hub/pages/Messages.vue
+++ b/erpnext/public/js/hub/pages/Messages.vue
@@ -16,7 +16,7 @@
<div class="level margin-bottom" v-for="message in messages" :key="message.name">
<div class="level-left ellipsis" style="width: 80%;">
<div v-html="frappe.avatar(message.sender)" />
- <div style="white-space: normal;" v-html="message.content" />
+ <div style="white-space: normal;" v-html="message.message" />
</div>
<div class="level-right text-muted" v-html="frappe.datetime.comment_when(message.creation, true)" />
</div>
@@ -64,13 +64,12 @@
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 52df285..6559f79 100644
--- a/erpnext/public/js/hub/pages/PublishedItems.vue
+++ b/erpnext/public/js/hub/pages/PublishedItems.vue
@@ -5,10 +5,10 @@
>
<section-header>
<div>
- <h5>{{ page_title }}</h5>
+ <h5>{{ __('Published Items') }}</h5>
<p v-if="items.length"
class="text-muted margin-bottom">
- {{ published_items_message }}
+ {{ __('You can publish upto 200 items.') }}
</p>
</div>
@@ -16,7 +16,7 @@
class="btn btn-default btn-xs publish-items"
v-route="'marketplace/publish'"
>
- <span>{{ publish_button_text }}</span>
+ <span>{{ __('Publish More Items') }}</span>
</button>
</section-header>
@@ -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"
>
</item-cards-container>
@@ -44,16 +44,9 @@
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 e18af0c..439c1f2 100644
--- a/erpnext/public/js/hub/vue-plugins.js
+++ b/erpnext/public/js/hub/vue-plugins.js
@@ -62,5 +62,5 @@
});
Vue.filter('striphtml', function (text) {
- return strip_html(text);
+ return strip_html(text || '');
});
\ No newline at end of file