Skip to content

Commit a76c561

Browse files
committed
feat: workspace dropdown
1 parent b6fb059 commit a76c561

File tree

12 files changed

+194
-67
lines changed

12 files changed

+194
-67
lines changed

ui/src/api/workspace.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import type { pageRequest, PageList } from '@/api/type/common'
66

77
const prefix = '/system/workspace'
88

9+
/**
10+
* 获取首页的工作空间下拉列表
11+
*/
12+
const getWorkspaceListByUser: (loading?: Ref<boolean>) => Promise<Result<WorkspaceItem[]>> = (loading) => {
13+
return get('/workspace/by_user', undefined, loading)
14+
}
15+
916
/**
1017
* 获取添加成员时的工作空间下拉列表
1118
*/
@@ -30,6 +37,16 @@ const CreateOrUpdateWorkspace: (
3037
return post(`${prefix}`, data, undefined, loading)
3138
}
3239

40+
/**
41+
* 删除工作空间前的校验
42+
*/
43+
const deleteWorkspaceCheck: (workspace_id: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
44+
workspace_id,
45+
loading,
46+
) => {
47+
return get(`${prefix}/${workspace_id}/check`, undefined, loading)
48+
}
49+
3350
/**
3451
* 删除工作空间
3552
*/
@@ -94,4 +111,6 @@ export default {
94111
CreateWorkspaceMember,
95112
deleteWorkspaceMember,
96113
getWorkspaceRoleList,
114+
getWorkspaceListByUser,
115+
deleteWorkspaceCheck
97116
}

ui/src/layout/layout-header/UserHeader.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
<div class="logo mt-4">
55
<LogoFull />
66
</div>
7+
<el-divider direction="vertical" class="ml-24 mr-24" />
8+
<Workspace />
79
<div class="flex-between w-full">
810
<div></div>
911
<TopMenu></TopMenu>
@@ -16,6 +18,7 @@
1618
import TopMenu from './top-menu/index.vue'
1719
import Avatar from './avatar/index.vue'
1820
import TopAbout from './top-about/index.vue'
21+
import Workspace from './workspace/index.vue'
1922
import { useRouter } from 'vue-router'
2023
2124
const router = useRouter()
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<template>
2+
<el-dropdown placement="bottom-start">
3+
<el-button text>
4+
<AppIcon iconName="app-wordspace" style="font-size: 18px"></AppIcon>
5+
<span class="dropdown-title ellipsis">
6+
{{ currentWorkspace?.name }}
7+
</span>
8+
<el-icon class="el-icon--right">
9+
<CaretBottom />
10+
</el-icon>
11+
</el-button>
12+
<template #dropdown>
13+
<el-dropdown-menu v-loading="loading">
14+
<el-dropdown-item v-for="item in workspaceList" :key="item.id"
15+
:class="item.id === currentWorkspace?.id ? 'active' : ''" @click="changeWorkspace(item)">
16+
<AppIcon class="mr-8" iconName="app-wordspace" style="font-size: 16px"></AppIcon>
17+
<span class="dropdown-item ellipsis">
18+
{{ item.name }}
19+
</span>
20+
<el-icon v-show="item.id === currentWorkspace?.id" class="ml-8" style="font-size: 16px;margin-right: 0;">
21+
<Check />
22+
</el-icon>
23+
</el-dropdown-item>
24+
</el-dropdown-menu>
25+
</template>
26+
</el-dropdown>
27+
</template>
28+
29+
<script setup lang="ts">
30+
import { onBeforeMount, ref } from 'vue'
31+
import WorkspaceApi from '@/api/workspace'
32+
import type { WorkspaceItem } from '@/api/type/workspace'
33+
34+
const loading = ref(false)
35+
const workspaceList = ref<WorkspaceItem[]>([])
36+
const currentWorkspace = ref()
37+
38+
async function getWorkspaceList() {
39+
try {
40+
const res = await WorkspaceApi.getWorkspaceListByUser(loading);
41+
workspaceList.value = res.data
42+
} catch (e) {
43+
console.error(e);
44+
}
45+
}
46+
47+
onBeforeMount(async () => {
48+
await getWorkspaceList()
49+
const id = localStorage.getItem('workspace_id') ?? 'default'
50+
currentWorkspace.value = workspaceList.value.find(item => item.id === id)
51+
})
52+
53+
function changeWorkspace(item: WorkspaceItem) {
54+
if (item.id === currentWorkspace.value.id) return
55+
currentWorkspace.value = item
56+
localStorage.setItem('workspace_id', item.id as string)
57+
window.location.reload()
58+
}
59+
</script>
60+
<style lang="scss" scoped>
61+
:deep(.el-button.is-text) {
62+
color: var(--el-text-color-primary);
63+
max-height: 32px;
64+
}
65+
66+
.dropdown-title {
67+
max-width: 155px;
68+
font-size: 14px;
69+
}
70+
71+
.dropdown-item {
72+
max-width: 230px;
73+
}
74+
75+
:deep(.el-dropdown-menu__item.active) {
76+
color: var(--el-color-primary);
77+
}
78+
</style>

ui/src/locales/lang/en-US/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default {
1818
modifySuccess: 'Successful',
1919
cancel: 'Cancel',
2020
confirm: 'OK',
21+
close: 'Close',
2122
tip: 'Tips',
2223
add: 'Add',
2324
refresh: 'Refresh',
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
export default {
2-
// TODO
3-
title: '工作空间',
4-
list: '工作空间列表',
5-
name: '工作空间名称',
2+
title: 'Workspace',
3+
list: 'Workspace list',
4+
name: 'Workspace name',
5+
delete: {
6+
confirmTitle: 'Confirm to delete workspace:',
7+
confirmContent: 'After deletion, all members in this space will be removed. Please proceed with caution.',
8+
confirmContentNotDelete: 'This workspace contains knowledge base resources and application resources, and cannot be deleted.',
9+
},
610
member: {
711
delete: {
8-
confirmTitle: '是否移除成员:',
12+
confirmTitle: 'Confirm to remove member:',
913
}
1014
}
11-
}
15+
};

ui/src/locales/lang/zh-CN/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default {
2020
addSuccess: '添加成功',
2121
cancel: '取消',
2222
confirm: '确定',
23+
close: '关闭',
2324
tip: '提示',
2425
refresh: '刷新',
2526
search: '搜索',

ui/src/locales/lang/zh-CN/views/workspace.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ export default {
22
title: '工作空间',
33
list: '工作空间列表',
44
name: '工作空间名称',
5+
delete: {
6+
confirmTitle: '是否删除工作空间:',
7+
confirmContent: '删除后,该空间下的成员都会被移除,请谨慎操作。',
8+
confirmContentNotDelete: '该工作空间下存在 知识库资源、应用资源,无法删除。',
9+
},
510
member: {
611
delete: {
712
confirmTitle: '是否移除成员:',

ui/src/locales/lang/zh-Hant/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default {
1818
modifySuccess: '修改成功',
1919
cancel: '取消',
2020
confirm: '確認',
21+
close: '關閉',
2122
tip: '提示',
2223
add: '新增',
2324
refresh: '重新整理',
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
export default {
2-
// TODO
3-
title: '工作空间',
4-
list: '工作空间列表',
5-
name: '工作空间名称',
2+
title: '工作空間',
3+
list: '工作空間列表',
4+
name: '工作空間名稱',
5+
delete: {
6+
confirmTitle: '是否刪除工作空間:',
7+
confirmContent: '刪除後,該空間下的成員都會被移除,請謹慎操作。',
8+
confirmContentNotDelete: '該工作空間下存在知識庫資源、應用資源,無法刪除。',
9+
},
610
member: {
711
delete: {
8-
confirmTitle: '是否移除成员:',
12+
confirmTitle: '是否移除成員:',
913
}
1014
}
11-
}
15+
};

ui/src/views/role/component/Member.vue

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,44 +6,42 @@
66
</el-button>
77
<div class="flex complex-search">
88
<el-select class="complex-search__left" v-model="searchType" style="width: 120px">
9-
<el-option :label="$t('views.login.loginForm.username.label')" value="username"/>
9+
<el-option :label="$t('views.login.loginForm.username.label')" value="username" />
1010
</el-select>
1111
<el-input v-if="searchType === 'username'" v-model="searchForm.username" @change="getList"
12-
:placeholder="$t('common.inputPlaceholder')" style="width: 220px" clearable/>
12+
:placeholder="$t('common.inputPlaceholder')" style="width: 220px" clearable />
1313
</div>
1414
</div>
15-
<app-table class="mt-16" :data="tableData" :pagination-config="paginationConfig"
16-
@sizeChange="handleSizeChange"
17-
@changePage="getList" v-loading="loading">
18-
<el-table-column prop="nick_name" :label="$t('views.userManage.form.nick_name.label')"/>
19-
<el-table-column prop="username" :label="$t('views.userManage.form.username.label')"/>
20-
<el-table-column prop="workspace_name" :label="$t('views.role.member.workspace')"
21-
v-if="currentRole?.type !==RoleTypeEnum.ADMIN"/>
15+
<app-table class="mt-16" :data="tableData" :pagination-config="paginationConfig" @sizeChange="handleSizeChange"
16+
@changePage="getList" v-loading="loading">
17+
<el-table-column prop="nick_name" :label="$t('views.userManage.userForm.nick_name.label')" />
18+
<el-table-column prop="username" :label="$t('views.login.loginForm.username.label')" />
19+
<el-table-column v-if="props.currentRole?.type !== RoleTypeEnum.ADMIN" prop="workspace_name"
20+
:label="$t('views.role.member.workspace')" />
2221
<el-table-column :label="$t('common.operation')" width="100" fixed="right">
2322
<template #default="{ row }">
24-
<el-tooltip effect="dark" :content="`${$t('views.role.member.delete.button')}`"
25-
placement="top">
23+
<el-tooltip effect="dark" :content="`${$t('views.role.member.delete.button')}`" placement="top">
2624
<el-button type="primary" text @click.stop="handleDelete(row)">
2725
<el-icon>
28-
<Delete/>
26+
<Delete />
2927
</el-icon>
3028
</el-button>
3129
</el-tooltip>
3230
</template>
3331
</el-table-column>
3432
</app-table>
3533
</div>
36-
<AddMemberDrawer ref="addMemberDrawerRef" :currentRole="props.currentRole" @refresh="getList"/>
34+
<AddMemberDrawer ref="addMemberDrawerRef" :currentRole="props.currentRole" @refresh="getList" />
3735
</template>
3836

3937
<script setup lang="ts">
40-
import {onMounted, ref, reactive, watch} from 'vue'
38+
import { onMounted, ref, reactive, watch } from 'vue'
4139
import RoleApi from '@/api/system/role'
42-
import type {RoleItem, RoleMemberItem} from '@/api/type/role'
43-
import {MsgSuccess, MsgConfirm} from '@/utils/message'
44-
import {t} from '@/locales'
40+
import type { RoleItem, RoleMemberItem } from '@/api/type/role'
41+
import { MsgSuccess, MsgConfirm } from '@/utils/message'
42+
import { t } from '@/locales'
4543
import AddMemberDrawer from './AddMemberDrawer.vue'
46-
import {RoleTypeEnum} from "@/enums/system.ts";
44+
import { RoleTypeEnum } from '@/enums/system'
4745
4846
const props = defineProps<{
4947
currentRole?: RoleItem

0 commit comments

Comments
 (0)