manage-activity-table.vue
6.57 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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<script setup lang="ts">
import { computed, onMounted, ref } from 'vue';
import PageView from '@/components/page-view/index.vue';
import FilterSearch from '@/components/filter/search.vue';
import FilterSearchItem from '@/components/filter/search-item.vue';
import FilterTable from '@/components/filter/table.vue';
import { Input, Select, TableColumn, Link, Message, TableData } from '@arco-design/web-vue';
import { AnyObject } from '@/types/global';
import useLoading from '@/hooks/loading';
import useActivityApi, { useManagerApi } from '@/http/activity';
import useUserApi from '@/http/user';
import EnumTableColumn from '@/components/filter/enum-table-column.vue';
import NumberTableColumn from '@/components/filter/number-table-column.vue';
import SpaceTableColumn from '@/components/filter/space-table-column.vue';
import { createFormVNode, createModalVNode, createSelectionFormItemVNode } from '@/utils/createVNode';
import { useRoute } from 'vue-router';
import { isArray } from '@/utils/is';
import usePermission from '@/hooks/permission';
const { loading, setLoading } = useLoading(false);
const filter = ref({ projectName: '', songName: '', permission: '', activityStatus: '' });
const tableRef = ref();
const total = ref(0);
const props = defineProps<{ userKey: number }>();
const { statusOption } = useActivityApi;
const { permissionOption, update, destroy } = useManagerApi;
const formatPermission = (permission: any[]) =>
permission
.map((item) => `[${permissionOption.find((option) => option.value === item)?.label}]` || '')
.filter((item) => item.length !== 0)
.join('');
const onQuery = async (params?: AnyObject) => {
setLoading(true);
useUserApi
.manageSongs(props.userKey, { sortBy: 'activity_publish_at', sortType: 'desc' })
.then(({ meta }) => (total.value = meta.total));
return useUserApi
.manageSongs(props.userKey, { ...filter.value, ...params, sortBy: 'activity_publish_at', sortType: 'desc' })
.finally(() => setLoading(false));
};
const onSearch = () => tableRef.value?.onPageChange(1);
const onReset = () => {
filter.value = { projectName: '', songName: '', permission: '', activityStatus: '' };
onSearch();
};
onMounted(() => onReset());
defineExpose({ total });
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: (done: any) =>
update(record.id, { permission: formValue.value })
.then(() => {
Message.success('更新成功');
tableRef.value?.onFetch();
done(true);
})
.catch(() => done(false)),
}
);
};
const onDelete = (record: TableData) => {
createModalVNode(`确认移除此用户在歌曲《${record.activity_name}》的外部管理员身份?`, {
title: '删除操作',
onBeforeOk: (done: any) =>
destroy(record.id)
.then(() => {
Message.success('删除成功');
tableRef.value?.onFetch();
done(true);
})
.catch(() => done(false)),
});
};
const routeName = useRoute().name as string;
const checkPermission = (permission: string | string[]): boolean => {
permission = isArray(permission) ? permission.map((item) => `${routeName}-${item}`) : `${routeName}-${permission}`;
return usePermission().checkPermission(permission);
};
const hasPermission = computed(() => checkPermission(['manage-activity-edit', 'manage-activity-delete']));
</script>
<template>
<PageView>
<FilterSearch :loading="loading" :model="filter" @search="onSearch" @reset="onReset">
<FilterSearchItem label="厂牌名称" filed="projectName">
<Input v-model="filter.projectName" allow-clear placeholder="请输入" />
</FilterSearchItem>
<FilterSearchItem label="歌曲名称" filed="projectName">
<Input v-model="filter.songName" allow-clear placeholder="请输入" />
</FilterSearchItem>
<FilterSearchItem label="状态" filed="projectName">
<Select v-model="filter.activityStatus" :options="statusOption" allow-clear placeholder="请选择" />
</FilterSearchItem>
<FilterSearchItem label="外部权限" filed="projectName">
<Select v-model="filter.permission" :options="permissionOption" allow-clear placeholder="请选择" />
</FilterSearchItem>
</FilterSearch>
<FilterTable ref="tableRef" :loading="loading" :on-query="onQuery">
<TableColumn title="厂牌名称" data-index="project.name" :width="160" :ellipsis="true" :tooltip="true" />
<TableColumn title="歌曲名称" data-index="activity_name" :width="160" :ellipsis="true" :tooltip="true" />
<NumberTableColumn title="试听人数" data-index="view_count" :width="100" :dark-value="0" />
<NumberTableColumn title="收藏人数" data-index="like_count" :width="100" :dark-value="0" />
<NumberTableColumn title="提交人数" data-index="submit_work_count" :width="100" :dark-value="0" />
<TableColumn title="上架时间" data-index="activity_publish_at" :width="170" />
<TableColumn title="外部权限" data-index="permission" :width="200" :ellipsis="true" :tooltip="true">
<template #cell="{ record }"> {{ formatPermission(record.permission) }}</template>
</TableColumn>
<EnumTableColumn title="状态" data-index="activity_status" :option="statusOption" :width="120" />
<SpaceTableColumn v-if="hasPermission" :width="120" data-index="operations" title="操作" :tooltip="false" :ellipsis="false">
<template #default="{ record }">
<Link v-if="checkPermission('manage-activity-edit')" :hoverable="false" @click="onUpdate(record)">修改</Link>
<Link v-if="checkPermission('manage-activity-delete')" :hoverable="false" @click="onDelete(record)">取消管理</Link>
</template>
</SpaceTableColumn>
</FilterTable>
</PageView>
</template>
<style scoped lang="less"></style>