Replace direct System.Text.Json usage with the ABP Serializer for anonymous event payloads (deserialize to object) and remove the unused System.Text.Json using. Rework Subscribe(string, IEventHandlerFactory) to avoid duplicate handler registration, return a NullDisposable when already registered, add the consumer binding when the first anonymous handler is added (note: TODO for multi-threading), and keep the new unregistrar. Prevent AnonymousEventData from being added to EventTypes when adding to the outbox. Remove the old Subscribe implementation accordingly.
Update event bus tests to avoid cross-test interference and ensure proper cleanup. In LocalDistributedEventBus_Test and LocalEventBus_Anonymous_Test: reset static handler state in test constructor, subscribe with IDisposable (using var subscription) so handlers are disposed after each test, replace hard-coded event names with generated unique event names, add missing System import, and adjust assertions (remove expectation of AbpException on publish after dispose). Also ensure local event bus subscriptions are stored/disposed. These changes make tests isolated and robust.
Introduce AnonymousEventData and add support for anonymous (name-based) events across the event bus implementations. Adds string-based Subscribe/Unsubscribe APIs, anonymous handler factories, and handling in distributed providers (Azure, Dapr, Kafka, RabbitMQ, Rebus) and local buses. Update EventBusBase and DistributedEventBusBase to resolve event names/data (GetEventName/GetEventData/ResolveEventForPublishing) and route/serialize/deserialize anonymous payloads. Also add AnonymousEventHandlerFactoryUnregistrar and minimal NullDistributedEventBus implementations, plus tests for anonymous local events.
Introduce a new IEventBus.PublishAsync(string eventName, ...) overload and make EventBusBase declare it. Implementations for Azure, Dapr, Kafka, RabbitMQ, Rebus, LocalDistributedEventBus and LocalEventBus resolve the event Type from an EventTypes map and delegate to the existing type-based PublishAsync. LocalEventBus now maintains an EventTypes dictionary (populated on Subscribe) to map event names to types. Unknown event names now throw an AbpException.
Register AddHttpClientProxies for ModularCrmContractsModule and CatalogContractsModule alongside OrderingContractsModule in the client module example, and add a clarifying comment. Remove a Blazor WebApp placeholder screenshot reference in part-05. Update the download link in part-08 to point to the ModularCRM-BlazorWebApp sample repository. These changes align the docs with the Blazor WebApp sample and ensure required HTTP client proxies are shown.
Add a new screenshot asset and update the modular-crm tutorial (part-03.md). Changes include:
- Add images/vscode-catalog-index-razor-blazor-webapp.png.
- Wrap the "Exposing Application Services as HTTP API Controllers" section in an MVC conditional block ({{if UI == "MVC"}} ... {{end}}).
- Update HttpClient proxy registrations to include ModularCrmContractsModule and keep CatalogContractsModule, with an inline comment noting the addition.
- Replace the Blazor WebApp placeholder line with an actual markdown image reference to the newly added screenshot.
These edits provide the actual Blazor screenshot in the docs and clarify HTTP client proxy registration for the tutorial.
Refactor the installation step in docs/en/tutorials/modular-crm/part-02.md for clarity. The previous long sentence was split and the conditional instructions for MVC and BlazorWebApp were made explicit: MVC should ensure `ModularCrm` is checked; for Blazor, `ModularCrm` must be checked for `ModularCrm.Catalog` and both `ModularCrm` and `ModularCrm.Client` for `ModularCrm.Catalog.Blazor`. Also cleaned up surrounding phrasing to avoid ambiguity.
Replace two tutorial images with updated ABP Studio screenshots for the Modular CRM Blazor web app (install module dialog and module installation dialog for Catalog) to keep documentation visuals current with UI changes.
Update modular-crm tutorial docs to cover Blazor WebApp specifics: adjust package-selection text to include the ModularCrm.Client package (with proper pluralization) in parts 02 and 04, and add instructions for configuring HTTP client proxies in the ModularCrmClientModule for the Catalog (part-03) and Ordering (part-05) modules. Also note that the respective .Blazor packages must be installed for both ModularCrm and ModularCrm.Client.
Replace the previous ngTabs/ngTab implementation in users.component.html with ng-bootstrap's ngbNav/ngbNavItem/ngbNavContent and an ngbNavOutlet for rendering tab content. Update users.component.ts to import and declare NgbNavModule and remove the removed @angular/aria tab imports. Also remove the @angular/aria peerDependency from the package.json for the identity package. These changes migrate the users UI to use ngbNav for tabbing and keep existing form/roles markup and localization intact.
Add Blazor WebApp variants to the Modular CRM tutorial: insert doc-params and UI conditionals across parts 01-08, add multiple Blazor-specific screenshots, and include Blazor code samples/placeholders for catalog and ordering pages and menu contributor. Also add EF Core migration (20260227074745_ABP10_2) and update the DbContext model snapshot, plus small updates to migrator and web app settings/packages to accommodate the changes.