Widget-Kopf: kein rohes HTML mehr im Tooltip
Dolibarr 22 setzt den kompletten Widget-Titel samt Anzahl-Badge als title-Attribut an den Kopf und als Bezeichnung fuer die Widget-Auswahl. Beim Ueberfahren erschien deshalb "...Mahnstufe<span class="badge">2</span>". mahnungBoxKopfOhneHtml() setzt an beiden Stellen den reinen Titel. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9d345ff943
commit
d6b6dd6d47
4 changed files with 45 additions and 1 deletions
|
|
@ -16,6 +16,13 @@ war aber nicht indexiert; Dolibarr führte es als `unknown`.
|
|||
|
||||
## [Unreleased]
|
||||
|
||||
### Widget-Kopf: kein rohes HTML mehr im Tooltip
|
||||
Beim Überfahren des Widgets „Überfällige Rechnungen mit Mahnstufe" erschien
|
||||
`…Mahnstufe<span class="badge">2</span>` — die Zahl las sich wie eine Mahnstufe, war aber die
|
||||
Anzahl offener Rechnungen. Dolibarr 22 schreibt den kompletten Titel samt Badge-HTML ins
|
||||
title-Attribut des Kopfs und in die Bezeichnung der Widget-Auswahl. `mahnungBoxKopfOhneHtml()`
|
||||
setzt dort jetzt den reinen Titel; Badge und Link im Kopf bleiben, wie sie sind.
|
||||
|
||||
### Reiter am Kunden nur noch, wenn es Mahnungen gibt
|
||||
Der Reiter „Mahnwesen" stand auf **jeder** Kundenkarte, auch wenn dort nie gemahnt wurde. Die
|
||||
Reiterleiste trägt dort 21 Einträge; auf Prod gibt es 4 Mahnungen bei 3 von 111 Kunden — bei 108
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ Dolibarr Custom-Modul: 3-stufiges Mahnwesen nach BGB §288 + Versand-Tracking +
|
|||
- Zeigt ALLE offenen Rechnungen, nicht nur überfällige
|
||||
- Mahnstufe-Badge nur wenn Mahnung existiert, sonst Strich
|
||||
- **Zähler im Kopf**: Der Badge im Widget-Kopf zeigt die tatsächliche Gesamtzahl offener Rechnungen (verlinkt auf die Rechnungsliste). Titel-Lang-Key hat kein `(%s)` mehr — die Zahl steckt im Badge. Der Zähler wird erst NACH der Query gesetzt (wenn `$num` bekannt ist), damit die frühen Return-Pfade (fehlende Rechte / SQL-Fehler) ohne Zähler bleiben.
|
||||
- **Tooltip am Kopf**: Dolibarr 22 kopiert den kompletten Titel samt Badge-HTML ins `title` des Kopfs und in `boxlabelentry` — `showBox()` setzt beides über `mahnungBoxKopfOhneHtml()` auf den reinen Titel (ohne Anzahl, die las sich dort wie eine Mahnstufe). Gleiches Muster in BuchhaltungsWidget (`buchaltungswidgetCleanBoxHead()`).
|
||||
- **Zeilenanzahl konfigurierbar** via Konstante `MAHNUNG_BOX_MAXLINES` (Admin-Select in `setup.php`: Alle/5/10/20/30/50, Default `0` = alle). Widget lädt IMMER alle offenen Rechnungen (für den korrekten Zähler), rendert aber nur `MAHNUNG_BOX_MAXLINES` Zeilen + eine `...`-Überlaufzeile. **Nicht** auf das von Dolibarr übergebene `$max` verlassen — das kommt aus `MAIN_SIZE_SHORTLIST_LIMIT` (Default 5) und gilt global für ALLE Home-Boxen. (KB #598)
|
||||
- **Empty-State Pflicht**: bei `$num == 0` Platzhalter-Zeile in `info_box_contents` einfügen — sonst rendert `ModeleBoxes::showBox()` gar nichts und das Widget verschwindet komplett (auch nach neuen Rechnungen sieht der User es nicht zurückkommen). Siehe KB #682.
|
||||
- **Summenzeile Netto+Brutto**: Betragszelle der `liste_total`-Zeile zeigt zweizeilig Netto (`SUM(f.total_ht)`) und Brutto (`SUM(f.total_ttc)`). Brutto kommt direkt aus `f.total_ttc` der Rechnung, NICHT aus Netto × Steuersatz hochgerechnet — sonst wären Reverse-Charge §13b, Steuerbefreiung und Kleinunternehmer §19 UStG falsch. Lang-Keys `MahnungBoxNetto`/`MahnungBoxBrutto`.
|
||||
|
|
|
|||
|
|
@ -547,6 +547,15 @@ class box_mahnung_offen extends ModeleBoxes
|
|||
*/
|
||||
public function showBox($head = null, $contents = null, $nooutput = 0)
|
||||
{
|
||||
return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput);
|
||||
global $langs;
|
||||
|
||||
// Tooltip ohne Badge-HTML und ohne Anzahl (die Zahl liest sich dort wie eine Mahnstufe)
|
||||
$out = parent::showBox($this->info_box_head, $this->info_box_contents, 1);
|
||||
$out = mahnungBoxKopfOhneHtml($out, $langs->trans($this->boxlabel));
|
||||
if ($nooutput) {
|
||||
return $out;
|
||||
}
|
||||
print $out;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -109,3 +109,30 @@ function mahnungStufeBadge($stufe, $label, $istErinnerung, $tooltip = '')
|
|||
$out .= ' title="'.dol_escape_htmltag($tooltip).'">'.dol_escape_htmltag($text).'</span>';
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Setzt im Widget-Kopf Tooltip und Auswahl-Bezeichnung auf den reinen Titel.
|
||||
*
|
||||
* ModeleBoxes::showBox() schreibt den kompletten Widget-Titel zusätzlich in das
|
||||
* title-Attribut des Tabellenkopfs und in die Bezeichnung für die Widget-Auswahl
|
||||
* (boxlabelentry, landet nach dem Schließen im Auswahlfeld). Unser Titel trägt den
|
||||
* Anzahl-Badge samt Link als HTML — der Browser zeigt beim Überfahren dann
|
||||
* „…Mahnstufe<span class="badge">2</span>“. Der sichtbare Kopf bleibt unverändert.
|
||||
*
|
||||
* @param string $out Ausgabe von ModeleBoxes::showBox()
|
||||
* @param string $label Titel ohne HTML (Entities wie von $langs->trans() erlaubt)
|
||||
* @return string Bereinigte Ausgabe
|
||||
*/
|
||||
function mahnungBoxKopfOhneHtml($out, $label)
|
||||
{
|
||||
$label = dol_escape_htmltag(html_entity_decode($label, ENT_QUOTES | ENT_HTML5, 'UTF-8'));
|
||||
|
||||
$out = preg_replace_callback('/(<tr class="liste_titre box_titre"><th[^>]*?) title="[^"]*"/', function ($m) use ($label) {
|
||||
return $m[1].' title="'.$label.'"';
|
||||
}, $out, 1);
|
||||
|
||||
return preg_replace_callback('/(<input type="hidden" id="boxlabelentry\d*" value=")[^"]*"/', function ($m) use ($label) {
|
||||
return $m[1].$label.'"';
|
||||
}, $out, 1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue