/** * @fileoverview Rotation Posts Performance Dashboard & Variant Trace Modal * @module ui/rotation-performance-ui * @description واجهة قياس كفاءة المنشورات، نسب النجاح في الجروبات، ونافذة تتبع سجل الإرسال التفصيلي. */ (global => { 'use strict'; const state = global.FritreeRotationState; let currentMetricsPage = 1; const METRICS_ITEMS_PER_PAGE = 8; /** * بناء الهيكل البصري لقسم تقييم أداء المنشورات */ const buildPerformanceLayout = () => { const page = document.getElementById('xpoqh5yufi'); if (!page) return; if (page.querySelector('#fj8dnuc75c')) return; page.innerHTML = `
إجمالي النشر
0
منشورات ناجحة
0
معلقة للمراجعة
0
محاولات فشلت
0
قياس أداء وكفاءة منشورات التدوير اضغط على أي منشور لعرض سجل إرساله التفصيلي
عنوان المنشور مرات التشغيل ناجح معلق فشل
`; }; /** * بناء نافذة تتبع سجل الإرسال للمنشور (Variant Trace Modal) */ const appendTraceModalLayout = () => { let modal = document.getElementById('sg405ywfqm'); if (modal) return; modal = document.createElement('div'); modal.className = 'cpzxome5dd'; modal.id = 'sg405ywfqm'; modal.style.cssText = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; backdrop-filter: blur(8px); display: none; align-items: center; justify-content: center; z-index: var(--z-modal-backdrop); background-color: rgba(15, 23, 42, 0.65); direction: rtl; text-align: right; box-sizing: border-box;'; modal.innerHTML = `
سجل تتبع الإرسال والنشر للمنشور
اسم الحملة الوجهة المستهدفة الحالة الرابط / الخطأ
`; document.body.appendChild(modal); document.getElementById('c8r5l8id1i').onclick = () => { modal.style.display = 'none'; }; }; /** * رسم وتحديث لوحة تقييم كفاءة المنشورات */ const renderEvaluationDashboard = async () => { const container = document.getElementById('i4jg5y3ylx'); const paginationContainer = document.getElementById('du4l2rjkr6'); if (!container) return; container.innerHTML = ''; const campaignHistoryData = await global.FritreeStorage.get('campaignHistoryData', []); const templateStatsMap = {}; campaignHistoryData.forEach(camp => { if (camp.logs && Array.isArray(camp.logs)) { camp.logs.forEach(log => { const templateId = log.variantName; if (templateId) { if (!templateStatsMap[templateId]) { templateStatsMap[templateId] = { usage: 0, success: 0, pending: 0, failed: 0 }; } templateStatsMap[templateId].usage++; if (log.status === 'success') templateStatsMap[templateId].success++; else if (log.status === 'pending') templateStatsMap[templateId].pending++; else templateStatsMap[templateId].failed++; } }); } }); state.previousPostsData.forEach(p => { const stats = templateStatsMap[p.id] || { usage: 0, success: 0, pending: 0, failed: 0 }; p.stats = stats; p.usageCount = stats.usage; }); if (global.FritreeRotationStore && typeof global.FritreeRotationStore.recalculateScores === 'function') { global.FritreeRotationStore.recalculateScores(); } const sorted = [...state.previousPostsData].sort((a, b) => (b.score || 0) - (a.score || 0)); if (state.previousPostsData.length === 0) { container.innerHTML = ' لا توجد منشورات مسجلة في مكتبة التدوير حالياً.'; if (paginationContainer) paginationContainer.innerHTML = ''; updateEvaluationTotalsRow(sorted); return; } const startIndex = (currentMetricsPage - 1) * METRICS_ITEMS_PER_PAGE; const pageItems = sorted.slice(startIndex, startIndex + METRICS_ITEMS_PER_PAGE); pageItems.forEach(p => { const tr = document.createElement('tr'); tr.style.cssText = 'cursor: pointer; transition: background 0.15s; border-bottom: 1px solid var(--border);'; tr.onclick = () => openVariantTraceModal(p.id); const tdTitle = document.createElement('td'); tdTitle.style.cssText = 'padding: 10px 12px; font-weight: 700;'; tdTitle.innerHTML = ` ${p.title || (p.text ? p.text.substring(0, 30) + '...' : 'منشور مؤرشف')}`; const tdUsage = document.createElement('td'); tdUsage.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--text-main);'; tdUsage.textContent = (p.stats ? p.stats.usage : p.usageCount || 0).toLocaleString('en-US'); const tdSuccess = document.createElement('td'); tdSuccess.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--success);'; tdSuccess.textContent = (p.stats ? p.stats.success : 0).toLocaleString('en-US'); const tdPending = document.createElement('td'); tdPending.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--warning);'; tdPending.textContent = (p.stats ? p.stats.pending : 0).toLocaleString('en-US'); const tdFailed = document.createElement('td'); tdFailed.style.cssText = 'padding: 10px; text-align: center; font-weight: 700; font-family: var(--font-code); color: var(--danger);'; tdFailed.textContent = (p.stats ? p.stats.failed : 0).toLocaleString('en-US'); tr.appendChild(tdTitle); tr.appendChild(tdUsage); tr.appendChild(tdSuccess); tr.appendChild(tdPending); tr.appendChild(tdFailed); container.appendChild(tr); }); updateEvaluationTotalsRow(sorted); renderEvaluationPagination(sorted.length, paginationContainer); }; /** * تحديث عدادات إجمالي الأداء */ const updateEvaluationTotalsRow = (items) => { let publishedSum = 0; let successfulSum = 0; let reviewedSum = 0; let failedSum = 0; items.forEach(p => { if (p.stats) { publishedSum += (p.stats.usage || 0); successfulSum += (p.stats.success || 0); reviewedSum += (p.stats.pending || 0); failedSum += (p.stats.failed || 0); } }); const totalPubEl = document.getElementById('ylohpr45dl'); const totalSuccEl = document.getElementById('md8oymcc5c'); const totalRevEl = document.getElementById('qoumr7z4ii'); const totalFailEl = document.getElementById('s8t8cbmfne'); if (totalPubEl) totalPubEl.textContent = publishedSum.toLocaleString('en-US'); if (totalSuccEl) totalSuccEl.textContent = successfulSum.toLocaleString('en-US'); if (totalRevEl) totalRevEl.textContent = reviewedSum.toLocaleString('en-US'); if (totalFailEl) totalFailEl.textContent = failedSum.toLocaleString('en-US'); }; /** * رسم أزرار ترقيم الصفحات */ const renderEvaluationPagination = (totalItems, container) => { if (!container) return; container.innerHTML = ''; const totalPages = Math.ceil(totalItems / METRICS_ITEMS_PER_PAGE); if (totalPages <= 1) return; const prevBtn = document.createElement('button'); prevBtn.className = 'ipxi2jz4g0'; prevBtn.style.cssText = 'padding: 4px 8px; font-size: 10.5px; min-height: 28px;'; prevBtn.innerHTML = ' '; prevBtn.disabled = currentMetricsPage === 1; prevBtn.onclick = () => { if (currentMetricsPage > 1) { currentMetricsPage--; renderEvaluationDashboard(); } }; const pageIndicator = document.createElement('span'); pageIndicator.style.cssText = 'font-weight: 700; font-size: 11px; color: var(--text-muted); font-family: var(--font-code); margin: 0 6px;'; pageIndicator.textContent = `صفحة ${currentMetricsPage.toLocaleString('en-US')} من ${totalPages.toLocaleString('en-US')}`; const nextBtn = document.createElement('button'); nextBtn.className = 'ipxi2jz4g0'; nextBtn.style.cssText = 'padding: 4px 8px; font-size: 10.5px; min-height: 28px;'; nextBtn.innerHTML = ' '; nextBtn.disabled = currentMetricsPage === totalPages; nextBtn.onclick = () => { if (currentMetricsPage < totalPages) { currentMetricsPage++; renderEvaluationDashboard(); } }; container.appendChild(prevBtn); container.appendChild(pageIndicator); container.appendChild(nextBtn); }; /** * فتح نافذة تتبع سجل المنشور * @param {string} postId */ const openVariantTraceModal = async (postId) => { const tbody = document.getElementById('yx004dvp1r'); const metaInfo = document.getElementById('ka8vx2wbd1'); if (!tbody || !metaInfo) return; tbody.innerHTML = ''; const post = state.previousPostsData.find(p => p.id === postId); if (!post) return; appendTraceModalLayout(); metaInfo.innerHTML = ` سجل تشغيل: "${post.title}" | الكفاءة: ${(post.score || 0).toLocaleString('en-US')}%`; const campaignHistoryData = await global.FritreeStorage.get('campaignHistoryData', []); let matchCount = 0; campaignHistoryData.forEach(camp => { if (camp.logs && Array.isArray(camp.logs)) { camp.logs.forEach(log => { if (log.variantName === postId) { matchCount++; const tr = document.createElement('tr'); const tdCamp = document.createElement('td'); tdCamp.style.padding = '8px 10px'; tdCamp.style.fontWeight = "700"; tdCamp.textContent = camp.name; const tdTarget = document.createElement('td'); tdTarget.style.padding = '8px 10px'; tdTarget.textContent = log.groupId || "وجهة غير معروفة"; const tdStatus = document.createElement('td'); tdStatus.style.padding = '8px 10px'; tdStatus.style.textAlign = 'center'; const badge = document.createElement('span'); badge.className = `go30y9mfgh ${log.status === 'success' ? 'success' : (log.status === 'pending' ? 'pending' : 'failed')}`; badge.textContent = log.status === 'success' ? 'تم النشر' : (log.status === 'pending' ? 'قيد المراجعة' : 'فشل'); tdStatus.appendChild(badge); const tdLink = document.createElement('td'); tdLink.style.padding = '8px 10px'; tdLink.style.textAlign = 'center'; if (log.postUrl) { const link = document.createElement('a'); link.href = log.postUrl; link.target = '_blank'; link.style.cssText = 'font-weight: 700; color: var(--primary); text-decoration: none; display: inline-flex; align-items: center; gap: 4px;'; link.innerHTML = ' عرض المنشور'; tdLink.appendChild(link); } else { tdLink.innerHTML = `${log.error || 'غير متوفر'}`; } tr.appendChild(tdCamp); tr.appendChild(tdTarget); tr.appendChild(tdStatus); tr.appendChild(tdLink); tbody.appendChild(tr); } }); } }); if (matchCount === 0) { tbody.innerHTML = ' لا توجد سجلات إرسال لهذا المنشور حتى الآن.'; } const modal = document.getElementById('sg405ywfqm'); if (modal) modal.style.display = 'flex'; }; /** * تهيئة وحدة تقييم الأداء */ const initPerformanceModule = () => { const page = document.getElementById('xpoqh5yufi'); if (!page) return false; buildPerformanceLayout(); appendTraceModalLayout(); renderEvaluationDashboard(); return true; }; /** * تصدير وحدة واجهة تقييم أداء المنشورات */ global.FritreeRotationPerformance = { init: initPerformanceModule, renderDashboard: renderEvaluationDashboard, openTraceModal: openVariantTraceModal }; })(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this);