Přeskočit obsah

Changelog — Bartech.Mobile.Eva

[1.0.42] — větev AM/v142 — 2026-07-29

Opraveno

Multitenancy — TenantID null v Blazor circuit (Eva.Manager)

  • ClaimsPrincipalTenantAccessor.cs — změna z AsyncLocal<long?> na ConcurrentDictionary<int, long?> keyovaný SynchronizationContext.Current.GetHashCode(); opravuje WHERE TenantID IS NULL v DxGrid dotazech — AsyncLocal nepropaguje hodnoty do sibling async kontextů (DevExtreme data source callbacky), zatímco RendererSynchronizationContext je sdílený napříč celým Blazor circuit
  • doc/developer-guide.md — sekce Multitenancy kompletně přepsána: architektura ITenantAccessor, diagram toku, vysvětlení mechanismu ConcurrentDictionary, záchranná síť v EvaDataContext, diagnostický postup
  • doc/task/v142/tenant_context_fix.md — nový incident report: symptom (prázdné gridy na produkci), diagnostika (SQL log analýza), příčina (AsyncLocal sémantika), oprava a poznámky k Docker deploy

[1.0.42] — větev AM/v142 — 2026-07-28

Přidáno

Fotodokumentace majetku v Eva.Manager

  • ArticleEditForm.razor — přidána záložka „Fotky" v editaci majetku; galerie existujících fotek s lazy-load binárních dat, upload nové fotky (JPEG/PNG, max 10 MB), mazání fotek; fotky se zobrazují pouze po uložení záznamu (Id > 0)
  • Resource.resx × 5 — nové lokalizační klíče ArticlePhotosCard, ArticlePhotosUpload, ArticlePhotosEmpty, ArticlePhotosDeleteConfirm, ArticlePhotosSaveFirst ve všech 5 jazykových souborech (cs-CZ, en-US, de-DE, sk-SK, neutral)

JoinCode ověření při vytváření uživatele (Eva.Manager)

  • CreateUser.razor — přidáno pole „Kód organizace" (JoinCode); zobrazuje se pouze pokud není přednastaven TenantId z URL; validace přes TenantDataService.GetByJoinCodeAsync; při neplatném kódu toast chyba; rozlišuje cestu Admin (TenantId z URL) vs. přímá registrace (JoinCode)
  • TenantDataService — nová metoda GetByJoinCodeAsync(joinCode): case-insensitive vyhledání aktivního tenanta dle JoinCode přes IgnoreQueryFilters + AsNoTracking
  • Messages.resx × 5 — nové klíče MSG_JOINCODE_REQUIRED, MSG_JOINCODE_INVALID ve všech 5 jazykových souborech
  • Resource.resx × 5 — nové klíče CaptionJoinCode, CaptionJoinCodeNullText ve všech 5 jazykových souborech

E2E Playwright testy — nový testovací projekt (Eva.Manager)

  • Eva.Manager.PlaywrightTests — nový xUnit testovací projekt s Playwright; přidán do Eva.slnx; konfigurace přes testconfig.json (URL, credentials, Headless, SlowMo)
  • PlaywrightFixture.cs — fixture pro správu životního cyklu Playwright/Chromium instance; TestConfig.cs a PageExtensions.cs — infrastrukturní helpery
  • LoginTests.cs — E2E testy přihlašování (správné/špatné přihlašovací údaje, zachování session)
  • RegistrationTests.cs — E2E testy registrace nového tenanta a JoinCode flow
  • UserManagementTests.cs — E2E testy správy uživatelů (vytvoření, licence limit, mazání)
  • DataManagementTests.cs — E2E testy správy dat (export JSON/CSV, import)
  • ReportTests.cs — E2E testy report designeru (vytvoření, zobrazení)
  • Directory.Packages.props — přidán Microsoft.Playwright 1.50.0

Nové integrační testy (Eva.Mobile.WebApi.Tests)

  • ArticleTransferServiceTests.cs — integrační testy pro ArticleTransferDataService.ExecuteTransferWithAuditAsync
  • EvaTestFactory.cs — sdílená WebApplicationFactory pro integrační testy WebApi
  • InventoryServiceTests.cs — integrační testy pro InventoryDataService.CreateInventoryItemsFromLocationAsync
  • LocationsControllerTests.cs — integrační testy endpointů /api/locations
  • TenantIsolationTests.cs — integrační testy tenant izolace napříč datovou vrstvou

Změněno

Opravy modelů a služeb (Eva.Data)

  • Location.cs — navigační property ParentLocation změněna na virtual (umožňuje lazy loading a lepší testovatelnost)
  • Printer.cs — property Destination označena [Required, MaxLength(250)] a inicializována na string.Empty (oprava potenciální null reference při serializaci)
  • InventoryDataService.CreateInventoryItemsFromLocationAsync — přidáno mazání stávajících položek před regenerací (RemoveRange + SaveChangesAsync); brání duplicitám při opakovaném volání s force přepsáním

Opravy oprávnění (Eva.Manager)

  • Monitoring.razor — přidán [Authorize(Roles = "Admin, SuperAdmin")] (stránka dříve bez autorizace)
  • SystemInfo.razor — přidán [Authorize(Roles = "Admin, SuperAdmin")] (stránka dříve bez autorizace)

Opravy konfigurace

  • App.razor — JS funkce downloadFileFromStream refaktorována: přidáno document.body.removeChild(a) a setTimeout(() => URL.revokeObjectURL(url), 1000) pro správné uvolnění zdrojů po stažení souboru
  • .gitignore — přidány vzory testconfig.local.json a *.local.json (lokální konfigurace Playwright testů s citlivými credentials)

Verze

  • Directory.Build.props — navýšena verze 1.0.411.0.42

Multitenancy — záchranná síť TenantID (Eva.Data)

  • EvaDataContext.cs — overridy SaveChangesAsync a SaveChanges volají privátní ApplyTenantIdToAddedEntities(); automaticky nastavuje TenantID na všech přidaných ITenantAware entitách kde je null — pokrývá volání context.Add() mimo BaseDataService
  • 001_bartech_tenant_always.sql — nový idempotentní DB skript Eva.Database/updates/v1.4.2/: zajistí existenci Bartech tenanta (OID=1), přiřadí Max licenci bez expirace a přiřadí všechny uživatele s TenantID=NULL k Bartech (TenantID=1)

[1.0.42] — větev AM/v142 — 2026-07-28 (dřívější commity)

Bezpečnost

  • Tenant audit — kompletní kontrola izolace dat: 28 entit pokrytých ITenantAware + EF Core global query filter (ApplyTenantFilters)
  • DB migrace 006_fix_unique_indexes_tenant.sql — opraveny unique indexy na 5 tabulkách chybějících TenantID:
  • Article_Accessory.UIX_Article_Accessory_Name(Name, TenantID)
  • Constants.UIX_Constants_ParamCD(ParamCD, TenantID)
  • Printer.UK_Printer_PrinterCD(PrinterCD, TenantID) (konsolidace duplikátních indexů)
  • PrinterLabel.UK_PrinterLabel_PrinterLabelCD(PrinterLabelCD, TenantID)
  • Print_Request.IX_Print_Request_DT(DT, TenantID)
  • InventoryDataService.CloseInventoryWithAuditAsync — záznamy ArticleAuditLog a ArticleDisposal nyní správně nastavují TenantID

Funkce

  • Správa dat (/tools/data-management) — nová stránka pro správce tenanta:
  • Import vzorových dat (demo-data.json: 10 artiklů, 3 kategorie, 7 typů, 3 stavy, 2 lokality, 3 reporty, tiskárna, 2 štítky)
  • JSON backup (export všech dat tenanta) a restore (import ze zálohy)
  • CSV export artiklů (Excel-compatible, BOM prefix)
  • Report soft-delete — opraveno filtrování smazaných reportů v gridu

Architektura

  • Stored procedures → C# náhrada (tenant-safe, s audit logem):
  • sg_CreateInventoryItemsInventoryDataService.CreateInventoryItemsFromLocationAsync(inventoryId, locationId, force=false) — BFS přes Location hierarchii, Result<int>
  • sg_ExecuteArticleTransferArticleTransferDataService.ExecuteTransferWithAuditAsync(transfer) — aktualizace lokace/stavu/uživatele + ArticleAuditLog, Result<TransferExecuteResult>
  • sg_UpdateArticlesAfterInventoryCloseInventoryWithAuditAsync (od v1.4.1, metoda CloseInventoryAsync označena [Obsolete])
  • TransferExecuteResult — nová result třída (LocationChanges, StateChanges, UserChanges)
  • IInventoryDataService.ConfirmOverwriteError — konstanta pro UI rozlišení "potřeba potvrzení" vs. chyba

[1.0.41] — větev AM/v141 — 2026-07-26

Přidáno

  • /admin/tenant-users — nová stránka pro SuperAdmin: výběr tenanta, DxGrid uživatelů, CRUD (přidat/editovat/smazat), export do CSV (uzivatele_{TenantName}_{datum}.csv)
  • /admin/tenant-export — export celých dat tenanta do JSON + restore (záloha/přenos mezi DB nebo tenanty)
  • /tools/import-articles — kompletní import majetku z CSV šablony (13 sloupců, lazy-create číselníků, volitelné smazání před importem)
  • /tools/import-users — kompletní import uživatelů z CSV šablony (skip duplicitních e-mailů, add-only)
  • TenantExportService — service pro export/restore s INSERT bez OID + RETURNING "OID" + remapování FK referencí napříč všemi vrstvami entit
  • CsvImportService — service pro CSV import majetku a uživatelů (shared template, parse CSV, lazy-create číselníků)
  • 004_codebook_unique_index_per_tenant.sql — migrační skript: unique indexy na číselníkových tabulkách změněny z globálního ("Name") na per-tenant ("Name", "TenantID")
  • Moje organizace (/settings/my-organization) — TenantAdmin může editovat název a kontaktní e-mail své organizace
  • Seed číselníků při registraci — nový tenant dostane automaticky výchozí kategorie, typy a stavy majetku

Změněno

  • Bezpečnost — blokace eskalace role SuperAdmin: UI filtr + server-side guard v EditAccount.razor
  • Filtrování menu dle role: SuperAdmin vidí pouze Správu systému; ostatní role nevidí systémové sekce
  • UploadImport.razor — přístup změněn z Admin, SuperAdmin na Admin, TenantAdmin
  • Users.razor — TenantAdmin vidí pouze uživatele svého tenanta (filtr dle TenantID)
  • Menu JSON (cs/en/de/sk) — přidány položky Správa uživatelů (8.3) a Export/Import dat (8.4) do sekce Správa systému

Opraveno

  • Restore tenanta: chybějící DELETE závislých tabulek před DELETE Article (Transfer_Item, Transfer, Photo_Article_Inventory, Photo_Article, ArticleAuditLog, ArticleDisposal, Article_Assembly, Article_Accessory)
  • Restore tenanta: PK kolize při cross-tenant importu — přepsáno na INSERT bez OID s remapováním FK
  • Restore tenanta: InventoryStateID NOT NULL violation — inventury s null stavem jsou přeskočeny
  • Tenant registrace: překlep „Základit" → „Záložit", auto-generace slugu, chybějící @formname na ForgotPassword
  • DB seed: role TenantAdmin chyběla v install skriptech

[1.0.40] — větev AM/v140 — 2026-05-26

Přidáno

Multitenancy — podpora více organizací (Task24)

  • Tenant.cs — nová EF Core entita; Name, Slug (URL identifikátor), Email, IsActive, CreatedDT
  • ITenantAware — interface; 27 doménových entit implementuje long? TenantID
  • ICurrentTenantAccessor / ClaimsPrincipalTenantAccessor — čte TenantID aktuálního uživatele z JWT claims (WebApi) nebo ASP.NET Identity (Manager)
  • TenantDataService — CRUD pro správu tenantů + RegisterTenantAsync (vytvoří tenant + admin uživatele + výchozí číselníky)
  • 004_005_tenant.sql — PostgreSQL migrace: tabulka Tenant, 26× ALTER TABLE ADD TenantID, indexy, migrace existujících dat na výchozí tenant
  • TenantRegistration.razor — veřejná stránka /account/tenant-registration pro registraci nové firmy (Název, e-mail, heslo)
  • Tenants.razor — Super Admin stránka /admin/tenants pro přehled a správu tenantů (aktivace/deaktivace)
  • MultitenancyOptions — konfigurace Multitenancy:Enabled v appsettings.json

Změněno

  • EF Core Global Query FiltersEvaDataContext automaticky přidá WHERE TenantID = @current pro všechny ITenantAware entity při Multitenancy:Enabled = true
  • BaseDataService.CreateAsync — automaticky injectuje TenantID při vytváření entity
  • JwtTokenService — JWT token nově obsahuje claim tenant_id
  • 27 EF Core entit — implementují ITenantAware (long? TenantID)
  • ApplicationUser — přidán TenantID, navigační property Tenant?
  • Settings.razor — přidána sekce Multitenancy s přepínačem Enabled
  • NavMenu — odkaz /admin/tenants zobrazen pro roli SuperAdmin
  • Lokalizace — 35 nových klíčů v 5 resx souborech (cs-CZ, en-US, de-DE, sk-SK + neutrální)

On-premise vs. SaaS

Multitenancy:Enabled = false (výchozí) zachovává stávající single-tenant chování — vhodné pro on-premise instalace. Enabled = true aktivuje plnou tenant izolaci pro cloud/SaaS nasazení.


Opravy AI nasazení — 2026-05-25

Větev AM/v138 — změny nezcomittovány nebo comittovány bez verze

Přidáno

  • DisabledChatClient.cs — nový: implementace IChatClient sloužící jako placeholder při chybějícím API klíči. Místo null reference loguje chybu a vrací srozumitelnou odpověď.
  • GET /ai/status — anonymní diagnostický endpoint pro ověření stavu AI konfigurace (provider, model, klíč nastaven/nechybí).
  • doc/docker_env.md — kompletní dokumentace všech Docker env proměnných včetně AI nastavení.

Změněno

  • EvaToolsMiddleware.cs — přidán try/catch do GetResponseAsync a nová metoda StreamSafe() pro zachycení chyb při streamování a jejich zapis do logu bez pádu aplikace.
  • Program.cs — startup log obsahuje AI konfiguraci (API klíč maskován, provider, model); přidáno .Trim() na načtený API klíč.
  • DockerExtensions.csConfigureDockerConfiguration čte env proměnné AI_API_KEY (primárně) nebo AI__ApiKey (fallback), AI_PROVIDER, AI_MODEL.
  • appsettings.Docker.json — přidány placeholdery ${AI_API_KEY}, ${AI_PROVIDER}, ${AI_MODEL}.
  • compose-EVA-xtdocker-deploy.yaml — přidány env proměnné AI_API_KEY, AI_PROVIDER, AI_MODEL.

[1.0.39] — 2026-05-24

Task21 — Lokalizace AiChat + nové AI nástroje

Přidáno

  • AiChat.razor — plná lokalizace stránky přes @localizer[...].
  • EvaAiFunctions.cs — nový nástroj eva_aggregate_assets (COUNT + SUM(Price) nad artikly, bez LIMIT, agregace dle parametrů).
  • EvaAiFunctions.cs — nový nástroj eva_query_users (filtr dle jméno/aktivní, volitelně s počty majetku přiřazeného uživateli).
  • EvaAiFunctions.cs — nový nástroj eva_query_user_assets (seznam majetku přiřazeného konkrétnímu uživateli).
  • EvaSystemPrompt.cs — aktualizována pravidla nástrojů (nové nástroje přidány do systémového promptu).
  • Messages.resx (5 jazyků) — přidány lokalizační klíče pro AiChat suggestion bublinky.

Task22+23 — Historie AI konverzací

Přidáno

  • AiConversationService.cs — nová singleton service pro persistenci AI konverzací do DB; ukládá user zprávy, AI odpovědi, tool_call a tool_result záznamy.
  • AiChatSession.cs — nová EF Core entita; hlavička konverzační relace (uživatel, datum, název).
  • AiChatMessage.cs — nová EF Core entita; jednotlivé zprávy / tool_call / tool_result záznamy patřící k relaci.
  • 004_004_NewTable_AI.sql — SQL skript vytvářející tabulky dbo.AiChatSession a dbo.AiChatMessage.
  • EvaDataContext.cs — přidány DbSet<AiChatSession> a DbSet<AiChatMessage>.
  • EvaToolsMiddleware.cs — middleware loguje do DB průchod konverzace (user zprávy, AI odpovědi, tool_call, tool_result).

Dokumentace

  • doc/ai_guide.md — nový vývojářský průvodce pro rozšiřování AI asistenta (jak přidat nástroj, aktualizovat systémový prompt, přidat zdroj dokumentace).

[1.0.38] — 2026-05-24 — AI Chat asistent (Task20)

Přidáno

  • AiChat.razor — nová stránka /ai-chat s DxAIChat (streaming, suggestion bublinky, [Authorize]).
  • EvaAiFunctions.cs — 4 AI nástroje: eva_query_assets, eva_query_inventories, eva_query_transfers, eva_search_docs.
  • EvaDocumentationService.cs — singleton service načítající Markdown soubory z AI:DocsPath; fulltext search (top 3 výsledky, max 2 000 znaků).
  • EvaSystemPrompt.cs — systémový prompt v češtině definující roli, pravidla a dostupné nástroje.
  • EvaToolsMiddleware.csDelegatingChatClient middleware; injectuje nástroje do každého OpenAI volání.
  • menu.json — přidána položka „AI Asistent" (/ai-chat, ikona dx-icon-comment).
  • Program.csAddDevExpressAI(), registrace IChatClient s UseFunctionInvocation().
  • appsettings.json — přidána sekce AI (Provider, Model, MaxTokens, Temperature, DocsPath).

NuGet závislosti

Balíček Verze
DevExpress.AIIntegration.Blazor 25.2.6
Microsoft.Extensions.AI 9.7.1
OpenAI 2.8.0

[1.0.38] — 2026-05-22 — CSS cleanup + Lokalizace (Task18+19)

Task18 — CSS cleanup

  • site.css — opraveny CSS selektory DxGrid pro vybrané řádky (dxbl-grid-selected-row, dxbl-grid-focused-row).
  • Smazány lokální soubory: dx.light.css, bootstrap.css, open-iconic/, icons/dxicons.* — nahrazeno CDN DevExpress.

Task19 — Lokalizace Eva.Manager (11 Razor stránek)

Lokalizovány stránky a komponenty

Articles.razor, ArticlesLocations.razor, ArticlesDataAudit.razor, ArticleSelectionGrid.razor, InventoryActionButtons.razor, InventoryItemSelectionGrid.razor, InventoryItemsGrid.razor, MyAssets.razor, Transfer.razor, GridArticleDisposals.razor, GridArticleInventories.razor, GridArticleTransfers.razor, InventoryStatusTable.razor, QuickActions.razor

Resource soubory

  • Resource.resx (5 jazyků) — 70 nových klíčů.
  • Messages.resx (5 jazyků) — 19 nových klíčů.
  • doc/developer-guide.md — přidána sekce „Lokalizace" (Resource.resx, Messages.resx, konvence klíčů).

Nové agenty

  • dx-lang.md — agent pro lokalizaci hardcoded textů v Razor stránkách.

[1.0.29] — 2026-05-xx — ArticleDisposal (TASK 17)

Přidáno

Nová entita a tabulka ArticleDisposal

  • ArticleDisposal.cs — nová EF Core entita se sloupci: OID, ArticleID, DisposalDT, DisposalByUserID, DisposalReasonID, DisposalMethodID, Quantity, IsDisposal.
  • 004_003_NewTable_ArticleDisposal.sql — SQL skript pro vytvoření tabulky.
  • EvaDataContext.cs — přidán DbSet<ArticleDisposal>; navigační kolekce ArticleDisposals v entitě Article.
  • IArticleDisposalDataService + ArticleDisposalDataService — nová datová vrstva (metoda GetByArticleIdAsync); registrována v AddEvaDataServices().

Logika uzavření inventury (TASK 17)

  • InventoryDataService.CloseInventoryWithAuditAsync — rozšířeno o:
    1. Vytvoření záznamu ArticleDisposal pro každou položku s IsApprovedDisposal = true (disposedQty = OriginalQuantity − InventoryQuantity, Varianta A).
    2. Přepočet Article.Quantity = SUM(ArticleLocation.Quantity) po uzavření.
    3. Automatické označení artiklu jako vyřazeného (IsDisposal = true) pokud Article.Quantity <= 0.

UI — záložka Vyřazení v detailu artiklu (TASK 17)

  • ArticleEditForm.razor — nová záložka „Vyřazení" za záložkou „Umístění":
    • Read-only přehled: Vyřazený, Datum vyřazení, Vyřadil, Důvod, Způsob (přesunuto z záložky „Karta Majetku").
    • Nový grid GridArticleDisposals.razor — sloupce: Datum, Množství, Důvod, Způsob, Vyřadil.

[1.0.28] — 2026-04-28/29 — Průvodce inventurou, fix UserID (TASK 15 + 16 FIX)

Přidáno

Průvodce novou inventurou (TASK 15)

  • InventoryNewWizard.razor (@page "/inventories/new") — nový dvoukrokový průvodce zakládáním inventury:
    • Krok 1 — výběr zdroje: Podle majetku (filtry: Lokace rekurzivně, Kategorie, Přiřazená osoba, Odpovědná osoba) nebo Podle stávající inventury (DxDropDownBox).
    • Krok 2 — interaktivní grid výběru položek s SelectAllCheckboxMode="AllPages".
  • ArticleSelectionGrid.razor — sdílená komponenta; sloupce: Selection, ID, Inventární číslo, Název, Kategorie, Přiřazená osoba, Odpovědná osoba, Výchozí umístění.
  • InventoryItemSelectionGrid.razor — sdílená komponenta; sloupce: Selection, ID, Inventární číslo, Název, Přiřazená osoba, Stav, Evidenční lokace, Nalezená lokace, Hotovo.
  • CreateInventoryFromArticlesAsync — nová business metoda nahrazující stored procedure sg_CreateInventoryItems pro zakládání nových inventur.

Smazání inventury (TASK 15)

  • Inventories.razor — nové tlačítko „Smazat" dostupné pro Admin/InventoryManager. Vyžaduje potvrzení vepsáním slova DELETE do DxPopup.
  • DeleteWithItemsAsync — transakční smazání: kaskádově odstraní InventoryItem + Inventory.

Refaktorizace (TASK 15)

  • InventoryEditForm.razor — odebrán @page "/inventories/new", odebrána větev IsNew (nové inventury se zakládají výhradně přes průvodce).

Opraveno

Fix UserID v inventuře (TASK 16 FIX)

  • InventoryItemsGrid.razor — opravena chyba: UserID nebyl nastaven při inventarizaci položky. Opravena 3 místa: QuickInventoryOk, ExecuteNotMine, ApplyPerformInventoryModel.

[1.0.27] — 2026-04-28

Přidáno

Eva Mobile PWA (Task 16)

  • Eva.Mobile.Pwa — Blazor WebAssembly PWA pro běžné uživatele; dostupná na https://meva.inventura-majetku.cz.
  • JWT autentizace (EvaAuthStateProvider, AuthorizationHandler s Bearer tokenem).
  • Nové API endpointy: POST /api/pwa-auth/login-password, GET /api/articles/my-assets/{userId}, GET /api/inventories/my-inventories/{userId}.
  • Stránky: Přihlášení, Domů, Můj majetek (přiděleno/odpovídá), Detail majetku, Moje inventury, Detail inventury.
  • Mobilní layout (TopBar + BottomNavigation).

Správa inventur (TASK 15)

  • Smazání inventury — nová funkce v seznamu inventur (Inventories.razor) pro Admina a Správce. Vyžaduje potvrzení vepsáním slova "DELETE".
  • Průvodce novou inventurou (InventoryNewWizard.razor) — kompletně nový proces zakládání:
    • Výběr zdroje: Podle majetku (lokace rekurzivně, kategorie, osoby) nebo Podle stávající inventury.
    • Interaktivní gridy pro výběr konkrétních položek před vytvořením.
    • Nová business logika pro zakládání na straně serveru (nahrazuje původní uloženou proceduru).
  • Podpora pro null lokaci v modelu inventury.

UI a UX Inventury (TASK 14)

  • KPI Dashboard v detailu — integrace KPI karet přímo do prvního tabu karty inventury.
  • Interaktivní KPI karty — kliknutí na kartu (např. "Zbývá", "Rozdíly") automaticky přepne na seznam položek a aplikuje příslušný filtr.
  • Nový validační panel (InventoryValidationPanel.razor) — inteligentní panel chyb a varování:
    • Automatické sbalení (collapse) při velkém počtu záznamů.
    • Rychlé přepínání zobrazení detailů.
    • Barevné indikátory (badge) se souhrnem stavu.
  • Filtrování "Přidáno navíc" — nový pohled v gridu položek pro artikly nalezené mimo plán.

Změněno

  • Restrukturalizace InventoryEditForm — KPI a akční tlačítka přesunuta do tabů pro získání více vertikálního prostoru pro grid položek.
  • Refaktorizace komponent — vyextrahovány samostatné komponenty InventoryKpiPanel a InventoryValidationPanel.

[1.0.26] — větev AM/monitoring — 2026-04-24

Přidáno

Monitoring & Diagnostika (TASK13 / T17) (2026-04-22 – 2026-04-23)

  • src/Eva.Manager/Components/Pages/Monitoring.razor — nová admin stránka /monitoring s live metrikami (paměť, GC, thread pool, health)
  • AppMetricsService & AppSnapshot — real-time sběr systémových metrik pro UI
  • Integrace Prometheus — export metrik na /metrics (balíčky prometheus-net.AspNetCore a DotNetRuntime)
  • Integrace Health Checks/health (Docker) a /health/details (JSON pro monitoring); kontrola DB a paměťových limitů
  • Dokumentace a postupy pro nastavení Grafana dashboardů (ID 10427, 23179) a Prometheus scrape jobu

Infrastruktura & Stabilita (2026-04-20)

  • Data Protection perzistence — klíče se nyní ukládají do Docker volume manager_dp_keys (v /app/dataprotection-keys); řeší odhlašování uživatelů po restartu kontejneru
  • Docker Healthcheck — automatické sledování stavu kontejneru přes /health endpoint
  • Memory limits v Dockeru — nastaven limit 768 MB (původně) resp. doporučeno 1 536 MB pro stabilitu při generování reportů

Změněno

Komponenty & Životní cyklus (TASK10) (2026-04-20)

  • Odstranění StreamRendering(true) u klíčových komponent (Transfers, InventoryEditForm) — eliminace race-condition při inicializaci (vícenásobné volání OnInitializedAsync)
  • Implementace IAsyncDisposable & CancellationToken v komponentách — prevence ObjectDisposedException při asynchronních operacích po zavření stránky
  • EF Core Concurrency — důsledné používání IDbContextFactory a using var db v asynchronních metodách

DxCheckBox (2026-04-20)

  • Oprava InvalidOperationException u DxCheckBox přidáním ValidationEnabled="false" u statických/read-only prvků bez @bind-Checked

Opraveno

  • Antiforgery token decryption error — vyřešeno perzistencí Data Protection klíčů
  • InvalidOperationException (DbContext threading) — vyřešeno opravou životního cyklu komponent a factory patternem
  • ObjectDisposedException — vyřešeno korektním rušením asynchronních úloh přes CancellationToken

[1.0.25] — větev AM/v123 — 2026-04-16

Přidáno

Solution & infrastruktura (2026-03-31)

  • Restrukturalizace solution — veškerý zdrojový kód přesunut do src/; integrace všech projektů do Eva.slnx / Eva.Manager.slnx
  • Docker soubory aktualizovány po přesunu adresářové struktury
  • .claude/settings.local.json přidáno do .gitignore

Dashboard (2026-04-01)

  • Zcela přepracovaný Index.razor — KPI dlaždice, tabulka inventur, akční panel, dva grafy (vyřazení v čase, kvalita inventur)
  • DashboardKpiCard, InventoryStatusTable, ActionPanel, DashboardCharts — nové sub-komponenty dashboardu
  • Zobrazení verze aplikace v patičce dashboardu (AppEnv.GetShortVersion())

Jazyková podpora — 4 jazyky (2026-04-01)

  • LanguageSwitcher.razor přepracován z toggle (CS/EN) na dropdown se 4 jazyky: 🇨🇿 Česky / 🇸🇰 Slovensky / 🇬🇧 English / 🇩🇪 Deutsch
  • Nové .resx soubory: Messages.sk-SK, Messages.de-DE, Resource.sk-SK, Resource.de-DE (každý ~58–160 klíčů)
  • Nové menu soubory: menu.en-US.json, menu.sk-SK.json, menu.de-DE.json
  • MenuService — culture-aware načítání menu.{culture}.json s fallback na menu.json
  • Program.cs — rozšíření supportedCultures o sk-SK a de-DE

Publikační infrastruktura (2026-04-02)

  • PowerShell skripty pro publikaci Docker imagí EVA na Docker Hub
  • NuGet skripty pro Libs.Bartech.Printing.Core — vytvoření a publikace balíčků
  • Dokumentace publikačního procesu

Security hardening (2026-04-02 – 2026-04-03)

  • Citlivé proměnné v Docker Compose souborech nahrazeny env proměnnými (hesla, tokeny)
  • Aktualizace dokumentace nasazení

TASK103 — Odstranění markdown dokumentace z aplikace (2026-04-03)

  • Smazána složka Eva.Manager/Docs/ (16 .md souborů + obrázky)
  • Odstraněny: DocsViewer.razor, MarkdownInterop.cs, závislosti Markdig, Prism
  • Odkaz "Manuál k aplikaci" nyní otevírá https://evadoc.xtrace.cz (nový target _blank)

TASK104 — Oprava dev konfigurace Program.cs (2026-04-03)

  • Substituce ${DB_HOST/PORT/PASSWORD} podmíněna na !IsDevelopment() — v Dev režimu se načítají credentials přímo z appsettings.Development.json
  • DataProtection: Development → výchozí user-profile cesta; Docker/Production → /tmp/aspnet/dataprotection

DevExpress lokalizace (2026-04-16)

  • copIt.cmd — robocopy skript pro kopírování lokalizačních DLL DevExpress Blazor komponent
  • Přidány lokalizační DLL pro cs-CZ a sk-SK (DevExpress Blazor)

DevExpress licence (2026-04-16)

  • Refaktorizace načítání DevExpress licence z environment proměnných
  • Přidána kontrola alternativní cesty při nenalezení licence

SystemInfo služba a stránka (2026-04-16)

  • Eva.Data/Services/SystemInfoDataService — PostgreSQL dotaz: current_database, pg_size_pretty, version(), inet_server_addr(), port, pg_postmaster_start_time(), uptime
  • Eva.Data/Services/dto/DatabaseInfo — record s výsledky dotazu
  • Eva.Manager/Services/SystemInfoService — kombinuje verzi aplikace, connection string (host, database) a live DB info
  • Components/Pages/SystemInfo.razor — nová stránka /system-info (pouze Admin), sekce: Aplikace / Databáze / Server
  • Components/shared/SysInfoRow.razor — znovupoužitelná subkomponenta řádku s volitelným zvýrazněním
  • Přidána položka "Systémové informace" (5.3) do menu — všechny 4 jazykové varianty

Změněno

API — optimalizace (2026-03-31)

  • Výkonnostní optimalizace API endpointů

NuGet balíčky (2026-04-13)

  • Hromadná aktualizace na kompatibilní verze s .NET 10

DxGrid komponenty — refaktorizace (2026-04-13)

  • Nahrazen InstantFeedbackSourceGridDevExtremeDataSource / IReadOnlyList dle velikosti datasetu
  • Přidány DxLoadingPanel pro stránky s pomalým načítáním
  • Inventories.razor — optimalizace po analýze dx-expert

ArticlesLocations.razor (2026-04-14)

  • Přidáno ukládání layoutu gridu do localStorage
  • Přepínače zobrazení (filter row, group panel, page size, search box)
  • Hromadná změna odpovědné osoby a přiřazeného uživatele
  • Nové lokalizační klíče v Resource.cs-CZ.resx

Articles.razor (2026-04-14 + 2026-04-16)

  • Persistování layoutu DxGrid
  • Oprava akumulace výběru při hromadných akcích — SelectedDataItems = null po každé akci
  • Přidáno tlačítko "Zruš označení" do toolbaru (dx-icon-clearsquared)
  • Ikony přidány ke všem toolbar položkám; hromadné akce ikonou dx-icon-checklist
  • Nastavení gridu přesunuto do submenu dx-icon-setup

InventoryItemsGrid.razor (2026-04-15 + 2026-04-16)

  • Rozšíření gridu: sloupce Přiřazená osoba a Odpovědná osoba
  • Inline editace přes EditFormTemplate — 3-sloupcový layout
  • Hromadná akce "Proveď inventuru" (popup), "Kopírovat do jiné inventury"
  • Filtrování položek dle role uživatele
  • Refaktorizace: přímý DbContext přístup nahrazen service vrstvou (IReadOnlyList)
  • Lokalizace všech hardcoded textů — 31 nových klíčů v Resource.resx + 2 v Messages.resx
  • Oprava akumulace výběru — SelectedDataItems = null po 7 bulk akcích
  • Ikony ke všem toolbar položkám (TASK13b)
  • Filter skupina a nastavení gridu jako submenu (ručně dle TASK13 vzoru)

Transfers (2026-04-14)

  • TransferEmailService — emailové notifikace při vytvoření/schválení/zamítnutí převodů
  • PIN popup ověřování při potvrzení převodu majetku
  • Přizpůsobitelná nastavení DxGrid (filter row, group panel, page size)
  • Aktualizace sloupce stavu v Transfers gridu

ToastMessageService (2026-04-14)

  • Odstranění duplicitních DxToastProvider komponent
  • Přejmenování proměnných pro konzistentní formát
  • Refaktorizace lokalizačních volání

EF Core — oprava concurrency (2026-04-16)

  • UserManager queries nahrazeny IDbContextFactory<ApplicationUsers> napříč komponentami (Articles, Transfers, Inventory, Layout) — řeší InvalidOperationException: A second operation was started
  • appsettings.json a appsettings.Development.template.json — aktualizace konfigurace emailu

Docker compose (2026-04-16)

  • Odstraněny zastaralé compose soubory (_web-only, _with_Print varianty)
  • Refaktorizace deployment setupu — vylepšené zabezpečení a logování

PowerShell publish skripty (2026-04-16)

  • Odstranění diakritiky z výstupních zpráv (kompatibilita v PowerShell)
  • Lokalizace promptů, zavedení krokových zpráv, nové helper funkce

Index.razor — patička (2026-04-16)

  • Přímý IDbContextFactory a IConfiguration odstraněny; nahrazeny SystemInfoService
  • Patička zobrazuje: verze | DB host | DB name | DB size (flex lišta s ikonami)

dx-expert SKILL.md (2026-04-16)

  • Sekce "Toolbar — standardní vzor" přepracována: povinné pořadí položek, vzory pro "Zruš označení", nastavení gridu jako submenu, kompletní ikonová paleta

Opraveno

  • EF Core concurrencyInvalidOperationException: A second operation was started on this context v komponentách s UserManager — viz EF Core sekce výše
  • DevExpress_License — opravena velikost písmen env proměnné v DockerExtensions.cs
  • DxToastProvider — duplicitní instance způsobovaly problémy s notifikacemi

[Unreleased] — větev AM/Theme — 2026-03-30

Přidáno

Runtime přepínání témat (Eva.Manager)

  • ThemeSwitcher — plovoucí panel s barevnými vzorky v nav liště (vpravo), implementovaný dle DevExpress doporučení T845557
  • 6 témat: Fluent Light, Fluent Dark, Blazing Berry, Blazing Dark, Purple, Office White
  • Perzistence tématu v cookie eva-theme — obnoví se při každém reload bez bliknutí
  • CookiesService (Eva.Manager/Services/CookiesService.cs) — čtení cookie přes IHttpContextAccessor (SSR), zápis přes JS setCookie
  • Pozadí draweru dle tématu — CSS proměnná --eva-drawer-panel-bg, každé téma má vlastní gradient v wwwroot/css/themes/theme-*.css
  • ThemeSwitcher/ komponentyThemeSwitcher.razor, ThemeSwitcherContainer.razor, ThemeSwitcherItem.razor
  • wwwroot/css/theme-switcher.css — styly panelu (plovoucí panel, barevné vzorky s hover efektem)
  • wwwroot/css/themes/ — 6 per-theme CSS souborů s definicí --eva-drawer-panel-bg
  • NuGet.Config — konfigurace zdrojů a source mapping (devexpress, baget.xtrace.cz, nuget.org)
  • Directory.Build.props — sdílené MSBuild vlastnosti pro všechny projekty
  • Directory.Packages.props — Central Package Management, 36 verzí balíčků
  • Eva.slnx / Eva.Manager.slnx — nový formát solution souborů (náhrada za .sln)
  • doc/ — adresář dokumentace (přesunuto z Eva.Manager/docs/DEV/ a kořene repozitáře)
  • doc/task/claude_task1.md — detailní záznam všech úkolů TASK1–TASK3 s výsledky

Změněno

Eva.Manager

  • App.razorRegisterTheme(ThemesService.ActiveTheme) místo hardcoded FluentLight; inline <script> s setCookie; <link> pro theme-switcher.css
  • MainLayout.razor — odstraněn DxThemeProvider wrapper, přidán <ThemeSwitcher /> v nav liště
  • DxThemes.csDxThemesService přepsán: konstruktor injektuje CookiesService + IThemeChangeService + IHttpContextAccessor; nová SetActiveThemeAsync(); explicitní Name pro FluentLight/FluentDark v Clone; každé téma načítá per-theme CSS soubor
  • ServiceCollectionExtensions.cs — přidána registrace AddTransient<CookiesService>()
  • Program.cs — přidáno AddHttpContextAccessor()
  • Components/_Imports.razor — přidány @using Eva.Manager.Components.Layout.ThemeSwitcher a @using Eva.Manager.Services
  • Drawer.razor.css — gradient nahrazen var(--eva-drawer-panel-bg, <fallback>)
  • wwwroot/css/site.css — opravena chyba open.iconicopen-iconic (404 fix)
  • Eva.Manager.csproj — CPM: odstraněny Version atributy, přidána sdílená vlastnosti z Directory.Build.props
  • Components/Layout/Routes.razor — (klíčová oprava) přidáno @rendermode="@RenderModeForPage" — bez toho byla celá app SSR a interaktivní komponenty nefungovaly

Všechny projekty (.csproj)

  • Odstraněny Version atributy z <PackageReference> — verze spravuje Directory.Packages.props
  • Odstraněny duplicitní vlastnosti (TargetFramework, Nullable, ImplicitUsings) — přesunuty do Directory.Build.props

Odstraněno

  • Eva.sln, Eva.Manager.sln — nahrazeny .slnx soubory
  • Eva.Manager/docs/DEV/ — dokumentace přesunuta do doc/
  • howto.md (kořen) — přesunuto do doc/howto.md
  • qodana.yaml — odstraněno
  • ThemeLoader.razor — nahrazen cookie přístupem (soubor existuje ale je prázdný)
  • ThemePicker.razor — nahrazen ThemeSwitcher komponentou (soubor existuje ale je prázdný)

Opraveno

  • SSR/Interactive render mode<Routes/> bez @rendermode způsoboval SSR pro celou app; opraveno přidáním @rendermode="@RenderModeForPage" (InteractiveServerRenderMode(prerender: false))
  • setCookie JSExceptionwindow.setCookie nebylo dostupné z externího .js souboru; přesunuto jako inline script do App.razor
  • open-iconic 404 — překlep open.iconicopen-iconic v site.css

Starší změny (z git logu větve master)

2026-03 — db2bb89

  • Merge branch master

2026-03 — effc853

  • Povolení WRITE_EXTERNAL_STORAGE (Android)

2026-03 — b3ee431 / 5ff557c / af557c0

  • Foto část 2 — event network, doplnění

2026-03 — 65dd780

  • Přidán .claude/ do .gitignore

2026-03 — a2446de

  • Azure AD login + zabezpečení konfigurace (OpenID Connect, automatická registrace uživatelů, mapování rolí)

2026-03 — 91101f4

  • Tisk z Docker kontejneru — RAW TCP/IP, default port 9100, Windows WinSpool

2026-03 — 4858f40 / fa83c97 / 04cd6bb / 65ab8be

  • Foto část 1 — implementace, build fix v Dockeru

2026-03 — 578f724

  • Upraven build DB, přidán vlastní updater (entrypoint), přidán volume

2026-02 — 860c781 / b36ef21 / f2b822c / 69e8597

  • Vizuální úpravy, tisk štítku při inventuře, dokumentace