PriorityIconsPlugin (Plugin-ID osticket:priority-icons, Name "Priority Icons"), Konfigurationsklasse PriorityIconsConfig.enable() legt bei Bedarf automatisch eine Instanz an.bootstrap(): Bei AJAX-Requests (Header X-Requested-With: XMLHttpRequest) passiert nichts. Ist die Option enabled in der Konfiguration der ersten aktiven Instanz aus, passiert ebenfalls nichts. Sonst startet ob_start() mit dem Callback injectAssetsIntoOutput().</head> (ersatzweise vor </body>) ein: ein <style>, ein <script> mit window.PriorityIconsConfig und ein <script> mit der Logik, alle mit dem Attribut data-plugin="priority-icons". Enthält die Ausgabe dieses Attribut schon, wird nicht doppelt eingefügt.JSON_HEX_TAG | JSON_HEX_APOS kodiert..htaccess im osTicket-Ordner include/ den HTTP-Zugriff auf Plugin-Dateien, deshalb werden CSS und JavaScript inline ausgeliefert. Es werden keine Core-Dateien geändert.addExtraHeader() oder Signal apps.scp: Laut Code-Kommentar ist $ost in bootstrap() noch NULL, und apps.scp feuert nur auf der Apps-Seite.table.list.queue.tickets, .ticket_info, .ticket-info, #ticket-status, .pjax-container. Findet das Skript keinen dieser Bereiche, durchsucht es den gesamten body.script, style, textarea und input bleiben unangetastet..priority-wrapper ersetzt. Er enthält ein Icon .priority-icon (Kreis, mit title und aria-label="Priority: <Name>") und den Originaltext als .sr-only. Die Farbe wird per --priority-color direkt am Icon gesetzt.td, bekommt die Zelle das Attribut data-priority-cell und eine leichte Hintergrundfarbe.pjax:end (sofern jQuery vorhanden ist) und beobachtet den body per MutationObserver. Neue Scans laufen entprellt (50 bis 100 ms). Bereits ersetzte Elemente werden über data-priority-icon erkannt.title-Attribut (::after), Pfeil über ::before.prefers-reduced-motion: reduce ist die Animation abgeschaltet.prefers-color-scheme: dark werden Tooltip-Hintergrund und -Farbe getauscht.print-color-adjust: exact), Tooltips und Animation entfallen.priority-icon--badge und priority-icon--dot. Das Skript setzt diese Klassen nie, die Regeln sind ohne Wirkung.JSON_HEX_TAG kodiert, ein </script> im Wert kann den Block nicht beenden.^#[0-9a-fA-F]{3,6}$ geprüft.innerHTML.assets/.htaccess verbietet die Ausführung von PHP im Ordner assets/.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