summaryrefslogtreecommitdiff
path: root/addons/website_slides/static/src/js/slides_slide_like.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_slides/static/src/js/slides_slide_like.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_slides/static/src/js/slides_slide_like.js')
-rw-r--r--addons/website_slides/static/src/js/slides_slide_like.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/addons/website_slides/static/src/js/slides_slide_like.js b/addons/website_slides/static/src/js/slides_slide_like.js
new file mode 100644
index 00000000..88bc3db1
--- /dev/null
+++ b/addons/website_slides/static/src/js/slides_slide_like.js
@@ -0,0 +1,114 @@
+odoo.define('website_slides.slides.slide.like', function (require) {
+'use strict';
+
+var core = require('web.core');
+var publicWidget = require('web.public.widget');
+require('website_slides.slides');
+
+var _t = core._t;
+
+var SlideLikeWidget = publicWidget.Widget.extend({
+ events: {
+ 'click .o_wslides_js_slide_like_up': '_onClickUp',
+ 'click .o_wslides_js_slide_like_down': '_onClickDown',
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ * @param {Object} $el
+ * @param {String} message
+ */
+ _popoverAlert: function ($el, message) {
+ $el.popover({
+ trigger: 'focus',
+ placement: 'bottom',
+ container: 'body',
+ html: true,
+ content: function () {
+ return message;
+ }
+ }).popover('show');
+ },
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _onClick: function (slideId, voteType) {
+ var self = this;
+ this._rpc({
+ route: '/slides/slide/like',
+ params: {
+ slide_id: slideId,
+ upvote: voteType === 'like',
+ },
+ }).then(function (data) {
+ if (! data.error) {
+ self.$el.find('span.o_wslides_js_slide_like_up span').text(data.likes);
+ self.$el.find('span.o_wslides_js_slide_like_down span').text(data.dislikes);
+ } else {
+ if (data.error === 'public_user') {
+ var message = _t('Please <a href="/web/login?redirect=%s">login</a> to vote this lesson');
+ var signupAllowed = data.error_signup_allowed || false;
+ if (signupAllowed) {
+ message = _t('Please <a href="/web/signup?redirect=%s">create an account</a> to vote this lesson');
+ }
+ self._popoverAlert(self.$el, _.str.sprintf(message, (document.URL)));
+ } else if (data.error === 'vote_done') {
+ self._popoverAlert(self.$el, _t('You have already voted for this lesson'));
+ } else if (data.error === 'slide_access') {
+ self._popoverAlert(self.$el, _t('You don\'t have access to this lesson'));
+ } else if (data.error === 'channel_membership_required') {
+ self._popoverAlert(self.$el, _t('You must be member of this course to vote'));
+ } else if (data.error === 'channel_comment_disabled') {
+ self._popoverAlert(self.$el, _t('Votes and comments are disabled for this course'));
+ } else if (data.error === 'channel_karma_required') {
+ self._popoverAlert(self.$el, _t('You don\'t have enough karma to vote'));
+ } else {
+ self._popoverAlert(self.$el, _t('Unknown error'));
+ }
+ }
+ });
+ },
+
+ _onClickUp: function (ev) {
+ var slideId = $(ev.currentTarget).data('slide-id');
+ return this._onClick(slideId, 'like');
+ },
+
+ _onClickDown: function (ev) {
+ var slideId = $(ev.currentTarget).data('slide-id');
+ return this._onClick(slideId, 'dislike');
+ },
+});
+
+publicWidget.registry.websiteSlidesSlideLike = publicWidget.Widget.extend({
+ selector: '#wrapwrap',
+
+ /**
+ * @override
+ * @param {Object} parent
+ */
+ start: function () {
+ var self = this;
+ var defs = [this._super.apply(this, arguments)];
+ $('.o_wslides_js_slide_like').each(function () {
+ defs.push(new SlideLikeWidget(self).attachTo($(this)));
+ });
+ return Promise.all(defs);
+ },
+});
+
+return {
+ slideLikeWidget: SlideLikeWidget,
+ websiteSlidesSlideLike: publicWidget.registry.websiteSlidesSlideLike
+};
+
+});