Skip to content

Commit 7402f4b

Browse files
authored
🤸 feat: update member role assign (#44)
1 parent 963062a commit 7402f4b

File tree

5 files changed

+114
-34
lines changed

5 files changed

+114
-34
lines changed

components.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ declare module 'vue' {
3232
NDatePicker: typeof import('naive-ui')['NDatePicker']
3333
NDialogProvider: typeof import('naive-ui')['NDialogProvider']
3434
NDropdown: typeof import('naive-ui')['NDropdown']
35+
NDynamicTags: typeof import('naive-ui')['NDynamicTags']
3536
NForm: typeof import('naive-ui')['NForm']
3637
NFormItem: typeof import('naive-ui')['NFormItem']
3738
NFormItemGi: typeof import('naive-ui')['NFormItemGi']
@@ -50,6 +51,7 @@ declare module 'vue' {
5051
NSpace: typeof import('naive-ui')['NSpace']
5152
NSpin: typeof import('naive-ui')['NSpin']
5253
NSwitch: typeof import('naive-ui')['NSwitch']
54+
NTag: typeof import('naive-ui')['NTag']
5355
NText: typeof import('naive-ui')['NText']
5456
NThing: typeof import('naive-ui')['NThing']
5557
NTooltip: typeof import('naive-ui')['NTooltip']

src/modules/HomeFront/components/CreateProjectForm.vue

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
:model="projectFormModel"
55
label-placement="top"
66
label-width="auto"
7+
class="max-h-600px overflow-y-auto"
78
>
89
<n-list>
910
<template #header>
@@ -79,18 +80,37 @@
7980
</div>
8081
</template>
8182
<n-list-item>
82-
<n-button @click="handleSelectMembers()">选择成员</n-button>
83-
<!-- <n-form-item
84-
path="memberList"
85-
>
86-
<n-input
87-
v-model:value="projectFormModel.memberList"
88-
/>
89-
</n-form-item> -->
83+
<n-space vertical>
84+
<n-form-item
85+
v-for="(userRoleItem, index) in userRoleMap"
86+
:key="index"
87+
label-placement="left"
88+
:label="userRoleItem.label + ':'"
89+
>
90+
<n-space>
91+
<n-tag
92+
v-for="(memberListRoleItem) in projectFormModel.memberList[userRoleItem.value]"
93+
:key="memberListRoleItem.userId"
94+
closable
95+
>
96+
{{ memberListRoleItem.username }}
97+
</n-tag>
98+
<n-button
99+
size="small"
100+
type="primary"
101+
dashed
102+
@click="handleSelectMembers(userRoleItem)"
103+
>
104+
添加
105+
</n-button>
106+
</n-space>
107+
<!-- <n-button @click="handleSelectMembers()">选择成员</n-button> -->
108+
</n-form-item>
109+
</n-space>
90110
</n-list-item>
91111
</n-list>
112+
<pre>{{ JSON.stringify(projectFormModel, null, 2) }}</pre>
92113
</n-form>
93-
<pre>{{ JSON.stringify(projectFormModel, null, 2) }}</pre>
94114

95115
</template>
96116

@@ -114,6 +134,10 @@ import {
114134
ProjectLevelMap
115135
} from '@/modules/HomeFront/data'
116136
137+
import {
138+
userRoleMap
139+
} from '@/modules/MemberTeam/data'
140+
117141
import MemberAssignCard from '@/modules/MemberTeam/components/MemberAssignCard.vue'
118142
119143
defineOptions({
@@ -129,7 +153,13 @@ const projectFormModel = ref<TypesHomeFront.TypeCreateProjectInfo>({
129153
projectDesc: '',
130154
startDate: null,
131155
endDate: null,
132-
memberList: ''
156+
memberList: {
157+
teamMember: [],
158+
teamLeader: [],
159+
projectManager: [],
160+
qualityManager: [],
161+
reviewManager: []
162+
}
133163
})
134164
135165
@@ -238,8 +268,12 @@ const projectBasicMap = shallowRef([
238268
}
239269
])
240270
241-
const handleSelectMembers = () => {
242-
const dd = window.$ModalDialog.create({
271+
const refMemberAsign = ref()
272+
const handleSelectMembers = (userRoleItem) => {
273+
const _member = reactive(
274+
projectFormModel.value.memberList[userRoleItem.value]
275+
)
276+
window.$ModalDialog.create({
243277
title: '选择成员',
244278
style: {
245279
maxWidth: '650px',
@@ -248,22 +282,15 @@ const handleSelectMembers = () => {
248282
maskClosable: false,
249283
closeOnEsc: false,
250284
content: () => h(
251-
MemberAssignCard
285+
MemberAssignCard,
286+
{
287+
ref: refMemberAsign,
288+
modelValue: _member
289+
}
252290
),
253291
positiveText: '确定',
254292
async onPositiveClick() {
255-
// const isValid = await instanceRef.value.validateRules()
256-
// if (!isValid) {
257-
// return Promise.reject()
258-
// }
259-
260-
// dd.loading = true
261-
// dd.positiveText = '提交中..'
262-
// await sleep(1000)
263-
264-
// dd.positiveText = _positiveText
265-
// dd.loading = false
266-
return Promise.reject()
293+
projectFormModel.value.memberList[userRoleItem.value] = refMemberAsign.value.checkedRowsRef
267294
}
268295
})
269296
}

src/modules/HomeFront/types/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { TypesMemberTeam } from '@/modules/MemberTeam/types'
2+
13
export type ProjectItem = {
24
id: string
35
project_code: string
@@ -9,6 +11,14 @@ export type ProjectItem = {
911

1012

1113
export namespace TypesHomeFront {
14+
export interface MemberRoleListMap {
15+
teamMember: Array<TypesMemberTeam.TypeMemberPerson>
16+
teamLeader: Array<TypesMemberTeam.TypeMemberPerson>
17+
projectManager: Array<TypesMemberTeam.TypeMemberPerson>
18+
qualityManager: Array<TypesMemberTeam.TypeMemberPerson>
19+
reviewManager: Array<TypesMemberTeam.TypeMemberPerson>
20+
}
21+
1222
export type TypeCreateProjectInfo = {
1323
/**
1424
* 项目名称
@@ -37,6 +47,6 @@ export namespace TypesHomeFront {
3747
/**
3848
* 成员映射表 Record
3949
*/
40-
memberList: any
50+
memberList: MemberRoleListMap
4151
}
4252
}

src/modules/MemberTeam/components/MemberAssignCard.vue

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,30 @@ import MemberAvatar from './MemberAvatar.vue'
110110
111111
const memberTeamStore = useMemberTeamStore()
112112
113+
const props = defineProps({
114+
modelValue: {
115+
type: Array as PropType<Array<TypesMemberTeam.TypeMemberPerson>>,
116+
default() {
117+
return []
118+
}
119+
}
120+
})
121+
122+
/**
123+
* 浅拷贝,防止原数据被修改
124+
*/
125+
const selectedMembers = props.modelValue.slice()
126+
127+
/**
128+
* 初始化已经勾选过的行状态
129+
*/
130+
const initSelectedMembers = () => {
131+
nextTick(() => {
132+
checkedRowKeysRef.value = selectedMembers.map((member) => member.userId)
133+
checkedRowsRef.value = selectedMembers
134+
})
135+
}
136+
initSelectedMembers()
113137
114138
/**
115139
* 构造行唯一 ID
@@ -122,8 +146,16 @@ const getRowKey = (row: TypesMemberTeam.TypeMemberPerson) => row.userId
122146
const checkedRowKeysRef = ref<Array<DataTableRowKey>>([])
123147
const checkedRowsRef = ref<Array<TypesMemberTeam.TypeMemberPerson>>([])
124148
125-
const handleUpdateCheckedRows = (keys, rows: Array<object>) => {
126-
checkedRowsRef.value = rows as Array<TypesMemberTeam.TypeMemberPerson>
149+
const handleUpdateCheckedRows = (keys, rows: Array<object>, meta) => {
150+
const isChecked = meta.action === 'check'
151+
const _row = meta.row as TypesMemberTeam.TypeMemberPerson
152+
153+
if (isChecked) {
154+
checkedRowsRef.value.push(_row)
155+
} else {
156+
const _index = checkedRowsRef.value.findIndex(checkedRow => checkedRow.userId === _row.userId)
157+
_index > -1 && checkedRowsRef.value.splice(_index, 1)
158+
}
127159
}
128160
129161
/**
@@ -191,6 +223,10 @@ const handleChangeSearch = _.debounce(
191223
200
192224
)
193225
226+
defineExpose({
227+
checkedRowsRef
228+
})
229+
194230
</script>
195231

196232
<style lang="scss">

src/modules/MemberTeam/data/index.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66

77
import memberAvatar from '@/assets/images/member-avatar.png'
88
import type { TypesMemberTeam } from '@/modules/MemberTeam/types'
9+
import type { TypesHomeFront } from '@/modules/HomeFront/types'
910

1011
/**
1112
* 随机获取数组中某一项
@@ -47,30 +48,34 @@ export const findUserRankMapByRankName = (targetRank) => {
4748
)!
4849
}
4950

51+
export interface UserRole {
52+
value: keyof TypesHomeFront.MemberRoleListMap
53+
label: string
54+
}
5055

5156

5257
/**
5358
* 角色映射表
5459
*/
55-
export const userRoleMap = [
60+
export const userRoleMap: Array<UserRole> = [
5661
{
57-
value: 'team_member',
62+
value: 'teamMember',
5863
label: '团队成员'
5964
},
6065
{
61-
value: 'team_leader',
66+
value: 'teamLeader',
6267
label: '现场负责人'
6368
},
6469
{
65-
value: 'project_manager',
70+
value: 'projectManager',
6671
label: '项目经理'
6772
},
6873
{
69-
value: 'quality_manager',
74+
value: 'qualityManager',
7075
label: '质控经理'
7176
},
7277
{
73-
value: 'review_manager',
78+
value: 'reviewManager',
7479
label: '复核经理'
7580
}
7681
]

0 commit comments

Comments
 (0)