AyCode.Blazor/AyCode.Blazor.Components/docs/MGGRID/README.md

5.7 KiB

MgGrid System

Comprehensive documentation for the MgGrid component family — the primary UI data grid pattern in the AyCode.Blazor framework. Source: Components/Grids/ For SignalR transport: AyCode.Services/docs/SIGNALR/README.md (in AyCode.Core repo) For AcSignalRDataSource: AyCode.Services.Server/docs/SIGNALR/SIGNALR_DATASOURCE.md (in AyCode.Core repo)

Overview

MgGridBase is an abstract generic Blazor component that extends DevExpress DxGrid with:

  • Automatic SignalR CRUD via AcSignalRDataSource (see AyCode.Core docs)
  • Layout persistence — column order, widths, sorting, grouping auto-saved to localStorage
  • Master-detail hierarchy — nested grids share context via CascadingParameter
  • InfoPanel integration — side panel shows focused row details, supports edit mode
  • Fullscreen mode — standalone overlay or via MgGridWithInfoPanel wrapper
  • Change tracking — client-side tracking with server sync via SaveChangesAsync

Detailed Documentation

File Topics
MGGRID_PARAMETERS.md Component parameters (required, CRUD tags, data & context, display), event callbacks, default grid settings
MGGRID_CRUD.md Lifecycle, CRUD operations, ID generation, edit flow, disposal
MGGRID_LAYOUT.md Layout persistence (storage keys, three tiers, operations, persisted state)
MGGRID_DETAIL.md Master-detail hierarchy
MGGRID_RENDERING.md Fullscreen mode, rendering
MGGRID_INFOPANEL.md MgGridInfoPanel, MgGridWithInfoPanel wrapper, responsive layout, templates, editors
MGGRID_TOOLBAR.md MgGridToolbarTemplate (buttons, parameters, state)
MGGRID_COLUMNS.md MgGridDataColumn (InfoPanel params, UrlLink)
MGGRID_DATASOURCE.md MgGridSignalRDataSource (server-side data, local cache, background refresh)
MGGRID_ISSUES.md Known issues (GRID-I-*, GRID-B-*) — currently none formally tracked
MGGRID_TODO.md Planned work (GRID-T-*) — refactors, missing features, optimizations

Component Hierarchy

DxGrid (DevExpress)
  └── MgGridBase<TSignalRDataSource, TDataItem, TId, TLoggerClient>   (AyCode.Blazor — abstract)
        └── [Project-specific adapter]            ← consumer fixes TSignalRDataSource, TId, TLoggerClient
              └── [Concrete entity grid]          ← consumer sets CRUD tags in constructor

Companion Components

Component Purpose Docs
MgGridWithInfoPanel DxSplitter wrapper: grid + InfoPanel, fullscreen, splitter persistence MGGRID_INFOPANEL.md
MgGridToolbarBase DxToolbar base with Grid reference, RefreshClick callback MGGRID_TOOLBAR.md
MgGridToolbarTemplate Full toolbar: CRUD, navigation, layout menu, fullscreen, export MGGRID_TOOLBAR.md
MgGridDataColumn Extended DxGridDataColumn with InfoPanel params and UrlLink MGGRID_COLUMNS.md
MgGridInfoPanel Default InfoPanel: column-value pairs, edit mode, typed editors MGGRID_INFOPANEL.md
MgGridSignalRDataSource GridCustomDataSource wrapper: server-side filter/sort/page, local cache MGGRID_DATASOURCE.md

Generic Type Parameters

MgGridBase<TSignalRDataSource, TDataItem, TId, TLoggerClient>
Parameter Constraint Purpose
TSignalRDataSource : AcSignalRDataSource<…> SignalR-backed data source (see AyCode.Services.Server/docs/SIGNALR/SIGNALR_DATASOURCE.md in AyCode.Core repo)
TDataItem : class, IId<TId> Entity type displayed in the grid
TId : struct Primary key type (int, Guid)
TLoggerClient : AcLoggerBase Logger for diagnostics

Usage Example (Project-Specific Adapter)

// Project adapter — fixes TSignalRDataSource, TId, TLoggerClient for the entire project
public class MyProjectGridBase<TDataItem>
    : MgGridBase<MySignalRDataSource<TDataItem>, TDataItem, int, MyLoggerClient>
    where TDataItem : class, IId<int>
{
    [Inject] public required MyLoggedInModel LoggedInModel { get; set; }
    protected override int GetLayoutUserId() => LoggedInModel.UserId;
}

// Concrete grid — only TDataItem remains open
public class GridOrderBase : MyProjectGridBase<Order>
{
    public GridOrderBase()
    {
        GetAllMessageTag = MySignalRTags.GetOrders;
        AddMessageTag    = MySignalRTags.AddOrder;
        UpdateMessageTag = MySignalRTags.UpdateOrder;
    }
}

Interface: IMgGridBase

The public contract exposed to companion components (toolbar, InfoPanel, wrapper):

Member Type Description
IsSyncing bool Whether SignalR sync is in progress
Caption string Grid title
GridEditState MgGridEditState None / New / Edit
ParentGrid IMgGridBase? Parent in master-detail hierarchy
GetRootGrid() IMgGridBase Walks to topmost grid
StepPrevRow() void Navigate to previous visible row
StepNextRow() void Navigate to next visible row
InfoPanelInstance IInfoPanelBase? Resolved InfoPanel reference
IsFullscreen bool Current fullscreen state
AutomaticLayoutStorageKey string Current auto-save storage key
ToggleFullscreen() void Toggle fullscreen mode
SaveUserLayoutAsync() Task Save layout manually
LoadUserLayoutAsync() Task Load manually saved layout
ResetLayoutAsync() Task Reset to default layout
HasUserLayoutAsync() Task<bool> Check if manual save exists

Event Args Classes

Class Base Extra Properties
GridDataItemChangedEventArgs<T> Grid, DataItem, TrackingState, CancelStateChangeInvoke
GridDataItemChangingEventArgs<T> GridDataItemChangedEventArgs<T> IsCanceled