summaryrefslogtreecommitdiffstats
path: root/packages/meteor-useraccounts-core/lib/templates_helpers
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meteor-useraccounts-core/lib/templates_helpers')
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js26
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js83
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js124
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js7
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js16
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js5
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js331
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js18
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js24
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js19
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js24
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js7
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js5
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js24
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js24
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js105
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js33
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js7
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html12
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js15
20 files changed, 909 insertions, 0 deletions
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js
new file mode 100644
index 00000000..5673dfe7
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js
@@ -0,0 +1,26 @@
+AT.prototype.atErrorHelpers = {
+ singleError: function() {
+ var errors = AccountsTemplates.state.form.get("error");
+ return errors && errors.length === 1;
+ },
+ error: function() {
+ return AccountsTemplates.state.form.get("error");
+ },
+ errorText: function(){
+ var field, err;
+ if (this.field){
+ field = T9n.get(this.field, markIfMissing=false);
+ err = T9n.get(this.err, markIfMissing=false);
+ }
+ else
+ err = T9n.get(this.valueOf(), markIfMissing=false);
+
+ // Possibly removes initial prefix in case the key in not found inside t9n
+ if (err.substring(0, 15) === "error.accounts.")
+ err = err.substring(15);
+
+ if (field)
+ return field + ": " + err;
+ return err;
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js
new file mode 100644
index 00000000..95a34c0c
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js
@@ -0,0 +1,83 @@
+AT.prototype.atFormHelpers = {
+ hide: function(){
+ var state = this.state || AccountsTemplates.getState();
+ return state === "hide";
+ },
+ showTitle: function(next_state){
+ var state = next_state || this.state || AccountsTemplates.getState();
+ if (Meteor.userId() && state === "signIn")
+ return false;
+ return !!AccountsTemplates.texts.title[state];
+ },
+ showOauthServices: function(next_state){
+ var state = next_state || this.state || AccountsTemplates.getState();
+ if (!(state === "signIn" || state === "signUp"))
+ return false;
+ var services = AccountsTemplates.oauthServices();
+ if (!services.length)
+ return false;
+ if (Meteor.userId())
+ return AccountsTemplates.options.showAddRemoveServices;
+ return true;
+ },
+ showServicesSeparator: function(next_state){
+ var pwdService = Package["accounts-password"] !== undefined;
+ var state = next_state || this.state || AccountsTemplates.getState();
+ var rightState = (state === "signIn" || state === "signUp");
+ return rightState && !Meteor.userId() && pwdService && AccountsTemplates.oauthServices().length;
+ },
+ showError: function(next_state) {
+ return !!AccountsTemplates.state.form.get("error");
+ },
+ showResult: function(next_state) {
+ return !!AccountsTemplates.state.form.get("result");
+ },
+ showMessage: function(next_state) {
+ return !!AccountsTemplates.state.form.get("message");
+ },
+ showPwdForm: function(next_state) {
+ if (Package["accounts-password"] === undefined)
+ return false;
+ var state = next_state || this.state || AccountsTemplates.getState();
+ if ((state === "verifyEmail") || (state === "signIn" && Meteor.userId()))
+ return false;
+ return true;
+ },
+ showSignInLink: function(next_state){
+ if (AccountsTemplates.options.hideSignInLink)
+ return false;
+ var state = next_state || this.state || AccountsTemplates.getState();
+ if (AccountsTemplates.options.forbidClientAccountCreation && state === "forgotPwd")
+ return true;
+ return state === "signUp";
+ },
+ showSignUpLink: function(next_state){
+ if (AccountsTemplates.options.hideSignUpLink)
+ return false;
+ var state = next_state || this.state || AccountsTemplates.getState();
+ return ((state === "signIn" && !Meteor.userId()) || state === "forgotPwd") && !AccountsTemplates.options.forbidClientAccountCreation;
+ },
+ showTermsLink: function(next_state){
+ //TODO: Add privacyRoute and termsRoute as alternatives (the point of named routes is
+ // being able to change the url in one place only)
+ if (!!AccountsTemplates.options.privacyUrl || !!AccountsTemplates.options.termsUrl) {
+ var state = next_state || this.state || AccountsTemplates.getState();
+ if (state === "signUp" || state === "enrollAccount" ) {
+ return true;
+ }
+ }
+ /*
+ if (state === "signIn"){
+ var pwdService = Package["accounts-password"] !== undefined;
+ if (!pwdService)
+ return true;
+ }
+ */
+ return false;
+ },
+ showResendVerificationEmailLink: function(){
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return (state === "signIn" || state === "forgotPwd") && AccountsTemplates.options.showResendVerificationEmailLink;
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js
new file mode 100644
index 00000000..fe74eeb1
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js
@@ -0,0 +1,124 @@
+AT.prototype.atInputRendered = [function(){
+ var fieldId = this.data._id;
+
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+
+ if (AccountsTemplates.options.focusFirstInput) {
+ var firstVisibleInput = _.find(AccountsTemplates.getFields(), function(f){
+ return _.contains(f.visible, state);
+ });
+
+ if (firstVisibleInput && firstVisibleInput._id === fieldId) {
+ this.$("input#at-field-" + fieldId).focus();
+ }
+ }
+}];
+
+AT.prototype.atInputHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ showLabels: function() {
+ return AccountsTemplates.options.showLabels;
+ },
+ displayName: function() {
+ var parentData = Template.parentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ var displayName = this.getDisplayName(state);
+ return T9n.get(displayName, markIfMissing=false);
+ },
+ optionalText: function(){
+ return "(" + T9n.get(AccountsTemplates.texts.optionalField, markIfMissing=false) + ")";
+ },
+ templateName: function() {
+ if (this.template)
+ return this.template;
+ if (this.type === "checkbox")
+ return "atCheckboxInput";
+ if (this.type === "select")
+ return "atSelectInput";
+ if (this.type === "radio")
+ return "atRadioInput";
+ if (this.type === "hidden")
+ return "atHiddenInput";
+ return "atTextInput";
+ },
+ values: function(){
+ var id = this._id;
+ return _.map(this.select, function(select){
+ var s = _.clone(select);
+ s._id = id + "-" + select.value;
+ s.id = id;
+ return s;
+ });
+ },
+ errorText: function() {
+ var err = this.getStatus();
+ return T9n.get(err, markIfMissing=false);
+ },
+ placeholder: function() {
+ if (AccountsTemplates.options.showPlaceholders) {
+ var parentData = Template.parentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ var placeholder = this.getPlaceholder(state);
+ return T9n.get(placeholder, markIfMissing=false);
+ }
+ },
+};
+
+AT.prototype.atInputEvents = {
+ "focusin input": function(event, t){
+ var field = Template.currentData();
+ field.clearStatus();
+ },
+ "focusout input, change select": function(event, t){
+ var field = Template.currentData();
+ var fieldId = field._id;
+ var rawValue = field.getValue(t);
+ var value = field.fixValue(rawValue);
+ // Possibly updates the input value
+ if (value !== rawValue) {
+ field.setValue(t, value);
+ }
+
+ // Client-side only validation
+ if (!field.validation)
+ return;
+ var parentData = Template.parentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ // No validation during signIn
+ if (state === "signIn")
+ return;
+ // Special case for password confirmation
+ if (value && fieldId === "password_again"){
+ if (value !== $("#at-field-password").val())
+ return field.setError(AccountsTemplates.texts.errors.pwdMismatch);
+ }
+ field.validate(value);
+ },
+ "keyup input": function(event, t){
+ var field = Template.currentData();
+ // Client-side only continuous validation
+ if (!field.continuousValidation)
+ return;
+ var parentData = Template.parentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ // No validation during signIn
+ if (state === "signIn")
+ return;
+ var fieldId = field._id;
+ var rawValue = field.getValue(t);
+ var value = field.fixValue(rawValue);
+ // Possibly updates the input value
+ if (value !== rawValue) {
+ field.setValue(t, value);
+ }
+ // Special case for password confirmation
+ if (value && fieldId === "password_again"){
+ if (value !== $("#at-field-password").val())
+ return field.setError(AccountsTemplates.texts.errors.pwdMismatch);
+ }
+ field.validate(value);
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js
new file mode 100644
index 00000000..baa9ca04
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js
@@ -0,0 +1,7 @@
+AT.prototype.atMessageHelpers = {
+ message: function() {
+ var messageText = AccountsTemplates.state.form.get("message");
+ if (messageText)
+ return T9n.get(messageText, markIfMissing=false);
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js
new file mode 100644
index 00000000..c434060d
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js
@@ -0,0 +1,16 @@
+AT.prototype.atNavButtonHelpers = {
+ text: function(){
+ var key = Meteor.userId() ? AccountsTemplates.texts.navSignOut : AccountsTemplates.texts.navSignIn;
+ return T9n.get(key, markIfMissing=false);
+ }
+};
+
+AT.prototype.atNavButtonEvents = {
+ 'click #at-nav-button': function(event){
+ event.preventDefault();
+ if (Meteor.userId())
+ AccountsTemplates.logout();
+ else
+ AccountsTemplates.linkClick("signIn");
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js
new file mode 100644
index 00000000..1b1d13c1
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js
@@ -0,0 +1,5 @@
+AT.prototype.atOauthHelpers = {
+ oauthService: function() {
+ return AccountsTemplates.oauthServices();
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js
new file mode 100644
index 00000000..2f8d53c4
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js
@@ -0,0 +1,331 @@
+AT.prototype.atPwdFormHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ fields: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return _.filter(AccountsTemplates.getFields(), function(s) {
+ return _.contains(s.visible, state);
+ });
+ },
+ showForgotPasswordLink: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return state === "signIn" && AccountsTemplates.options.showForgotPasswordLink;
+ },
+ showReCaptcha: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return state === "signUp" && AccountsTemplates.options.showReCaptcha;
+ },
+};
+
+
+var toLowercaseUsername = function(value){
+ return value.toLowerCase().replace(/\s+/gm, '');
+};
+
+AT.prototype.atPwdFormEvents = {
+ // Form submit
+ "submit #at-pwd-form": function(event, t) {
+ event.preventDefault();
+ t.$("#at-btn").blur();
+
+ AccountsTemplates.setDisabled(true);
+
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ var preValidation = (state !== "signIn");
+
+ // Client-side pre-validation
+ // Validates fields values
+ // NOTE: This is the only place where password validation can be enforced!
+ var formData = {};
+ var someError = false;
+ var errList = [];
+ _.each(AccountsTemplates.getFields(), function(field){
+ // Considers only visible fields...
+ if (!_.contains(field.visible, state))
+ return;
+
+ var fieldId = field._id;
+
+ var rawValue = field.getValue(t);
+ var value = field.fixValue(rawValue);
+ // Possibly updates the input value
+ if (value !== rawValue) {
+ field.setValue(t, value);
+ }
+ if (value !== undefined && value !== "") {
+ formData[fieldId] = value;
+ }
+
+ // Validates the field value only if current state is not "signIn"
+ if (preValidation && field.getStatus() !== false){
+ var validationErr = field.validate(value, "strict");
+ if (validationErr) {
+ if (field.negativeValidation)
+ field.setError(validationErr);
+ else{
+ var fId = T9n.get(field.getDisplayName(), markIfMissing=false);
+ //errList.push(fId + ": " + err);
+ errList.push({
+ field: field.getDisplayName(),
+ err: validationErr
+ });
+ }
+ someError = true;
+ }
+ else
+ field.setSuccess();
+ }
+ });
+
+ // Clears error and result
+ AccountsTemplates.clearError();
+ AccountsTemplates.clearResult();
+ AccountsTemplates.clearMessage();
+ // Possibly sets errors
+ if (someError){
+ if (errList.length)
+ AccountsTemplates.state.form.set("error", errList);
+ AccountsTemplates.setDisabled(false);
+ //reset reCaptcha form
+ if (state === "signUp" && AccountsTemplates.options.showReCaptcha) {
+ grecaptcha.reset();
+ }
+ return;
+ }
+
+ // Extracts username, email, and pwds
+ var current_password = formData.current_password;
+ var email = formData.email;
+ var password = formData.password;
+ var password_again = formData.password_again;
+ var username = formData.username;
+ var username_and_email = formData.username_and_email;
+ // Clears profile data removing username, email, and pwd
+ delete formData.current_password;
+ delete formData.email;
+ delete formData.password;
+ delete formData.password_again;
+ delete formData.username;
+ delete formData.username_and_email;
+
+ if (AccountsTemplates.options.confirmPassword){
+ // Checks passwords for correct match
+ if (password_again && password !== password_again){
+ var pwd_again = AccountsTemplates.getField("password_again");
+ if (pwd_again.negativeValidation)
+ pwd_again.setError(AccountsTemplates.texts.errors.pwdMismatch);
+ else
+ AccountsTemplates.state.form.set("error", [{
+ field: pwd_again.getDisplayName(),
+ err: AccountsTemplates.texts.errors.pwdMismatch
+ }]);
+ AccountsTemplates.setDisabled(false);
+ //reset reCaptcha form
+ if (state === "signUp" && AccountsTemplates.options.showReCaptcha) {
+ grecaptcha.reset();
+ }
+ return;
+ }
+ }
+
+ // -------
+ // Sign In
+ // -------
+ if (state === "signIn") {
+ var pwdOk = !!password;
+ var userOk = true;
+ var loginSelector;
+ if (email) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ email = toLowercaseUsername(email);
+ }
+
+ loginSelector = {email: email};
+ }
+ else if (username) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username = toLowercaseUsername(username);
+ }
+ loginSelector = {username: username};
+ }
+ else if (username_and_email) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username_and_email = toLowercaseUsername(username_and_email);
+ }
+ loginSelector = username_and_email;
+ }
+ else
+ userOk = false;
+
+ // Possibly exits if not both 'password' and 'username' are non-empty...
+ if (!pwdOk || !userOk){
+ AccountsTemplates.state.form.set("error", [AccountsTemplates.texts.errors.loginForbidden]);
+ AccountsTemplates.setDisabled(false);
+ return;
+ }
+
+
+ return Meteor.loginWithPassword(loginSelector, password, function(error) {
+ AccountsTemplates.submitCallback(error, state);
+ });
+ }
+
+ // -------
+ // Sign Up
+ // -------
+ if (state === "signUp") {
+ // Possibly gets reCaptcha response
+ if (AccountsTemplates.options.showReCaptcha) {
+ var response = grecaptcha.getResponse();
+ if (response === "") {
+ // recaptcha verification has not completed yet (or has expired)...
+ // ...simply ignore submit event!
+ AccountsTemplates.setDisabled(false);
+ return;
+ } else {
+ formData.reCaptchaResponse = response;
+ }
+ }
+
+ var hash = Accounts._hashPassword(password);
+ var options = {
+ username: username,
+ email: email,
+ password: hash,
+ profile: formData,
+ };
+
+ // Call preSignUpHook, if any...
+ var preSignUpHook = AccountsTemplates.options.preSignUpHook;
+ if (preSignUpHook) {
+ preSignUpHook(password, options);
+ }
+
+ return Meteor.call("ATCreateUserServer", options, function(error){
+ if (error && error.reason === 'Email already exists.') {
+ if (AccountsTemplates.options.showReCaptcha) {
+ grecaptcha.reset();
+ }
+ }
+ AccountsTemplates.submitCallback(error, undefined, function(){
+ if (AccountsTemplates.options.sendVerificationEmail && AccountsTemplates.options.enforceEmailVerification){
+ AccountsTemplates.submitCallback(error, state, function () {
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.signUpVerifyEmail);
+ // Cleans up input fields' content
+ _.each(AccountsTemplates.getFields(), function(field){
+ // Considers only visible fields...
+ if (!_.contains(field.visible, state))
+ return;
+
+ var elem = t.$("#at-field-" + field._id);
+
+ // Naïve reset
+ if (field.type === "checkbox") elem.prop('checked', false);
+ else elem.val("");
+
+ });
+ AccountsTemplates.setDisabled(false);
+ AccountsTemplates.avoidRedirect = true;
+ });
+ }
+ else {
+ var loginSelector;
+
+ if (email) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ email = toLowercaseUsername(email);
+ }
+
+ loginSelector = {email: email};
+ }
+ else if (username) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username = toLowercaseUsername(username);
+ }
+ loginSelector = {username: username};
+ }
+ else {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username_and_email = toLowercaseUsername(username_and_email);
+ }
+ loginSelector = username_and_email;
+ }
+
+ Meteor.loginWithPassword(loginSelector, password, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.setState("signIn");
+ });
+ });
+ }
+ });
+ });
+ }
+
+ //----------------
+ // Forgot Password
+ //----------------
+ if (state === "forgotPwd"){
+ return Accounts.forgotPassword({
+ email: email
+ }, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.emailSent);
+ t.$("#at-field-email").val("");
+ });
+ });
+ }
+
+ //--------------------------------
+ // Reset Password / Enroll Account
+ //--------------------------------
+ if (state === "resetPwd" || state === "enrollAccount") {
+ var paramToken = AccountsTemplates.getparamToken();
+ return Accounts.resetPassword(paramToken, password, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ var pwd_field_id;
+ if (state === "resetPwd")
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdReset);
+ else // Enroll Account
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdSet);
+ t.$("#at-field-password").val("");
+ if (AccountsTemplates.options.confirmPassword)
+ t.$("#at-field-password_again").val("");
+ });
+ });
+ }
+
+ //----------------
+ // Change Password
+ //----------------
+ if (state === "changePwd"){
+ return Accounts.changePassword(current_password, password, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdChanged);
+ t.$("#at-field-current_password").val("");
+ t.$("#at-field-password").val("");
+ if (AccountsTemplates.options.confirmPassword)
+ t.$("#at-field-password_again").val("");
+ });
+ });
+ }
+
+ //----------------
+ // Resend Verification E-mail
+ //----------------
+ if (state === "resendVerificationEmail"){
+ return Meteor.call("ATResendVerificationEmail", email, function (error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.verificationEmailSent);
+ t.$("#at-field-email").val("");
+
+ AccountsTemplates.avoidRedirect = true;
+ });
+ });
+ }
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js
new file mode 100644
index 00000000..fc263623
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js
@@ -0,0 +1,18 @@
+AT.prototype.atPwdFormBtnHelpers = {
+ submitDisabled: function(){
+ var disable = _.chain(AccountsTemplates.getFields())
+ .map(function(field){
+ return field.hasError() || field.isValidating();
+ })
+ .some()
+ .value()
+ ;
+ if (disable)
+ return "disabled";
+ },
+ buttonText: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return T9n.get(AccountsTemplates.texts.button[state], markIfMissing=false);
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js
new file mode 100644
index 00000000..dd93a398
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js
@@ -0,0 +1,24 @@
+AT.prototype.atPwdLinkHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ forgotPwdLink: function(){
+ return AccountsTemplates.getRoutePath("forgotPwd");
+ },
+ preText: function(){
+ return T9n.get(AccountsTemplates.texts.pwdLink_pre, markIfMissing=false);
+ },
+ linkText: function(){
+ return T9n.get(AccountsTemplates.texts.pwdLink_link, markIfMissing=false);
+ },
+ suffText: function(){
+ return T9n.get(AccountsTemplates.texts.pwdLink_suff, markIfMissing=false);
+ },
+};
+
+AT.prototype.atPwdLinkEvents = {
+ "click #at-forgotPwd": function(event, t) {
+ event.preventDefault();
+ AccountsTemplates.linkClick("forgotPwd");
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js
new file mode 100644
index 00000000..ea0c0c69
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js
@@ -0,0 +1,19 @@
+AT.prototype.atReCaptchaRendered = function() {
+ $.getScript('//www.google.com/recaptcha/api.js?hl=' + T9n.getLanguage());
+};
+
+AT.prototype.atReCaptchaHelpers = {
+ key: function() {
+ if (AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.siteKey)
+ return AccountsTemplates.options.reCaptcha.siteKey;
+ return Meteor.settings.public.reCaptcha.siteKey;
+ },
+
+ theme: function() {
+ return AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.theme;
+ },
+
+ data_type: function() {
+ return AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.data_type;
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js
new file mode 100644
index 00000000..5587900c
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js
@@ -0,0 +1,24 @@
+AT.prototype.atResendVerificationEmailLinkHelpers = {
+ disabled: function () {
+ return AccountsTemplates.disabled();
+ },
+ resendVerificationEmailLink: function () {
+ return AccountsTemplates.getRoutePath("resendVerificationEmail");
+ },
+ preText: function(){
+ return T9n.get(AccountsTemplates.texts.resendVerificationEmailLink_pre, markIfMissing=false);
+ },
+ linkText: function(){
+ return T9n.get(AccountsTemplates.texts.resendVerificationEmailLink_link, markIfMissing=false);
+ },
+ suffText: function(){
+ return T9n.get(AccountsTemplates.texts.resendVerificationEmailLink_suff, markIfMissing=false);
+ },
+};
+
+AT.prototype.atResendVerificationEmailLinkEvents = {
+ "click #at-resend-verification-email": function(event, t) {
+ event.preventDefault();
+ AccountsTemplates.linkClick('resendVerificationEmail');
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js
new file mode 100644
index 00000000..d4b287dd
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js
@@ -0,0 +1,7 @@
+AT.prototype.atResultHelpers = {
+ result: function() {
+ var resultText = AccountsTemplates.state.form.get("result");
+ if (resultText)
+ return T9n.get(resultText, markIfMissing=false);
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js
new file mode 100644
index 00000000..7c27557d
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js
@@ -0,0 +1,5 @@
+AT.prototype.atSepHelpers = {
+ sepText: function(){
+ return T9n.get(AccountsTemplates.texts.sep, markIfMissing=false);
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js
new file mode 100644
index 00000000..14f6e88c
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js
@@ -0,0 +1,24 @@
+AT.prototype.atSigninLinkHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ signInLink: function(){
+ return AccountsTemplates.getRoutePath("signIn");
+ },
+ preText: function(){
+ return T9n.get(AccountsTemplates.texts.signInLink_pre, markIfMissing=false);
+ },
+ linkText: function(){
+ return T9n.get(AccountsTemplates.texts.signInLink_link, markIfMissing=false);
+ },
+ suffText: function(){
+ return T9n.get(AccountsTemplates.texts.signInLink_suff, markIfMissing=false);
+ },
+};
+
+AT.prototype.atSigninLinkEvents = {
+ "click #at-signIn": function(event, t) {
+ event.preventDefault();
+ AccountsTemplates.linkClick("signIn");
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js
new file mode 100644
index 00000000..29c809a4
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js
@@ -0,0 +1,24 @@
+AT.prototype.atSignupLinkHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ signUpLink: function(){
+ return AccountsTemplates.getRoutePath("signUp");
+ },
+ preText: function(){
+ return T9n.get(AccountsTemplates.texts.signUpLink_pre, markIfMissing=false);
+ },
+ linkText: function(){
+ return T9n.get(AccountsTemplates.texts.signUpLink_link, markIfMissing=false);
+ },
+ suffText: function(){
+ return T9n.get(AccountsTemplates.texts.signUpLink_suff, markIfMissing=false);
+ },
+};
+
+AT.prototype.atSignupLinkEvents = {
+ "click #at-signUp": function(event, t) {
+ event.preventDefault();
+ AccountsTemplates.linkClick('signUp');
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js
new file mode 100644
index 00000000..912fd6e9
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js
@@ -0,0 +1,105 @@
+AT.prototype.atSocialHelpers = {
+ disabled: function() {
+ if (AccountsTemplates.disabled())
+ return "disabled";
+ var user = Meteor.user();
+ if (user){
+ var numServices = 0;
+ if (user.services)
+ numServices = _.keys(user.services).length; // including "resume"
+ if (numServices === 2 && user.services[this._id])
+ return "disabled";
+ }
+ },
+ name: function(){
+ return this._id;
+ },
+ iconClass: function() {
+ var ic = AccountsTemplates.texts.socialIcons[this._id];
+ if (!ic)
+ ic = "fa fa-" + this._id;
+ return ic;
+ },
+ buttonText: function() {
+ var service = this;
+ var serviceName = this._id;
+ if (serviceName === "meteor-developer")
+ serviceName = "meteor";
+ serviceName = capitalize(serviceName);
+ if (!service.configured)
+ return T9n.get(AccountsTemplates.texts.socialConfigure, markIfMissing=false) + " " + serviceName;
+ var showAddRemove = AccountsTemplates.options.showAddRemoveServices;
+ var user = Meteor.user();
+ if (user && showAddRemove){
+ if (user.services && user.services[this._id]){
+ var numServices = _.keys(user.services).length; // including "resume"
+ if (numServices === 2)
+ return serviceName;
+ else
+ return T9n.get(AccountsTemplates.texts.socialRemove, markIfMissing=false) + " " + serviceName;
+ } else
+ return T9n.get(AccountsTemplates.texts.socialAdd, markIfMissing=false) + " " + serviceName;
+ }
+ var parentData = Template.parentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ var prefix = state === "signIn" ?
+ T9n.get(AccountsTemplates.texts.socialSignIn, markIfMissing=false) :
+ T9n.get(AccountsTemplates.texts.socialSignUp, markIfMissing=false);
+ return prefix + " " + T9n.get(AccountsTemplates.texts.socialWith, markIfMissing=false) + " " + serviceName;
+ },
+};
+
+AT.prototype.atSocialEvents = {
+ "click button": function(event, t) {
+ event.preventDefault();
+ event.currentTarget.blur();
+ if (AccountsTemplates.disabled())
+ return;
+ var user = Meteor.user();
+ if (user && user.services && user.services[this._id]){
+ var numServices = _.keys(user.services).length; // including "resume"
+ if (numServices === 2)
+ return;
+ else{
+ AccountsTemplates.setDisabled(true);
+ Meteor.call("ATRemoveService", this._id, function(error){
+ AccountsTemplates.setDisabled(false);
+ });
+ }
+ } else {
+ AccountsTemplates.setDisabled(true);
+ var parentData = Template.parentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ var serviceName = this._id;
+ var methodName;
+ if (serviceName === 'meteor-developer')
+ methodName = "loginWithMeteorDeveloperAccount";
+ else
+ methodName = "loginWith" + capitalize(serviceName);
+ var loginWithService = Meteor[methodName];
+ options = {
+ loginStyle: AccountsTemplates.options.socialLoginStyle,
+ };
+ if (Accounts.ui) {
+ if (Accounts.ui._options.requestPermissions[serviceName]) {
+ options.requestPermissions = Accounts.ui._options.requestPermissions[serviceName];
+ }
+ if (Accounts.ui._options.requestOfflineToken[serviceName]) {
+ options.requestOfflineToken = Accounts.ui._options.requestOfflineToken[serviceName];
+ }
+ }
+ loginWithService(options, function(err) {
+ AccountsTemplates.setDisabled(false);
+ if (err && err instanceof Accounts.LoginCancelledError) {
+ // do nothing
+ }
+ else if (err && err instanceof ServiceConfiguration.ConfigError) {
+ if (Accounts._loginButtonsSession)
+ return Accounts._loginButtonsSession.configureService(serviceName);
+ }
+ else
+ AccountsTemplates.submitCallback(err, state);
+ });
+ }
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js
new file mode 100644
index 00000000..0ada35cb
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js
@@ -0,0 +1,33 @@
+AT.prototype.atTermsLinkHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ text: function(){
+ return T9n.get(AccountsTemplates.texts.termsPreamble, markIfMissing=false);
+ },
+ privacyUrl: function(){
+ return AccountsTemplates.options.privacyUrl;
+ },
+ privacyLinkText: function(){
+ return T9n.get(AccountsTemplates.texts.termsPrivacy, markIfMissing=false);
+ },
+ showTermsAnd: function(){
+ return !!AccountsTemplates.options.privacyUrl && !!AccountsTemplates.options.termsUrl;
+ },
+ and: function(){
+ return T9n.get(AccountsTemplates.texts.termsAnd, markIfMissing=false);
+ },
+ termsUrl: function(){
+ return AccountsTemplates.options.termsUrl;
+ },
+ termsLinkText: function(){
+ return T9n.get(AccountsTemplates.texts.termsTerms, markIfMissing=false);
+ },
+};
+
+AT.prototype.atTermsLinkEvents = {
+ "click a": function(event) {
+ if (AccountsTemplates.disabled())
+ event.preventDefault();
+ },
+}; \ No newline at end of file
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js
new file mode 100644
index 00000000..74f711b9
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js
@@ -0,0 +1,7 @@
+AT.prototype.atTitleHelpers = {
+ title: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return T9n.get(AccountsTemplates.texts.title[state], markIfMissing = false);
+ },
+};
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html b/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html
new file mode 100644
index 00000000..08c0d7e3
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html
@@ -0,0 +1,12 @@
+<!-- Template level auth -->
+<template name="ensureSignedIn">
+ {{#if signedIn}}
+ {{> Template.dynamic template=template}}
+ {{else}}
+ {{#if auth}}
+ {{> Template.dynamic template=auth}}
+ {{else}}
+ {{> fullPageAtForm}}
+ {{/if}}
+ {{/if}}
+</template>
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js b/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js
new file mode 100644
index 00000000..3d947aae
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js
@@ -0,0 +1,15 @@
+
+Template.ensureSignedIn.helpers({
+ signedIn: function () {
+ if (!Meteor.user()) {
+ AccountsTemplates.setState(AccountsTemplates.options.defaultState, function(){
+ var err = AccountsTemplates.texts.errors.mustBeLoggedIn;
+ AccountsTemplates.state.form.set('error', [err]);
+ });
+ return false;
+ } else {
+ AccountsTemplates.clearError();
+ return true;
+ }
+ }
+});