- Dashboard with all Gitea projects (active/archived) - Kanban board per project (Backlog → À faire → En cours → Révision → Terminé) - Drag & drop issues between columns (SortableJS) - Project notes panel - Gitea API integration (read issues, repos) - SQLite local state for board positions - Dark theme design system - Docker-ready (Dockerfile + docker-compose.yml) - FastAPI + Jinja2 + HTMX + Alpine.js stack
91 lines
3.8 KiB
HTML
91 lines
3.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr" data-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Kanbante — Dashboard</title>
|
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📋</text></svg>">
|
|
<link rel="stylesheet" href="/static/css/style.css">
|
|
<script src="https://unpkg.com/[email protected]"></script>
|
|
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<h1><a href="/">📋 <span class="gradient-text">Kanbante</span></a></h1>
|
|
<nav>
|
|
<span class="badge">{{ active_repos|length }} actifs</span>
|
|
<span class="badge secondary">{{ inactive_repos|length }} archivés</span>
|
|
</nav>
|
|
</header>
|
|
|
|
<main x-data="{ tab: 'active', search: '' }">
|
|
<!-- Tabs -->
|
|
<div class="tabs">
|
|
<button :class="{ active: tab === 'active' }" @click="tab = 'active'">
|
|
🟢 Actifs ({{ active_repos|length }})
|
|
</button>
|
|
<button :class="{ active: tab === 'inactive' }" @click="tab = 'inactive'">
|
|
⚪ Archivés ({{ inactive_repos|length }})
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Search -->
|
|
<div class="search-bar">
|
|
<input type="text" placeholder="🔍 Filtrer les projets..." x-model="search">
|
|
</div>
|
|
|
|
<!-- Active Projects -->
|
|
<div x-show="tab === 'active'" class="project-grid">
|
|
{% for repo in active_repos %}
|
|
{% set full = repo.full_name %}
|
|
<div class="project-card"
|
|
x-show="search === '' || '{{ repo.name.lower() }}{{ repo.full_name.lower() }}'.includes(search.toLowerCase())">
|
|
<div class="card-header">
|
|
<span class="org-tag">{{ repo.owner.login }}</span>
|
|
<span class="date">{{ repo.updated_at[:10] }}</span>
|
|
</div>
|
|
<h3>
|
|
<a href="/board/{{ repo.owner.login }}/{{ repo.name }}">{{ repo.name }}</a>
|
|
</h3>
|
|
<p class="desc">{{ repo.description or '—' }}</p>
|
|
<div class="card-footer">
|
|
<span>{{ repo.open_issues_count or 0 }} issues</span>
|
|
{% if full in stats %}
|
|
<div class="mini-progress">
|
|
{% for col in ['backlog','todo','in_progress','review','done'] %}
|
|
{% set n = stats[full].get(col, 0) %}
|
|
{% if n > 0 %}
|
|
<span class="chip" style="background: {{ COLUMN_COLORS[col] }}20; color: {{ COLUMN_COLORS[col] }}">
|
|
{{ n }}
|
|
</span>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
|
|
<!-- Inactive Projects -->
|
|
<div x-show="tab === 'inactive'" class="project-grid">
|
|
{% for repo in inactive_repos %}
|
|
<div class="project-card archived"
|
|
x-show="search === '' || '{{ repo.name.lower() }}'.includes(search.toLowerCase())">
|
|
<div class="card-header">
|
|
<span class="org-tag">{{ repo.owner.login }}</span>
|
|
<span class="date">{{ repo.updated_at[:10] }}</span>
|
|
</div>
|
|
<h3>{{ repo.name }}</h3>
|
|
<p class="desc">{{ repo.description or '—' }}</p>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</main>
|
|
|
|
<footer>
|
|
Kanbante v0.1 · {{ active_repos|length + inactive_repos|length }} projets sur Gitea
|
|
</footer>
|
|
</body>
|
|
</html>
|