Просмотр исходного кода

Merge pull request #28522 from overleaf/ii-domain-capture-create-user-notification

[web] Success message when linking to group with domain capture

GitOrigin-RevId: 2abf29b486da5043c9f207b8f1f741a3c3ee54ab
ilkin-overleaf 10 месяцев назад
Родитель
Сommit
53bba1807b

+ 3 - 1
services/web/app/src/Features/Project/ProjectListController.mjs

@@ -319,7 +319,9 @@ async function projectListPage(req, res, next) {
           institutionName:
             samlSession.linked.universityName ||
             samlSession.linked.providerName,
-          templateKey: 'notification_institution_sso_linked',
+          templateKey: samlSession.domainCaptureEnabled
+            ? 'notification_group_sso_linked'
+            : 'notification_institution_sso_linked',
         })
       }
 

+ 1 - 0
services/web/frontend/extracted-translations.json

@@ -50,6 +50,7 @@
   "access_edit_your_projects": "",
   "access_levels_changed": "",
   "account_billed_manually": "",
+  "account_has_been_link_to_group_account": "",
   "account_has_been_link_to_institution_account": "",
   "account_has_past_due_invoice_change_plan_warning": "",
   "account_help": "",

+ 15 - 0
services/web/frontend/js/features/project-list/components/notifications/groups/institution.tsx

@@ -88,6 +88,21 @@ function Institution() {
                 }
               />
             )}
+            {templateKey === 'notification_group_sso_linked' && (
+              <Notification
+                type="info"
+                onDismiss={() => id && handleDismiss(id)}
+                content={
+                  <Trans
+                    i18nKey="account_has_been_link_to_group_account"
+                    components={{ b: <b /> }}
+                    values={{ appName, email, institutionName }}
+                    shouldUnescape
+                    tOptions={{ interpolation: { escapeValue: true } }}
+                  />
+                }
+              />
+            )}
             {templateKey === 'notification_institution_sso_non_canonical' && (
               <Notification
                 type="warning"

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

@@ -56,6 +56,7 @@
   "account": "Account",
   "account_already_managed": "Your account is already managed.",
   "account_billed_manually": "Account billed manually",
+  "account_has_been_link_to_group_account": "Your __appName__ account on <b>__email__</b> has been linked to your <b>__institutionName__</b> account.",
   "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_help": "Account and help",

+ 37 - 2
services/web/test/frontend/features/project-list/components/notifications.test.tsx

@@ -509,8 +509,43 @@ describe('<UserNotifications />', function () {
       render(<Institution />)
       fetchMock.delete(`/notifications/${institution._id}`, 200)
 
-      screen.getByRole('alert')
-      screen.getByText(/has been linked to your/i)
+      const notificationEl = screen.getByRole('alert')
+      expect(notificationEl.textContent).to.match(
+        new RegExp(
+          `your Overleaf account on ${notificationsInstitution.email} ` +
+            `has been linked to your ${notificationsInstitution.institutionName} ` +
+            `institutional account.`,
+          'i'
+        )
+      )
+
+      const closeBtn = screen.getByRole('button', { name: /close/i })
+      fireEvent.click(closeBtn)
+
+      expect(fetchMock.callHistory.called()).to.be.true
+      expect(screen.queryByRole('alert')).to.be.null
+    })
+
+    it('shows sso linked to group with domain capture enabled', function () {
+      const institution: DeepPartial<InstitutionType> = {
+        _id: 1,
+        templateKey: 'notification_group_sso_linked',
+      }
+      window.metaAttributesCache.set('ol-notificationsInstitution', [
+        { ...notificationsInstitution, ...institution },
+      ])
+      render(<Institution />)
+      fetchMock.delete(`/notifications/${institution._id}`, 200)
+
+      const notificationEl = screen.getByRole('alert')
+      expect(notificationEl.textContent).to.match(
+        new RegExp(
+          `your Overleaf account on ${notificationsInstitution.email} ` +
+            `has been linked to your ${notificationsInstitution.institutionName} ` +
+            `account.`,
+          'i'
+        )
+      )
 
       const closeBtn = screen.getByRole('button', { name: /close/i })
       fireEvent.click(closeBtn)

+ 19 - 1
services/web/test/unit/src/Project/ProjectListController.test.mjs

@@ -570,7 +570,25 @@ describe('ProjectListController', function () {
         }
         ctx.ProjectListController.projectListPage(ctx.req, ctx.res)
       })
-      it('should show a linked group notification via domain capture', function (ctx) {
+      it('should show a group linked notification when domain capture enabled', function (ctx) {
+        ctx.req.session.saml = {
+          institutionEmail: ctx.institutionEmail,
+          linked: {
+            hasEntitlement: false,
+            universityName: ctx.institutionName,
+          },
+          domainCaptureEnabled: true,
+        }
+        ctx.res.render = (pageName, opts) => {
+          expect(opts.notificationsInstitution).to.deep.include({
+            email: ctx.institutionEmail,
+            institutionName: ctx.institutionName,
+            templateKey: 'notification_group_sso_linked',
+          })
+        }
+        ctx.ProjectListController.projectListPage(ctx.req, ctx.res)
+      })
+      it('should show a success notification when joining group via domain capture page', function (ctx) {
         ctx.req.session.saml = {
           linkedGroup: true,
           universityName: ctx.institutionName,