blob: 453b96a168c7a5ee98b4a541607adaf3a5171a50 [file] [log] [blame]
marinationc8423052021-04-07 23:49:04 +05301$(() => {
2 class CustomerReviews {
3 constructor() {
4 this.bind_button_actions();
5 this.start = 0;
6 this.page_length = 10;
7 }
8
9 bind_button_actions() {
10 this.write_review();
11 this.view_more();
12 }
13
14 write_review() {
15 //TODO: make dialog popup on stray page
16 $('.page_content').on('click', '.btn-write-review', (e) => {
17 // Bind action on write a review button
18 const $btn = $(e.currentTarget);
19
20 let d = new frappe.ui.Dialog({
21 title: __("Write a Review"),
22 fields: [
23 {fieldname: "title", fieldtype: "Data", label: "Headline", reqd: 1},
24 {fieldname: "rating", fieldtype: "Rating", label: "Overall Rating", reqd: 1},
25 {fieldtype: "Section Break"},
26 {fieldname: "comment", fieldtype: "Small Text", label: "Your Review"}
27 ],
28 primary_action: function() {
29 let me = this;
30 let data = d.get_values();
31 frappe.call({
32 method: "erpnext.e_commerce.doctype.item_review.item_review.add_item_review",
33 args: {
34 web_item: $btn.attr('data-web-item'),
35 title: data.title,
36 rating: data.rating,
37 comment: data.comment
38 },
39 freeze: true,
40 freeze_message: __("Submitting Review ..."),
41 callback: (r) => {
42 if(!r.exc) {
43 frappe.msgprint({
44 message: __("Thank you for submitting your review"),
45 title: __("Review Submitted"),
46 indicator: "green"
47 });
48 d.hide();
49 location.reload();
50 }
51 }
52 });
53 },
54 primary_action_label: __('Submit')
55 });
56 d.show();
57 });
58 }
59
60 view_more() {
61 $('.page_content').on('click', '.btn-view-more', (e) => {
62 // Bind action on view more button
63 const $btn = $(e.currentTarget);
64 $btn.prop('disabled', true);
65
66 this.start += this.page_length;
67 let me = this;
68
69 frappe.call({
70 method: "erpnext.e_commerce.doctype.item_review.item_review.get_item_reviews",
71 args: {
72 web_item: $btn.attr('data-web-item'),
73 start: me.start,
74 end: me.page_length
75 },
76 callback: (result) => {
77 if(result.message) {
78 let res = result.message;
79 me.get_user_review_html(res.reviews);
80
81 $btn.prop('disabled', false);
82 if (res.total_reviews <= (me.start + me.page_length)) {
83 $btn.hide();
84 }
85
86 }
87 }
88 })
89 });
90
91 }
92
93 get_user_review_html(reviews) {
94 let me = this;
95 let $content = $('.user-reviews');
96
97 reviews.forEach((review) => {
98 $content.append(`
99 <div class="mb-3 review">
100 <div style="display: flex;">
101 <div class="rating">
102 ${me.get_review_stars(review.rating)}
103 </div>
104 <p class="ml-4 user-review-title">
105 <span>${__(review.review_title)}</span>
106 </p>
107 </div>
108 <div class="review-signature">
109 <span class="reviewer">${__(review.customer)}</span>
110 <span>${__(review.published_on)}</span>
111 </div>
112 <div class="product-description mb-4 mt-4">
113 <p>
114 ${__(review.comment)}
115 </p>
116 </div>
117 </div>
118 `);
119 });
120 }
121
122 get_review_stars(rating) {
123 let stars = ``;
124 for(let i = 1; i < 6; i++) {
125 let fill_class = i <= rating ? 'star-click' : '';
126 stars += `<svg class="icon icon-md ${fill_class}">
127 <use href="#icon-star"></use>
128 </svg>`;
129 }
130 return stars;
131 }
132 }
133
134 new CustomerReviews();
135});