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:
Faris Ansari 2018-09-03 15:42:00 +05:30
parent 18e3c61109
commit ad0be6aaa2
11 changed files with 105 additions and 82 deletions

View File

@ -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', {

View File

@ -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()

View File

@ -19,7 +19,7 @@
export default {
data() {
return {
hub_registered: hub.settings.registered,
hub_registered: hub.is_user_registered(),
items: [
{
label: __('Browse'),

View File

@ -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', {

View File

@ -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;
}

View File

@ -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));
}

View File

@ -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 @@ 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);
}
}
}

View File

@ -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')
});

View File

@ -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 @@ 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

View File

@ -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 @@ 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() {

View File

@ -62,5 +62,5 @@ Vue.directive('img-src', {
});
Vue.filter('striphtml', function (text) {
return strip_html(text);
return strip_html(text || '');
});