out-form-content.vue
4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<script setup lang="ts">
import { Link, Message, TableData } from '@arco-design/web-vue';
import { computed, onMounted, ref } from 'vue';
import FilterTable from '@/components/filter/table.vue';
import FilterTableColumn from '@/components/filter/table-column.vue';
import EnumTableColumn from '@/components/filter/enum-table-column.vue';
import SpaceTableColumn from '@/components/filter/space-table-column.vue';
import useLoading from '@/hooks/loading';
import { AnyObject } from '@/types/global';
import useUserApi from '@/http/user';
import useActivityApi, { useManagerApi } from '@/http/activity';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { User, UserManageActivity } from '@/utils/model';
import { createFormVNode, createModalVNode, createSelectionFormItemVNode } from '@/utils/createVNode';
import usePermission from '@/hooks/permission';
import { promiseToBoolean } from '@/utils';
const props = defineProps<{ projectKey: number; user: User }>();
const { loading, setLoading } = useLoading(false);
const { permissionOption } = useManagerApi;
const { statusOption } = useActivityApi;
const tableRef = ref();
const onQuery = async (params: AnyObject) => {
setLoading(true);
return useUserApi.manageSongs(props.user.id, { project_id: props.projectKey, ...params }).finally(() => setLoading(false));
};
onMounted(() => tableRef.value?.onPageChange(1));
const label = computed(() => `${props.user.nick_name} 管理歌曲共:${tableRef.value?.getCount()} 首`);
const formatPermission = (permission: any[]) =>
permission
.map((item) => `[${permissionOption.find((option) => option.value === item)?.label}]` || '')
.filter((item) => item.length !== 0)
.join('');
const onUpdate = (record: TableData) => {
const formValue = ref<string[]>(record?.permission || ['view']);
return createModalVNode(
() =>
createFormVNode(
{ layout: 'vertical', model: {} },
createSelectionFormItemVNode(
formValue,
permissionOption,
{ label: '设置用户权限', rowClass: 'mb-0' },
{
'multiple': true,
'onUpdate:modelValue': (val?: string[]) => {
if (!val?.includes('view')) {
val?.unshift('view');
}
formValue.value = val || [];
},
}
)
),
{
title: '修改',
titleAlign: 'center',
onBeforeOk: () => promiseToBoolean(useManagerApi.update(record.id, { permission: formValue.value })),
onOk: () => {
Message.success('更新成功');
tableRef.value?.onFetch();
},
}
);
};
const onDelete = (record: TableData) => {
createModalVNode(`确认取消用户:${props.user?.nick_name} 的外部管理员身份`, {
title: '删除操作',
onBeforeOk: () => promiseToBoolean(useManagerApi.destroy(record.id)),
onOk: () => {
Message.success('删除成功');
tableRef.value?.onFetch();
},
});
};
</script>
<template>
<div style="margin-bottom: 10px">{{ label }}</div>
<FilterTable ref="tableRef" :loading="loading" :on-query="onQuery">
<FilterTableColumn title="厂牌名称" data-index="project.name" :width="120" />
<FilterTableColumn title="歌曲名称" data-index="activity_name" :width="160" />
<FilterTableColumn title="权限" data-index="permission" :width="240">
<template #default="{ record }: { record: UserManageActivity }">{{ formatPermission(record.permission) }}</template>
</FilterTableColumn>
<EnumTableColumn title="状态" data-index="activity_status" :width="100" :option="statusOption" />
<SpaceTableColumn
v-if="usePermission().checkPermission(['audition-project-show-out-manage-edit', 'audition-project-show-out-manage-delete'])"
title="操作"
:width="120"
>
<template #default="{ record }">
<Link v-permission="['audition-project-show-out-manage-edit']" class="link-hover" :hoverable="false" @click="onUpdate(record)">
修改
</Link>
<Link v-permission="['audition-project-show-out-manage-delete']" class="link-hover" :hoverable="false" @click="onDelete(record)">
取消管理
</Link>
</template>
</SpaceTableColumn>
</FilterTable>
</template>
<style scoped lang="less"></style>