From 25098ae573989fbeb84a379c2b3cd925e19a5036 Mon Sep 17 00:00:00 2001 From: "marcel.kocisek" Date: Mon, 18 May 2026 16:00:12 +0200 Subject: [PATCH 1/2] Add call for project info v2 - just needed attributes provided using setProject Co-authored-by: Copilot --- .../layout/components/AppHeaderTemplate.vue | 7 ++++ .../project/components/FileDetailSidebar.vue | 2 +- .../modules/project/components/FilesTable.vue | 2 +- .../lib/src/modules/project/projectApi.ts | 7 +++- .../packages/lib/src/modules/project/store.ts | 37 ++++++++++++++++++- .../packages/lib/src/modules/project/types.ts | 15 ++++++++ .../project/views/FileVersionDetailView.vue | 2 - 7 files changed, 66 insertions(+), 6 deletions(-) diff --git a/web-app/packages/lib/src/modules/layout/components/AppHeaderTemplate.vue b/web-app/packages/lib/src/modules/layout/components/AppHeaderTemplate.vue index 1d1501ef..32fa867b 100644 --- a/web-app/packages/lib/src/modules/layout/components/AppHeaderTemplate.vue +++ b/web-app/packages/lib/src/modules/layout/components/AppHeaderTemplate.vue @@ -22,6 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial >
+ record.components != null && 'sidebar' in record.components + ) + }, menuButtonIcon() { if (this.isUnderOverlayBreakpoint) { return 'ti ti-menu-2' diff --git a/web-app/packages/lib/src/modules/project/components/FileDetailSidebar.vue b/web-app/packages/lib/src/modules/project/components/FileDetailSidebar.vue index 4dcec5ee..b73cefbd 100644 --- a/web-app/packages/lib/src/modules/project/components/FileDetailSidebar.vue +++ b/web-app/packages/lib/src/modules/project/components/FileDetailSidebar.vue @@ -126,7 +126,7 @@ export default defineComponent({ }, file() { return ( - this.project?.files[this.filePath] || this.upload?.files[this.filePath] + this.project?.files?.[this.filePath] || this.upload?.files?.[this.filePath] ) }, fileName() { diff --git a/web-app/packages/lib/src/modules/project/components/FilesTable.vue b/web-app/packages/lib/src/modules/project/components/FilesTable.vue index 1409ccd7..8b8de543 100644 --- a/web-app/packages/lib/src/modules/project/components/FilesTable.vue +++ b/web-app/packages/lib/src/modules/project/components/FilesTable.vue @@ -181,7 +181,7 @@ const breadcrumps = computed(() => { }) const projectFiles = computed(() => { - let files = projectStore.project.files + let files = projectStore.project.files ?? [] if (projectStore.uploads[projectStore.project.path] && diff.value) { files = { ...files, diff --git a/web-app/packages/lib/src/modules/project/projectApi.ts b/web-app/packages/lib/src/modules/project/projectApi.ts index 657675c8..c17e4d5b 100644 --- a/web-app/packages/lib/src/modules/project/projectApi.ts +++ b/web-app/packages/lib/src/modules/project/projectApi.ts @@ -28,7 +28,8 @@ import { UpdateProjectCollaboratorPayload, UpdatePublicFlagParams, ProjectCollaborator, - AddProjectCollaboratorPayload + AddProjectCollaboratorPayload, + ProjectV2Response } from '@/modules/project/types' export const ProjectApi = { @@ -39,6 +40,10 @@ export const ProjectApi = { return ProjectModule.httpService(`/v1/project/${namespace}/${projectName}`) }, + async getProjectV2(id: string): Promise> { + return ProjectModule.httpService(`/v2/projects/${id}`) + }, + async createProject( namespace: string, data: CreateProjectParams, diff --git a/web-app/packages/lib/src/modules/project/store.ts b/web-app/packages/lib/src/modules/project/store.ts index 1edf1ae7..302b9a72 100644 --- a/web-app/packages/lib/src/modules/project/store.ts +++ b/web-app/packages/lib/src/modules/project/store.ts @@ -45,7 +45,8 @@ import { ProjectVersionListItem, UpdateProjectCollaboratorPayload, UpdatePublicFlagParams, - ProjectCollaborator + ProjectCollaborator, + ProjectV2Response } from '@/modules/project/types' import { useUserStore } from '@/modules/user/store' @@ -170,6 +171,29 @@ export const useProjectStore = defineStore('projectModule', { }) } }, + setProjectV2(payload: { project: ProjectV2Response }) { + this.project = { + ...(this.project ?? {}), + // Transofrm ProjectV2Response to EnhancedProjectDetail , we can skip files + id: payload.project.id, + name: payload.project.name, + namespace: payload.project.workspace.name, + workspace_id: payload.project.workspace.id, + role: payload.project.role, + path: [payload.project.workspace.name, payload.project.name].join('/'), + created: payload.project.created_at, + updated: payload.project.updated_at, + access: undefined, + version: payload.project.version, + // Leave as undefined in this time. When full implementation needed, we can use it. + files: undefined, + creator: undefined, + disk_usage: payload.project.size, + has_conflict: undefined, + permissions: undefined, + tags: undefined + } + }, setProjects(payload: ProjectsPayload) { this.projects = payload.projects this.projectsCount = payload.count @@ -489,6 +513,17 @@ export const useProjectStore = defineStore('projectModule', { } }, + async getProjectV2(projectId: string) { + const notificationStore = useNotificationStore() + + try { + const projectResponse = await ProjectApi.getProjectV2(projectId) + this.setProjectV2({ project: projectResponse.data }) + } catch { + await notificationStore.error({ text: 'Failed to load project data' }) + } + }, + async unsubscribeProject(payload) { const notificationStore = useNotificationStore() diff --git a/web-app/packages/lib/src/modules/project/types.ts b/web-app/packages/lib/src/modules/project/types.ts index e50e0492..169a4bfc 100644 --- a/web-app/packages/lib/src/modules/project/types.ts +++ b/web-app/packages/lib/src/modules/project/types.ts @@ -57,6 +57,21 @@ export interface Project { created?: string } +export interface ProjectV2Response { + id: string + name: string + version: string + public: boolean + size: number + created_at: string + updated_at: string + workspace: { + id: number + name: string + } + role: ProjectRoleName | null +} + export interface ProjectListItem extends Project { access: ProjectAccess creator: number | null diff --git a/web-app/packages/lib/src/modules/project/views/FileVersionDetailView.vue b/web-app/packages/lib/src/modules/project/views/FileVersionDetailView.vue index a41c7f32..403d229c 100644 --- a/web-app/packages/lib/src/modules/project/views/FileVersionDetailView.vue +++ b/web-app/packages/lib/src/modules/project/views/FileVersionDetailView.vue @@ -74,8 +74,6 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial

No changeset for current layer

- console.log('getChangeset', this.namespace, this.projectName, - this.version_id, this.path) From 6d321d9f3a9ee5761358cda52bb39100971b4a8f Mon Sep 17 00:00:00 2001 From: "marcel.kocisek" Date: Tue, 19 May 2026 13:07:38 +0200 Subject: [PATCH 2/2] Add tests for project version created --- server/mergin/tests/test_project_controller.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/mergin/tests/test_project_controller.py b/server/mergin/tests/test_project_controller.py index 60c36ee2..4cb3374a 100644 --- a/server/mergin/tests/test_project_controller.py +++ b/server/mergin/tests/test_project_controller.py @@ -2567,9 +2567,12 @@ def test_signals(client): project = create_project("test-project", workspace, user) with patch( "mergin.sync.public_api_controller.push_finished.send" - ) as push_finished_mock: + ) as push_finished_mock, patch( + "mergin.sync.public_api_controller.project_version_created.send" + ) as project_version_created_mock: upload_file_to_project(project, "test.txt", client) push_finished_mock.assert_called_once() + project_version_created_mock.assert_called_once() def test_filepath_manipulation(client):