Skip to content

Commit b602ec4

Browse files
committed
feat: sort posts in post manager page
1 parent ddd1b02 commit b602ec4

3 files changed

Lines changed: 51 additions & 4 deletions

File tree

src/admin/autofill.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<div class="autocomplete-container">
33
<div class="search-box">
4-
<input v-model="searchQuery" type="text" class="search-input" placeholder="请输入关键词..." @focus="showSuggestions = true"
4+
<input v-model="searchQuery" type="text" class="search-input" :placeholder="placeholder" @focus="showSuggestions = true"
55
@blur="handleBlur" @keydown.down="moveDown" @keydown.up="moveUp" @keydown.enter="selectItem" />
66
</div>
77

@@ -45,6 +45,10 @@
4545
clearAfterSelect: {
4646
type: Boolean,
4747
default: false
48+
},
49+
placeholder: {
50+
type: String,
51+
default: '请输入关键词...'
4852
}
4953
})
5054

src/admin/postlist.vue

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@
3737
</div>
3838
</div>
3939

40+
<!-- 排序方式 -->
41+
<div class="sort-by">
42+
<Autofill
43+
v-model="sortBy"
44+
:options="['创建日期', '创建日期(反向)', '标题', '标题(反向)', '']"
45+
placeholder="排序方式"
46+
@select="sortBy = $event as any"
47+
/>
48+
</div>
49+
4050
<div v-for="post in filteredPosts" :key="post.name" class="post-item" @click="toggleDetails(post.name, post)"
4151
@dblclick="emit('navigate', post)">
4252
<div class="post-header">
@@ -87,7 +97,9 @@
8797
const searchQuery = ref('')
8898
const selectedCategory = ref<string | null>(null)
8999
const selectedTags = ref<string[]>([])
90-
const tagQuery = ref('')
100+
const tagQuery = ref('');
101+
// XXX: 使用中文作为sort类型不优雅,后续改进
102+
const sortBy = ref<'创建日期' | '创建日期(反向)' | '标题' | '标题(反向)' | ''>('');
91103
const dateRange = ref<[Date | null, Date | null]>([null, null])
92104
93105
// 提取所有分类
@@ -98,7 +110,7 @@
98110
99111
// 筛选后的文章列表
100112
const filteredPosts = computed(() => {
101-
return posts.filter(post => {
113+
const post_sorted = posts.filter(post => {
102114
// 标题搜索
103115
if(searchQuery.value && !post.title.toLowerCase().includes(searchQuery.value.toLowerCase())) {
104116
return false
@@ -121,6 +133,26 @@
121133
}
122134
return true
123135
})
136+
if(sortBy.value != ''){
137+
let sortFn: (a: IPost, b: IPost) => number;
138+
switch(sortBy.value){
139+
case '创建日期':
140+
sortFn = (a, b) => a.created - b.created;
141+
break;
142+
case '创建日期(反向)':
143+
sortFn = (a, b) => b.created - a.created;
144+
break;
145+
case '标题':
146+
sortFn = (a, b) => a.title.localeCompare(b.title);
147+
break;
148+
case '标题(反向)':
149+
sortFn = (a, b) => b.title.localeCompare(a.title);
150+
break;
151+
}
152+
return post_sorted.sort(sortFn)
153+
}else{
154+
return post_sorted;
155+
}
124156
})
125157
126158
const handleDelete = (postName: string) => {
@@ -156,7 +188,6 @@
156188
}
157189
158190
.filter-controls {
159-
margin-bottom: 2rem;
160191
padding: 1.5rem;
161192
background-color: #f8f9fa;
162193
border-radius: 0.8rem;
@@ -216,6 +247,17 @@
216247
background-color: #ffcdd2;
217248
}
218249
250+
.sort-by {
251+
margin-bottom: 1rem;
252+
}
253+
254+
.sort-by > div {
255+
float: right;
256+
background: #fbfbfb;
257+
padding: .5rem 1rem;
258+
border-radius: .75rem;
259+
}
260+
219261
.post-item {
220262
background-color: #ffffff;
221263
border-radius: 1.2rem;

src/admin/write-post.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
update_post(post, muya.getMarkdown());
105105
alert('保存成功');
106106
el('save');
107+
modified.value = false;
107108
}
108109
109110
const REPManager = {

0 commit comments

Comments
 (0)