You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.9 KiB
121 lines
4.9 KiB
/* Copyright 2016 Jairo Llopis <jairo.llopis@tecnativa.com>
|
|
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
|
|
|
|
/* TODO This JS module replaces core AJAX submission because it is impossible
|
|
* to extend it as it is currently designed. Most of this code has been
|
|
* upstreamed in https://github.com/odoo/odoo/pull/14386, so we should extend
|
|
* that when it gets merged, and remove most of this file. */
|
|
odoo.define("mass_mailing_custom_unsubscribe.unsubscribe", function (require) {
|
|
"use strict";
|
|
var core = require("web.core");
|
|
var ajax = require("web.ajax");
|
|
var animation = require("website.content.snippets.animation");
|
|
var _t = core._t;
|
|
|
|
animation.registry.mass_mailing_unsubscribe =
|
|
animation.Class.extend({
|
|
selector: "#unsubscribe_form",
|
|
start: function () {
|
|
this.controller = '/mail/mailing/unsubscribe';
|
|
this.$alert = this.$(".alert");
|
|
this.$email = this.$("input[name='email']");
|
|
this.$contacts = this.$("input[name='contact_ids']");
|
|
this.$mailing_id = this.$("input[name='mailing_id']");
|
|
this.$token = this.$("input[name='token']");
|
|
this.$res_id = this.$("input[name='res_id']");
|
|
this.$reasons = this.$(".js_unsubscription_reason");
|
|
this.$details = this.$reasons.find("[name='details']");
|
|
this.$el.on("submit", $.proxy(this.submit, this));
|
|
this.$contacts.on("change", $.proxy(this.toggle_reasons, this));
|
|
this.toggle_reasons();
|
|
},
|
|
|
|
// Helper to get list ids, to use in this.$contacts.map()
|
|
int_val: function (index, element) {
|
|
return parseInt($(element).val(), 10);
|
|
},
|
|
|
|
// Get a filtered array of integer IDs of matching lists
|
|
contact_ids: function (checked) {
|
|
var filter = checked ? ":checked" : ":not(:checked)";
|
|
return this.$contacts.filter(filter).map(this.int_val).get();
|
|
},
|
|
|
|
// Display reasons form only if there are unsubscriptions
|
|
toggle_reasons: function () {
|
|
// Find contacts that were checked and now are unchecked
|
|
var $disabled = this.$contacts.filter(function () {
|
|
var $this = $(this);
|
|
return !$this.prop("checked") && $this.attr("checked");
|
|
});
|
|
// Hide reasons form if you are only subscribing
|
|
this.$reasons.toggleClass("hidden", !$disabled.length);
|
|
var $radios = this.$reasons.find(":radio");
|
|
if (this.$reasons.is(":hidden")) {
|
|
// Uncheck chosen reason
|
|
$radios.prop("checked", false)
|
|
// Unrequire specifying a reason
|
|
.prop("required", false)
|
|
// Remove possible constraints for details
|
|
.trigger("change");
|
|
} else {
|
|
// Require specifying a reason
|
|
$radios.prop("required", true);
|
|
}
|
|
},
|
|
|
|
// Get values to send
|
|
values: function () {
|
|
var result = {
|
|
email: this.$email.val(),
|
|
mailing_id: parseInt(this.$mailing_id.val(), 10),
|
|
opt_in_ids: this.contact_ids(true),
|
|
opt_out_ids: this.contact_ids(false),
|
|
res_id: parseInt(this.$res_id.val(), 10),
|
|
token: this.$token.val(),
|
|
};
|
|
// Only send reason and details if an unsubscription was found
|
|
if (this.$reasons.is(":visible")) {
|
|
result.reason_id = parseInt(
|
|
this.$reasons.find("[name='reason_id']:checked").val(),
|
|
10
|
|
);
|
|
result.details = this.$details.val();
|
|
}
|
|
return result;
|
|
},
|
|
|
|
// Submit by ajax
|
|
submit: function (event) {
|
|
event.preventDefault();
|
|
return ajax.jsonRpc(this.controller, "call", this.values())
|
|
.done($.proxy(this.success, this))
|
|
.fail($.proxy(this.failure, this));
|
|
},
|
|
|
|
// When you successfully saved the new subscriptions status
|
|
success: function () {
|
|
this.$alert
|
|
.html(_t('Your changes have been saved.'))
|
|
.removeClass("alert-info alert-warning")
|
|
.addClass("alert-success");
|
|
|
|
// Store checked status, to enable further changes
|
|
this.$contacts.each(function () {
|
|
var $this = $(this);
|
|
$this.attr("checked", $this.prop("checked"));
|
|
});
|
|
this.toggle_reasons();
|
|
},
|
|
|
|
// When you fail to save the new subscriptions status
|
|
failure: function () {
|
|
this.$alert
|
|
.html(_t('Your changes have not been saved, try again later.'))
|
|
.removeClass("alert-info alert-success")
|
|
.addClass("alert-warning");
|
|
},
|
|
});
|
|
|
|
return animation.registry.mass_mailing_unsubscribe;
|
|
});
|