Skip to content

feat: Add 5 remaining AJAX Control Toolkit extenders#479

Merged
csharpfritz merged 16 commits intoFritzAndFriends:devfrom
csharpfritz:squad/ajax-extenders-remaining
Mar 19, 2026
Merged

feat: Add 5 remaining AJAX Control Toolkit extenders#479
csharpfritz merged 16 commits intoFritzAndFriends:devfrom
csharpfritz:squad/ajax-extenders-remaining

Conversation

@csharpfritz
Copy link
Collaborator

Summary

Adds the remaining AJAX Control Toolkit (ACT) extender components to complete the ACT coverage in BlazorWebFormsComponents.

New Extenders

  • ValidatorCalloutExtender Enhanced validation callout display
  • HoverMenuExtender Hover-triggered popup menus (HoverDelay=300, PopDelay=100 defaults)
  • SlideShowExtender Image slideshow control
  • ListSearchExtender Searchable list/dropdown filtering
  • BalloonPopupExtender Balloon-style popup tooltips

Also Included

  • Documentation for all 5 new extenders
  • Tests for each extender
  • Migration guide for ACT extender patterns
  • Fixed correct default values for HoverMenuExtender

csharpfritz and others added 16 commits March 15, 2026 16:16
Implements placeholder text for TextBox controls, matching the original
Ajax Control Toolkit TextBoxWatermarkExtender behavior.

- WatermarkText property for placeholder text
- WatermarkCssClass for styling the watermark state
- JS behavior handles focus/blur/input events

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Makes panels draggable by a handle element. Matches the original
Ajax Control Toolkit DragPanelExtender behavior.

- DragHandleID property to specify the drag handle element
- Falls back to entire target if no handle specified
- Handles edge cases (text selection, left-click only)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Allows users to resize elements by dragging a handle. Matches the original
Ajax Control Toolkit ResizableControlExtender behavior.

- HandleCssClass for styling the resize handle
- ResizableCssClass applied while actively resizing
- Min/Max width and height constraints
- Creates resize handle if not found

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- DropShadowExtender: CSS box-shadow with opacity, width, rounded corners, position tracking
- AlwaysVisibleControlExtender: Fixed positioning with 9 anchor points, offsets, animation support
- New enums: HorizontalSide, VerticalSide for positioning

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- RoundedCornersExtender: Selective border-radius with BoxCorners enum, optional background color
- UpdatePanelAnimationExtender: MutationObserver-based update detection with CSS class and fade animations
- New enum: BoxCorners (flags for corner selection)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- PasswordStrength: Real-time password quality indicator with text/bar modes, 5 strength levels
- MaskedEditExtender: Input masking for phone/date/SSN with configurable mask patterns
- New enums: DisplayPosition, StrengthIndicatorType, MaskType, InputDirection, AcceptNegative, DisplayMoney

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ValidatorCalloutExtender: Validation error callout bubbles with positioning, highlight CSS, icons
- HoverMenuExtender: Hover-triggered popup menus with delays and positioning
- New enum: PopupPosition (TopLeft, TopRight, BottomLeft, BottomRight)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- SlideShowExtender: Image carousel with auto-play, navigation controls, slide titles/descriptions
- Client-side slide management via Slides parameter or data-slides attribute
- Play/pause, next/previous controls with configurable interval

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ListSearchExtender: Type-to-filter for ListBox/DropDownList with Contains/StartsWith matching
- BalloonPopupExtender: Styled tooltip balloons with pointer arrows, multiple trigger modes
- New enums: PromptPosition, QueryPattern, BalloonStyle, BalloonSize, BalloonPosition

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Documentation (12 new files in docs/AjaxToolkit/):
- TextBoxWatermark, DragPanel, ResizableControl, DropShadow
- AlwaysVisibleControl, RoundedCorners, UpdatePanelAnimation
- PasswordStrength, ValidatorCallout, SlideShow, ListSearch, BalloonPopup
- Updated index.md with all new components

bUnit Tests (6 new test files, 104 tests):
- TextBoxWatermarkExtender, DropShadowExtender, PasswordStrength
- ValidatorCalloutExtender, ListSearchExtender, BalloonPopupExtender

Migration Toolkit:
- Updated AJAX-TOOLKIT.md with migration patterns for all 12 extenders

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…PopDelay=100)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolve 9 doc file conflicts: keep plain-text references for
non-existent doc pages (MkDocs strict mode compliance).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Log AJAX nav fix session (alphabetize items, collapsed state on desktop)
- Document decision to defer AJAX Control Toolkit from health dashboard
- Route Jubilee agent for sample nav updates
- Merge inbox decision to decisions.md
- Sort GetByCategory() results alphabetically by name
- Exclude AJAX category from desktop auto-expansion

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The page-wide locator a:has-text('2') was matching collapsed nav
sidebar links after AJAX nav alphabetization. Scope to .main-content
to only match pager links within the component demo area.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@csharpfritz csharpfritz merged commit 64a6e5e into FritzAndFriends:dev Mar 19, 2026
4 checks passed
@csharpfritz csharpfritz deleted the squad/ajax-extenders-remaining branch March 19, 2026 03:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant