Im git ist:
- 0032a Recording-command formatting.patch
- Korrektur der IDs, SHofmann , vielen Dank für den Lösungsvorschlag, ich hoffe, ich habe es diesmal richtig implementiert
.
Im git ist:
Yup, die Kodierung der Hierarchie schaut – bezogen auf den Screenshot oben – gut aus:![]()
id="reccommands_1_1"
id="reccommands_1_2"
id="reccommands_1_3"
id="reccommands_1_4"
id="reccommands_1_5"
id="reccommands_1_6"
id="reccommands_1_7"
id="reccommands_1_8"
id="reccommands_1_9"
id="reccommands_2_1_1_1_1"
id="reccommands_2_1_1_2"
id="reccommands_2_1_1_3"
id="reccommands_2_1_2_1_1"
id="reccommands_2_1_2_2"
id="reccommands_2_1_2_3"
id="reccommands_2_2_1"
id="reccommands_2_2_2"
id="reccommands_2_2_3"
id="reccommands_2_2_4"
id="reccommands_2_2_5"
id="reccommands_2_2_6"
id="reccommands_2_3"
...
id="reccommands_10_11"
id="reccommands_11"
id="reccommands_12"
id="reccommands_13"
id="reccommands_14"
id="reccommands_15"
Display More
Wenn ich mir allerdings die Links ansehe:
… frage ich mich – ohne Kenntnis des weiter involvierten Codes – doch, warum das nicht einfach hätte folgendermaßen aussehen können:
bzw. aus Sicht der Generierung:
<a id="rcd_recording_94" title="Diesen Befehl für die Aufzeichnung ausführen">
<script>
ael = document.getElementById("reccommands_1_1");
if (!ael) console.log('ERROR in pageelems.ecpp, !ael');
else ael.href="epginfo.html?epgid="+ael.id+"_"+encodeURIComponent("...")+"_831551BC4B3AAE1D4D95DD50533C6C82_&confirm=1&history_num_back=1";
</script>
Das wäre doch auch eineindeutig, und weil die Kommando-Hierarchie ist für die Auswahl und Ausführung der Kommandos ohne Belang ist, hätte man sich ein Mapping von der ID auf rcd_recording sparen können. Braucht man insofern dann den Hash überhaupt noch, wenn doch schon rcd_recording_94 eineindeutig ist`? ![]()
Könnte aber sein, dass der weitere Code, den ich mir aus Zeitgründen nicht angesehen habe, die fortlaufenden Indices zum Zeitpunkt der Generierung noch gar nicht kennt… ![]()
Nachdem ich jetzt erstmalig die Ausgabe der Kommandos angezeigt bekommen habe, habe ich die Formatierung nochmals etwas verbessert:
Die Überschriften von Befehlsgruppen werden jetzt beim Hover mit der Maus (wie auch bei den Befehlen selbst) in Fettschrift hervorgehoben:
Bei den Aufzeichnungen erscheint die oberste Menü-Überschrift immer in Fettschrift:
Im Bearbeiten-Dialog wird die Ausgabe des ausgeführten Kommandos optisch abgehoben:
Allerdings wird die Ausgabe eines Kommandos in voller Länge ausgegeben, weshalb sich das Formular nahezu beliebig verlängern kann. Weil die Buttons entsprechend weit nach unten wandern, muss man vor allem auf Tablets möglicherweise "ewig" scrollen; auf PCs genügt meist ein Ctrl+End, um die Buttons zu erreichen. Im CSS ist vorbereitet, dass man die Höhe auf 40 Zeilen begrenzen kann, womit gegebenenfalls ein vertikaler Srollbalken hinzugefügt wird. Das sanfte "Herausgleiten" des Textes am oberen und unteren Ende habe ich auch gleich noch eingebaut, weil es einfach schöner aussieht. ![]()
Bei den Aufzeichnungen fand ich es unpraktisch, dass sich die (potentiell sehr lange) Ausgabe der Kommandos vor die Buttons zwängt. Ich habe die Ausgabekonsole deshalb hinter die Buttons verlegt und ebenfalls optisch abgetrennt:
Wenn man vergessen hat, ein Kommando auszuwählen und keine Bestätigung angefordert hat, passiert erst einmal gar nichts. Vermutlich wäre es eine gute Idee, den Hinweis auf die fehlende Auswahl in die Ausgabekonsole einzublenden.
Wenn man allerdings mehrere Aufzeichnungen selektiert hat, erscheinen deren Ausgabe unstrukturiert untereinander. Ich habe Code und CSS darauf vorbereitet, dass man den Namen der zugehörigen Aufzeichnung in ein derzeit leeres (und damit standardmäßig nicht sichtbares) Feld einblenden kann:
Bei der Generierung müsste man den entsprechenden Abschnitt <div class="rec-commands"> wiederholt einfügen und natürlich den Namensabschnitt befüllen. Damit bekäme man in etwa Folgendes:
In diesem Fall sollte man die Größe einer solchen "Kachel" tatsächlich begrenzen (siehe oben). Die "Kachelung" der Ausgaben wäre etwas, was du noch in Angriff nehmen könntest. Vorbereitet sollte, wie gesagt, eigentlich alles sein… ![]()
Hier der Patch mit den obigen Ergänzungen gegen den aktuellen Master (Commit c8fb3cc5):
Angesichts der fortgeschrittenen Zeit habe ich hoffentlich keinen Fehler reingebracht. Die Tests (siehe die Screenshots) sehen jedenfalls gut aus… ![]()
PS: Eine Kleinigkeit habe ich noch gefunden:
diff --git a/live/css/styles.css b/live/css/styles.css
index 954cad83..7d1e615f 100644
--- a/live/css/styles.css
+++ b/live/css/styles.css
@@ -729,7 +729,7 @@ div.rec-commands-results > div.spacebar:first-of-type {
form#form_recordings div.rec-commands-results > div.spacebar:first-of-type {
margin-top: calc(var(--margin-top-bottom) * 2);
- background: linear-gradient(to bottom,var(--listing-row-background-color-bottom), var(--listing-row-background-color-top) var(--listing-row-background-gradient-height), var(--listing-row-background-color-top));
+ background: linear-gradient(to bottom,var(--listing-row-background-color-bottom), transparent var(--listing-row-background-gradient-height), var(--listing-row-background-color-top));
border-top: 1px solid var(--listing-row-border-color);
}
Display More
Ich habe den Patch in #583 auf 32c aktualisiert.
Falls du – wie oben mit "Test1" und "Test 2" skizziert – die Ausgaben für jede markierte Aufzeichnung individuell formatiert haben möchtest, sollte das generierte HTML diese Struktur aufweisen:
Die IDs müssen natürlich für jede Aufzeichnung individualisiert werden, am besten wohl durch Anfügen der entsprechenden Recording-Hashes. ![]()
Im git ist ein Update, mit #583 und #584
Außerdem werden mehr Details (Name der Aufzeichnung, ...) protokolliert und weitergegeben, so dass das Protokoll mit #583 und #584 formatiert dargestellt wird.
Die Bestätigungsdialoge funktionieren derzeit nicht. Wenn keine Aufzeichnung ausgewählt wird, erhält man bei den Buttons:
Für die Ausführung eines Befehls bekommt man stattdessen:
Das liegt daran, dass die folgende neue Funktion die per URL übergebenen Daten nicht sauber extrahiert:
Denn sie erkennt – und unterscheidet somit – nicht zuverlässig, wann nach dem Präfix recording_ eine Längenangabe für einen Ordner bzw. Befehl oder direkt ein Hash-Wert einer Aufzeichnung folgt:
rec hash = "recording_831551BC4B3AAE1D4D95DD50533C6C82_" [43]
fldr recs = "831551BC4B3AAE1D4D95DD50533C6C82_" [33]
pos = 32
f_length = 831551 // Plausibilitätscheck führt zum Abbruch
rec hash = "recording_119_Gekürzte Aufnahme verzeichnen?#011#011#011: /home/vdr/bin/add-defect.sh --log-in-rec --messages --online "Gekürzt/unvollständig"_831551BC4B3AAE1D4D95DD50533C6C82_" [170]
fldr recs = "119_Gekürzte Aufnahme verzeichnen?#011#011#011: /home/vdr/bin/add-defect.sh --log-in-rec --messages --online "Gekürzt/unvollständig"_831551BC4B3AAE1D4D95DD50533C6C82_" [160]
pos = 3
f_length = 119
folder = "Gekürzte Aufnahme verzeichnen?#011#011#011: /home/vdr/bin/add-defect.sh --log-in-rec --messages --online "Gekürzt/unvollständ" // abgeschnitten
recordings = "g"_831551BC4B3AAE1D4D95DD50533C6C82_" [36] // falscher Startpunkt
Display More
Außerdem passt – wie das zweite Beispiel zeigt – das extrahierte Kommando nicht, wenn es UTF-8-Zeichen umfasst, die mit mehreren Bytes kodiert sind. Das liegt daran, dass Javascript die Stringlänge in Codepoints (sprich: UTF-8-Zeichen) übergibt, während substr() in C++ aber Bytes erwartet.
Folgender Patch:
… adressiert beide Problemfelder:
fldr recs = "122bytes_Gekürzte Aufnahme verzeichnen?#011#011#011: /home/vdr/bin/add-defect.sh --log-in-rec --messages --online "Gekürzt/unvollständig"_831551BC4B3AAE1D4D95DD50533C6C82_" [165]
pos = 8
f_length = 122
folder = "Gekürzte Aufnahme verzeichnen?#011#011#011: /home/vdr/bin/add-defect.sh --log-in-rec --messages --online "Gekürzt/unvollständig""
recordings = "831551BC4B3AAE1D4D95DD50533C6C82_" [33]
Zum einen übergibt er die Länge des Ordners als Bytes anstelle von Codepoints, zum anderen führt er für beide Varianten eine saubere Fallunterscheidung mit spezifischer Verarbeitung durch. Damit passt wieder alles:
PS: Von einer Umstellung der URL-Verarbeitung von Bytes auf Codepoints habe ich Abstand genommen, weil das vermutlich umfangreiche Eingriffe in Live erfordern würde. Nachdem aber bislang alles gut funktioniert hat, sollte dieser "lokale" Eingriff eigentlich ausreichen. Allerdings würde ich vermuten, dass das Verschieben von Aufzeichnungen in Ordner mit Umlauten derzeit ebenfalls nicht funktioniert.
SHofmann , vielen Dank für die Fehlermeldung.
Da bin ich doch glatt über (für mich unerwartete) Unterschiede zwischen c++ und Javascript gestolpert:
Javascript: if("") x = "ja"; else x="nein" ; -> x wird nein
c++: if("") x = "ja"; else x="nein" ; -> x wird ja
Tja, und Javascript kodiert Strings mit utf16 (genauer: Die Implementierung darf entscheiden), und irgendwie hatte ich utf8 erwartet.
Ich habe jetzt
geschrieben. TextEncoder().encode(text) konvertiert immer in utf8
, s. https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder
Blob sagt zunächst nichts über die Kodierung, s. https://developer.mozilla.org/en-US/docs/Web/API/Blob
Ist vermutlich implementierungsabhängig
. Ich könnte jetzt natürlich auch Blob.bytes() verwenden. Da erschien mir der TextEncoder() aber einfacher.
Im git ist ein Update:
Ouch, d warst du wieder einmal schneller. Jetzt darf ich mit meinem gerade fertig gewordenen Patch noch eine Ehrenrunde drehen… ![]()
Trotzdem ist es gut, dass wir so fleißig sind. ![]()
'0032d Recording-command formatting.patch' passt nicht zum aktuellen git, kannst Du den bitte updaten?
Wenn der Anwender explizit entschieden hat, dass er kein Popup will, dann möchte ich ihm auch kein Popup anzeigen. Auch dann nicht, wenn er nichts ausgewählt hat.
Ja, ich weiß, deshalb ja auch meine Anmerkung mit der Ehrenrunde. ![]()
Doch bei WoltLab kann man offenkundig nicht unabhängig voneinander in verschiedenen Tabs arbeiten oder Entwürfe wenigstens nicht zwischenspeichern. Das ist meines Erachtens eigentlich ein Designfehler in der Suite… ![]()
Anmerkung: Ich führe hier eine "private" Konversation offen weiter. Kann ja sein, dass es doch jemanden außer mir und SHofmann interessiert.
QuoteDie Auflistung entspricht den Listen in den Bestätigungsdialogen. Und weil in dieser Darstellung die Meldungen eher wie Gruppenüberschriften wahrgenommen werden, könnte man vielleicht die Doppelpunkte weglassen und bräuchte nicht zwischen Ein- und Mehrzahl zu unterscheiden. Dies würde dann auch diesen "Bruch" vermeiden: ...
Finde ich gut. Wir sollten die Zahl der Texte möglichst klein halten.
QuoteDoch weil man hier immer nur auf einzelnen Objekten arbeitet, frage ich mich, wo dabei der Mehrwert liegt. Zudem erhält man beim Aktivieren bzw. Deaktivieren eines Timers kein Ergebnis angezeigt, bei fehlendem Timer hingegen: ... Und bei einem fehlenden Suchtimer erhält man beim Aktivieren bzw. Deaktivieren überhaupt keine Rückmeldung, er verschwindet einfach beim Neuladen klammheimlich aus der Liste (wohingegen ein Timer bei gleichem Szenario einfach stehen bleibt). Das Ganze ist also noch nicht wirklich "rund"…
Stimmt, das in confirm.h definierte Framework wird noch nicht durchgehend verwendet. Lösung: Wir wickeln alle Aktionen über das in confirm.h definierte Framework ab, auch wenn kein Bestätigungs-Popup nötig ist. Alle Aktionen liefern dann ein Ergebnis im json Format, das dann konsistent angezeigt werden kann.
Ich kann das implementieren, würde aber erst mal Deinen Patch abwarten und einbauen (?).
Finde ich gut. Wir sollten die Zahl der Texte möglichst klein halten.
Sehr schön. Ich baue das gleich noch in den Patch ein und lade ihn dann hoch. ![]()
Ich kann das implementieren, würde aber erst mal Deinen Patch abwarten und einbauen (?).
Ja, bitte übernimm du die Änderungen bei den Aktionen. Falls du noch andere Seiten um die Aktionsergebnisse ergänzen möchtest: Damit die Anzeige stimmig ist, müssen die Action-Ergebnisse vor dem unteren Spacebar eingefügt werden. Im Patch habe ich das bereits korrigiert.
Ich kann das implementieren, würde aber erst mal Deinen Patch abwarten und einbauen
Wieder einmal vielen Dank. Der folgende Patch steuert noch ein paar nette Verbesserungen zur Anzeige der Ergebnisse von Befehlen und Aktionen bei:
Der Patch ist gegen den aktuellen Master-Commit 4b8d6d51 gebaut. Dieser gibt ja mittlerweile eine Meldung aus, wenn trotz Anforderung keine Aktion ausgeführt wurde. Ich halte ich es aber für vorteilhafter, für Befehle ohne Bestätigung – wie auch im Bestätigungsdialog – schon vorher einen Hinweis einzublenden, wenn keine Aufzeichnung markiert wurde:
Wenn aber eine Operation (Befehl oder Aktion) ausgeführt wurde, wird zunächst die ausgeführte Operation angezeigt. Danach folgen die Ausgaben für jede der markierten Aufzeichnungen, die sauber mit Trennlinien voneinander abgegrenzt sind, hier am Beispiel des Befehls "Metadaten anzeigen":
Zudem kann man, wie oben gezeigt, über den Plus-Minus-Button das Protokoll eines jeden Befehls einklappen. Und wie an anderer Stelle auch, werden die Namen der Aufzeichnungen beim Scrollen oben angeheftet:
Dass die ausgeführte Operation dabei überdeckt wird, vereinfacht die Implementierung und dürfte kein Problem sein. Auch im Bearbeiten-Dialog einer Aufzeichnung steht dies alles für das Protokoll einer Befehlsausführung zur Verfügung:
Die einzelnen Protokolle werden jeweils in voller Länge ausgegeben, da man sich beim Durcharbeiten aufgrund der anhaftenden Überschriften sowie des Ein/Ausklappens schnell einen Überblick verschaffen kann. Dennoch habe ich am Ende eines Protokolls das Resize-Element (das schraffierte Dreieck) beibehalten:
… damit man bei Bedarf die Anzeigehöhe zugunsten eines Scrollbars verringern kann.
Hier noch je ein Beispiel mit Ausführungsfehlern für Befehle:
bzw. Aktionen:
Allerdings könnte man Fälle wie diesen bereits im Bestätigungsdialog erkennen und abfangen:
Wenn eine markierte Aufzeichnung nicht gefunden werden kann, würde ich die entsprechenden Aufzeichnungen aus der Liste herausnehmen und den Dialog entsprechend der "Restmenge" aufbauen. Wenn Bestätigungsdialoge abgewählt sind, greift dann ja wieder die oben gezeigte Fehlermeldung. ![]()
Wie oben abgestimmt, habe ich die Meldungen auf den Fall "keine Aktion" (headline_0) bzw. mindestens eine Aktion (headline_n) reduziert. Da im Verlauf der Arbeiten die Initialisierung des cConfirm-Vektors immer unübersichtlicher geworden ist, habe ich mir erlaubt, diesen umzuformatieren und der Lesbarkeit halber auch zwei überlange Attributnamen etwas zu verkürzen, wie dieses Exzerpt zeigt:
{ "del_", m_user_rights: UR_DELRECS,
m_headline: trNOOP("Delete recording"),
m_warning: nullptr,
m_prompt: trNOOP("Delete"),
m_headline_0: trNOOP("No recordings deleted"),
m_headline_n: trNOOP("Deleted recordings:"),
m_headline_error: trNOOP("Error deleting recordings:"),
m_question: &RecordingsManager_DeleteConfirmationQuestion,
m_objectNames: &RecordingsManager_object_names,
m_perform_action: &RecordingsManager_DeleteRecording
},
Display More
Auch habe ich die Gelegenheit genutzt, in den PO-Dateien derzeit auskommentierte Übersetzungen zu entsorgen. Ich hoffe, dass das alles auch in Markus' Sinne war… ![]()
Könntest Du bitte die Änderungen an den PO Dateien aus dem Patch entfernen?
de_DE.po kannst Du drinlassen, unter der Annahme, dass Du in dieser Datei Übersetzungen upgedatet und/oder ergänzt hast.
Edit:
Ich habe mir den Patch jetzt etwas genauer angeschaut:
Änderung "searchtimer" -> "search timer" im englischen Text, bei vorhandenen Texten:
Bitte mache dafür einen eigenen Patch. In diesem eigenen Patch würde ich auch eine Änderung in allen po Dateien akzeptieren, aber eben nur die Änderung "searchtimer" -> "search timer".
Änderung von "neuen" englischen Texten, also von Texten, für die es nur die deutsche Übersetzung in de_DE.po gibt:
Kannst Du gerne machen, dafür dann bitte nur einen Patch für de_DE.po schicken, die anderen po Dateien werden ja vom System automatisch upgedatet.
Änderung von "alten" englischen Texten, also von Texten, für die es zusätzlich zur deutschen Übersetzung in de_DE.po noch weitere Übersetzungen gibt:
Bitte vermeide solche Änderungen, und mache sie nur wenn unbedingt notwendig. z.B.:
würde ich nicht ändern. Wir können doch eh nur einen Suchtimer gleichzeitig löschen, und dafür ist doch "Error deleting search timer:" good enough. Auch wenn es eine generalisierte Überschrift ist, und wir an anderer Stelle "Error deleting recordings:" schreiben.
Und wenn so eine Änderung dann wirklich notwendig ist: Dann brauchen wir einen neuer Text, mit Patch für de_DE.po . Die anderen po Dateien werden ja vom System generiert, dafür also keinen Patch.
Ich habe die Änderungen jetzt selbst gemacht. Damit ist #594 im git.
Könntest Du bitte die Änderungen an den PO Dateien aus dem Patch entfernen?
de_DE.po kannst Du drinlassen, unter der Annahme, dass Du in dieser Datei Übersetzungen upgedatet und/oder ergänzt hast.
Die Änderungen an anderen PO-Dateien habe ich bei geringfügigen Anpassungen extra mit aufgenommen, damit eventuell vorhandene Übersetzungen nicht verloren gehen.
Kannst Du gerne machen, dafür dann bitte nur einen Patch für de_DE.po schicken, die anderen po Dateien werden ja vom System automatisch upgedatet.
Dem ist nicht so, wenn es dafür schon Übersetzungen gibt. Dann erscheint eine – wenn auch nur um ein Zeichen – geänderte msgid (etwa bei "searchtimer" vs. "search timer" oder Singular vs. Plural) ohne Übersetzung, während der alte, bereits übersetzte Eintrag als Kommentar unten angefügt ("geparkt") wird. Wenn es nur um Kleinigkeiten geht, bei denen – wie bei den oben genannten Beispielen – die vorhandene Übersetzungen vermutlich noch immer taugen, ist es somit wohl günstiger, die msgid eines bestehenden Eintrags beim Umbenennen mitzuführen.
Aber wenn dieser Sachverhalt ohne Belang ist, kümmere ich mich künftig nur noch um die deutsche Übersetzung… ![]()
Wir können doch eh nur einen Suchtimer gleichzeitig löschen, und dafür ist doch "Error deleting search timer:" good enough. Auch wenn es eine generalisierte Überschrift ist, und wir an anderer Stelle "Error deleting recordings:" schreiben.
Ich hatte verstanden, dass wir uns auf die Pluralform geeinigt hatten. Und wer weiß schon, ob wir nicht irgendwann auch das Markieren mehrerer (Such-)Timer zum Löschen zulassen… ![]()
Danke auch, dass du den Kleinkram gleich selbst erledigt hast. ![]()
![]()
Hast du dir schon eine Meinung gebildet, wie wir mit folgendem Szenario umgehen wollen:

Das Beste wäre wohl, Aufzeichnungen, deren Namen nicht ermittelt werden können, in den Bestätigungsdialogen nicht anzuzeigen:
diff --git a/recman.cpp b/recman.cpp
index 3faadad9..b17bd154 100644
--- a/recman.cpp
+++ b/recman.cpp
@@ -479,7 +479,7 @@ std::vector<std::string> RecordingsManager_object_names_mov(cSv recordings_hash)
}
for (cSv id: cSplit(recordings, '_')) if (id.length() == 32) {
const char *name = RecordingsManager::GetNameByHash(id);
- result.push_back(std::string(cSv(name)));
+ if (name && *name) result.push_back(std::string(cSv(name)));
}
return result;
}
Display More
Damit bekommt man für die Abfrage:
Das scheint mir ein ganz akzeptabler Kompromiss zu sein. Oder, was mir wohl weniger gefallen würde:
diff --git a/po/de_DE.po b/po/de_DE.po
index 360fac98..a3bc7364 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: VDR-LIVE 3.5.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-07-14 13:40+0200\n"
+"POT-Creation-Date: 2026-07-14 16:09+0200\n"
"PO-Revision-Date: 2026-01-27 20:15+0200\n"
"Last-Translator: Stefan Hofmann <info@stefans-galerie.de>\n"
"Language-Team: see developers in README\n"
@@ -63,6 +63,9 @@ msgstr "Suchtimer \"%s\" löschen?"
msgid "Search timer with id %s not found"
msgstr "Suchtimer mit Kennung \"%s\" nicht vorhanden"
+msgid "[recording name unavailable]"
+msgstr "[Name nicht verfügbar]"
+
msgid "Nothing selected!"
msgstr "Keine Auswahl getroffen!"
diff --git a/recman.cpp b/recman.cpp
index 3faadad9..69bf137b 100644
--- a/recman.cpp
+++ b/recman.cpp
@@ -479,7 +479,8 @@ std::vector<std::string> RecordingsManager_object_names_mov(cSv recordings_hash)
}
for (cSv id: cSplit(recordings, '_')) if (id.length() == 32) {
const char *name = RecordingsManager::GetNameByHash(id);
- result.push_back(std::string(cSv(name)));
+ if (name && *name) result.push_back(std::string(cSv(name)));
+ else result.push_back(std::string(tr("[recording name unavailable]")));
}
return result;
}
Display More
Bei Anzeige der Ergebnisse erscheinen solche verwaisten Einträge bei beiden Ansätzen nach wie vor als Fehlermeldung:
Entscheide bitte selbst, welcher Ansatz dir lieber ist. ![]()
Hallo, thanks all for the heavy work on the live plugin!
Attached the latest Dutch translations
Hast du dir schon eine Meinung gebildet, wie wir mit folgendem Szenario umgehen wollen:
Wir zeigen dieses Popup gar nicht an. Wir zeigen ein anderes Popup, auf dem
QuoteDaten haben sich geändert
Button: Reload page
steht. Der Anwender drückt auf den Button "Reload page", die Seite wird neu geladen, und alle gewählten Aufzeichnungen existieren dann auch
.
Don’t have an account yet? Register yourself now and be a part of our community!