Admin tools: themed dashboard

This commit is contained in:
yu-i-i
2026-03-19 02:34:33 +01:00
parent 51dff8c20a
commit cf84ba650a
19 changed files with 383 additions and 190 deletions

View File

@@ -4,21 +4,32 @@ import { fileURLToPath } from 'node:url'
import { expressify } from '@overleaf/promise-utils'
import logger from '@overleaf/logger'
import Metrics from '@overleaf/metrics'
import SessionManager from '../../../../app/src/Features/Authentication/SessionManager.mjs'
import PrivilegeLevels from '../../../../app/src/Features/Authorization/PrivilegeLevels.mjs'
import ProjectHelper from '../../../../app/src/Features/Project/ProjectHelper.mjs'
import ProjectGetter from '../../../../app/src/Features/Project/ProjectGetter.mjs'
import PrivilegeLevels from '../../../../app/src/Features/Authorization/PrivilegeLevels.mjs'
import SessionManager from '../../../../app/src/Features/Authentication/SessionManager.mjs'
import ProjectDeleter from '../../../../app/src/Features/Project/ProjectDeleter.mjs'
import UserSettingsHelper from '../../../../app/src/Features/Project/UserSettingsHelper.mjs'
import UserGetter from '../../../../app/src/Features/User/UserGetter.mjs'
import { OError } from '../../../../app/src/Features/Errors/Errors.js'
import { User } from '../../../../app/src/models/User.mjs'
import { Project } from '../../../../app/src/models/Project.mjs'
import { DeletedProject } from '../../../../app/src/models/DeletedProject.mjs'
import ProjectDeleter from '../../../../app/src/Features/Project/ProjectDeleter.mjs'
import { OError } from '../../../../app/src/Features/Errors/Errors.js'
import HttpErrorHandler from '../../../../app/src/Features/Errors/HttpErrorHandler.mjs'
import SplitTestHandler from '../../../../app/src/Features/SplitTests/SplitTestHandler.mjs'
const __dirname = Path.dirname(fileURLToPath(import.meta.url))
function cleanupSession(req) {
// cleanup redirects at the end of the redirect chain
delete req.session.postCheckoutRedirect
delete req.session.postLoginRedirect
delete req.session.postOnboardingRedirect
}
async function manageProjectsPage(req, res, next) {
cleanupSession(req)
const projectsBlobPending = _getProjects().catch(err => {
logger.err({ err }, 'projects listing in background failed')
return undefined
@@ -30,8 +41,24 @@ async function manageProjectsPage(req, res, next) {
status: prefetchedProjectsBlob ? 'success' : 'error',
})
const userId = SessionManager.getLoggedInUserId(req.session)
const user = await User.findById(userId, 'ace')
const userSettings = await UserSettingsHelper.buildUserSettings(
req,
res,
user
)
await SplitTestHandler.promises.getAssignment(
req,
res,
'themed-project-dashboard'
)
res.render(Path.resolve(__dirname, '../views/manage-projects-react'), {
title: 'Manage Projects',
userSettings,
prefetchedProjectsBlob,
})
}

View File

@@ -16,12 +16,14 @@ import OneTimeTokenHandler from '../../../../app/src/Features/Security/OneTimeTo
import UserGetter from '../../../../app/src/Features/User/UserGetter.mjs'
import UserUpdater from '../../../../app/src/Features/User/UserUpdater.mjs'
import UserDeleter from '../../../../app/src/Features/User/UserDeleter.mjs'
import UserSettingsHelper from '../../../../app/src/Features/Project/UserSettingsHelper.mjs'
import ProjectDeleter from '../../../../app/src/Features/Project/ProjectDeleter.mjs'
import OwnershipTransferHandler from '../../../../app/src/Features/Collaborators/OwnershipTransferHandler.mjs'
import HttpErrorHandler from '../../../../app/src/Features/Errors/HttpErrorHandler.mjs'
import ErrorController from '../../../../app/src/Features/Errors/ErrorController.mjs'
import Errors, { OError } from '../../../../app/src/Features/Errors/Errors.js'
import { db } from '../../../../app/src/infrastructure/mongodb.mjs'
import SplitTestHandler from '../../../../app/src/Features/SplitTests/SplitTestHandler.mjs'
const __dirname = Path.dirname(fileURLToPath(import.meta.url))
@@ -71,8 +73,6 @@ function cleanupSession(req) {
async function manageUsersPage(req, res, next) {
cleanupSession(req)
const userId = SessionManager.getLoggedInUserId(req.session)
const usersBlobPending = _getUsers().catch(err => {
logger.err({ err }, 'users listing in background failed')
return undefined
@@ -84,8 +84,24 @@ async function manageUsersPage(req, res, next) {
status: prefetchedUsersBlob ? 'success' : 'error',
})
await SplitTestHandler.promises.getAssignment(
req,
res,
'themed-project-dashboard'
)
const userId = SessionManager.getLoggedInUserId(req.session)
const user = await User.findById(userId, 'ace')
const userSettings = await UserSettingsHelper.buildUserSettings(
req,
res,
user
)
res.render(Path.resolve(__dirname, '../views/manage-users-react'), {
title: 'Manage Users',
userSettings,
prefetchedUsersBlob,
availableAuthMethods,
userDetailsUpdatedOnLogin,