6b2b9dcee2
- `get_doc` -> `get_values` and `db.sql` -> `db.delete` in Wishlist Item deletion - cache first page of Item Reviews and burst cache on addition and deletion of reviews - Update redisearch docs link in E Commerce Settings - Removed unused cint import - Broke setting attribute context into smaller functions and code cleanup - Minor recommended items padding tweak - Item reviews form dict now uses website item as key - Customer reviews rendered from UI style consistency - Stock status consistency in listing and full page - Handle no price in variant dialog for matched item
138 lines
3.4 KiB
JavaScript
138 lines
3.4 KiB
JavaScript
$(() => {
|
|
class CustomerReviews {
|
|
constructor() {
|
|
this.bind_button_actions();
|
|
this.start = 0;
|
|
this.page_length = 10;
|
|
}
|
|
|
|
bind_button_actions() {
|
|
this.write_review();
|
|
this.view_more();
|
|
}
|
|
|
|
write_review() {
|
|
//TODO: make dialog popup on stray page
|
|
$('.page_content').on('click', '.btn-write-review', (e) => {
|
|
// Bind action on write a review button
|
|
const $btn = $(e.currentTarget);
|
|
|
|
let d = new frappe.ui.Dialog({
|
|
title: __("Write a Review"),
|
|
fields: [
|
|
{fieldname: "title", fieldtype: "Data", label: "Headline", reqd: 1},
|
|
{fieldname: "rating", fieldtype: "Rating", label: "Overall Rating", reqd: 1},
|
|
{fieldtype: "Section Break"},
|
|
{fieldname: "comment", fieldtype: "Small Text", label: "Your Review"}
|
|
],
|
|
primary_action: function() {
|
|
let data = d.get_values();
|
|
frappe.call({
|
|
method: "erpnext.e_commerce.doctype.item_review.item_review.add_item_review",
|
|
args: {
|
|
web_item: $btn.attr('data-web-item'),
|
|
title: data.title,
|
|
rating: data.rating,
|
|
comment: data.comment
|
|
},
|
|
freeze: true,
|
|
freeze_message: __("Submitting Review ..."),
|
|
callback: (r) => {
|
|
if (!r.exc) {
|
|
frappe.msgprint({
|
|
message: __("Thank you for submitting your review"),
|
|
title: __("Review Submitted"),
|
|
indicator: "green"
|
|
});
|
|
d.hide();
|
|
location.reload();
|
|
}
|
|
}
|
|
});
|
|
},
|
|
primary_action_label: __('Submit')
|
|
});
|
|
d.show();
|
|
});
|
|
}
|
|
|
|
view_more() {
|
|
$('.page_content').on('click', '.btn-view-more', (e) => {
|
|
// Bind action on view more button
|
|
const $btn = $(e.currentTarget);
|
|
$btn.prop('disabled', true);
|
|
|
|
this.start += this.page_length;
|
|
let me = this;
|
|
|
|
frappe.call({
|
|
method: "erpnext.e_commerce.doctype.item_review.item_review.get_item_reviews",
|
|
args: {
|
|
web_item: $btn.attr('data-web-item'),
|
|
start: me.start,
|
|
end: me.page_length
|
|
},
|
|
callback: (result) => {
|
|
if (result.message) {
|
|
let res = result.message;
|
|
me.get_user_review_html(res.reviews);
|
|
|
|
$btn.prop('disabled', false);
|
|
if (res.total_reviews <= (me.start + me.page_length)) {
|
|
$btn.hide();
|
|
}
|
|
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
}
|
|
|
|
get_user_review_html(reviews) {
|
|
let me = this;
|
|
let $content = $('.user-reviews');
|
|
|
|
reviews.forEach((review) => {
|
|
$content.append(`
|
|
<div class="mb-3 review">
|
|
<div class="d-flex">
|
|
<p class="mr-4 user-review-title">
|
|
<span>${__(review.review_title)}</span>
|
|
</p>
|
|
<div class="rating">
|
|
${me.get_review_stars(review.rating)}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="product-description mb-4">
|
|
<p>
|
|
${__(review.comment)}
|
|
</p>
|
|
</div>
|
|
<div class="review-signature mb-2">
|
|
<span class="reviewer">${__(review.customer)}</span>
|
|
<span class="indicator grey" style="--text-on-gray: var(--gray-300);"></span>
|
|
<span class="reviewer">${__(review.published_on)}</span>
|
|
</div>
|
|
</div>
|
|
`);
|
|
});
|
|
}
|
|
|
|
get_review_stars(rating) {
|
|
let stars = ``;
|
|
for (let i = 1; i < 6; i++) {
|
|
let fill_class = i <= rating ? 'star-click' : '';
|
|
stars += `
|
|
<svg class="icon icon-sm ${fill_class}">
|
|
<use href="#icon-star"></use>
|
|
</svg>
|
|
`;
|
|
}
|
|
return stars;
|
|
}
|
|
}
|
|
|
|
new CustomerReviews();
|
|
}); |