Files
InsanityLab-web/.superpowers/sdd/task-11-brief.md
T
Adriano b913a2bf90 registri dei piani in git (AI-OS#309)
Refs gitea:Adriano/AI-OS#310

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-06 10:36:26 +02:00

2.7 KiB

Task 11: Nav admin per 3 ruoli e blog filtrato per autore

Files:

  • Modify: src/layouts/Admin.astro
  • Modify: src/pages/admin/index.astro

Interfaces:

  • Consumes: listAllPosts, listByAuthor (posts.ts), listUsers (auth.ts), Astro.locals.user.

  • Step 1: Nav admin per ruolo

In src/layouts/Admin.astro, sostituisci le due righe dentro <span> (righe ~34-35) con:

        {user && (
          <>
            {`Ciao, ${user.username}`}
            <a href="/admin">Articoli</a>
            {(user.role === 'superuser' || user.role === 'admin') && <a href="/admin/content">Contenuti</a>}
            {user.role === 'admin' && <a href="/admin/users">Utenti</a>}
            <a href="/admin/new">Nuovo</a>
            <a href="/admin/logout">Esci</a>
            <a href="/blog" target="_blank">Vedi sito ↗</a>
          </>
        )}
  • Step 2: Blog admin filtrato + colonna autore

Sostituisci il frontmatter di src/pages/admin/index.astro:

---
import Admin from '../../layouts/Admin.astro';
import { getDb } from '../../lib/db';
import { listAllPosts, listByAuthor } from '../../lib/posts';
import { listUsers } from '../../lib/auth';
export const prerender = false;
const user = Astro.locals.user!;
const isManager = user.role === 'superuser' || user.role === 'admin';
const posts = isManager ? listAllPosts(getDb()) : listByAuthor(getDb(), user.id);
const nameById = new Map(listUsers(getDb()).map((u) => [u.id, u.username]));
const fmt = new Intl.DateTimeFormat('it-IT', { dateStyle: 'short', timeStyle: 'short' });
---

Nella <thead> aggiungi la colonna Autore solo per i manager, e nella riga il valore. Sostituisci la tabella:

  <table>
    <thead><tr><th>Titolo</th><th>Categoria</th>{isManager && <th>Autore</th>}<th>Stato</th><th>Aggiornato</th><th></th></tr></thead>
    <tbody>
      {posts.map((p) => (
        <tr>
          <td><a href={`/admin/edit/${p.id}`}>{p.title}</a></td>
          <td>{p.category}</td>
          {isManager && <td>{p.author_id ? (nameById.get(p.author_id) ?? 'Staff InsanityLab') : 'Staff InsanityLab'}</td>}
          <td><span class:list={['pill', { 'pill--draft': p.draft }]}>{p.draft ? 'Bozza' : 'Pubblicato'}</span></td>
          <td>{fmt.format(new Date(p.updated_at.replace(' ', 'T') + 'Z'))}</td>
          <td><button class="abtn abtn--danger" data-del={p.id}>Elimina</button></td>
        </tr>
      ))}
    </tbody>
  </table>
  • Step 3: Verifica build

Run: npm run build Expected: build OK.

  • Step 4: Commit
git add src/layouts/Admin.astro src/pages/admin/index.astro
git commit -m "feat(admin): nav per 3 ruoli, blog filtrato per autore + colonna autore"