diff --git a/server/modules/projects/projects.routes.ts b/server/modules/projects/projects.routes.ts index e08c23d7..8ff8bf04 100644 --- a/server/modules/projects/projects.routes.ts +++ b/server/modules/projects/projects.routes.ts @@ -71,10 +71,14 @@ router.get( const skipSynchronization = readQueryStringValue(req.query.skipSynchronization).trim() === '1' || readQueryStringValue(req.query.skipSync).trim() === '1'; + const fastDisplayNames = + readQueryStringValue(req.query.fastDisplayNames).trim() === '1' || + readQueryStringValue(req.query.fastNames).trim() === '1'; const sessionsLimit = readOptionalNumericQueryValue(req.query.sessionsLimit) ?? undefined; const sessionsOffset = readOptionalNumericQueryValue(req.query.sessionsOffset) ?? undefined; const projects = await getProjectsWithSessions({ skipSynchronization, + fastDisplayNames, sessionsLimit, sessionsOffset, }); diff --git a/server/modules/projects/services/projects-with-sessions-fetch.service.ts b/server/modules/projects/services/projects-with-sessions-fetch.service.ts index bb252f69..d309302f 100644 --- a/server/modules/projects/services/projects-with-sessions-fetch.service.ts +++ b/server/modules/projects/services/projects-with-sessions-fetch.service.ts @@ -54,6 +54,7 @@ type ProgressUpdate = { type GetProjectsWithSessionsOptions = { skipSynchronization?: boolean; + fastDisplayNames?: boolean; sessionsLimit?: number; sessionsOffset?: number; }; @@ -116,6 +117,15 @@ export async function generateDisplayName(projectName: string, actualProjectDir: return projectPath; } +function generateFastDisplayName(projectPath: string): string { + if (projectPath.startsWith('/')) { + const parts = projectPath.split('/').filter(Boolean); + return parts[parts.length - 1] || projectPath; + } + + return projectPath.replace(/-/g, '/'); +} + function normalizeSessionPagination(options: SessionPaginationOptions = {}): { limit: number; offset: number } { const rawLimit = Number.isFinite(options.limit) ? Math.floor(Number(options.limit)) : DEFAULT_PROJECT_SESSIONS_PAGE_SIZE; const rawOffset = Number.isFinite(options.offset) ? Math.floor(Number(options.offset)) : 0; @@ -239,7 +249,9 @@ export async function getProjectsWithSessions( const displayName = row.custom_project_name && row.custom_project_name.trim().length > 0 ? row.custom_project_name - : await generateDisplayName(path.basename(projectPath) || projectPath, projectPath); + : options.fastDisplayNames + ? generateFastDisplayName(projectPath) + : await generateDisplayName(path.basename(projectPath) || projectPath, projectPath); const sessionsPage = readProjectSessionsPageByPath(projectPath, { limit: options.sessionsLimit,