Priority Icons: Technische Details
Technik von Priority Icons: Einfügen von CSS und JavaScript per Output-Buffer, Ersetzung der Prioritätstexte im Browser, durchsuchte Bereiche, PJAX, Barrierefreiheit und Dateistruktur.
Technische Details
Ablauf
graph TD
A["Seite wird angefragt"] --> B{"AJAX-Request?"}
B -->|"Ja"| C["Keine Injection"]
B -->|"Nein"| D{"Option enabled aus?"}
D -->|"Ja"| C
D -->|"Nein"| E["ob_start mit Callback"]
E --> F["CSS, Konfiguration und JS vor head-Ende einfügen"]
F --> G["Browser: Container nach Prioritätstext durchsuchen"]
G --> H["Text durch Icon ersetzen"]
H --> I["pjax:end oder MutationObserver"]
I -->|"Neuer Inhalt"| G
Serverseite
- Plugin:
PriorityIconsPlugin(Plugin-IDosticket:priority-icons, Name "Priority Icons"), KonfigurationsklassePriorityIconsConfig. - Singleton:
enable()legt bei Bedarf automatisch eine Instanz an. bootstrap(): Bei AJAX-Requests (HeaderX-Requested-With: XMLHttpRequest) passiert nichts. Ist die Optionenabledin der Konfiguration der ersten aktiven Instanz aus, passiert ebenfalls nichts. Sonst startetob_start()mit dem CallbackinjectAssetsIntoOutput().- Callback: Fügt vor
</head>(ersatzweise vor</body>) ein: ein<style>, ein<script>mitwindow.PriorityIconsConfigund ein<script>mit der Logik, alle mit dem Attributdata-plugin="priority-icons". Enthält die Ausgabe dieses Attribut schon, wird nicht doppelt eingefügt. - Konfiguration für das Skript: Die Prioritätsliste mit den Farben aus der Plugin-Konfiguration. Sie wird mit
JSON_HEX_TAG | JSON_HEX_APOSkodiert. - Inline statt Datei: Laut Code-Kommentar sperrt die
.htaccessim osTicket-Ordnerinclude/den HTTP-Zugriff auf Plugin-Dateien, deshalb werden CSS und JavaScript inline ausgeliefert. Es werden keine Core-Dateien geändert. - Warum nicht
addExtraHeader()oder Signalapps.scp: Laut Code-Kommentar ist$ostinbootstrap()nochNULL, undapps.scpfeuert nur auf der Apps-Seite.
Clientseite (JavaScript)
- Durchsuchte Bereiche:
table.list.queue.tickets,.ticket_info,.ticket-info,#ticket-status,.pjax-container. Findet das Skript keinen dieser Bereiche, durchsucht es den gesamtenbody. - Treffer: Ein Textknoten wird ersetzt, wenn sein getrimmter Text genau einem Prioritätsnamen entspricht (Groß-/Kleinschreibung wird beachtet, 3 bis 10 Zeichen). Textknoten in
script,style,textareaundinputbleiben unangetastet. - Ersetzung: Der Text wird durch einen Wrapper
.priority-wrapperersetzt. Er enthält ein Icon.priority-icon(Kreis, mittitleundaria-label="Priority: <Name>") und den Originaltext als.sr-only. Die Farbe wird per--priority-colordirekt am Icon gesetzt. - Tabellenzelle: Steht das Icon in einer
td, bekommt die Zelle das Attributdata-priority-cellund eine leichte Hintergrundfarbe. - Dynamische Inhalte: Das Skript lauscht per jQuery auf
pjax:end(sofern jQuery vorhanden ist) und beobachtet denbodyperMutationObserver. Neue Scans laufen entprellt (50 bis 100 ms). Bereits ersetzte Elemente werden überdata-priority-iconerkannt.
CSS
- Tooltip: Rein per CSS aus dem
title-Attribut (::after), Pfeil über::before. - Animation: Das Emergency-Icon pulsiert, bei
prefers-reduced-motion: reduceist die Animation abgeschaltet. - Dark Mode: Bei
prefers-color-scheme: darkwerden Tooltip-Hintergrund und -Farbe getauscht. - Druck: Farben bleiben erhalten (
print-color-adjust: exact), Tooltips und Animation entfallen. - Nicht genutzt: Das Stylesheet enthält Regeln für
priority-icon--badgeundpriority-icon--dot. Das Skript setzt diese Klassen nie, die Regeln sind ohne Wirkung.
Sicherheit
- Die Konfiguration wird mit
JSON_HEX_TAGkodiert, ein</script>im Wert kann den Block nicht beenden. - Farbwerte aus der Konfiguration werden gegen
^#[0-9a-fA-F]{3,6}$geprüft. - Icons entstehen per DOM-API, nicht per
innerHTML. assets/.htaccessverbietet die Ausführung von PHP im Ordnerassets/.
Dateistruktur
Das Repository enthält diese Dateien. Für den Betrieb sind plugin.php, class.PriorityIconsPlugin.php, config.php und assets/ nötig.
priority-icons/
+-- plugin.php # Plugin-Metadaten
+-- class.PriorityIconsPlugin.php # Plugin-Klasse
+-- config.php # Konfigurationsformular
+-- assets/
| +-- .htaccess
| +-- priority-icons.css # Stylesheet
| +-- priority-icons.js # Ersetzung und PJAX-Behandlung
+-- README.md
+-- CHANGELOG.md
+-- CONTRIBUTING.md
+-- LICENSE
+-- docs/ # ARCHITECTURE.md, CODE_REVIEW.md
+-- tests/ # PHPUnit-Tests
+-- .github/workflows/ci.yml
+-- composer.json
+-- phpunit.xml
+-- .releaseinclude
+-- .gitignore