From b2c6f33e381c30ada1578fc2ab5e99d1be75bd52 Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 9 Jun 2026 15:04:45 +0200 Subject: [PATCH] =?UTF-8?q?docs(datatable)=20:=20plan=20pagination=20aller?= =?UTF-8?q?-=C3=A0-la-page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-06-09-datatable-pagination-goto.md | 384 ++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 docs/superpowers/plans/2026-06-09-datatable-pagination-goto.md diff --git a/docs/superpowers/plans/2026-06-09-datatable-pagination-goto.md b/docs/superpowers/plans/2026-06-09-datatable-pagination-goto.md new file mode 100644 index 0000000..97391d9 --- /dev/null +++ b/docs/superpowers/plans/2026-06-09-datatable-pagination-goto.md @@ -0,0 +1,384 @@ +# DataTable — pagination « aller à la page » — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Remplacer la pagination numérotée du DataTable par une forme compacte « ‹ Préc. Page [n] / N Suiv. › » avec saut de page (debounce 400 ms, Entrée immédiat, clamp). + +**Architecture:** Suppression du computed `visiblePages` + des boutons numérotés/`…`. Ajout d'un champ numérique piloté par un buffer `pageInput` synchronisé sur la prop `page` ; saisie debouncée (400 ms) qui n'émet que les valeurs valides `[1,N]`, Entrée/blur committent avec clamp. Le contrat `v-model:page` est inchangé. + +**Tech Stack:** Nuxt 4 layer, Vue 3 ``) par : +```ts +function changePage(page: number) { + if (page >= 1 && page <= totalPages.value && page !== props.page) { + emit('update:page', page) + } +} + +function onPageInput() { + pageInput.value = pageInput.value.replace(/[^0-9]/g, '') + if (debounceTimer) clearTimeout(debounceTimer) + if (pageInput.value === '') return + const n = Number(pageInput.value) + if (n >= 1 && n <= totalPages.value) { + debounceTimer = setTimeout(() => changePage(n), PAGE_JUMP_DEBOUNCE) + } +} + +function commitPageInput() { + if (debounceTimer) clearTimeout(debounceTimer) + const raw = pageInput.value.trim() + const n = Number(raw) + if (raw === '' || n === 0 || Number.isNaN(n)) { + pageInput.value = String(props.page) + return + } + const clamped = Math.min(Math.max(1, Math.round(n)), totalPages.value) + changePage(clamped) + pageInput.value = String(clamped) +} +``` + +- [ ] **Step 4 : Mettre à jour le bouton Préc.** + +Dans le `