@@ -17,93 +17,57 @@ import {
17
17
VLoading ,
18
18
Toast ,
19
19
} from " @halo-dev/components" ;
20
- import { onMounted , ref , watch } from " vue" ;
21
- import type { ListedSinglePageList , SinglePage } from " @halo-dev/api-client" ;
20
+ import { ref , watch } from " vue" ;
21
+ import type { ListedSinglePage , SinglePage } from " @halo-dev/api-client" ;
22
22
import { apiClient } from " @/utils/api-client" ;
23
23
import { formatDatetime } from " @/utils/date" ;
24
- import { onBeforeRouteLeave , RouterLink } from " vue-router" ;
24
+ import { RouterLink } from " vue-router" ;
25
25
import cloneDeep from " lodash.clonedeep" ;
26
26
import { usePermission } from " @/utils/permission" ;
27
27
import { getNode } from " @formkit/core" ;
28
28
import FilterTag from " @/components/filter/FilterTag.vue" ;
29
+ import { useQuery } from " @tanstack/vue-query" ;
29
30
30
31
const { currentUserHasPermission } = usePermission ();
31
32
32
- const singlePages = ref <ListedSinglePageList >({
33
- page: 1 ,
34
- size: 50 ,
35
- total: 0 ,
36
- items: [],
37
- first: true ,
38
- last: false ,
39
- hasNext: false ,
40
- hasPrevious: false ,
41
- totalPages: 0 ,
42
- });
43
- const loading = ref (false );
44
33
const selectedPageNames = ref <string []>([]);
45
34
const checkedAll = ref (false );
46
- const refreshInterval = ref ();
47
35
const keyword = ref (" " );
48
36
49
- const handleFetchSinglePages = async (options ?: {
50
- mute?: boolean ;
51
- page ?: number ;
52
- }) => {
53
- try {
54
- clearInterval (refreshInterval .value );
55
-
56
- if (! options ?.mute ) {
57
- loading .value = true ;
58
- }
59
-
60
- if (options ?.page ) {
61
- singlePages .value .page = options .page ;
62
- }
37
+ const page = ref (1 );
38
+ const size = ref (20 );
39
+ const total = ref (0 );
63
40
41
+ const {
42
+ data : singlePages,
43
+ isLoading,
44
+ isFetching,
45
+ refetch,
46
+ } = useQuery <ListedSinglePage []>({
47
+ queryKey: [" deleted-singlePages" , page , size , keyword ],
48
+ queryFn : async () => {
64
49
const { data } = await apiClient .singlePage .listSinglePages ({
65
50
labelSelector: [` content.halo.run/deleted=true ` ],
66
- page: singlePages .value . page ,
67
- size: singlePages .value . size ,
51
+ page: page .value ,
52
+ size: size .value ,
68
53
keyword: keyword .value ,
69
54
});
70
55
71
- singlePages .value = data ;
56
+ total .value = data . total ;
72
57
73
- const deletedSinglePages = singlePages .value .items .filter (
58
+ return data .items ;
59
+ },
60
+ refetchOnWindowFocus: false ,
61
+ refetchInterval(data ) {
62
+ const deletedSinglePages = data ?.filter (
74
63
(singlePage ) =>
75
64
!! singlePage .page .metadata .deletionTimestamp ||
76
65
! singlePage .page .spec .deleted
77
66
);
78
-
79
- if (deletedSinglePages .length ) {
80
- refreshInterval .value = setInterval (() => {
81
- handleFetchSinglePages ({ mute: true });
82
- }, 3000 );
83
- }
84
- } catch (error ) {
85
- console .error (" Failed to fetch deleted single pages" , error );
86
- } finally {
87
- loading .value = false ;
88
- }
89
- };
90
-
91
- onBeforeRouteLeave (() => {
92
- clearInterval (refreshInterval .value );
67
+ return deletedSinglePages ?.length ? 3000 : false ;
68
+ },
93
69
});
94
70
95
- const handlePaginationChange = ({
96
- page ,
97
- size ,
98
- }: {
99
- page: number ;
100
- size: number ;
101
- }) => {
102
- singlePages .value .page = page ;
103
- singlePages .value .size = size ;
104
- handleFetchSinglePages ();
105
- };
106
-
107
71
const checkSelection = (singlePage : SinglePage ) => {
108
72
return selectedPageNames .value .includes (singlePage .metadata .name );
109
73
};
@@ -113,7 +77,7 @@ const handleCheckAllChange = (e: Event) => {
113
77
114
78
if (checked ) {
115
79
selectedPageNames .value =
116
- singlePages .value . items .map ((singlePage ) => {
80
+ singlePages .value ? .map ((singlePage ) => {
117
81
return singlePage .page .metadata .name ;
118
82
}) || [];
119
83
} else {
@@ -132,7 +96,7 @@ const handleDeletePermanently = async (singlePage: SinglePage) => {
132
96
name: singlePage .metadata .name ,
133
97
}
134
98
);
135
- await handleFetchSinglePages ();
99
+ await refetch ();
136
100
137
101
Toast .success (" 删除成功" );
138
102
},
@@ -154,7 +118,7 @@ const handleDeletePermanentlyInBatch = async () => {
154
118
);
155
119
})
156
120
);
157
- await handleFetchSinglePages ();
121
+ await refetch ();
158
122
selectedPageNames .value = [];
159
123
160
124
Toast .success (" 删除成功" );
@@ -175,7 +139,7 @@ const handleRecovery = async (singlePage: SinglePage) => {
175
139
singlePage: singlePageToUpdate ,
176
140
}
177
141
);
178
- await handleFetchSinglePages ();
142
+ await refetch ();
179
143
180
144
Toast .success (" 恢复成功" );
181
145
},
@@ -189,24 +153,29 @@ const handleRecoveryInBatch = async () => {
189
153
onConfirm : async () => {
190
154
await Promise .all (
191
155
selectedPageNames .value .map ((name ) => {
192
- const singlePage = singlePages .value . items .find (
156
+ const singlePage = singlePages .value ? .find (
193
157
(item ) => item .page .metadata .name === name
194
158
)?.page ;
195
159
196
160
if (! singlePage ) {
197
161
return Promise .resolve ();
198
162
}
199
163
200
- singlePage .spec .deleted = false ;
201
164
return apiClient .extension .singlePage .updatecontentHaloRunV1alpha1SinglePage (
202
165
{
203
166
name: singlePage .metadata .name ,
204
- singlePage: singlePage ,
167
+ singlePage: {
168
+ ... singlePage ,
169
+ spec: {
170
+ ... singlePage .spec ,
171
+ deleted: false ,
172
+ },
173
+ },
205
174
}
206
175
);
207
176
})
208
177
);
209
- await handleFetchSinglePages ();
178
+ await refetch ();
210
179
selectedPageNames .value = [];
211
180
212
181
Toast .success (" 恢复成功" );
@@ -215,23 +184,21 @@ const handleRecoveryInBatch = async () => {
215
184
};
216
185
217
186
watch (selectedPageNames , (newValue ) => {
218
- checkedAll .value = newValue .length === singlePages .value . items ?.length ;
187
+ checkedAll .value = newValue .length === singlePages .value ?.length ;
219
188
});
220
189
221
- onMounted (handleFetchSinglePages );
222
-
223
190
// Filters
224
191
function handleKeywordChange() {
225
192
const keywordNode = getNode (" keywordInput" );
226
193
if (keywordNode ) {
227
194
keyword .value = keywordNode ._value as string ;
228
195
}
229
- handleFetchSinglePages ({ page: 1 }) ;
196
+ page . value = 1 ;
230
197
}
231
198
232
199
function handleClearKeyword() {
233
200
keyword .value = " " ;
234
- handleFetchSinglePages ({ page: 1 }) ;
201
+ page . value = 1 ;
235
202
}
236
203
</script >
237
204
@@ -307,10 +274,10 @@ function handleClearKeyword() {
307
274
<div class =" flex flex-row gap-2" >
308
275
<div
309
276
class =" group cursor-pointer rounded p-1 hover:bg-gray-200"
310
- @click =" handleFetchSinglePages ()"
277
+ @click =" refetch ()"
311
278
>
312
279
<IconRefreshLine
313
- :class =" { 'animate-spin text-gray-900': loading }"
280
+ :class =" { 'animate-spin text-gray-900': isFetching }"
314
281
class =" h-4 w-4 text-gray-600 group-hover:text-gray-900"
315
282
/>
316
283
</div >
@@ -320,15 +287,15 @@ function handleClearKeyword() {
320
287
</div >
321
288
</div >
322
289
</template >
323
- <VLoading v-if =" loading " />
324
- <Transition v-else-if =" !singlePages.items .length" appear name =" fade" >
290
+ <VLoading v-if =" isLoading " />
291
+ <Transition v-else-if =" !singlePages? .length" appear name =" fade" >
325
292
<VEmpty
326
293
message =" 你可以尝试刷新或者返回自定义页面管理"
327
294
title =" 没有自定义页面被放入回收站"
328
295
>
329
296
<template #actions >
330
297
<VSpace >
331
- <VButton @click =" handleFetchSinglePages " >刷新</VButton >
298
+ <VButton @click =" refetch " >刷新</VButton >
332
299
<VButton
333
300
v-permission =" ['system:singlepages:view']"
334
301
:route =" { name: 'SinglePages' }"
@@ -345,7 +312,7 @@ function handleClearKeyword() {
345
312
class =" box-border h-full w-full divide-y divide-gray-100"
346
313
role =" list"
347
314
>
348
- <li v-for =" (singlePage, index) in singlePages.items " :key =" index" >
315
+ <li v-for =" (singlePage, index) in singlePages" :key =" index" >
349
316
<VEntity :is-selected =" checkSelection(singlePage.page)" >
350
317
<template
351
318
v-if =" currentUserHasPermission ([' system:singlepages:manage' ])"
@@ -445,11 +412,10 @@ function handleClearKeyword() {
445
412
<template #footer >
446
413
<div class =" bg-white sm:flex sm:items-center sm:justify-end" >
447
414
<VPagination
448
- :page =" singlePages. page"
449
- :size =" singlePages. size"
450
- :total =" singlePages. total"
415
+ v-model :page =" page"
416
+ v-model :size =" size"
417
+ :total =" total"
451
418
:size-options =" [20, 30, 50, 100]"
452
- @change =" handlePaginationChange"
453
419
/>
454
420
</div >
455
421
</template >
0 commit comments