Skip to content

Commit e517433

Browse files
fix: Unable to switch workspaces after deleting a workspace
1 parent 7f85c20 commit e517433

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

backend/apps/system/api/workspace.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Optional
22
from fastapi import APIRouter, HTTPException, Query
3-
from sqlmodel import exists, or_, select, delete as sqlmodel_delete
3+
from sqlmodel import exists, or_, select, delete as sqlmodel_delete, update as sqlmodel_update
44
from apps.system.crud.user import clean_user_cache
55
from apps.system.crud.workspace import reset_single_user_oid, reset_user_oid
66
from apps.system.models.system_model import UserWsModel, WorkspaceBase, WorkspaceEditor, WorkspaceModel
@@ -204,13 +204,21 @@ async def get_one(session: SessionDep, trans: Trans, id: int):
204204
return db_model
205205

206206
@router.delete("/{id}")
207-
async def single_delete(session: SessionDep, id: int):
207+
async def single_delete(session: SessionDep, current_user: CurrentUser, id: int):
208+
if not current_user.isAdmin:
209+
raise HTTPException("only admin can delete workspace")
208210
if id == 1:
209211
raise HTTPException(f"Can not delete default workspace")
210212
db_model = session.get(WorkspaceModel, id)
211213
if not db_model:
212214
raise HTTPException(f"WorkspaceModel with id {id} not found")
213215

216+
if current_user.oid == id:
217+
current_user.oid = 1 # reset to default workspace
218+
update_stmt = sqlmodel_update(UserModel).where(UserModel.id == current_user.id).values(oid=1)
219+
session.exec(update_stmt)
220+
await clean_user_cache(current_user.id)
221+
214222
user_ws_list = session.exec(select(UserWsModel).where(UserWsModel.oid == id)).all()
215223
if user_ws_list:
216224
# clean user cache

frontend/src/components/layout/Workspace.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const formatKeywords = (item: string) => {
4040
const emit = defineEmits(['selectWorkspace'])
4141
4242
const handleDefaultWorkspaceChange = (item: any) => {
43-
if (item.id.toString() === currentWorkspace.value.id.toString()) {
43+
if (currentWorkspace.value?.id && item.id.toString() === currentWorkspace.value.id.toString()) {
4444
return
4545
}
4646
currentWorkspace.value = { id: item.id, name: item.name }
@@ -81,8 +81,8 @@ onMounted(async () => {
8181
<el-icon size="18">
8282
<icon_moments_categories_outlined></icon_moments_categories_outlined>
8383
</el-icon>
84-
<span v-if="!collapse" :title="currentWorkspace.name" class="name ellipsis">{{
85-
currentWorkspace.name
84+
<span v-if="!collapse" :title="currentWorkspace?.name || ''" class="name ellipsis">{{
85+
currentWorkspace?.name || ''
8686
}}</span>
8787
<el-icon v-if="!collapse" style="transform: scale(0.5)" class="expand" size="24">
8888
<icon_expand_down_filled></icon_expand_down_filled>
@@ -107,7 +107,7 @@ onMounted(async () => {
107107
v-for="ele in defaultWorkspaceListWithSearch"
108108
:key="ele.name"
109109
class="popover-item"
110-
:class="currentWorkspace.id === ele.id && 'isActive'"
110+
:class="currentWorkspace?.id === ele.id && 'isActive'"
111111
@click="handleDefaultWorkspaceChange(ele)"
112112
>
113113
<el-icon size="16">

frontend/src/views/system/workspace/index.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ import delIcon from '@/assets/svg/icon_delete.svg'
2525
import icon_more_outlined from '@/assets/svg/icon_more_outlined.svg'
2626
import icon_done_outlined from '@/assets/svg/icon_done_outlined.svg'
2727
28+
import { useUserStore } from '@/stores/user'
29+
30+
const userStore = useUserStore()
31+
2832
const { t } = useI18n()
2933
const multipleSelectionAll = ref<any[]>([])
3034
const tableList = ref([] as any[])
@@ -259,12 +263,16 @@ const delWorkspace = (row: any) => {
259263
customClass: 'confirm-no_icon',
260264
autofocus: false,
261265
}).then(() => {
262-
workspaceDelete(row.id).then(() => {
266+
workspaceDelete(row.id).then(async () => {
263267
ElMessage({
264268
type: 'success',
265269
message: t('dashboard.delete_success'),
266270
})
267271
init()
272+
if (row.id === userStore.getOid) {
273+
userStore.setOid('1')
274+
await userStore.info()
275+
}
268276
})
269277
})
270278
}

0 commit comments

Comments
 (0)