|
37 | 37 | </div> |
38 | 38 | </div> |
39 | 39 |
|
| 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 | +
|
40 | 50 | <div v-for="post in filteredPosts" :key="post.name" class="post-item" @click="toggleDetails(post.name, post)" |
41 | 51 | @dblclick="emit('navigate', post)"> |
42 | 52 | <div class="post-header"> |
|
87 | 97 | const searchQuery = ref('') |
88 | 98 | const selectedCategory = ref<string | null>(null) |
89 | 99 | const selectedTags = ref<string[]>([]) |
90 | | - const tagQuery = ref('') |
| 100 | + const tagQuery = ref(''); |
| 101 | + // XXX: 使用中文作为sort类型不优雅,后续改进 |
| 102 | + const sortBy = ref<'创建日期' | '创建日期(反向)' | '标题' | '标题(反向)' | '无'>('无'); |
91 | 103 | const dateRange = ref<[Date | null, Date | null]>([null, null]) |
92 | 104 |
|
93 | 105 | // 提取所有分类 |
|
98 | 110 |
|
99 | 111 | // 筛选后的文章列表 |
100 | 112 | const filteredPosts = computed(() => { |
101 | | - return posts.filter(post => { |
| 113 | + const post_sorted = posts.filter(post => { |
102 | 114 | // 标题搜索 |
103 | 115 | if(searchQuery.value && !post.title.toLowerCase().includes(searchQuery.value.toLowerCase())) { |
104 | 116 | return false |
|
121 | 133 | } |
122 | 134 | return true |
123 | 135 | }) |
| 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 | + } |
124 | 156 | }) |
125 | 157 |
|
126 | 158 | const handleDelete = (postName: string) => { |
|
156 | 188 | } |
157 | 189 |
|
158 | 190 | .filter-controls { |
159 | | - margin-bottom: 2rem; |
160 | 191 | padding: 1.5rem; |
161 | 192 | background-color: #f8f9fa; |
162 | 193 | border-radius: 0.8rem; |
|
216 | 247 | background-color: #ffcdd2; |
217 | 248 | } |
218 | 249 |
|
| 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 | +
|
219 | 261 | .post-item { |
220 | 262 | background-color: #ffffff; |
221 | 263 | border-radius: 1.2rem; |
|
0 commit comments