Refactor MgGridBase filter panel & unify filter criteria

- Moved quick-filter panel below toolbar in MgGridBase for improved layout and visual alignment; FilterPanel now renders as a styled band between toolbar and group panel.
- Exposed GridSizeMode on IMgGridBase and MgGridBase; MgTagBox now inherits grid density by default for consistent sizing.
- Renamed FilterText to CustomFilterCriteria across grid/data source classes and tests to clarify its role as a DevExpress criteria string.
- Updated documentation (README.md, MGGRID_PARAMETERS.md, GLOSSARY.md, ADR 0004) to reflect filter panel placement, parameter naming, and sizing/layout changes.
- Adjusted CSS for new filter panel layout and visual integration.
- Updated example usages and tests to match new API and layout.
This commit is contained in:
Loretta 2026-07-16 15:01:37 +02:00
parent 5d19d0b3ed
commit 3c1568ad26
11 changed files with 23 additions and 17 deletions

View File

@ -7,7 +7,7 @@ DataSource CRUD, collection, tracking, and filter tests. Tested with List and Ac
### Test Base (partial class)
- **`SignalRDataSourceTestBase.cs`** — Abstract generic base with SignalR infrastructure setup.
- **`SignalRDataSourceTestBase.Collections.cs`** — Count, Clear, Contains tests.
- **`SignalRDataSourceTestBase.ContextAndFilter.cs`** — ContextIds, FilterText, Expression filter with AcExpressionNode.
- **`SignalRDataSourceTestBase.ContextAndFilter.cs`** — ContextIds, CustomFilterCriteria, Expression filter with AcExpressionNode.
- **`SignalRDataSourceTestBase.CrudOperations.cs`** — Add (auto-save, tracking-only, duplicate/default ID validation).
- **`SignalRDataSourceTestBase.LoadDataSource.cs`** — Full DataSource load.
- **`SignalRDataSourceTestBase.LoadItem.cs`** — Single item load by ID.

View File

@ -22,12 +22,12 @@ public abstract partial class SignalRDataSourceTestBase<TDataSource, TIList>
}
[TestMethod]
public virtual void FilterText_CanBeSetAndRetrieved()
public virtual void CustomFilterCriteria_CanBeSetAndRetrieved()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.FilterText = "search term";
dataSource.CustomFilterCriteria = "search term";
Assert.AreEqual("search term", dataSource.FilterText);
Assert.AreEqual("search term", dataSource.CustomFilterCriteria);
}
#endregion

View File

@ -131,7 +131,7 @@ public class SignalRDataSourceTests_List_Binary : SignalRDataSourceTestBase<Test
[TestMethod]
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
[TestMethod]
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
[TestMethod]
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
[TestMethod]

View File

@ -131,7 +131,7 @@ public class SignalRDataSourceTests_List_Binary_NoRef : SignalRDataSourceTestBas
[TestMethod]
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
[TestMethod]
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
[TestMethod]
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
[TestMethod]

View File

@ -136,7 +136,7 @@ public class SignalRDataSourceTests_List_Json : SignalRDataSourceTestBase<TestOr
[TestMethod]
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
[TestMethod]
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
[TestMethod]
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
[TestMethod]

View File

@ -132,7 +132,7 @@ public class SignalRDataSourceTests_Observable_Binary : SignalRDataSourceTestBas
[TestMethod]
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
[TestMethod]
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
[TestMethod]
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
[TestMethod]

View File

@ -136,7 +136,7 @@ public class SignalRDataSourceTests_Observable_Json : SignalRDataSourceTestBase<
[TestMethod]
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
[TestMethod]
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
[TestMethod]
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
[TestMethod]

View File

@ -176,7 +176,13 @@ namespace AyCode.Services.SignalRs
protected readonly ChangeTracking<TDataItem, TId> TrackingItems = new();
public object[]? ContextIds;
public string? FilterText { get; set; }
/// <summary>
/// Consumer-supplied base filter criteria (a DevExpress CriteriaOperator string) appended as the LAST
/// positional GetAll parameter; the server parses + whitelists it. Renamed FilterText → CustomFilterText →
/// CustomFilterCriteria (2026-07-16) as the semantics settled to a criteria string. Under the ADR-0004
/// unified model it is AND-merged with the grid's automatic FilterCriteria.
/// </summary>
public string? CustomFilterCriteria { get; set; }
public AcSignalRClientBase SignalRClient;
protected readonly SignalRCrudTags SignalRCrudTags;
@ -258,7 +264,7 @@ namespace AyCode.Services.SignalRs
{
var parameters = new List<object>();
if (ContextIds != null) parameters.AddRange(ContextIds);
if (FilterText != null) parameters.Add(FilterText);
if (CustomFilterCriteria != null) parameters.Add(CustomFilterCriteria);
if (parameters.Count == 0) parameters = null;
return parameters?.ToArray();

View File

@ -109,7 +109,7 @@ await dataSource.LoadItem(id); // sin
3. **Fallback re-serialize** (responseData neither `byte[]` nor `TIList` — e.g., bare `List<T>` in test scenarios without protocol): `AcBinarySerializer.Serialize(responseData)` → bytes → process as Path 1 (Binary).
**Context/Filtering:** `ContextIds` (`object[]`) and `FilterText` (`string`) are sent with every GetAll request for server-side filtering.
**Context/Filtering:** `ContextIds` (`object[]`) and `CustomFilterCriteria` (`string` — a DevExpress criteria string; renamed from `FilterText``CustomFilterText` 2026-07-16) are sent with every GetAll request for server-side filtering.
## Change Tracking

View File

@ -2,7 +2,7 @@
Forward-looking work specific to `AcSignalRDataSource`. Transport-side TODOs live in `../SIGNALR/SIGNALR_TODO.md`.
> **Server-side filtering — design in ADR 0004.** The client→server filter mechanism (`SignalParams.FilterText` + `[SignalRFilterText]` hub injection + filter-service + per-entity whitelist) is captured in [`0004-signalr-datasource-server-side-filtering.md`](../../../docs/adr/0004-signalr-datasource-server-side-filtering.md) (Status: Proposed). Not yet broken into per-step entries — reference the ADR when implementation begins.
> **Server-side filtering — design in ADR 0004.** The client→server filter mechanism (`SignalParams.FilterCriteria` + `[FilterCriteriaParam]` hub injection + filter-service with zero-config whitelist) is captured in [`0004-signalr-datasource-server-side-filtering.md`](../../../docs/adr/0004-signalr-datasource-server-side-filtering.md) (Status: Proposed). Not yet broken into per-step entries — reference the ADR when implementation begins.
## Priority legend
- **P0** blocker · **P1** important · **P2** nice-to-have · **P3** idea

File diff suppressed because one or more lines are too long