Přeskočit obsah

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í:

  1. Jméno + heslo — POST /api/pwa-auth/login-password.
  2. 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.
  3. Auto-login uloženým zařízením — pokud prohlížeč má v localStorage platný device_token z dřívější aktivace, zobrazí se tlačítko „Přihlásit se tímto zařízením" bez nutnosti zadávat cokoliv; při 401 (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 — implementace AuthenticationStateProvider pro Blazor WASM.
  • TokenStore — singleton držící JWT v paměti; eliminuje race condition při souběžných JSInterop voláních localStorage.getItem (více komponent najednou čte token při startu). localStorage slouží jako fallback při obnově stránky (F5).
  • AuthorizationHandler — DelegatingHandler, který do každého HTTP požadavku automaticky přidává hlavičku Authorization: Bearer <token>; při 401 na GET požadavku automaticky zavolá POST /api/pwa-auth/refresh a 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>) — obsahuje NavMenu s ikonami (Bootstrap Icons, dříve emoji) a odkazy na hlavní sekce; nepřihlášený uživatel vidí jen brand „Eva Mobile"
  • Spodní BottomNavigation byla odstraněna (CSS třídy bottom-nav* → topbar-nav*)
  • .mobile-content má min-height: 0 a -webkit-overflow-scrolling: touch — oprava scrollování na iOS Safari