Externe Personen bei Aufgaben, Aufwand-Feld, Teams persönlich

- Aufgaben auch Kollegen außerhalb des Projekts zuweisen
  (Abschnitt „Externe Personen“ im Aufgaben-Panel)
- Aufwand-Feld neu gestaltet: −/+, Schnellwahl, Umrechnung in Arbeitstage
- Teams: persönliche Nachricht an die Zuständigen (Flow-Bot) statt Kanal

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
erikandClaude Opus 5.5 committed 2026-10-30 09:36:06 +01:00
1 parent 4c2e04e78b
commit e7243f6f26
6 files changed
+304 -101

No files matched your search

+47 -26
View File
@@ -1521,6 +1521,25 @@ step into a project explicit. Everything lives in `public/js/auftrag.js`:
system entirely — `loadAmpelColor()` returns `var(--red)` etc., so this
view now also follows the app-wide dark-mode palette like everywhere
else.
- **Aufwand im Aufgaben-Panel** (Eriks Wunsch „schöner darstellen“):
Kapsel mit −/+ (±1 h) und Einheit „Std.“, Schnellwahl 2 h / ½ Tag /
1 Tag / 2 Tage / 1 Woche (Tage über `APP_SETTINGS.arbeitsstundenProTag`;
erneuter Klick leert), darunter die Umrechnung in Arbeitstage
(`todoAufwandAendern()`/`todoAufwandSetzen()`/`todoAufwandInfo()`,
`plan-modals.js`). Feld-id `todoEditAufwand` und Speichern unverändert.
Das Eingabefeld ist per `!important` durchsichtig, weil die Glas-Regeln
für Eingabefelder ihm sonst eine eigene Fläche geben.
- **„Externe Personen“ im Aufgaben-Panel** (Eriks Wunsch): unter „Wer“
stehen oben die Projektbeteiligten als Chips, darunter der Abschnitt
„Externe Personen“ — Kollegen mit Konto, die dem Projekt NICHT
zugeordnet sind, über eine Auswahl nach Gewerk (`todoExterneSetzen()`,
`todoExternHinzufuegen()`/`todoExternEntfernen()` in `plan-modals.js`;
Quelle: Teilnehmerkreis der Sitzung ohne die Projektbeteiligten). Sie
landen ganz normal in `t.assignees` — damit zählen sie zu ihrer
Auslastung, erscheinen unter „Meine Aufgaben“, bekommen Glocke und
Teams-Nachricht. Wer einer Aufgabe zugewiesen ist, aber (nicht mehr) im
Projekt, erscheint beim Öffnen automatisch dort. Keine Daten­änderung
am Projekt: die Person wird NICHT unter „Beteiligte“ eingetragen.
- **Aufgabe und Meilenstein als Seitenpanel** (Eriks Wahl „B“):
`#todoModal` und `#milestoneModal` sind `.modal-bg.als-panel` — rechts am
Rand, volle Höhe, Hintergrund nur leicht abgedunkelt, damit der
@@ -4210,36 +4229,38 @@ kopieren, „In Outlook öffnen“ (`webcal:`-Link), Anleitung, „Neue Adresse
Microsoft-Server aus dem Internet ab — dafür muss der Server von außen
erreichbar sein. Das klassische Outlook am PC holt es im Firmennetz direkt.
## Teams: Nachricht bei neuen Aufgaben
## Teams: persönliche Nachricht bei neuen Aufgaben
Eriks Wunsch: Wird jemandem eine Aufgabe zugewiesen, erscheint in einem
Teams-Kanal eine Karte mit Link direkt auf die Aufgabe.
- **Einrichten:** In Teams im Kanal *Workflows* → „Beim Empfang einer
Webhook-Anfrage in einem Kanal posten“; die erzeugte https-Adresse unter
**Admin → Teams** eintragen (`loadAdminTeams()`, `js/admin/admin.js`,
Recht **`a.teams`**, neu im Katalog „Admin-Bereich“), „Testnachricht
senden“. Anleitung steht aufklappbar in der Karte.
- **Speicher:** Tabelle `integrationen` (schluessel/wert; `teams_webhook`,
Eriks Wunsch („nur persönlich“): Wird jemandem eine Aufgabe zugewiesen,
bekommt GENAU DIESE Person in Teams eine Nachricht im Chat mit dem Flow-Bot,
mit Link direkt auf die Aufgabe. Kein Kanal.
- **Einrichten in Teams** (Anleitung aufklappbar unter **Admin → Teams**):
leerer Workflow, Auslöser „Bei Empfang einer Teams-Webhookanforderung“
(Jeder), Aktion „Karte in einem Chat oder Kanal veröffentlichen“ als
Flow-Bot im Chat mit Flow-Bot, Empfänger `triggerBody()?['empfaenger']`,
Karte `string(triggerBody()?['karte'])`. Die Auslöser-Adresse trägt ein
Admin in der App ein (`loadAdminTeams()`, Recht **`a.teams`**). Der
Workflow läuft unter dem Konto, das ihn anlegt (besser Sammelkonto/IT).
- **Was die App schickt:** je neu zuständiger Person `{empfaenger, karte}` —
`empfaenger` = `users.email` (muss dem Teams-Anmeldenamen entsprechen),
`karte` = Adaptive Card (`teamsKarte()`: „Neue Aufgabe für Sie: …“,
Projekt, Fällig/Zeitraum, Aufwand, Zugewiesen von, bei mehreren auch
Zuständig, Knopf „Aufgabe öffnen“). Ohne Konto/E-Mail keine Nachricht
(nur ein Log-Eintrag). Testnachricht geht an die E-Mail des Admins.
- **Speicher:** Tabelle `integrationen` (`teams_webhook`,
`teams_neue_aufgaben`), bewusst NICHT `app_settings` (das darf jedes
Konto lesen) und nicht in `IMPORT_TABLES`. Die Adresse geht nie an den
Browser zurück — `GET /admin/teams` liefert nur `konfiguriert`/`host`.
`PUT /admin/teams {webhook?, neueAufgaben?}` (nur https), `POST
/admin/teams/test` (Fehler als `{ok:false}` mit HTTP 200).
Konto lesen) und nicht in `IMPORT_TABLES`; die Adresse geht nie an den
Browser zurück. Routen `GET`/`PUT /admin/teams`, `POST /admin/teams/test`.
- **Auslöser:** `neueZuweisungenMelden()` (aus `/save-week` und
`/save-projects`, jetzt mit `req`) sammelt je Aufgabe die NEU Zuständigen
— auch Personen ohne Konto, nicht wer sich selbst zuweist, keine
Phasenbalken, nie die Sandbox — und `teamsNeueAufgaben()` schickt je
Aufgabe EINE Adaptive Card (`teamsKarte()`: Titel, Projekt, Zuständig,
Fällig/Zeitraum, Aufwand, Zugewiesen von, Knopf „Aufgabe öffnen“). Im
Hintergrund; Fehler nur im Log, das Speichern scheitert nie daran.
`/save-projects`, mit `req`) sammelt je Aufgabe die NEU Zuständigen —
nicht wer sich selbst zuweist, keine Phasenbalken, nie die Sandbox —,
`teamsNeueAufgaben()` sendet im Hintergrund; Fehler nur im Log.
- **Link** (`aufgabenLink()`): `/Projektplan/<Name>?weekLabel=…&projNr=…
&aufgabe=<todoId>#aufgaben`, Host aus der speichernden Anfrage (= Adresse
der App im Büro; funktioniert nur im Büronetz/VPN). Im Browser liest
`plan-state.js` `aufgabe` beim Laden (`startAufgabe`): öffnet die
JÜNGSTE Sitzung, falls der Link eine ältere nennt (Aufgaben-ids bleiben
beim Sitzungswechsel gleich), springt nach „Aufgaben“ und öffnet das
Aufgaben-Panel; Adresszeile wird nachgezogen.
- Braucht Internetzugang nach außen (Microsoft-Server).
&aufgabe=<todoId>#aufgaben`, Host aus der speichernden Anfrage (nur im
Büronetz/VPN erreichbar). `plan-state.js` (`startAufgabe`) öffnet die
jüngste Sitzung, falls der Link eine ältere nennt, und dort das
Aufgaben-Panel; die Adresszeile wird nachgezogen.
- Braucht Internetzugang nach außen.
## Sitzungen nach Bedarf laden (`js/store.js`)