Ersetzt die Prioritäts-Textlabels (Emergency, High, Normal, Low) im osTicket Staff Panel durch visuelle farbcodierte Icons. Das Plugin arbeitet rein clientseitig per DOM-Manipulation und benötigt keine Änderungen an Core-Dateien.
Ohne dieses Plugin: Prioritäten werden als reiner Text angezeigt - in langen Ticket-Listen müssen Agents jeden Eintrag lesen, um dringende Tickets zu erkennen.
Mit diesem Plugin: Farbcodierte Icons ersetzen den Text - Emergency-Tickets pulsieren rot, High-Tickets leuchten orange. Prioritäten sind auf einen Blick erkennbar.
prefers-reduced-motion UnterstützungSupport-Teams mit hohem Ticket-Aufkommen:
Teams mit hunderten offenen Tickets können Emergency- und High-Priority-Tickets sofort visuell identifizieren, ohne die Textlabels lesen zu müssen.
Mehrsprachige Helpdesks:
Das Plugin erkennt sowohl englische (Emergency, High, Normal, Low) als auch deutsche (Notfall, Hoch, Normal, Niedrig) Prioritätsnamen - ideal für Teams mit gemischter Sprach-Konfiguration.
Barrierefreie Arbeitsumgebungen:
Screen-Reader-Text bleibt erhalten, aria-label Attribute informieren assistive Technologien. Bei prefers-reduced-motion werden Animationen automatisch deaktiviert.
Teams mit Farbkodierungs-Standards:
Die Admin-konfigurierbaren Farben erlauben die Anpassung an firmeninterne Farbschemata - etwa wenn Rot für kritische Tickets in einer bestimmten Farbnuance definiert ist.
Multi-Monitor / Dashboard-Setups:
Auf großen Bildschirmen oder Dashboard-Monitoren sind farbige Icons deutlich schneller erkennbar als Textlabels.
| Anforderung | Version | Hinweise |
|---|---|---|
| osTicket | 1.18.x | Getestet mit 1.18.x |
| PHP | 8.1+ | Strict Types, Union Types |
| jQuery | Beliebig | In osTicket standardmäßig enthalten (für PJAX-Support) |
| Browser | Modern | ES6+, CSS Custom Properties erforderlich |
priority-icons-Ordner nach /include/plugins/ auf deinem osTicket-Server hochFinaler Pfad: /pfad/zu/osticket/include/plugins/priority-icons/
cd /pfad/zu/osticket/include/plugins
git clone https://github.com/markus-michalski/osticket-priority-icons.git priority-icons
Das Plugin erstellt automatisch eine Singleton-Instanz und beginnt sofort zu arbeiten.
Tipp: Nach der Aktivierung ist keine weitere Konfiguration nötig - das Plugin funktioniert sofort mit den Standard-Farbwerten.
| Einstellung | Beschreibung | Standard |
|---|---|---|
| Priority Icons aktivieren | Plugin global aktivieren/deaktivieren | An |
| Tooltips anzeigen | Prioritätsname beim Hover anzeigen | An |
| Icon-Stil | Visueller Stil: Gefüllter Kreis, Badge, Punkt | Gefüllter Kreis |
| Emergency-Farbe | Hex-Farbcode für Emergency-Priorität | #dc3545 (Rot) |
| High-Farbe | Hex-Farbcode für High-Priorität | #fd7e14 (Orange) |
| Normal-Farbe | Hex-Farbcode für Normal-Priorität | #ffc107 (Gelb) |
| Low-Farbe | Hex-Farbcode für Low-Priorität | #28a745 (Grün) |
Das Farbschema ist Bootstrap-inspiriert und folgt dem Ampel-Prinzip:
| Priorität | Farbe | Hex | Verhalten |
|---|---|---|---|
| Emergency | Rot | #dc3545 |
Pulsierender Glow-Effekt |
| High | Orange | #fd7e14 |
Statischer Kreis |
| Normal | Gelb | #ffc107 |
Statischer Kreis |
| Low | Grün | #28a745 |
Statischer Kreis |
Die Icon-Darstellung kann auch per CSS überschrieben werden, ohne die Plugin-Konfiguration zu ändern:
:root {
--priority-icon-size: 16px; /* Standard: 12px */
--priority-icon-spacing: 0.375rem;
--priority-tooltip-bg: #212529;
--priority-tooltip-color: #fff;
--priority-transition-duration: 150ms;
}
Das Plugin scannt nach dem Laden der Seite gezielt folgende Bereiche nach Prioritäts-Textlabels:
table.list.queue.tickets).ticket_info, .ticket-info)#ticket-status).pjax-container)Gefundene Textlabels werden durch farbcodierte Icons ersetzt. Der Original-Text bleibt als Screen-Reader-Text erhalten.
| Englisch | Deutsch |
|---|---|
| Emergency | Notfall |
| High | Hoch |
| Normal | Normal |
| Low | Niedrig |
Gefüllter Kreis (Standard):
Badge:
Punkt:
Das Plugin nutzt keine osTicket Signals für die Asset-Injection (siehe Technische Details für die Begründung). Stattdessen wird der Output-Buffer-Callback verwendet.
| Mechanismus | Methode | Zweck |
|---|---|---|
ob_start() Callback |
injectAssetsIntoOutput() |
CSS + JS vor </head> injizieren |
enable() Override |
addInstance() |
Singleton-Instanz automatisch erstellen |
bootstrap() Override |
ob_start() starten |
Asset-Injection initialisieren |
Warum keine Signals? Die osTicket-Signals
apps.scpundapps.adminfeuern nur auf der Apps-Seite, nicht auf regulären Seiten wie der Ticket-Liste.$ost->addExtraHeader()funktioniert ebenfalls nicht, daglobal $ostwährendbootstrap()nochNULList.
Symptome:
Prüfung:
Plugin aktiviert?
Seitenquelltext prüfen:
data-plugin="priority-icons" suchen<style> und <script> Tags mit diesem Attribut vorhanden seinBrowser-Konsole prüfen:
// Prüfen ob Config geladen wurde:
console.log(window.PriorityIconsConfig);
Error-Log prüfen:
tail -f /pfad/zu/osticket/include/ost-errors.log
Lösung:
Wenn data-plugin="priority-icons" nicht im Quelltext erscheint, ist die Plugin-Instanz nicht aktiv. Plugin deaktivieren und erneut aktivieren - die Singleton-Instanz wird automatisch erstellt.
Symptome:
data-plugin="priority-icons" im SeitenquelltextPrüfung:
Lösung:
Plugin deaktivieren und erneut aktivieren (erstellt automatisch Singleton-Instanz).
Symptome:
Prüfung:
Plugin-Version prüfen (muss >= 1.0.2 sein).
Lösung:
Plugin auf Version 1.0.2+ aktualisieren - enthält CSS-Fix für vertikale Zentrierung in Tabellenzellen.
Symptome:
Prüfung:
Lösung:
Benutzerdefinierte Prioritätsnamen erfordern eine Anpassung der $priorityMap in class.PriorityIconsPlugin.php.
priority-icons/
+-- plugin.php # Plugin-Metadaten (v1.0.3)
+-- class.PriorityIconsPlugin.php # Haupt-Plugin-Klasse
+-- config.php # Admin-Konfiguration
+-- composer.json # Abhängigkeiten und Scripts
+-- phpunit.xml # PHPUnit-Konfiguration
+-- assets/
| +-- .htaccess # Security + Caching
| +-- priority-icons.css # Icon-Styles + Animationen
| +-- priority-icons.js # DOM-Manipulation + PJAX
+-- tests/
| +-- bootstrap.php # Mock osTicket Classes
| +-- Unit/
| +-- PriorityIconsPluginTest.php # 44 Tests
| +-- PriorityIconsConfigTest.php # 53 Tests
+-- docs/
+-- ARCHITECTURE.md # Technische Architektur-Dokumentation
+-- CODE_REVIEW.md # Professionelle Code-Review (9.2/10)
Das Plugin nutzt Output-Buffer-Injection (ob_start() Callback), um CSS und JavaScript inline vor </head> zu injizieren:
public function bootstrap(): void
{
if ($this->isAjaxRequest()) {
return;
}
ob_start([$this, 'injectAssetsIntoOutput']);
}
Warum ob_start() statt anderer Methoden?
| Methode | Problem |
|---|---|
Signal..connect('apps.scp') |
Signal feuert nur in scp/apps/dispatcher.php (Apps-Tab), nicht auf normalen Seiten |
$ost->addExtraHeader() |
global $ost ist NULL während bootstrap(), weil PluginManager..bootstrap() innerhalb von osTicket..start() läuft |
| Externe CSS/JS-Dateien | include/.htaccess enthält Deny from all, blockiert HTTP-Zugriff auf Plugin-Assets |
ob_start() Callback |
Funktioniert zuverlässig, bewährtes Pattern |
Injection-Reihenfolge:
<style> mit CSS<script> mit PHP-zu-JS Konfiguration (window.PriorityIconsConfig)<script> mit JavaScript-LogikDOM-Traversal:
TreeWalker API für effizientes Durchlaufen des DOMPJAX-Unterstützung:
pjax:end Event-Handler via jQueryPerformance:
data-priority-icon markiert (keine Doppelverarbeitung)defer Attribut für non-blocking Script-LoadXSS-Schutz:
JSON_HEX_TAG | JSON_HEX_APOS (verhindert </script>-Injection)innerHTML)Double-Injection-Schutz:
data-plugin="priority-icons" im Output bevor InjectionAJAX-Skip:
Asset-Schutz (.htaccess):
/assets/ blockiert.sr-only Element erhaltenaria-label: Jedes Icon hat ein aria-label="Priority: {name}" Attributcursor: help: Zeigt an, dass Tooltip verfügbar istprefers-reduced-motion: Deaktiviert Pulse-Animation und Transitions97 Tests (PHPUnit 11):
PriorityIconsPluginTest)PriorityIconsConfigTest)composer test # Tests ausführen
composer analyse # PHPStan Static Analysis
F: Funktioniert das Plugin im Client-Portal?
A: Das Plugin ist für das Staff Panel konzipiert. Im Client-Portal werden Prioritäten in der Regel nicht angezeigt, daher hat das Plugin dort keinen Effekt.
F: Kann ich benutzerdefinierte Prioritätsnamen verwenden?
A: Aktuell werden nur die Standard-Prioritätsnamen (Emergency, High, Normal, Low) sowie deren deutsche Übersetzungen (Notfall, Hoch, Niedrig) unterstützt. Benutzerdefinierte Namen erfordern eine Anpassung der $priorityMap in class.PriorityIconsPlugin.php.
F: Was passiert, wenn ich das Plugin deaktiviere?
A: Die originalen Prioritäts-Textlabels werden sofort wieder angezeigt. Keine Daten werden verändert - das Plugin arbeitet rein clientseitig.
F: Ist das Plugin kompatibel mit anderen osTicket-Plugins?
A: Ja. Das Plugin modifiziert keine Core-Dateien und nutzt einen eigenen Namespace (data-plugin="priority-icons"). Konflikte sind unwahrscheinlich, solange kein anderes Plugin die gleichen DOM-Elemente manipuliert.
F: Warum werden Assets inline statt als externe Dateien geladen?
A: osTickets include/.htaccess enthält Deny from all, was HTTP-Zugriff auf alle Dateien im include/-Verzeichnis blockiert. Inline-Injection umgeht dieses Problem, ohne Core-Dateien zu ändern.
F: Warum nutzt das Plugin ob_start() statt Signal..connect()?
A: Die osTicket-Signals apps.scp und apps.admin feuern nur auf der Apps-Seite - nicht auf normalen Seiten wie der Ticket-Liste. $ost->addExtraHeader() funktioniert ebenfalls nicht, da global $ost während bootstrap() noch NULL ist. ob_start() mit Callback ist das einzige zuverlässige Pattern.
F: Funktioniert das Plugin mit NGINX?
A: Ja. Da alle Assets inline injiziert werden, gibt es keine externen Datei-Requests die von Webserver-Konfigurationen blockiert werden könnten.
F: Wie ändere ich die Icon-Größe?
A: Die Icon-Größe wird über CSS Custom Properties gesteuert:
:root {
--priority-icon-size: 16px; /* Standard: 12px */
}
Dieses Plugin wird unter der GNU General Public License v2 veröffentlicht, kompatibel mit osTicket Core.
Details siehe LICENSE.
Für Fragen oder Probleme erstelle bitte ein Issue auf GitHub:
Issue Tracker: https://github.com/markus-michalski/osticket-priority-icons/issues
Beim Melden von Problemen bitte angeben:
php -v)Entwickelt von Markus Michalski
Beiträge willkommen!
Siehe CHANGELOG.md für Versionshistorie.