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!
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('' + _t('Thank you! Mail has been sent.') + '
');
+ });
+ } 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 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
+