diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 0494ae698c3..d6e1caceb93 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -164,7 +164,8 @@ class WebsiteSlides(WebsiteProfile): if not request.env.user._is_public() and channel.is_member: slide_partners = request.env['slide.slide.partner'].sudo().search([ ('channel_id', '=', channel.id), - ('partner_id', '=', request.env.user.partner_id.id) + ('partner_id', '=', request.env.user.partner_id.id), + ('slide_id.active', '=', True) ]) for slide_partner in slide_partners: channel_progress[slide_partner.slide_id.id].update(slide_partner.read()[0]) @@ -666,9 +667,9 @@ class WebsiteSlides(WebsiteProfile): return slide.is_preview @http.route(['/slides/slide/send_share_email'], type='json', auth='user', website=True) - def slide_send_share_email(self, slide_id, email): + def slide_send_share_email(self, slide_id, email, fullscreen=False): slide = request.env['slide.slide'].browse(int(slide_id)) - result = slide._send_share_email(email) + result = slide._send_share_email(email, fullscreen) return result # -------------------------------------------------- diff --git a/addons/website_slides/data/mail_data.xml b/addons/website_slides/data/mail_data.xml index 226e2111e33..e00ddd2f78b 100644 --- a/addons/website_slides/data/mail_data.xml +++ b/addons/website_slides/data/mail_data.xml @@ -38,12 +38,12 @@ Hello

${ctx['user'].name} shared the ${object.slide_type} ${object.name} with you!
- + ${object.name}
- View ${object.name}

diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 8c06b195ff2..b7e0eb55495 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -356,15 +356,24 @@ class Slide(models.Model): ) return True - def _send_share_email(self, email): + def _generate_signed_token(self, partner_id): + """ Lazy generate the acces_token and return it signed by the given partner_id + :rtype tuple (string, int) + :return (signed_token, partner_id) + """ + if not self.access_token: + self.write({'access_token': self._default_access_token()}) + return self._sign_token(partner_id) + + def _send_share_email(self, email, fullscreen): # TDE FIXME: template to check mail_ids = [] base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for record in self: if self.env.user.has_group('base.group_portal'): - mail_ids.append(self.channel_id.share_template_id.with_context(user=self.env.user, email=email, base_url=base_url).sudo().send_mail(record.id, notif_layout='mail.mail_notification_light', email_values={'email_from': self.env['res.company'].catchall or self.env['res.company'].email})) + mail_ids.append(self.channel_id.share_template_id.with_context(user=self.env.user, email=email, base_url=base_url, fullscreen=fullscreen).sudo().send_mail(record.id, notif_layout='mail.mail_notification_light', email_values={'email_from': self.env['res.company'].catchall or self.env['res.company'].email})) else: - mail_ids.append(self.channel_id.share_template_id.with_context(user=self.env.user, email=email, base_url=base_url).send_mail(record.id, notif_layout='mail.mail_notification_light')) + mail_ids.append(self.channel_id.share_template_id.with_context(user=self.env.user, email=email, base_url=base_url, fullscreen=fullscreen).send_mail(record.id, notif_layout='mail.mail_notification_light')) return mail_ids def action_like(self): diff --git a/addons/website_slides/static/src/js/slides_course_fullscreen_player.js b/addons/website_slides/static/src/js/slides_course_fullscreen_player.js index 42fce775674..22e8b126b2d 100644 --- a/addons/website_slides/static/src/js/slides_course_fullscreen_player.js +++ b/addons/website_slides/static/src/js/slides_course_fullscreen_player.js @@ -7,11 +7,14 @@ odoo.define('website_slides.fullscreen', function (require) { var core = require('web.core'); var config = require('web.config'); var QWeb = core.qweb; + var _t = core._t; var session = require('web.session'); var Quiz = require('website_slides.quiz'); + var Dialog = require('web.Dialog'); + /** * Helper: Get the slide dict matching the given criteria @@ -276,6 +279,104 @@ odoo.define('website_slides.fullscreen', function (require) { }, }); + var ShareDialog = Dialog.extend({ + template: 'website.slide.share.modal', + events: { + 'click .o_wslides_js_share_email button': '_onShareByEmailClick', + 'click a.o_wslides_js_social_share': '_onSlidesSocialShare', + 'click .o_clipboard_button': '_onShareLinkCopy', + }, + + init: function (parent, options, slide) { + options = _.defaults(options || {}, { + title: "Share", + buttons: [{text: "Cancel", close: true}], + size: 'medium', + }); + this._super(parent, options); + this.slide = slide; + this.session = session; + }, + + _onShareByEmailClick: function() { + var form = this.$('.o_wslides_js_share_email'); + var input = form.find('input'); + var slideID = form.find('button').data('slide-id'); + if (input.val() && input[0].checkValidity()) { + form.removeClass('o_has_error').find('.form-control, .custom-select').removeClass('is-invalid'); + this._rpc({ + route: '/slides/slide/send_share_email', + params: { + slide_id: slideID, + email: input.val(), + fullscreen: true + }, + }).then(function () { + form.html(''); + }); + } else { + form.addClass('o_has_error').find('.form-control, .custom-select').addClass('is-invalid'); + input.focus(); + } + }, + + _onSlidesSocialShare: function (ev) { + ev.preventDefault(); + var popUpURL = $(ev.currentTarget).attr('href'); + window.open(popUpURL, 'Share Dialog', 'width=626,height=436'); + }, + + _onShareLinkCopy: function (ev) { + ev.preventDefault(); + var $clipboardBtn = this.$('.o_clipboard_button'); + $clipboardBtn.tooltip({title: "Copied !", trigger: "manual", placement: "bottom"}); + var self = this; + var clipboard = new ClipboardJS('.o_clipboard_button', { + target: function () { + return self.$('.o_wslides_js_share_link')[0]; + }, + container: this.el + }); + clipboard.on('success', function () { + clipboard.destroy(); + $clipboardBtn.tooltip('show'); + _.delay(function () { + $clipboardBtn.tooltip("hide"); + }, 800); + }); + clipboard.on('error', function (e) { + console.log(e); + clipboard.destroy(); + }) + }, + + }); + + var ShareButton = publicWidget.Widget.extend({ + events: { + "click .o_wslides_fs_share": '_onClickShareSlide' + }, + + init: function (el, slide) { + var result = this._super.apply(this, arguments); + this.slide = slide; + return result; + }, + + _openDialog: function() { + return new ShareDialog(this, {}, this.slide).open(); + }, + + _onClickShareSlide: function (ev) { + ev.preventDefault(); + this._openDialog(); + }, + + _onChangeSlide: function (currentSlide) { + this.slide = currentSlide; + } + + }); /** * This widget's purpose is to show content of a course, naviguating through contents @@ -315,6 +416,7 @@ odoo.define('website_slides.fullscreen', function (require) { this.set('slide', slide); this.sidebar = new Sidebar(this, this.slides, slide); + this.shareButton = new ShareButton(this, slide); return result; }, /** @@ -339,6 +441,7 @@ odoo.define('website_slides.fullscreen', function (require) { attachTo: function (){ var defs = [this._super.apply(this, arguments)]; defs.push(this.sidebar.attachTo(this.$('.o_wslides_fs_sidebar'))); + defs.push(this.shareButton.attachTo(this.$('.o_wslides_slide_fs_header'))); return $.when.apply($, defs); }, //-------------------------------------------------------------------------- @@ -517,6 +620,7 @@ odoo.define('website_slides.fullscreen', function (require) { isQuiz: slideData.isQuiz || false, }); this.set('slide', newSlide); + this.shareButton._onChangeSlide(newSlide); }, /** * Triggered when subwidget has mark the slide as done, and the UI need to be adapted. @@ -570,7 +674,7 @@ odoo.define('website_slides.fullscreen', function (require) { publicWidget.registry.websiteSlidesFullscreenPlayer = publicWidget.Widget.extend({ selector: '.o_wslides_fs_main', - xmlDependencies: ['/website_slides/static/src/xml/website_slides_fullscreen.xml'], + xmlDependencies: ['/website_slides/static/src/xml/website_slides_fullscreen.xml', '/website_slides/static/src/xml/website_slides_share.xml'], start: function (){ var proms = [this._super.apply(this, arguments)]; var fullscreen = new Fullscreen(this, this._getSlides(), this._getCurrentSlideID(), this._extractChannelData()); diff --git a/addons/website_slides/static/src/js/slides_share.js b/addons/website_slides/static/src/js/slides_share.js index d89cdfcb4bf..d23b48c5c9a 100644 --- a/addons/website_slides/static/src/js/slides_share.js +++ b/addons/website_slides/static/src/js/slides_share.js @@ -41,7 +41,8 @@ var ShareMail = publicWidget.Widget.extend({ publicWidget.registry.websiteSlidesShare = publicWidget.Widget.extend({ selector: '#wrapwrap', events: { - 'click a.o_slides_social_share': '_onSlidesSocialShare', + 'click a.o_wslides_js_social_share': '_onSlidesSocialShare', + 'click .o_clipboard_button': '_onShareLinkCopy', }, /** @@ -73,5 +74,29 @@ publicWidget.registry.websiteSlidesShare = publicWidget.Widget.extend({ } }); }, + + _onShareLinkCopy: function (ev) { + ev.preventDefault(); + var $clipboardBtn = this.$('.o_clipboard_button'); + $clipboardBtn.tooltip({title: "Copied !", trigger: "manual", placement: "bottom"}); + var self = this; + var clipboard = new ClipboardJS('.o_clipboard_button', { + target: function () { + return self.$('.o_wslides_js_share_link')[0]; + }, + container: this.el + }); + clipboard.on('success', function () { + clipboard.destroy(); + $clipboardBtn.tooltip('show'); + _.delay(function () { + $clipboardBtn.tooltip("hide"); + }, 800); + }); + clipboard.on('error', function (e) { + console.log(e); + clipboard.destroy(); + }) + }, }); }); diff --git a/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss b/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss index 36a173dc255..fe6914d25f5 100644 --- a/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss +++ b/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss @@ -1,7 +1,7 @@ .o_wslides_fs_main { @include o-position-absolute(0,0,0,0); - z-index: 2000; + z-index: 1040; background-image: linear-gradient(120deg, $o-wslides-color-dark2, $o-wslides-color-dark3); .o_wslides_slide_fs_header { diff --git a/addons/website_slides/static/src/xml/website_slides_share.xml b/addons/website_slides/static/src/xml/website_slides_share.xml new file mode 100644 index 00000000000..7aa115918db --- /dev/null +++ b/addons/website_slides/static/src/xml/website_slides_share.xml @@ -0,0 +1,59 @@ + + + + +
+ +
+
+ + +
+
+
Share on Social Networks
+
+ + + +
+
+
+
Share Link
+
+ +
+ +
+
+
+
+ +
+
+
+ + +
Share by mail
+
+
+
+ + + + +
+ +
+
+

Please login to share this by email.

+
+
+ +
\ No newline at end of file diff --git a/addons/website_slides/views/website_slides_templates_course.xml b/addons/website_slides/views/website_slides_templates_course.xml index 6fbdde87bc5..bfde708c6df 100644 --- a/addons/website_slides/views/website_slides_templates_course.xml +++ b/addons/website_slides/views/website_slides_templates_course.xml @@ -307,8 +307,15 @@
Share Link
- +
+ +
+ +
+
diff --git a/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml b/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml index 43b5f348375..0b28617a206 100644 --- a/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml +++ b/addons/website_slides/views/website_slides_templates_lesson_fullscreen.xml @@ -20,6 +20,9 @@ Write a review + + Share +
Share Link
- +
+ +
+ +
+
Use permanent link to share in social media