Odoo18-Base/addons/website_slides/static/src/js/slides_course_unsubscribe.js
2025-03-10 11:12:23 +07:00

164 lines
5.4 KiB
JavaScript

/** @odoo-module **/
import core from 'web.core';
import Dialog from 'web.Dialog';
import publicWidget from 'web.public.widget';
var QWeb = core.qweb;
var _t = core._t;
var SlideUnsubscribeDialog = Dialog.extend({
template: 'slides.course.unsubscribe.modal',
_texts: {
titleSubscribe: _t("Subscribe"),
titleUnsubscribe: _t("Notifications"),
titleLeaveCourse: _t("Leave the course")
},
/**
* @override
* @param {Object} parent
* @param {Object} options
*/
init: function (parent, options) {
options = _.defaults(options || {}, {
title: options.isFollower === 'True' ? this._texts.titleSubscribe : this._texts.titleUnsubscribe,
size: 'medium',
});
this._super(parent, options);
this.set('state', '_subscription');
this.on('change:state', this, this._onChangeType);
this.channelID = parseInt(options.channelId, 10);
this.isFollower = options.isFollower === 'True';
this.enroll = options.enroll;
},
/**
* @override
*/
start: function () {
var self = this;
return this._super.apply(this, arguments).then(function () {
self.$('input#subscribed').prop('checked', self.isFollower);
self._resetModal();
});
},
getSubscriptionState: function () {
return this.$('input#subscribed').prop('checked');
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
_getModalButtons: function () {
var btnList = [];
var state = this.get('state');
if (state === '_subscription') {
btnList.push({text: _t("Save"), classes: "btn-primary", click: this._onClickSubscriptionSubmit.bind(this)});
btnList.push({text: _t("Discard"), close: true});
btnList.push({text: _t("or Leave the course"), classes: "btn-danger ms-auto", click: this._onClickLeaveCourse.bind(this)});
} else if (state === '_leave') {
btnList.push({text: _t("Leave the course"), classes: "btn-danger", click: this._onClickLeaveCourseSubmit.bind(this)});
btnList.push({text: _t("Discard"), click: this._onClickLeaveCourseCancel.bind(this)});
}
return btnList;
},
/**
* @private
*/
_resetModal: function () {
var state = this.get('state');
if (state === '_subscription') {
this.set_title(this.isFollower ? this._texts.titleUnsubscribe : this._texts.titleSubscribe);
this.$('input#subscribed').prop('checked', this.isFollower);
}
else if (state === '_leave') {
this.set_title(this._texts.titleLeaveCourse);
}
this.set_buttons(this._getModalButtons());
},
//--------------------------------------------------------------------------
// Handler
//--------------------------------------------------------------------------
_onClickLeaveCourse: function () {
this.set('state', '_leave');
},
_onClickLeaveCourseCancel: function () {
this.set('state', '_subscription');
},
_onClickLeaveCourseSubmit: function () {
this._rpc({
route: '/slides/channel/leave',
params: {channel_id: this.channelID},
}).then(function () {
window.location.reload();
});
},
_onClickSubscriptionSubmit: function () {
if (this.isFollower === this.getSubscriptionState()) {
this.destroy();
return;
}
this._rpc({
route: this.getSubscriptionState() ? '/slides/channel/subscribe' : '/slides/channel/unsubscribe',
params: {channel_id: this.channelID},
}).then(function () {
window.location.reload();
});
},
_onChangeType: function () {
var currentType = this.get('state');
var tmpl;
if (currentType === '_subscription') {
tmpl = 'slides.course.unsubscribe.modal.subscription';
} else if (currentType === '_leave') {
tmpl = 'slides.course.unsubscribe.modal.leave';
}
this.$('.o_w_slide_unsubscribe_modal_container').empty();
this.$('.o_w_slide_unsubscribe_modal_container').append(QWeb.render(tmpl, {widget: this}));
this._resetModal();
},
});
publicWidget.registry.websiteSlidesUnsubscribe = publicWidget.Widget.extend({
selector: '.o_wslides_js_channel_unsubscribe',
events: {
'click': '_onUnsubscribeClick',
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
_openDialog: function ($element) {
var data = $element.data();
return new SlideUnsubscribeDialog(this, data).open();
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {Event} ev
*/
_onUnsubscribeClick: function (ev) {
ev.preventDefault();
this._openDialog($(ev.currentTarget));
},
});
export default {
SlideUnsubscribeDialog: SlideUnsubscribeDialog,
websiteSlidesUnsubscribe: publicWidget.registry.websiteSlidesUnsubscribe
};