<style>
.markdown-body table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
}
.markdown-body th,
.markdown-body td {
border: 1px solid #d0d7de;
padding: 6px 13px;
vertical-align: top;
}
.markdown-body thead tr {
background: #f6f8fa;
}
/* Header alignment: left for all, center only for Note */
.markdown-body th { text-align: left; }
.markdown-body #eval-table th:last-child { text-align: center; }
.markdown-body input[type="number"] {
width: 4.5em;
padding: 2px 6px;
border: 1px solid #d0d7de;
border-radius: 6px;
font: inherit;
background: #ffffff;
-moz-appearance: textfield;
}
.markdown-body input[type="number"]::-webkit-outer-spin-button,
.markdown-body input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.markdown-body #note-cell.note-good { background: #dafbe1; }
.markdown-body #note-cell.note-bad { background: #ffebe9; }
/* Widen Note column while keeping table at 100% width */
.markdown-body #eval-table { table-layout: fixed; }
.markdown-body #eval-table th:last-child,
.markdown-body #eval-table td#note-cell {
width: 20%;
}
</style>
<script>
function clamp(v, min, max) {
return v < min ? min : (v > max ? max : v);
}
function getScores() {
const inputs = document.querySelectorAll('#eval-table input');
// Read values as displayed/typed, then sanitize similarly to recalcEval
const vals = Array.from(inputs).map(i => {
if (i.value === '') return 0;
let s = i.value;
if (s.includes('.')) {
const parts = s.split('.');
if (parts[1].length > 1) s = parts[0] + '.' + parts[1].charAt(0);
}
let v = parseFloat(s);
if (Number.isNaN(v)) v = 0;
v = clamp(v, 0, 6);
v = Math.round(v * 10) / 10;
return v;
});
// Ensure 3 values
const [org = 0, dev = 0, prod = 0] = vals;
let avg = (org + dev + prod) / 3;
avg = Math.round(avg / 0.05) * 0.05;
return { avg, org, dev, prod };
}
async function copyScoresToClipboard() {
const { avg, org, dev, prod } = getScores();
const text = `${avg.toFixed(2)} = orga: ${org.toFixed(1)} / dvlp: ${dev.toFixed(1)} / prod: ${prod.toFixed(1)}`;
try {
await navigator.clipboard.writeText(text);
// brief feedback
const btn = document.getElementById('save-btn');
const prev = btn.textContent;
btn.textContent = 'copied';
setTimeout(() => (btn.textContent = prev), 900);
} catch (e) {
// Fallback for older browsers
const ta = document.createElement('textarea');
ta.value = text;
document.body.appendChild(ta);
ta.select();
document.execCommand('copy');
document.body.removeChild(ta);
}
}
function recalcEval() {
const inputs = document.querySelectorAll('#eval-table input');
let sum = 0;
inputs.forEach(i => {
if (i.value === '') return;
let v = parseFloat(i.value);
// Enforce max one decimal in the input field
if (i.value.includes('.')) {
const parts = i.value.split('.');
if (parts[1].length > 1) {
i.value = parts[0] + '.' + parts[1].charAt(0);
}
}
if (Number.isNaN(v)) {
i.value = '';
return;
}
v = clamp(v, 0, 6);
// Hard limit: prevent values above 6 or below 0 from staying in the field
if (parseFloat(i.value) > 6) i.value = '6';
if (parseFloat(i.value) < 0) i.value = '0';
// Restrict to 1 decimal for calculation only (do NOT rewrite field while typing)
v = Math.round(v * 10) / 10;
sum += v;
});
const noteCell = document.getElementById('note-cell');
let avg = sum / 3;
// round to nearest 0.05 (5e)
avg = Math.round(avg / 0.05) * 0.05;
document.getElementById('final').textContent = avg.toFixed(2);
const hasAnyValue = Array.from(inputs).some(i => i.value !== '');
noteCell.classList.remove('note-good', 'note-bad');
if (hasAnyValue) {
noteCell.classList.add(avg > 4 ? 'note-good' : 'note-bad');
}
const saveBtn = document.getElementById('save-btn');
if (saveBtn && !saveBtn.dataset.bound) {
saveBtn.addEventListener('click', copyScoresToClipboard);
saveBtn.dataset.bound = '1';
}
}
// Initialize
recalcEval();
</script>
| Domaine | Mot-clé | Indicateurs | Points | Max | Note |
|---|---|---|---|---|---|
| Organisation | Gestion | Compréhension, gestion du temps, gestion du matériel, proactivité | 6 pts |
0.00
export
|
|
| Développement | Quantité | Recherche, itérations, variété, pertinence, regard critique | 6 pts | ||
| Production | Qualité | Sélection, aboutissement, impact graphique, précision technique, argumentation | 6 pts |
![]() |
|---|
| Processus: organisation, développement, production |
