Skip to content

Commit 3b0fddd

Browse files
csharpfritzCopilot
andcommitted
docs: Update history and decisions for Menu level styles (FritzAndFriends#360)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent fca3391 commit 3b0fddd

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

.ai-team/agents/cyclops/history.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,21 @@ Fixed 3 bugs: Menu JS null guard + try/catch for getElement(), Calendar conditio
8383
Team update (2026-02-25): Shared sub-components of sufficient complexity get their own doc page (e.g., PagerSettings) decided by Beast
8484

8585
Team update (2026-02-25): ComponentCatalog.cs now links all sample pages; new samples must be registered there decided by Jubilee
86+
87+
### ListView CRUD Events Completion (#356)
88+
89+
- **Sorting/Sorted events:** Added `ListViewSortEventArgs` (SortExpression, SortDirection, Cancel) and `Sorting`/`Sorted` EventCallback parameters. Sort command routed through `HandleCommand("Sort", expression, index)`. Toggles direction when sorting same expression (matches GridView pattern). `SortExpression` and `SortDirection` properties added to ListView.
90+
- **SelectedIndexChanging/SelectedIndexChanged events:** Added `ListViewSelectEventArgs` (NewSelectedIndex, Cancel) and `SelectedIndexChanging`/`SelectedIndexChanged` EventCallback parameters. Select command routed through `HandleCommand("Select", null, index)`. Follows GridView `SelectRow` pattern with cancellation support.
91+
- **PagePropertiesChanging/PagePropertiesChanged events:** Added `ListViewPagePropertiesChangingEventArgs` (StartRowIndex, MaximumRows) and `PagePropertiesChanging`/`PagePropertiesChanged` EventCallback parameters. Exposed via `SetPageProperties(startRowIndex, maximumRows)` public method. Added `StartRowIndex` and `MaximumRows` properties.
92+
- **LayoutCreated event:** Converted from `EventHandler OnLayoutCreated` to `EventCallback<EventArgs> OnLayoutCreated`. Wired invocation via `RaiseLayoutCreated()` internal method called in ListView.razor after LayoutTemplate is resolved.
93+
- **Key patterns followed:** EventArgs classes follow Web Forms signatures. Pre-operation events (`Sorting`, `SelectedIndexChanging`) support `Cancel` flag. Post-operation events (`Sorted`, `SelectedIndexChanged`, `PagePropertiesChanged`) fire after state updates. HandleCommand routes "sort" and "select" commands. `SortDirection` enum alias needed in test files to avoid `Shouldly.SortDirection` ambiguity.
94+
95+
### Menu Level Styles — StaticMenuStyle, IMenuStyleContainer (#360)
96+
97+
- **StaticMenuStyle sub-component:** Added `StaticMenuStyle` class to `MenuItemStyle.razor.cs` following the same pattern as `DynamicMenuStyle` — inherits `MenuItemStyle`, sets `ParentMenu.StaticMenuStyle = this` in `OnInitialized`. Renders CSS to `ul.level1` in `Menu.razor`.
98+
- **IMenuStyleContainer interface:** Created `Interfaces/IMenuStyleContainer.cs` exposing `DynamicMenuStyle`, `StaticMenuStyle`, `DynamicMenuItemStyle`, `StaticMenuItemStyle` as `MenuItemStyle` properties. Menu implements `IMenuStyleContainer` via explicit interface implementation since the concrete Menu properties use derived types (`DynamicMenuStyle`, `StaticMenuStyle`, etc.).
99+
- **RenderFragment parameters:** Added `DynamicMenuStyleContent`, `StaticMenuStyleContent`, `DynamicMenuItemStyleContent`, `StaticMenuItemStyleContent` RenderFragment parameters to Menu. Rendered inside `<CascadingValue Name="ParentMenu">` block before `@ChildContent`. Added `IsFixed="true"` to the CascadingValue.
100+
- **CSS rendering:** `StaticMenuStyle` CSS applied to `#{ID} ul.level1` in Menu.razor's `<style>` block, analogous to how `DynamicMenuStyle` applies to `ul.dynamic`.
101+
- **Key pattern:** Menu styles use `MenuItemStyle` (inherits `ComponentBase, IStyle`) NOT `UiTableItemStyle`. This is intentional — Menu styles produce CSS text via `ToStyle()` for inline `<style>` blocks, whereas GridView/Calendar styles use `TableItemStyle` objects for HTML attribute-level styling. When mixing named RenderFragment params with bare child content in tests, wrap bare content in `<ChildContent>` tags.
102+
- **Files created:** `ListViewSortEventArgs.cs`, `ListViewPagePropertiesChangingEventArgs.cs`, `ListViewSelectEventArgs.cs`, test files: `SortingEvents.razor`, `SelectionEvents.razor`, `PagingEvents.razor`, `LayoutCreatedEvent.razor`.
103+
- **All 1229 tests pass** including 12 new ListView event tests (27 total ListView tests).
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Decision: Menu styles use MenuItemStyle pattern, not UiTableItemStyle
2+
3+
**By:** Cyclops
4+
**Date:** 2026-02-26
5+
**Issue:** #360
6+
7+
## What
8+
9+
Menu style sub-components (DynamicMenuStyle, StaticMenuStyle, DynamicMenuItemStyle, StaticMenuItemStyle) inherit `MenuItemStyle` (which inherits `ComponentBase, IStyle`), NOT `UiTableItemStyle`. The `IMenuStyleContainer` interface exposes these as `MenuItemStyle` properties.
10+
11+
## Why
12+
13+
Menu styles produce CSS text rendered into an inline `<style>` block via `ToStyle()`. This is fundamentally different from GridView/Calendar styles which use `TableItemStyle` objects applied as HTML element attributes. Forcing Menu styles into the `UiTableItemStyle` hierarchy would require restructuring the entire Menu CSS rendering approach with no benefit.
14+
15+
## Impact
16+
17+
- Any new Menu style sub-components should inherit `MenuItemStyle`, not `UiTableItemStyle`
18+
- When adding RenderFragment parameters to a component that already has `ChildContent`, tests mixing named RenderFragments with bare content must wrap the bare content in `<ChildContent>` tags
19+
- The `CascadingValue` for `ParentMenu` now has `IsFixed="true"` for performance

0 commit comments

Comments
 (0)