Sfoglia il codice sorgente

Merge pull request #14178 from overleaf/mf-admin-email-managed-group-alert

Add managed group admin email inside managed group alert on the subscription page & team invite page warning

GitOrigin-RevId: 00929008170ef9302ddcbbf10aefd76f95e189a8
M Fahru 3 anni fa
parent
commit
a3e30c0a39

+ 12 - 0
services/web/app/src/Features/Subscription/SubscriptionLocator.js

@@ -40,6 +40,17 @@ const SubscriptionLocator = {
       .exec(callback)
   },
 
+  getAdminEmail(subscriptionId, callback) {
+    Subscription.findById(subscriptionId)
+      .populate('admin_id', 'email')
+      .exec((err, subscription) => {
+        if (err) {
+          return callback(err)
+        }
+        callback(err, subscription?.admin_id?.email)
+      })
+  },
+
   getAdminEmailAndName(subscriptionId, callback) {
     Subscription.findById(subscriptionId)
       .populate('admin_id', ['email', 'first_name', 'last_name'])
@@ -122,6 +133,7 @@ SubscriptionLocator.promises = {
     SubscriptionLocator.getManagedGroupSubscriptions
   ),
   getMemberSubscriptions: promisify(SubscriptionLocator.getMemberSubscriptions),
+  getAdminEmail: promisify(SubscriptionLocator.getAdminEmail),
   getAdminEmailAndName: promisify(SubscriptionLocator.getAdminEmailAndName),
   getSubscription: promisify(SubscriptionLocator.getSubscription),
   getSubscriptionByMemberIdAndId: promisify(

+ 10 - 0
services/web/app/src/Features/Subscription/TeamInvitesController.js

@@ -1,4 +1,5 @@
 const settings = require('@overleaf/settings')
+const logger = require('@overleaf/logger')
 const TeamInvitesHandler = require('./TeamInvitesHandler')
 const SessionManager = require('../Authentication/SessionManager')
 const SubscriptionLocator = require('./SubscriptionLocator')
@@ -106,6 +107,14 @@ async function viewInvite(req, res, next) {
         validationStatus: Object.fromEntries(validationStatus),
       })
     } else {
+      let currentManagedUserAdminEmail
+      try {
+        currentManagedUserAdminEmail =
+          await SubscriptionLocator.promises.getAdminEmail(req.managedBy)
+      } catch (err) {
+        logger.error({ err }, 'error getting subscription admin email')
+      }
+
       return res.render('subscriptions/team/invite', {
         inviterName: invite.inviterName,
         inviteToken: invite.token,
@@ -113,6 +122,7 @@ async function viewInvite(req, res, next) {
         appName: settings.appName,
         expired: req.query.expired,
         userRestrictions: Array.from(req.userRestrictions || []),
+        currentManagedUserAdminEmail,
       })
     }
   } else {

+ 10 - 0
services/web/app/src/Features/User/UserPagesController.js

@@ -6,6 +6,7 @@ const Settings = require('@overleaf/settings')
 const AuthenticationController = require('../Authentication/AuthenticationController')
 const SessionManager = require('../Authentication/SessionManager')
 const NewsletterManager = require('../Newsletter/NewsletterManager')
+const SubscriptionLocator = require('../Subscription/SubscriptionLocator')
 const _ = require('lodash')
 const { expressify } = require('../../util/promises')
 const Features = require('../../infrastructure/Features')
@@ -81,6 +82,14 @@ async function settingsPage(req, res) {
     }
   }
 
+  let currentManagedUserAdminEmail
+  try {
+    currentManagedUserAdminEmail =
+      await SubscriptionLocator.promises.getAdminEmail(req.managedBy)
+  } catch (err) {
+    logger.error({ err }, 'error getting subscription admin email')
+  }
+
   res.render('user/settings', {
     title: 'account_settings',
     user: {
@@ -128,6 +137,7 @@ async function settingsPage(req, res) {
     emailAddressLimit: Settings.emailAddressLimit,
     isManagedAccount: !!req.managedBy,
     userRestrictions: Array.from(req.userRestrictions || []),
+    currentManagedUserAdminEmail,
   })
 }
 

+ 1 - 1
services/web/app/views/subscriptions/team/invite.pug

@@ -20,7 +20,7 @@ block content
 
 						div(ng-show="view =='restrictedByManagedGroup'")
 							.alert.alert-info #{translate("restricted")}
-								p #{translate("account_managed_by_group_administrator")}
+								p #{translate("account_managed_by_group_administrator", {admin: currentManagedUserAdminEmail})}
 
 						div(ng-show="view =='hasIndividualRecurlySubscription'")
 							p #{translate("cancel_personal_subscription_first")}

+ 1 - 0
services/web/app/views/user/settings.pug

@@ -25,6 +25,7 @@ block append meta
 	meta(name="ol-showPersonalAccessToken", data-type="boolean" content=showPersonalAccessToken)
 	meta(name="ol-personalAccessTokens", data-type="json" content=personalAccessTokens)
 	meta(name="ol-emailAddressLimit", data-type="json", content=emailAddressLimit)
+	meta(name="ol-currentManagedUserAdminEmail" data-type="string" content=currentManagedUserAdminEmail)
 
 block content
 	main.content.content-alt#settings-page-root

+ 13 - 3
services/web/frontend/js/features/settings/components/managed-account-alert.tsx

@@ -1,9 +1,12 @@
-import { Trans, useTranslation } from 'react-i18next'
+import { Trans } from 'react-i18next'
 import getMeta from '../../../utils/meta'
 
 export default function ManagedAccountAlert() {
-  const { t } = useTranslation()
   const isManaged = getMeta('ol-isManagedAccount', false)
+  const currentManagedUserAdminEmail: string = getMeta(
+    'ol-currentManagedUserAdminEmail',
+    ''
+  )
 
   if (!isManaged) {
     return null
@@ -16,7 +19,14 @@ export default function ManagedAccountAlert() {
       </div>
       <div>
         <div>
-          <strong>{t('account_managed_by_group_administrator')}</strong>
+          <strong>
+            <Trans
+              i18nKey="account_managed_by_group_administrator"
+              values={{
+                admin: currentManagedUserAdminEmail,
+              }}
+            />
+          </strong>
         </div>
         <div>
           <Trans

+ 1 - 1
services/web/locales/en.json

@@ -39,7 +39,7 @@
   "account_has_been_link_to_institution_account": "Your __appName__ account on <b>__email__</b> has been linked to your <b>__institutionName__</b> institutional account.",
   "account_has_past_due_invoice_change_plan_warning": "Your account currently has a past due invoice. You will not be able to change your plan until this is resolved.",
   "account_linking": "Account Linking",
-  "account_managed_by_group_administrator": "Your account is managed by your group administrator",
+  "account_managed_by_group_administrator": "Your account is managed by your group administrator (__admin__)",
   "account_not_linked_to_dropbox": "Your account is not linked to Dropbox",
   "account_settings": "Account Settings",
   "account_with_email_exists": "It looks like an <b>__appName__</b> account with the email <b>__email__</b> already exists.",

+ 18 - 0
services/web/test/unit/src/User/UserPagesControllerTests.js

@@ -48,6 +48,10 @@ describe('UserPagesController', function () {
         zotero: { encrypted: 'bbbb' },
       },
     }
+    this.adminEmail = 'group-admin-email@overleaf.com'
+    this.subscriptionViewModel = {
+      memberGroupSubscriptions: [],
+    }
 
     this.UserGetter = {
       getUser: sinon.stub(),
@@ -73,6 +77,11 @@ describe('UserPagesController', function () {
     this.PersonalAccessTokenManager = {
       listTokens: sinon.stub().returns([]),
     }
+    this.SubscriptionLocator = {
+      promises: {
+        getAdminEmail: sinon.stub().returns(this.adminEmail),
+      },
+    }
     this.UserPagesController = SandboxedModule.require(modulePath, {
       requires: {
         '@overleaf/settings': this.settings,
@@ -82,6 +91,7 @@ describe('UserPagesController', function () {
         '../Errors/ErrorController': this.ErrorController,
         '../Authentication/AuthenticationController':
           this.AuthenticationController,
+        '../Subscription/SubscriptionLocator': this.SubscriptionLocator,
         '../../infrastructure/Features': this.Features,
         '../../../../modules/oauth2-server/app/src/OAuthPersonalAccessTokenManager':
           this.PersonalAccessTokenManager,
@@ -325,6 +335,14 @@ describe('UserPagesController', function () {
       return this.UserPagesController.settingsPage(this.req, this.res)
     })
 
+    it('should send the correct managed user admin email', function (done) {
+      this.res.render = (page, opts) => {
+        expect(opts.currentManagedUserAdminEmail).to.equal(this.adminEmail)
+        return done()
+      }
+      return this.UserPagesController.settingsPage(this.req, this.res)
+    })
+
     describe('when ldap.updateUserDetailsOnLogin is true', function () {
       beforeEach(function () {
         return (this.settings.ldap = { updateUserDetailsOnLogin: true })