提交 | 用户 | age
|
00fe0e
|
1 |
<template> |
67287b
|
2 |
<PageWrapper> |
H |
3 |
<div style="height: calc(100vh - 84px)"> |
63d608
|
4 |
<div class="my-head"> |
67287b
|
5 |
<div class="left"> |
H |
6 |
<div class="left-box p-3"> |
|
7 |
<!-- 多选 --> |
|
8 |
<a-checkbox |
|
9 |
class="icon" |
|
10 |
style="margin-right: 10px" |
|
11 |
v-model:checked="state.checkAll" |
|
12 |
:indeterminate="state.indeterminate" |
|
13 |
@change="fnCheckedChange" |
|
14 |
></a-checkbox> |
|
15 |
<!--更新 --> |
|
16 |
<SyncOutlined class="icon" v-show="!checked" /> |
ccfd07
|
17 |
<pageHeadLeft |
H |
18 |
:checked="checked" |
|
19 |
:selectAllRow="selectAllRow" |
|
20 |
:parentTableList="newList" |
|
21 |
></pageHeadLeft> |
67287b
|
22 |
</div> |
H |
23 |
</div> |
|
24 |
|
|
25 |
<div class="right p-3" |
63d608
|
26 |
>共<span style="padding: 0 5px">{{page.total}}</span>封 |
67287b
|
27 |
<a-pagination |
H |
28 |
v-model:current="pageCurrent" |
63d608
|
29 |
v-model:page-size='page.limit' |
67287b
|
30 |
simple |
63d608
|
31 |
:total="page.total" |
67287b
|
32 |
style="margin-left: 10px" |
63d608
|
33 |
@change="handlePageChange" |
67287b
|
34 |
/> |
H |
35 |
<FilterOutlined style="margin-left: 10px" /> |
|
36 |
<a-popover placement="left" trigger="click"> |
|
37 |
<template #content> |
|
38 |
<div> |
|
39 |
<span>往来邮件聚合</span> |
|
40 |
<a-switch style="margin-left: 50px" v-model:checked="checked3"> </a-switch> |
|
41 |
</div> |
|
42 |
<a-divider style="margin: 10px" /> |
|
43 |
<div> |
|
44 |
<span>列表展示内容</span> |
|
45 |
</div> |
|
46 |
<div class="p-2"> |
|
47 |
<a-checkbox v-model:checked="checked">邮件摘要</a-checkbox> |
|
48 |
</div> |
|
49 |
<div class="p-2"> |
|
50 |
<a-checkbox v-model:checked="checked">附件</a-checkbox> |
|
51 |
</div> |
|
52 |
<div style="text-align: center"> |
|
53 |
<a-button @click="$router.push('/email/utils')">更多邮箱设置</a-button> |
|
54 |
</div> |
|
55 |
</template> |
|
56 |
<SettingOutlined style="margin-left: 10px" /> |
|
57 |
</a-popover> |
|
58 |
<a-switch style="margin-left: 10px" v-model:checked="checked3"> |
|
59 |
<template #checkedChildren><PushpinOutlined style="color: #0a6aff" /></template> |
|
60 |
<template #unCheckedChildren><PushpinOutlined /></template> |
|
61 |
</a-switch> |
00fe0e
|
62 |
</div> |
H |
63 |
</div> |
67287b
|
64 |
<div v-if="checked" class="left-bt p-3"> |
H |
65 |
已选择此页面上所有 20 封邮件 , 选择全部 335 封邮件 |
00fe0e
|
66 |
</div> |
67287b
|
67 |
<div class="p-4" style="height: 90%; overflow: hidden"> |
H |
68 |
<a-tabs v-model:activeKey="activeKey"> |
|
69 |
<a-tab-pane |
|
70 |
v-for="item in tabsList" |
|
71 |
:key="item.key" |
|
72 |
:tab="`${item.label}${item.num ? '(' + item.num + ')' : ''}`" |
|
73 |
style="height: 200px" |
|
74 |
> |
|
75 |
<Table |
|
76 |
ref="tableRef" |
|
77 |
:page="pageCurrent" |
12f730
|
78 |
:pageList="newList" |
67287b
|
79 |
@selectAll="fnSelectAll" |
H |
80 |
@updateSelectAll="updateSelectAll" |
|
81 |
/> |
|
82 |
</a-tab-pane> |
|
83 |
</a-tabs> |
|
84 |
</div> |
00fe0e
|
85 |
</div> |
H |
86 |
</PageWrapper> |
|
87 |
</template> |
|
88 |
|
|
89 |
<script lang="ts" setup> |
|
90 |
name: 'ListPage'; |
|
91 |
import { |
|
92 |
SyncOutlined, |
|
93 |
SettingOutlined, |
|
94 |
FilterOutlined, |
|
95 |
PushpinOutlined, |
|
96 |
} from '@ant-design/icons-vue'; |
12f730
|
97 |
import pageHeadLeft from './pageHeadLeft.vue'; |
67287b
|
98 |
import { PageWrapper } from '@/components/Page'; |
00fe0e
|
99 |
|
63d608
|
100 |
import { ref, watch, defineProps, defineEmits, computed, reactive, onMounted,inject } from 'vue'; |
00fe0e
|
101 |
|
H |
102 |
// 定义属性 |
|
103 |
interface Props { |
63d608
|
104 |
pageList?: []; |
H |
105 |
pageData?:any; |
00fe0e
|
106 |
} |
H |
107 |
const props = defineProps<Props>(); |
12f730
|
108 |
const newList = ref([]); |
H |
109 |
const selectAllRow = ref([]); |
|
110 |
watch( |
|
111 |
() => props.pageList, |
|
112 |
(newValue) => { |
|
113 |
newList.value = newValue; |
|
114 |
}, |
|
115 |
); |
00fe0e
|
116 |
|
63d608
|
117 |
const page = computed(() => props.pageData); |
74a35f
|
118 |
const checked = computed(() => selectAllRow.value.length > 0); |
00fe0e
|
119 |
const pageCurrent = ref(1); |
67287b
|
120 |
const tableRef = ref(); |
H |
121 |
const state = reactive({ |
|
122 |
indeterminate: false, |
|
123 |
checkAll: false, |
|
124 |
}); |
|
125 |
function fnCheckedChange(e) { |
|
126 |
Object.assign(state, { |
|
127 |
indeterminate: false, |
|
128 |
}); |
|
129 |
tableRef.value[0].fnSelectAll(e.target.checked); |
|
130 |
checked.value = e.target.checked; |
|
131 |
} |
|
132 |
function updateSelectAll(data) { |
12f730
|
133 |
selectAllRow.value = data.records; |
67287b
|
134 |
if (!data.isAll) { |
H |
135 |
state.indeterminate = true; |
|
136 |
state.checkAll = false; |
|
137 |
if (data.records.length === 0) { |
|
138 |
state.indeterminate = false; |
|
139 |
} |
|
140 |
} else { |
|
141 |
state.indeterminate = false; |
|
142 |
state.checkAll = true; |
|
143 |
} |
|
144 |
} |
00fe0e
|
145 |
const tabsList = computed(() => { |
H |
146 |
return [ |
|
147 |
{ |
|
148 |
key: '1', |
|
149 |
label: '全部', |
63d608
|
150 |
num: 0, |
00fe0e
|
151 |
}, |
H |
152 |
{ |
|
153 |
key: '2', |
|
154 |
label: '客户', |
63d608
|
155 |
num: 0, |
00fe0e
|
156 |
}, |
H |
157 |
{ |
|
158 |
key: '3', |
|
159 |
label: '同事', |
|
160 |
num: 0, |
|
161 |
}, |
|
162 |
{ |
|
163 |
key: '4', |
|
164 |
label: '通讯录', |
|
165 |
num: 0, |
|
166 |
}, |
|
167 |
{ |
|
168 |
key: '5', |
|
169 |
label: '其他', |
63d608
|
170 |
num: 0, |
00fe0e
|
171 |
}, |
H |
172 |
]; |
|
173 |
}); |
|
174 |
const activeKey = ref('1'); |
67287b
|
175 |
const checked3 = ref(false); |
00fe0e
|
176 |
import Table from './table.vue'; |
67287b
|
177 |
onMounted(() => { |
H |
178 |
console.log('tableRef:', tableRef.value[0]); |
|
179 |
}); |
|
180 |
function fnSelectAll() { |
|
181 |
console.log('44444444444'); |
|
182 |
} |
63d608
|
183 |
const emit = defineEmits(['pageChange']); |
H |
184 |
defineExpose({ |
|
185 |
fnSelectAll, |
|
186 |
}); |
|
187 |
|
|
188 |
const getDataList = inject('getDataList'); |
|
189 |
function handlePageChange(page, pageSize){ |
|
190 |
getDataList(page) |
|
191 |
|
|
192 |
} |
00fe0e
|
193 |
</script> |
H |
194 |
<style scoped lang="less"> |
63d608
|
195 |
.my-head { |
00fe0e
|
196 |
display: flex; |
63d608
|
197 |
align-items: center; |
00fe0e
|
198 |
justify-content: space-between; |
H |
199 |
width: 100%; |
63d608
|
200 |
height: 60px; |
00fe0e
|
201 |
border-bottom: 1px solid rgb(5 5 5 / 6%); |
H |
202 |
|
|
203 |
/* 增加选择器特异性 */ |
|
204 |
& .left { |
|
205 |
width: 20%; |
|
206 |
|
|
207 |
& .left-box { |
|
208 |
display: flex; |
|
209 |
align-items: center; |
|
210 |
justify-content: space-flex-start; |
|
211 |
width: 100%; |
63d608
|
212 |
height: 100%;; |
00fe0e
|
213 |
|
H |
214 |
& .icon { |
|
215 |
margin-right: 15px; |
|
216 |
font-size: 16px; |
|
217 |
} |
|
218 |
} |
|
219 |
} |
|
220 |
|
|
221 |
& .right { |
|
222 |
display: flex; |
|
223 |
align-items: center; |
|
224 |
} |
|
225 |
} |
|
226 |
|
|
227 |
.left-bt { |
|
228 |
display: flex; |
|
229 |
align-items: center; |
|
230 |
justify-content: center; |
|
231 |
padding-left: 27px; |
|
232 |
background: #fffbe6; |
|
233 |
} |
|
234 |
</style> |