From 5db9ed0391febb7cabfcd7fadb1971abd2fa0bc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Warnon?= Date: Thu, 21 Feb 2019 09:06:26 +0000 Subject: [PATCH] [REF] website_slides: refactor the slide archive modal on frontend Purpose ======= This commits refactors the slide archiving confirmation modal to make it a standard Dialog (remove global selectors, remove most of useless xml, ...). It also adds a new slide archive route to allow channel publishers to archive slides in sudo mode. Indeed ACLs only website_publishers can write on slide model. In some case people without real rights may update slides. Commit linked to task ID 1942852 and PR #31394. --- addons/website_slides/controllers/main.py | 11 +++ .../src/js/slides_course_slides_list.js | 4 +- .../static/src/js/slides_delete_slide.js | 88 ------------------ .../static/src/js/slides_slide_archive.js | 91 +++++++++++++++++++ .../static/src/js/slides_upload.js | 2 +- .../static/src/xml/slide_management.xml | 8 ++ .../static/src/xml/website_slides_upload.xml | 22 ----- addons/website_slides/views/assets.xml | 2 +- .../views/website_slides_templates_course.xml | 11 ++- 9 files changed, 120 insertions(+), 119 deletions(-) delete mode 100644 addons/website_slides/static/src/js/slides_delete_slide.js create mode 100644 addons/website_slides/static/src/js/slides_slide_archive.js create mode 100644 addons/website_slides/static/src/xml/slide_management.xml diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 01f52fb536a..17ca37648eb 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -559,6 +559,17 @@ class WebsiteSlides(WebsiteProfile): slide.invalidate_cache() return slide.read(['likes', 'dislikes', 'user_vote'])[0] + @http.route('/slides/slide/archive', type='json', auth='user', website=True) + def slide_archive(self, slide_id): + """ This route allows channel publishers to archive slides. + It has to be done in sudo mode since only website_publishers can write on slides in ACLs """ + slide = request.env['slide.slide'].browse(int(slide_id)) + if slide.channel_id.can_publish: + slide.sudo().active = False + return True + + return False + @http.route(['/slides/slide/send_share_email'], type='json', auth='user', website=True) def slide_send_share_email(self, slide_id, email): slide = request.env['slide.slide'].browse(int(slide_id)) diff --git a/addons/website_slides/static/src/js/slides_course_slides_list.js b/addons/website_slides/static/src/js/slides_course_slides_list.js index c71eed1cb04..d5fb61bbc5c 100644 --- a/addons/website_slides/static/src/js/slides_course_slides_list.js +++ b/addons/website_slides/static/src/js/slides_course_slides_list.js @@ -16,9 +16,9 @@ odoo.define('website_slides.slideslist', function (require) { }, start: function (){ this._super.apply(this,arguments); - this.slideCount = $('li.content-slide').length; + this.slideCount = $('li.o_wslides_content_slide').length; //Change links HREF to fullscreen mode for SEO - var links = $(".link-to-slide"); + var links = $('.o_wslides_course_slide_link'); for (var i = 0; i < links.length; i++){ $(links[i]).attr('href', $(links[i]).attr('href') + "?fullscreen=1"); } diff --git a/addons/website_slides/static/src/js/slides_delete_slide.js b/addons/website_slides/static/src/js/slides_delete_slide.js deleted file mode 100644 index e3eef38502d..00000000000 --- a/addons/website_slides/static/src/js/slides_delete_slide.js +++ /dev/null @@ -1,88 +0,0 @@ -odoo.define('website_slides.delete.slide', function (require) { - - var sAnimations = require('website.content.snippets.animation'); - var core = require('web.core'); - var Widget = require('web.Widget'); - - var _t = core._t; - var QWeb = core.qweb; - - var DeleteSlideDialog = Widget.extend({ - template: 'website.slide.delete.slide', - events: { - 'hidden.bs.modal': 'destroy', - 'click button[data-dismiss="modal"]': '_cancel', - 'click button.delete': '_delete' - }, - - /** - * @override - * @param {Object} el - * @param {number} channel_id - */ - init: function (el, slideID) { - this._super(el, slideID); - this.slide_id = parseInt(slideID, 10); - }, - /** - * @override - */ - start: function () { - this.$el.modal({ - backdrop: 'static' - }); - return this._super.apply(this, arguments); - }, - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - _delete: function (ev) { - var self = this; - // TO FIX: CallBack is not executed - $('[slide_id='+this.slide_id+']').remove(); - this._rpc({ - model: 'slide.slide', - method: 'unlink', - args: [[self.slide_id]], - }).then(function () { - $('[slide='+this.slide_id+']').remove(); - }); - }, - /** - * @override - */ - _cancel: function () { - this.trigger('cancel'); - } - }); - - sAnimations.registry.websiteSlidesDeleteSlide = sAnimations.Class.extend({ - selector: '.oe_slide_js_delete_slide', - xmlDependencies: ['/website_slides/static/src/xml/website_slides_upload.xml'], - read_events: { - 'click': '_onDeleteSlideClick', - }, - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - _openDialog: function (slideID) { - new DeleteSlideDialog(this, slideID).appendTo(document.body); - }, - - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - - /** - * @private - * @param {Event} ev - */ - _onDeleteSlideClick: function (ev) { - var target = $(ev.currentTarget); - this._openDialog(target.attr('slide_id')); - }, - }); - return DeleteSlideDialog; - }); diff --git a/addons/website_slides/static/src/js/slides_slide_archive.js b/addons/website_slides/static/src/js/slides_slide_archive.js new file mode 100644 index 00000000000..5be5a1b384e --- /dev/null +++ b/addons/website_slides/static/src/js/slides_slide_archive.js @@ -0,0 +1,91 @@ +odoo.define('website_slides.slide.archive', function (require) { +'use strict'; + +var sAnimations = require('website.content.snippets.animation'); +var Dialog = require('web.Dialog'); +var core = require('web.core'); +var _t = core._t; + +var SlideArchiveDialog = Dialog.extend({ + template: 'slides.slide.archive', + + /** + * @override + */ + init: function (parent, options) { + options = _.defaults(options || {}, { + title: _t('Archive Slide'), + size: 'medium', + buttons: [{ + text: _t('Archive'), + classes: 'btn-primary', + click: this._onClickArchive.bind(this) + }, { + text: _t('Cancel'), + close: true + }] + }); + + this.$slideTarget = options.slideTarget; + this.slideId = this.$slideTarget.attr('slide_id'); + this._super(parent, options); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Calls 'archive' on slide controller and then visually removes the slide dom element + */ + _onClickArchive: function () { + var self = this; + + this._rpc({ + route: '/slides/slide/archive', + params: { + slide_id: this.slideId + }, + }).then(function () { + self.$slideTarget.closest('.o_wslides_content_slide').remove(); + self.close(); + }); + } +}); + +sAnimations.registry.websiteSlidesSlideArchive = sAnimations.Class.extend({ + selector: '.o_wslides_js_slide_archive', + xmlDependencies: ['/website_slides/static/src/xml/slide_management.xml'], + read_events: { + 'click': '_onArchiveSlideClick', + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + _openDialog: function ($slideTarget) { + new SlideArchiveDialog(this, {slideTarget: $slideTarget}).open(); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {Event} ev + */ + _onArchiveSlideClick: function (ev) { + ev.preventDefault(); + var $slideTarget = $(ev.currentTarget); + this._openDialog($slideTarget); + }, +}); + +return { + slideArchiveDialog: SlideArchiveDialog, + websiteSlidesSlideArchive: sAnimations.registry.websiteSlidesSlideArchive +}; + +}); diff --git a/addons/website_slides/static/src/js/slides_upload.js b/addons/website_slides/static/src/js/slides_upload.js index aa6cc6131c5..d5abc73017b 100644 --- a/addons/website_slides/static/src/js/slides_upload.js +++ b/addons/website_slides/static/src/js/slides_upload.js @@ -542,7 +542,7 @@ var SlideUploadDialog = Dialog.extend({ //Quick and really dirty fix for reordering issues if (data.channel_type === 'training' && self.categoryID){ var categoryElement = $('ul[category_id='+self.categoryID+']'); - $('').appendTo(categoryElement); + $('').appendTo(categoryElement); self._reorderSlidesSequence(); } window.location = data.url; diff --git a/addons/website_slides/static/src/xml/slide_management.xml b/addons/website_slides/static/src/xml/slide_management.xml new file mode 100644 index 00000000000..118c45970fe --- /dev/null +++ b/addons/website_slides/static/src/xml/slide_management.xml @@ -0,0 +1,8 @@ + + + +
+

Are you sure you want to archive this slide ?

+
+
+
diff --git a/addons/website_slides/static/src/xml/website_slides_upload.xml b/addons/website_slides/static/src/xml/website_slides_upload.xml index d57923c561b..7980d77880e 100644 --- a/addons/website_slides/static/src/xml/website_slides_upload.xml +++ b/addons/website_slides/static/src/xml/website_slides_upload.xml @@ -208,28 +208,6 @@ - - - -