usersSorting.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. export const ADMIN_USERS_SORT = Object.freeze({
  2. DEFAULT: "default",
  3. ROLE_RIGHTS: "role_rights",
  4. BRANCH_ASC: "branch_asc",
  5. });
  6. const ROLE_RANK = Object.freeze({
  7. superadmin: 4,
  8. dev: 3,
  9. admin: 2,
  10. branch: 1,
  11. });
  12. function normalizeRole(value) {
  13. return String(value ?? "")
  14. .trim()
  15. .toLowerCase();
  16. }
  17. function toRoleRank(value) {
  18. const role = normalizeRole(value);
  19. return ROLE_RANK[role] ?? 0;
  20. }
  21. function toBranchNumber(branchId) {
  22. const raw = String(branchId ?? "").trim();
  23. if (!raw) return null;
  24. const match = /^NL(\d+)$/i.exec(raw);
  25. if (!match) return null;
  26. const n = Number(match[1]);
  27. return Number.isInteger(n) ? n : null;
  28. }
  29. function compareBranchAscNullLast(a, b) {
  30. const an = toBranchNumber(a);
  31. const bn = toBranchNumber(b);
  32. if (an !== null && bn !== null) return an - bn;
  33. if (an === null && bn !== null) return 1;
  34. if (an !== null && bn === null) return -1;
  35. return String(a ?? "").localeCompare(String(b ?? ""), "de", {
  36. sensitivity: "base",
  37. });
  38. }
  39. function compareUsernamesAsc(a, b) {
  40. return String(a ?? "").localeCompare(String(b ?? ""), "de", {
  41. sensitivity: "base",
  42. });
  43. }
  44. function compareIdsAsc(a, b) {
  45. return String(a ?? "").localeCompare(String(b ?? ""), "en");
  46. }
  47. export function normalizeAdminUsersSortMode(value) {
  48. const mode = String(value ?? "").trim();
  49. if (!mode) return ADMIN_USERS_SORT.DEFAULT;
  50. if (Object.values(ADMIN_USERS_SORT).includes(mode)) {
  51. return mode;
  52. }
  53. return null;
  54. }
  55. export function compareUsersByRoleRights(a, b) {
  56. const roleCmp = toRoleRank(b?.role) - toRoleRank(a?.role);
  57. if (roleCmp !== 0) return roleCmp;
  58. const branchCmp = compareBranchAscNullLast(a?.branchId, b?.branchId);
  59. if (branchCmp !== 0) return branchCmp;
  60. const usernameCmp = compareUsernamesAsc(a?.username, b?.username);
  61. if (usernameCmp !== 0) return usernameCmp;
  62. return compareIdsAsc(a?.id ?? a?._id, b?.id ?? b?._id);
  63. }
  64. export function compareUsersByBranchAsc(a, b) {
  65. const branchCmp = compareBranchAscNullLast(a?.branchId, b?.branchId);
  66. if (branchCmp !== 0) return branchCmp;
  67. const roleCmp = toRoleRank(b?.role) - toRoleRank(a?.role);
  68. if (roleCmp !== 0) return roleCmp;
  69. const usernameCmp = compareUsernamesAsc(a?.username, b?.username);
  70. if (usernameCmp !== 0) return usernameCmp;
  71. return compareIdsAsc(a?.id ?? a?._id, b?.id ?? b?._id);
  72. }
  73. export function sortAdminUsers(items, sortMode) {
  74. const list = Array.isArray(items) ? [...items] : [];
  75. if (sortMode === ADMIN_USERS_SORT.ROLE_RIGHTS) {
  76. return list.sort(compareUsersByRoleRights);
  77. }
  78. if (sortMode === ADMIN_USERS_SORT.BRANCH_ASC) {
  79. return list.sort(compareUsersByBranchAsc);
  80. }
  81. return list;
  82. }