Änderungen von Dokument Abkürzungsverzeichnis
Zuletzt geändert von Richard Kaden am 10.11.2025 14:47
Von Version 14.1
bearbeitet von Erik Hübner
am 23.10.2025 11:59
am 23.10.2025 11:59
Änderungskommentar:
Es gibt keinen Kommentar für diese Version
Auf Version 19.5
bearbeitet von Richard Kaden
am 10.11.2025 14:47
am 10.11.2025 14:47
Änderungskommentar:
Umbenannte Rückverlinkungen.
Zusammenfassung
-
Seiteneigenschaften (3 geändert, 0 hinzugefügt, 0 gelöscht)
-
Objekte (1 geändert, 0 hinzugefügt, 0 gelöscht)
Details
- Seiteneigenschaften
-
- Übergeordnete Seite
-
... ... @@ -1,0 +1,1 @@ 1 +startseite.WebHome - Dokument-Autor
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. ErikHuebner1 +XWiki.RichardKaden - Inhalt
-
... ... @@ -1,51 +1,57 @@ 1 1 {{html clean="false"}} 2 2 <div id="alpha-nav" style="margin-bottom: 10px; font-weight: bold;"> 3 - Filtern nach: 4 - <a href="#" id="all-link" onclick="filterTable('Alle'); return false;" style="margin: 0 5px; cursor: pointer;">Alle</a> 5 - <a href="#" onclick="filterTable('A'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-A">A</a> 6 - <a href="#" onclick="filterTable('B'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-B">B</a> 7 - <a href="#" onclick="filterTable('C'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-C">C</a> 8 - <a href="#" onclick="filterTable('D'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-D">D</a> 9 - <a href="#" onclick="filterTable('E'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-E">E</a> 10 - <a href="#" onclick="filterTable('F'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-F">F</a> 11 - <a href="#" onclick="filterTable('G'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-G">G</a> 12 - <a href="#" onclick="filterTable('H'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-H">H</a> 13 - <a href="#" onclick="filterTable('I'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-I">I</a> 14 - <a href="#" onclick="filterTable('J'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-J">J</a> 15 - <a href="#" onclick="filterTable('K'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-K">K</a> 16 - <a href="#" onclick="filterTable('L'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-L">L</a> 17 - <a href="#" onclick="filterTable('M'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-M">M</a> 18 - <a href="#" onclick="filterTable('N'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-N">N</a> 19 - <a href="#" onclick="filterTable('O'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-O">O</a> 20 - <a href="#" onclick="filterTable('P'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-P">P</a> 21 - <a href="#" onclick="filterTable('Q'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Q">Q</a> 22 - <a href="#" onclick="filterTable('R'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-R">R</a> 23 - <a href="#" onclick="filterTable('S'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-S">S</a> 24 - <a href="#" onclick="filterTable('T'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-T">T</a> 25 - <a href="#" onclick="filterTable('U'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-U">U</a> 26 - <a href="#" onclick="filterTable('V'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-V">V</a> 27 - <a href="#" onclick="filterTable('W'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-W">W</a> 28 - <a href="#" onclick="filterTable('X'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-X">X</a> 29 - <a href="#" onclick="filterTable('Y'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Y">Y</a> 30 - <a href="#" onclick="filterTable('Z'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Z">Z</a> 31 - <a href="#" onclick="filterTable('Ä'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Ä">Ä</a> 32 - <a href="#" onclick="filterTable('Ö'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Ö">Ö</a> 33 - <a href="#" onclick="filterTable('Ü'); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Ü">Ü</a> 3 + Filtern nach: 4 + <a href="#" id="all-link" onclick="filterTable('Alle', this); return false;" style="margin: 0 5px; cursor: pointer;">Alle</a> 5 + <a href="#" onclick="filterTable('A', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-A">A</a> 6 + <a href="#" onclick="filterTable('B', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-B">B</a> 7 + <a href="#" onclick="filterTable('C', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-C">C</a> 8 + <a href="#" onclick="filterTable('D', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-D">D</a> 9 + <a href="#" onclick="filterTable('E', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-E">E</a> 10 + <a href="#" onclick="filterTable('F', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-F">F</a> 11 + <a href="#" onclick="filterTable('G', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-G">G</a> 12 + <a href="#" onclick="filterTable('H', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-H">H</a> 13 + <a href="#" onclick="filterTable('I', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-I">I</a> 14 + <a href="#" onclick="filterTable('J', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-J">J</a> 15 + <a href="#" onclick="filterTable('K', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-K">K</a> 16 + <a href="#" onclick="filterTable('L', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-L">L</a> 17 + <a href="#" onclick="filterTable('M', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-M">M</a> 18 + <a href="#" onclick="filterTable('N', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-N">N</a> 19 + <a href="#" onclick="filterTable('O', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-O">O</a> 20 + <a href="#" onclick="filterTable('P', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-P">P</a> 21 + <a href="#" onclick="filterTable('Q', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Q">Q</a> 22 + <a href="#" onclick="filterTable('R', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-R">R</a> 23 + <a href="#" onclick="filterTable('S', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-S">S</a> 24 + <a href="#" onclick="filterTable('T', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-T">T</a> 25 + <a href="#" onclick="filterTable('U', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-U">U</a> 26 + <a href="#" onclick="filterTable('V', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-V">V</a> 27 + <a href="#" onclick="filterTable('W', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-W">W</a> 28 + <a href="#" onclick="filterTable('X', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-X">X</a> 29 + <a href="#" onclick="filterTable('Y', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Y">Y</a> 30 + <a href="#" onclick="filterTable('Z', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Z">Z</a> 31 + <a href="#" onclick="filterTable('Ä', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Ä">Ä</a> 32 + <a href="#" onclick="filterTable('Ö', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Ö">Ö</a> 33 + <a href="#" onclick="filterTable('Ü', this); return false;" style="margin: 0 5px; cursor: pointer;" id="letter-Ü">Ü</a> 34 34 </div> 35 + 35 35 <style> 36 36 #alpha-nav a.disabled { 37 37 opacity: 0.5; 38 38 cursor: default; 39 39 text-decoration: none !important; 41 + pointer-events: none; 40 40 } 43 + .anchor-target { 44 + scroll-margin-top: 80px; 45 + } 41 41 </style> 42 42 {{/html}} 48 + 43 43 |**Abkürzung**|**Erklärung** 44 44 |{{id name="AAC"/}}AAC|Advanced Audio Coding 45 45 |{{id name="AFIS"/}}AFIS|Archivifachinformationssystem 46 46 |{{id name="AID"/}}AID|Archivische Identifikatoren 47 47 |{{id name="AIP"/}}AIP|Archival Information Package 48 -|{{id name="ARC"/}}ARC|//siehe [[Glossar>> Glossar||anchor=ARC]]//54 +|{{id name="ARC"/}}ARC|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="ARC"]]// 49 49 |{{id name="AVI"/}}AVI|Audio Video Interleave 50 50 |{{id name="BMP"/}}BMP|Windows Bitmap 51 51 |{{id name="BSI"/}}BSI|Bundesamt für Sicherheit in der Informationstechnik ... ... @@ -54,14 +54,14 @@ 54 54 |{{id name="DIP"/}}DIP|Dissemination Information Package 55 55 |{{id name="DMS"/}}DMS|Dokumentenmanagementsystem 56 56 |{{id name="DNG"/}}DNG|Digital Negative Format 57 -|{{id name="DOC/ DOCX"/}}DOC/ DOCX|//siehe [[Glossar>> Glossar||anchor="DOC/ DOCX"]]//63 +|{{id name="DOC/ DOCX"/}}DOC/ DOCX|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="DOC/ DOCX"]]// 58 58 |{{id name="DOMEA"/}}DOMEA|Dokumentenmanagement und elektronische Archivierung im IT-gestützten Geschäftsgang 59 59 |{{id name="DSGVO"/}}DSGVO|Datenschutzgrundverordnung 60 60 |{{id name="Exif"/}}Exif|Exchangeable Image File Format 61 -|{{id name="FFV1"/}}FFV1|//siehe [[Glossar>> Glossar||anchor=FFV1]]//67 +|{{id name="FFV1"/}}FFV1|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="FFV1"]]// 62 62 |{{id name="FLAG"/}}FLAG|Free Lossless Audio Codec 63 63 |{{id name="FLV"/}}FLV|Flash Video 64 -|{{id name="GeoTIFF"/}}GeoTIFF|//siehe [[Glossar>> Glossar||anchor=GeoTIFF]]//70 +|{{id name="GeoTIFF"/}}GeoTIFF|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="GeoTIFF"]]// 65 65 |{{id name="GML"/}}GML|Geography Markup Language 66 66 |{{id name="HTML"/}}HTML|Hypertext Markup Language 67 67 |{{id name="IPTC"/}}IPTC|International Press Telecommunications Council ... ... @@ -68,17 +68,17 @@ 68 68 |{{id name="IT"/}}IT|Informationstechnik 69 69 |{{id name="JPEG"/}}JPEG|Joint Photographic Experts Group 70 70 |{{id name="KOST"/}}KOST|Koordinationsstelle für die dauerhafte Archivierung elektronischer Unterlagen beim Schweizerischen Bundesarchiv 71 -|{{id name="LieSa"/}}LieSa|Lifecycle eStudierendenakte, //siehe auch [[Glossar>> Glossar||anchor=LieSa]]//77 +|{{id name="LieSa"/}}LieSa|Lifecycle eStudierendenakte, //siehe auch [[Glossar>>startseite.glossar.WebHome||anchor="LieSa"]]// 72 72 |{{id name="METS"/}}METS|Metadata Encoding & Transmission Standard 73 73 |{{id name="MHTML"/}}MHTML|MIME Encapsulation of Aggregate HTML Documents 74 -|{{id name="MOV"/}}MOV|//siehe [[Glossar>> Glossar||anchor=MOV]]//75 -|{{id name="MP3"/}}MP3|//siehe [[Glossar>> Glossar||anchor=MP3]]//76 -|{{id name="MPEG"/}}MPEG|//siehe [[Glossar>> Glossar||anchor=MPEG]]//80 +|{{id name="MOV"/}}MOV|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="MOV"]]// 81 +|{{id name="MP3"/}}MP3|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="MP3"]]// 82 +|{{id name="MPEG"/}}MPEG|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="MPEG"]]// 77 77 |{{id name="NESTOR"/}}NESTOR|Network of Expertise in Long-Term Storage of Digital Resources 78 78 |{{id name="OAIS"/}}OAIS|Open Archival Information System 79 79 |{{id name="ODS"/}}ODS|Open Document Spreadsheet 80 80 |{{id name="ODT"/}}ODT|Open Document Text 81 -|{{id name="OGG"/}}OGG|//siehe [[Glossar>> Glossar||anchor=OGG]]//87 +|{{id name="OGG"/}}OGG|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="OGG"]]// 82 82 |{{id name="OSCI"/}}OSCI|Online Services Computer Interface 83 83 |{{id name="PDF"/}}PDF|Portable Document Format 84 84 |{{id name="PNG"/}}PNG|Portable Network Graphics ... ... @@ -89,13 +89,13 @@ 89 89 |{{id name="SIP"/}}SIP|Submission Information Package 90 90 |{{id name="SQL"/}}SQL|Structured Query Language 91 91 |{{id name="TIFF"/}}TIFF|Tagged Image File Format 92 -|{{id name="TXT"/}}TXT|//siehe [[Glossar>> Glossar||anchor=TXT]]//98 +|{{id name="TXT"/}}TXT|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="TXT"]]// 93 93 |{{id name="VBS"/}}VBS|Vorgangsbearbeitungssystem 94 94 |{{id name="VdA"/}}VdA|Verband deutscher Archivarinnen und Archivare e. V. 95 -|{{id name="WARC"/}}WARC|//siehe [[Glossar>> Glossar||anchor=WARC]]//96 -|{{id name="Wave (PCM)"/}}Wave (PCM)|//siehe [[Glossar>> Glossar||anchor="Wave/ Wave PCM (WAV)"]]//101 +|{{id name="WARC"/}}WARC|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="WARC"]]// 102 +|{{id name="Wave (PCM)"/}}Wave (PCM)|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="Wave/ Wave PCM (WAV)"]]// 97 97 |{{id name="WMA"/}}WMA|Windows Media Audio 98 98 |{{id name="WMV"/}}WMV|Windows Media Video 99 -|{{id name="XLS/ XLSX"/}}XLS/ XLSX|//siehe [[Glossar>> Glossar||anchor="XLS/ XLSX"]]//105 +|{{id name="XLS/ XLSX"/}}XLS/ XLSX|//siehe [[Glossar>>startseite.glossar.WebHome||anchor="XLS/ XLSX"]]// 100 100 |{{id name="XML"/}}XML|Extensible Markup Language 101 101 |{{id name="XÖV"/}}XÖV|XML in der öffentlichen Verwaltung
- XWiki.JavaScriptExtension[0]
-
- code
-
... ... @@ -1,89 +1,117 @@ 1 +let currentFilter = 'Alle'; 2 + 1 1 function initTableFilter() { 2 - var table = document.querySelector('table'); // Erste Tabelle auf der Seite 3 - if (!table) return; // Fallback, falls keine Tabelle 4 - var tbody = table.querySelector('tbody') || table; // Fallback auf table, falls kein tbody 5 - var rows = Array.from(table.querySelectorAll('tr')).slice(1); // Alle Zeilen außer Header 6 - var availableLetters = new Set(); 7 - 8 - // Alphabetisch sortieren 9 - rows.sort(function(a, b) { 10 - var textA = a.querySelector('td:first-child').textContent.trim().toUpperCase(); 11 - var textB = b.querySelector('td:first-child').textContent.trim().toUpperCase(); 4 + const table = document.querySelector('table'); 5 + if (!table) return; 6 + 7 + const tbody = table.querySelector('tbody') || table; 8 + const rows = Array.from(table.querySelectorAll('tr')).slice(1); 9 + const availableLetters = new Set(); 10 + 11 + // Sortieren 12 + rows.sort((a, b) => { 13 + const textA = a.querySelector('td:first-child').textContent.trim().toUpperCase(); 14 + const textB = b.querySelector('td:first-child').textContent.trim().toUpperCase(); 12 12 return textA.localeCompare(textB, 'de', { sensitivity: 'base' }); 13 13 }); 14 - 15 - // Sortierte Zeilen wieder in die Tabelle einfügen 16 - rows.forEach(function(row) { 17 - tbody.appendChild(row); 18 - }); 19 - 20 - // Klassen dynamisch zuweisen und Anfangsbuchstaben sammeln 21 - rows.forEach(function(row) { 22 - var firstCell = row.querySelector('td:first-child'); // Erste Spalte (Begriff) 17 + rows.forEach(row => tbody.appendChild(row)); 18 + 19 + // Klassen & IDs 20 + rows.forEach(row => { 21 + const firstCell = row.querySelector('td:first-child'); 23 23 if (firstCell && firstCell.textContent) { 24 - var firstChar = firstCell.textContent.trim().charAt(0).toUpperCase(); 25 - // Umlaute handhaben 26 - if (firstChar === 'Ä') firstChar = 'Ä'; 27 - else if (firstChar === 'Ö') firstChar = 'Ö'; 28 - else if (firstChar === 'Ü') firstChar = 'Ü'; 23 + const text = firstCell.textContent.trim(); 24 + let firstChar = text.charAt(0).toUpperCase(); 25 + if (['Ä','Ö','Ü'].includes(firstChar)) firstChar = firstChar; 29 29 row.classList.add('letter-' + firstChar); 30 30 availableLetters.add(firstChar); 28 + 29 + const idMatch = firstCell.innerHTML.match(/id\s*=\s*["']([^"']+)["']/); 30 + if (idMatch) { 31 + const anchorId = idMatch[1]; 32 + row.id = anchorId; 33 + firstCell.innerHTML = firstCell.innerHTML.replace(/id\s*=\s*["'][^"']+["']/, ''); 34 + firstCell.classList.add('anchor-target'); 35 + } 31 31 } 32 32 }); 33 - 34 - // Buchstaben ohne Einträge ausgrauen 35 - var letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ä', 'Ö', 'Ü']; 36 - letters.forEach(function(letter) { 37 - var link = document.getElementById('letter-' + letter); 38 - if (link && !availableLetters.has(letter)) { 39 - link.classList.add('disabled'); 40 - link.style.pointerEvents = 'none'; // Klick deaktivieren 38 + 39 + // Ausgrauen 40 + const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ'.split(''); 41 + letters.forEach(letter => { 42 + const link = document.getElementById('letter-' + letter); 43 + if (link && !availableLetters.has(letter)) link.classList.add('disabled'); 44 + }); 45 + 46 + filterTable('Alle', document.getElementById('all-link')); 47 + 48 + // Anker-Links 49 + document.addEventListener('click', e => { 50 + if (e.target.tagName === 'A' && e.target.getAttribute('href')?.startsWith('#')) { 51 + const hash = e.target.getAttribute('href'); 52 + if (hash === '#') return; 53 + e.preventDefault(); 54 + handleAnchorClick(hash.substring(1)); 41 41 } 42 42 }); 43 - 44 - // Initial: Alle anzeigen und "Alle" highlighten 45 - filterTable('Alle', document.getElementById('all-link')); // "Alle" mit Link-Referenz aufrufen 57 + 58 + // Initialer Hash 59 + if (window.location.hash) { 60 + setTimeout(() => handleAnchorClick(window.location.hash.substring(1)), 300); 61 + } 46 46 } 47 47 48 48 function filterTable(letter, targetLink) { 49 - var table = document.querySelector('table'); 65 + currentFilter = letter; 66 + const table = document.querySelector('table'); 50 50 if (!table) return; 51 - var rows = table.querySelectorAll('tr'); 52 - var visibleCount = 0; 53 - 54 - rows.forEach(function(row, index) { 55 - if (index === 0) { // Header immer sichtbar 56 - row.style.display = ''; 57 - return; 58 - } 59 - if (letter === 'Alle') { 60 - row.style.display = ''; 61 - visibleCount++; 62 - } else if (row.classList.contains('letter-' + letter)) { 63 - row.style.display = ''; 64 - visibleCount++; 65 - } else { 66 - row.style.display = 'none'; 67 - } 68 + const rows = table.querySelectorAll('tr'); 69 + 70 + rows.forEach((row, index) => { 71 + if (index === 0) { row.style.display = ''; return; } 72 + row.style.display = (letter === 'Alle' || row.classList.contains('letter-' + letter)) ? '' : 'none'; 68 68 }); 69 - 70 - // Aktiven Buchstaben highlighten 71 - var links = document.querySelectorAll('#alpha-nav a'); 72 - links.forEach(function(link) { 73 - link.style.fontWeight = 'normal'; 74 - link.style.color = 'inherit'; 74 + 75 + // Highlight Navigation 76 + document.querySelectorAll('#alpha-nav a').forEach(link => { 77 + link.style.fontWeight = 'normal'; 78 + link.style.color = 'inherit'; 75 75 }); 76 - // Highlight entweder über targetLink (Initialisierung) oder event.target (Klick) 77 - var linkToHighlight = targetLink || event.target; 78 - if (linkToHighlight) { 79 - linkToHighlight.style.fontWeight = 'bold'; 80 - linkToHighlight.style.color = '#00597B'; // Corporate Design: Dunkelblau 80 + if (targetLink) { 81 + targetLink.style.fontWeight = 'bold'; 82 + targetLink.style.color = '#00597B'; 81 81 } 82 82 } 83 83 84 -// Initialisierung nach Laden 85 -if (document.readyState === 'loading') { 86 - document.addEventListener('DOMContentLoaded', initTableFilter); 87 -} else { 88 - initTableFilter(); 86 +// --- Stabiler Anker-Sprung --- 87 +function handleAnchorClick(targetId) { 88 + const targetRow = document.getElementById(targetId); 89 + if (!targetRow) return; 90 + 91 + const firstCell = targetRow.querySelector('td:first-child'); 92 + const text = firstCell.textContent.trim(); 93 + let firstChar = text.charAt(0).toUpperCase(); 94 + if (['Ä','Ö','Ü'].includes(firstChar)) firstChar = firstChar; 95 + 96 + // Filter ggf. anpassen 97 + if (targetRow.style.display === 'none' || currentFilter !== firstChar) { 98 + const link = document.getElementById('letter-' + firstChar); 99 + if (link && !link.classList.contains('disabled')) { 100 + filterTable(firstChar, link); 101 + } else if (currentFilter !== 'Alle') { 102 + filterTable('Alle', document.getElementById('all-link')); 103 + } 104 + } 105 + 106 + // Scrollen + Hervorheben (ohne Sprung zurück) 107 + setTimeout(() => { 108 + history.replaceState(null, '', '#' + targetId); // Hash stabilisieren 109 + targetRow.scrollIntoView({ behavior: 'smooth', block: 'center' }); 110 + targetRow.style.transition = 'background-color 0.6s'; 111 + targetRow.style.backgroundColor = '#e6f3ff'; 112 + setTimeout(() => { targetRow.style.backgroundColor = ''; }, 2000); 113 + }, 200); 89 89 } 115 + 116 +// Init aufrufen 117 +document.addEventListener('DOMContentLoaded', initTableFilter);