Funkce — Eva Mobile PWA¶
Kompletní přehled stránek a funkcí mobilní webové aplikace EVA.
Přehled stránek¶
| Stránka | URL | Popis |
|---|---|---|
| Přihlášení | /login |
Heslo, PIN, nebo QR/DeviceToken kód; auto-login uloženým zařízením |
| Domů | / |
Klikatelné dlaždice se statistikami po přihlášení |
| Můj majetek | /my-assets |
Seznam majetku přiřazeného nebo spravovaného uživatelem, s vyhledáváním |
| Nový majetek | /new-asset |
Formulář pro návrh nového majetku (od v1.0.43) |
| Detail majetku | /my-assets/{id} |
Read-only karta artiklu, fotky, návrh vyřazení |
| Moje inventury | /my-inventories |
Seznam otevřených inventur s majetkem uživatele |
| Detail inventury | /my-inventories/{id} |
Položky inventury s jejich stavem |
| Převodky | /transfers |
Otevřené převodky přihlášeného uživatele (od v1.0.43) |
| Vyřazení | /disposals |
Návrhy na vyřazení čekající na schválení (od v1.0.43) |
| Odhlášení | /logout |
Zneplatní token a přesměruje na přihlášení |
Přihlášení (/login)¶
Podporuje tři způsoby přihlášení:
- Jméno + heslo —
POST /api/pwa-auth/login-password. - Kód zařízení (QR sken) — vstupní pole pro kód
EVA-DEV:...; funguje i s HID QR čtečkou (skener vyplní pole a odešle Enter), nebo skenováním fotky pořízené kamerou mobilu (ScannerInterop._decodeFromFile, knihovna ZXing Browser, lokálně bez CDN). VoláPOST /api/device-auth/activate→POST /api/device-auth/exchange. - Auto-login uloženým zařízením — pokud prohlížeč má v
localStorageplatnýdevice_tokenz dřívější aktivace, zobrazí se tlačítko „Přihlásit se tímto zařízením" bez nutnosti zadávat cokoliv; při401(odvolaný/expirovaný token) se token smaže a tlačítko zmizí.
Po úspěšném přihlášení JWT token uloží TokenStore (in-memory) a localStorage (fallback pro obnovu stránky), a uživatel je přesměrován na úvodní stránku. Autentizační stav spravuje EvaAuthStateProvider.
QR kód pro aktivaci zařízení generuje administrátor v Eva.Manager na stránce /security (DeviceQrPopup) — viz Bezpečnost.
Domů (/)¶
Úvodní stránka po přihlášení. Dlaždice jsou klikatelné odkazy s Bootstrap Icons, nadpisem a živými statistikami z GET /api/articles/my-stats/{userId}:
| Dlaždice | Odkaz | Zobrazuje |
|---|---|---|
| Můj majetek | /my-assets |
Počet kusů a celková hodnota (Kč) |
| Nový majetek | /new-asset |
Zkratka na formulář návrhu |
| Moje inventury | /my-inventories |
— |
| Převodky | /transfers |
Počet otevřených převodek |
| Vyřazení | /disposals |
Počet čekajících návrhů |
Můj majetek (/my-assets)¶
Seznam veškerého majetku přiřazeného nebo spravovaného přihlášeným uživatelem.
Majetek je zobrazen ve dvou pohledech:
| Pohled | Popis |
|---|---|
| Přiděleno | Majetek, kde je uživatel evidován jako Přiřazená osoba |
| Odpovídá | Majetek, kde je uživatel evidován jako Odpovědná osoba |
Data jsou načítána přes GET /api/articles/my-assets/{userId}. Vstupní pole pro vyhledávání filtruje case-insensitive podle názvu nebo kódu artiklu.
Nový majetek (/new-asset)¶
Formulář pro návrh nového majetku ke schválení správcem. Zaměstnanec vyplní:
| Pole | Povinné | Poznámka |
|---|---|---|
| Název | Ano | |
| Sériové číslo | Ne | výrobní/sériové číslo |
| Kategorie | Ne | číselník ArticleCategory, filtrováno dle tenanta |
| Typ | Ano | číselník ArticleType; ArticleTypeID je v DB NOT NULL |
| Cena, měna | Ne | výchozí měna CZK |
| Číslo faktury, datum pořízení | Ne |
Po odeslání (POST /api/articles/pwa-request) je artikl uložen bez inventárního kódu, se stavem „Navrženo" — správce jej v Eva.Manager doplní o kód a schválí (viz Dashboard — Návrhy nového majetku).
Detail majetku (/my-assets/{id})¶
Read-only karta artiklu. Zobrazuje:
| Pole | Popis |
|---|---|
| Název | Název majetku |
| Kód | Inventární číslo |
| Kategorie | Kategorie majetku |
| Stav | Aktuální stav artiklu |
| Umístění | Evidované umístění |
| Cena | Pořizovací cena, zobrazená s měnovým symbolem (Symbol ?? Code ?? Name, např. „Kč") |
| Fotky | Náhledy načtené jako data URI; smazání vyžaduje inline potvrzení |
Editace majetku není z PWA dostupná — slouží pouze pro čtení. Z detailu lze podat návrh na vyřazení (/my-assets/{id}/disposal).
Moje inventury (/my-inventories)¶
Seznam otevřených inventur obsahujících majetek přihlášeného uživatele.
Data jsou načítána přes GET /api/inventories/my-inventories/{userId}.
Detail inventury (/my-inventories/{id})¶
Přehled položek vybrané inventury s jejich aktuálním stavem (inventarizováno / zbývá / rozdíl).
Statistická lišta zobrazuje tři karty: Zinventarizováno / Chybí / Čeká.
Akce na položce¶
| Akce | Podmínka | Popis |
|---|---|---|
| Potvrdit | položka není inventarizována; IsSecure = false |
Potvrdí přítomnost majetku; skryta pro zabezpečené inventury |
| Nemám to | položka není inventarizována | Otevře Bootstrap modal — pole lokace, osoba, poznámka; nastavuje IsMissing = true, WasManually = true |
Badges stavu: "Potvrzeno" vs "Chybí".
Zabezpečený režim (IsSecure)¶
Pokud je inventura označena jako zabezpečená: - Žlutý banner "Zabezpečený režim" je zobrazen pod kamerou skeneru - Pokud naskenovaný kód není UUID formátu (QR GUID z etikety), sken je ignorován s červenou hláškou - Tlačítko "Potvrdit" (ruční potvrzení) je zcela skryto — potvrzení je možné pouze skenováním QR kódu - Server-side guard vrátí HTTP 403 pokud se PWA pokusí o potvrzení bez QR GUID (defense-in-depth)
Data inventury se načítají přes GET /api/inventoryitems/pwa-list/{inventoryId}.
Potvrzení položky přes PUT /api/inventoryItems/{id}/pwa-confirm.
Označení chybějícího přes PUT /api/inventoryItems/{id}/pwa-missing.
Převodky (/transfers)¶
Seznam otevřených převodek, které přihlášený uživatel vytvořil (nepotvrzené, nezamítnuté). Stav převodky je zobrazen barevným badge (Čeká / Připraveno / Schváleno). Prázdný stav zobrazuje ikonu a informativní text.
Data jsou načítána přes GET /api/articles/my-transfers/{userId}.
Vyřazení (/disposals)¶
Seznam návrhů na vyřazení majetku, které uživatel podal a které čekají na schválení. Zobrazuje název a kód artiklu, důvod a datum návrhu, badge „Čeká na schválení".
Data jsou načítána přes GET /api/articles/my-disposals/{userId}.
Technické detaily¶
Autentizace¶
EvaAuthStateProvider— implementaceAuthenticationStateProviderpro Blazor WASM.TokenStore— singleton držící JWT v paměti; eliminuje race condition při souběžných JSInterop voláníchlocalStorage.getItem(více komponent najednou čte token při startu).localStorageslouží jako fallback při obnově stránky (F5).AuthorizationHandler—DelegatingHandler, který do každého HTTP požadavku automaticky přidává hlavičkuAuthorization: Bearer <token>; při401na GET požadavku automaticky zavoláPOST /api/pwa-auth/refresha zopakuje původní request.AuthService—LoginWithDeviceCodeAsync,HasStoredDeviceTokenAsync,ExchangeDeviceTokenAsync,RefreshAsync— QR/DeviceToken login a auto-login (viz sekci „Přihlášení" výše).
API endpointy¶
| Endpoint | Metoda | Popis |
|---|---|---|
/api/pwa-auth/login-password |
POST | Přihlášení jménem a heslem, vrátí JWT token |
/api/pwa-auth/refresh |
POST | Automatický refresh JWT po 401 |
/api/device-auth/activate |
POST | Aktivace QR/kódu zařízení → vydá DeviceToken |
/api/device-auth/exchange |
POST | Výměna DeviceToken za JWT (auto-login) |
/api/articles/my-assets/{userId} |
GET | Majetek uživatele |
/api/articles/my-stats/{userId} |
GET | Statistiky pro Domů |
/api/articles/my-transfers/{userId} |
GET | Otevřené převodky uživatele |
/api/articles/my-disposals/{userId} |
GET | Čekající návrhy na vyřazení |
/api/articles/pwa-request |
POST | Návrh nového majetku |
/api/inventories/my-inventories/{userId} |
GET | Inventury uživatele |
/api/inventoryItems/{id}/pwa-confirm |
PUT | Potvrzení položky inventury (kontrola IsSecure) |
/api/inventoryItems/{id}/pwa-missing |
PUT | Označení položky jako chybějící |
/api/users/pwa-persons |
GET | Tenant-scoped seznam osob (doménový User model) |
/api/locations/pwa-list |
GET | Slim seznam lokací { id, name } |
/api/articles/generate-qr-bulk |
POST | Hromadné generování QR GUID pro artikly bez kódu |
Podrobný popis viz REST API — PWA endpointy a Autentizace.
Layout¶
Od v1.0.43 je navigace přesunuta z dolní lišty do horního topbaru:
- TopBar (
<header>) — obsahujeNavMenus ikonami (Bootstrap Icons, dříve emoji) a odkazy na hlavní sekce; nepřihlášený uživatel vidí jen brand „Eva Mobile" - Spodní
BottomNavigationbyla odstraněna (CSS třídybottom-nav*→topbar-nav*) .mobile-contentmámin-height: 0a-webkit-overflow-scrolling: touch— oprava scrollování na iOS Safari