Compare commits

..

2 Commits

Author SHA1 Message Date
OlgunR
789066a214 Replace HTML entities with Latin-1 bytes in UI strings
Replaced HTML-encoded German special characters with their Windows-1252 (Latin-1) encoded byte equivalents in user-facing strings in CatalogsGrid.razor and MassDataGrid.razor. Renamed and expanded the reset layout method for improved layout reset behavior. Updated button labels and info messages for consistency. These changes address encoding and rendering issues by shifting from HTML entities to direct byte encoding.
2026-02-23 09:13:12 +01:00
OlgunR
964d508630 Persist grid SizeMode in BandLayout for layout restore
Added SizeMode property to BandLayout in both CatalogsGrid.razor and MassDataGrid.razor. The grid's current SizeMode is now saved and restored with the layout, ensuring user preferences for grid sizing persist across sessions. This improves the consistency of the user experience when reloading or switching layouts.
2026-02-23 08:55:53 +01:00
2 changed files with 52 additions and 18 deletions

View File

@@ -75,15 +75,15 @@ else if (!string.IsNullOrWhiteSpace(infoMessage))
} }
else if (items.Count == 0) else if (items.Count == 0)
{ {
<p>Keine Eintr&#228;ge vorhanden.</p> <p>Keine Einträge vorhanden.</p>
} }
else else
{ {
<div class="band-editor"> <div class="band-editor">
<div class="band-controls"> <div class="band-controls">
<DxButton Text="Band hinzuf&#252;gen" Click="AddBand" /> <DxButton Text="Band hinzufügen" Click="AddBand" />
<DxButton Text="Layout speichern" Click="SaveLayoutAsync" Enabled="@CanSaveBandLayout" /> <DxButton Text="Layout speichern" Click="SaveLayoutAsync" Enabled="@CanSaveBandLayout" />
<DxButton Text="Band-Layout zur&#252;cksetzen" Click="ResetBandLayoutAsync" /> <DxButton Text="Layout zurücksetzen" Click="ResetLayoutAsync" />
</div> </div>
@foreach (var band in bandLayout.Bands) @foreach (var band in bandLayout.Bands)
{ {
@@ -211,8 +211,8 @@ else
new() { FieldName = nameof(CatalogReadDto.CatString), Caption = "String", FilterType = ColumnFilterType.Text }, new() { FieldName = nameof(CatalogReadDto.CatString), Caption = "String", FilterType = ColumnFilterType.Text },
new() { FieldName = nameof(CatalogReadDto.AddedWho), Caption = "Angelegt von", ReadOnly = true, FilterType = ColumnFilterType.Text }, new() { FieldName = nameof(CatalogReadDto.AddedWho), Caption = "Angelegt von", ReadOnly = true, FilterType = ColumnFilterType.Text },
new() { FieldName = nameof(CatalogReadDto.AddedWhen), Caption = "Angelegt am", ReadOnly = true, FilterType = ColumnFilterType.Date }, new() { FieldName = nameof(CatalogReadDto.AddedWhen), Caption = "Angelegt am", ReadOnly = true, FilterType = ColumnFilterType.Date },
new() { FieldName = nameof(CatalogReadDto.ChangedWho), Caption = "Ge&#228;ndert von", ReadOnly = true, FilterType = ColumnFilterType.Text }, new() { FieldName = nameof(CatalogReadDto.ChangedWho), Caption = "Geändert von", ReadOnly = true, FilterType = ColumnFilterType.Text },
new() { FieldName = nameof(CatalogReadDto.ChangedWhen), Caption = "Ge&#228;ndert am", ReadOnly = true, FilterType = ColumnFilterType.Date } new() { FieldName = nameof(CatalogReadDto.ChangedWhen), Caption = "Geändert am", ReadOnly = true, FilterType = ColumnFilterType.Date }
}; };
private readonly List<ProcedureOption> procedureOptions = new() private readonly List<ProcedureOption> procedureOptions = new()
@@ -434,7 +434,7 @@ else
if (editModel.UpdateProcedure == 0 && if (editModel.UpdateProcedure == 0 &&
!string.Equals(editModel.CatTitle, editModel.OriginalCatTitle, StringComparison.OrdinalIgnoreCase)) !string.Equals(editModel.CatTitle, editModel.OriginalCatTitle, StringComparison.OrdinalIgnoreCase))
{ {
AddValidationError(editModel, nameof(CatalogEditModel.CatTitle), "Titel kann nicht ge&#228;ndert werden."); AddValidationError(editModel, nameof(CatalogEditModel.CatTitle), "Titel kann nicht geändert werden.");
return false; return false;
} }
@@ -453,12 +453,12 @@ else
var deleted = await Api.DeleteAsync(item.Guid); var deleted = await Api.DeleteAsync(item.Guid);
if (!deleted.Success) if (!deleted.Success)
{ {
errorMessage = deleted.Error ?? "L&#246;schen fehlgeschlagen."; errorMessage = deleted.Error ?? "Löschen fehlgeschlagen.";
e.Cancel = true; e.Cancel = true;
return; return;
} }
infoMessage = "Katalog gel&#246;scht."; infoMessage = "Katalog gelöscht.";
await LoadCatalogs(); await LoadCatalogs();
} }
catch (Exception ex) catch (Exception ex)
@@ -515,6 +515,7 @@ else
var layout = gridRef.SaveLayout(); var layout = gridRef.SaveLayout();
bandLayout.GridLayout = layout; bandLayout.GridLayout = layout;
bandLayout.SizeMode = _sizeMode;
var orderedColumns = layout.Columns var orderedColumns = layout.Columns
.Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
@@ -552,10 +553,11 @@ else
columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); columnBandAssignments = BuildAssignmentsFromLayout(bandLayout);
ApplyColumnLayoutFromStorage(); ApplyColumnLayoutFromStorage();
_sizeMode = bandLayout.SizeMode;
UpdateBandOptions(); UpdateBandOptions();
} }
private async Task ResetBandLayoutAsync() private async Task ResetLayoutAsync()
{ {
if (string.IsNullOrWhiteSpace(layoutUser)) if (string.IsNullOrWhiteSpace(layoutUser))
{ {
@@ -563,10 +565,23 @@ else
} }
await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser); await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser);
bandLayout = new BandLayout(); bandLayout = new BandLayout();
columnBandAssignments.Clear(); columnBandAssignments.Clear();
UpdateBandOptions(); UpdateBandOptions();
infoMessage = "Band-Layout zur&#252;ckgesetzt.";
foreach (var column in columnDefinitions)
column.Width = null;
columnLookup = columnDefinitions.ToDictionary(c => c.FieldName, StringComparer.OrdinalIgnoreCase);
_sizeMode = DevExpress.Blazor.SizeMode.Medium;
if (gridRef != null)
gridRef.LoadLayout(new GridPersistentLayout());
gridLayoutApplied = false;
infoMessage = "Layout zur\u00fcckgesetzt.";
errorMessage = null;
} }
private void ApplyColumnLayoutFromStorage() private void ApplyColumnLayoutFromStorage()
@@ -754,6 +769,7 @@ else
public List<string> ColumnOrder { get; set; } = new(); public List<string> ColumnOrder { get; set; } = new();
public Dictionary<string, string?> ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase); public Dictionary<string, string?> ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase);
public GridPersistentLayout? GridLayout { get; set; } public GridPersistentLayout? GridLayout { get; set; }
public DevExpress.Blazor.SizeMode SizeMode { get; set; } = DevExpress.Blazor.SizeMode.Medium;
} }
private sealed class BandDefinition private sealed class BandDefinition

View File

@@ -83,12 +83,12 @@ else if (!string.IsNullOrWhiteSpace(infoMessage))
} }
else if (items.Count == 0) else if (items.Count == 0)
{ {
<p>Keine Eintr&#228;ge vorhanden.</p> <p>Keine Einträge vorhanden.</p>
} }
else else
{ {
<div class="mb-3 page-size-selector"> <div class="mb-3 page-size-selector">
<span class="page-size-label">Datens&#228;tze je Seite:</span> <span class="page-size-label">Datensätze je Seite:</span>
<DxComboBox Data="@pageSizeOptions" <DxComboBox Data="@pageSizeOptions"
TData="PageSizeOption" TData="PageSizeOption"
TValue="int?" TValue="int?"
@@ -101,9 +101,9 @@ else
<div class="band-editor"> <div class="band-editor">
<div class="band-controls"> <div class="band-controls">
<DxButton Text="Band hinzuf&#252;gen" Click="AddBand" /> <DxButton Text="Band hinzufügen" Click="AddBand" />
<DxButton Text="Layout speichern" Click="SaveLayoutAsync" Enabled="@CanSaveBandLayout" /> <DxButton Text="Layout speichern" Click="SaveLayoutAsync" Enabled="@CanSaveBandLayout" />
<DxButton Text="Band-Layout zur&#252;cksetzen" Click="ResetBandLayoutAsync" /> <DxButton Text="Layout zurücksetzen" Click="ResetLayoutAsync" />
</div> </div>
@foreach (var band in bandLayout.Bands) @foreach (var band in bandLayout.Bands)
{ {
@@ -363,6 +363,7 @@ else
columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); columnBandAssignments = BuildAssignmentsFromLayout(bandLayout);
ApplyColumnLayoutFromStorage(); ApplyColumnLayoutFromStorage();
_sizeMode = bandLayout.SizeMode;
UpdateBandOptions(); UpdateBandOptions();
} }
@@ -403,6 +404,7 @@ else
var layout = gridRef.SaveLayout(); var layout = gridRef.SaveLayout();
bandLayout.GridLayout = layout; bandLayout.GridLayout = layout;
bandLayout.SizeMode = _sizeMode;
var orderedColumns = layout.Columns var orderedColumns = layout.Columns
.Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
@@ -416,9 +418,11 @@ else
bandLayout.ColumnWidths = orderedColumns bandLayout.ColumnWidths = orderedColumns
.Where(column => !string.IsNullOrWhiteSpace(column.Width)) .Where(column => !string.IsNullOrWhiteSpace(column.Width))
.ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase); .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
bandLayout.SizeMode = _sizeMode;
} }
private async Task ResetBandLayoutAsync() private async Task ResetLayoutAsync()
{ {
if (string.IsNullOrWhiteSpace(layoutUser)) if (string.IsNullOrWhiteSpace(layoutUser))
{ {
@@ -426,10 +430,23 @@ else
} }
await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser); await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser);
bandLayout = new BandLayout(); bandLayout = new BandLayout();
columnBandAssignments.Clear(); columnBandAssignments.Clear();
UpdateBandOptions(); UpdateBandOptions();
infoMessage = "Band-Layout zur&#252;ckgesetzt.";
foreach (var column in columnDefinitions)
column.Width = null;
columnLookup = columnDefinitions.ToDictionary(c => c.FieldName, StringComparer.OrdinalIgnoreCase);
_sizeMode = DevExpress.Blazor.SizeMode.Medium;
if (gridRef != null)
gridRef.LoadLayout(new GridPersistentLayout());
gridLayoutApplied = false;
infoMessage = "Layout zur\u00fcckgesetzt.";
errorMessage = null;
} }
private void ApplyColumnLayoutFromStorage() private void ApplyColumnLayoutFromStorage()
@@ -690,7 +707,7 @@ else
var editModel = (MassDataEditModel)e.EditModel; var editModel = (MassDataEditModel)e.EditModel;
if (!decimal.TryParse(editModel.AmountText, out var amount)) if (!decimal.TryParse(editModel.AmountText, out var amount))
{ {
AddValidationError(editModel, nameof(MassDataEditModel.AmountText), "Amount ist ung&#252;ltig."); AddValidationError(editModel, nameof(MassDataEditModel.AmountText), "Amount ist ungültig.");
e.Cancel = true; e.Cancel = true;
return; return;
} }
@@ -743,7 +760,7 @@ else
private Task OnDataItemDeleting(GridDataItemDeletingEventArgs e) private Task OnDataItemDeleting(GridDataItemDeletingEventArgs e)
{ {
errorMessage = null; errorMessage = null;
infoMessage = "L&#246;schen ist aktuell noch nicht verf&#252;gbar."; infoMessage = "Löschen ist aktuell noch nicht verfügbar.";
e.Cancel = true; e.Cancel = true;
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -764,6 +781,7 @@ else
public List<string> ColumnOrder { get; set; } = new(); public List<string> ColumnOrder { get; set; } = new();
public Dictionary<string, string?> ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase); public Dictionary<string, string?> ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase);
public GridPersistentLayout? GridLayout { get; set; } public GridPersistentLayout? GridLayout { get; set; }
public DevExpress.Blazor.SizeMode SizeMode { get; set; } = DevExpress.Blazor.SizeMode.Medium;
} }
private sealed class BandDefinition private sealed class BandDefinition