Návrh stránek a toku: navolávání schůzek
Tato stránka je návrhový podklad pro obrazovky a přechody vícekrokového
workflow. Konkrétním příkladem je navolávání dodavatelů a rezervace schůzky z
/work-wizard. UI diagramy používají PlantUML Salt a jsou zjednodušené
wireframy, ne pixelově přesné screenshoty.
Popsaný tok odpovídá současným routám, workflow funkcím a šablonám. Vizuální hierarchie v diagramech je doporučené uspořádání podle UX/UI Principles.
Jak navrhovat stránkový tok
Pro každou stránku nejdřív popiš:
- Účel – jeden úkol, který má uživatel na stránce dokončit.
- Vstupní kontext – odkud uživatel přišel a která data musí vidět před rozhodnutím.
- Primární cestu – nejčastější další krok a očekávaný výsledek.
- Vedlejší cesty – návrat, odložení, prázdný stav a chyby.
- Typ akce – navigace na jinou stránku je odkaz; submit nebo přímá datová mutace je tlačítko.
- Stavy formuláře – validace je u pole, obecná chyba nad formulářem a po chybě zůstávají hodnoty zachované.
Nový krok má vzniknout jen tehdy, když má vlastní rozhodnutí nebo výrazně jiný kontext. Samostatná stránka nemá sloužit jen jako mezikrok bez uživatelské volby.
Mapa současných stránek
| Krok | URL | Odpovědnost | Hlavní pokračování |
|---|---|---|---|
| 1. Hovor | /work-wizard |
Zobrazit jeden úkol, dodavatele, kontakt, telefon, pokyny a historii pokusů. | Odkaz Naplánovat schůzku, nebo tlačítko s výsledkem hovoru. |
| 2. Termín | /work-wizard/meeting-booking |
Vybrat organizátora, délku, počáteční datum a dostupný slot v následujících 14 dnech. | Odkaz konkrétního slotu otevře údaje pozvánky. |
| 3. Pozvánka | /work-wizard/meeting-booking/details |
Zkontrolovat účastníky, formu, telefon, název, místo a text pozvánky. | Rezervovat a poslat pozvánku. |
| 4. Další práce | /work-wizard |
Po úspěšné mutaci zobrazit další úkol z fronty. | Další hovor, nebo prázdný stav. |
Filtr termínů používá GET a pouze překreslí nabídku. Výběr slotu je navigace.
Teprve odeslání údajů pozvánky vytvoří událost a změní stav Jira úkolu.
Online a osobní schůzky rozešlou pozvánky vybraným účastníkům. Call vytvoří
událost pouze v kalendáři vybraného obchodníka, bez dalších účastníků.
Při výběru Call se pole emailů skryjí a deaktivují a tlačítko se změní na
„Rezervovat Call“. Email není povinný; telefon pro Call zůstává povinný.
Server ignoruje i adresáty ze staršího nebo ručně sestaveného Call požadavku.
Text pozvánky se při otevření formuláře předvyplní podle RP-9867: online
schůzka dostane krátké pozvání, osobní schůzka také pokyny k příchodu a parkování.
Osobní schůzky mají pevné místo Mezi Vodami 1097/25, Praha 4 Modřany;
průvodce je zobrazí jen pro osobní schůzku a při odeslání nastaví na serveru.
Text lze upravit; při přepínání forem v otevřeném formuláři zůstane rozepsaný
text každé formy zachovaný. Prázdný text při odeslání doplní výchozí šablona.
AI návrh zůstává volitelný pro online a osobní schůzky. Call má pouze
volitelnou poznámku pro obchodníka, bez šablony pozvánky a bez AI návrhu.
UI 1: stránka hovoru

Primární cesta ke schůzce má být viditelná před alternativami. Výsledek hovoru a ruční odložení patří pod ni, protože mění data a ukončují práci s aktuálním úkolem.
UI 2: výběr termínu a údaje pozvánky

Výběr termínu a údaje pozvánky jsou dvě stránky, protože řeší dvě odlišná rozhodnutí. Kontext organizátora a termínu se ve druhém kroku zopakuje jen jako stručný souhrn, ne jako další editovatelný formulář.
Tok navolávání dodavatelů

Stavové a datové kontrakty
- Průvodce zobrazuje vždy nejvýše jeden aktuální Jira úkol typu
Organize a Meeting. - Rezervace nejdřív vytvoří událost v Google Calendar; online a osobní schůzky
také odešlou pozvánky. Call patří pouze obchodníkovi. Potom
uloží výsledek hovoru
reacheda převede úkol doWAITING FOR ACCEPTANCE. - Pokud po vytvoření události selže dokončení Jira kroku, uživatel má odeslat
stejná data znovu;
booking_idempotency_keybrání vytvoření jiné rezervace. Nedovolánoodloží první pokus o 3 české pracovní dny a druhý o 6 českých pracovních dnů. Třetí pokus přejde doWAITING FOR ACCEPTANCE.- Ruční odložení používá zadané budoucí datum a čas. Worker po dosažení
Next Action At Timevrátí úkol doREADY FOR CALL. Dovolánobez rezervace aTelefon neexistujepřejdou doWAITING FOR ACCEPTANCE.- Reporter úkolu přijme řešení a převede ho do
DONE; může ho také lokálně přeskočit na tři hodiny bez změny Jira stavu. - Neplatný nebo mezitím obsazený slot vrátí chybu u výběru termínu. Ostatní vyplněné hodnoty pozvánky zůstávají zachované.
Povinné stavy obrazovek
Každý návrh tohoto toku musí počítat alespoň s těmito stavy:
- chybí aktuální úkol – krátký prázdný stav a odkaz na vlastní úkoly;
- Jira OAuth není připojené – vysvětlení a cesta k připojení účtu;
- není připojený žádný použitelný Google Calendar – stav bez termínů;
- Jira požadavek nepovoluje podporovanou formu schůzky – termíny jsou pouze ke čtení;
- v 14denním období není volný termín – žádné falešné primární CTA;
- validační chyba – zpráva u konkrétního pole,
aria-invalidaaria-describedby; - konflikt dostupnosti – návrat k výběru termínu bez ztráty ostatních hodnot;
- integrační chyba – obecná zpráva nad aktivním formulářem a bezpečné opakování.
Kontrolní seznam pro další návrh
- Má stránka právě jeden viditelný
H1a jednoznačnýH2pro aktuální úkol? - Je před rozhodnutím vidět dodavatel, kontakt a důležitý provozní kontext?
- Je nejčastější pokračování vizuálně první?
- Jsou odkazy, submit tlačítka a stavové zprávy sémanticky rozlišené?
- Má každý krok jasnou cestu zpět bez datové mutace?
- Zůstávají po chybě zachované hodnoty a je zřejmé, co má uživatel opravit?
- Je dokončení idempotentní tam, kde se volá více externích systémů?
Implementační mapa
- routy:
reply-pilot-app/reply_pilot_app/views.py - orchestrace:
reply-pilot-app/reply_pilot_app/workflows/work_wizard.py - stránka hovoru:
reply-pilot-app/reply_pilot_app/templates/work_wizard.html - výběr termínu:
reply-pilot-app/reply_pilot_app/templates/work_wizard_booking_slots.html - údaje pozvánky:
reply-pilot-app/reply_pilot_app/templates/work_wizard_booking_details.html - backend rezervace:
reply-pilot-be/src/main/java/cz/replypilot/be/service/MeetingBookingService.java - stavové změny Jira:
reply-pilot-be/src/main/java/cz/replypilot/be/service/TaskMutationService.java