diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index a019b102..fd77ad4b 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -81,7 +81,11 @@
"WebFetch(domain:fruitveb.hu)",
"PowerShell(Get-Item \"H:\\\\Applications\\\\Aycode\\\\Source\\\\AyCode.Core\\\\AyCode.Services\\\\Nav\\\\docs\\\\eKAERManagementService_2.2.pdf\" | Select-Object Length, LastWriteTime, CreationTime; try { $r = Invoke-WebRequest -Uri \"https://ekaer.nav.gov.hu/faq/content/uploads/2025/05/eKAERManagementService_2.2.pdf\" -Method Head -UseBasicParsing; \"Online Content-Length: $\\($r.Headers['Content-Length']\\); Last-Modified: $\\($r.Headers['Last-Modified']\\)\" } catch { \"HEAD request failed: $\\($_.Exception.Message\\)\" })",
"PowerShell($out = dotnet build \"H:\\\\Applications\\\\Mango\\\\Source\\\\NopCommerce.Common\\\\4.70\\\\Plugins\\\\Nop.Plugin.Misc.AIPlugin\\\\Nop.Plugin.Misc.FruitBankPlugin.csproj\" -v q --nologo 2>&1 | Out-String; $errLines = \\($out -split \"`n\"\\) | Where-Object { $_ -match \": error \" }; \"Osszes hiba-sor: $\\($errLines.Count\\)\"; $errLines | ForEach-Object { if \\($_ -match \"\\([A-Za-z]+\\\\.cs\\)\"\\) { $matches[1] } } | Group-Object | Sort-Object Count -Descending | Format-Table Name, Count -AutoSize)",
- "PowerShell($out = dotnet build \"H:\\\\Applications\\\\Mango\\\\Source\\\\NopCommerce.Common\\\\4.70\\\\Plugins\\\\Nop.Plugin.Misc.AIPlugin\\\\Nop.Plugin.Misc.FruitBankPlugin.csproj\" -v q --nologo 2>&1 | Out-String; $errLines = \\($out -split \"`n\"\\) | Where-Object { $_ -match \": error \" }; \"Osszes hiba-sor: $\\($errLines.Count\\)\"; $errLines | Where-Object { $_ -match \"FruitBankDataController\" } | Select-Object -First 5)"
+ "PowerShell($out = dotnet build \"H:\\\\Applications\\\\Mango\\\\Source\\\\NopCommerce.Common\\\\4.70\\\\Plugins\\\\Nop.Plugin.Misc.AIPlugin\\\\Nop.Plugin.Misc.FruitBankPlugin.csproj\" -v q --nologo 2>&1 | Out-String; $errLines = \\($out -split \"`n\"\\) | Where-Object { $_ -match \": error \" }; \"Osszes hiba-sor: $\\($errLines.Count\\)\"; $errLines | Where-Object { $_ -match \"FruitBankDataController\" } | Select-Object -First 5)",
+ "PowerShell($xml = Get-ChildItem \"$env:USERPROFILE\\\\.nuget\\\\packages\\\\devexpress.blazor\" -Recurse -Filter \"DevExpress.Blazor.xml\" -ErrorAction SilentlyContinue | Select-Object -Last 1; if \\($xml\\) { $xml.FullName; Select-String -Path $xml.FullName -Pattern \"MessageBoxOptions\\\\.\\(BodyTemplate|CssClass|Text|Title\\)\" | Select-Object -First 8 | ForEach-Object { $_.Line.Trim\\(\\).Substring\\(0, [Math]::Min\\(120, $_.Line.Trim\\(\\).Length\\)\\) } } else { \"DevExpress.Blazor.xml nem talalhato a NuGet cache-ben\" })",
+ "PowerShell($lib = Get-ChildItem \"$env:USERPROFILE\\\\.nuget\\\\packages\\\\devexpress.blazor\" -Directory | Sort-Object Name | Select-Object -Last 1; \"Verzio: $\\($lib.Name\\)\"; $dll = Get-ChildItem $lib.FullName -Recurse -Filter \"DevExpress.Blazor.dll\" | Select-Object -First 1; $asm = [System.Reflection.Assembly]::LoadFile\\($dll.FullName\\); $t = $asm.GetType\\(\"DevExpress.Blazor.MessageBoxOptions\"\\); if \\($t\\) { $t.GetProperties\\(\\) | Select-Object -ExpandProperty Name } else { \"MessageBoxOptions tipus nem talalhato\" })",
+ "PowerShell($dll = Get-ChildItem \"$env:USERPROFILE\\\\.nuget\\\\packages\\\\devexpress.blazor\\\\25.1.5\" -Recurse -Filter \"DevExpress.Blazor.dll\" | Select-Object -First 1; $dll.FullName; $bytes = [System.IO.File]::ReadAllBytes\\($dll.FullName\\); $text = [System.Text.Encoding]::ASCII.GetString\\($bytes\\); @\\(\"BodyTemplate\",\"CssClass\",\"MessageBoxOptions\"\\) | ForEach-Object { \"$\\($_\\): $\\($text.Contains\\($_\\)\\)\" })",
+ "PowerShell($dll = \"C:\\\\Users\\\\Fullepi\\\\.nuget\\\\packages\\\\devexpress.blazor\\\\25.1.5\\\\lib\\\\net8.0\\\\DevExpress.Blazor.v25.1.dll\"; $bytes = [System.IO.File]::ReadAllBytes\\($dll\\); $text = [System.Text.Encoding]::ASCII.GetString\\($bytes\\); @\\(\"BodyTemplate\",\"get_CssClass\",\"MessageBoxOptions\",\"TitleTemplate\"\\) | ForEach-Object { \"$\\($_\\): $\\($text.Contains\\($_\\)\\)\" })"
]
}
}
diff --git a/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor b/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor
index 21496a74..6f015740 100644
--- a/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor
+++ b/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor
@@ -293,8 +293,9 @@
}
// Az adathiány/formátumhiba miatt KIHAGYOTT jelöltek üzenetei popupban — ezeket javítani kell, mielőtt bekerülhetnek.
+ // A lista-overload üzenetenként külön sort ad (a Text-be fűzött sortöréseket a HTML elnyelné); a cím hozza a darabszámot.
if (result?.Messages is { Count: > 0 } skipped)
- await DialogService.ShowMessageBoxAsync("EKÁER — kihagyott tételek", string.Join(Environment.NewLine, skipped), MessageBoxRenderStyle.Warning);
+ await DialogService.ShowMessageBoxAsync($"EKÁER — kihagyott tételek ({skipped.Count})", skipped, MessageBoxRenderStyle.Warning);
}
private async Task OnDownloadClick(EkaerHistory ekaerHistory)
diff --git a/FruitBankHybrid.Shared/Extensions/DevexpressComponentExtensions.cs b/FruitBankHybrid.Shared/Extensions/DevexpressComponentExtensions.cs
index 6cca84f4..906d9a4b 100644
--- a/FruitBankHybrid.Shared/Extensions/DevexpressComponentExtensions.cs
+++ b/FruitBankHybrid.Shared/Extensions/DevexpressComponentExtensions.cs
@@ -12,6 +12,19 @@ public static class DevexpressComponentExtensions
await messageBox.AlertAsync(messageBoxOptions);
}
+ /// Több-üzenetes messagebox: minden üzenet KÜLÖN SORBAN jelenik meg. A sima Text-be fűzött
+ /// sortörések a HTML-renderelésnél szóközzé olvadnának — a CssClass + a white-space: pre-line
+ /// szabály (app.css: .fb-msgbox-multiline) tartja meg őket. (A MessageBoxOptions-nek nincs
+ /// BodyTemplate-je, ezért CSS-megoldás.)
+ public static async Task ShowMessageBoxAsync(this IDialogService messageBox, string title, IReadOnlyCollection lines, MessageBoxRenderStyle messageBoxRenderStyle)
+ {
+ // "• " prefix = lista-hatás (a MessageBoxOptions csak sima szöveget tud, /- nem lehetséges).
+ var messageBoxOptions = CreateMessageBoxOptions(title, string.Join(Environment.NewLine, lines.Select(l => $"• {l}")), messageBoxRenderStyle);
+ messageBoxOptions.CssClass = "fb-msgbox-multiline";
+
+ await messageBox.AlertAsync(messageBoxOptions);
+ }
+
public static async Task ShowConfirmBoxAsync(this IDialogService messageBox, string title, string text, MessageBoxRenderStyle messageBoxRenderStyle)
{
var messageBoxOptions = CreateMessageBoxOptions(title, text, messageBoxRenderStyle);
diff --git a/FruitBankHybrid.Shared/wwwroot/app.css b/FruitBankHybrid.Shared/wwwroot/app.css
index ba0dd004..23c17938 100644
--- a/FruitBankHybrid.Shared/wwwroot/app.css
+++ b/FruitBankHybrid.Shared/wwwroot/app.css
@@ -3,6 +3,12 @@ html, body {
min-height: 100vh;
}
+/* Több-üzenetes messagebox (DevexpressComponentExtensions.ShowMessageBoxAsync lista-overload):
+ a Text-be fűzött sortörések valódi sorokként jelenjenek meg (a white-space öröklődik a dialógus törzsébe). */
+.fb-msgbox-multiline {
+ white-space: pre-line;
+}
+
a, .btn-link {
color: #006bb7;
}