Refactor band editor into reusable BandEditor component
Extract band editor UI and logic from CatalogsGrid.razor and MassDataGrid.razor into a new BandEditor.razor component. This centralizes band management features (add/remove bands, edit captions, assign columns, save/reset layout) and reduces code duplication, improving maintainability and reusability. Existing UI and event handling remain functionally unchanged.
This commit is contained in:
55
DbFirst.BlazorWebApp/Components/BandEditor.razor
Normal file
55
DbFirst.BlazorWebApp/Components/BandEditor.razor
Normal file
@@ -0,0 +1,55 @@
|
||||
<div class="band-editor">
|
||||
<button class="band-editor-toggle" @onclick="() => IsExpanded = !IsExpanded">
|
||||
<span class="band-editor-toggle-icon @(IsExpanded ? "expanded" : "")">►</span>
|
||||
<span>Layout</span>
|
||||
</button>
|
||||
@if (IsExpanded)
|
||||
{
|
||||
<div class="band-editor-body">
|
||||
<div class="band-controls">
|
||||
<DxButton Text="Band hinzufügen" Click="OnAddBand" />
|
||||
<DxButton Text="Layout speichern" Click="OnSaveLayout" Enabled="@CanSave" />
|
||||
<DxButton Text="Layout zurücksetzen" Click="OnResetLayout" />
|
||||
</div>
|
||||
@foreach (var band in Bands)
|
||||
{
|
||||
<div class="band-row">
|
||||
<DxTextBox Text="@band.Caption" TextChanged="@(value => OnBandCaptionChanged.InvokeAsync((band, value)))" />
|
||||
<DxButton Text="Entfernen" Click="@(() => OnRemoveBand.InvokeAsync(band))" />
|
||||
</div>
|
||||
}
|
||||
<DxFormLayout CssClass="band-columns" ColCount="2">
|
||||
@foreach (var column in Columns)
|
||||
{
|
||||
<DxFormLayoutItem Caption="@column.Caption">
|
||||
<DxComboBox Data="@BandOptions"
|
||||
TData="BandOption"
|
||||
TValue="string"
|
||||
TextFieldName="Caption"
|
||||
ValueFieldName="Id"
|
||||
Value="@GetColumnBand(column.FieldName)"
|
||||
ValueChanged="@(value => OnColumnBandChanged.InvokeAsync((column.FieldName, value)))"
|
||||
Width="100%" />
|
||||
</DxFormLayoutItem>
|
||||
}
|
||||
</DxFormLayout>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
@code {
|
||||
private bool IsExpanded { get; set; }
|
||||
|
||||
[Parameter, EditorRequired] public List<BandDefinition> Bands { get; set; } = new();
|
||||
[Parameter, EditorRequired] public List<BandOption> BandOptions { get; set; } = new();
|
||||
[Parameter, EditorRequired] public List<ColumnDefinition> Columns { get; set; } = new();
|
||||
[Parameter, EditorRequired] public Func<string, string> GetColumnBand { get; set; } = _ => string.Empty;
|
||||
[Parameter, EditorRequired] public bool CanSave { get; set; }
|
||||
|
||||
[Parameter] public EventCallback OnAddBand { get; set; }
|
||||
[Parameter] public EventCallback OnSaveLayout { get; set; }
|
||||
[Parameter] public EventCallback OnResetLayout { get; set; }
|
||||
[Parameter] public EventCallback<BandDefinition> OnRemoveBand { get; set; }
|
||||
[Parameter] public EventCallback<(BandDefinition Band, string Value)> OnBandCaptionChanged { get; set; }
|
||||
[Parameter] public EventCallback<(string FieldName, string? BandId)> OnColumnBandChanged { get; set; }
|
||||
}
|
||||
@@ -24,44 +24,17 @@ else if (items.Count == 0)
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="band-editor">
|
||||
<button class="band-editor-toggle" @onclick="() => bandEditorExpanded = !bandEditorExpanded">
|
||||
<span class="band-editor-toggle-icon @(bandEditorExpanded ? "expanded" : "")">►</span>
|
||||
<span>Layout</span>
|
||||
</button>
|
||||
@if (bandEditorExpanded)
|
||||
{
|
||||
<div class="band-editor-body">
|
||||
<div class="band-controls">
|
||||
<DxButton Text="Band hinzufügen" Click="AddBand" />
|
||||
<DxButton Text="Layout speichern" Click="SaveLayoutWithFeedbackAsync" Enabled="@CanSaveBandLayout" />
|
||||
<DxButton Text="Layout zurücksetzen" Click="ResetLayoutWithFeedbackAsync" />
|
||||
</div>
|
||||
@foreach (var band in bandLayout.Bands)
|
||||
{
|
||||
<div class="band-row">
|
||||
<DxTextBox Text="@band.Caption" TextChanged="@(value => UpdateBandCaption(band, value))" />
|
||||
<DxButton Text="Entfernen" Click="@(() => RemoveBand(band))" />
|
||||
</div>
|
||||
}
|
||||
<DxFormLayout CssClass="band-columns" ColCount="2">
|
||||
@foreach (var column in ColumnDefinitions)
|
||||
{
|
||||
<DxFormLayoutItem Caption="@column.Caption">
|
||||
<DxComboBox Data="@bandOptions"
|
||||
TData="BandOption"
|
||||
TValue="string"
|
||||
TextFieldName="Caption"
|
||||
ValueFieldName="Id"
|
||||
Value="@GetColumnBand(column.FieldName)"
|
||||
ValueChanged="@(value => UpdateColumnBand(column.FieldName, value))"
|
||||
Width="100%" />
|
||||
</DxFormLayoutItem>
|
||||
}
|
||||
</DxFormLayout>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<BandEditor Bands="@bandLayout.Bands"
|
||||
BandOptions="@bandOptions"
|
||||
Columns="@ColumnDefinitions"
|
||||
GetColumnBand="GetColumnBand"
|
||||
CanSave="@CanSaveBandLayout"
|
||||
OnAddBand="AddBand"
|
||||
OnSaveLayout="SaveLayoutWithFeedbackAsync"
|
||||
OnResetLayout="ResetLayoutWithFeedbackAsync"
|
||||
OnRemoveBand="RemoveBand"
|
||||
OnBandCaptionChanged="@(args => UpdateBandCaption(args.Band, args.Value))"
|
||||
OnColumnBandChanged="@(args => UpdateColumnBand(args.FieldName, args.BandId))" />
|
||||
|
||||
<div class="grid-section">
|
||||
<DxGrid Data="@items"
|
||||
|
||||
@@ -25,44 +25,17 @@ else if (items.Count == 0)
|
||||
else
|
||||
{
|
||||
|
||||
<div class="band-editor">
|
||||
<button class="band-editor-toggle" @onclick="() => bandEditorExpanded = !bandEditorExpanded">
|
||||
<span class="band-editor-toggle-icon @(bandEditorExpanded ? "expanded" : "")">►</span>
|
||||
<span>Layout</span>
|
||||
</button>
|
||||
@if (bandEditorExpanded)
|
||||
{
|
||||
<div class="band-editor-body">
|
||||
<div class="band-controls">
|
||||
<DxButton Text="Band hinzufügen" Click="AddBand" />
|
||||
<DxButton Text="Layout speichern" Click="SaveLayoutWithFeedbackAsync" Enabled="@CanSaveBandLayout" />
|
||||
<DxButton Text="Layout zurücksetzen" Click="ResetLayoutWithFeedbackAsync" />
|
||||
</div>
|
||||
@foreach (var band in bandLayout.Bands)
|
||||
{
|
||||
<div class="band-row">
|
||||
<DxTextBox Text="@band.Caption" TextChanged="@(value => UpdateBandCaption(band, value))" />
|
||||
<DxButton Text="Entfernen" Click="@(() => RemoveBand(band))" />
|
||||
</div>
|
||||
}
|
||||
<DxFormLayout CssClass="band-columns" ColCount="2">
|
||||
@foreach (var column in ColumnDefinitions)
|
||||
{
|
||||
<DxFormLayoutItem Caption="@column.Caption">
|
||||
<DxComboBox Data="@bandOptions"
|
||||
TData="BandOption"
|
||||
TValue="string"
|
||||
TextFieldName="Caption"
|
||||
ValueFieldName="Id"
|
||||
Value="@GetColumnBand(column.FieldName)"
|
||||
ValueChanged="@(value => UpdateColumnBand(column.FieldName, value))"
|
||||
Width="100%" />
|
||||
</DxFormLayoutItem>
|
||||
}
|
||||
</DxFormLayout>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<BandEditor Bands="@bandLayout.Bands"
|
||||
BandOptions="@bandOptions"
|
||||
Columns="@ColumnDefinitions"
|
||||
GetColumnBand="GetColumnBand"
|
||||
CanSave="@CanSaveBandLayout"
|
||||
OnAddBand="AddBand"
|
||||
OnSaveLayout="SaveLayoutWithFeedbackAsync"
|
||||
OnResetLayout="ResetLayoutWithFeedbackAsync"
|
||||
OnRemoveBand="RemoveBand"
|
||||
OnBandCaptionChanged="@(args => UpdateBandCaption(args.Band, args.Value))"
|
||||
OnColumnBandChanged="@(args => UpdateColumnBand(args.FieldName, args.BandId))" />
|
||||
|
||||
<div class="mb-3 page-size-selector">
|
||||
<span class="page-size-label">Datensätze je Seite:</span>
|
||||
|
||||
Reference in New Issue
Block a user