Merge branch 'master' of https://github.com/TelescopeJS/Telescope into telescope-master-seo2

This commit is contained in:
Charlie DeTar 2014-12-14 18:12:40 -07:00
commit 53bb789c15
16 changed files with 158 additions and 77 deletions

View file

@ -1,3 +1,8 @@
* Added new `userCreatedCallbacks` callback hook.
* Added new `debug` setting.
* `siteUrl` setting now affects `Meteor.absoluteUrl()`.
* Added new `clog` function that only logs if `debug` setting is true.
## v0.10.0 “RefactorScope” ## v0.10.0 “RefactorScope”
* Renaming Errors to Messages (thanks @yourcelf!). * Renaming Errors to Messages (thanks @yourcelf!).

View file

@ -15,6 +15,4 @@ Template[getTemplate('post_page')].helpers({
Template[getTemplate('post_page')].rendered = function(){ Template[getTemplate('post_page')].rendered = function(){
$('body').scrollTop(0); $('body').scrollTop(0);
if(this.data) // XXX
document.title = $(".post-title").text();
}; };

View file

@ -0,0 +1,5 @@
<template name="sign_out">
<div class="grid-small grid-block dialog">
<p>{{_ "you_ve_been_signed_out"}}</p>
</div>
</template>

View file

@ -294,6 +294,15 @@ settingsSchemaObject = {
private: true private: true
} }
}, },
debug: {
type: Boolean,
optional: true,
label: 'Debug Mode',
autoform: {
group: 'debug',
instructions: 'Enable debug mode for more details console logs'
}
}
}; };
// add any extra properties to settingsSchemaObject (provided by packages for example) // add any extra properties to settingsSchemaObject (provided by packages for example)
@ -329,3 +338,9 @@ if (Meteor.isClient){
} }
}); });
} }
Meteor.startup(function () {
// override Meteor.absoluteUrl() with URL provided in settings
Meteor.absoluteUrl.defaultOptions.rootUrl = getSetting('siteUrl', Meteor.absoluteUrl());
debug = getSetting('debug', false);
});

View file

@ -51,6 +51,7 @@
"extraCode": "Extra Code", "extraCode": "Extra Code",
"emailFooter": "Email Footer", "emailFooter": "Email Footer",
"notes": "Notes", "notes": "Notes",
"debug": "Debug Mode",
// Settings Fieldsets // Settings Fieldsets
"general": "General", "general": "General",
@ -253,6 +254,7 @@
"posted_time": "Posted Time", "posted_time": "Posted Time",
"profile": "Profile", "profile": "Profile",
"sign_out": "Sign Out", "sign_out": "Sign Out",
"you_ve_been_signed_out": "You've been signed out. Come back soon!",
"invitedcount": "InvitedCount", "invitedcount": "InvitedCount",
"invites": "Invites", "invites": "Invites",
"invited": "Invited?", "invited": "Invited?",

4
lib/debug.js Normal file
View file

@ -0,0 +1,4 @@
clog = function (s) {
if(getSetting('debug', false))
console.log(s);
}

View file

@ -44,10 +44,11 @@ Meteor.startup(function () {
Router.route('/sign-out', { Router.route('/sign-out', {
name: 'signOut', name: 'signOut',
template: getTemplate('sign_out'),
onBeforeAction: function() { onBeforeAction: function() {
Meteor.logout(function() { Meteor.logout(function() {
return Router.go('/');
}); });
this.next();
} }
}); });

View file

@ -6,10 +6,6 @@ isAdmin=function(user){
user = (typeof user === 'undefined') ? Meteor.user() : user; user = (typeof user === 'undefined') ? Meteor.user() : user;
return !!user && !!user.isAdmin; return !!user && !!user.isAdmin;
}; };
setAdmin = function(user, admin){
user = (typeof user === 'undefined') ? Meteor.user() : user;
user.isAdmin = !!admin;
};
updateAdmin = function(userId, admin) { updateAdmin = function(userId, admin) {
Meteor.users.update(userId, {$set: {isAdmin: admin}}); Meteor.users.update(userId, {$set: {isAdmin: admin}});
}; };

View file

@ -243,6 +243,11 @@ commentEditClientCallbacks = [];
commentEditMethodCallbacks = []; // not used yet commentEditMethodCallbacks = []; // not used yet
commentAfterEditMethodCallbacks = []; // not used yet commentAfterEditMethodCallbacks = []; // not used yet
userEditRenderedCallbacks = [];
userEditClientCallbacks = [];
userCreatedCallbacks = [];
userProfileCompleteChecks = [];
// ------------------------------------- User Profiles -------------------------------- // // ------------------------------------- User Profiles -------------------------------- //
userProfileDisplay = [ userProfileDisplay = [
@ -275,14 +280,11 @@ userProfileEdit = [
} }
] ]
userEditRenderedCallbacks = []; userProfileCompleteChecks.push(
userEditClientCallbacks = [];
userProfileCompleteChecks = [
function(user) { function(user) {
return !!getEmail(user) && !!getUserName(user); return !!getEmail(user) && !!getUserName(user);
} }
]; );
// ------------------------------ Dynamic Templates ------------------------------ // // ------------------------------ Dynamic Templates ------------------------------ //

View file

@ -57,6 +57,7 @@ Package.onUse(function (api) {
'userProfileCompleteChecks', 'userProfileCompleteChecks',
'userProfileDisplay', 'userProfileDisplay',
'userProfileEdit', 'userProfileEdit',
'userCreatedCallbacks',
'getTemplate', 'getTemplate',
'templates', 'templates',

View file

@ -93,3 +93,20 @@ Meteor.methods({
} }
} }
}) })
function adminUserCreationNotification (user) {
// send notifications to admins
var admins = adminUsers();
admins.forEach(function(admin){
if(getUserSetting('notifications.users', false, admin)){
var emailProperties = {
profileUrl: getProfileUrl(user),
username: getUserName(user)
};
var html = getEmailTemplate('emailNewUser')(emailProperties);
sendEmail(getEmail(admin), 'New user account: '+getUserName(user), buildEmailTemplate(html));
}
});
return user;
}
userCreatedCallbacks.push(adminUserCreationNotification);

View file

@ -32,3 +32,33 @@ userProfileEdit.push({
template: 'userInvites', template: 'userInvites',
order: 2 order: 2
}); });
function setStartingInvites (user) {
// give new users a few invites (default to 3)
user.inviteCount = getSetting('startInvitesCount', 3);
return user;
}
userCreatedCallbacks.push(setStartingInvites);
function checkIfInvited (user) {
// if the new user has been invited
// set her status accordingly and update invitation info
if(invitesEnabled() && getEmail(user)){
var invite = Invites.findOne({ invitedUserEmail : getEmail(user) });
if(invite){
var invitedBy = Meteor.users.findOne({ _id : invite.invitingUserId });
user = _.extend(user, {
isInvited: true,
invitedBy: invitedBy._id,
invitedByName: getDisplayName(invitedBy)
});
Invites.update(invite._id, {$set : {
accepted : true
}});
}
}
return user;
}
userCreatedCallbacks.push(checkIfInvited);

View file

@ -134,6 +134,19 @@ var newsletterFrequency = {
} }
addToSettingsSchema.push(newsletterFrequency); addToSettingsSchema.push(newsletterFrequency);
var autoSubscribe = {
propertyName: 'autoSubscribe',
propertySchema: {
type: Boolean,
optional: true,
autoform: {
group: 'newsletter',
instructions: 'Automatically subscribe new users on sign-up.'
}
}
}
addToSettingsSchema.push(autoSubscribe);
// create new "campaign" lens for all posts from the past X days that haven't been scheduled yet // create new "campaign" lens for all posts from the past X days that haven't been scheduled yet
viewParameters.campaign = function (terms) { viewParameters.campaign = function (terms) {
return { return {
@ -150,3 +163,14 @@ viewParameters.campaign = function (terms) {
heroModules.push({ heroModules.push({
template: 'newsletterBanner' template: 'newsletterBanner'
}); });
function subscribeUserOnCreation (user) {
if (!!getSetting('autoSubscribe') && !!getEmail(user)) {
addToMailChimpList(user, false, function (error, result) {
console.log(error)
console.log(result)
});
}
return user;
}
userCreatedCallbacks.push(subscribeUserOnCreation);

View file

@ -78,12 +78,15 @@ scheduleCampaign = function (campaign, isTest) {
} }
addToMailChimpList = function(userOrEmail, confirm, done){ addToMailChimpList = function(userOrEmail, confirm, done){
var user, email; var user, email;
if(typeof userOrEmail == "string"){ var confirm = (typeof confirm === 'undefined') ? false : confirm // default to no confirmation
if (typeof userOrEmail == "string") {
user = null; user = null;
email = userOrEmail; email = userOrEmail;
}else if(typeof userOrEmail == "object"){ } else if (typeof userOrEmail == "object") {
user = userOrEmail; user = userOrEmail;
email = getEmail(user); email = getEmail(user);
if (!email) if (!email)
@ -100,16 +103,16 @@ addToMailChimpList = function(userOrEmail, confirm, done){
try { try {
var api = new MailChimp(); var api = new MailChimp();
} catch ( error ) { } catch (error) {
console.log( error.message ); console.log( error.message );
} }
api.call( 'lists', 'subscribe', { api.call('lists', 'subscribe', {
id: MailChimpOptions.listId, id: MailChimpOptions.listId,
email: {"email": email}, email: {"email": email},
double_optin: confirm double_optin: confirm
}, Meteor.bindEnvironment(function ( error, result ) { }, Meteor.bindEnvironment(function ( error, result ) {
if ( error ) { if (error) {
console.log( error.message ); console.log( error.message );
done(error, null); done(error, null);
} else { } else {

View file

@ -64,3 +64,16 @@ var emailNotifications = {
} }
} }
addToSettingsSchema.push(emailNotifications); addToSettingsSchema.push(emailNotifications);
function setNotificationDefaults (user) {
// set notifications default preferences
user.profile.notifications = {
users: false,
posts: false,
comments: true,
replies: true
};
return user;
}
userCreatedCallbacks.push(setNotificationDefaults);

View file

@ -1,4 +1,7 @@
Accounts.onCreateUser(function(options, user){ Accounts.onCreateUser(function(options, user){
// ------------------------------ Properties ------------------------------ //
var userProperties = { var userProperties = {
profile: options.profile || {}, profile: options.profile || {},
karma: 0, karma: 0,
@ -15,78 +18,40 @@ Accounts.onCreateUser(function(options, user){
}; };
user = _.extend(user, userProperties); user = _.extend(user, userProperties);
// set email on profile
if (options.email) if (options.email)
user.profile.email = options.email; user.profile.email = options.email;
// if email is set, use it to generate email hash
if (getEmail(user)) if (getEmail(user))
user.email_hash = getEmailHash(user); user.email_hash = getEmailHash(user);
// set username on profile
if (!user.profile.name) if (!user.profile.name)
user.profile.name = user.username; user.profile.name = user.username;
// set notifications default preferences
user.profile.notifications = {
users: false,
posts: false,
comments: true,
replies: true
};
// create slug from username // create slug from username
user.slug = slugify(getUserName(user)); user.slug = slugify(getUserName(user));
// if this is the first user ever, make them an admin // if this is the first user ever, make them an admin
if (!Meteor.users.find().count() ) { user.isAdmin = Meteor.users.find().count() === 0 ? true : false;
setAdmin(user, true);
} else {
setAdmin(user, false);
}
// give new users a few invites (default to 3) // ------------------------------ Callbacks ------------------------------ //
user.inviteCount = getSetting('startInvitesCount', 3);
// run all post submit client callbacks on properties object successively
clog('// Start userCreatedCallbacks')
user = userCreatedCallbacks.reduce(function(result, currentFunction) {
clog('// Running '+currentFunction.name+'…')
return currentFunction(result);
}, user);
clog('// Finished userCreatedCallbacks')
clog('// User object:')
clog(user)
// ------------------------------ Analytics ------------------------------ //
trackEvent('new user', {username: user.username, email: user.profile.email}); trackEvent('new user', {username: user.username, email: user.profile.email});
// if user has already filled in their email, add them to MailChimp list
// if(user.profile.email)
// addToMailChimpList(user, false, function(error, result){
// if(error){
// console.log(error)
// }
// });
// if the new user has been invited
// set her status accordingly and update invitation info
if(invitesEnabled() && user.profile.email){
var invite = Invites.findOne({ invitedUserEmail : user.profile.email });
if(invite){
var invitedBy = Meteor.users.findOne({ _id : invite.invitingUserId });
user = _.extend(user, {
isInvited: true,
invitedBy: invitedBy._id,
invitedByName: getDisplayName(invitedBy)
});
Invites.update(invite._id, {$set : {
accepted : true
}});
}
}
// send notifications to admins
var admins = adminUsers();
admins.forEach(function(admin){
if(getUserSetting('notifications.users', false, admin)){
var emailProperties = {
profileUrl: getProfileUrl(user),
username: getUserName(user)
};
var html = getEmailTemplate('emailNewUser')(emailProperties);
sendEmail(getEmail(admin), 'New user account: '+getUserName(user), buildEmailTemplate(html));
}
});
return user; return user;
}); });