@using System.Numerics; @inject IDbContextFactory dbFactory; @implements IDialog @if(obj?.Acl is not null) { @foreach(var rule in obj.Acl.Rules.OrderByDescending(r => r.Action)) { }
Action Subject Permissions
@rule.Principal.ToString() @GetActivePermissions(rule) 🖉

Add new
} else {
This item does not have any permissions set!
}
@code { public bool Visible { get => dialog.Visible; set { dialog.Visible = value; if(value) StateHasChanged(); } } private HBObject? obj; private Dialog dialog; public void Show() => Visible = true; public void Hide() => Visible = false; public void Show(HBObject obj) { Object = obj; Show(); } public HBObject? Object { get => obj; set { if(value is null) { obj = null; return; } using var db = dbFactory.CreateDbContext(); obj = db.Objects .Include(o => o.Acl) .First(o => o.ObjectId == value.ObjectId); if(obj.Acl is not null) db.Entry(obj.Acl).Collection(a => a.Rules).Load(); } } public string GetActivePermissions(AclRule rule) { var perms = Acl.GetPermissionDescriptions(obj!) .Where(kv => (rule.Permissions & kv.Value) == kv.Value) .ToList(); // Filter the list of matching permissions to include the // most relevant encapsulation permissions only. E.g. if // 'Full access' includes 'Read' and 'Write', then only // show 'Full access'. List toRemove = new(); for(int i = 0; i < perms.Count(); i++) for(int j = 0; j < perms.Count(); j++) if(i != j) if((perms[i].Value & perms[j].Value) == perms[i].Value) toRemove.Add(i); for(int i = toRemove.Count() - 1; i >= 0; i--) perms.RemoveAt(toRemove[i]); return string.Join(", ", perms .OrderByDescending(kv => BitOperations.PopCount(kv.Value)) .ThenByDescending(kv => kv.Value) .Select(kv => kv.Key)); } }