From 1681343782503d24a2c4c0ed328ab3bd17420406 Mon Sep 17 00:00:00 2001 From: roo hutton Date: Mon, 10 Aug 2026 12:33:09 +0100 Subject: [PATCH] Merge pull request #36024 from overleaf/rh-cio-group-support Enable customer.io in-app messages on group management pages GitOrigin-RevId: 0c30c4ccf219cdbc4dd48ea6940cc46a4c6964c3 --- .../Features/UserMembership/UserMembershipController.mjs | 8 ++++++-- services/web/app/views/_customer_io.pug | 2 +- .../src/UserMembership/UserMembershipController.test.mjs | 9 ++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/services/web/app/src/Features/UserMembership/UserMembershipController.mjs b/services/web/app/src/Features/UserMembership/UserMembershipController.mjs index b2b759fb37..5b9b1862cc 100644 --- a/services/web/app/src/Features/UserMembership/UserMembershipController.mjs +++ b/services/web/app/src/Features/UserMembership/UserMembershipController.mjs @@ -74,6 +74,7 @@ async function manageGroupMembers(req, res, next) { canUseFlexibleLicensing: plan?.canUseFlexibleLicensing, canUseAddSeatsFeature, entityAccess: UserMembershipAuthorization.hasEntityAccess()(req), + customerIoEnabled: true, }) } @@ -82,7 +83,8 @@ async function manageGroupManagers(req, res, next) { req, res, next, - 'user_membership/group-managers-react' + 'user_membership/group-managers-react', + { customerIoEnabled: true } ) } @@ -104,7 +106,7 @@ async function managePublisherManagers(req, res, next) { ) } -async function _renderManagersPage(req, res, next, template) { +async function _renderManagersPage(req, res, next, template, extraLocals = {}) { const { entity, entityConfig } = req const fetchV1Data = new Promise((resolve, reject) => { @@ -135,6 +137,7 @@ async function _renderManagersPage(req, res, next, template) { users, groupId: entityPrimaryKey, entityAccess: UserMembershipAuthorization.hasEntityAccess()(req), + ...extraLocals, }) } @@ -202,6 +205,7 @@ async function manageGroupUsers(req, res) { entityAccess: UserMembershipAuthorization.hasEntityAccess()(req), canUseAddSeatsFeature, groupSSOActive: ssoConfig?.enabled, + customerIoEnabled: true, }) } diff --git a/services/web/app/views/_customer_io.pug b/services/web/app/views/_customer_io.pug index 98a18d895c..b81b80034b 100644 --- a/services/web/app/views/_customer_io.pug +++ b/services/web/app/views/_customer_io.pug @@ -1,5 +1,5 @@ if(customerIoEnabled && ExposedSettings.cioWriteKey && ExposedSettings.cioSiteId) - script(type="text/javascript", id="cio-loader", nonce=scriptNonce, data-cio-write-key=ExposedSettings.cioWriteKey, data-cio-site-id=ExposedSettings.cioSiteId, data-session-analytics-id=getSessionAnalyticsId(), data-user-id=((user && (user._id || user.id)) || ''), data-user-email=((user && user.email) || '')). + script(type="text/javascript", id="cio-loader", nonce=scriptNonce, data-cio-write-key=ExposedSettings.cioWriteKey, data-cio-site-id=ExposedSettings.cioSiteId, data-session-analytics-id=getSessionAnalyticsId(), data-user-id=((user && (user._id || user.id)) || getLoggedInUserId() || ''), data-user-email=((user && user.email) || getUserEmail() || '')). var cioSettings = document.querySelector('#cio-loader').dataset; var analyticsId = cioSettings.sessionAnalyticsId; var userId = cioSettings.userId; diff --git a/services/web/test/unit/src/UserMembership/UserMembershipController.test.mjs b/services/web/test/unit/src/UserMembership/UserMembershipController.test.mjs index 83dafae38a..22aee221ec 100644 --- a/services/web/test/unit/src/UserMembership/UserMembershipController.test.mjs +++ b/services/web/test/unit/src/UserMembership/UserMembershipController.test.mjs @@ -285,7 +285,7 @@ describe('UserMembershipController', () => { subscription, users, }) => { - expect.assertions(4) + expect.assertions(5) subscription.managedUsersEnabled = false await UserMembershipController.manageGroupMembers(req, { render: (viewPath, viewParams) => { @@ -293,6 +293,7 @@ describe('UserMembershipController', () => { expect(viewParams.users).to.deep.equal(users) expect(viewParams.groupSize).to.equal(subscription.membersLimit) expect(viewParams.managedUsersActive).to.equal(false) + expect(viewParams.customerIoEnabled).to.equal(true) }, }) }) @@ -432,13 +433,14 @@ describe('UserMembershipController', () => { req, user, }) => { - expect.assertions(2) + expect.assertions(3) req.user = user req.entityConfig = EntityConfigs.groupManagers await UserMembershipController.manageGroupManagers(req, { render: (viewPath, viewParams) => { expect(viewPath).to.equal('user_membership/group-managers-react') expect(viewParams.groupSize).to.equal(undefined) + expect(viewParams.customerIoEnabled).to.equal(true) }, }) }) @@ -449,7 +451,7 @@ describe('UserMembershipController', () => { user, institution, }) => { - expect.assertions(3) + expect.assertions(4) req.user = user req.entity = institution req.entityConfig = EntityConfigs.institution @@ -460,6 +462,7 @@ describe('UserMembershipController', () => { ) expect(viewParams.name).to.equal('Test Institution Name') expect(viewParams.groupSize).to.equal(undefined) + expect(viewParams.customerIoEnabled).to.equal(undefined) }, }) })