| | | 1 | | using OzonOrdersWeb.Areas.Admin.Models; |
| | | 2 | | |
| | | 3 | | namespace OzonOrdersWeb.WebServices.Admin; |
| | | 4 | | |
| | | 5 | | /// <summary>Строка грида пользователей /Admin/Users.</summary> |
| | 3 | 6 | | public sealed record AdminUserGridRow( |
| | 0 | 7 | | string Id, |
| | 2 | 8 | | string DisplayName, |
| | 2 | 9 | | string? SecondaryName, |
| | 0 | 10 | | string? Email, |
| | 1 | 11 | | string? AvatarUrl, |
| | 2 | 12 | | string Initials, |
| | 0 | 13 | | IReadOnlyList<string> Roles, |
| | 0 | 14 | | int OverrideCount, |
| | 1 | 15 | | bool IsLocked, |
| | 3 | 16 | | bool IsApproved, |
| | 3 | 17 | | int AccessFailedCount); |
| | | 18 | | |
| | | 19 | | /// <summary>Строка грида реестра страниц /Admin/Pages: порядок дерева сохраняется как числовая колонка.</summary> |
| | | 20 | | public sealed record AdminPageGridRow( |
| | | 21 | | int Id, int TreeOrder, int Depth, string DisplayName, string Code, string? Area, string Controller, string Action, |
| | | 22 | | bool IsMenuItem, bool IsActive); |
| | | 23 | | |
| | | 24 | | /// <summary> |
| | | 25 | | /// Строки гридов раздела /Admin. Сюда переехала логика, которая жила в Razor списков: отображаемое имя и инициалы |
| | | 26 | | /// пользователя, второй логин под Google-именем, признак «доступ одобрен» (email подтверждён и вход одобрен админом). |
| | | 27 | | /// </summary> |
| | | 28 | | public static class AdminGridRows |
| | | 29 | | { |
| | | 30 | | public static IReadOnlyList<AdminUserGridRow> Users(IEnumerable<UserListItemVm> users) => |
| | | 31 | | users.Select(u => |
| | | 32 | | { |
| | | 33 | | var displayName = string.IsNullOrWhiteSpace(u.GoogleDisplayName) ? u.UserName : u.GoogleDisplayName!; |
| | | 34 | | var secondary = !string.IsNullOrWhiteSpace(u.GoogleDisplayName) |
| | | 35 | | && !string.Equals(u.GoogleDisplayName, u.UserName, StringComparison.OrdinalIgnoreCase) |
| | | 36 | | ? u.UserName |
| | | 37 | | : null; |
| | | 38 | | return new AdminUserGridRow( |
| | | 39 | | u.Id, displayName, secondary, u.Email, |
| | | 40 | | string.IsNullOrWhiteSpace(u.GoogleAvatarUrl) ? null : u.GoogleAvatarUrl, |
| | | 41 | | Initials(displayName), u.RoleNames, u.OverrideCount, u.IsLocked, |
| | | 42 | | u.EmailConfirmed && u.IsAdminApproved, u.AccessFailedCount); |
| | | 43 | | }).ToList(); |
| | | 44 | | |
| | | 45 | | public static IReadOnlyList<AdminPageGridRow> Pages(IEnumerable<PageListItemVm> pages) => |
| | | 46 | | pages.Select((p, i) => new AdminPageGridRow(p.Id, i, p.Depth, p.DisplayName, p.Code, p.Area, p.Controller, p.Act |
| | | 47 | | .ToList(); |
| | | 48 | | |
| | | 49 | | /// <summary>Две первые буквы имени — заглушка аватара.</summary> |
| | | 50 | | public static string Initials(string? name) |
| | | 51 | | { |
| | | 52 | | var source = string.IsNullOrWhiteSpace(name) ? "U" : name.Trim(); |
| | | 53 | | return (source.Length >= 2 ? source[..2] : source).ToUpperInvariant(); |
| | | 54 | | } |
| | | 55 | | } |