Fix matching type showing undefined in admin unit view; add print worksheet
- Add matching to TYPE_ICON/TYPE_LABEL in admin.js (was missing, caused undefined) - Add 🖨 Print worksheet button on matching exercise (prints word bank + clue blanks) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
05cfdf7b09
commit
f9cc515cec
2 files changed
+44
-3
No files matched your search
+2
-2
@@ -36,11 +36,11 @@ function msg(text, type = 'success') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const TYPE_ICON = {
|
const TYPE_ICON = {
|
||||||
lesson: '📖', assignment: '📝', quiz: '❓',
|
lesson: '📖', assignment: '📝', quiz: '❓', matching: '🔤',
|
||||||
spelling_practice: '✏️', spelling_test: '⭐', flashcards: '🗂️',
|
spelling_practice: '✏️', spelling_test: '⭐', flashcards: '🗂️',
|
||||||
};
|
};
|
||||||
const TYPE_LABEL = {
|
const TYPE_LABEL = {
|
||||||
lesson: 'Lesson', assignment: 'Assignment', quiz: 'Quiz',
|
lesson: 'Lesson', assignment: 'Assignment', quiz: 'Quiz', matching: 'Matching',
|
||||||
spelling_practice: 'Spelling Practice', spelling_test: 'Spelling Test', flashcards: 'Flashcards',
|
spelling_practice: 'Spelling Practice', spelling_test: 'Spelling Test', flashcards: 'Flashcards',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+42
-1
@@ -541,6 +541,41 @@ function printSpellingWorksheet(name, words) {
|
|||||||
win.document.close();
|
win.document.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function printMatchingWorksheet(title, wordBank, questions) {
|
||||||
|
const bankHtml = wordBank
|
||||||
|
.map((w, i) => `<span class="bank-item"><strong>${String.fromCharCode(65 + i)}.</strong> ${esc(w)}</span>`)
|
||||||
|
.join('');
|
||||||
|
const clueRows = questions
|
||||||
|
.map((q, i) => `<tr>
|
||||||
|
<td class="blank-cell">___</td>
|
||||||
|
<td class="num-cell">${i + 1}.</td>
|
||||||
|
<td class="clue-cell">${esc(q.prompt)}</td>
|
||||||
|
</tr>`)
|
||||||
|
.join('');
|
||||||
|
const win = window.open('', '_blank');
|
||||||
|
win.document.write(`<!DOCTYPE html><html><head><title>Matching: ${esc(title)}</title>
|
||||||
|
<style>
|
||||||
|
body { font-family: Georgia, serif; max-width: 700px; margin: 2rem auto; color: #222; }
|
||||||
|
h1 { font-size: 1.4rem; border-bottom: 2px solid #222; padding-bottom: .4rem; margin-bottom: 1rem; }
|
||||||
|
.word-bank { border: 1.5px solid #555; border-radius: 8px; padding: .6rem 1rem; margin-bottom: 1.25rem; }
|
||||||
|
.word-bank strong { display: block; font-size: .85rem; text-transform: uppercase; letter-spacing: .05em; color: #555; margin-bottom: .4rem; }
|
||||||
|
.bank-item { display: inline-block; margin: .15rem .6rem .15rem 0; font-size: .95rem; }
|
||||||
|
table { width: 100%; border-collapse: collapse; margin-top: .5rem; }
|
||||||
|
tr { border-bottom: 1px solid #ddd; }
|
||||||
|
td { padding: .55rem .4rem; vertical-align: top; }
|
||||||
|
.blank-cell { width: 2rem; font-size: 1.1rem; font-weight: 700; text-align: center; padding-top: .6rem; }
|
||||||
|
.num-cell { width: 1.5rem; color: #555; padding-top: .6rem; }
|
||||||
|
.clue-cell { font-size: .97rem; line-height: 1.4; }
|
||||||
|
p.directions { color: #555; font-size: .9em; margin-bottom: .75rem; }
|
||||||
|
</style></head><body>
|
||||||
|
<h1>🔤 Matching: ${esc(title)}</h1>
|
||||||
|
<div class="word-bank"><strong>Word Bank</strong>${bankHtml}</div>
|
||||||
|
<p class="directions">Directions: Write the letter of the matching word from the word bank on the blank next to each clue.</p>
|
||||||
|
<table>${clueRows}</table>
|
||||||
|
<script>window.print()<\/script></body></html>`);
|
||||||
|
win.document.close();
|
||||||
|
}
|
||||||
|
|
||||||
// ---------- course detail ----------
|
// ---------- course detail ----------
|
||||||
|
|
||||||
function activeUnitIndex(units) {
|
function activeUnitIndex(units) {
|
||||||
@@ -867,7 +902,9 @@ async function openMatching(itemId, forceRetake = false) {
|
|||||||
} else {
|
} else {
|
||||||
result.hidden = true;
|
result.hidden = true;
|
||||||
$('#quiz-form').innerHTML = wordBankHtml(item.wordBank) +
|
$('#quiz-form').innerHTML = wordBankHtml(item.wordBank) +
|
||||||
`<p class="match-instructions">Write the letter from the word bank that matches each clue.</p>` +
|
`<p class="match-instructions">Write the letter from the word bank that matches each clue.
|
||||||
|
<button type="button" class="print-match-btn secondary small" style="margin-left:.75rem">🖨 Print worksheet</button>
|
||||||
|
</p>` +
|
||||||
item.questions.map((q, i) =>
|
item.questions.map((q, i) =>
|
||||||
`<div class="quiz-question match-row">
|
`<div class="quiz-question match-row">
|
||||||
<input type="text" class="match-input" name="q${q.id}" maxlength="2"
|
<input type="text" class="match-input" name="q${q.id}" maxlength="2"
|
||||||
@@ -884,6 +921,10 @@ async function openMatching(itemId, forceRetake = false) {
|
|||||||
};
|
};
|
||||||
inputs.forEach((inp) => inp.addEventListener('input', checkAllFilled));
|
inputs.forEach((inp) => inp.addEventListener('input', checkAllFilled));
|
||||||
|
|
||||||
|
$('#quiz-form').querySelector('.print-match-btn').addEventListener('click', () =>
|
||||||
|
printMatchingWorksheet(item.title, item.wordBank, item.questions)
|
||||||
|
);
|
||||||
|
|
||||||
$('#quiz-form').onsubmit = async (e) => {
|
$('#quiz-form').onsubmit = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (submitBtn.disabled) return;
|
if (submitBtn.disabled) return;
|
||||||
|
|||||||
Reference in new issue
Block a user