diff options
Diffstat (limited to 'packages/meteor-useraccounts-core/lib/templates_helpers')
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; + } + } +}); |