summaryrefslogtreecommitdiff
path: root/addons/website_slides/static/src
diff options
context:
space:
mode:
authorPatrick Hoste <pko@odoo.com>2019-12-04 09:10:35 +0000
committerThibault Delavallée <tde@odoo.com>2020-06-08 10:43:53 +0000
commit786374399ef970e4499a73cef9b48a48be88704e (patch)
tree5890af2524a6a1dda9ce1ccbba68c530fb81a240 /addons/website_slides/static/src
parentad8c53ac2c5bc25ea94d5cddf8d1aa48efad5928 (diff)
[IMP] website_slides: add possibility to request access to private course
PURPOSE Before this commit, a user could not contact a course responsible to ask him to join. With this commit he is be able to do it. SPECIFICATIONS Change the message 'Contact website administrator' to 'Contact Responsible'. Add the name of the course responsible in the course description panel. When clicking on its name it opens a modal to request access to the course. It creates an activity linked to the customer and assigned to the responsible. When hovering the 'You're enrolled' button the fa-check icon changes to a fa-times icon to show that you can unsubscribe when clicking. LINKS Task ID : 2127364 PR : #40708
Diffstat (limited to 'addons/website_slides/static/src')
-rw-r--r--addons/website_slides/static/src/js/activity.js47
-rw-r--r--addons/website_slides/static/src/js/slides_course_enroll_email.js83
-rw-r--r--addons/website_slides/static/src/js/slides_course_quiz.js23
-rw-r--r--addons/website_slides/static/src/scss/website_slides.scss31
-rw-r--r--addons/website_slides/static/src/xml/activity.xml22
-rw-r--r--addons/website_slides/static/src/xml/slide_course_join.xml6
-rw-r--r--addons/website_slides/static/src/xml/slide_quiz.xml19
7 files changed, 228 insertions, 3 deletions
diff --git a/addons/website_slides/static/src/js/activity.js b/addons/website_slides/static/src/js/activity.js
new file mode 100644
index 00000000000..bc207acbd06
--- /dev/null
+++ b/addons/website_slides/static/src/js/activity.js
@@ -0,0 +1,47 @@
+odoo.define('website_slides.Activity', function (require) {
+"use strict";
+
+var field_registry = require('web.field_registry');
+
+require('mail.Activity');
+
+var KanbanActivity = field_registry.get('kanban_activity');
+var MailActivity = field_registry.get('mail_activity');
+
+function applyInclude(Activity) {
+ Activity.include({
+ events: _.extend({}, Activity.prototype.events, {
+ 'click .o_activity_action_grant_access': '_onGrantAccess',
+ 'click .o_activity_action_refuse_access': '_onRefuseAccess',
+ }),
+
+ _onGrantAccess: function (event) {
+ var self = this;
+ var partnerId = $(event.currentTarget).data('partner-id');
+ this._rpc({
+ model: 'slide.channel',
+ method: 'action_grant_access',
+ args: [this.res_id, partnerId],
+ }).then(function (result) {
+ self.trigger_up('reload');
+ });
+ },
+
+ _onRefuseAccess: function (event) {
+ var self = this;
+ var partnerId = $(event.currentTarget).data('partner-id');
+ this._rpc({
+ model: 'slide.channel',
+ method: 'action_refuse_access',
+ args: [this.res_id, partnerId],
+ }).then(function () {
+ self.trigger_up('reload');
+ });
+ },
+ });
+}
+
+applyInclude(KanbanActivity);
+applyInclude(MailActivity);
+
+}); \ No newline at end of file
diff --git a/addons/website_slides/static/src/js/slides_course_enroll_email.js b/addons/website_slides/static/src/js/slides_course_enroll_email.js
new file mode 100644
index 00000000000..a9f5f799a79
--- /dev/null
+++ b/addons/website_slides/static/src/js/slides_course_enroll_email.js
@@ -0,0 +1,83 @@
+odoo.define('website_slides.course.enroll', function (require) {
+'use strict';
+
+var core = require('web.core');
+var Dialog = require('web.Dialog');
+var publicWidget = require('web.public.widget');
+var _t = core._t;
+
+var SlideEnrollDialog = Dialog.extend({
+ template: 'slide.course.join.request',
+
+ init: function (parent, options, modalOptions) {
+ modalOptions = _.defaults(modalOptions || {}, {
+ title: _t('Request Access.'),
+ size: 'medium',
+ buttons: [{
+ text: _t('Yes'),
+ classes: 'btn-primary',
+ click: this._onSendRequest.bind(this)
+ }, {
+ text: _t('Cancel'),
+ close: true
+ }]
+ });
+ this.$element = options.$element;
+ this.channelId = options.channelId;
+ this._super(parent, modalOptions);
+ },
+
+ _onSendRequest: function () {
+ var self = this;
+ this._rpc({
+ model: 'slide.channel',
+ method: 'action_request_access',
+ args: [self.channelId]
+ }).then(function (result) {
+ if (result.error) {
+ self.$element.replaceWith('<div class="alert alert-danger" role="alert"><strong>' + result.error + '</strong></div>');
+ } else if (result.done) {
+ self.$element.replaceWith('<div class="alert alert-success" role="alert"><strong>' + _t('Request sent !') + '</strong></div>');
+ } else {
+ self.$element.replaceWith('<div class="alert alert-danger" role="alert"><strong>' + _t('Unknown error, try again.') + '</strong></div>');
+ }
+ self.close();
+ });
+ }
+
+});
+
+publicWidget.registry.websiteSlidesEnroll = publicWidget.Widget.extend({
+ selector: '.o_wslides_js_channel_enroll',
+ xmlDependencies: ['/website_slides/static/src/xml/slide_course_join.xml'],
+ events: {
+ 'click': '_onSendRequestClick',
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ _openDialog: function (channelId) {
+ new SlideEnrollDialog(this, {
+ channelId: channelId,
+ $element: this.$el
+ }).open();
+ },
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ _onSendRequestClick: function (ev) {
+ ev.preventDefault();
+ this._openDialog($(ev.currentTarget).data('channelId'));
+ }
+});
+
+return {
+ slideEnrollDialog: SlideEnrollDialog,
+ websiteSlidesEnroll: publicWidget.registry.websiteSlidesEnroll
+};
+
+});
diff --git a/addons/website_slides/static/src/js/slides_course_quiz.js b/addons/website_slides/static/src/js/slides_course_quiz.js
index 50ac2a3cef1..d07e68f2344 100644
--- a/addons/website_slides/static/src/js/slides_course_quiz.js
+++ b/addons/website_slides/static/src/js/slides_course_quiz.js
@@ -10,6 +10,8 @@ odoo.define('website_slides.quiz', function (require) {
var QuestionFormWidget = require('website_slides.quiz.question.form');
var SlideQuizFinishModal = require('website_slides.quiz.finish');
+ var SlideEnrollDialog = require('website_slides.course.enroll').slideEnrollDialog;
+
var QWeb = core.qweb;
var _t = core._t;
@@ -26,7 +28,10 @@ odoo.define('website_slides.quiz', function (require) {
*/
var Quiz = publicWidget.Widget.extend({
template: 'slide.slide.quiz',
- xmlDependencies: ['/website_slides/static/src/xml/slide_quiz.xml'],
+ xmlDependencies: [
+ '/website_slides/static/src/xml/slide_quiz.xml',
+ '/website_slides/static/src/xml/slide_course_join.xml'
+ ],
events: {
"click .o_wslides_quiz_answer": '_onAnswerClick',
"click .o_wslides_js_lesson_quiz_submit": '_submitQuiz',
@@ -36,6 +41,7 @@ odoo.define('website_slides.quiz', function (require) {
'click .o_wslides_js_quiz_add': '_onCreateQuizClick',
'click .o_wslides_js_quiz_edit_question': '_onEditQuestionClick',
'click .o_wslides_js_quiz_delete_question': '_onDeleteQuestionClick',
+ 'click .o_wslides_js_channel_enroll': '_onSendRequestToResponsibleClick',
},
custom_events: {
@@ -532,6 +538,20 @@ odoo.define('website_slides.quiz', function (require) {
},
/**
+ * Handler for the contact responsible link below a Quiz
+ * @param ev
+ * @private
+ */
+ _onSendRequestToResponsibleClick: function(ev) {
+ ev.preventDefault();
+ var channelId = $(ev.currentTarget).data('channelId');
+ new SlideEnrollDialog(this, {
+ channelId: channelId,
+ $element: $(ev.currentTarget).closest('.alert.alert-info')
+ }).open();
+ },
+
+ /**
* Displays the created Question at the correct place (after the last question or
* at the first place if there is no questions yet) It also displays the 'Add Question'
* button or open a new QuestionFormWidget if the user wants to immediately add another one.
@@ -718,6 +738,7 @@ odoo.define('website_slides.quiz', function (require) {
return {
channelId: slideData.channelId,
channelEnroll: slideData.channelEnroll,
+ channelRequestedAccess: slideData.channelRequestedAccess || false,
signupAllowed: slideData.signupAllowed
};
},
diff --git a/addons/website_slides/static/src/scss/website_slides.scss b/addons/website_slides/static/src/scss/website_slides.scss
index 815ae9aa050..1f4175d1e99 100644
--- a/addons/website_slides/static/src/scss/website_slides.scss
+++ b/addons/website_slides/static/src/scss/website_slides.scss
@@ -237,6 +237,37 @@ $o-wslides-fs-side-width: 300px;
@include media-breakpoint-up(md) {
border-top-width: 0;
}
+
+ .o_wslides_js_channel_unsubscribe {
+ > .fa-times {
+ display: none;
+ }
+
+ &:hover {
+ > .fa-check {
+ display: none;
+ }
+
+ > .fa-times {
+ display: inline-block;
+ }
+ }
+ }
+
+ .o_wslides_js_channel_enroll {
+ cursor: pointer;
+
+ &:hover, &:hover .o_wslides_enroll_msg small {
+ font-weight: bold;
+ }
+ }
+
+ .o_wslides_enroll_msg {
+ p {
+ display: inline-block;
+ margin-bottom: 0px;
+ }
+ }
}
@mixin o-wslides-tabs($tab-active-color: $o-wslides-color-bg) {
diff --git a/addons/website_slides/static/src/xml/activity.xml b/addons/website_slides/static/src/xml/activity.xml
new file mode 100644
index 00000000000..20c683ab3c4
--- /dev/null
+++ b/addons/website_slides/static/src/xml/activity.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<templates xml:space="preserve">
+ <t t-extend="mail.activity_items">
+ <t t-jquery=".o_thread_message .o_thread_message_core .o_thread_message_tools" t-operation="replace">
+ <t t-if="activity.activity_type_id[1] == 'Access Request'">
+ <t t-if="activity.user_id[0] === uid">
+ <a role="button" class="btn btn-link btn-success text-muted text-success o_activity_link o_activity_action_grant_access" t-att-data-partner-id="activity.request_partner_id[0]">
+ <i class="fa fa-check"/> Grant Access
+ </a>
+ <a role="button" class="btn btn-link btn-danger text-muted text-danger o_activity_link o_activity_action_refuse_access" t-att-data-partner-id="activity.request_partner_id[0]">
+ <i class="fa fa-times"/> Refuse Access
+ </a>
+ </t>
+ </t>
+ <t t-else="">
+ <div class="o_thread_message_tools btn-group">
+ <t t-call="mail.activity_thread_message_tools"/>
+ </div>
+ </t>
+ </t>
+ </t>
+</templates> \ No newline at end of file
diff --git a/addons/website_slides/static/src/xml/slide_course_join.xml b/addons/website_slides/static/src/xml/slide_course_join.xml
index 5c890cd027d..0241915c190 100644
--- a/addons/website_slides/static/src/xml/slide_course_join.xml
+++ b/addons/website_slides/static/src/xml/slide_course_join.xml
@@ -15,4 +15,10 @@
</a>
</div>
</t>
+
+ <t t-name="slide.course.join.request">
+ <div>
+ <p>Do you want to request access to this course ?</p>
+ </div>
+ </t>
</templates>
diff --git a/addons/website_slides/static/src/xml/slide_quiz.xml b/addons/website_slides/static/src/xml/slide_quiz.xml
index e64bc96604e..aa7bcc3f835 100644
--- a/addons/website_slides/static/src/xml/slide_quiz.xml
+++ b/addons/website_slides/static/src/xml/slide_quiz.xml
@@ -47,8 +47,23 @@
<div t-if="!widget.isMember">
<div class="o_wslides_join_course alert alert-info d-flex align-items-center justify-content-between">
<div t-if="widget.channel.channelEnroll == 'invite'">
- <b class="h5 mb-0">
- <b>This course is private. <a href="/contactus" class="font-weight-bold">Contact the website administrator</a> to enroll.</b>
+ <b>This course is private.
+ <span t-if="widget.publicUser">
+ Please
+ <a t-att-href="'/web/login?redirect=' + widget.redirectURL" class="font-weight-bold">
+ sign in
+ </a>
+ to enroll.
+ </span>
+ <a t-else="" href="#" class="font-weight-bold o_wslides_js_channel_enroll"
+ t-att-data-channel-id="widget.channel.channelId">
+ <span t-if="widget.channel.channelRequestedAccess" class="text-success">
+ Responsible already contacted.
+ </span>
+ <span t-else="">
+ Contact the responsible to enroll.
+ </span>
+ </a>
</b>
<span class="my-0 h4">
<span title="Succeed and gain karma" aria-label="Succeed and gain karma" class="badge badge-pill badge-warning text-white font-weight-bold ml-3 px-2 py-1">