/** * Document CRUD Handler for Legal Dashboard * Manages Create, Read, Update, Delete operations for documents */ class DocumentCRUDHandler { constructor() { this.baseEndpoint = '/api/documents'; this.documents = []; this.currentEditId = null; this.searchQuery = ''; this.filters = { status: 'all', category: 'all', dateFrom: '', dateTo: '' }; this.initializeEventListeners(); this.loadDocuments(); } initializeEventListeners() { // Create document button const createBtn = document.getElementById('createDocumentBtn'); if (createBtn) { createBtn.addEventListener('click', () => this.showCreateModal()); } // Search input const searchInput = document.getElementById('documentSearch'); if (searchInput) { searchInput.addEventListener('input', (e) => { this.searchQuery = e.target.value; this.filterDocuments(); }); } // Filter selects const statusFilter = document.getElementById('statusFilter'); if (statusFilter) { statusFilter.addEventListener('change', (e) => { this.filters.status = e.target.value; this.filterDocuments(); }); } const categoryFilter = document.getElementById('categoryFilter'); if (categoryFilter) { categoryFilter.addEventListener('change', (e) => { this.filters.category = e.target.value; this.filterDocuments(); }); } // Date filters const dateFromFilter = document.getElementById('dateFromFilter'); if (dateFromFilter) { dateFromFilter.addEventListener('change', (e) => { this.filters.dateFrom = e.target.value; this.filterDocuments(); }); } const dateToFilter = document.getElementById('dateToFilter'); if (dateToFilter) { dateToFilter.addEventListener('change', (e) => { this.filters.dateTo = e.target.value; this.filterDocuments(); }); } } async loadDocuments() { try { const response = await fetchWithErrorHandling(this.baseEndpoint); this.documents = response.documents || []; this.renderDocuments(); } catch (error) { console.error('Failed to load documents:', error); this.showToast('خطا در بارگذاری اسناد', 'error'); } } async createDocument(documentData) { try { const response = await fetchWithErrorHandling(this.baseEndpoint, { method: 'POST', body: JSON.stringify(documentData) }); this.showToast('سند با موفقیت ایجاد شد', 'success'); this.loadDocuments(); return response; } catch (error) { this.showToast(`خطا در ایجاد سند: ${error.message}`, 'error'); throw error; } } async updateDocument(id, documentData) { try { const response = await fetchWithErrorHandling(`${this.baseEndpoint}/${id}`, { method: 'PUT', body: JSON.stringify(documentData) }); this.showToast('سند با موفقیت بهروزرسانی شد', 'success'); this.loadDocuments(); return response; } catch (error) { this.showToast(`خطا در بهروزرسانی سند: ${error.message}`, 'error'); throw error; } } async deleteDocument(id) { try { const response = await fetchWithErrorHandling(`${this.baseEndpoint}/${id}`, { method: 'DELETE' }); this.showToast('سند با موفقیت حذف شد', 'success'); this.loadDocuments(); return response; } catch (error) { this.showToast(`خطا در حذف سند: ${error.message}`, 'error'); throw error; } } async searchDocuments(query) { try { const response = await fetchWithErrorHandling(`${this.baseEndpoint}/search?q=${encodeURIComponent(query)}`); return response.results || []; } catch (error) { console.error('Search failed:', error); return []; } } renderDocuments() { const container = document.getElementById('documentsList'); if (!container) return; if (this.documents.length === 0) { container.innerHTML = '
هیچ سندی یافت نشد
'; return; } const documentsHTML = this.documents.map(doc => this.renderDocumentItem(doc)).join(''); container.innerHTML = documentsHTML; } renderDocumentItem(doc) { const statusClass = this.getStatusClass(doc.status); const qualityColor = this.getQualityColor(doc.quality); return `${doc.description || 'توضیحات موجود نیست'}
هیچ نتیجهای یافت نشد
'; return; } const documentsHTML = filtered.map(doc => this.renderDocumentItem(doc)).join(''); container.innerHTML = documentsHTML; } getStatusClass(status) { const statusMap = { 'pending': 'status-pending', 'processing': 'status-processing', 'completed': 'status-completed', 'error': 'status-error' }; return statusMap[status] || 'status-unknown'; } getStatusText(status) { const statusMap = { 'pending': 'در انتظار', 'processing': 'در حال پردازش', 'completed': 'تکمیل شده', 'error': 'خطا' }; return statusMap[status] || 'نامشخص'; } getQualityColor(quality) { if (quality >= 80) return '#28a745'; if (quality >= 60) return '#ffc107'; return '#dc3545'; } formatDate(dateString) { if (!dateString) return 'نامشخص'; const date = new Date(dateString); return date.toLocaleDateString('fa-IR'); } showToast(message, type = 'info') { if (typeof showToast === 'function') { showToast(message, type); } else { console.log(`${type.toUpperCase()}: ${message}`); } } } // Initialize document CRUD handler const documentCRUDHandler = new DocumentCRUDHandler();