/* eslint-disable import/extensions */ /* eslint-disable sonarjs/no-duplicate-string */ import { CheckIcon } from '@heroicons/react/20/solid'; import clsx from 'clsx'; import { t } from 'i18next'; import { Check, ChevronDown, ChevronUp, FilePlus2, Plus, Users, } from 'lucide-react'; import { useCallback, useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import { toast } from 'sonner'; import { EncryptionModal } from '@/routes/audits/edit/general/EncryptionModal'; import { AuditSection, encryptPDF, getAuditById } from '@/services/audits'; import { Section } from '../../services/data'; import DefaultRadioGroup from '../button/DefaultRadioGroup'; import DropdownButton, { ListItem } from '../button/DropdownButton'; type MenuItem = { name: string; icon: React.ComponentType<{ className?: string }>; value: string; additionalIcon?: React.ComponentType<{ className?: string }>; }; type Finding = { id: number; name: string; category: string; severity: string; identifier: string; status: number; }; type SortOption = { id: number; value: string; }; type SortOrderOption = { id: string; label: string; value: string; }; type ConnectedUser = { id: number; name: string; online: boolean; }; type AuditSidebarProps = { activeItem: string; setActiveItem: (item: string) => void; isCollapsed: boolean; setIsCollapsed: (collapsed: boolean) => void; isListVisible: boolean; setIsListVisible: (visible: boolean) => void; auditSections: AuditSection[]; sections: Section[]; sortBy: SortOption | null; setSortBy: (option: SortOption | null) => void; sortOrder: string; setSortOrder: (order: string) => void; menuItems: MenuItem[]; findings: Finding[]; sortOptions: SortOption[]; sortOrderOptions: SortOrderOption[]; connectedUsers: ConnectedUser[]; }; const severityColorMap: Record = { L: 'bg-green-600', M: 'bg-yellow-500', H: 'bg-orange-500', C: 'bg-red-600', default: 'bg-gray-600', }; const getSeverityColor = (severity: string) => { return severityColorMap[severity] ?? severityColorMap.default; }; const AuditSidebar = ({ activeItem, setActiveItem, auditSections, isCollapsed, setIsCollapsed, isListVisible, setIsListVisible, sections, sortOrder, setSortOrder, menuItems, findings, sortOrderOptions, connectedUsers, }: AuditSidebarProps) => { const handleSetIsCollapsed = useCallback( (collapsed: boolean) => setIsCollapsed(collapsed), [setIsCollapsed], ); const handleSetActiveItem = useCallback( (item: string) => setActiveItem(item), [setActiveItem], ); const severityOrder: Record = { C: 1, H: 2, M: 3, L: 4, I: 5, }; const [isOpenModal, setIsOpenModal] = useState(false); const handleSetIsOpenModal = useCallback( (isOpen: boolean) => setIsOpenModal(isOpen), [], ); const [isGeneratingPDF, setIsGeneratingPDF] = useState(false); const [auditName, setAuditName] = useState(''); const { auditId } = useParams(); useEffect(() => { getAuditById(auditId) .then(audit => { setAuditName(audit.datas.name); }) .catch(console.error); }, [auditId]); const fileTypes: ListItem[] = [ { id: 1, value: 'docx', label: 'docx', onClick: () => window.open( `${import.meta.env.VITE_API_URL}/api/audits/${auditId}/generate`, '_blank', ), }, { id: 2, value: 'pdf', label: 'pdf', onClick: () => window.open( `${import.meta.env.VITE_API_URL}/api/audits/${auditId}/generate/pdf`, '_blank', ), }, { id: 3, value: 'json', label: 'json', onClick: () => window.open( `${import.meta.env.VITE_API_URL}/api/audits/${auditId}/generate/json`, '_blank', ), }, { id: 4, value: 'csv', label: 'csv', onClick: () => window.open( `${import.meta.env.VITE_API_URL}/api/audits/${auditId}/generate/csv`, '_blank', ), }, { id: 5, value: 'pdf/encrypted', label: `pdf (${t('encrypted')})`, onClick: () => setIsOpenModal(true), }, ]; findings.sort((a, b) => { const orderMultiplier = sortOrder === 'Ascending' ? -1 : 1; return ( orderMultiplier * (severityOrder[a.severity] - severityOrder[b.severity]) ); }); const handleSubmitEncrypt = async (password: string) => { setIsGeneratingPDF(true); const blob = await encryptPDF(password, auditId ?? '').catch( (error: Error) => { toast.error(t('err.errorGeneratingPdf')); console.error('Error generating PDF:', error); }, ); if (blob) { const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `${auditName}.pdf`; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); toast.success(t('msg.auditEncryptedOk')); } else { toast.error(t('err.errorGeneratingPdf')); } setIsOpenModal(false); setIsGeneratingPDF(false); }; return (
handleSetIsOpenModal(false)} />
{!isCollapsed ? ( ) : null}
{isListVisible ? (
    {sections.map(section => { const isSelected = auditSections.some( auditSection => auditSection.field === section.field, ); return ( ); })}
) : null}
{!isCollapsed ? (
    {auditSections.map(section => (
  • { setActiveItem(section.name); }} to={`sections/${section._id}`} > {section.icon?.startsWith('fa-') ? ( ) : ( {section.icon} )} {section.name}
  • ))}
) : null}
    {connectedUsers.map(user => (
  • {user.name}
  • ))}
); }; export default AuditSidebar;