Files
SuperminarenandClaude Sonnet 5.5 874838f525 Swedish adaptation: Instegscertifikat and HAREC
- Editions replaced by INSTEG, HAREC and UPPGRADERING (Instegscertifikat -> HAREC)
- Question pool optional; simulator, homework tool and solutions switch off without one
- All UI strings, templates, renderers and project JS localised to sv-SE
  (decimal comma, Swedish non-breaking-space rules, Å/Ä/Ö in Morse table)
- DARC branding, membership CTA and German links removed; attribution footer added
- Page names centralised in src/pages.py
- README and docs rewritten in Swedish

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-10 15:03:02 +02:00

134 lines
7.4 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div id="homework-generator" class="homework-generator mx-auto mb-5" v-cloak>
<div v-if="loading" class="d-flex align-items-center justify-content-center gap-3 py-5" role="status">
<div class="spinner-border text-primary" aria-hidden="true"></div>
<span>Kursdata laddas …</span>
</div>
<div v-else-if="loadError" class="alert alert-danger" role="alert">
<h1 class="h4">Övningsverktyget kunde inte laddas</h1>
<p class="mb-0" v-text="loadError"></p>
</div>
<template v-else>
<h1>Skapa en övning</h1>
<p class="lead">Sätt ihop en övning av de kapitel och avsnitt som har gåtts igenom.</p>
<ol class="homework-steps list-unstyled d-flex flex-wrap gap-2 mb-4" aria-label="Steg">
<li v-for="item in stepLabels" :key="item.number"
class="badge rounded-pill"
:class="step === item.number ? 'text-bg-primary' : (step > item.number ? 'text-bg-secondary' : 'bg-light text-dark border')"
v-text="item.number + '. ' + item.label"></li>
</ol>
<section v-if="step === 1" aria-labelledby="homework-course-heading">
<h2 id="homework-course-heading" class="h4">Välj kurs</h2>
<p>Vilken kurs håller du?</p>
<div class="row row-cols-1 row-cols-md-3 g-2">
<div v-for="course in courseChoices" :key="course.edition" class="col">
<button type="button" class="btn w-100 h-100 py-3 text-white"
:style="{ backgroundColor: course.color, borderColor: course.color }"
@click="selectCourse(course)">
<span class="d-block" v-text="course.label"></span>
<small class="d-block" v-text="course.detail"></small>
</button>
</div>
</div>
</section>
<section v-else-if="step === 2" aria-labelledby="homework-chapter-heading">
<h2 id="homework-chapter-heading" class="h4">Välj kapitel</h2>
<p><strong v-text="selectedCourse.label"></strong>: Välj ett eller flera kapitel som har gåtts igenom.</p>
<div class="list-group mb-3">
<label v-for="chapter in toc.chapters" :key="chapter.ident"
class="list-group-item d-flex align-items-start gap-2"
:class="{ 'text-secondary bg-light': chapterQuestionCount(chapter) === 0 }">
<input class="form-check-input flex-shrink-0 mt-1" type="checkbox" :value="chapter.ident"
v-model="selectedChapterIds" :disabled="chapterQuestionCount(chapter) === 0">
<span class="flex-grow-1">
<span class="d-block" v-text="chapter.title"></span>
<small v-if="chapterQuestionCount(chapter) > 0" class="text-secondary"
v-text="chapterQuestionCount(chapter) + ' provfrågor'"></small>
<small v-else>Inga provfrågor finns</small>
</span>
</label>
</div>
<div class="d-flex justify-content-between gap-2">
<button type="button" class="btn btn-outline-secondary" @click="goToStep(1)">Tillbaka</button>
<button type="button" class="btn btn-primary" :disabled="selectedChapterIds.length === 0"
@click="openSectionSelection">Vidare till avsnitten</button>
</div>
</section>
<section v-else-if="step === 3" aria-labelledby="homework-section-heading">
<h2 id="homework-section-heading" class="h4">Välj avsnitt</h2>
<p>Välj de avsnitt som redan har gåtts igenom.</p>
<div v-for="chapter in selectedChapters" :key="chapter.ident" class="mb-4">
<h3 class="h5" v-text="chapter.title"></h3>
<div class="list-group">
<label v-for="section in chapter.sections" :key="section.ident"
class="list-group-item d-flex align-items-start gap-2"
:class="{ 'text-secondary bg-light': sectionQuestionIds(section).length === 0 }">
<input class="form-check-input flex-shrink-0 mt-1" type="checkbox" :value="section.ident"
v-model="selectedSectionIds" :disabled="sectionQuestionIds(section).length === 0">
<span class="flex-grow-1">
<span class="d-block" v-text="section.title"></span>
<small v-if="sectionQuestionIds(section).length > 0" class="text-secondary"
v-text="sectionQuestionIds(section).length + ' provfrågor'"></small>
<small v-else>Inga provfrågor finns</small>
</span>
</label>
</div>
</div>
<div class="d-flex justify-content-between gap-2">
<button type="button" class="btn btn-outline-secondary" @click="goToStep(2)">Tillbaka</button>
<button type="button" class="btn btn-primary" :disabled="selectedSectionIds.length === 0"
@click="openQuestionSelection">Vidare till frågorna</button>
</div>
</section>
<section v-else-if="step === 4" aria-labelledby="homework-question-heading">
<h2 id="homework-question-heading" class="h4">Välj frågor</h2>
<p>Alla frågor i de valda avsnitten är förvalda. Frågor du inte behöver kan du välja bort.</p>
<div class="d-flex flex-wrap gap-2 mb-3">
<button type="button" class="btn btn-outline-secondary btn-sm" @click="setAllQuestions(true)">Markera alla</button>
<button type="button" class="btn btn-outline-secondary btn-sm" @click="setAllQuestions(false)">Avmarkera alla</button>
<span class="ms-auto"><strong v-text="selectedQuestionIds.length"></strong> av <span v-text="orderedQuestions.length"></span> valda</span>
</div>
<div class="course">
<div v-for="group in selectedSectionGroups" :key="group.section.ident" class="mb-4">
<h3 class="h5" v-text="group.chapter.title + ' – ' + group.section.title"></h3>
<label v-for="questionId in group.questionIds" :key="questionId"
class="homework-question d-flex align-items-start gap-2 border p-2 mb-2">
<input class="form-check-input flex-shrink-0 mt-1" type="checkbox" v-model="questionSelection[questionId]">
<span>
<strong v-text="questionId + ': '"></strong><span v-html="catalog[questionId].question"></span>
</span>
</label>
</div>
</div>
<div class="d-flex justify-content-between gap-2">
<button type="button" class="btn btn-outline-secondary" @click="goToStep(3)">Tillbaka</button>
<button type="button" class="btn btn-primary" :disabled="selectedQuestionIds.length === 0"
@click="generateLink">Skapa övningslänk</button>
</div>
</section>
<section v-else aria-labelledby="homework-link-heading">
<h2 id="homework-link-heading" class="h4">Övningen är klar</h2>
<p>Länken innehåller <strong v-text="selectedQuestionIds.length"></strong> frågor i kursens ordning.</p>
<label for="homework-link" class="form-label">Övningslänk</label>
<div class="input-group mb-3">
<input id="homework-link" class="form-control" type="text" readonly :value="generatedUrl" @focus="$event.target.select()">
<button type="button" class="btn btn-outline-secondary" @click="copyLink">Kopiera länk</button>
</div>
<div v-if="copyMessage" class="alert alert-success py-2" role="status" v-text="copyMessage"></div>
<div class="d-flex flex-wrap justify-content-between gap-2">
<button type="button" class="btn btn-outline-secondary" @click="goToStep(4)">Ändra frågor</button>
<a class="btn btn-primary" :href="generatedUrl" target="_blank" rel="noopener">Öppna övningen</a>
</div>
</section>
</template>
</div>