Compare commits
2
Commits
v0.5.0
..
5b40d5e4ff
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b40d5e4ff | ||
|
|
c50fa811c5 |
+34
@@ -137,6 +137,39 @@ Anzahl Notizen · Warnung bei Sync-Fehler · Tags · Statusauswahl · Priorität
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 2a. Aufgaben je Projekt
|
||||||
|
|
||||||
|
Jedes Projekt hat ein eigenes Aufgabenbrett mit vier Spalten: **Offen · In Arbeit ·
|
||||||
|
Blockiert · Erledigt**.
|
||||||
|
|
||||||
|
- **Ziehen und Ablegen** zwischen den Spalten **und innerhalb** einer Spalte. Anders als
|
||||||
|
beim Projektbrett ist die Reihenfolge hier bedeutsam, deshalb wird sie gespeichert.
|
||||||
|
- Gezogen wird am Griff links, damit ein Klick auf die Karte weiter den Dialog öffnet.
|
||||||
|
- Eine Aufgabe braucht nur einen Titel. Optional: Beschreibung (Markdown),
|
||||||
|
Fälligkeitsdatum und Labels.
|
||||||
|
- **Fälligkeiten** färben sich mit: überfällig rot, heute gelb, in den nächsten Tagen
|
||||||
|
gedämpft.
|
||||||
|
- Erledigtes wird durchgestrichen; der Zeitpunkt wird festgehalten und beim Zurückziehen
|
||||||
|
wieder gelöscht.
|
||||||
|
|
||||||
|
### Fortschritt aus Aufgaben
|
||||||
|
|
||||||
|
Pro Projekt umschaltbar. Ist es an, ergibt sich der Fortschritt aus dem Anteil erledigter
|
||||||
|
Aufgaben und wird bei jeder Änderung neu berechnet — der Regler ist dann gesperrt, statt
|
||||||
|
einen Wert anzubieten, der gleich wieder überschrieben würde.
|
||||||
|
|
||||||
|
Auf der Projektkarte im Dashboard steht das Verhältnis als `3/8`.
|
||||||
|
|
||||||
|
### Wie die Reihenfolge gespeichert wird
|
||||||
|
|
||||||
|
Beim Ablegen schickt die Oberfläche je Spalte die **vollständige Liste** der Aufgaben in
|
||||||
|
ihrer neuen Reihenfolge; der Server vergibt daraus Position und Status. Das ist
|
||||||
|
wiederholbar, kommt ohne Positionsrechnerei im Browser aus, und ein verlorener Aufruf
|
||||||
|
lässt sich einfach erneut senden. IDs, die nicht zum Projekt gehören, werden ignoriert
|
||||||
|
statt verschoben.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 3. Notizen
|
## 3. Notizen
|
||||||
|
|
||||||
- **Beliebig viele Notizen pro Projekt**, mit optionalem Titel und mehrzeiligem Text.
|
- **Beliebig viele Notizen pro Projekt**, mit optionalem Titel und mehrzeiligem Text.
|
||||||
@@ -315,6 +348,7 @@ Dateneinsicht. Ein Administrator sieht dadurch weiterhin keine fremden Projekte.
|
|||||||
| `WebAuthnChallenge` | Kurzlebige, einmalig verwendbare Challenges |
|
| `WebAuthnChallenge` | Kurzlebige, einmalig verwendbare Challenges |
|
||||||
| `AppSettings` | Betriebsart und Registrierung (eine Zeile) |
|
| `AppSettings` | Betriebsart und Registrierung (eine Zeile) |
|
||||||
| `Project` | Projektstammdaten, Status, Fortschritt, Repo-Verknüpfung, Besitzer |
|
| `Project` | Projektstammdaten, Status, Fortschritt, Repo-Verknüpfung, Besitzer |
|
||||||
|
| `Task` | Aufgaben mit Spalte, Position, Fälligkeit und Labels |
|
||||||
| `Note` | Notizen (n:1 zu Projekt, Cascade-Delete) |
|
| `Note` | Notizen (n:1 zu Projekt, Cascade-Delete) |
|
||||||
| `GitConnection` | Git-Systeme inkl. verschlüsseltem Token, Besitzer |
|
| `GitConnection` | Git-Systeme inkl. verschlüsseltem Token, Besitzer |
|
||||||
| `RepoSnapshot` | Zwischengespeicherter Repo-Stand (1:1 zu Projekt) |
|
| `RepoSnapshot` | Zwischengespeicherter Repo-Stand (1:1 zu Projekt) |
|
||||||
|
|||||||
@@ -337,6 +337,9 @@ ausschließlich Daten des angemeldeten Kontos.
|
|||||||
| `GET` | `/api/search?q=` | Volltextsuche über die eigenen Notizen |
|
| `GET` | `/api/search?q=` | Volltextsuche über die eigenen Notizen |
|
||||||
| `GET` `PATCH` `DELETE` | `/api/projects/:id` | Projekt lesen / ändern / löschen |
|
| `GET` `PATCH` `DELETE` | `/api/projects/:id` | Projekt lesen / ändern / löschen |
|
||||||
| `POST` | `/api/projects/:id/sync` | Repo-Daten vom Git-System holen |
|
| `POST` | `/api/projects/:id/sync` | Repo-Daten vom Git-System holen |
|
||||||
|
| `GET` `POST` | `/api/projects/:id/tasks` | Aufgaben des Projekts |
|
||||||
|
| `PATCH` | `/api/projects/:id/tasks/reorder` | Neue Reihenfolge nach dem Ziehen |
|
||||||
|
| `PATCH` `DELETE` | `/api/tasks/:id` | Aufgabe ändern / löschen |
|
||||||
| `GET` `POST` | `/api/projects/:id/notes` | Notizen des Projekts |
|
| `GET` `POST` | `/api/projects/:id/notes` | Notizen des Projekts |
|
||||||
| `PATCH` `DELETE` | `/api/notes/:id` | Notiz ändern / löschen |
|
| `PATCH` `DELETE` | `/api/notes/:id` | Notiz ändern / löschen |
|
||||||
| `GET` `POST` | `/api/connections` | Git-Verbindungen |
|
| `GET` `POST` | `/api/connections` | Git-Verbindungen |
|
||||||
|
|||||||
+3
-6
@@ -31,12 +31,6 @@ stillstehen. Kanäle: E-Mail (SMTP), ntfy, generischer Webhook. Zusammen mit
|
|||||||
dem automatischen Abgleich und dem CI-Status ergibt das ein brauchbares
|
dem automatischen Abgleich und dem CI-Status ergibt das ein brauchbares
|
||||||
Frühwarnsystem — die Daten liegen bereits vor.
|
Frühwarnsystem — die Daten liegen bereits vor.
|
||||||
|
|
||||||
### 1.3 Aufgaben und Checklisten `M`
|
|
||||||
|
|
||||||
Eigene Entität statt Freitext, mit Häkchen und automatisch berechnetem
|
|
||||||
Fortschritt. Ersetzt das manuelle Schieben des Reglers. Die Markdown-
|
|
||||||
Checklisten in Notizen sind ein Vorgeschmack, aber nicht auswertbar.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2 · Danach
|
## 2 · Danach
|
||||||
@@ -93,6 +87,8 @@ Voraussetzung, falls du das Projekt veröffentlichen willst.
|
|||||||
| Suchtreffer in Notizen hervorheben | `S` | In der Notiz selbst, nicht nur in der Trefferliste |
|
| Suchtreffer in Notizen hervorheben | `S` | In der Notiz selbst, nicht nur in der Trefferliste |
|
||||||
| Mehrfachauswahl im Board | `S` | Status oder Tags für mehrere auf einmal |
|
| Mehrfachauswahl im Board | `S` | Status oder Tags für mehrere auf einmal |
|
||||||
| Aktivitätsverlauf je Projekt | `S` | Wer hat wann was geändert |
|
| Aktivitätsverlauf je Projekt | `S` | Wer hat wann was geändert |
|
||||||
|
| Wiederkehrende Aufgaben | `M` | Etwa „jeden Montag Abhängigkeiten prüfen" |
|
||||||
|
| Aufgaben aus Git-Issues übernehmen | `M` | Offene Issues als Aufgaben einhängen |
|
||||||
| Projektvorlagen | `S` | Neues Projekt mit vorgefüllten Tags und Notizen |
|
| Projektvorlagen | `S` | Neues Projekt mit vorgefüllten Tags und Notizen |
|
||||||
| Hell/Dunkel umschaltbar | `M` | Aktuell nur dunkel |
|
| Hell/Dunkel umschaltbar | `M` | Aktuell nur dunkel |
|
||||||
| Eigenes Logo und Farbe | `S` | Ergänzt `APP_NAME` |
|
| Eigenes Logo und Farbe | `S` | Ergänzt `APP_NAME` |
|
||||||
@@ -132,6 +128,7 @@ Damit klar ist, was **nicht** kommt und warum:
|
|||||||
| Export, Import und Sicherung | ✓ |
|
| Export, Import und Sicherung | ✓ |
|
||||||
| **v0.3.0** Markdown, Volltextsuche über Notizen, PR- und Issue-Listen, Testfundament | ✓ |
|
| **v0.3.0** Markdown, Volltextsuche über Notizen, PR- und Issue-Listen, Testfundament | ✓ |
|
||||||
| **v0.4.0** Kanban mit Drag & Drop, CI-Status je Branch, Commit-Aktivität | ✓ |
|
| **v0.4.0** Kanban mit Drag & Drop, CI-Status je Branch, Commit-Aktivität | ✓ |
|
||||||
|
| **v0.5.0** Aufgabenbrett je Projekt mit sortierbaren Spalten, Fortschritt aus Aufgaben | ✓ |
|
||||||
|
|
||||||
Zur Entscheidung beim Export: Git-Tokens gehen **nicht** mit. Die Verbindung wird nur
|
Zur Entscheidung beim Export: Git-Tokens gehen **nicht** mit. Die Verbindung wird nur
|
||||||
beschrieben, das Token ist nach dem Import neu zu hinterlegen. Snapshots bleiben
|
beschrieben, das Token ist nach dem Import neu zu hinterlegen. Snapshots bleiben
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { prisma } from "@/lib/db";
|
|||||||
import { parseRepoUrl } from "@/lib/git";
|
import { parseRepoUrl } from "@/lib/git";
|
||||||
import { projectDetailInclude, projectListInclude, uniqueSlug } from "@/lib/projects";
|
import { projectDetailInclude, projectListInclude, uniqueSlug } from "@/lib/projects";
|
||||||
import { jsonError, readJsonBody } from "@/lib/security/request";
|
import { jsonError, readJsonBody } from "@/lib/security/request";
|
||||||
|
import { refreshDerivedProgress } from "@/lib/tasks";
|
||||||
import { formatZodError, projectUpdateSchema } from "@/lib/validation";
|
import { formatZodError, projectUpdateSchema } from "@/lib/validation";
|
||||||
|
|
||||||
export const dynamic = "force-dynamic";
|
export const dynamic = "force-dynamic";
|
||||||
@@ -75,6 +76,7 @@ export async function PATCH(request: Request, { params }: Params) {
|
|||||||
"tags",
|
"tags",
|
||||||
"favorite",
|
"favorite",
|
||||||
"autoSync",
|
"autoSync",
|
||||||
|
"progressFromTasks",
|
||||||
"connectionId",
|
"connectionId",
|
||||||
] as const) {
|
] as const) {
|
||||||
if (data[key] !== undefined) update[key] = data[key];
|
if (data[key] !== undefined) update[key] = data[key];
|
||||||
@@ -94,9 +96,16 @@ export async function PATCH(request: Request, { params }: Params) {
|
|||||||
if (data.repoOwner !== undefined) update.repoOwner = data.repoOwner;
|
if (data.repoOwner !== undefined) update.repoOwner = data.repoOwner;
|
||||||
if (data.repoName !== undefined) update.repoName = data.repoName;
|
if (data.repoName !== undefined) update.repoName = data.repoName;
|
||||||
|
|
||||||
const project = await prisma.project.update({
|
await prisma.project.update({ where: { id }, data: update });
|
||||||
|
|
||||||
|
// Wird die Ableitung eingeschaltet, soll der Wert sofort stimmen und nicht
|
||||||
|
// erst beim naechsten Aufgabenwechsel.
|
||||||
|
if (data.progressFromTasks === true) {
|
||||||
|
await refreshDerivedProgress(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
const project = await prisma.project.findUniqueOrThrow({
|
||||||
where: { id },
|
where: { id },
|
||||||
data: update,
|
|
||||||
include: projectListInclude,
|
include: projectListInclude,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user