fOERbico/docs/religious-education-curatio...

1268 lines
51 KiB
HTML
Raw Normal View History

2025-10-13 16:36:50 +02:00
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Religious Education Curation Tool v0.2 (AMB)</title>
<style>
:root {
--primary: #6366f1;
--primary-dark: #4f46e5;
--secondary: #8b5cf6;
--success: #10b981;
--danger: #ef4444;
--warning: #f59e0b;
--gray-50: #f9fafb;
--gray-100: #f3f4f6;
--gray-200: #e5e7eb;
--gray-300: #d1d5db;
--gray-400: #9ca3af;
--gray-500: #6b7280;
--gray-600: #4b5563;
--gray-700: #374151;
--gray-800: #1f2937;
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--border-radius: 8px;
--border-radius-lg: 12px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
line-height: 1.6;
color: var(--gray-700);
background: linear-gradient(135deg, var(--gray-50) 0%, #fff 100%);
min-height: 100vh;
}
.container {
max-width: 1100px;
margin: 0 auto;
padding: 1rem;
}
/* Header */
.header {
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
color: white;
padding: 2rem;
border-radius: var(--border-radius-lg);
margin-bottom: 2rem;
text-align: center;
box-shadow: var(--shadow-lg);
}
.header h1 {
font-size: 1.875rem;
font-weight: 700;
margin-bottom: 0.5rem;
}
.header p {
opacity: 0.9;
font-size: 1rem;
}
.header .badge {
display: inline-block;
background: rgba(255,255,255,0.2);
padding: 0.25rem 0.75rem;
border-radius: 12px;
font-size: 0.75rem;
margin-top: 0.5rem;
}
/* Progress Bar */
.progress-container {
background: white;
border-radius: var(--border-radius);
padding: 1rem;
margin-bottom: 1.5rem;
box-shadow: var(--shadow);
}
.progress-bar {
width: 100%;
height: 8px;
background: var(--gray-200);
border-radius: 4px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%);
width: 0%;
transition: width 0.3s ease;
}
.progress-text {
text-align: center;
margin-top: 0.5rem;
font-size: 0.875rem;
color: var(--gray-600);
}
/* Steps */
.step {
background: white;
border-radius: var(--border-radius-lg);
padding: 1.5rem;
margin-bottom: 1.5rem;
box-shadow: var(--shadow);
border: 1px solid var(--gray-200);
}
.step-title {
color: var(--primary);
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 1.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.step-number {
width: 2rem;
height: 2rem;
background: var(--primary);
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.875rem;
font-weight: 600;
}
/* Form Elements */
.form-group {
margin-bottom: 1rem;
}
.form-group:last-child {
margin-bottom: 0;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: var(--gray-700);
font-size: 0.875rem;
}
.form-control {
width: 100%;
padding: 0.75rem;
border: 1px solid var(--gray-300);
border-radius: var(--border-radius);
font-size: 0.875rem;
transition: all 0.2s ease;
background: white;
}
.form-control:focus {
outline: none;
border-color: var(--primary);
box-shadow: 0 0 0 3px rgb(99 102 241 / 0.1);
}
textarea.form-control {
resize: vertical;
min-height: 120px;
}
/* Checkbox Groups */
.checkbox-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 0.5rem;
margin-top: 0.5rem;
}
.checkbox-item {
display: flex;
align-items: flex-start;
padding: 0.75rem;
background: var(--gray-50);
border: 1px solid var(--gray-200);
border-radius: var(--border-radius);
transition: all 0.2s ease;
cursor: pointer;
}
.checkbox-item:hover {
background: var(--gray-100);
border-color: var(--gray-300);
}
.checkbox-item input[type="checkbox"] {
margin-right: 0.75rem;
width: 1rem;
height: 1rem;
accent-color: var(--primary);
flex-shrink: 0;
margin-top: 0.1rem;
}
.checkbox-item label {
margin: 0;
cursor: pointer;
font-size: 0.875rem;
line-height: 1.4;
}
.checkbox-item .label-description {
display: block;
font-size: 0.75rem;
color: var(--gray-500);
margin-top: 0.25rem;
}
/* Buttons */
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1.5rem;
border: none;
border-radius: var(--border-radius);
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
}
.btn-primary {
background: var(--primary);
color: white;
}
.btn-primary:hover {
background: var(--primary-dark);
transform: translateY(-1px);
}
.btn-secondary {
background: var(--gray-600);
color: white;
}
.btn-secondary:hover {
background: var(--gray-700);
}
.btn-outline {
background: transparent;
color: var(--primary);
border: 1px solid var(--primary);
}
.btn-outline:hover {
background: var(--primary);
color: white;
}
/* Tabs */
.tabs {
display: flex;
border-bottom: 1px solid var(--gray-200);
margin-bottom: 1rem;
}
.tab {
padding: 0.75rem 1rem;
background: transparent;
border: none;
cursor: pointer;
font-size: 0.875rem;
font-weight: 500;
color: var(--gray-600);
border-bottom: 2px solid transparent;
transition: all 0.2s ease;
}
.tab.active {
color: var(--primary);
border-bottom-color: var(--primary);
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
/* Output Areas */
.output-box {
background: var(--gray-50);
border: 1px solid var(--gray-200);
border-radius: var(--border-radius);
padding: 1rem;
font-family: 'Monaco', 'Consolas', monospace;
font-size: 0.8rem;
white-space: pre-wrap;
max-height: 400px;
overflow-y: auto;
margin: 1rem 0;
}
/* Navigation */
.navigation {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 1.5rem;
padding-top: 1rem;
border-top: 1px solid var(--gray-200);
}
/* Final Output */
.final-summary-container {
background: linear-gradient(135deg, #ecfdf5 0%, #f0fdf4 100%);
border: 1px solid var(--success);
border-radius: var(--border-radius-lg);
padding: 1.5rem;
margin-bottom: 1rem;
}
.final-summary-container h3 {
color: #065f46;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.summary-section {
background: white;
border-radius: var(--border-radius);
padding: 1rem;
margin-bottom: 1rem;
border-left: 4px solid var(--primary);
box-shadow: var(--shadow-sm);
}
.summary-content {
font-size: 0.95rem;
color: var(--gray-800);
line-height: 1.7;
}
.summary-content strong {
color: var(--gray-900);
}
.summary-content ul {
list-style-type: disc;
padding-left: 1.5rem;
margin: 0.5rem 0;
}
.summary-content ul li {
margin-bottom: 0.25rem;
}
.amb-metadata-box {
background: #f0f9ff;
border: 1px solid #0284c7;
border-radius: var(--border-radius);
padding: 1rem;
margin-top: 1rem;
font-family: 'Monaco', 'Consolas', monospace;
font-size: 0.75rem;
max-height: 300px;
overflow-y: auto;
}
.tags {
background: var(--gray-100);
border-radius: var(--border-radius);
padding: 0.75rem;
margin-top: 1rem;
font-size: 0.875rem;
color: var(--gray-600);
line-height: 1.8;
display: flex;
flex-wrap: wrap;
gap: 0.5em;
}
.tags strong {
color: var(--gray-700);
flex-basis: 100%;
margin-bottom: 0.5em;
}
.tag-item {
display: inline-block;
background-color: var(--primary);
color: white;
padding: 0.2em 0.6em;
border-radius: 4px;
font-size: 0.8em;
white-space: nowrap;
}
/* Info Box */
.info-box {
background: #eff6ff;
border-left: 4px solid #3b82f6;
padding: 1rem;
margin-bottom: 1rem;
border-radius: var(--border-radius);
font-size: 0.875rem;
}
.info-box strong {
color: #1e40af;
}
/* Utility Classes */
.hidden { display: none; }
.text-center { text-align: center; }
.text-sm { font-size: 0.875rem; }
.text-xs { font-size: 0.75rem; }
.mb-2 { margin-bottom: 0.5rem; }
.mb-4 { margin-bottom: 1rem; }
/* Error States */
.error {
border-color: var(--danger) !important;
box-shadow: 0 0 0 3px rgb(239 68 68 / 0.1) !important;
}
.error-message {
color: var(--danger);
font-size: 0.75rem;
margin-top: 0.25rem;
display: none;
}
.success-message {
background: #ecfdf5;
color: #065f46;
padding: 0.75rem;
border-radius: var(--border-radius);
margin: 0.5rem 0;
border: 1px solid #a7f3d0;
font-size: 0.875rem;
}
/* Responsive */
@media (max-width: 768px) {
.container {
padding: 0.5rem;
}
.header {
padding: 1.5rem;
}
.header h1 {
font-size: 1.5rem;
}
.checkbox-grid {
grid-template-columns: 1fr;
}
.navigation {
flex-direction: column;
gap: 0.5rem;
}
.btn {
width: 100%;
justify-content: center;
}
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🌍 Religious Education Curation Tool</h1>
<p>AMB-Compliant Metadata Generation for Religious Education Resources</p>
<div class="badge">v0.2 (AMB) | reliedu vocabulary | OpenEduHub + KIM</div>
</div>
<div class="progress-container">
<div class="progress-bar">
<div class="progress-fill" id="progressFill"></div>
</div>
<div class="progress-text" id="progressText">Schritt 1 von 5</div>
</div>
<!-- STEP 1: Basic Metadata -->
<div class="step" id="step1">
<h2 class="step-title">
<span class="step-number">1</span>
Grundmetadaten (AMB Required Fields)
</h2>
<div class="info-box">
<strong> AMB-Pflichtfelder:</strong> Diese Angaben sind für AMB-konforme Metadaten erforderlich.
</div>
<div class="form-group">
<label for="resourceTitle">Titel der Ressource *</label>
<input type="text" id="resourceTitle" class="form-control" placeholder="z.B. Gleichnisse Jesu verstehen" oninput="updateProgress()">
<div class="error-message" id="title-error">Bitte geben Sie einen Titel ein.</div>
</div>
<div class="form-group">
<label for="resourceUrl">URL der Ressource *</label>
<input type="url" id="resourceUrl" class="form-control" placeholder="https://..." oninput="updateProgress()">
<div class="error-message" id="url-error">Bitte geben Sie eine gültige URL ein.</div>
</div>
<div class="form-group">
<label for="resourceDescription">Kurzbeschreibung</label>
<textarea id="resourceDescription" class="form-control" rows="3" placeholder="Kurze Beschreibung der Ressource..." oninput="updateProgress()"></textarea>
</div>
<div class="form-group">
<label for="audience">Zielgruppe (audience - intendedEndUserRole) *</label>
<select id="audience" class="form-control" multiple size="4" onchange="updateProgress()">
<option value="http://w3id.org/openeduhub/vocabs/intendedEndUserRole/teacher">Lehrkräfte (teacher)</option>
<option value="http://w3id.org/openeduhub/vocabs/intendedEndUserRole/learner">Lernende (learner)</option>
<option value="http://w3id.org/openeduhub/vocabs/intendedEndUserRole/parent">Eltern (parent)</option>
<option value="http://w3id.org/openeduhub/vocabs/intendedEndUserRole/counsellor">Beratende (counsellor)</option>
</select>
<div class="text-xs" style="margin-top: 0.25rem; color: var(--gray-500);">Mehrfachauswahl möglich (Strg/Cmd + Klick)</div>
<div class="error-message" id="audience-error">Bitte wählen Sie mindestens eine Zielgruppe aus.</div>
</div>
<div class="form-group">
<label for="educationalLevel">Bildungsstufe (educationalLevel - KIM) *</label>
<select id="educationalLevel" class="form-control" multiple size="6" onchange="updateProgress()">
<option value="https://w3id.org/kim/educationalLevel/level_0">Elementarbereich (level_0)</option>
<option value="https://w3id.org/kim/educationalLevel/level_1">Primarbereich (level_1)</option>
<option value="https://w3id.org/kim/educationalLevel/level_2">Sekundarbereich I (level_2)</option>
<option value="https://w3id.org/kim/educationalLevel/level_3">Sekundarbereich II (level_3)</option>
<option value="https://w3id.org/kim/educationalLevel/level_A">Hochschule (level_A)</option>
<option value="https://w3id.org/kim/educationalLevel/level_B">Referendariat (level_B)</option>
<option value="https://w3id.org/kim/educationalLevel/level_C">Fortbildung (level_C)</option>
</select>
<div class="text-xs" style="margin-top: 0.25rem; color: var(--gray-500);">Mehrfachauswahl möglich (Strg/Cmd + Klick)</div>
<div class="error-message" id="educationallevel-error">Bitte wählen Sie mindestens eine Bildungsstufe aus.</div>
</div>
<div class="navigation">
<div></div>
<button class="btn btn-primary" onclick="nextStep(2)">
Weiter
<span></span>
</button>
</div>
</div>
<!-- STEP 2: Resource Classification -->
<div class="step hidden" id="step2">
<h2 class="step-title">
<span class="step-number">2</span>
Ressourcentyp & Fach (learningResourceType & about)
</h2>
<div class="info-box">
<strong>📚 OpenEduHub new_lrt:</strong> Wählen Sie passende Ressourcentypen aus dem offiziellen Vokabular.
</div>
<div class="form-group">
<label>Lernressourcentyp (learningResourceType - OpenEduHub new_lrt) *</label>
<div class="checkbox-grid">
<div class="checkbox-item">
<input type="checkbox" id="lrt_bibeltext" value="ab5b99ea-551c-42f3-995b-e4b5f469ad7e" onchange="updateProgress()">
<label for="lrt_bibeltext">
Bibeltext / Primärmaterial
<span class="label-description">Quellentext, religiöses Dokument</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="lrt_stundenentwurf" value="0d23ff13-9d92-4944-92fa-2b5fe1dde80b" onchange="updateProgress()">
<label for="lrt_stundenentwurf">
Stundenentwurf
<span class="label-description">Vollständige Unterrichtsplanung</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="lrt_arbeitsblatt" value="36e68792-6159-481d-a97b-2c00901f4f78" onchange="updateProgress()">
<label for="lrt_arbeitsblatt">
Arbeitsblatt
<span class="label-description">Übungsblatt, Aufgabenblatt</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="lrt_video" value="7a6e9608-2554-4981-95dc-47ab9ba924de" onchange="updateProgress()">
<label for="lrt_video">
Video
<span class="label-description">Lernvideo, Erklärvideo</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="lrt_methode" value="477115fd-5042-4174-ac39-7c05f8a24766" onchange="updateProgress()">
<label for="lrt_methode">
Pädagogische Methode
<span class="label-description">Unterrichtsmethode, Konzept</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="lrt_text" value="0cef3ce9-e106-47ae-836a-48f9ed04384e" onchange="updateProgress()">
<label for="lrt_text">
Text/Dokument
<span class="label-description">Fachartikel, Aufsatz</span>
</label>
</div>
</div>
<div class="error-message" id="lrt-error">Bitte wählen Sie mindestens einen Ressourcentyp aus.</div>
</div>
<div class="form-group">
<label for="about">Fach (about - discipline) *</label>
<select id="about" class="form-control" onchange="updateProgress()">
<option value="">Bitte wählen...</option>
<option value="http://w3id.org/openeduhub/vocabs/discipline/520">Religion (520)</option>
<option value="http://w3id.org/openeduhub/vocabs/discipline/340">Interkulturelle Bildung (340)</option>
<option value="http://w3id.org/openeduhub/vocabs/discipline/48005">Ethik (48005)</option>
</select>
<div class="error-message" id="about-error">Bitte wählen Sie ein Fach aus.</div>
</div>
<div class="navigation">
<button class="btn btn-secondary" onclick="previousStep(1)">
← Zurück
</button>
<button class="btn btn-primary" onclick="nextStep(3)">
Weiter
<span></span>
</button>
</div>
</div>
<!-- STEP 3: Religious-Didactic Labels -->
<div class="step hidden" id="step3">
<h2 class="step-title">
<span class="step-number">3</span>
Religionsdidaktische Zugänge (reliedu-didactics)
</h2>
<div class="info-box">
<strong>🔍 reliedu Vocabulary:</strong> Wählen Sie religionsdidaktische Labels aus dem internationalen reliedu-Vokabular. Diese erweitern das AMB-Feld "about" um religionspädagogische Spezifika.
</div>
<div class="form-group">
<label>Didaktische Zugänge (13 Kern-Labels)</label>
<div class="checkbox-grid">
<div class="checkbox-item">
<input type="checkbox" id="did_subjekt" value="https://w3id.org/reliedu/didactics/subjektorientierung" onchange="updateProgress()">
<label for="did_subjekt">
Subjektorientierung
<span class="label-description">Individuelle Erfahrungen der Lernenden</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_korrelation" value="https://w3id.org/reliedu/didactics/korrelation" onchange="updateProgress()">
<label for="did_korrelation">
Korrelationsdidaktik
<span class="label-description">Glaube ↔ Leben verbinden</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_elementar" value="https://w3id.org/reliedu/didactics/elementarisierung" onchange="updateProgress()">
<label for="did_elementar">
Elementarisierung
<span class="label-description">Reduktion auf Kernaussagen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_performativ" value="https://w3id.org/reliedu/didactics/performativ" onchange="updateProgress()">
<label for="did_performativ">
Performatives Lernen
<span class="label-description">Durch Handeln und Erleben</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_theologisieren" value="https://w3id.org/reliedu/didactics/theologisieren" onchange="updateProgress()">
<label for="did_theologisieren">
Theologisieren mit Kindern
<span class="label-description">Eigene theologische Fragen entwickeln</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_interreligioes" value="https://w3id.org/reliedu/didactics/interreligioes" onchange="updateProgress()">
<label for="did_interreligioes">
Interreligiöses Lernen
<span class="label-description">Dialog mit anderen Religionen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_biblisch" value="https://w3id.org/reliedu/didactics/biblisch" onchange="updateProgress()">
<label for="did_biblisch">
Biblische Didaktik
<span class="label-description">Umgang mit biblischen Texten</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_symbol" value="https://w3id.org/reliedu/didactics/symbol" onchange="updateProgress()">
<label for="did_symbol">
Symboldidaktik
<span class="label-description">Religiöse Symbole erschließen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_kirchenraum" value="https://w3id.org/reliedu/didactics/kirchenraum" onchange="updateProgress()">
<label for="did_kirchenraum">
Kirchenraumpädagogik
<span class="label-description">Kirchenräume als Lernorte</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_aesthetisch" value="https://w3id.org/reliedu/didactics/aesthetisch" onchange="updateProgress()">
<label for="did_aesthetisch">
Ästhetisches Lernen
<span class="label-description">Kunst, Musik, sinnliche Zugänge</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_inklusiv" value="https://w3id.org/reliedu/didactics/inklusiv" onchange="updateProgress()">
<label for="did_inklusiv">
Inklusive Religionspädagogik
<span class="label-description">Heterogenität berücksichtigen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_oekumenisch" value="https://w3id.org/reliedu/didactics/oekumenisch" onchange="updateProgress()">
<label for="did_oekumenisch">
Konfessionelle Kooperation
<span class="label-description">Ökumenisches Lernen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="did_digital" value="https://w3id.org/reliedu/didactics/digital" onchange="updateProgress()">
<label for="did_digital">
Digitale Religionsdidaktik
<span class="label-description">Digitale Medien sinnvoll einsetzen</span>
</label>
</div>
</div>
</div>
<div class="navigation">
<button class="btn btn-secondary" onclick="previousStep(2)">
← Zurück
</button>
<button class="btn btn-primary" onclick="nextStep(4)">
Weiter
<span></span>
</button>
</div>
</div>
<!-- STEP 4: Competencies & Content -->
<div class="step hidden" id="step4">
<h2 class="step-title">
<span class="step-number">4</span>
Kompetenzen & Inhaltsbereiche (teaches)
</h2>
<div class="info-box">
<strong>🎯 Kompetenzorientierung:</strong> Welche Kompetenzen fördert die Ressource? Welche Inhaltsbereiche werden behandelt?
</div>
<div class="form-group">
<label>Prozessbezogene Kompetenzen (reliedu-competency)</label>
<div class="checkbox-grid">
<div class="checkbox-item">
<input type="checkbox" id="comp_wahrnehmung" value="https://w3id.org/reliedu/competency/wahrnehmung" onchange="updateProgress()">
<label for="comp_wahrnehmung">
Wahrnehmungs- und Darstellungskompetenz
<span class="label-description">Religiöse Phänomene wahrnehmen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="comp_deutung" value="https://w3id.org/reliedu/competency/deutung" onchange="updateProgress()">
<label for="comp_deutung">
Deutungskompetenz
<span class="label-description">Religiöse Sprache verstehen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="comp_urteil" value="https://w3id.org/reliedu/competency/urteil" onchange="updateProgress()">
<label for="comp_urteil">
Urteilskompetenz
<span class="label-description">Reflektieren und Position beziehen</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="comp_dialog" value="https://w3id.org/reliedu/competency/dialog" onchange="updateProgress()">
<label for="comp_dialog">
Dialogkompetenz
<span class="label-description">Respektvoll kommunizieren</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="comp_gestaltung" value="https://w3id.org/reliedu/competency/gestaltung" onchange="updateProgress()">
<label for="comp_gestaltung">
Gestaltungskompetenz
<span class="label-description">Religiöse Ausdrucksformen gestalten</span>
</label>
</div>
</div>
</div>
<div class="form-group">
<label>Inhaltsbereiche (reliedu-content)</label>
<div class="checkbox-grid">
<div class="checkbox-item">
<input type="checkbox" id="content_mensch" value="https://w3id.org/reliedu/content/mensch-welt" onchange="updateProgress()">
<label for="content_mensch">
Mensch und Welt
<span class="label-description">Anthropologie, Schöpfung</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="content_bibel" value="https://w3id.org/reliedu/content/bibel" onchange="updateProgress()">
<label for="content_bibel">
Bibel
<span class="label-description">Heilige Schrift</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="content_gott" value="https://w3id.org/reliedu/content/gott" onchange="updateProgress()">
<label for="content_gott">
Gott
<span class="label-description">Gottesbild, Trinität</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="content_jesus" value="https://w3id.org/reliedu/content/jesus-christus" onchange="updateProgress()">
<label for="content_jesus">
Jesus Christus
<span class="label-description">Leben, Wirken, Bedeutung</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="content_kirche" value="https://w3id.org/reliedu/content/kirche" onchange="updateProgress()">
<label for="content_kirche">
Kirche und Kirchen
<span class="label-description">Ekklesiologie, Ökumene</span>
</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="content_religionen" value="https://w3id.org/reliedu/content/religionen" onchange="updateProgress()">
<label for="content_religionen">
Religionen und Weltanschauungen
<span class="label-description">Weltreligionen, Dialog</span>
</label>
</div>
</div>
</div>
<div class="form-group">
<label for="keywords">Freie Schlagworte (keywords)</label>
<input type="text" id="keywords" class="form-control" placeholder="z.B. Gleichnis, Barmherzigkeit, Nächstenliebe (kommagetrennt)" oninput="updateProgress()">
<div class="text-xs" style="margin-top: 0.25rem; color: var(--gray-500);">Mehrere Schlagworte durch Komma trennen</div>
</div>
<div class="navigation">
<button class="btn btn-secondary" onclick="previousStep(3)">
← Zurück
</button>
<button class="btn btn-primary" onclick="generateAMBMetadata()">
AMB-Metadaten generieren
<span></span>
</button>
</div>
</div>
<!-- STEP 5: Final Output -->
<div class="step hidden" id="step5">
<h2 class="step-title">
<span class="step-number"></span>
AMB-Metadaten generiert
</h2>
<div class="final-summary-container">
<h3>🎉 AMB-konforme Metadaten erfolgreich erstellt!</h3>
<p>Die Metadaten entsprechen dem Allgemeinen Metadatenprofil für Bildungsressourcen (AMB v20231019) der DINI-AG-KIM und nutzen das internationale reliedu-Vokabular.</p>
</div>
<div class="summary-section">
<h4>📋 JSON-LD Metadaten (AMB-konform)</h4>
<div class="amb-metadata-box" id="ambMetadataOutput"></div>
<button class="btn btn-outline" onclick="copyToClipboard('ambMetadataOutput')">
📋 JSON-LD kopieren
</button>
</div>
<div class="summary-section">
<h4>🔍 Zusammenfassung</h4>
<div id="summaryOutput"></div>
</div>
<div class="navigation">
<button class="btn btn-secondary" onclick="startOver()">
🔄 Neue Ressource
</button>
<button class="btn btn-primary" onclick="exportResults()">
💾 Exportieren
</button>
</div>
</div>
</div>
<script>
let currentStep = 1;
let formData = {};
let ambMetadata = {};
function updateProgress() {
let progress = 0;
const totalSteps = 5;
if (currentStep === 1) {
let step1Complete = 0;
if (document.getElementById('resourceTitle').value) step1Complete += 25;
if (document.getElementById('resourceUrl').value) step1Complete += 25;
if (getSelectedValues('audience').length > 0) step1Complete += 25;
if (getSelectedValues('educationalLevel').length > 0) step1Complete += 25;
progress = step1Complete / totalSteps;
} else if (currentStep === 2) {
let step2Complete = 0;
if (document.querySelectorAll('#step2 input[type="checkbox"]:checked').length > 0) step2Complete += 50;
if (document.getElementById('about').value) step2Complete += 50;
progress = 100/totalSteps + step2Complete/totalSteps;
} else if (currentStep === 3) {
progress = 200/totalSteps;
} else if (currentStep === 4) {
progress = 300/totalSteps;
} else if (currentStep >= 5) {
progress = 100;
}
document.getElementById('progressFill').style.width = progress + '%';
document.getElementById('progressText').textContent = `Schritt ${currentStep} von 5 (${Math.round(progress)}%)`;
}
function getSelectedValues(selectId) {
const select = document.getElementById(selectId);
return Array.from(select.selectedOptions).map(option => option.value);
}
function getCheckedValues(selector) {
return Array.from(document.querySelectorAll(selector + ':checked')).map(cb => cb.value);
}
function validateCurrentStep() {
let isValid = true;
if (currentStep === 1) {
const title = document.getElementById('resourceTitle').value;
const url = document.getElementById('resourceUrl').value;
const audience = getSelectedValues('audience');
const educationalLevel = getSelectedValues('educationalLevel');
if (!title) {
showError('resourceTitle', 'title-error');
isValid = false;
} else {
hideError('resourceTitle', 'title-error');
}
if (!url || !url.startsWith('http')) {
showError('resourceUrl', 'url-error');
isValid = false;
} else {
hideError('resourceUrl', 'url-error');
}
if (audience.length === 0) {
showError('audience', 'audience-error');
isValid = false;
} else {
hideError('audience', 'audience-error');
}
if (educationalLevel.length === 0) {
showError('educationalLevel', 'educationallevel-error');
isValid = false;
} else {
hideError('educationalLevel', 'educationallevel-error');
}
} else if (currentStep === 2) {
const lrt = getCheckedValues('#step2 input[type="checkbox"]');
const about = document.getElementById('about').value;
if (lrt.length === 0) {
document.getElementById('lrt-error').style.display = 'block';
isValid = false;
} else {
document.getElementById('lrt-error').style.display = 'none';
}
if (!about) {
showError('about', 'about-error');
isValid = false;
} else {
hideError('about', 'about-error');
}
}
return isValid;
}
function showError(fieldId, errorId) {
document.getElementById(fieldId).classList.add('error');
document.getElementById(errorId).style.display = 'block';
}
function hideError(fieldId, errorId) {
document.getElementById(fieldId).classList.remove('error');
document.getElementById(errorId).style.display = 'none';
}
function nextStep(step) {
if (!validateCurrentStep()) return;
document.getElementById('step' + currentStep).classList.add('hidden');
document.getElementById('step' + step).classList.remove('hidden');
currentStep = step;
updateProgress();
}
function previousStep(step) {
document.getElementById('step' + currentStep).classList.add('hidden');
document.getElementById('step' + step).classList.remove('hidden');
currentStep = step;
updateProgress();
}
function generateAMBMetadata() {
if (!validateCurrentStep()) return;
// Collect all form data
formData = {
title: document.getElementById('resourceTitle').value,
url: document.getElementById('resourceUrl').value,
description: document.getElementById('resourceDescription').value || undefined,
audience: getSelectedValues('audience'),
educationalLevel: getSelectedValues('educationalLevel'),
learningResourceType: getCheckedValues('#step2 input[type="checkbox"]').map(uuid =>
`http://w3id.org/openeduhub/vocabs/new_lrt/${uuid}`
),
about: [document.getElementById('about').value],
didactics: getCheckedValues('#step3 input[type="checkbox"]'),
competencies: getCheckedValues('#step4 input[id^="comp_"]'),
content: getCheckedValues('#step4 input[id^="content_"]'),
keywords: document.getElementById('keywords').value.split(',').map(k => k.trim()).filter(k => k)
};
// Add didactic labels to 'about' array
formData.about = formData.about.concat(formData.didactics);
// Create AMB-compliant JSON-LD
ambMetadata = {
"@context": [
"https://w3id.org/kim/amb/context.jsonld",
{
"reliedu": "https://w3id.org/reliedu/"
}
],
"id": formData.url,
"type": "LearningResource",
"name": formData.title,
"description": formData.description,
"about": formData.about,
"audience": formData.audience.map(uri => ({
"type": "Audience",
"id": uri
})),
"educationalLevel": formData.educationalLevel,
"learningResourceType": formData.learningResourceType,
"inLanguage": ["de"],
"datePublished": new Date().toISOString().split('T')[0]
};
// Add teaches if competencies or content selected
if (formData.competencies.length > 0 || formData.content.length > 0) {
ambMetadata.teaches = [
...formData.competencies.map(uri => ({ "id": uri })),
...formData.content.map(uri => ({ "id": uri }))
];
}
// Add keywords if present
if (formData.keywords.length > 0) {
ambMetadata.keywords = formData.keywords;
}
// Display metadata
document.getElementById('ambMetadataOutput').textContent = JSON.stringify(ambMetadata, null, 2);
// Generate summary
generateSummary();
nextStep(5);
}
function generateSummary() {
const getLabelFromUri = (uri, mapping) => {
return mapping[uri] || uri;
};
const audienceLabels = {
'http://w3id.org/openeduhub/vocabs/intendedEndUserRole/teacher': 'Lehrkräfte',
'http://w3id.org/openeduhub/vocabs/intendedEndUserRole/learner': 'Lernende',
'http://w3id.org/openeduhub/vocabs/intendedEndUserRole/parent': 'Eltern',
'http://w3id.org/openeduhub/vocabs/intendedEndUserRole/counsellor': 'Beratende'
};
const educationalLevelLabels = {
'https://w3id.org/kim/educationalLevel/level_0': 'Elementarbereich',
'https://w3id.org/kim/educationalLevel/level_1': 'Primarbereich',
'https://w3id.org/kim/educationalLevel/level_2': 'Sekundarbereich I',
'https://w3id.org/kim/educationalLevel/level_3': 'Sekundarbereich II',
'https://w3id.org/kim/educationalLevel/level_A': 'Hochschule',
'https://w3id.org/kim/educationalLevel/level_B': 'Referendariat',
'https://w3id.org/kim/educationalLevel/level_C': 'Fortbildung'
};
const lrtLabels = {
'ab5b99ea-551c-42f3-995b-e4b5f469ad7e': 'Bibeltext/Primärmaterial',
'0d23ff13-9d92-4944-92fa-2b5fe1dde80b': 'Stundenentwurf',
'36e68792-6159-481d-a97b-2c00901f4f78': 'Arbeitsblatt',
'7a6e9608-2554-4981-95dc-47ab9ba924de': 'Video',
'477115fd-5042-4174-ac39-7c05f8a24766': 'Pädagogische Methode',
'0cef3ce9-e106-47ae-836a-48f9ed04384e': 'Text/Dokument'
};
const disciplineLabels = {
'http://w3id.org/openeduhub/vocabs/discipline/520': 'Religion',
'http://w3id.org/openeduhub/vocabs/discipline/340': 'Interkulturelle Bildung',
'http://w3id.org/openeduhub/vocabs/discipline/48005': 'Ethik'
};
let summaryHtml = '<div class="summary-content">';
summaryHtml += `<p><strong>Titel:</strong> ${formData.title}</p>`;
summaryHtml += `<p><strong>URL:</strong> <a href="${formData.url}" target="_blank">${formData.url}</a></p>`;
if (formData.description) {
summaryHtml += `<p><strong>Beschreibung:</strong> ${formData.description}</p>`;
}
summaryHtml += `<p><strong>Zielgruppe:</strong> ${formData.audience.map(uri => audienceLabels[uri]).join(', ')}</p>`;
summaryHtml += `<p><strong>Bildungsstufe (KIM):</strong> ${formData.educationalLevel.map(uri => educationalLevelLabels[uri]).join(', ')}</p>`;
summaryHtml += `<p><strong>Ressourcentyp (OpenEduHub):</strong> ${formData.learningResourceType.map(uri => {
const uuid = uri.split('/').pop();
return lrtLabels[uuid] || uuid;
}).join(', ')}</p>`;
summaryHtml += `<p><strong>Fach:</strong> ${disciplineLabels[formData.about[0]]}</p>`;
if (formData.didactics.length > 0) {
summaryHtml += `<p><strong>Religionsdidaktische Labels:</strong> ${formData.didactics.length} ausgewählt</p>`;
}
if (formData.competencies.length > 0) {
summaryHtml += `<p><strong>Prozessbezogene Kompetenzen:</strong> ${formData.competencies.length} ausgewählt</p>`;
}
if (formData.content.length > 0) {
summaryHtml += `<p><strong>Inhaltsbereiche:</strong> ${formData.content.length} ausgewählt</p>`;
}
if (formData.keywords.length > 0) {
summaryHtml += `<p><strong>Schlagworte:</strong> ${formData.keywords.join(', ')}</p>`;
}
summaryHtml += '</div>';
document.getElementById('summaryOutput').innerHTML = summaryHtml;
}
async function copyToClipboard(elementId) {
const element = document.getElementById(elementId);
const text = element.textContent;
try {
await navigator.clipboard.writeText(text);
showSuccessMessage('In Zwischenablage kopiert!');
} catch (err) {
alert('Kopieren fehlgeschlagen. Bitte manuell kopieren.');
}
}
function showSuccessMessage(message) {
const successDiv = document.createElement('div');
successDiv.className = 'success-message';
successDiv.textContent = message;
const currentStepElement = document.querySelector('.step:not(.hidden)');
if (currentStepElement) {
currentStepElement.insertBefore(successDiv, currentStepElement.querySelector('.navigation'));
setTimeout(() => {
if (successDiv.parentNode) {
successDiv.parentNode.removeChild(successDiv);
}
}, 3000);
}
}
function startOver() {
if (confirm('Möchten Sie wirklich alle Eingaben zurücksetzen?')) {
document.querySelectorAll('input, select, textarea').forEach(element => {
if (element.type === 'checkbox') {
element.checked = false;
} else if (element.tagName === 'SELECT' && element.multiple) {
Array.from(element.options).forEach(option => option.selected = false);
} else {
element.value = '';
}
});
formData = {};
ambMetadata = {};
document.querySelectorAll('.step').forEach(step => step.classList.add('hidden'));
document.getElementById('step1').classList.remove('hidden');
currentStep = 1;
updateProgress();
}
}
function exportResults() {
const timestamp = new Date().toISOString().split('T')[0];
// Export JSON-LD
const jsonBlob = new Blob([JSON.stringify(ambMetadata, null, 2)],
{ type: 'application/json;charset=utf-8' });
const jsonLink = document.createElement('a');
jsonLink.href = URL.createObjectURL(jsonBlob);
jsonLink.download = `reliedu_amb_metadata_${timestamp}.json`;
document.body.appendChild(jsonLink);
jsonLink.click();
document.body.removeChild(jsonLink);
showSuccessMessage('AMB-Metadaten wurden exportiert!');
}
document.addEventListener('DOMContentLoaded', function() {
updateProgress();
});
</script>
</body>
</html>