summaryrefslogtreecommitdiff
path: root/addons/website_rating/static/src
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2019-10-24 14:05:48 +0000
committerThibault Delavallée <tde@odoo.com>2019-12-02 15:18:45 +0000
commit9e0677882d64ac2be92cd1ea147ce823e2d9f69b (patch)
tree389e992bf7ee18cf77ea08ca2e32a945d02c400d /addons/website_rating/static/src
parent82f56ffddfc6aed21030214dc95c0a3e9f5d9a93 (diff)
[MOV] website_rating: move to portal_rating
PURPOSE Clean posting process and improve mail.message definition and comprehension. Move as much possible content from website_* modules to portal_* modules to ease their use in customer portal SPECIFICATIONS Now that publish feature is replaced by internal directly in mail and portal rating portal inclusion can be done safely in a portal_ratign module instead of website_rating. It allows to remove the dependency and give the rating feature of customer chatter directly in portal applications. LINKS Task ID 2071556 PR #38692
Diffstat (limited to 'addons/website_rating/static/src')
-rw-r--r--addons/website_rating/static/src/js/portal_chatter.js355
-rw-r--r--addons/website_rating/static/src/js/portal_composer.js127
-rw-r--r--addons/website_rating/static/src/js/portal_rating_composer.js72
-rw-r--r--addons/website_rating/static/src/scss/website_rating.scss86
-rw-r--r--addons/website_rating/static/src/xml/portal_chatter.xml116
-rw-r--r--addons/website_rating/static/src/xml/portal_rating_composer.xml53
-rw-r--r--addons/website_rating/static/src/xml/portal_tools.xml87
7 files changed, 0 insertions, 896 deletions
diff --git a/addons/website_rating/static/src/js/portal_chatter.js b/addons/website_rating/static/src/js/portal_chatter.js
deleted file mode 100644
index c67b82a9974..00000000000
--- a/addons/website_rating/static/src/js/portal_chatter.js
+++ /dev/null
@@ -1,355 +0,0 @@
-odoo.define('rating.portal.chatter', function (require) {
-'use strict';
-
-var core = require('web.core');
-var portalChatter = require('portal.chatter');
-var utils = require('web.utils');
-var time = require('web.time');
-
-var _t = core._t;
-var PortalChatter = portalChatter.PortalChatter;
-var qweb = core.qweb;
-var STAR_RATING_RATIO = 2; // conversion factor from the star (1-5) to the db rating range (1-10)
-
-/**
- * PortalChatter
- *
- * Extends Frontend Chatter to handle rating
- */
-PortalChatter.include({
- events: _.extend({}, PortalChatter.prototype.events, {
- // star based control
- 'click .o_website_rating_select': '_onClickStarDomain',
- 'click .o_website_rating_select_text': '_onClickStarDomainReset',
- // publisher comments
- 'click .o_wrating_js_publisher_comment_btn': '_onClickPublisherComment',
- 'click .o_wrating_js_publisher_comment_edit': '_onClickPublisherComment',
- 'click .o_wrating_js_publisher_comment_delete': '_onClickPublisherCommentDelete',
- 'click .o_wrating_js_publisher_comment_submit': '_onClickPublisherCommentSubmit',
- 'click .o_wrating_js_publisher_comment_cancel': '_onClickPublisherCommentCancel',
- }),
- xmlDependencies: (PortalChatter.prototype.xmlDependencies || [])
- .concat([
- '/website_rating/static/src/xml/portal_tools.xml',
- '/website_rating/static/src/xml/portal_chatter.xml'
- ]),
-
- /**
- * @constructor
- */
- init: function (parent, options) {
- this._super.apply(this, arguments);
- // options
- if (!_.contains(this.options, 'display_rating')) {
- this.options = _.defaults(this.options, {
- 'display_rating': false,
- 'rating_default_value': 0.0,
- });
- }
- // rating card
- this.set('rating_card_values', {});
- this.set('rating_value', false);
- this.on("change:rating_value", this, this._onChangeRatingDomain);
- },
-
- //--------------------------------------------------------------------------
- // Public
- //--------------------------------------------------------------------------
-
- /**
- * Update the messages format
- *
- * @param {Array<Object>} messages
- * @returns {Array}
- */
- preprocessMessages: function (messages) {
- var self = this;
- messages = this._super.apply(this, arguments);
- if (this.options['display_rating']) {
- _.each(messages, function (m, i) {
- m.rating_value = self.roundToHalf(m['rating_value'] / STAR_RATING_RATIO);
- m.rating = self._preprocessCommentData(m.rating, i);
- });
- }
- // save messages in the widget to process correctly the publisher comment templates
- this.messages = messages;
- return messages;
- },
- /**
- * Round the given value with a precision of 0.5.
- *
- * Examples:
- * - 1.2 --> 1.0
- * - 1.7 --> 1.5
- * - 1.9 --> 2.0
- *
- * @param {Number} value
- * @returns Number
- **/
- roundToHalf: function (value) {
- var converted = parseFloat(value); // Make sure we have a number
- var decimal = (converted - parseInt(converted, 10));
- decimal = Math.round(decimal * 10);
- if (decimal === 5) {
- return (parseInt(converted, 10) + 0.5);
- }
- if ((decimal < 3) || (decimal > 7)) {
- return Math.round(converted);
- } else {
- return (parseInt(converted, 10) + 0.5);
- }
- },
-
- //--------------------------------------------------------------------------
- // Private
- //--------------------------------------------------------------------------
-
- /**
- * @override
- */
- _chatterInit: function () {
- var self = this;
- return this._super.apply(this, arguments).then(function (result) {
- if (!result['rating_stats']) {
- return;
- }
- var ratingData = {
- 'avg': Math.round(result['rating_stats']['avg'] / STAR_RATING_RATIO * 100) / 100,
- 'percent': [],
- };
- _.each(_.keys(result['rating_stats']['percent']).reverse(), function (rating) {
- if (rating % 2 === 0) {
- ratingData['percent'].push({
- 'num': rating / STAR_RATING_RATIO,
- 'percent': utils.round_precision(result['rating_stats']['percent'][rating], 0.01),
- });
- }
- });
- self.set('rating_card_values', ratingData);
- });
- },
- /**
- * @override
- */
- _messageFetchPrepareParams: function () {
- var params = this._super.apply(this, arguments);
- if (this.options['display_rating']) {
- params['rating_include'] = true;
- }
- return params;
- },
-
- /**
- * Default rating data for publisher comment qweb template
- * @private
- * @param {Integer} messageIndex
- */
- _newPublisherCommentData: function (messageIndex) {
- return {
- mes_index: messageIndex,
- publisher_id: this.options.partner_id,
- publisher_avatar: _.str.sprintf('/web/image/%s/%s/image_128/50x50', 'res.partner', this.options.partner_id),
- publisher_name: _t("Write your comment"),
- publisher_datetime: '',
- publisher_comment: '',
- };
- },
-
- /**
- * preprocess the rating data comming from /website/rating/comment or the chatter_init
- * Can be also use to have new rating data for a new publisher comment
- * @param {JSON} rawRating
- * @returns {JSON} the process rating data
- */
- _preprocessCommentData: function (rawRating, messageIndex) {
- var ratingData = {
- id: rawRating.id,
- mes_index: messageIndex,
- publisher_datetime: rawRating.publisher_datetime ? moment(time.str_to_datetime(rawRating.publisher_datetime)).format('MMMM Do YYYY, h:mm:ss a') : "",
- publisher_comment: rawRating.publisher_comment ? rawRating.publisher_comment : '',
- };
-
- // split array (id, display_name) of publisher_id into publisher_id and publisher_name
- if (rawRating.publisher_id && rawRating.publisher_id.length >= 2) {
- ratingData.publisher_id = rawRating.publisher_id[0];
- ratingData.publisher_name = rawRating.publisher_id[1];
- ratingData.publisher_avatar = _.str.sprintf('/web/image/%s/%s/image_128/50x50', 'res.partner', ratingData.publisher_id);
- }
- var commentData = _.extend(this._newPublisherCommentData(messageIndex), ratingData);
- return commentData;
- },
-
- /** ---------------
- * Selection of elements for the publisher comment feature
- * Only available from a source in a publisher_comment or publisher_comment_form template
- */
-
- _getCommentContainer: function ($source) {
- return $source.parents(".o_wrating_publisher_container").first().find(".o_wrating_publisher_comment").first();
- },
-
- _getCommentButton: function ($source) {
- return $source.parents(".o_wrating_publisher_container").first().find(".o_wrating_js_publisher_comment_btn").first();
- },
-
- _getCommentTextarea: function ($source) {
- return $source.parents(".o_wrating_publisher_container").first().find(".o_portal_rating_comment_input").first();
- },
-
- _focusTextComment: function ($source) {
- this._getCommentTextarea($source).focus();
- },
-
- //--------------------------------------------------------------------------
- // Handlers
- //--------------------------------------------------------------------------
-
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onClickStarDomain: function (ev) {
- var $tr = this.$(ev.currentTarget);
- var num = $tr.data('star');
- if ($tr.css('opacity') === '1') {
- this.set('rating_value', num);
- this.$('.o_website_rating_select').css({
- 'opacity': 0.5,
- });
- this.$('.o_website_rating_select_text[data-star="' + num + '"]').css({
- 'visibility': 'visible',
- 'opacity': 1,
- });
- this.$('.o_website_rating_select[data-star="' + num + '"]').css({
- 'opacity': 1,
- });
- }
- },
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onClickStarDomainReset: function (ev) {
- ev.stopPropagation();
- ev.preventDefault();
- this.set('rating_value', false);
- this.$('.o_website_rating_select_text').css('visibility', 'hidden');
- this.$('.o_website_rating_select').css({
- 'opacity': 1,
- });
- },
-
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onClickPublisherComment: function (ev) {
- var $source = this.$(ev.currentTarget);
- // If the form is already present => like cancel remove the form
- if (this._getCommentTextarea($source).length === 1) {
- this._getCommentContainer($source).empty();
- return;
- }
- var messageIndex = $source.data("mes_index");
- var data = {is_publisher: this.options['is_user_publisher']};
- data.rating = this._newPublisherCommentData(messageIndex);
-
- var oldRating = this.messages[messageIndex].rating;
- data.rating.publisher_comment = oldRating.publisher_comment ? oldRating.publisher_comment : '';
- this._getCommentContainer($source).html($(qweb.render("website_rating.chatter_rating_publisher_form", data)));
- this._focusTextComment($source);
- },
-
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onClickPublisherCommentDelete: function (ev) {
- var self = this;
- var $source = this.$(ev.currentTarget);
-
- var messageIndex = $source.data("mes_index");
- var ratingId = this.messages[messageIndex].rating.id;
-
- this._rpc({
- route: '/website/rating/comment',
- params: {
- "rating_id": ratingId,
- "publisher_comment": '' // Empty publisher comment means no comment
- }
- }).then(function (res) {
- self.messages[messageIndex].rating = self._preprocessCommentData(res, messageIndex);
- self._getCommentButton($source).removeClass("d-none");
- self._getCommentContainer($source).empty();
- });
- },
-
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onClickPublisherCommentSubmit: function (ev) {
- var self = this;
- var $source = this.$(ev.currentTarget);
-
- var messageIndex = $source.data("mes_index");
- var comment = this._getCommentTextarea($source).val();
- var ratingId = this.messages[messageIndex].rating.id;
-
- this._rpc({
- route: '/website/rating/comment',
- params: {
- "rating_id": ratingId,
- "publisher_comment": comment
- }
- }).then(function (res) {
-
- // Modify the related message
- self.messages[messageIndex].rating = self._preprocessCommentData(res, messageIndex);
- if (self.messages[messageIndex].rating.publisher_comment !== '') {
- // Remove the button comment if exist and render the comment
- self._getCommentButton($source).addClass('d-none');
- self._getCommentContainer($source).html($(qweb.render("website_rating.chatter_rating_publisher_comment", {
- rating: self.messages[messageIndex].rating,
- is_publisher: self.options.is_user_publisher
- })));
- } else {
- // Empty string or false considers as no comment
- self._getCommentButton($source).removeClass("d-none");
- self._getCommentContainer($source).empty();
- }
- });
- },
-
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onClickPublisherCommentCancel: function (ev) {
- var $source = this.$(ev.currentTarget);
- var messageIndex = $source.data("mes_index");
-
- var comment = this.messages[messageIndex].rating.publisher_comment;
- if (comment) {
- var data = {
- rating: this.messages[messageIndex].rating,
- is_publisher: this.options.is_user_publisher
- };
- this._getCommentContainer($source).html($(qweb.render("website_rating.chatter_rating_publisher_comment", data)));
- } else {
- this._getCommentContainer($source).empty();
- }
- },
-
- /**
- * @private
- */
- _onChangeRatingDomain: function () {
- var domain = [];
- if (this.get('rating_value')) {
- domain = [['rating_value', '=', this.get('rating_value') * STAR_RATING_RATIO]];
- }
- this._changeCurrentPage(1, domain);
- },
-});
-});
diff --git a/addons/website_rating/static/src/js/portal_composer.js b/addons/website_rating/static/src/js/portal_composer.js
deleted file mode 100644
index a54f416cd7f..00000000000
--- a/addons/website_rating/static/src/js/portal_composer.js
+++ /dev/null
@@ -1,127 +0,0 @@
-odoo.define('rating.portal.composer', function (require) {
-'use strict';
-
-var core = require('web.core');
-var portalComposer = require('portal.composer');
-
-var _t = core._t;
-
-var PortalComposer = portalComposer.PortalComposer;
-
-var STAR_RATING_RATIO = 2; // conversion factor from the star (1-5) to the db rating range (1-10)
-
-/**
- * PortalComposer
- *
- * Extends Portal Composer to handle rating submission
- */
-PortalComposer.include({
- events: _.extend({}, PortalComposer.prototype.events, {
- 'click .stars i': '_onClickStar',
- 'mouseleave .stars': '_onMouseleaveStarBlock',
- 'mousemove .stars i': '_onMoveStar',
- 'mouseleave .stars i': '_onMoveLeaveStar',
- }),
-
- /**
- * @constructor
- */
- init: function (parent, options) {
- this._super.apply(this, arguments);
-
- // apply ratio to default rating value
- if (options.default_rating_value) {
- options.default_rating_value = parseFloat(options.default_rating_value) / STAR_RATING_RATIO;
- }
-
- // default options
- this.options = _.defaults(this.options, {
- 'default_message': false,
- 'default_message_id': false,
- 'default_rating_value': false,
- 'force_submit_url': false,
- });
- // star input widget
- this.labels = {
- '0': "",
- '1': _t("I hate it"),
- '2': _t("I don't like it"),
- '3': _t("It's okay"),
- '4': _t("I like it"),
- '5': _t("I love it"),
- };
- this.user_click = false; // user has click or not
- this.set("star_value", this.options.default_rating_value);
- this.on("change:star_value", this, this._onChangeStarValue);
- },
- /**
- * @override
- */
- start: function () {
- var self = this;
- return this._super.apply(this, arguments).then(function () {
- // rating stars
- self.$input = self.$('input[name="rating_value"]');
- self.$star_list = self.$('.stars').find('i');
-
- // set the default value to trigger the display of star widget and update the hidden input value.
- self.set("star_value", self.options.default_rating_value);
- self.$input.val(self.options.default_rating_value * STAR_RATING_RATIO);
- });
- },
-
- //--------------------------------------------------------------------------
- // Handlers
- //--------------------------------------------------------------------------
-
- /**
- * @private
- */
- _onChangeStarValue: function () {
- var val = this.get("star_value");
- var index = Math.floor(val);
- var decimal = val - index;
- // reset the stars
- this.$star_list.removeClass('fas fa-star-half-alt').addClass('far fa-star');
-
- this.$('.stars').find("i:lt(" + index + ")").removeClass('far fa-star-half-alt').addClass('fas fa-star');
- if (decimal) {
- this.$('.stars').find("i:eq(" + index + ")").removeClass('far fa-star').addClass('fas fa-star-half-alt');
- }
- this.$('.rate_text .badge').text(this.labels[index]);
- },
- /**
- * @private
- */
- _onClickStar: function (ev) {
- var index = this.$('.stars i').index(ev.currentTarget);
- this.set("star_value", index + 1);
- this.user_click = true;
- this.$input.val(this.get("star_value") * STAR_RATING_RATIO);
- },
- /**
- * @private
- */
- _onMouseleaveStarBlock: function () {
- this.$('.rate_text').hide();
- },
- /**
- * @private
- * @param {MouseEvent} ev
- */
- _onMoveStar: function (ev) {
- var index = this.$('.stars i').index(ev.currentTarget);
- this.$('.rate_text').show();
- this.set("star_value", index + 1);
- },
- /**
- * @private
- */
- _onMoveLeaveStar: function () {
- if (!this.user_click) {
- this.set("star_value", parseInt(this.$input.val()));
- }
- this.user_click = false;
- },
-});
-});
diff --git a/addons/website_rating/static/src/js/portal_rating_composer.js b/addons/website_rating/static/src/js/portal_rating_composer.js
deleted file mode 100644
index d9a78f17255..00000000000
--- a/addons/website_rating/static/src/js/portal_rating_composer.js
+++ /dev/null
@@ -1,72 +0,0 @@
-odoo.define('portal.rating.composer', function (require) {
-'use strict';
-
-var publicWidget = require('web.public.widget');
-var session = require('web.session');
-var portalComposer = require('portal.composer');
-
-var PortalComposer = portalComposer.PortalComposer;
-
-var STAR_RATING_RATIO = 2; // conversion factor from the star (1-5) to the db rating range (1-10)
-
-/**
- * RatingPopupComposer
- *
- * Display the rating average with a static star widget, and open
- * a popup with the portal composer when clicking on it.
- **/
-var RatingPopupComposer = publicWidget.Widget.extend({
- template: 'website_rating.PopupComposer',
- xmlDependencies: [
- '/portal/static/src/xml/portal_chatter.xml',
- '/website_rating/static/src/xml/portal_tools.xml',
- '/website_rating/static/src/xml/portal_rating_composer.xml',
- ],
-
- init: function (parent, options) {
- this._super.apply(this, arguments);
- this.rating_avg = Math.round(options['ratingAvg'] / STAR_RATING_RATIO * 100) / 100 || 0.0;
- this.rating_total = options['ratingTotal'] || 0.0;
-
- this.options = _.defaults({}, options, {
- 'token': false,
- 'res_model': false,
- 'res_id': false,
- 'pid': 0,
- 'display_composer': options['disable_composer'] ? false : !session.is_website_user,
- 'display_rating': true,
- 'csrf_token': odoo.csrf_token,
- 'user_id': session.user_id,
- });
- },
- /**
- * @override
- */
- start: function () {
- var defs = [];
- defs.push(this._super.apply(this, arguments));
-
- // instanciate and insert composer widget
- this._composer = new PortalComposer(this, this.options);
- defs.push(this._composer.replace(this.$('.o_portal_chatter_composer')));
-
- return Promise.all(defs);
- },
-});
-
-publicWidget.registry.RatingPopupComposer = publicWidget.Widget.extend({
- selector: '.o_rating_popup_composer',
-
- /**
- * @override
- */
- start: function () {
- var ratingPopupData = this.$el.data();
- var ratingPopup = new RatingPopupComposer(this, ratingPopupData);
- return Promise.all([
- this._super.apply(this, arguments),
- ratingPopup.appendTo(this.$el)
- ]);
- },
-});
-});
diff --git a/addons/website_rating/static/src/scss/website_rating.scss b/addons/website_rating/static/src/scss/website_rating.scss
deleted file mode 100644
index 4c2a70495fe..00000000000
--- a/addons/website_rating/static/src/scss/website_rating.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-/* static stars */
-$o-w-rating-star-color: #FACC2E;
-.o_website_rating_static{
- color: $o-w-rating-star-color;
-}
-
-.o_website_rating_card_container {
-
- .o_message_counter {
- color: gray('700');
- }
-
- /* progress bars */
- table.o_website_rating_progress_table {
- width: 100%;
- overflow: visible;
-
- .o_website_rating_table_star_num {
- min-width: 50px;
- }
- .o_website_rating_select[style*="opacity: 1"] {
- cursor: pointer;
- }
- .o_website_rating_table_progress{
- min-width: 120px;
- > .progress {
- margin-bottom: 5px;
- margin-left: 5px;
- margin-right: 5px;
- }
- .o_rating_progressbar{
- background-color: $o-w-rating-star-color;
- }
- }
- .o_website_rating_table_percent {
- text-align: right;
- padding-left: 5px;
- font-size: $font-size-sm;
- }
- .o_website_rating_table_reset {
- .o_website_rating_select_text {
- visibility: hidden;
- }
- }
- }
-
-}
-
-/* Star Widget */
-.o_rating_star_card{
- margin-bottom: 5px;
- .stars {
- display: inline-block;
- color: #FACC2E;
- margin-right: 15px;
- }
-
- .stars i {
- margin-right: -3px;
- text-align: center;
- }
-
- .stars.enabled{
- cursor: pointer;
- }
-
- .rate_text{
- display: inline-block;
- }
-}
-
-/* Rating Popup Composer */
-.o_rating_popup_composer {
-
- .o_rating_clickable {
- cursor: pointer;
- }
-
- .o_portal_chatter_avatar {
- margin-right: 10px;
- }
-}
-
-.o_rating_popup_composer_label {
- color: color-yiq(white);
-}
diff --git a/addons/website_rating/static/src/xml/portal_chatter.xml b/addons/website_rating/static/src/xml/portal_chatter.xml
deleted file mode 100644
index ba8fa74cc7c..00000000000
--- a/addons/website_rating/static/src/xml/portal_chatter.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<templates id="template" xml:space="preserve">
- <!--
- Inherited templates from portal to custom chatter with rating
- -->
- <t t-extend="portal.Composer">
- <t t-jquery="textarea" t-operation="inner"><t t-esc="widget.options['default_message'] ? _.str.trim(widget.options['default_message']) : ''"/></t><!-- need to be one line to avoid \t in textarea -->
- <t t-jquery="form" t-operation="attributes">
- <attribute name="t-attf-action">#{widget.options['force_submit_url'] ? widget.options['force_submit_url'] : '/mail/chatter_post'}</attribute>
- </t>
- <t t-jquery=".o_portal_chatter_composer_form input[name='csrf_token']" t-operation="after">
- <t t-call="website_rating.rating_star_input">
- <t t-set="default_rating" t-value="widget.options['default_rating_value']"/>
- </t>
- <input type="hidden" name="message_id" t-att-value="widget.options['default_message_id']" t-if="widget.options['default_message_id']"/>
- </t>
- </t>
-
- <t t-extend="portal.chatter_messages">
- <t t-jquery="t[t-raw='message.body']" t-operation="before">
- <t t-if="message['rating_value']">
- <t t-call="website_rating.rating_stars_static">
- <t t-set="val" t-value="message.rating_value"/>
- </t>
- </t>
- </t>
- <t t-jquery=".o_portal_chatter_attachments" t-operation="after">
- <!--Only possible if a rating is link to the message, for now we can't comment if no rating
- is link to the message (because publisher comment data
- is on the rating.rating model - one comment max) -->
- <t t-if="message.rating and message.rating.id" t-call="website_rating.chatter_rating_publisher">
- <t t-set="is_publisher" t-value="widget.options['is_user_publisher']"/>
- <t t-set="rating" t-value="message.rating"/>
- </t>
- </t>
- </t>
-
- <t t-extend="portal.Chatter">
- <t t-jquery="t[t-call='portal.chatter_message_count']" t-operation="replace">
- <t t-if="widget.options['display_rating']">
- <t t-call="website_rating.rating_card"/>
- </t>
- <t t-if="!widget.options['display_rating']">
- <t t-call="portal.chatter_message_count"/>
- </t>
- </t>
- </t>
-
- <!--
- New templates specific of rating in Chatter
- -->
- <t t-name="website_rating.chatter_rating_publisher">
- <div class="o_wrating_publisher_container">
- <button t-if="is_publisher"
- t-attf-class="btn px-2 btn-sm border o_wrating_js_publisher_comment_btn {{ rating.publisher_comment !== '' ? 'd-none' : '' }}"
- t-att-data-mes_index="rating.mes_index">
- <i class="fa fa-comment text-muted mr-1"/>Comment
- </button>
- <div class="o_wrating_publisher_comment mt-2 mb-2">
- <t t-if="rating.publisher_comment" t-call="website_rating.chatter_rating_publisher_comment"/>
- </div>
- </div>
- </t>
-
- <t t-name="website_rating.chatter_rating_publisher_comment">
- <div class="media o_portal_chatter_message">
- <img class="o_portal_chatter_avatar" t-att-src="rating.publisher_avatar" alt="avatar"/>
- <div class="media-body">
- <div class="o_portal_chatter_message_title">
- <div class="d-inline-block">
- <h5><t t-esc="rating.publisher_name"/></h5>
- </div>
- <div t-if="is_publisher" class="dropdown d-inline-block">
- <button class="btn py-0" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="fa fa-ellipsis-v"/>
- </button>
- <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
- <button class="dropdown-item o_wrating_js_publisher_comment_edit" t-att-data-mes_index="rating.mes_index">
- <i class="fa fa-fw fa-pencil mr-1"/>Edit
- </button>
- <button class="dropdown-item o_wrating_js_publisher_comment_delete" t-att-data-mes_index="rating.mes_index">
- <i class="far fa-fw fa-trash-alt mr-1"/>Delete
- </button>
- </div>
- </div>
- <p>Published on <t t-esc="rating.publisher_datetime"/></p>
- </div>
- <t t-raw="rating.publisher_comment"/>
- </div>
- </div>
- </t>
- <t t-name="website_rating.chatter_rating_publisher_form">
- <div t-if="is_publisher" class="media o_portal_chatter_message shadow bg-white rounded px-3 py-3 my-1">
- <img class="o_portal_chatter_avatar" t-att-src="rating.publisher_avatar" alt="avatar"/>
- <div class="media-body">
- <div class="o_portal_chatter_message_title">
- <h5><t t-esc="rating.publisher_name"/></h5>
- <p>Published on <t t-esc="rating.publisher_datetime"/></p>
- </div>
- <textarea rows="3" class="form-control o_portal_rating_comment_input"><t t-esc="rating.publisher_comment"/></textarea>
- <div>
- <button class="btn btn-primary mt-2 o_wrating_js_publisher_comment_submit" t-att-data-mes_index="rating.mes_index">
- <t t-if="rating.publisher_comment === ''">
- Post comment
- </t><t t-else="">
- Update comment
- </t>
- </button>
- <button class="border btn btn-light mt-2 bg-white o_wrating_js_publisher_comment_cancel" t-att-data-mes_index="rating.mes_index">
- Cancel
- </button>
- </div>
- </div>
- </div>
- </t>
-</templates>
diff --git a/addons/website_rating/static/src/xml/portal_rating_composer.xml b/addons/website_rating/static/src/xml/portal_rating_composer.xml
deleted file mode 100644
index 38d041a060e..00000000000
--- a/addons/website_rating/static/src/xml/portal_rating_composer.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<templates id="template" xml:space="preserve">
- <!--
- Popup Rating Composer Widget
- It can alse be used to modify a message
- -->
- <t t-name="website_rating.PopupComposer">
- <div class="d-flex flex-wrap align-items-center">
- <div class="text-nowrap">
- <t t-call="website_rating.rating_stars_static">
- <t t-set="val" t-value="widget.rating_avg || 0"/>
- <t t-set="inline_mode" t-value="true"/>
- </t>
- <t t-if="widget.rating_total">
- <small>(<t t-esc="widget.rating_total"/> ratings)</small>
- </t>
- </div>
- <button t-if="widget.options['display_composer']" type="button" class="btn btn-sm btn-primary mx-3" data-toggle="modal" data-target="#ratingpopupcomposer">
- <t t-if="widget.options['display_composer']">
- <t t-if="widget.options['default_message_id']">
- Modify your review
- </t>
- <t t-else="">
- Add a review
- </t>
- </t>
- </button>
- </div>
-
- <div t-if="widget.options['display_composer']" class="modal fade" id="ratingpopupcomposer" tabindex="-1" role="dialog" aria-labelledby="ratingpopupcomposerlabel" aria-hidden="true">
- <div class="modal-dialog" role="document">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title o_rating_popup_composer_label" id="ratingpopupcomposerlabel">
- <t t-if="widget.options['default_message_id']">
- Modify your review
- </t>
- <t t-else="">
- Add a review
- </t>
- </h5>
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
- <span>&amp;times;</span>
- </button>
- </div>
- <div class="modal-body">
- <div class="o_portal_chatter_composer"/>
- </div>
- </div>
- </div>
- </div>
- </t>
-</templates>
diff --git a/addons/website_rating/static/src/xml/portal_tools.xml b/addons/website_rating/static/src/xml/portal_tools.xml
deleted file mode 100644
index 0d790041d0b..00000000000
--- a/addons/website_rating/static/src/xml/portal_tools.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<templates id="template" xml:space="preserve">
- <t t-name="website_rating.rating_stars_static">
- <t t-set="val_integer" t-value="Math.floor(val)"/>
- <t t-set="val_decimal" t-value="val - val_integer"/>
- <t t-set="empty_star" t-value="5 - (val_integer+Math.ceil(val_decimal))"/>
- <div class="o_website_rating_static" t-att-style="inline_mode ? 'display:inline' : ''">
- <t t-foreach="_.range(0, val_integer)" t-as="num">
- <i class="fas fa-star" role="img" aria-label="One star" title="One star"></i>
- </t>
- <t t-if="val_decimal">
- <i class="fas fa-star-half-alt" role="img" aria-label="Half a star" title="Half a star"></i>
- </t>
- <t t-foreach="_.range(0, empty_star)" t-as="num" role="img" t-attf-aria-label="#{empty_star} on 5" t-attf-title="#{empty_star} on 5">
- <i class="fas fa-star text-black-25"></i>
- </t>
- </div>
- </t>
-
- <t t-name="website_rating.rating_card">
- <div class="row o_website_rating_card_container">
- <div class="col-lg-3 offset-lg-2" t-if="!_.isEmpty(widget.get('rating_card_values'))">
- <p><strong>Average</strong></p>
- <div class="o_website_rating_avg text-center">
- <h1><t t-esc="widget.get('rating_card_values')['avg']"/></h1>
- <t t-call="website_rating.rating_stars_static">
- <t t-set="val" t-value="widget.get('rating_card_values')['avg'] || 0"/>
- </t>
- <t t-call="portal.chatter_message_count"/>
- </div>
- </div>
- <div class="col-lg-6" t-if="!_.isEmpty(widget.get('rating_card_values'))">
- <p><strong>Details</strong></p>
- <div class="o_website_rating_progress_bars">
- <table class="o_website_rating_progress_table">
- <t t-foreach="widget.get('rating_card_values')['percent']" t-as="percent">
- <tr class="o_website_rating_select" t-att-data-star="percent['num']" style="opacity: 1">
- <td class="o_website_rating_table_star_num" t-att-data-star="percent['num']">
- <t t-esc="percent['num']"/> stars
- </td>
- <td class="o_website_rating_table_progress">
- <div class="progress">
- <div class="progress-bar o_rating_progressbar" role="progressbar" t-att-aria-valuenow="percent['percent']" aria-valuemin="0" aria-valuemax="100" t-att-style="'width:' + percent['percent'] + '%;'">
- </div>
- </div>
- </td>
- <td class="o_website_rating_table_percent">
- <strong><t t-esc="Math.round(percent['percent'] * 100) / 100"/>%</strong>
- </td>
- <td class="o_website_rating_table_reset">
- <button class="btn btn-link o_website_rating_select_text" t-att-data-star="percent['num']">
- <i class="fa fa-times d-block d-sm-none" role="img" aria-label="Remove Selection"/>
- <span class="d-none d-sm-block">Remove Selection</span>
- </button>
- </td>
- </tr>
- </t>
- </table>
- </div>
- </div>
- </div>
- </t>
-
- <t t-name="website_rating.rating_star_input">
- <div class="o_rating_star_card" t-if="widget.options['display_rating']">
- <t t-set="val_integer" t-value="Math.floor(default_rating)"/>
- <t t-set="val_decimal" t-value="default_rating - val_integer"/>
- <t t-set="empty_star" t-value="5 - (val_integer+Math.ceil(val_decimal))"/>
-
- <div class="stars enabled">
- <t t-foreach="_.range(0, val_integer)" t-as="num">
- <i class="fas fa-star" role="img" aria-label="One star" title="One star"></i>
- </t>
- <t t-if="val_decimal">
- <i class="fas fa-star-half-alt" role="img" aria-label="Half a star" title="Half a star"></i>
- </t>
- <t t-foreach="_.range(0, empty_star)" t-as="num" role="img" t-attf-aria-label="#{empty_star} on 5" t-attf-title="#{empty_star} on 5">
- <i class="far fa-star text-black-25"></i>
- </t>
- </div>
- <div class="rate_text">
- <span class="badge badge-info"></span>
- </div>
- <input type="hidden" readonly="readonly" name="rating_value" t-att-value="default_rating || ''"/>
- </div>
- </t>
-</templates>