新增: 列表分页UI(Paginator组件+三视图接入)
Paginator.vue复用组件(客户端切片,不发新IPC,数据量小前瞻基建) Tasks/Ideas/Projects.vue接store列表切片(pagedProjects/pagedIdeas) 向后兼容铁律:pageSize=0整组件v-if隐藏+切片返全量,等价改造前行为 旧调用方(store.loadTasks等签名)零改动,分页状态纯前端ref 筛选/排序变化page重置1防越界空页;i18n双语pagination键齐备
This commit is contained in:
@@ -52,7 +52,7 @@
|
||||
<div v-else-if="filteredIdeas.length === 0" class="empty-state">{{ $t('ideas.listEmpty') }}</div>
|
||||
<template v-else>
|
||||
<div
|
||||
v-for="idea in filteredIdeas"
|
||||
v-for="idea in pagedIdeas"
|
||||
:key="idea.id"
|
||||
class="idea-card"
|
||||
:class="{ selected: selectedId === idea.id }"
|
||||
@@ -70,6 +70,12 @@
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<!-- 分页器(F-260621-02 P3):pageSize=0 不分页(全量,等价旧行为);用户选 N 条触发客户端切片 -->
|
||||
<Paginator
|
||||
v-model:page="page"
|
||||
v-model:pageSize="pageSize"
|
||||
:total="filteredIdeas.length"
|
||||
/>
|
||||
</section>
|
||||
|
||||
<!-- 右侧:灵感详情 -->
|
||||
@@ -132,6 +138,7 @@ import { stripMd } from '../utils/markdown'
|
||||
import ConfirmDialog from '../components/ConfirmDialog.vue'
|
||||
import IdeaDetail from '../components/ideas/IdeaDetail.vue'
|
||||
import { useConfirm } from '../composables/useConfirm'
|
||||
import Paginator from '../components/Paginator.vue'
|
||||
|
||||
const { t } = useI18n()
|
||||
const router = useRouter()
|
||||
@@ -149,6 +156,10 @@ const searchQuery = ref('')
|
||||
// 列表排序:score 高分在前 / time 新在前(默认 score,避免高分灵感被淹没)
|
||||
const sortMode = ref<'score' | 'time'>('score')
|
||||
|
||||
// 分页(F-260621-02 P3):pageSize=0 → 全量(向后兼容,等价改造前);用户选 N → 客户端切片
|
||||
const page = ref(1)
|
||||
const pageSize = ref(0)
|
||||
|
||||
// ── 新建灵感模态框 ──
|
||||
const showCaptureModal = ref(false)
|
||||
const newIdeaTitle = ref('')
|
||||
@@ -218,9 +229,9 @@ async function reloadIdeas(immediate = false) {
|
||||
}
|
||||
|
||||
// 筛选/排序变化即时重载;keyword 输入防抖重载
|
||||
watch(activeFilter, () => void reloadIdeas(true))
|
||||
watch(sortMode, () => void reloadIdeas(true))
|
||||
watch(searchQuery, () => void reloadIdeas(false))
|
||||
watch(activeFilter, () => { page.value = 1; void reloadIdeas(true) })
|
||||
watch(sortMode, () => { page.value = 1; void reloadIdeas(true) })
|
||||
watch(searchQuery, () => { page.value = 1; void reloadIdeas(false) })
|
||||
|
||||
const filteredIdeas = computed(() => {
|
||||
let ideas = store.ideas
|
||||
@@ -237,6 +248,13 @@ const filteredIdeas = computed(() => {
|
||||
return ideas
|
||||
})
|
||||
|
||||
// 分页视图(F-260621-02 P3):pageSize=0 → 全量(等价改造前);否则取当前页窗口。
|
||||
const pagedIdeas = computed(() => {
|
||||
if (pageSize.value <= 0) return filteredIdeas.value
|
||||
const start = (page.value - 1) * pageSize.value
|
||||
return filteredIdeas.value.slice(start, start + pageSize.value)
|
||||
})
|
||||
|
||||
const currentIdea = computed(() => {
|
||||
if (!selectedId.value) return null
|
||||
return store.ideas.find(i => i.id === selectedId.value) ?? null
|
||||
|
||||
Reference in New Issue
Block a user