BPM:GUI Plugins: Unterschied zwischen den Versionen

Zur Navigation springen Zur Suche springen
keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 42: Zeile 42:
#Der Interface Member '''JobEntry''' wird aufgerufen sobald man innerhalb der Business Process Management GUI auf Erweiterte Konfiguration eines Jobs drückt. Hier öffnet man in der Regel eine Maske welche zur erweiterten Konfiguration genutzt werden kann. Es können zusätzlich auch Prüfungen stattfinden, beispielsweise ob ein Mandant gewählt wurde oder nicht. Wenn diese Funktion False zurückgibt, wird der Job nicht gespeichert und das hinterlegte Delete Script innerhalb der [[/doku.php?id=wiki:guipluginassets|Assets]]-Struktur wird aufgerufen, auf das Thema [[/doku.php?id=wiki:guipluginassets|Assets]] gehen wir später ein. Hier ein Beispiel:<br/> <br/> [[File:GUI Plugins 11.png|RTENOTITLE]]<br/> Die [[/doku.php?id=wiki:pluginbase|Basisklasse]] (base.) beinhaltet verschiedene Basisfunktionen wie beispielsweise GetLogger.<br/> ​Die aufgerufene Form sollte als Best Practise immer die folgenden Konstruktor-Parameter definiert haben:<br/> <br/> [[File:GUI Plugins 12.png|RTENOTITLE]]<br/> Um einen FluentLogger zu verwenden (was Sie wirklich tun sollten!), setzen Sie bitte einen Verweis auf die '''HTKFunctionsLibrary ''' welche Sie auch im Plugins Ordner ihrer Installierten Business Process Management GUI finden.<br/> <br/> <span style="color:#FF0000">[[File:FunktionsLibrary.png|RTENOTITLE]]</span><br/> <br/> '''Achtung''': sollten Sie wie in obigem Beispiel eine [https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraEditorsXtraMessageBoxtopic XtraMessageBox] verwenden (was optisch besser in das Gesamtbild passt), so benötigen Sie die [https://www.devexpress.com/Products/NET/Controls/WinForms/ DevExpress Komponenten] in der jeweisl vorrausgesetzten Version (siehe Systemvorrausetzungen). Die nötigen Verweise sind<br/> <span style="color:#FF0000">[[File:Verweise DevExpress.png|RTENOTITLE]]</span>  
#Der Interface Member '''JobEntry''' wird aufgerufen sobald man innerhalb der Business Process Management GUI auf Erweiterte Konfiguration eines Jobs drückt. Hier öffnet man in der Regel eine Maske welche zur erweiterten Konfiguration genutzt werden kann. Es können zusätzlich auch Prüfungen stattfinden, beispielsweise ob ein Mandant gewählt wurde oder nicht. Wenn diese Funktion False zurückgibt, wird der Job nicht gespeichert und das hinterlegte Delete Script innerhalb der [[/doku.php?id=wiki:guipluginassets|Assets]]-Struktur wird aufgerufen, auf das Thema [[/doku.php?id=wiki:guipluginassets|Assets]] gehen wir später ein. Hier ein Beispiel:<br/> <br/> [[File:GUI Plugins 11.png|RTENOTITLE]]<br/> Die [[/doku.php?id=wiki:pluginbase|Basisklasse]] (base.) beinhaltet verschiedene Basisfunktionen wie beispielsweise GetLogger.<br/> ​Die aufgerufene Form sollte als Best Practise immer die folgenden Konstruktor-Parameter definiert haben:<br/> <br/> [[File:GUI Plugins 12.png|RTENOTITLE]]<br/> Um einen FluentLogger zu verwenden (was Sie wirklich tun sollten!), setzen Sie bitte einen Verweis auf die '''HTKFunctionsLibrary ''' welche Sie auch im Plugins Ordner ihrer Installierten Business Process Management GUI finden.<br/> <br/> <span style="color:#FF0000">[[File:FunktionsLibrary.png|RTENOTITLE]]</span><br/> <br/> '''Achtung''': sollten Sie wie in obigem Beispiel eine [https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraEditorsXtraMessageBoxtopic XtraMessageBox] verwenden (was optisch besser in das Gesamtbild passt), so benötigen Sie die [https://www.devexpress.com/Products/NET/Controls/WinForms/ DevExpress Komponenten] in der jeweisl vorrausgesetzten Version (siehe Systemvorrausetzungen). Die nötigen Verweise sind<br/> <span style="color:#FF0000">[[File:Verweise DevExpress.png|RTENOTITLE]]</span>  
#[[File:DevExpress.png|RTENOTITLE]]  
#[[File:DevExpress.png|RTENOTITLE]]  
#sowie<br/> <br/> <span style="color:#FF0000">[[File:Devexpress2.png|RTENOTITLE]]</span><br/> <br/> Desweiteren empfiehlt es sich wenn Sie [https://www.devexpress.com/Products/NET/Controls/WinForms/ Devexpress Komponenten] verwenden, eine [https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraEditorsXtraFormtopic XtraForm] statt einer Form zu erstellen und in deren Konstruktor folgenden Codeschnipsel zu übernehmen:<br/> <br/> <span style="color:#FF0000">[[File:Express methoden.png]]</span><br/> Für die Bonusskins ist ein weiterer Verweis auf<br/> <br/> <span style="color:#FF0000">[[File:Bonus Skin.png]]</span><br/> <br/> erforderlich.<br/> Nach erfolreicher erweiterten Konfiguration geben Sie bitte true zurück<span style="color:#0000FF"><span style="font-size:14px line-height: 19.6000003814697px">.</span></span>  
#sowie<br/> <br/> <span style="color:#FF0000">[[File:Devexpress2.png|RTENOTITLE]]</span><br/> <br/> Desweiteren empfiehlt es sich wenn Sie [https://www.devexpress.com/Products/NET/Controls/WinForms/ Devexpress Komponenten] verwenden, eine [https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraEditorsXtraFormtopic XtraForm] statt einer Form zu erstellen und in deren Konstruktor folgenden Codeschnipsel zu übernehmen:<br/> <br/> <span style="color:#FF0000">[[File:Express methoden.png|RTENOTITLE]]</span><br/> Für die Bonusskins ist ein weiterer Verweis auf<br/> <br/> <span style="color:#FF0000">[[File:Bonus Skin.png|RTENOTITLE]]</span><br/> <br/> erforderlich.<br/> Nach erfolreicher erweiterten Konfiguration geben Sie bitte true zurück<span style="color:#0000FF"><span style="font-size:14px line-height: 19.6000003814697px">.</span></span>  
#Legen Sie nun folgende Ordnerstruktur in Ihrem Projekt an. Die Dateien können je nach bedarf hinzugefügt werden. DIe Ordnerstruktur sollten Sie allerdings standardmäßig so anlegen. Bitte achten Sie auf Korrekte Benennung der Ordnerstruktur.<br/> <br/> <span style="color:#FF0000">[[File:Assetbaum.png]]</span><br/> '''Achtung: '''<u>Alle [[/doku.php?id=wiki:guipluginassets|Assets]]'''müssen''' bei Buildvorgang Eingebettete Ressource hinterlegt haben!<br/> <span style="color:#FF0000">[[File:Bildvorgang.png]]</span></u>  
#Legen Sie nun folgende Ordnerstruktur in Ihrem Projekt an. Die Dateien können je nach bedarf hinzugefügt werden. DIe Ordnerstruktur sollten Sie allerdings standardmäßig so anlegen. Bitte achten Sie auf Korrekte Benennung der Ordnerstruktur.<br/> <br/> <span style="color:#FF0000">[[File:Assetbaum.png|RTENOTITLE]]</span><br/> '''Achtung: '''<u>Alle [[/doku.php?id=wiki:guipluginassets|Assets]]'''müssen''' bei Buildvorgang Eingebettete Ressource hinterlegt haben!<br/> <span style="color:#FF0000">[[File:Bildvorgang.png|RTENOTITLE]]</span></u>  
#'''Cleanup: ''' Der Ordner Cleanup beinhaltet Scripte welche benötigt werden um die Tabellenstrukturen "sauber" zu halten. Auch wenn Sie alles korrekt gemacht haben, sollten Sie trotzdem ein solchen Script hinterlegen. Die Scripte werden automatisch ausgeführt. Es empfiehlt sich als Best Practise den Namen der zu "cleanenden" Tabelle als Scriptname zu hinterlegen.<br/> <br/> [[File:Plugin beispiel.png]]<br/> <br/> Script-Beispiel:  
#'''Cleanup: ''' Der Ordner Cleanup beinhaltet Scripte welche benötigt werden um die Tabellenstrukturen "sauber" zu halten. Auch wenn Sie alles korrekt gemacht haben, sollten Sie trotzdem ein solchen Script hinterlegen. Die Scripte werden automatisch ausgeführt. Es empfiehlt sich als Best Practise den Namen der zu "cleanenden" Tabelle als Scriptname zu hinterlegen.<br/> <br/> [[File:Plugin beispiel.png|RTENOTITLE]]<br/> <br/> Script-Beispiel:  
#[[File:Scriptbeispiel1.png]]  
#[[File:Scriptbeispiel1.png|RTENOTITLE]]  
#'''Delete: ''' Der Ordner Delete beinhaltet Scripte, welche ausgeführt werden wenn die Methode '''JobEntry ''' false zurückgibt. Auch hier empfiehlt sich als Namensgebung der Tabellenname.<br/> <br/> [[File:Plugin beispiel.png]]<br/> Script-Beispiel:<br/> [[File:Scriptbeispiel2.png]]<br/> Im speziellen Fall des Delete-Scriptes stehen folgende [[/doku.php?id=wiki:guiplatzhalter|Platzhalter]] zur Verfügung. @Mandant und @JobId, bitte achten Sie bei Verwendung der Variablen auf die korrekte Bennenung.  
#'''Delete: ''' Der Ordner Delete beinhaltet Scripte, welche ausgeführt werden wenn die Methode '''JobEntry ''' false zurückgibt. Auch hier empfiehlt sich als Namensgebung der Tabellenname.<br/> <br/> [[File:Plugin beispiel.png|RTENOTITLE]]<br/> Script-Beispiel:<br/> [[File:Scriptbeispiel2.png|RTENOTITLE]]<br/> Im speziellen Fall des Delete-Scriptes stehen folgende [[/doku.php?id=wiki:guiplatzhalter|Platzhalter]] zur Verfügung. @Mandant und @JobId, bitte achten Sie bei Verwendung der Variablen auf die korrekte Bennenung.  
#'''Graphics → Icons: ''' In diesen Ordner können Grafikdateien hinterlegt werden, welche als Grundlage für die RibbonButtons dienen. Es empfiehlt sich *.ico Dateien zu verwenden. Beispiel:<br/> <br/> [[File:Grafiks.png]]  
#'''Graphics → Icons: ''' In diesen Ordner können Grafikdateien hinterlegt werden, welche als Grundlage für die RibbonButtons dienen. Es empfiehlt sich *.ico Dateien zu verwenden. Beispiel:<br/> <br/> [[File:Grafiks.png|RTENOTITLE]]  
#'''Info: ''' Der Ordner Info beinhaltet die '''[[/doku.php?id=wiki:productxml|Product.xml]]''' welche folgenden Aufbau hat.<br/> [[File:Product.png]]<br/> * '''ValidationKey:''' Der ValidationKey der HTK Lizensierung. *  
#'''Info: ''' Der Ordner Info beinhaltet die '''[[/doku.php?id=wiki:productxml|Product.xml]]''' welche folgenden Aufbau hat.<br/> [[File:Product.png|RTENOTITLE]]<br/> * '''ValidationKey:''' Der ValidationKey der HTK Lizensierung. *  
#*'''DemoSerial:''' Hier kann eine Standard Demoseriennummer. *  
#*'''DemoSerial:''' Hier kann eine Standard Demoseriennummer. *  
#*'''SettingsXml:''' Hier kann die zu verwendende SettingsXML. *  
#*'''SettingsXml:''' Hier kann die zu verwendende SettingsXML. *  
Zeile 56: Zeile 56:
#*'''Author:''' Der Autor des Plugins.  
#*'''Author:''' Der Autor des Plugins.  
#*'''Name:''' Der Name des Plugins.<br/> <br/> *: Sollten Sie nicht die HTK Lizensierung sondern Ihre eigene Verwenden, so können Sie dies leer lassen<br/> ​   
#*'''Name:''' Der Name des Plugins.<br/> <br/> *: Sollten Sie nicht die HTK Lizensierung sondern Ihre eigene Verwenden, so können Sie dies leer lassen<br/> ​   
#'''Install:''' Der Ordner Install beinhaltet Installationsscripte welche aufgerufen werden sobald man sich in die Business Process Management GUI Anmeldet (nach Login Dialog). Hier sollten Sie darauf achten, dass Sie alle Datenbankstrukturen nur anlegen wenn diese nicht existieren! Auch hier empfiehlt sich als Namensgebung der Tabellenname.<br/> Beispielscript:<br/> <br/> [[File:|1023x238px]]  
#'''Install:''' Der Ordner Install beinhaltet Installationsscripte welche aufgerufen werden sobald man sich in die Business Process Management GUI Anmeldet (nach Login Dialog). Hier sollten Sie darauf achten, dass Sie alle Datenbankstrukturen nur anlegen wenn diese nicht existieren! Auch hier empfiehlt sich als Namensgebung der Tabellenname.<br/> Beispielscript:<br/> <br/> [[File:Code1.png]]  
#'''Options: ''' In dem Ordner Options befindet sich die '''[[/doku.php?id=wiki:optionsxml|Options.xml]]''' welche folgenden Aufbau hat.<br/> [[File:|515x123px]]
#'''Options: ''' In dem Ordner Options befindet sich die '''[[/doku.php?id=wiki:optionsxml|Options.xml]]''' welche folgenden Aufbau hat.<br/> [[File:Code2.png]]  
#*'''HasProperties:''' Gibt an ob der Job bei Doppelklick oder Klick auf Einstellungen Serviceproperties hat. Steht diese Option auf false, so öffnet sich immer die erweiterte Konfiguration  
#*'''HasProperties:''' Gibt an ob der Job bei Doppelklick oder Klick auf Einstellungen Serviceproperties hat. Steht diese Option auf false, so öffnet sich immer die erweiterte Konfiguration  
#*'''MandantNessesary:''' Steltt man diese Option auf true, so kann man den Job (von Haus aus) nicht ohne Mandant hinterlegen. Wenn dies nur in bestimmten Szenarien der Fall sein sollte, so lassen die dies auf false und prüfen SIe dies im '''JobEntry''' einstiegspunkt.  
#*'''MandantNessesary:''' Steltt man diese Option auf true, so kann man den Job (von Haus aus) nicht ohne Mandant hinterlegen. Wenn dies nur in bestimmten Szenarien der Fall sein sollte, so lassen die dies auf false und prüfen SIe dies im '''JobEntry''' einstiegspunkt.  
#*'''JobMatches:''' Hier können Sie Semikolongetrennt alle Jobbezeichnungen hinterlegen bei denen das Plugin geöffnet werden kann.   
#*'''JobMatches:''' Hier können Sie Semikolongetrennt alle Jobbezeichnungen hinterlegen bei denen das Plugin geöffnet werden kann.   
#'''Ribbonbuttons → Configuration: ''' In der '''[[/doku.php?id=wiki:configurationxml|Configuration.xml]]''' Datei wird definiert welche RibbonButtons das Plugin erzeugt, auf welcher RibbonPage und in welcher RibbonGroup. Zusätzlich wird definiert, was bei einem Druck auf den Button passiert und ob es eine Bedingung für das erscheinen des Buttons gibt.<br/> <br/> [[File:|724x617px]]
#'''Ribbonbuttons → Configuration: ''' In der '''[[/doku.php?id=wiki:configurationxml|Configuration.xml]]''' Datei wird definiert welche RibbonButtons das Plugin erzeugt, auf welcher RibbonPage und in welcher RibbonGroup. Zusätzlich wird definiert, was bei einem Druck auf den Button passiert und ob es eine Bedingung für das erscheinen des Buttons gibt.<br/> <br/> [[File:Code3.png]]  
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:rgb(34, 177, 76)">'''Grün'''</span></span></span> markiert sieht man dass die Datei aus Zwei Bereichen besteht. Einmal '''[https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraBarsBarButtonItemtopic BarButtonItems]''' und einmal '''[https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraBarsBarLinkContainerItemtopic BarButtonLinkContainerItems].'''  
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:rgb(34, 177, 76)">'''Grün'''</span></span></span> markiert sieht man dass die Datei aus Zwei Bereichen besteht. Einmal '''[https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraBarsBarButtonItemtopic BarButtonItems]''' und einmal '''[https://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraBarsBarLinkContainerItemtopic BarButtonLinkContainerItems].'''  
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:rgb(0, 162, 232)">'''Blau'''</span></span></span> markiert sieht man den jeweiligen Button hier können natürlich N Buttons definiert werden. Bitte achten Sie darauf dass der aufbau eines BarButtonLinkContainer's durch die zusätzliche Buttonlist abweicht  
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:rgb(0, 162, 232)">'''Blau'''</span></span></span> markiert sieht man den jeweiligen Button hier können natürlich N Buttons definiert werden. Bitte achten Sie darauf dass der aufbau eines BarButtonLinkContainer's durch die zusätzliche Buttonlist abweicht  
Zeile 69: Zeile 69:
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:#A349A4">'''Lila'''</span></span></span> markiert sehen Sie die zuweisung eines ItemClick Events an eine Funktion namens BarButtonItem2OnItemClick. Hierbei handelt es sich um Devexpress BarButtonItem Events welche definiert werden können.  
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:#A349A4">'''Lila'''</span></span></span> markiert sehen Sie die zuweisung eines ItemClick Events an eine Funktion namens BarButtonItem2OnItemClick. Hierbei handelt es sich um Devexpress BarButtonItem Events welche definiert werden können.  
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:#FFAEC9">'''Pink'''</span></span></span> markiert sehen Sie eine hinterlegte BarButtonItem Condition, diese Condition gibt true bzw. false zurück. Bei False würde der Button nicht angelegt werden!<br/> Wenn also Buttons nur unter bestimmten bedingungen angezeigt werden dürfen (bspw. File XY existiert oder nicht), dann müssen Sie dies über eine condition lösen.​<br/> <br/> Achtung: Die Texte '''Caption, Page und Group ''' beziehen sich '''immer ''' auf eine GUI Plugin-Lokalisierungsdatei, die Anlage dieser entnehmen Sie bitte dem Beitrag '''[[/doku.php?id=wiki:guipluginlokalisierungsdateien|GUI Plugin-Lokalisierungsdateien]]'''.   
#*In <span style="color:#FFFFFF"><span style="font-size:14px line-height: 19.6000003814697px"><span style="background-color:#FFAEC9">'''Pink'''</span></span></span> markiert sehen Sie eine hinterlegte BarButtonItem Condition, diese Condition gibt true bzw. false zurück. Bei False würde der Button nicht angelegt werden!<br/> Wenn also Buttons nur unter bestimmten bedingungen angezeigt werden dürfen (bspw. File XY existiert oder nicht), dann müssen Sie dies über eine condition lösen.​<br/> <br/> Achtung: Die Texte '''Caption, Page und Group ''' beziehen sich '''immer ''' auf eine GUI Plugin-Lokalisierungsdatei, die Anlage dieser entnehmen Sie bitte dem Beitrag '''[[/doku.php?id=wiki:guipluginlokalisierungsdateien|GUI Plugin-Lokalisierungsdateien]]'''.   
#'''Ribbonbuttons → ''''''RibbonButtonMethods​.cs'''''': ''' In der [[/doku.php?id=wiki:ribbonbuttonmethods​|RibbonButtonMethods]] Klasse müssen Sie zu den jeweils definierten RibbonButtons die jeweiligen Events hinterlegen, sowie die Conditions zu den definierten Conditions. Bitte beachten Sie das es sich bei der RibbonButtonMethods um eine statische Klasse handelt.<br/> Beispiel:<br/> <br/> [[File:|797x504px]]<br/> <br/> Conditions müssen immer als public static bool XYZ ohne Parameter definiert werden. Wird hier False zurückgegeben, so wird der Button nicht angelegt.<br/> ​Die Eventsignatur muss entsprechend der von Devexpress definierten Eventsignatur sein, die Signatur für den Fall ItemClick können Sie obigem Beispiel entnehmen.<br/> '''Tipp: ''' Um aus einem ButtonClick heraus die zu verwendende SQL Verbindung zu bekommen, nutzen Sie die GetSQlConnectionInfo funktion aus dem Shared Namespace, diese liefert Ihnen einen Tuple<[https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(v=vs.110).aspx SqlConnection], [https://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx String]> Item1 stellt hierbei eine '''geschlossene ''' [https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(v=vs.110).aspx SqlConnection ]und Item2 den Connectionstring dar.  
#'''Ribbonbuttons → ''''''RibbonButtonMethods​.cs'''''': ''' In der [[/doku.php?id=wiki:ribbonbuttonmethods​|RibbonButtonMethods]] Klasse müssen Sie zu den jeweils definierten RibbonButtons die jeweiligen Events hinterlegen, sowie die Conditions zu den definierten Conditions. Bitte beachten Sie das es sich bei der RibbonButtonMethods um eine statische Klasse handelt.<br/> Beispiel:<br/> <br/> [[File:Code4.png]]<br/> <br/> Conditions müssen immer als public static bool XYZ ohne Parameter definiert werden. Wird hier False zurückgegeben, so wird der Button nicht angelegt.<br/> ​Die Eventsignatur muss entsprechend der von Devexpress definierten Eventsignatur sein, die Signatur für den Fall ItemClick können Sie obigem Beispiel entnehmen.<br/> '''Tipp: ''' Um aus einem ButtonClick heraus die zu verwendende SQL Verbindung zu bekommen, nutzen Sie die GetSQlConnectionInfo funktion aus dem Shared Namespace, diese liefert Ihnen einen Tuple<[https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(v=vs.110).aspx SqlConnection], [https://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx String]> Item1 stellt hierbei eine '''geschlossene ''' [https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(v=vs.110).aspx SqlConnection ]und Item2 den Connectionstring dar.  
#Nun können Sie das Plugin erstellen. Wählen Sie als Zielplattform bitte '''x86''' aus. Zur Installation legen Sie das Plugin sowie alle Vorrausetzungen und Verweise in den Ordner Plugins Ihrer installierten Business Process Management GUI. Wenn Sie alles richtig gemacht haben, sollte ein Klick auf Addins ihr Plugin anzeigen.<br/> <br/> [[File:|1043x499px]]  
#Nun können Sie das Plugin erstellen. Wählen Sie als Zielplattform bitte '''x86''' aus. Zur Installation legen Sie das Plugin sowie alle Vorrausetzungen und Verweise in den Ordner Plugins Ihrer installierten Business Process Management GUI. Wenn Sie alles richtig gemacht haben, sollte ein Klick auf Addins ihr Plugin anzeigen.<br/> <br/> [[File:Code4.png]]  
</div>
</div>
1.494

Bearbeitungen

Navigationsmenü