Rivlo.FriendlyMembers
13.0.0
dotnet add package Rivlo.FriendlyMembers --version 13.0.0
NuGet\Install-Package Rivlo.FriendlyMembers -Version 13.0.0
<PackageReference Include="Rivlo.FriendlyMembers" Version="13.0.0" />
<PackageVersion Include="Rivlo.FriendlyMembers" Version="13.0.0" />
<PackageReference Include="Rivlo.FriendlyMembers" />
paket add Rivlo.FriendlyMembers --version 13.0.0
#r "nuget: Rivlo.FriendlyMembers, 13.0.0"
#:package Rivlo.FriendlyMembers@13.0.0
#addin nuget:?package=Rivlo.FriendlyMembers&version=13.0.0
#tool nuget:?package=Rivlo.FriendlyMembers&version=13.0.0
Friendly Members (RivloTools)
A free utility for Umbraco 13 that adds some missing member functionality:
- Member Group Viewer (see members in a group, with paging/search/sort)
- Bulk Actions (delete all unapproved, approve all pending — with preview & safeguards)
- Member Statistics (totals, approved/unapproved, top groups)
Requirements
- Umbraco: 13.x
- .NET: 8.0
- Backoffice uses AngularJS (standard Umbraco 13 backoffice stack)
Install
# Package Manager
Install-Package RivloTools.FriendlyMembers
# or dotnet CLI (from your web project)
dotnet add package RivloTools.FriendlyMembers
Configure (optional)
Add minimal settings to your site’s appsettings.json:
{
"RivloTools": {
"FriendlyMembers": {
"Enabled": true,
"ManagerUserGroupAliases": [ "admin" ],
"BulkOperationHardCap": 5000,
"StatsCacheSeconds": 60
}
}
}
Permissions:
Anyone with access to the Members section can view the dashboard.
Only users in ManagerUserGroupAliases can run bulk actions.
Where to find it
Backoffice → Members → Friendly Members dashboard (appears in the Members section).
Features
1) Member Group Viewer
- Pick a group and view all members in it
- Colour-coded badges show approved status and locked out users at a glance.
- Search by username/email, sort columns, paged results
- Quick link to open the member in the Umbraco editor
2) Bulk Actions (with preview)
- Delete all unapproved members (optionally by member group)
- Approve all unapproved members (optionally by member group)
- Preview shows the number of affected members and enforces a hard cap
- Double-confirm flow (type the expected count) to reduce mistakes
3) Member Statistics
- Tiles: total, approved, unapproved
- “Top groups” table (by member count)
Custom actions
Friendly Members lets you add bespoke bulk actions (e.g., resend verification emails) via DI. Actions appear in the Bulk tab under “Custom actions”, each with its own group selector and the right confirm flow.
How it works
- SupportsPreview = true → we call
PreviewAsync(...)to get a count, show a typed-number confirm modal, then callExecuteAsync(...)with the expected count. - SupportsPreview = false, RequiresConfirm = true → we show a “type CONFIRM” modal, then execute.
- Neither → the action runs immediately.
- Result toasts show: Processed {{Succeeded}} of {{Attempted}}.
Only users allowed to run Friendly Members bulk actions can see/run custom actions.
Create an action
Implement IFriendlyMembersBulkAction in your site. For example:
public class ResendVerificationEmailsAction : IFriendlyMembersBulkAction
{
private readonly IMemberService _members;
private readonly IEmailSender _email; // your service
public string Alias => "resend-verification";
public string Name => "Resend verification emails";
public string Description => "Emails unapproved members with a fresh link.";
public bool SupportsPreview => true;
public bool RequiresConfirm => true;
public ResendVerificationEmailsAction(IMemberService members, IEmailSender email)
{ _members = members; _email = email; }
public Task<int> PreviewAsync(string? groupName, CancellationToken ct)
{
var set = string.IsNullOrWhiteSpace(groupName)
? _members.GetAll(0, int.MaxValue, out _)
: _members.GetMembersInRole(groupName);
return Task.FromResult(set.Count(m => !m.IsApproved));
}
public async Task<(int Attempted, int Succeeded)> ExecuteAsync(string? groupName, int expectingCount, CancellationToken ct)
{
var set = string.IsNullOrWhiteSpace(groupName)
? _members.GetAll(0, int.MaxValue, out _)
: _members.GetMembersInRole(groupName);
var targets = set.Where(m => !m.IsApproved).Select(m => m.Email).Where(e => !string.IsNullOrWhiteSpace(e)).ToList();
if (targets.Count != expectingCount) throw new InvalidOperationException("Set changed");
int ok = 0;
foreach (var email in targets)
{
try { await _email.SendVerificationAsync(email!); ok++; } catch { /* log & continue */ }
}
return (targets.Count, ok);
}
}
Register the Action
Once you've written your custom action you'll need to register it in a composer:
public class SiteComposer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
builder.Services.AddSingleton<IFriendlyMembersBulkAction, ResendVerificationEmailsAction>();
// Add more custom actions here…
}
}
That’s it — the action will appear in the Bulk tab with its own “Limit to group” selector and appropriate Review & Confirm flow.
Notes
• groupName is null for “All groups”.
• Throw InvalidOperationException in ExecuteAsync if the set changed since preview; the UI will prompt the user to retry.
• For long-running work, consider queuing inside your action (e.g., background service) and returning immediately with a toast like “Queued…”.
Safety & Notes
Back up your database before bulk operations.
A hard cap limits how many items a single run can touch (configurable).
For very large sites, initial queries are simple; future versions will add more efficient paged queries and background processing.
Versioning
Semantic versioning aligned to Umbraco major: 13.x.y for Umbraco 13.
License
This package is distributed under a proprietary licence. You may use it freely in commercial or private projects, but redistribution is not permitted.
For the full End User Licence Agreement (EULA), see: https://www.rivlotools.com/products/friendly-members/eula
Learn More
Explore the full RivloTools suite at
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Umbraco.Cms.Web.BackOffice (>= 13.0.0 && < 14.0.0)
- Umbraco.Cms.Web.Website (>= 13.0.0 && < 14.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Initial release with member group dashboard, bulk processing tools and member statistics panel