Files
ftb-project-management/apps/web/lib/member-list.ts
2026-07-02 09:30:50 +08:00

51 lines
1.5 KiB
TypeScript

import type { Department, Member } from './members';
interface FilterMembersForListInput {
members: Member[];
departments: Department[];
activeDeptId: string | null;
nameKeyword: string;
}
function collectDepartmentTreeIds(departments: Department[], departmentId: string): Set<string> {
const ids = new Set<string>([departmentId]);
let changed = true;
while (changed) {
changed = false;
for (const department of departments) {
if (department.parentId && ids.has(department.parentId) && !ids.has(department.id)) {
ids.add(department.id);
changed = true;
}
}
}
return ids;
}
export function filterMembersForList({
members,
departments,
activeDeptId,
nameKeyword,
}: FilterMembersForListInput): Member[] {
const keyword = nameKeyword.trim().toLowerCase();
const visibleDepartmentIds = activeDeptId ? collectDepartmentTreeIds(departments, activeDeptId) : null;
return members.filter((member) => {
if (visibleDepartmentIds && !visibleDepartmentIds.has(member.departmentId)) return false;
if (!keyword) return true;
return member.name.toLowerCase().includes(keyword);
});
}
export function resolveLatestEditingMember(editingMember: Member | null, members: Member[]): Member | null {
if (!editingMember) return null;
return members.find((member) => member.id === editingMember.id) ?? editingMember;
}
export function getDisplayedAccountPassword(member: Member | null, generatedPassword: string): string {
return member?.password || generatedPassword;
}