diff --git a/web-app/packages/lib/src/modules/project/components/ProjectMembersTable.vue b/web-app/packages/lib/src/modules/project/components/ProjectMembersTable.vue index 3b7c284f..f96f9e6d 100644 --- a/web-app/packages/lib/src/modules/project/components/ProjectMembersTable.vue +++ b/web-app/packages/lib/src/modules/project/components/ProjectMembersTable.vue @@ -163,7 +163,8 @@ function removeMember(item: ProjectAccessDetail) { function roleUpdate(item: ProjectAccessDetail, value: ProjectRoleName) { projectStore.updateProjectAccess({ projectId: projectStore.project.id, - data: { role: value, user_id: item.id } + userId: item.id, + data: { role: value } }) } diff --git a/web-app/packages/lib/src/modules/project/projectApi.ts b/web-app/packages/lib/src/modules/project/projectApi.ts index ec9b4789..fbd77fdd 100644 --- a/web-app/packages/lib/src/modules/project/projectApi.ts +++ b/web-app/packages/lib/src/modules/project/projectApi.ts @@ -21,11 +21,12 @@ import { PushProjectChangesParams, PushProjectChangesResponse, SaveProjectSettings, - UpdateProjectAccessParams, ProjectVersion, ProjectAccessDetail, ProjectAccess, - ProjectVersionFileChange + ProjectVersionFileChange, + UpdateProjectPayload, + UpdatePublicFlagParams } from '@/modules/project/types' export const ProjectApi = { @@ -175,7 +176,22 @@ export const ProjectApi = { async updateProjectAccess( id: string, - data: UpdateProjectAccessParams, + userId: number, + data: UpdateProjectPayload, + withRetry?: boolean + ): Promise> { + return ProjectModule.httpService.patch( + `/v2/projects/${id}/collaborators/${userId}`, + data, + { + ...(withRetry ? getDefaultRetryOptions() : {}) + } + ) + }, + + async updatePublicFlag( + id: string, + data: UpdatePublicFlagParams, withRetry?: boolean ): Promise> { return ProjectModule.httpService.patch(`/app/project/${id}/access`, data, { @@ -183,6 +199,19 @@ export const ProjectApi = { }) }, + async removeProjectAccess( + id: string, + userId: number, + withRetry?: boolean + ): Promise> { + return ProjectModule.httpService.delete( + `/v2/projects/${id}/collaborators/${userId}`, + { + ...(withRetry ? getDefaultRetryOptions() : {}) + } + ) + }, + async pushProjectChanges( url: string, data: PushProjectChangesParams diff --git a/web-app/packages/lib/src/modules/project/store.ts b/web-app/packages/lib/src/modules/project/store.ts index 831e9adb..363d2ec7 100644 --- a/web-app/packages/lib/src/modules/project/store.ts +++ b/web-app/packages/lib/src/modules/project/store.ts @@ -43,7 +43,9 @@ import { ProjectAccessDetail, UpdateProjectAccessParams, ProjectVersionFileChange, - ProjectVersionListItem + ProjectVersionListItem, + UpdateProjectPayload, + UpdatePublicFlagParams } from '@/modules/project/types' import { useUserStore } from '@/modules/user/store' @@ -758,10 +760,10 @@ export const useProjectStore = defineStore('projectModule', { const notificationStore = useNotificationStore() this.accessLoading = true try { - const response = await ProjectApi.updateProjectAccess(this.project.id, { - user_id: item.id, - role: 'none' - }) + const response = await ProjectApi.removeProjectAccess( + this.project.id, + item.id + ) this.access = this.access.filter((access) => access.id !== item.id) this.project.access = response.data } catch { @@ -774,24 +776,26 @@ export const useProjectStore = defineStore('projectModule', { }, /** - * Updates the access for a user on the given project. `project.access` contains also public attribute. This attribute can be changed also. + * Updates the access for a user on the given project. * * @param payload - Object containing the project ID and access update details. * @returns Promise resolving when the API call completes. */ async updateProjectAccess(payload: { projectId: string - data: UpdateProjectAccessParams + userId: number + data: UpdateProjectPayload }) { const notificationStore = useNotificationStore() this.accessLoading = true try { const response = await ProjectApi.updateProjectAccess( payload.projectId, + payload.userId, payload.data ) this.access = this.access.map((access) => { - if (access.id === payload.data.user_id) { + if (access.id === payload.userId) { access.project_permission = payload.data.role } return access @@ -806,6 +810,27 @@ export const useProjectStore = defineStore('projectModule', { } }, + async updatePublicFlag(payload: { + projectId: string + data: UpdatePublicFlagParams + }) { + const notificationStore = useNotificationStore() + this.accessLoading = true + try { + const response = await ProjectApi.updatePublicFlag( + payload.projectId, + payload.data + ) + this.project.access = response.data + } catch { + notificationStore.error({ + text: `Failed to update public flag` + }) + } finally { + this.accessLoading = false + } + }, + async getVersionChangeset(payload: { workspace: string projectName: string diff --git a/web-app/packages/lib/src/modules/project/types.ts b/web-app/packages/lib/src/modules/project/types.ts index 8260991f..e8c39aaa 100644 --- a/web-app/packages/lib/src/modules/project/types.ts +++ b/web-app/packages/lib/src/modules/project/types.ts @@ -292,9 +292,11 @@ export type EnhancedProjectDetail = ProjectDetail & { path: string } -export interface UpdateProjectAccessParams { - user_id?: number - role?: ProjectRoleName +export interface UpdateProjectPayload { + role: ProjectRoleName +} + +export interface UpdatePublicFlagParams { public?: boolean } diff --git a/web-app/packages/lib/src/modules/project/views/ProjectSettingsViewTemplate.vue b/web-app/packages/lib/src/modules/project/views/ProjectSettingsViewTemplate.vue index a4c55ab3..e8673a7b 100644 --- a/web-app/packages/lib/src/modules/project/views/ProjectSettingsViewTemplate.vue +++ b/web-app/packages/lib/src/modules/project/views/ProjectSettingsViewTemplate.vue @@ -95,10 +95,10 @@ export default defineComponent({ } }, methods: { - ...mapActions(useProjectStore, ['deleteProject', 'updateProjectAccess']), + ...mapActions(useProjectStore, ['deleteProject', 'updatePublicFlag']), ...mapActions(useDialogStore, { showDialog: 'show' }), togglePublicPrivate() { - this.updateProjectAccess({ + this.updatePublicFlag({ projectId: this.project.id, data: { public: !this.project.access.public