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:
parent
5d19d0b3ed
commit
3c1568ad26
|
|
@ -7,7 +7,7 @@ DataSource CRUD, collection, tracking, and filter tests. Tested with List and Ac
|
||||||
### Test Base (partial class)
|
### Test Base (partial class)
|
||||||
- **`SignalRDataSourceTestBase.cs`** — Abstract generic base with SignalR infrastructure setup.
|
- **`SignalRDataSourceTestBase.cs`** — Abstract generic base with SignalR infrastructure setup.
|
||||||
- **`SignalRDataSourceTestBase.Collections.cs`** — Count, Clear, Contains tests.
|
- **`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.CrudOperations.cs`** — Add (auto-save, tracking-only, duplicate/default ID validation).
|
||||||
- **`SignalRDataSourceTestBase.LoadDataSource.cs`** — Full DataSource load.
|
- **`SignalRDataSourceTestBase.LoadDataSource.cs`** — Full DataSource load.
|
||||||
- **`SignalRDataSourceTestBase.LoadItem.cs`** — Single item load by ID.
|
- **`SignalRDataSourceTestBase.LoadItem.cs`** — Single item load by ID.
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,12 @@ public abstract partial class SignalRDataSourceTestBase<TDataSource, TIList>
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public virtual void FilterText_CanBeSetAndRetrieved()
|
public virtual void CustomFilterCriteria_CanBeSetAndRetrieved()
|
||||||
{
|
{
|
||||||
var dataSource = CreateDataSource(_client, _crudTags);
|
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
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ public class SignalRDataSourceTests_List_Binary : SignalRDataSourceTestBase<Test
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
|
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ public class SignalRDataSourceTests_List_Binary_NoRef : SignalRDataSourceTestBas
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
|
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ public class SignalRDataSourceTests_List_Json : SignalRDataSourceTestBase<TestOr
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
|
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ public class SignalRDataSourceTests_Observable_Binary : SignalRDataSourceTestBas
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
|
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ public class SignalRDataSourceTests_Observable_Json : SignalRDataSourceTestBase<
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
public override void ContextIds_CanBeSetAndRetrieved() => base.ContextIds_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void FilterText_CanBeSetAndRetrieved() => base.FilterText_CanBeSetAndRetrieved();
|
public override void CustomFilterCriteria_CanBeSetAndRetrieved() => base.CustomFilterCriteria_CanBeSetAndRetrieved();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
public override void IList_Add_ReturnsCorrectIndex() => base.IList_Add_ReturnsCorrectIndex();
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
||||||
|
|
@ -176,7 +176,13 @@ namespace AyCode.Services.SignalRs
|
||||||
protected readonly ChangeTracking<TDataItem, TId> TrackingItems = new();
|
protected readonly ChangeTracking<TDataItem, TId> TrackingItems = new();
|
||||||
|
|
||||||
public object[]? ContextIds;
|
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;
|
public AcSignalRClientBase SignalRClient;
|
||||||
protected readonly SignalRCrudTags SignalRCrudTags;
|
protected readonly SignalRCrudTags SignalRCrudTags;
|
||||||
|
|
@ -258,7 +264,7 @@ namespace AyCode.Services.SignalRs
|
||||||
{
|
{
|
||||||
var parameters = new List<object>();
|
var parameters = new List<object>();
|
||||||
if (ContextIds != null) parameters.AddRange(ContextIds);
|
if (ContextIds != null) parameters.AddRange(ContextIds);
|
||||||
if (FilterText != null) parameters.Add(FilterText);
|
if (CustomFilterCriteria != null) parameters.Add(CustomFilterCriteria);
|
||||||
|
|
||||||
if (parameters.Count == 0) parameters = null;
|
if (parameters.Count == 0) parameters = null;
|
||||||
return parameters?.ToArray();
|
return parameters?.ToArray();
|
||||||
|
|
|
||||||
|
|
@ -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).
|
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
|
## Change Tracking
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Forward-looking work specific to `AcSignalRDataSource`. Transport-side TODOs live in `../SIGNALR/SIGNALR_TODO.md`.
|
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
|
## Priority legend
|
||||||
- **P0** blocker · **P1** important · **P2** nice-to-have · **P3** idea
|
- **P0** blocker · **P1** important · **P2** nice-to-have · **P3** idea
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue