Unsubscription & choose to receive a mail onStart / onEnd
- The subscription panel is placed in the "mysettings" menu (not anymmore a popup) - A Unsubscribe button were added. It removes the email if found - The 2 options to receive a mail when someone is starting to edit and finished to edit can be chosen for each user (at least one of the two is compulsory) - First time you go on the email notification panel in the mysettings menu, a call is made to get the email and options already subscribed for this userId * If found, the form is pre-filled with the datas * If not, the form is set with defaults values It's just informative. Users can still subscribe another mail for this userId. - Removed the integration of this plugin in the "Share this pad" menu. First becaue, imo, it's not the place, and second, because it meant 2 forms with the same id.
This commit is contained in:
parent
34dfd008ff
commit
53c1df8248
7 changed files with 359 additions and 109 deletions
14
client.js
14
client.js
|
@ -1,11 +1,25 @@
|
||||||
var eejs = require("ep_etherpad-lite/node/eejs");
|
var eejs = require("ep_etherpad-lite/node/eejs");
|
||||||
|
var settings = require('ep_etherpad-lite/node/utils/Settings');
|
||||||
|
var checked_state = '';
|
||||||
|
|
||||||
exports.eejsBlock_scripts = function (hook_name, args, cb) {
|
exports.eejsBlock_scripts = function (hook_name, args, cb) {
|
||||||
args.content = args.content + eejs.require("ep_email_notifications/templates/scripts.html", {}, module);
|
args.content = args.content + eejs.require("ep_email_notifications/templates/scripts.html", {}, module);
|
||||||
return cb();
|
return cb();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
exports.eejsBlock_embedPopup = function (hook_name, args, cb) {
|
exports.eejsBlock_embedPopup = function (hook_name, args, cb) {
|
||||||
args.content = args.content + eejs.require("ep_email_notifications/templates/embedFrame.html", {}, module);
|
args.content = args.content + eejs.require("ep_email_notifications/templates/embedFrame.html", {}, module);
|
||||||
return cb();
|
return cb();
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.eejsBlock_mySettings = function (hook_name, args, cb) {
|
||||||
|
args.content = args.content + eejs.require('ep_email_notifications/templates/email_notifications_settings.ejs', {checked : checked_state});
|
||||||
|
return cb();
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.eejsBlock_styles = function (hook_name, args, cb) {
|
||||||
|
args.content = args.content + '<link href="../static/plugins/ep_email_notifications/static/css/email_notifications.css" rel="stylesheet">';
|
||||||
|
};
|
||||||
|
|
||||||
|
|
7
ep.json
7
ep.json
|
@ -6,11 +6,14 @@
|
||||||
"padUpdate": "ep_email_notifications/update",
|
"padUpdate": "ep_email_notifications/update",
|
||||||
"handleMessage": "ep_email_notifications/handleMessage",
|
"handleMessage": "ep_email_notifications/handleMessage",
|
||||||
"eejsBlock_scripts": "ep_email_notifications/client",
|
"eejsBlock_scripts": "ep_email_notifications/client",
|
||||||
"eejsBlock_embedPopup": "ep_email_notifications/client:eejsBlock_embedPopup"
|
"eejsBlock_mySettings": "ep_email_notifications/client:eejsBlock_mySettings",
|
||||||
|
"eejsBlock_styles": "ep_email_notifications/client:eejsBlock_styles"
|
||||||
},
|
},
|
||||||
"client_hooks": {
|
"client_hooks": {
|
||||||
"postAceInit":"ep_email_notifications/static/js/ep_email:postAceInit",
|
"postAceInit":"ep_email_notifications/static/js/ep_email:postAceInit",
|
||||||
"handleClientMessage_emailSubscriptionSuccess":"ep_email_notifications/static/js/ep_email"
|
"handleClientMessage_emailSubscriptionSuccess":"ep_email_notifications/static/js/ep_email",
|
||||||
|
"handleClientMessage_emailUnsubscriptionSuccess":"ep_email_notifications/static/js/ep_email",
|
||||||
|
"handleClientMessage_emailNotificationGetUserInfo":"ep_email_notifications/static/js/ep_email"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
198
handleMessage.js
198
handleMessage.js
|
@ -13,24 +13,135 @@ exports.handleMessage = function(hook_name, context, callback){
|
||||||
if (context.message.data.userInfo){
|
if (context.message.data.userInfo){
|
||||||
if(context.message.data.userInfo.email){ // it contains email
|
if(context.message.data.userInfo.email){ // it contains email
|
||||||
console.debug(context.message);
|
console.debug(context.message);
|
||||||
|
console.info("ep_mail: " + context.message.data.userInfo.email + " / " + context.message.data.userInfo.email_option);
|
||||||
|
console.info(context.message.data.userInfo);
|
||||||
|
|
||||||
// does email Subscription already exist for this email address?
|
// does email Subscription already exist for this email address?
|
||||||
db.get("emailSubscription:"+context.message.data.padId, function(err, userIds){
|
db.get("emailSubscription:"+context.message.data.padId, function(err, userIds){
|
||||||
|
|
||||||
var alreadyExists = false;
|
var alreadyExists = false;
|
||||||
|
console.info(userIds);
|
||||||
if(userIds){
|
if(userIds){
|
||||||
async.forEach(Object.keys(userIds), function(user, cb){
|
async.forEach(Object.keys(userIds), function(user, cb){
|
||||||
console.debug("UserIds subscribed by email to this pad:", userIds);
|
console.info("UserIds subscribed by email to this pad:", userIds);
|
||||||
if(user == context.message.data.userInfo.email){ // If we already have this email registered for this pad
|
if(user == context.message.data.userInfo.email){ // If we already have this email registered for this pad
|
||||||
|
|
||||||
// This user ID is already assigned to this padId so don't do anything except tell the user they are already subscribed somehow..
|
// This user ID is already assigned to this padId so don't do anything except tell the user they are already subscribed somehow..
|
||||||
alreadyExists = true;
|
alreadyExists = true;
|
||||||
console.debug("email ", user, "already subscribed to ", context.message.data.padId, " so sending message to client");
|
}
|
||||||
|
cb();
|
||||||
|
},
|
||||||
|
|
||||||
|
function(err){
|
||||||
|
// There should be something in here!
|
||||||
|
}); // end async for each
|
||||||
|
}
|
||||||
|
|
||||||
|
if(context.message.data.userInfo.email_option == 'subscribe' && alreadyExists == true){
|
||||||
|
// SUbscription
|
||||||
|
console.info("email ", context.message.data.userInfo.email, "already subscribed to ", context.message.data.padId, " so sending message to client");
|
||||||
|
|
||||||
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
|
data:{
|
||||||
|
type: "emailSubscriptionSuccess",
|
||||||
|
payload: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if(context.message.data.userInfo.email_option == 'subscribe' && alreadyExists == false){
|
||||||
|
// SUbscription
|
||||||
|
var validatesAsEmail = check(context.message.data.userInfo.email).isEmail();
|
||||||
|
if(!validatesAsEmail){ // send validation failed if it's malformed.. y'know in general fuck em!
|
||||||
|
console.warn("Dropped email subscription due to malformed email address");
|
||||||
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
|
data:{
|
||||||
|
type: "emailSubscriptionSuccess",
|
||||||
|
payload: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.info ("Subscription: Wrote to the database and sent client a positive response ",context.message.data.userInfo.email);
|
||||||
|
|
||||||
|
exports.setAuthorEmail(
|
||||||
|
context.message.data.userInfo.userId,
|
||||||
|
context.message.data.userInfo,
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.setAuthorEmailRegistered(
|
||||||
|
context.message.data.userInfo,
|
||||||
|
context.message.data.userInfo.userId,
|
||||||
|
context.message.data.padId
|
||||||
|
);
|
||||||
|
|
||||||
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
|
data:{
|
||||||
|
type: "emailSubscriptionSuccess",
|
||||||
|
payload: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if(context.message.data.userInfo.email_option == 'unsubscribe' && alreadyExists == true) {
|
||||||
|
// Unsubscription
|
||||||
|
console.info ("Unsubscription: Remove from the database and sent client a positive response ",context.message.data.userInfo.email);
|
||||||
|
|
||||||
|
exports.unsetAuthorEmail(
|
||||||
|
context.message.data.userInfo.userId,
|
||||||
|
context.message.data.userInfo,
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.unsetAuthorEmailRegistered(
|
||||||
|
context.message.data.userInfo,
|
||||||
|
context.message.data.userInfo.userId,
|
||||||
|
context.message.data.padId
|
||||||
|
);
|
||||||
|
|
||||||
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
|
data:{
|
||||||
|
type: "emailUnsubscriptionSuccess",
|
||||||
|
payload: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if(context.message.data.userInfo.email_option == 'unsubscribe' && alreadyExists == false) {
|
||||||
|
// Unsubscription
|
||||||
|
console.info ("Unsubscription: Send client a negative response ",context.message.data.userInfo.email);
|
||||||
|
|
||||||
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
|
data:{
|
||||||
|
type: "emailUnsubscriptionSuccess",
|
||||||
|
payload: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}); // close db get
|
||||||
|
|
||||||
|
callback([null]); // don't run onto passing colorId or anything else to the message handler
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (context.message.data.type == 'USERINFO_GET' ) { // A request to find datas for a username
|
||||||
|
if (context.message.data.userInfo){
|
||||||
|
if(context.message.data.userInfo.userId){ // it contains the userId
|
||||||
|
console.debug(context.message);
|
||||||
|
|
||||||
|
var userIdFound = false;
|
||||||
|
// does email Subscription already exist for this name and padID?
|
||||||
|
db.get("emailSubscription:"+context.message.data.padId, function(err, userIds){
|
||||||
|
if(userIds){
|
||||||
|
async.forEach(Object.keys(userIds), function(user, cb){
|
||||||
|
if(userIds[user].authorId == context.message.data.userInfo.userId){ // if we find the same Id in the Db as the one used by the user
|
||||||
|
console.info("Options for this pad ", userIds[user].authorId, " found in the Db");
|
||||||
|
userIdFound = true;
|
||||||
|
|
||||||
|
// We send back the options set for this user
|
||||||
context.client.json.send({ type: "COLLABROOM",
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
data:{
|
data:{
|
||||||
type: "emailSubscriptionSuccess",
|
type: "emailNotificationGetUserInfo",
|
||||||
payload: false
|
payload: {
|
||||||
|
email: user,
|
||||||
|
onStart: userIds[user].onStart && typeof userIds[user].onStart === 'boolean'?userIds[user].onStart:true,
|
||||||
|
onEnd: userIds[user].onEnd && typeof userIds[user].onEnd === 'boolean'?userIds[user].onEnd:false,
|
||||||
|
success:true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -41,41 +152,19 @@ exports.handleMessage = function(hook_name, context, callback){
|
||||||
// There should be something in here!
|
// There should be something in here!
|
||||||
}); // end async for each
|
}); // end async for each
|
||||||
}
|
}
|
||||||
var validatesAsEmail = check(context.message.data.userInfo.email).isEmail();
|
});
|
||||||
if(!validatesAsEmail){ // send validation failed if it's malformed.. y'know in general fuck em!
|
|
||||||
console.warn("Dropped email subscription due to malformed email address");
|
|
||||||
context.client.json.send({ type: "COLLABROOM",
|
|
||||||
data:{
|
|
||||||
type: "emailSubscriptionSuccess",
|
|
||||||
payload: false
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(alreadyExists == false && validatesAsEmail){
|
|
||||||
console.debug ("Wrote to the database and sent client a positive response ",context.message.data.userInfo.email);
|
|
||||||
|
|
||||||
exports.setAuthorEmail(
|
|
||||||
context.message.data.userInfo.userId,
|
|
||||||
context.message.data.userInfo.email, callback
|
|
||||||
);
|
|
||||||
|
|
||||||
exports.setAuthorEmailRegistered(
|
|
||||||
context.message.data.userInfo.email,
|
|
||||||
context.message.data.userInfo.userId,
|
|
||||||
context.message.data.padId
|
|
||||||
);
|
|
||||||
|
|
||||||
context.client.json.send({ type: "COLLABROOM",
|
|
||||||
data:{
|
|
||||||
type: "emailSubscriptionSuccess",
|
|
||||||
payload: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}); // close db get
|
|
||||||
|
|
||||||
callback([null]); // don't run onto passing colorId or anything else to the message handler
|
|
||||||
|
|
||||||
|
if (!userIdFound) {
|
||||||
|
// We send back the options set for this user
|
||||||
|
context.client.json.send({ type: "COLLABROOM",
|
||||||
|
data:{
|
||||||
|
type: "emailNotificationGetUserInfo",
|
||||||
|
payload: {
|
||||||
|
success:false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,25 +173,46 @@ exports.handleMessage = function(hook_name, context, callback){
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updates the database with the email record
|
// Updates the database with the email record
|
||||||
exports.setAuthorEmail = function (author, email, callback){
|
exports.setAuthorEmail = function (author, datas, callback){
|
||||||
db.setSub("globalAuthor:" + author, ["email"], email, callback);
|
db.setSub("globalAuthor:" + author, ["email"], datas.email, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write email and padId to the database
|
// Write email and padId to the database
|
||||||
exports.setAuthorEmailRegistered = function(email, authorId, padId){
|
exports.setAuthorEmailRegistered = function(datas, authorId, padId){
|
||||||
var timestamp = new Date().getTime();
|
var timestamp = new Date().getTime();
|
||||||
var registered = {
|
var registered = {
|
||||||
authorId: authorId,
|
authorId: authorId,
|
||||||
|
onStart: datas.email_onStart,
|
||||||
|
onEnd: datas.email_onEnd,
|
||||||
timestamp: timestamp
|
timestamp: timestamp
|
||||||
};
|
};
|
||||||
console.debug("registered", registered, " to ", padId);
|
console.debug("registered", registered, " to ", padId);
|
||||||
// Here we have to basically hack a new value into the database, this isn't clean or polite.
|
// Here we have to basically hack a new value into the database, this isn't clean or polite.
|
||||||
db.get("emailSubscription:" + padId, function(err, value){ // get the current value
|
db.get("emailSubscription:" + padId, function(err, value){ // get the current value
|
||||||
if(!value){value = {};} // if an emailSubscription doesnt exist yet for this padId don't panic
|
if(!value){value = {};} // if an emailSubscription doesnt exist yet for this padId don't panic
|
||||||
value[email] = registered; // add the registered values to the object
|
value[datas.email] = registered; // add the registered values to the object
|
||||||
console.warn("written to database");
|
console.warn("written to database");
|
||||||
db.set("emailSubscription:" + padId, value); // stick it in the database
|
db.set("emailSubscription:" + padId, value); // stick it in the database
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Updates the database by removing the email record for that AuthorId
|
||||||
|
exports.unsetAuthorEmail = function (author, datas, callback){
|
||||||
|
db.get("globalAuthor:" + author, function(err, value){ // get the current value
|
||||||
|
delete value['email'];
|
||||||
|
db.set("globalAuthor:" + author, value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove email and padId from the database
|
||||||
|
exports.unsetAuthorEmailRegistered = function(datas, authorId, padId){
|
||||||
|
console.debug("unregistered", datas.email, " to ", padId);
|
||||||
|
// Here we have to basically hack a new value into the database, this isn't clean or polite.
|
||||||
|
db.get("emailSubscription:" + padId, function(err, value){ // get the current value
|
||||||
|
delete value[datas.email]; // remove the registered values to the object
|
||||||
|
console.warn("written to database");
|
||||||
|
db.set("emailSubscription:" + padId, value); // stick it in the database
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
10
static/css/email_notifications.css
Normal file
10
static/css/email_notifications.css
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.ep_email_settings {
|
||||||
|
display: none;
|
||||||
|
padding-left: 1.5em;
|
||||||
|
padding: .2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ep_email_input {
|
||||||
|
padding:.2em;
|
||||||
|
width:177px;
|
||||||
|
}
|
|
@ -1,19 +1,44 @@
|
||||||
var cookie = require('ep_etherpad-lite/static/js/pad_cookie').padcookie;
|
var cookie = require('ep_etherpad-lite/static/js/pad_cookie').padcookie;
|
||||||
|
var firstRun = true;
|
||||||
|
|
||||||
if(typeof exports == 'undefined'){
|
if(typeof exports == 'undefined'){
|
||||||
var exports = this['mymodule'] = {};
|
var exports = this['mymodule'] = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.postAceInit = function(hook, context){
|
exports.postAceInit = function(hook, context){
|
||||||
// after 10 seconds if we dont already have an email for this author then prompt them
|
// Uncheck the checkbox
|
||||||
setTimeout(function(){init()},10000);
|
$('#options-emailNotifications').attr('checked', false);
|
||||||
|
setDefaultOptions();
|
||||||
|
|
||||||
|
/* on click */
|
||||||
|
$('#options-emailNotifications').on('click', function() {
|
||||||
|
if (firstRun) {
|
||||||
|
getDatasForUserId();
|
||||||
|
firstRun = false;
|
||||||
|
} else {
|
||||||
|
$('.ep_email_settings').slideToggle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prepare subscription before submit form
|
||||||
|
$('#ep_email_subscribe').on('click', function() {
|
||||||
|
$('#ep_email_option').val('subscribe');
|
||||||
|
checkAndSend();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prepare unsubscription before submit form
|
||||||
|
$('#ep_email_unsubscribe').on('click', function() {
|
||||||
|
$('#ep_email_option').val('unsubscribe');
|
||||||
|
checkAndSend();
|
||||||
|
});
|
||||||
|
|
||||||
// subscribe by email can be active..
|
// subscribe by email can be active..
|
||||||
$('.ep_email_form').submit(function(){
|
$('.ep_email_form').submit(function(){
|
||||||
sendEmailToServer();
|
sendEmailToServer();
|
||||||
|
$('.ep_email_settings').slideToggle();
|
||||||
|
$('#options-emailNotifications').attr('checked', false);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.handleClientMessage_emailSubscriptionSuccess = function(hook, context){ // was subscribing to the email a big win or fail?
|
exports.handleClientMessage_emailSubscriptionSuccess = function(hook, context){ // was subscribing to the email a big win or fail?
|
||||||
|
@ -24,21 +49,108 @@ exports.handleClientMessage_emailSubscriptionSuccess = function(hook, context){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function init(){
|
exports.handleClientMessage_emailUnsubscriptionSuccess = function(hook, context){ // was subscribing to the email a big win or fail?
|
||||||
var popUpIsAlreadyVisible = $('.ep_email_form').is(":visible");
|
if(context.payload == false){
|
||||||
if(!popUpIsAlreadyVisible){ // if the popup isn't already visible
|
showWasNotRegistered();
|
||||||
if(clientHasAlreadyRegistered()){ // if the client has already registered for emails on this pad.
|
}else{
|
||||||
// showAlreadyRegistered(); // client has already registered, let em know..
|
showUnregistrationSuccess();
|
||||||
}else{
|
|
||||||
var cookieVal = pad.getPadId() + "email";
|
|
||||||
if(cookie.getPref(cookieVal) !== "true"){ // if this user hasn't already subscribed
|
|
||||||
askClientToEnterEmail(); // ask the client to register TODO uncomment me for a pop up
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showRegistrationSuccess(){ // show a successful registration message
|
exports.handleClientMessage_emailNotificationGetUserInfo = function (hook, context) { // return the existing options for this userId
|
||||||
|
var datas = context.payload;
|
||||||
|
if(datas.success == true){ // If datas were found, set the options with them
|
||||||
|
if (datas.email) $('#ep_email').val(datas.email);
|
||||||
|
if (datas.onStart && typeof datas.onStart === 'boolean') $('#ep_email_onStart').attr('checked', datas.onStart);
|
||||||
|
if (datas.onEnd && typeof datas.onEnd === 'boolean') $('#ep_email_onEnd').attr('checked', datas.onEnd);
|
||||||
|
} else { // No datas were found, set the options to default values
|
||||||
|
setDefaultOptions();
|
||||||
|
}
|
||||||
|
|
||||||
|
$('.ep_email_settings').slideToggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the options in the frame to a default value
|
||||||
|
*/
|
||||||
|
function setDefaultOptions() {
|
||||||
|
$('#ep_email_onStart').attr('checked', true);
|
||||||
|
$('#ep_email_onEnd').attr('checked', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Control options before submitting the form
|
||||||
|
*/
|
||||||
|
function checkAndSend() {
|
||||||
|
var email = getEmail();
|
||||||
|
if (email && $('#ep_email_option').val() == 'subscribe' && !$('#ep_email_onStart').is(':checked') && !$('#ep_email_onEnd').is(':checked')) {
|
||||||
|
$.gritter.add({
|
||||||
|
// (string | mandatory) the heading of the notification
|
||||||
|
title: "Email subscription error",
|
||||||
|
// (string | mandatory) the text inside the notification
|
||||||
|
text: "You need to check at least one of the two options from 'Send a mail when someone..'"
|
||||||
|
});
|
||||||
|
} else if (email) {
|
||||||
|
$('.ep_email_form').submit();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the email from the user
|
||||||
|
*/
|
||||||
|
function getEmail() {
|
||||||
|
var email = $('#ep_email').val();
|
||||||
|
if(!email){ // if we're not using the top value use the notification value
|
||||||
|
email = $('#ep_email_notification').val();
|
||||||
|
}
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ask the server to register the email
|
||||||
|
*/
|
||||||
|
function sendEmailToServer(){
|
||||||
|
var email = getEmail();
|
||||||
|
var userId = pad.getUserId();
|
||||||
|
var message = {};
|
||||||
|
message.type = 'USERINFO_UPDATE';
|
||||||
|
message.userInfo = {};
|
||||||
|
message.padId = pad.getPadId();
|
||||||
|
message.userInfo.email = email;
|
||||||
|
message.userInfo.email_option = $('#ep_email_option').val();
|
||||||
|
message.userInfo.email_onStart = $('#ep_email_onStart').is(':checked');
|
||||||
|
message.userInfo.email_onEnd = $('#ep_email_onEnd').is(':checked');
|
||||||
|
message.userInfo.userId = userId;
|
||||||
|
if(email){
|
||||||
|
pad.collabClient.sendMessage(message);
|
||||||
|
cookie.setPref(message.padId+"email", "true");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thanks to the userId, we can get back from the Db the options set for this user
|
||||||
|
* and fill the fields with them
|
||||||
|
*/
|
||||||
|
function getDatasForUserId() {
|
||||||
|
var userId = pad.getUserId();
|
||||||
|
var message = {};
|
||||||
|
message.type = 'USERINFO_GET';
|
||||||
|
message.padId = pad.getPadId();
|
||||||
|
message.userInfo = {};
|
||||||
|
message.userInfo.userId = userId;
|
||||||
|
|
||||||
|
pad.collabClient.sendMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************
|
||||||
|
Manage return msgs from server
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show a successful registration message
|
||||||
|
*/
|
||||||
|
function showRegistrationSuccess(){
|
||||||
$.gritter.add({
|
$.gritter.add({
|
||||||
// (string | mandatory) the heading of the notification
|
// (string | mandatory) the heading of the notification
|
||||||
title: "Email subscribed",
|
title: "Email subscribed",
|
||||||
|
@ -47,7 +159,10 @@ function showRegistrationSuccess(){ // show a successful registration message
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showAlreadyRegistered(){ // the client already registered for emails on this pad so notify the UI
|
/**
|
||||||
|
* The client already registered for emails on this pad so notify the UI
|
||||||
|
*/
|
||||||
|
function showAlreadyRegistered(){
|
||||||
$.gritter.add({
|
$.gritter.add({
|
||||||
// (string | mandatory) the heading of the notification
|
// (string | mandatory) the heading of the notification
|
||||||
title: "Email subscription",
|
title: "Email subscription",
|
||||||
|
@ -59,54 +174,29 @@ function showAlreadyRegistered(){ // the client already registered for emails on
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function clientHasAlreadyRegistered(){ // Has the client already registered for emails on this?
|
/**
|
||||||
// Given a specific AuthorID do we have an email address in the database?
|
* Show a successful unregistration message
|
||||||
// Given that email address is it registered to this pad?
|
*/
|
||||||
// need to pass the server a message to check
|
function showUnregistrationSuccess(){
|
||||||
var userId = pad.getUserId();
|
|
||||||
var message = {};
|
|
||||||
message.type = 'USERINFO_AUTHOR_EMAIL_IS_REGISTERED_TO_PAD';
|
|
||||||
message.userInfo = {};
|
|
||||||
message.userInfo.userId = userId;
|
|
||||||
pad.collabClient.sendMessage(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
function askClientToEnterEmail(){
|
|
||||||
$.gritter.add({
|
$.gritter.add({
|
||||||
// (string | mandatory) the heading of the notification
|
// (string | mandatory) the heading of the notification
|
||||||
title: "Enter your email to receive an email when someone modifies this pad",
|
title: "Email unsubscribed",
|
||||||
// (string | mandatory) the text inside the notification
|
// (string | mandatory) the text inside the notification
|
||||||
text: "<form class='ep_email_form'><label for='ep_email'><input id='ep_email_notification' placeholder='your@email.com' style='padding:5px;width:180px;' type=email><input type=submit value=subscribe style='padding:5px;'></form>",
|
text: "You won't receive anymore email when someone changes this pad."
|
||||||
// (bool | optional) if you want it to fade out on its own or just sit there
|
|
||||||
sticky: true,
|
|
||||||
// (int | optional) the time you want it to be alive for before fading out
|
|
||||||
time: '2000',
|
|
||||||
// the function to bind to the form
|
|
||||||
after_open: function(e){
|
|
||||||
$('.ep_email_form').submit(function(){
|
|
||||||
$(e).hide();
|
|
||||||
sendEmailToServer();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendEmailToServer(){
|
/**
|
||||||
var email = $('#ep_email').val();
|
* The client wasn't registered for emails
|
||||||
if(!email){ // if we're not using the top value use the notification value
|
*/
|
||||||
email = $('#ep_email_notification').val();
|
function showWasNotRegistered(){
|
||||||
}
|
$.gritter.add({
|
||||||
var userId = pad.getUserId();
|
// (string | mandatory) the heading of the notification
|
||||||
var message = {};
|
title: "Email unsubscription",
|
||||||
message.type = 'USERINFO_UPDATE';
|
// (string | mandatory) the text inside the notification
|
||||||
message.userInfo = {};
|
text: "This email address is not registered for this pad",
|
||||||
message.padId = pad.getPadId();
|
// (bool | optional) if you want it to fade out on its own or just sit there
|
||||||
message.userInfo.email = email;
|
sticky: false
|
||||||
message.userInfo.userId = userId;
|
});
|
||||||
if(email){
|
|
||||||
pad.collabClient.sendMessage(message);
|
|
||||||
cookie.setPref(message.padId+"email", "true");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
20
templates/email_notifications_settings.ejs
Normal file
20
templates/email_notifications_settings.ejs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<p>
|
||||||
|
<input type="checkbox" id="options-emailNotifications"></input>
|
||||||
|
<label for="options-emailNotifications">Email Notifications</label>
|
||||||
|
<div class="ep_email_settings">
|
||||||
|
<form class='ep_email_form'>
|
||||||
|
<input id='ep_email' class='ep_email_input' placeholder='your@email.com' type=email>
|
||||||
|
<label>Send a mail when someone..</label>
|
||||||
|
<br />
|
||||||
|
<input type="checkbox" style="margin-left:0.3em;" id="ep_email_onStart"></input>
|
||||||
|
<label for="ep_email_onStart">starts editing the pad</label>
|
||||||
|
<br />
|
||||||
|
<input type="checkbox" style="margin-left:0.3em;" id="ep_email_onEnd"></input>
|
||||||
|
<label for="ep_email_onEnd">finish editing the pad</label>
|
||||||
|
<input id='ep_email_option'type=hidden >
|
||||||
|
</form>
|
||||||
|
<br />
|
||||||
|
<input style="padding:5px;" id='ep_email_subscribe' type=button value=subscribe>
|
||||||
|
<input style="padding:5px;" id='ep_email_unsubscribe'type=button value=unsubscribe>
|
||||||
|
</div>
|
||||||
|
</p>
|
|
@ -45,10 +45,11 @@ exports.notifyBegin = function(padId){
|
||||||
async.forEach(Object.keys(recipients), function(recipient, cb){
|
async.forEach(Object.keys(recipients), function(recipient, cb){
|
||||||
// Is this recipient already on the pad?
|
// Is this recipient already on the pad?
|
||||||
exports.isUserEditingPad(padId, recipients[recipient].authorId, function(err,userIsOnPad){ // is the user already on the pad?
|
exports.isUserEditingPad(padId, recipients[recipient].authorId, function(err,userIsOnPad){ // is the user already on the pad?
|
||||||
if(!userIsOnPad){
|
var onStart = typeof(recipients[recipient].onStart) == "undefined" || recipients[recipient].onStart?true:false; // In case onStart wasn't defined we set it to true
|
||||||
|
if(!userIsOnPad && onStart){
|
||||||
console.debug("Emailing "+recipient +" about a new begin update");
|
console.debug("Emailing "+recipient +" about a new begin update");
|
||||||
server.send({
|
server.send({
|
||||||
text: "Your pad at "+urlToPads+padId +" is being edited, we're just emailing you let you know :)\n\n -- This plugin is in alpha state, can you help fund it's development? https://github.com/johnmclear/ep_email_notifications",
|
text: "Your pad at "+urlToPads+padId +" is being edited, we're just emailing you let you know :)",
|
||||||
from: fromName+ "<"+fromEmail+">",
|
from: fromName+ "<"+fromEmail+">",
|
||||||
to: recipient,
|
to: recipient,
|
||||||
subject: "Someone started editing "+padId
|
subject: "Someone started editing "+padId
|
||||||
|
@ -76,7 +77,9 @@ exports.notifyEnd = function(padId){
|
||||||
async.forEach(Object.keys(recipients), function(recipient, cb){
|
async.forEach(Object.keys(recipients), function(recipient, cb){
|
||||||
// Is this recipient already on the pad?
|
// Is this recipient already on the pad?
|
||||||
exports.isUserEditingPad(padId, recipients[recipient].authorId, function(err,userIsOnPad){ // is the user already on the$
|
exports.isUserEditingPad(padId, recipients[recipient].authorId, function(err,userIsOnPad){ // is the user already on the$
|
||||||
if(!userIsOnPad){
|
var onEnd = typeof(recipients[recipient].onEnd) == "undefined" || recipients[recipient].onEnd?true:false; // In case onEnd wasn't defined we set it to true
|
||||||
|
|
||||||
|
if(!userIsOnPad && onEnd){
|
||||||
console.debug("Emailing "+recipient +" about a pad finished being updated");
|
console.debug("Emailing "+recipient +" about a pad finished being updated");
|
||||||
server.send({
|
server.send({
|
||||||
text: "Your pad at "+urlToPads+padId +" has finished being edited, we're just emailing you let you know :) \n\n The changes look like this: \n" + changesToPad,
|
text: "Your pad at "+urlToPads+padId +" has finished being edited, we're just emailing you let you know :) \n\n The changes look like this: \n" + changesToPad,
|
||||||
|
|
Loading…
Reference in a new issue