import { useCallback, useEffect, useMemo, useState } from 'react' import { Link, useNavigate, useParams } from 'react-router-dom' import { useApolloClient, useQuery } from '@apollo/client/react' import { Building2, Pencil, Trash2 } from 'lucide-react' import { GET_ORGANISATION_QUERY, GET_USERS_PAGE_QUERY, } from '../../entities/employee/api/employee.graphql' import type { Employee, GetOrganisationData, GetOrganisationVariables, GetUsersPageData, GetUsersPageVariables, Organisation, } from '../../entities/employee/model/types' import { ConfirmDangerDialog } from '../../widgets/ConfirmDangerDialog/ConfirmDangerDialog' import { AddOrganisationModal } from '../EmployeesPage/components/AddOrganisationModal/AddOrganisationModal' import { OrganisationPolicyCard } from './components/OrganisationPolicyCard/OrganisationPolicyCard' import './OrganisationPage.scss' type LoadStatus = 'idle' | 'loading' | 'success' | 'error' function getEmployeeFullName(employee: Employee) { return [employee.lastName, employee.firstName, employee.middleName] .filter(Boolean) .join(' ') } function getEmployeeRoleLabel(role: string) { if (role === 'Admin') return 'Администратор' if (role === 'User') return 'Пользователь' return role } function getOrganisationInitials(name: string) { const words = name.trim().split(/\s+/).filter(Boolean) if (words.length === 0) return 'ОР' return words .slice(0, 2) .map((word) => word[0]) .join('') .toUpperCase() } function formatCreationDate(timestamp: number) { if (!timestamp) return 'Нет данных' return new Intl.DateTimeFormat('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }).format(new Date(timestamp)) } export function OrganisationPage() { const client = useApolloClient() const navigate = useNavigate() const { organisationId } = useParams() const [employees, setEmployees] = useState([]) const [employeesStatus, setEmployeesStatus] = useState('idle') const [editingOrganisation, setEditingOrganisation] = useState(null) const [deletingOrganisation, setDeletingOrganisation] = useState(null) const { data: organisationData, loading: organisationLoading, error: organisationError, } = useQuery( GET_ORGANISATION_QUERY, { variables: { id: organisationId ?? '', }, skip: !organisationId, fetchPolicy: 'network-only', }, ) const organisation = organisationData?.getOrganisation ?? null const organisationInitials = useMemo(() => { if (!organisation) return 'ОР' return getOrganisationInitials(organisation.name) }, [organisation]) const loadEmployees = useCallback(async () => { if (!organisationId) { setEmployeesStatus('error') return } setEmployeesStatus('loading') try { let nextKey: string | null = null let pageCounter = 0 const allEmployees: Employee[] = [] do { const result = await client.query< GetUsersPageData, GetUsersPageVariables >({ query: GET_USERS_PAGE_QUERY, variables: nextKey ? { key: nextKey } : {}, fetchPolicy: 'network-only', }) const pageData = result.data?.getUsersPage if (!pageData) break allEmployees.push( ...pageData.page.filter( (employee) => String(employee.orgId) === organisationId, ), ) nextKey = pageData.nextKey pageCounter += 1 } while (nextKey && pageCounter < 50) setEmployees(allEmployees) setEmployeesStatus('success') } catch { setEmployeesStatus('error') } }, [client, organisationId]) useEffect(() => { void loadEmployees() }, [loadEmployees]) function handleConfirmDeleteOrganisation() { if (!deletingOrganisation) return console.log('Удаление организации пока без мутации', deletingOrganisation) setDeletingOrganisation(null) navigate('/employees') } if (!organisationId) { return (

Некорректный ID организации

Вернуться к списку
) } return (
Сотрудники / {organisation?.name ?? 'Организация'}
{organisationLoading && !organisation && (
Загрузка организации...
)} {organisationError && (
Не удалось загрузить организацию
)} {!organisationLoading && !organisationError && !organisation && (

Организация не найдена

Вернуться к списку
)} {organisation && ( <>

{organisation.name} ID: {organisation.id}

Создана {formatCreationDate(organisation.creationDate)}

{employeesStatus === 'loading' && employees.length === 0 && (
Загрузка сотрудников...
)} {employeesStatus === 'error' && (
Не удалось загрузить сотрудников
)} {employeesStatus === 'success' && employees.length === 0 && (
В этой организации пока нет сотрудников
)} {employees.length > 0 && ( {employees.map((employee) => ( ))}
ID ФИО Организация Роль
{employee.id}
{getEmployeeFullName(employee) || 'ФИО не указано'}
{employee.org?.name || organisation.name} {getEmployeeRoleLabel(employee.role)}
)}
{ if (!open) { setEditingOrganisation(null) } }} /> { if (!open) { setDeletingOrganisation(null) } }} onConfirm={handleConfirmDeleteOrganisation} /> )}
) }