Prava a bezpecnost: spravce firmy uz nemuze nastavit priznak spravce platformy ani clenstvi v cizi firme; pozvanky, konektory a automatizace kontroluji sve pravo; cizi firma v query je 404; zivy stream posila udalosti jen firmam, kterych se tykaji; akce nad ticketem maji kontrolu prava za firmu ticketu a strop viditelnosti; tokeny se nelogujou; limit pokusu na prihlaseni, kontakt a pozvanky; bezpecnostni hlavicky; zachyceni chyb v async handlerech; timing-safe porovnani tokenu. Vykon: audit neskenuje celou kolekci pri kazdem zapisu a konecne maze firemni zaznamy; ticket se uklada jednou misto trikrat; zapisy do Postgresu jsou serializovane podle ID; prava se pocitaji jednou na request; widgety nacitaji tickety jednou; strankovani seznamu; worker je pool misto kol; na webu udalost ze streamu neodmontuje stranku, dotazy maji spolecny debounce a cache, ciselniky drzi typovany sklad. Runtime: opakuji se jen chyby oznacene retryable; smycka nenarazi na strop 50 kroku (novy strop 1000 akci); podminka nad datem funguje; vystup MCP nastroje neprepisuje spoustec; sandbox skriptu firmy nejde opustit; MCP session id se drzi mezi volanimi; incident z kroku patri firme; jedno rozhodnuti o rezimu uloziste; snapshot neprepise soubor po chybe cteni. Refaktory: sdilene typy API v src/shared (web nic nekopiruje, osm rozjetych tvaru sjednoceno); spolecny modul net/guard pro volani ven; formularova vrstva ui/form; rozdeleni Connectors a FlowCanvas; jeden helper pro firmu z query, validaci a CRUD udalosti; pomucky ctx.util pro skripty konektoru; i18n verejneho webu vcetne anglictiny. Nova funkce: zalozeni firmy z registru ARES v Nastaveni (IC nebo nazev, dotazeni IC, DIC, sidla a pravni formy, vyber soucasnych statutarnich zastupcu a prokury, ucty spravce firmy s nahradnim e-mailem IC-poradi@placeholder.cz). Dokumentace: zaznam v 99-zmeny.md a aktualizace 15 dalsich dokumentu. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
4.3 KiB
08 - Widgety na prehledu
Kde se to nastavuje
/dashboard, tlacitko Upravit dashboard vpravo nahore. V rezimu uprav
dostane kazdy widget listu s ovladanim:
- vyber sirky (tretina, polovina, cela sirka),
- sipky vlevo a vpravo pro poradi,
- kos pro odebrani.
K tomu Pridat widget s nabidkou toho, co jeste na dashboardu neni, Vychozi pro vraceni do puvodniho stavu a Ulozit nebo Zrusit.
Dokud se neklikne na Ulozit, nic se neuklada. Zrusit vrati puvodni rozlozeni.
Ulozeni je za dvojici uzivatel a firma
Ne za uzivatele. Clovek ve dvou firmach chce v kazde videt neco jineho a smichat mu to dohromady by bylo horsi nez zadne nastaveni.
Klic je ${userId}:${tenantId}, uloziste je src/data/dashboardLayouts.ts
(pres withMirror, prezije restart). Kdo si dashboard jeste neupravil,
dostane vychozi rozlozeni a custom: false. Ulozene rozlozeni si drzi
createdAt i po uprave.
Katalog widgetu
src/data/widgets.ts, stejny princip jako katalog konektoru: server je zdroj
pravdy o tom, co jde na dashboard polozit.
interface WidgetDefinition {
id: string;
name: string;
description: string;
kind: 'stat' | 'chart' | 'ticketList' | 'incidentList' | 'workload';
sizes: WidgetSize[]; // ktere sirky ma smysl nabizet
defaultSize: WidgetSize;
metric?: ...; // jen u `stat`: ktere cislo ze souhrnu
}
sizes neni kosmetika. Graf v tretine sloupce se necte, proto tam tretinu
nenabizime vubec, misto abychom cekali, ze si to uzivatel rozmysli.
kind rika klientovi, kterou komponentu vykreslit. Novy druh znamena i novou
komponentu na webu, proto jich je zamerne malo a jsou obecne. Novy statisticky
widget je naopak jen zaznam v katalogu, zadny kod navic.
Data si nacita prehled, ne widgety
Widget dostane data v propsu. Kdyby si je nacital sam, deset dlazdic by znamenalo deset stejnych dotazu na server.
Prehled drzi ctyri dotazy (souhrn, tickety, incidenty, vytizeni) a rozdava je vsem widgetum. Dlazdice, ktera zadna data nepotrebuje, o nich proste nevi.
Totez plati na serveru: POST /widget-data nacte seznam ticketu jednou na
request a kazdy widget si z nej filtruje svoje. Driv sel listTickets za
kazdy widget zvlast, tedy desetkrat za otevreni prehledu.
Pri udalosti ze streamu se dotazy obnovi na pozadi (refreshing) a dlazdice
zustavaji vykreslene. Driv se cely prehled pri kazde udalosti odmontoval
a ukazal spinner, viz 05-dashboard-a-builder.md.
Ukazkove widgety "Moje tickety" a "Fronta bez resitele" filtruji
closed: false, ne podle nazvu stavu - stav je volny retezec a slovnik
defaultStatuses je cesky (Novy, V reseni, Ceka na klienta, Vyreseno).
Mrizka
Sest sloupcu, sirky mapuji na col-span: tretina 2, polovina 3, cela 6.
Na uzkem displeji zabira vsechno celou sirku.
Pouzivaji se container queries (@container a @2xl:), ne sm: a lg:.
Duvod je stejny jako u stromu automatizaci, viz
05-dashboard-a-builder.md, sekce o sirce karet.
Validace
Server overuje ulozene rozlozeni proti katalogu:
| Situace | Vysledek |
|---|---|
| neznamy widget | 400 |
| sirka, kterou widget nepodporuje | 400 |
| duplicitni ID instance | 400 |
| vic nez 12 widgetu | 400 |
Neulozit je tady spravne. Klient by dostal zpatky neco, co neumi vykreslit.
Widget, ktery mezitim z katalogu zmizel, se v prehledu ukaze jako cervena karta s jeho ID. Nesmi tise vypadnout z rozlozeni.
Jak pridat widget
- Zaznam do
widgetsvsrc/data/widgets.ts. - Kdyz je to
stat, pridat i metriku dometricMetavWidgetCard.tsxa pole do souhrnu, pokud tam jeste neni. - Kdyz je to novy
kind, dopsat vetev doWidgetCard.tsx.
Nabidka i rozlozeni ho vezmou automaticky.
Co chybi
| Chybi | Poznamka |
|---|---|
| Drag and drop | poradi se meni sipkami, stejne jako ve strome |
| Nastaveni jednotlivych widgetu | napr. kolik radku ukazat, za jake obdobi |
| Vlastni metriky | katalog je pevny, nejde si nadefinovat vlastni |
| Sdilene rozlozeni pro firmu | kazdy si upravuje jen to svoje |