Markus Michalski FAQ

Tab Swap: Technische Details

Technische Details zu Tab Swap: Signal object.view, ausgegebenes Inline-Script, die vier benötigten DOM-Elemente, PJAX-Neuausführung, Versionsprüfung, CSP-Nonce und Dateistruktur.

English Version

Zurück zur Übersicht

Tab Swap: Technische Details

Ablauf

graph TD
    A["osTicket startet, Plugin bootstrap()"] --> B["checkVersion(): installed_version speichern"]
    B --> C{"Enable Tab Swap an?"}
    C -->|"Nein"| D["Kein Signal, kein Script"]
    C -->|"Ja"| E["Signal object.view verbunden"]
    E --> F{"Objekt ist ein Ticket?"}
    F -->|"Nein"| G["Nichts passiert"]
    F -->|"Ja"| H["Inline-Script wird ausgegeben"]
    H --> I["Browser: Tabs tauschen"]

Plugin-Metadaten

Eigenschaft Wert
Plugin-ID net.markus-michalski:tab-swap
Name Tab Swap
Plugin-Klasse TabSwapPlugin in class.TabSwapPlugin.php
Konfigurationsklasse TabSwapConfig in config.php
Instanzen Singleton: es gibt genau eine Instanz, enable() legt sie bei Bedarf an
PHP >=7.4 (composer.json)

Server-Seite

Ausgegebenes Script

Das Plugin gibt ein Element der Form <script data-plugin="tab-swap" data-version="..." nonce="..."> aus:

Browser-Seite

Das Script wirkt erst, wenn alle Voraussetzungen erfüllt sind:

  1. Die Elemente #post-reply-tab, #post-note-tab, #reply und #note existieren.
  2. Beide Tabs sind sichtbar (offsetParent ist nicht null).

Dann passiert Folgendes:

  1. Das li-Element des Notiz-Tabs wird in #response-tabs vor das li des Antworten-Tabs verschoben.
  2. Beim Antworten-Tab wird die Klasse active entfernt und aria-selected="false" gesetzt. Beim Notiz-Tab wird active ergänzt und aria-selected="true" gesetzt.
  3. #reply bekommt display: none, #note bekommt display: block.

Der Tausch läuft pro Seitenaufbau einmal. Damit er auch bei später aufgebauten Seiten greift, nutzt das Script:

jQuery ist nicht zwingend nötig. Fehlt es, entfällt nur die Reaktion auf redraw.staff.

Dateistruktur

tab-swap/
├── plugin.php               # Plugin-Metadaten
├── class.TabSwapPlugin.php  # Plugin-Klasse, Signal-Handler, Inline-Script
└── config.php               # TabSwapConfig mit den zwei Feldern

Im Repository liegen zusätzlich composer.json, PHPUnit-Tests, CI-Workflow und Dokumentation. Die CI prüft Syntax und führt die Tests mit PHP 7.4 bis 8.3 aus.