/home/techb158/trellopowerup.abdallabala.com/public
NameSizeModeActions
assets/-0755rm
.htaccess5330644editdlrm
admin.php331100644editdlrm
authorize.html10090644editdlrm
board-dashboard.html29620644editdlrm
board-dashboard.js137190644editdlrm
card-section.html5330644editdlrm
card-section.js61420644editdlrm
client-utils.js15910644editdlrm
index.html5570644editdlrm
index.php71400644editdlrm
powerup.js41850644editdlrm
risk-modal.html68150644editdlrm
risk-modal.js207460644editdlrm
settings.html25000644editdlrm
settings.js16700644editdlrm
styles.css40340644editdlrm
Edit: /home/techb158/trellopowerup.abdallabala.com/public/card-section.js (6142B)
import { apiFetch, escapeHtml, powerUpOptions, statusClass } from './client-utils.js'; const t = window.TrelloPowerUp.iframe(powerUpOptions()); const content = document.getElementById('content'); function renderEmpty() { content.innerHTML = `

No risk assessment yet

Use the Assess AI Risk button to calculate a COSMIC risk score for this card.

`; document.getElementById('assess').addEventListener('click', () => { t.modal({ title: 'COSMIC Risk Assessment', url: './risk-modal.html', height: 720 }); }); } function formatDate(value) { if (!value) return 'Unknown date'; return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(value)); } function formatMeta(value) { return String(value || 'not set').replaceAll('_', ' '); } function trendText(assessment) { if (!assessment || assessment.scoreDelta === null || assessment.scoreDelta === undefined) return 'First assessment'; if (assessment.scoreDelta > 0) return `Worse by ${assessment.scoreDelta}`; if (assessment.scoreDelta < 0) return `Improved by ${Math.abs(assessment.scoreDelta)}`; return 'No change'; } function trendClass(assessment) { return assessment?.trend === 'improved' ? 'trend-down' : assessment?.trend === 'worse' ? 'trend-up' : ''; } function assessmentRiskTitle(assessment) { return assessment?.score?.highestRisk?.title || assessment?.input?.risks?.[0]?.title || 'Untitled risk'; } function assessmentMeta(assessment) { return [ `Typology: ${formatMeta(assessment?.input?.projectTypology)}`, `Phase: ${formatMeta(assessment?.input?.lifecyclePhase)}`, `Maturity: ${formatMeta(assessment?.input?.measurementMaturity)}` ].join(' | '); } function renderHistory(assessments, expanded = false) { if (!assessments?.length) return ''; const visibleAssessments = expanded ? assessments : assessments.slice(0, 5); const hiddenCount = Math.max(assessments.length - visibleAssessments.length, 0); return `

Assessment history

${assessments.length} saved ${assessments.length === 1 ? 'entry' : 'entries'}
${visibleAssessments.map((assessment, index) => { const score = assessment.score || {}; const blockers = score.gate?.blockingReasons || []; return `
${index === 0 ? 'Latest' : formatDate(assessment.createdAt)} ${escapeHtml(score.status)} ${escapeHtml(score.score)}/100 ${score.gate?.deploymentReady ? 'Gate ready' : 'Gate blocked'} ${escapeHtml(trendText(assessment))}

${escapeHtml(assessmentRiskTitle(assessment))}

${escapeHtml(index === 0 ? formatDate(assessment.createdAt) : assessmentMeta(assessment))}

${index === 0 ? `

${escapeHtml(assessmentMeta(assessment))}

` : ''} ${blockers.length ? `

Blocked by: ${escapeHtml(blockers.slice(0, 2).join('; '))}${blockers.length > 2 ? '...' : ''}

` : ''}
`; }).join('')}
${assessments.length > 5 ? `` : ''} `; } function renderRisk(risk, assessments = [], expandedHistory = false) { const highest = risk.highestRisk; const reasons = risk.gate?.blockingReasons || []; const latest = assessments[0]; content.innerHTML = `
${risk.score}
${escapeHtml(risk.status)} ${risk.gate?.deploymentReady ? 'Deployment ready' : 'Deployment blocked'} ${latest ? `${escapeHtml(trendText(latest))}` : ''} ${latest?.review?.needed ? 'Review needed' : ''}

${escapeHtml(risk.interpretation)}

${highest ? `
Highest risk: ${escapeHtml(highest.title)}
Dimension: ${escapeHtml(highest.dimension)}. Residual score: ${Math.round(highest.residualScore)}.
` : ''} ${latest?.review?.needed ? `

Review: ${escapeHtml((latest.review.reasons || []).join('; '))}

` : ''} ${latest?.review?.actions?.length ? `

Next action: ${escapeHtml(latest.review.actions.join('; '))}

` : ''} ${reasons.length ? `

Blocking criteria

` : ''} ${renderHistory(assessments, expandedHistory)}
`; document.getElementById('edit-risk').addEventListener('click', () => { t.modal({ title: 'COSMIC Risk Assessment', url: './risk-modal.html', height: 720 }); }); document.getElementById('toggle-history')?.addEventListener('click', () => { renderRisk(risk, assessments, !expandedHistory); t.sizeTo('#content'); }); } async function load() { const risk = await t.get('card', 'shared', 'cosmicRisk'); const card = await t.card('id'); const assessments = risk ? await apiFetch(t, `/api/cards/${card.id}/assessments`).catch(() => []) : []; if (!risk) renderEmpty(); else renderRisk(risk, assessments); t.sizeTo('#content'); } t.render(load);