From 7b205ebba4053dde98bbce27727137f03b544efe Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Sun, 5 Jun 2016 22:52:46 +0530 Subject: [PATCH] FEATURE: customize invite email message --- .../discourse/controllers/invite.js.es6 | 28 +++++- .../javascripts/discourse/models/user.js.es6 | 4 +- .../discourse/templates/modal/invite.hbs | 6 ++ app/controllers/invites_controller.rb | 2 +- app/jobs/regular/invite_email.rb | 2 +- app/mailers/invite_mailer.rb | 22 ++++- app/models/invite.rb | 8 +- config/locales/client.en.yml | 18 ++++ spec/jobs/invite_email_spec.rb | 3 +- spec/mailers/invite_mailer_spec.rb | 92 +++++++++++++++---- 10 files changed, 153 insertions(+), 32 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/invite.js.es6 b/app/assets/javascripts/discourse/controllers/invite.js.es6 index 7ee5d0763..788cf4758 100644 --- a/app/assets/javascripts/discourse/controllers/invite.js.es6 +++ b/app/assets/javascripts/discourse/controllers/invite.js.es6 @@ -6,6 +6,8 @@ export default Ember.Controller.extend(ModalFunctionality, { // If this isn't defined, it will proxy to the user model on the preferences // page which is wrong. emailOrUsername: null, + hasCustomMessage: false, + customMessage: null, inviteIcon: "envelope", isAdmin: function(){ @@ -27,6 +29,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('isAdmin', 'emailOrUsername', 'invitingToTopic', 'isPrivateTopic', 'model.groupNames', 'model.saving'), disabledCopyLink: function() { + if (this.get('hasCustomMessage')) return true; if (this.get('model.saving')) return true; if (Ember.isEmpty(this.get('emailOrUsername'))) return true; const emailOrUsername = this.get('emailOrUsername').trim(); @@ -37,7 +40,7 @@ export default Ember.Controller.extend(ModalFunctionality, { // when inviting to private topic via email, group name must be specified if (this.get('isPrivateTopic') && Ember.isEmpty(this.get('model.groupNames')) && Discourse.Utilities.emailValid(emailOrUsername)) return true; return false; - }.property('emailOrUsername', 'model.saving', 'isPrivateTopic', 'model.groupNames'), + }.property('emailOrUsername', 'model.saving', 'isPrivateTopic', 'model.groupNames', 'hasCustomMessage'), buttonTitle: function() { return this.get('model.saving') ? 'topic.inviting' : 'topic.invite_reply.action'; @@ -71,6 +74,11 @@ export default Ember.Controller.extend(ModalFunctionality, { return this.get('isAdmin') && (Discourse.Utilities.emailValid(this.get('emailOrUsername')) || this.get('isPrivateTopic') || !this.get('invitingToTopic')) && !Discourse.SiteSettings.enable_sso && Discourse.SiteSettings.enable_local_logins && !this.get('isMessage'); }.property('isAdmin', 'emailOrUsername', 'isPrivateTopic', 'isMessage', 'invitingToTopic'), + // Show Custom Message textarea? (only shown when inviting new user to forum) + showCustomMessage: function() { + return this.get('model') === this.currentUser; + }.property('model'), + // Instructional text for the modal. inviteInstructions: function() { if (Discourse.SiteSettings.enable_sso || !Discourse.SiteSettings.enable_local_logins) { @@ -136,9 +144,15 @@ export default Ember.Controller.extend(ModalFunctionality, { 'topic.invite_private.email_or_username_placeholder'; }.property(), + customMessagePlaceholder: function() { + return I18n.t('invite.custom_message_placeholder'); + }.property(), + // Reset the modal to allow a new user to be invited. reset() { this.set('emailOrUsername', null); + this.set('hasCustomMessage', false); + this.set('customMessage', null); this.get('model').setProperties({ groupNames: null, error: false, @@ -147,7 +161,6 @@ export default Ember.Controller.extend(ModalFunctionality, { inviteLink: null }); }, - actions: { createInvite() { @@ -162,7 +175,7 @@ export default Ember.Controller.extend(ModalFunctionality, { model.setProperties({ saving: true, error: false }); - return this.get('model').createInvite(this.get('emailOrUsername').trim(), groupNames).then(result => { + return this.get('model').createInvite(this.get('emailOrUsername').trim(), groupNames, this.get('customMessage')).then(result => { model.setProperties({ saving: false, finished: true }); if (!this.get('invitingToTopic')) { Invite.findInvitedBy(this.currentUser, userInvitedController.get('filter')).then(invite_model => { @@ -213,6 +226,15 @@ export default Ember.Controller.extend(ModalFunctionality, { } model.setProperties({ saving: false, error: true }); }); + }, + + showCustomMessageBox() { + this.toggleProperty('hasCustomMessage'); + if (this.get('hasCustomMessage')) { + this.set('customMessage', I18n.t('invite.custom_message_template')); + } else { + this.set('customMessage', null); + } } } diff --git a/app/assets/javascripts/discourse/models/user.js.es6 b/app/assets/javascripts/discourse/models/user.js.es6 index 1526638f7..9797cec04 100644 --- a/app/assets/javascripts/discourse/models/user.js.es6 +++ b/app/assets/javascripts/discourse/models/user.js.es6 @@ -321,10 +321,10 @@ const User = RestModel.extend({ Discourse.SiteSettings['newuser_max_' + type + 's'] > 0; }, - createInvite(email, group_names) { + createInvite(email, group_names, custom_message) { return Discourse.ajax('/invites', { type: 'POST', - data: { email, group_names } + data: { email, group_names, custom_message } }); }, diff --git a/app/assets/javascripts/discourse/templates/modal/invite.hbs b/app/assets/javascripts/discourse/templates/modal/invite.hbs index 0a016002d..d28afdb01 100644 --- a/app/assets/javascripts/discourse/templates/modal/invite.hbs +++ b/app/assets/javascripts/discourse/templates/modal/invite.hbs @@ -22,6 +22,12 @@ {{group-selector groupFinder=groupFinder groupNames=model.groupNames placeholderKey="topic.invite_private.group_name"}} {{/if}} + + {{#if showCustomMessage}} +
+ {{#if hasCustomMessage}}{{textarea value=customMessage placeholder=customMessagePlaceholder}}{{/if}} + {{/if}} + {{/if}}