From 2a730ddfccb9d8a5fd889807511c6580a2cfcc15 Mon Sep 17 00:00:00 2001 From: OlgunR Date: Mon, 9 Feb 2026 11:36:56 +0100 Subject: [PATCH] Refactor grid and band layout persistence logic Unify band and grid layout saving into a single "Layout speichern" action and method. Store the full grid layout in BandLayout, and simplify column/band rendering logic. Apply saved layouts after render for consistency. Remove obsolete ordering logic and update messages for clarity. These changes improve robustness and maintainability of layout persistence in CatalogsGrid and MassDataGrid. --- .../Components/CatalogsGrid.razor | 171 ++++---------- .../Components/MassDataGrid.razor | 208 ++++-------------- .../Components/CatalogsGrid.razor | 206 ++++------------- .../Components/MassDataGrid.razor | 164 ++++---------- 4 files changed, 182 insertions(+), 567 deletions(-) diff --git a/DbFirst.BlazorWasm/Components/CatalogsGrid.razor b/DbFirst.BlazorWasm/Components/CatalogsGrid.razor index 360d39b..e0ffd4e 100644 --- a/DbFirst.BlazorWasm/Components/CatalogsGrid.razor +++ b/DbFirst.BlazorWasm/Components/CatalogsGrid.razor @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Components @using Microsoft.AspNetCore.Components.Rendering @using Microsoft.AspNetCore.Components.Forms +@using DevExpress.Blazor @inject CatalogApiClient Api @inject LayoutApiClient LayoutApi @inject IJSRuntime JsRuntime @@ -96,8 +97,7 @@ else
- - +
@foreach (var band in bandLayout.Bands) @@ -211,6 +211,8 @@ else private bool CanSaveBandLayout => !string.IsNullOrWhiteSpace(layoutUser); + private bool gridLayoutApplied; + protected override async Task OnInitializedAsync() { columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase); @@ -219,6 +221,16 @@ else await LoadCatalogs(); } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null) + { + gridRef.LoadLayout(bandLayout.GridLayout); + gridLayoutApplied = true; + await InvokeAsync(StateHasChanged); + } + } + private void SetEditContext(EditContext context) { if (editContext == context) @@ -457,16 +469,10 @@ else columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); ApplyColumnLayoutFromStorage(); - ApplyBandOrderingFromColumnOrder(); UpdateBandOptions(); } - private async Task SaveBandLayoutAsync() - { - await SaveGridLayoutAsync(); - } - - private async Task SaveGridLayoutAsync() + private async Task SaveLayoutAsync() { if (string.IsNullOrWhiteSpace(layoutUser)) { @@ -485,15 +491,39 @@ else UserName = layoutUser, LayoutData = layoutData }); - infoMessage = "Grid-Layout gespeichert."; + infoMessage = "Layout gespeichert."; errorMessage = null; } catch (Exception ex) { - errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}"; + errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}"; } } + private void CaptureColumnLayoutFromGrid() + { + if (gridRef == null) + { + return; + } + + var layout = gridRef.SaveLayout(); + bandLayout.GridLayout = layout; + + var orderedColumns = layout.Columns + .Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) + .OrderBy(column => column.VisibleIndex) + .ToList(); + + bandLayout.ColumnOrder = orderedColumns + .Select(column => column.FieldName) + .ToList(); + + bandLayout.ColumnWidths = orderedColumns + .Where(column => !string.IsNullOrWhiteSpace(column.Width)) + .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase); + } + private async Task ResetBandLayoutAsync() { if (string.IsNullOrWhiteSpace(layoutUser)) @@ -510,17 +540,6 @@ else private void ApplyColumnLayoutFromStorage() { - if (bandLayout.ColumnOrder.Count > 0) - { - var ordered = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .Select(field => columnLookup[field]) - .ToList(); - - ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column))); - columnDefinitions = ordered; - } - foreach (var column in columnDefinitions) { if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width)) @@ -532,30 +551,6 @@ else columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase); } - private void CaptureColumnLayoutFromGrid() - { - if (gridRef == null) - { - return; - } - - var gridColumns = gridRef.GetColumns() - .OfType() - .Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) - .ToList(); - - bandLayout.ColumnOrder = gridColumns - .OrderBy(column => column.VisibleIndex) - .Select(column => column.FieldName) - .ToList(); - - bandLayout.ColumnWidths = gridColumns - .Where(column => !string.IsNullOrWhiteSpace(column.Width)) - .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase); - - ApplyBandOrderingFromColumnOrder(); - } - private void ApplyBandOrderingFromColumnOrder() { if (bandLayout.ColumnOrder.Count == 0) @@ -671,6 +666,8 @@ else { layout ??= new BandLayout(); layout.Bands ??= new List(); + layout.ColumnOrder ??= new List(); + layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var band in layout.Bands) { if (string.IsNullOrWhiteSpace(band.Id)) @@ -710,88 +707,15 @@ else builder.AddAttribute(seq++, "Width", "120px"); builder.CloseComponent(); - var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase); - var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase); - var orderedFields = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .ToList(); - - if (orderedFields.Count == 0) + var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); + foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) { - var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); - foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) - { - BuildDataColumn(builder, ref seq, column); - } - - foreach (var band in bandLayout.Bands) - { - if (band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - - return; - } - - foreach (var fieldName in orderedFields) - { - if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band)) - { - if (!renderedBands.Add(bandId) || band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - else if (columnLookup.TryGetValue(fieldName, out var column)) - { - BuildDataColumn(builder, ref seq, column); - } - } - - foreach (var column in columnDefinitions) - { - if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) && - (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId))) - { - BuildDataColumn(builder, ref seq, column); - } + BuildDataColumn(builder, ref seq, column); } foreach (var band in bandLayout.Bands) { - if (renderedBands.Contains(band.Id) || band.Columns.Count == 0) + if (band.Columns.Count == 0) { continue; } @@ -856,6 +780,7 @@ else public List Bands { get; set; } = new(); public List ColumnOrder { get; set; } = new(); public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase); + public GridPersistentLayout? GridLayout { get; set; } } private sealed class BandDefinition diff --git a/DbFirst.BlazorWasm/Components/MassDataGrid.razor b/DbFirst.BlazorWasm/Components/MassDataGrid.razor index e4d9634..2fcc16b 100644 --- a/DbFirst.BlazorWasm/Components/MassDataGrid.razor +++ b/DbFirst.BlazorWasm/Components/MassDataGrid.razor @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Components @using Microsoft.AspNetCore.Components.Rendering @using Microsoft.AspNetCore.Components.Forms +@using DevExpress.Blazor @inject MassDataApiClient Api @inject LayoutApiClient LayoutApi @inject IJSRuntime JsRuntime @@ -131,8 +132,7 @@ else
- - +
@foreach (var band in bandLayout.Bands) @@ -353,16 +353,10 @@ else columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); ApplyColumnLayoutFromStorage(); - ApplyBandOrderingFromColumnOrder(); UpdateBandOptions(); } - private async Task SaveBandLayoutAsync() - { - await SaveGridLayoutAsync(); - } - - private async Task SaveGridLayoutAsync() + private async Task SaveLayoutAsync() { if (string.IsNullOrWhiteSpace(layoutUser)) { @@ -381,51 +375,13 @@ else UserName = layoutUser, LayoutData = layoutData }); - infoMessage = "Grid-Layout gespeichert."; + infoMessage = "Layout gespeichert."; errorMessage = null; } catch (Exception ex) { - errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}"; - } - } - - private async Task ResetBandLayoutAsync() - { - if (string.IsNullOrWhiteSpace(layoutUser)) - { - return; - } - - await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser); - bandLayout = new BandLayout(); - columnBandAssignments.Clear(); - UpdateBandOptions(); - infoMessage = "Band-Layout zurückgesetzt."; - } - - private void ApplyColumnLayoutFromStorage() - { - if (bandLayout.ColumnOrder.Count > 0) - { - var ordered = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .Select(field => columnLookup[field]) - .ToList(); - - ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column))); - columnDefinitions = ordered; - } - - foreach (var column in columnDefinitions) - { - if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width)) - { - column.Width = width; - } + errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}"; } - - columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase); } private void CaptureColumnLayoutFromGrid() @@ -435,64 +391,48 @@ else return; } - var gridColumns = gridRef.GetColumns() - .OfType() + var layout = gridRef.SaveLayout(); + bandLayout.GridLayout = layout; + + var orderedColumns = layout.Columns .Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) + .OrderBy(column => column.VisibleIndex) .ToList(); - bandLayout.ColumnOrder = gridColumns - .OrderBy(column => column.VisibleIndex) + bandLayout.ColumnOrder = orderedColumns .Select(column => column.FieldName) .ToList(); - bandLayout.ColumnWidths = gridColumns + bandLayout.ColumnWidths = orderedColumns .Where(column => !string.IsNullOrWhiteSpace(column.Width)) .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase); - - ApplyBandOrderingFromColumnOrder(); } - private void ApplyBandOrderingFromColumnOrder() + private async Task ResetBandLayoutAsync() { - if (bandLayout.ColumnOrder.Count == 0) + if (string.IsNullOrWhiteSpace(layoutUser)) { return; } - var bandById = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase); - var orderedBandIds = new List(); - var orderedColumnsByBand = bandLayout.Bands.ToDictionary( - band => band.Id, - _ => new List(), - StringComparer.OrdinalIgnoreCase); + await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser); + bandLayout = new BandLayout(); + columnBandAssignments.Clear(); + UpdateBandOptions(); + infoMessage = "Band-Layout zurückgesetzt."; + } - foreach (var field in bandLayout.ColumnOrder) + private void ApplyColumnLayoutFromStorage() + { + foreach (var column in columnDefinitions) { - if (columnBandAssignments.TryGetValue(field, out var bandId) && bandById.ContainsKey(bandId)) + if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width)) { - if (!orderedBandIds.Contains(bandId, StringComparer.OrdinalIgnoreCase)) - { - orderedBandIds.Add(bandId); - } - - orderedColumnsByBand[bandId].Add(field); + column.Width = width; } } - foreach (var band in bandLayout.Bands) - { - var orderedColumns = orderedColumnsByBand[band.Id]; - orderedColumns.AddRange(band.Columns.Where(column => !orderedColumns.Contains(column, StringComparer.OrdinalIgnoreCase))); - band.Columns = orderedColumns; - } - - if (orderedBandIds.Count > 0) - { - bandLayout.Bands = orderedBandIds - .Select(id => bandById[id]) - .Concat(bandLayout.Bands.Where(band => !orderedBandIds.Contains(band.Id, StringComparer.OrdinalIgnoreCase))) - .ToList(); - } + columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase); } private void AddBand() @@ -581,6 +521,8 @@ else { layout ??= new BandLayout(); layout.Bands ??= new List(); + layout.ColumnOrder ??= new List(); + layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var band in layout.Bands) { if (string.IsNullOrWhiteSpace(band.Id)) @@ -606,88 +548,15 @@ else builder.AddAttribute(seq++, "Width", "120px"); builder.CloseComponent(); - var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase); - var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase); - var orderedFields = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .ToList(); - - if (orderedFields.Count == 0) + var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); + foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) { - var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); - foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) - { - BuildDataColumn(builder, ref seq, column); - } - - foreach (var band in bandLayout.Bands) - { - if (band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - - return; - } - - foreach (var fieldName in orderedFields) - { - if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band)) - { - if (!renderedBands.Add(bandId) || band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - else if (columnLookup.TryGetValue(fieldName, out var column)) - { - BuildDataColumn(builder, ref seq, column); - } - } - - foreach (var column in columnDefinitions) - { - if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) && - (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId))) - { - BuildDataColumn(builder, ref seq, column); - } + BuildDataColumn(builder, ref seq, column); } foreach (var band in bandLayout.Bands) { - if (renderedBands.Contains(band.Id) || band.Columns.Count == 0) + if (band.Columns.Count == 0) { continue; } @@ -873,6 +742,7 @@ else public List Bands { get; set; } = new(); public List ColumnOrder { get; set; } = new(); public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase); + public GridPersistentLayout? GridLayout { get; set; } } private sealed class BandDefinition @@ -934,4 +804,16 @@ else public int? Value { get; set; } public string Text { get; set; } = string.Empty; } + + private bool gridLayoutApplied; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null) + { + gridRef.LoadLayout(bandLayout.GridLayout); + gridLayoutApplied = true; + await InvokeAsync(StateHasChanged); + } + } } diff --git a/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor b/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor index 0b108f2..d55ed44 100644 --- a/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor +++ b/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Components @using Microsoft.AspNetCore.Components.Rendering @using Microsoft.AspNetCore.Components.Forms +@using DevExpress.Blazor @inject CatalogApiClient Api @inject LayoutApiClient LayoutApi @inject IJSRuntime JsRuntime @@ -55,8 +56,7 @@ else
- - +
@foreach (var band in bandLayout.Bands) @@ -394,12 +394,7 @@ else } } - private async Task SaveBandLayoutAsync() - { - await SaveGridLayoutAsync(); - } - - private async Task SaveGridLayoutAsync() + private async Task SaveLayoutAsync() { if (string.IsNullOrWhiteSpace(layoutUser)) { @@ -418,41 +413,15 @@ else UserName = layoutUser, LayoutData = layoutData }); - infoMessage = "Grid-Layout gespeichert."; + infoMessage = "Layout gespeichert."; errorMessage = null; } catch (Exception ex) { - errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}"; + errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}"; } } - private async Task LoadBandLayoutAsync() - { - if (string.IsNullOrWhiteSpace(layoutUser)) - { - bandLayout = new BandLayout(); - UpdateBandOptions(); - return; - } - - var stored = await LayoutApi.GetAsync(LayoutType, LayoutKey, layoutUser); - if (stored != null && !string.IsNullOrWhiteSpace(stored.LayoutData)) - { - var parsed = JsonSerializer.Deserialize(stored.LayoutData, jsonOptions); - bandLayout = NormalizeBandLayout(parsed); - } - else - { - bandLayout = new BandLayout(); - } - - columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); - ApplyColumnLayoutFromStorage(); - ApplyBandOrderingFromColumnOrder(); - UpdateBandOptions(); - } - private void CaptureColumnLayoutFromGrid() { if (gridRef == null) @@ -460,64 +429,46 @@ else return; } - var gridColumns = gridRef.GetColumns() - .OfType() + var layout = gridRef.SaveLayout(); + bandLayout.GridLayout = layout; + + var orderedColumns = layout.Columns .Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) + .OrderBy(column => column.VisibleIndex) .ToList(); - bandLayout.ColumnOrder = gridColumns - .OrderBy(column => column.VisibleIndex) + bandLayout.ColumnOrder = orderedColumns .Select(column => column.FieldName) .ToList(); - bandLayout.ColumnWidths = gridColumns + bandLayout.ColumnWidths = orderedColumns .Where(column => !string.IsNullOrWhiteSpace(column.Width)) .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase); - - ApplyBandOrderingFromColumnOrder(); } - private void ApplyBandOrderingFromColumnOrder() + private async Task LoadBandLayoutAsync() { - if (bandLayout.ColumnOrder.Count == 0) + if (string.IsNullOrWhiteSpace(layoutUser)) { + bandLayout = new BandLayout(); + UpdateBandOptions(); return; } - var bandById = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase); - var orderedBandIds = new List(); - var orderedColumnsByBand = bandLayout.Bands.ToDictionary( - band => band.Id, - _ => new List(), - StringComparer.OrdinalIgnoreCase); - - foreach (var field in bandLayout.ColumnOrder) + var stored = await LayoutApi.GetAsync(LayoutType, LayoutKey, layoutUser); + if (stored != null && !string.IsNullOrWhiteSpace(stored.LayoutData)) { - if (columnBandAssignments.TryGetValue(field, out var bandId) && bandById.ContainsKey(bandId)) - { - if (!orderedBandIds.Contains(bandId, StringComparer.OrdinalIgnoreCase)) - { - orderedBandIds.Add(bandId); - } - - orderedColumnsByBand[bandId].Add(field); - } + var parsed = JsonSerializer.Deserialize(stored.LayoutData, jsonOptions); + bandLayout = NormalizeBandLayout(parsed); } - - foreach (var band in bandLayout.Bands) + else { - var orderedColumns = orderedColumnsByBand[band.Id]; - orderedColumns.AddRange(band.Columns.Where(column => !orderedColumns.Contains(column, StringComparer.OrdinalIgnoreCase))); - band.Columns = orderedColumns; + bandLayout = new BandLayout(); } - if (orderedBandIds.Count > 0) - { - bandLayout.Bands = orderedBandIds - .Select(id => bandById[id]) - .Concat(bandLayout.Bands.Where(band => !orderedBandIds.Contains(band.Id, StringComparer.OrdinalIgnoreCase))) - .ToList(); - } + columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); + ApplyColumnLayoutFromStorage(); + UpdateBandOptions(); } private void AddBand() @@ -592,6 +543,8 @@ else { layout ??= new BandLayout(); layout.Bands ??= new List(); + layout.ColumnOrder ??= new List(); + layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var band in layout.Bands) { if (string.IsNullOrWhiteSpace(band.Id)) @@ -631,88 +584,15 @@ else builder.AddAttribute(seq++, "Width", "120px"); builder.CloseComponent(); - var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase); - var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase); - var orderedFields = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .ToList(); - - if (orderedFields.Count == 0) - { - var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); - foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) - { - BuildDataColumn(builder, ref seq, column); - } - - foreach (var band in bandLayout.Bands) - { - if (band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - - return; - } - - foreach (var fieldName in orderedFields) - { - if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band)) - { - if (!renderedBands.Add(bandId) || band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - else if (columnLookup.TryGetValue(fieldName, out var column)) - { - BuildDataColumn(builder, ref seq, column); - } - } - - foreach (var column in columnDefinitions) + var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); + foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) { - if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) && - (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId))) - { - BuildDataColumn(builder, ref seq, column); - } + BuildDataColumn(builder, ref seq, column); } foreach (var band in bandLayout.Bands) { - if (renderedBands.Contains(band.Id) || band.Columns.Count == 0) + if (band.Columns.Count == 0) { continue; } @@ -762,6 +642,7 @@ else public List Bands { get; set; } = new(); public List ColumnOrder { get; set; } = new(); public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase); + public GridPersistentLayout? GridLayout { get; set; } } private sealed class BandDefinition @@ -825,17 +706,6 @@ else private void ApplyColumnLayoutFromStorage() { - if (bandLayout.ColumnOrder.Count > 0) - { - var ordered = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .Select(field => columnLookup[field]) - .ToList(); - - ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column))); - columnDefinitions = ordered; - } - foreach (var column in columnDefinitions) { if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width)) @@ -846,4 +716,16 @@ else columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase); } + + private bool gridLayoutApplied; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null) + { + gridRef.LoadLayout(bandLayout.GridLayout); + gridLayoutApplied = true; + await InvokeAsync(StateHasChanged); + } + } } diff --git a/DbFirst.BlazorWebApp/Components/MassDataGrid.razor b/DbFirst.BlazorWebApp/Components/MassDataGrid.razor index 3cefaf7..ee73160 100644 --- a/DbFirst.BlazorWebApp/Components/MassDataGrid.razor +++ b/DbFirst.BlazorWebApp/Components/MassDataGrid.razor @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Components @using Microsoft.AspNetCore.Components.Rendering @using Microsoft.AspNetCore.Components.Forms +@using DevExpress.Blazor @inject MassDataApiClient Api @inject LayoutApiClient LayoutApi @inject IJSRuntime JsRuntime @@ -131,8 +132,7 @@ else
- - +
@foreach (var band in bandLayout.Bands) @@ -353,16 +353,11 @@ else columnBandAssignments = BuildAssignmentsFromLayout(bandLayout); ApplyColumnLayoutFromStorage(); - ApplyBandOrderingFromColumnOrder(); + //ApplyBandOrderingFromColumnOrder(); UpdateBandOptions(); } - private async Task SaveBandLayoutAsync() - { - await SaveGridLayoutAsync(); - } - - private async Task SaveGridLayoutAsync() + private async Task SaveLayoutAsync() { if (string.IsNullOrWhiteSpace(layoutUser)) { @@ -381,27 +376,13 @@ else UserName = layoutUser, LayoutData = layoutData }); - infoMessage = "Grid-Layout gespeichert."; + infoMessage = "Layout gespeichert."; errorMessage = null; } catch (Exception ex) { - errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}"; - } - } - - private async Task ResetBandLayoutAsync() - { - if (string.IsNullOrWhiteSpace(layoutUser)) - { - return; + errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}"; } - - await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser); - bandLayout = new BandLayout(); - columnBandAssignments.Clear(); - UpdateBandOptions(); - infoMessage = "Band-Layout zurückgesetzt."; } private void CaptureColumnLayoutFromGrid() @@ -411,21 +392,35 @@ else return; } - var gridColumns = gridRef.GetColumns() - .OfType() + var layout = gridRef.SaveLayout(); + bandLayout.GridLayout = layout; + + var orderedColumns = layout.Columns .Where(column => !string.IsNullOrWhiteSpace(column.FieldName)) + .OrderBy(column => column.VisibleIndex) .ToList(); - bandLayout.ColumnOrder = gridColumns - .OrderBy(column => column.VisibleIndex) + bandLayout.ColumnOrder = orderedColumns .Select(column => column.FieldName) .ToList(); - bandLayout.ColumnWidths = gridColumns + bandLayout.ColumnWidths = orderedColumns .Where(column => !string.IsNullOrWhiteSpace(column.Width)) .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase); + } + + private async Task ResetBandLayoutAsync() + { + if (string.IsNullOrWhiteSpace(layoutUser)) + { + return; + } - ApplyBandOrderingFromColumnOrder(); + await LayoutApi.DeleteAsync(LayoutType, LayoutKey, layoutUser); + bandLayout = new BandLayout(); + columnBandAssignments.Clear(); + UpdateBandOptions(); + infoMessage = "Band-Layout zurückgesetzt."; } private void ApplyBandOrderingFromColumnOrder() @@ -473,17 +468,6 @@ else private void ApplyColumnLayoutFromStorage() { - if (bandLayout.ColumnOrder.Count > 0) - { - var ordered = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .Select(field => columnLookup[field]) - .ToList(); - - ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column))); - columnDefinitions = ordered; - } - foreach (var column in columnDefinitions) { if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width)) @@ -581,6 +565,8 @@ else { layout ??= new BandLayout(); layout.Bands ??= new List(); + layout.ColumnOrder ??= new List(); + layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var band in layout.Bands) { if (string.IsNullOrWhiteSpace(band.Id)) @@ -606,88 +592,15 @@ else builder.AddAttribute(seq++, "Width", "120px"); builder.CloseComponent(); - var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase); - var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase); - var orderedFields = bandLayout.ColumnOrder - .Where(columnLookup.ContainsKey) - .ToList(); - - if (orderedFields.Count == 0) + var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); + foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) { - var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase); - foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName))) - { - BuildDataColumn(builder, ref seq, column); - } - - foreach (var band in bandLayout.Bands) - { - if (band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - - return; - } - - foreach (var fieldName in orderedFields) - { - if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band)) - { - if (!renderedBands.Add(bandId) || band.Columns.Count == 0) - { - continue; - } - - builder.OpenComponent(seq++); - builder.AddAttribute(seq++, "Caption", band.Caption); - builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder => - { - var bandSeq = 0; - foreach (var columnName in band.Columns) - { - if (columnLookup.TryGetValue(columnName, out var column)) - { - BuildDataColumn(bandBuilder, ref bandSeq, column); - } - } - })); - builder.CloseComponent(); - } - else if (columnLookup.TryGetValue(fieldName, out var column)) - { - BuildDataColumn(builder, ref seq, column); - } - } - - foreach (var column in columnDefinitions) - { - if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) && - (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId))) - { - BuildDataColumn(builder, ref seq, column); - } + BuildDataColumn(builder, ref seq, column); } foreach (var band in bandLayout.Bands) { - if (renderedBands.Contains(band.Id) || band.Columns.Count == 0) + if (band.Columns.Count == 0) { continue; } @@ -873,6 +786,7 @@ else public List Bands { get; set; } = new(); public List ColumnOrder { get; set; } = new(); public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase); + public GridPersistentLayout? GridLayout { get; set; } } private sealed class BandDefinition @@ -934,4 +848,16 @@ else public int? Value { get; set; } public string Text { get; set; } = string.Empty; } + + private bool gridLayoutApplied; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null) + { + gridRef.LoadLayout(bandLayout.GridLayout); + gridLayoutApplied = true; + await InvokeAsync(StateHasChanged); + } + } }