mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-29 18:04:46 +00:00
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
This commit is contained in:
@@ -19,6 +19,7 @@ current_user = frappe.session.user
|
|||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def register_marketplace(company, company_description):
|
def register_marketplace(company, company_description):
|
||||||
validate_registerer()
|
validate_registerer()
|
||||||
|
|
||||||
settings = frappe.get_single('Marketplace Settings')
|
settings = frappe.get_single('Marketplace Settings')
|
||||||
message = settings.register_seller(company, company_description)
|
message = settings.register_seller(company, company_description)
|
||||||
|
|
||||||
@@ -151,6 +152,14 @@ def publish_selected_items(items_to_publish):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
frappe.log_error(message=e, title='Hub Sync Error')
|
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):
|
def item_sync_preprocess(intended_item_publish_count):
|
||||||
response = call_hub_method('pre_items_publish', {
|
response = call_hub_method('pre_items_publish', {
|
||||||
|
|||||||
@@ -15,18 +15,16 @@ class MarketplaceSettings(Document):
|
|||||||
|
|
||||||
def register_seller(self, company, company_description):
|
def register_seller(self, company, company_description):
|
||||||
|
|
||||||
country, currency, description = frappe.db.get_value('Company', company,
|
country, currency, company_logo = frappe.db.get_value('Company', company,
|
||||||
['country', 'default_currency', 'company_description'])
|
['country', 'default_currency', 'company_logo'])
|
||||||
|
|
||||||
company_details = {
|
company_details = {
|
||||||
'company': company,
|
'company': company,
|
||||||
'country': country,
|
'country': country,
|
||||||
# 'city': '',
|
|
||||||
'currency': currency,
|
'currency': currency,
|
||||||
'company_description': company_description,
|
'company_description': company_description,
|
||||||
# 'company_logo': company_logo,
|
'company_logo': company_logo,
|
||||||
|
'site_name': frappe.utils.get_url()
|
||||||
'site_name': frappe.utils.get_url(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hub_connection = self.get_connection()
|
hub_connection = self.get_connection()
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hub_registered: hub.settings.registered,
|
hub_registered: hub.is_user_registered(),
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
label: __('Browse'),
|
label: __('Browse'),
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
on_submit_review(values) {
|
on_submit_review(values) {
|
||||||
values.user = hub.settings.company_email;
|
|
||||||
|
|
||||||
this.review_area.reset();
|
this.review_area.reset();
|
||||||
|
|
||||||
hub.call('add_item_review', {
|
hub.call('add_item_review', {
|
||||||
|
|||||||
@@ -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',
|
fieldname: 'company_description',
|
||||||
label: __('About Your Company'),
|
fieldtype: 'Text'
|
||||||
fieldtype: 'Long 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."
|
// TODO: Say "we notice that the company description and logo isn't set. Please set them in master."
|
||||||
// Only then allow to register
|
// Only then allow to register
|
||||||
|
|
||||||
const mandatory_fields = ['company'];
|
const mandatory_fields = ['company', 'company_description'];
|
||||||
mandatory_fields.forEach(field => {
|
mandatory_fields.forEach(field => {
|
||||||
const value = form_values[field];
|
const value = form_values[field];
|
||||||
if (!value) {
|
if (!value) {
|
||||||
@@ -65,7 +59,7 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => {
|
|||||||
// Post create
|
// Post create
|
||||||
const default_company = frappe.defaults.get_default('company');
|
const default_company = frappe.defaults.get_default('company');
|
||||||
dialog.set_value('company', 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;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,17 +22,20 @@ erpnext.hub.Marketplace = class Marketplace {
|
|||||||
|
|
||||||
frappe.model.with_doc('Marketplace Settings').then(doc => {
|
frappe.model.with_doc('Marketplace Settings').then(doc => {
|
||||||
hub.settings = 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.setup_header();
|
||||||
this.make_sidebar();
|
this.make_sidebar();
|
||||||
this.make_body();
|
this.make_body();
|
||||||
this.setup_events();
|
this.setup_events();
|
||||||
this.refresh();
|
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))
|
if (is_subset(['System Manager', 'Item Manager'], frappe.user_roles)) {
|
||||||
} else {
|
// show buttons only to System Manager
|
||||||
this.page.set_secondary_action('Add Users', this.show_add_user_dialog.bind(this));
|
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() {
|
show_add_user_dialog() {
|
||||||
const user_list = Object.keys(frappe.boot.user_info)
|
this.get_unregistered_users()
|
||||||
.filter(user => !['Administrator', 'Guest', frappe.session.user].includes(user));
|
.then(r => {
|
||||||
const d = new frappe.ui.Dialog({
|
const user_list = r.message;
|
||||||
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);
|
|
||||||
|
|
||||||
if (!selected_users.every(user => user_list.includes(user))) {
|
const d = new frappe.ui.Dialog({
|
||||||
d.set_df_property('users', 'description', __('Some emails are invalid'));
|
title: __('Add Users to Marketplace'),
|
||||||
return;
|
fields: [
|
||||||
} else {
|
{
|
||||||
d.set_df_property('users', 'description', '');
|
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', {
|
if (!selected_users.every(user => user_list.includes(user))) {
|
||||||
user_list: selected_users
|
d.set_df_property('users', 'description', __('Some emails are invalid'));
|
||||||
})
|
return;
|
||||||
.then(r => {
|
} else {
|
||||||
d.hide();
|
d.set_df_property('users', 'description', '');
|
||||||
|
}
|
||||||
|
|
||||||
if (r.message && r.message.length) {
|
frappe.call('erpnext.hub_node.api.register_users', {
|
||||||
frappe.show_alert('Added {0} users', [r.message.length]);
|
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));
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
v-route="'marketplace/buying/' + item.name"
|
v-route="'marketplace/buying/' + item.name"
|
||||||
>
|
>
|
||||||
<div slot="subtitle">
|
<div slot="subtitle">
|
||||||
<span>{{item.recent_message.sender}}: </span>
|
<span>{{ get_sender(item.recent_message) }}: </span>
|
||||||
<span>{{item.recent_message.content | striphtml}}</span>
|
<span>{{ item.recent_message.message | striphtml }}</span>
|
||||||
</div>
|
</div>
|
||||||
</item-list-card>
|
</item-list-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -47,6 +47,9 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
get_items_for_messages() {
|
get_items_for_messages() {
|
||||||
return hub.call('get_buying_items_for_messages', {}, 'action:send_message');
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ export default {
|
|||||||
is_own_item() {
|
is_own_item() {
|
||||||
let is_own_item = false;
|
let is_own_item = false;
|
||||||
if(this.item) {
|
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;
|
is_own_item = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,13 +224,11 @@ export default {
|
|||||||
if (!message) return;
|
if (!message) return;
|
||||||
|
|
||||||
hub.call('send_message', {
|
hub.call('send_message', {
|
||||||
from_seller: hub.settings.company_email,
|
|
||||||
to_seller: this.item.hub_seller,
|
|
||||||
hub_item: this.item.name,
|
hub_item: this.item.name,
|
||||||
message
|
message
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
d.hide();
|
this.contact_seller_dialog.hide();
|
||||||
frappe.set_route('marketplace', 'buying', this.item.name);
|
frappe.set_route('marketplace', 'buying', this.item.name);
|
||||||
erpnext.hub.trigger('action:send_message')
|
erpnext.hub.trigger('action:send_message')
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<div class="level margin-bottom" v-for="message in messages" :key="message.name">
|
<div class="level margin-bottom" v-for="message in messages" :key="message.name">
|
||||||
<div class="level-left ellipsis" style="width: 80%;">
|
<div class="level-left ellipsis" style="width: 80%;">
|
||||||
<div v-html="frappe.avatar(message.sender)" />
|
<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>
|
||||||
<div class="level-right text-muted" v-html="frappe.datetime.comment_when(message.creation, true)" />
|
<div class="level-right text-muted" v-html="frappe.datetime.comment_when(message.creation, true)" />
|
||||||
</div>
|
</div>
|
||||||
@@ -64,13 +64,12 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
send_message(message) {
|
send_message(message) {
|
||||||
this.messages.push({
|
this.messages.push({
|
||||||
sender: hub.settings.company_email,
|
sender: frappe.session.user,
|
||||||
content: message,
|
message: message,
|
||||||
creation: Date.now(),
|
creation: Date.now(),
|
||||||
name: frappe.utils.get_random(6)
|
name: frappe.utils.get_random(6)
|
||||||
});
|
});
|
||||||
hub.call('send_message', {
|
hub.call('send_message', {
|
||||||
from_seller: hub.settings.company_email,
|
|
||||||
to_seller: this.get_against_seller(),
|
to_seller: this.get_against_seller(),
|
||||||
hub_item: this.item_details.name,
|
hub_item: this.item_details.name,
|
||||||
message
|
message
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
>
|
>
|
||||||
<section-header>
|
<section-header>
|
||||||
<div>
|
<div>
|
||||||
<h5>{{ page_title }}</h5>
|
<h5>{{ __('Published Items') }}</h5>
|
||||||
<p v-if="items.length"
|
<p v-if="items.length"
|
||||||
class="text-muted margin-bottom">
|
class="text-muted margin-bottom">
|
||||||
{{ published_items_message }}
|
{{ __('You can publish upto 200 items.') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
class="btn btn-default btn-xs publish-items"
|
class="btn btn-default btn-xs publish-items"
|
||||||
v-route="'marketplace/publish'"
|
v-route="'marketplace/publish'"
|
||||||
>
|
>
|
||||||
<span>{{ publish_button_text }}</span>
|
<span>{{ __('Publish More Items') }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</section-header>
|
</section-header>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
:items="items"
|
:items="items"
|
||||||
:item_id_fieldname="item_id_fieldname"
|
:item_id_fieldname="item_id_fieldname"
|
||||||
:on_click="go_to_item_details_page"
|
: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"
|
:empty_state_action="publish_page_action"
|
||||||
>
|
>
|
||||||
</item-cards-container>
|
</item-cards-container>
|
||||||
@@ -44,16 +44,9 @@ export default {
|
|||||||
publish_page_action: {
|
publish_page_action: {
|
||||||
label: __('Publish Your First Items'),
|
label: __('Publish Your First Items'),
|
||||||
on_click: () => {
|
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() {
|
created() {
|
||||||
|
|||||||
@@ -62,5 +62,5 @@ Vue.directive('img-src', {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Vue.filter('striphtml', function (text) {
|
Vue.filter('striphtml', function (text) {
|
||||||
return strip_html(text);
|
return strip_html(text || '');
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user