commit ecc537962a76ff1de37781a940f1b2e8d2958872 Author: cloudmaker97 Date: Tue May 28 11:55:03 2024 +0000 Deployed 5af1d78 with MkDocs version: 1.4.2 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/1_general/1_about/index.html b/1_general/1_about/index.html new file mode 100644 index 0000000..fd9ca0b --- /dev/null +++ b/1_general/1_about/index.html @@ -0,0 +1,736 @@ + + + + + + + + + + + + + + + + + + + + + + Über das Projekt - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Über das Projekt

+

Herzlich Willkommen zur Anwenderdokumentation für das Projekt "Streckenkunde Digital". Diese Dokumentation soll Ihnen +als Anwender helfen, sich in der Software zurechtzufinden und die Funktionen zu verstehen. Die Software wurde speziell +für Triebfahrzeugführer entwickelt, um die Dokumentation der Streckenkunde zu vereinfachen und zu digitalisieren. Bei +Fragen oder Problemen können Sie sich gerne an den Support wenden. Die Kontaktdaten finden Sie am Ende dieser Seite.

+

Kontakt zum Support

+

Der Support und die Weiterentwicklung des Projekts erfolgt durch folgenden Dienstleister:

+
+

Dennis Heinrich
+Veerßer Straße 86
+29525 Uelzen

+

Support-Mail: kontakt@streckenkunde.digital
+Internetseite: dennis-heinri.ch

+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/1_general/2_changes/index.html b/1_general/2_changes/index.html new file mode 100644 index 0000000..d523802 --- /dev/null +++ b/1_general/2_changes/index.html @@ -0,0 +1,783 @@ + + + + + + + + + + + + + + + + + + + + + + Dokumentation erweitern - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Dokumentation erweitern

+

Vorschlag zur Dokumentation einreichen

+

Um einen Vorschlag zur Dokumentation einzureichen, erstellen Sie bitte ein Issue auf GitHub im Projekt zur +Anwenderdokumentation. Dort können Sie die gewünschte Änderung oder eine Ergänzung mitteilen.

+
+

Hier können Sie einen Vorschlag einreichen

+
+

Beitragen an der Dokumentation

+

Wenn Sie an der Dokumentation mitarbeiten möchten, können Sie ihre Änderungen selbst in das Repository einpflegen. +Dazu können Sie das Repository klonen und die Änderungen lokal vornehmen. Anschließend können Sie die Änderungen +über einen Pull-Request einreichen und werden diese nach einer Prüfung in die Dokumentation überführen.

+
+

Mehr Informationen zum Beitragen finden Sie in dem Repository.

+
+

Voraussetzungen an den Beitragenden

+

Zum Beitragen an der Dokumentation sind folgende Voraussetzungen notwendig:

+
    +
  • Docker um die Dokumentation zu kompilieren und zu starten
  • +
  • Das Tool Just, es ist ein Management-Tool für das Ausführen von Befehlen
  • +
  • Erfahrung im Umgang mit Markdown-Dateien und der Versionsverwaltung Git
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/1_general/3_development/index.html b/1_general/3_development/index.html new file mode 100644 index 0000000..d277379 --- /dev/null +++ b/1_general/3_development/index.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + + + + + + + + + + Entwicklung und Schnittstellen - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Entwicklung und Schnittstellen

+

Die Software bietet eine spezielle Webseite (API), die es ermöglicht, Nutzerdaten zu bearbeiten. Diese Webseite ist über die Adresse /api erreichbar.

+
    +
  • OpenAPI-Spezifikation: Es gibt eine Anleitung, wie man die API benutzt, die unter /api/openapi.json abrufbar ist.
  • +
  • Interaktive Dokumentation: Eine benutzerfreundlichere Version der Dokumentation findest du unter /api/docs.
  • +
+

Authentifizierung

+

Um sicherzugehen, dass nur berechtigte Personen Zugang haben, nutzt die Software JWT-Token:

+
    +
  • Nach dem Einloggen erhältst du einen JWT-Token von der Adresse /api/login_check.
  • +
  • Diesen Token musst du bei jeder Anfrage im Authorization-Bereich deiner Internetanfrage als Bearer-Token mitschicken.
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/2_modules/1_welcome/assets/forgot_password.png b/2_modules/1_welcome/assets/forgot_password.png new file mode 100644 index 0000000..f58c69c Binary files /dev/null and b/2_modules/1_welcome/assets/forgot_password.png differ diff --git a/2_modules/1_welcome/assets/login.png b/2_modules/1_welcome/assets/login.png new file mode 100644 index 0000000..57a6309 Binary files /dev/null and b/2_modules/1_welcome/assets/login.png differ diff --git a/2_modules/1_welcome/assets/overview.png b/2_modules/1_welcome/assets/overview.png new file mode 100644 index 0000000..8995b04 Binary files /dev/null and b/2_modules/1_welcome/assets/overview.png differ diff --git a/2_modules/1_welcome/assets/registration.png b/2_modules/1_welcome/assets/registration.png new file mode 100644 index 0000000..65af8b9 Binary files /dev/null and b/2_modules/1_welcome/assets/registration.png differ diff --git a/2_modules/1_welcome/index.html b/2_modules/1_welcome/index.html new file mode 100644 index 0000000..a6f73eb --- /dev/null +++ b/2_modules/1_welcome/index.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + + + + + + + + + + Startseite - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Startseite

+

Jeder Nutzer ohne eine gültige Anmeldung wird auf der Willkommensseite begrüßt. Hier kann sich der Nutzer entweder anmelden oder ein neues Benutzerkonto registrieren. Außerdem gibt es die Möglichkeit, ein neues Passwort anzufordern, falls der Nutzer sein Passwort vergessen hat.

+

*

+

Anmeldung mit vorhandenem Benutzerkonto

+

Jeder Nutzer kann sich auf der Plattform registrieren und anmelden. Dazu wird ein Benutzername und ein Passwort benötigt. Die Anmeldung erfolgt über die Webseite und ist für jeden Nutzer zugänglich. Der Benutzername ist die E-Mail-Adresse, die bei der Registrierung angegeben wurde. Das Passwort wird bei der Registrierung festgelegt und kann jederzeit durch die Passwort-Vergessen Funktion geändert werden.

+

*

+

Registrierung eines neuen Benutzerkontos

+

Um ein neues Benutzerkonto zu registrieren, muss der Nutzer auf der Webseite die Registrierungsfunktion aufrufen. Dazu wird ein Benutzername (E-Mail), der vollständige Name des Anwenders und ein Passwort benötigt.

+

*

+

Passwort vergessen

+

Wenn ein Nutzer sein Passwort vergessen hat, kann er über die Webseite ein neues Passwort anfordern. Dazu wird die E-Mail-Adresse benötigt, die bei der Registrierung angegeben wurde. Der Nutzer erhält dann eine E-Mail mit einem neuen Passwort zur vorrübergehenden Anmeldung.

+

*

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/2_modules/2_dashboard/assets/filter_all.png b/2_modules/2_dashboard/assets/filter_all.png new file mode 100644 index 0000000..9602f9d Binary files /dev/null and b/2_modules/2_dashboard/assets/filter_all.png differ diff --git a/2_modules/2_dashboard/assets/filter_exclusive.png b/2_modules/2_dashboard/assets/filter_exclusive.png new file mode 100644 index 0000000..8e4088f Binary files /dev/null and b/2_modules/2_dashboard/assets/filter_exclusive.png differ diff --git a/2_modules/2_dashboard/assets/overview.png b/2_modules/2_dashboard/assets/overview.png new file mode 100644 index 0000000..4159d15 Binary files /dev/null and b/2_modules/2_dashboard/assets/overview.png differ diff --git a/2_modules/2_dashboard/index.html b/2_modules/2_dashboard/index.html new file mode 100644 index 0000000..14bab2a --- /dev/null +++ b/2_modules/2_dashboard/index.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + + + + + + + + + + Dashboard - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Dashboard

+

Auf dem Dashboard sieht der Nutzer eine Übersicht zum Verfall seiner dokumentierten Streckenkunden, allgemeine Informationen zu seinem Benutzerkonto und eine kleine Statistik über die Anzahl der von ihm eingepflegten Strecken und Touren.

+

*

+

Verfallsübersicht

+

In diesem Modul hat der Nutzer die Möglichkeit, sich einen Überblick über den Verfall seiner Streckenkunden zu verschaffen. Hier werden alle Streckenkunden aufgelistet, die in seinem festgelegten Zeitraum (Auswahl der Tage) ablaufen werden. Der Nutzer kann zudem die Strecken rausfiltern, die er noch nie dokumentiert hat. Dafür kann er die Checkbox "Nur aufgezeichnete Strecken" verwenden.

+

Nur aufgezeichnete Strecken

+

Es werden nur die Strecken angezeigt, die bereits in der Vergangenheit dokumentiert wurden und in dem angebenen Zeitraum der Tage ablaufen werden und somit ein Verfallsdatum haben. +Abgelaufene Strecken werden immer angezeigt, unabhängig der Filter.

+

*

+

Alle Strecken anzeigen

+

Alle Strecken werden angezeigt, unabhängig davon, ob sie bereits dokumentiert wurden oder nicht. In diesem Fall wird unter der Strecke "Keine Aufzeichnung" dargestellt und alle Strecken die unter dieses Kriterium fallen, werden ganz oben in der Liste dargestellt. Abgelaufene Strecken werden immer angezeigt, unabhängig der Filter.

+

*

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/2_modules/3_documentation/1_routes/assets/create.png b/2_modules/3_documentation/1_routes/assets/create.png new file mode 100644 index 0000000..33a56e6 Binary files /dev/null and b/2_modules/3_documentation/1_routes/assets/create.png differ diff --git a/2_modules/3_documentation/1_routes/assets/edit.png b/2_modules/3_documentation/1_routes/assets/edit.png new file mode 100644 index 0000000..c69c206 Binary files /dev/null and b/2_modules/3_documentation/1_routes/assets/edit.png differ diff --git a/2_modules/3_documentation/1_routes/assets/view.png b/2_modules/3_documentation/1_routes/assets/view.png new file mode 100644 index 0000000..2543c22 Binary files /dev/null and b/2_modules/3_documentation/1_routes/assets/view.png differ diff --git a/2_modules/3_documentation/1_routes/assets/view_not_documented.png b/2_modules/3_documentation/1_routes/assets/view_not_documented.png new file mode 100644 index 0000000..53555d2 Binary files /dev/null and b/2_modules/3_documentation/1_routes/assets/view_not_documented.png differ diff --git a/2_modules/3_documentation/1_routes/index.html b/2_modules/3_documentation/1_routes/index.html new file mode 100644 index 0000000..9b35a7a --- /dev/null +++ b/2_modules/3_documentation/1_routes/index.html @@ -0,0 +1,776 @@ + + + + + + + + + + + + + + + + + + + + + + Strecken - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Strecken

+

Eine Strecke ist ein Abschnitt im Schienennetz, der von einem Start- zu einem Endpunkt führt. Die Strecke besteht immer aus einem Namen, zwei Punkten (Start und Endpunkt) und optional einem Namen, der Unternehmensintern verwendet wird. Die Strecke kann auch in einer Tour inbegriffen sein, um die Dokumentation mehrerer Strecken zu vereinfachen.

+

Erstellen

+

Um eine neue Strecke zu erstellen, klicke auf den Button "Strecke erstellen" auf der Seite Dokumentation. Es öffnet sich ein Dialog, in dem du die notwendigen Informationen eingeben kannst.

+
    +
  • Name: Der Name der Strecke.
  • +
  • Unternehmens-Kürzel: (optional) Bezeichner für die Strecke.
  • +
  • Start der Strecke: Der Startpunkt der Strecke.
  • +
  • Ende der Strecke: Der Endpunkt der Strecke.
  • +
  • Zuletzt gefahren am: (optional) Das Datum, an dem die Strecke zuletzt befahren wurde.
      +
    • Standardmäßig wird kein Datum angegeben.
    • +
    • Mit Eintrag wird die Strecke zur Erstellung mit der Streckenkunde vermerkt.
    • +
    +
  • +
+

Strecke erstellen

+

Ansehen

+

Um eine Strecke anzusehen, klicke auf den Namen der Strecke an einem beliebigen Punkt innerhalb der Anwendung. Es öffnet sich ein Dialog, in dem du die Informationen zur Strecke einsehen kannst. Die Strecke kann z.B. über die Suche der Dokumentation gefunden werden. Es werden alle Daten, sowie die Gültigkeit der Streckenkunde angezeigt.

+

Strecke ansehen

+

Hat die Strecke keine dokumentierte Streckenkunde, wird dies mit "Nicht erfasst" gekennzeichnet

+

Strecke ohne Dokumentation

+

Bearbeiten

+

Um eine Strecke zu bearbeiten, klicke auf den Namen der Strecke an einem beliebigen Punkt innerhalb der Anwendung um die Strecke anzusehen. Anschließend klicke auf den Button "Strecke bearbeiten". Es öffnet sich ein Dialog, in dem du die notwendigen Informationen ändern oder die Strecke komplett löschen kannst. Die Strecke kann z.B. über die Suche der Dokumentation gefunden werden.

+

Strecke bearbeiten

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/2_modules/3_documentation/2_tours/assets/create.png b/2_modules/3_documentation/2_tours/assets/create.png new file mode 100644 index 0000000..96045d6 Binary files /dev/null and b/2_modules/3_documentation/2_tours/assets/create.png differ diff --git a/2_modules/3_documentation/2_tours/assets/edit.png b/2_modules/3_documentation/2_tours/assets/edit.png new file mode 100644 index 0000000..4a6d744 Binary files /dev/null and b/2_modules/3_documentation/2_tours/assets/edit.png differ diff --git a/2_modules/3_documentation/2_tours/assets/view.png b/2_modules/3_documentation/2_tours/assets/view.png new file mode 100644 index 0000000..ad68e8d Binary files /dev/null and b/2_modules/3_documentation/2_tours/assets/view.png differ diff --git a/2_modules/3_documentation/2_tours/index.html b/2_modules/3_documentation/2_tours/index.html new file mode 100644 index 0000000..004685c --- /dev/null +++ b/2_modules/3_documentation/2_tours/index.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + + + + + + + + + + Touren - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Touren

+

Eine Tour ist z.B. eine Fahrt von Hamburg nach Berlin, welche viele Strecken beinhaltet. Somit können auf oft befahrenen Abschnitten oder vorgefertigten Touren die Strecken mit einem einzelnen Klick in der Dokumentation übernommen werden, statt alle Strecken vereinzelt zu markieren.

+

Erstellen

+

Die Erstellung einer Tour erfolgt über den Button "Tour erstellen" auf der Seite Dokumentation. Die Tour benötigt einen Namen und mindestens zwei Strecken, um erstellt werden zu können. Die Strecken können über die Suchfunktion ausgewählt werden, und wie bei der Dokumentation markiert werden. Alle markierten Strecken sind dann Bestandteil der Tour.

+

*

+

Ansehen

+

Um eine Tour anzusehen, klicke auf den Namen einer Tour an einem beliebigen Punkt innerhalb der Anwendung. Es öffnet sich ein Dialog, in dem die Informationen, sowie die beinhalteten Strecken einer Tour eingesehen werden können. Eine Tour kann z.B. über die Suche der Dokumentation gefunden werden. Über einen Klick auf eine der Strecken in der Tour gelangst du zur Einzelansicht dieser.

+

*

+

Bearbeiten

+

Um eine Tour zu bearbeiten, klicke auf den Namen einer Tour an einem beliebigen Punkt innerhalb der Anwendung um die Tour anzusehen. Anschließend klicke auf den Button "Tour bearbeiten". Es öffnet sich ein Dialog, in dem du die notwendigen Informationen, sowie die beinhalteten Strecken ändern oder die Tour gänzlich löschen kannst.

+

Wenn die Auswahl der beinhalteten Strecken geändert werden, sind diese erst nach dem Speichern aktiv. Die Anwendung merkt sich dennoch die vorherige Auswahl, z.B. um Strecken zwischenzeitlich zu öffnen oder zu bearbeiten. Kehrt man zur Bearbeitung zurück, sind die Strecken wieder markiert. Die Auswahl der geänderten Strecken ohne Speichern wird verworfen, wenn auf "Zurück zur Ansicht" geklickt wird.

+

*

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/2_modules/3_documentation/assets/documentation.png b/2_modules/3_documentation/assets/documentation.png new file mode 100644 index 0000000..da271c1 Binary files /dev/null and b/2_modules/3_documentation/assets/documentation.png differ diff --git a/2_modules/3_documentation/assets/overview.png b/2_modules/3_documentation/assets/overview.png new file mode 100644 index 0000000..1961d5c Binary files /dev/null and b/2_modules/3_documentation/assets/overview.png differ diff --git a/2_modules/3_documentation/index.html b/2_modules/3_documentation/index.html new file mode 100644 index 0000000..6bbeb23 --- /dev/null +++ b/2_modules/3_documentation/index.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + + + + + + + + + + Dokumentation - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Dokumentation

+

Auf dieser Seite hat der Nutzer die Möglichkeit:

+
    +
  1. Seine Streckenkunden zu dokumentieren
  2. +
  3. Strecken anzuzeigen oder zu erstellen
  4. +
  5. Touren anzuzeigen oder zu erstellen
  6. +
+

*

+

Strecken

+

Eine Strecke ist ein Abschnitt im Schienennetz, der von einem Start- zu einem Endpunkt führt. Die Strecke besteht immer aus einem Namen, zwei Punkten (Start und Endpunkt) und optional einem Namen, der Unternehmensintern verwendet wird. Die Strecke kann auch in einer Tour inbegriffen sein, um die Dokumentation mehrerer Strecken zu vereinfachen.

+

Touren

+

Eine Tour enthält mehrere Strecken. Eine Tour kann beispielsweise eine Fahrt von Hamburg nach Berlin sein. In diesem Fall würde die Tour alle Strecken enthalten, die auf dieser Fahrt zurückgelegt werden. Somit können auf oft befahrenen Abschnitten oder vorgefertigten Touren die Strecken mit einem einzelnen Klick in die Dokumentation übernommen werden, statt diese alle vereinzelt zu markieren.

+

Dokumentieren

+

Die Dokumentation einer Streckenkunde erfolgt über die Markierung der gefahrenen Touren oder einzelner Strecken. Die Markierung erfolgt mit dem Lesezeichen-Symbol. Über erneuten Klick kann die Markierung wieder entfernt werden.

+

Wenn mindestens ein Element markiert wurde, erscheint das Modul zur Dokumentation der Streckenkunde. Hier kann der Nutzer ein Datum festlegen, an dem die Streckenkunde erworben wurde. Standardmäßig ist immer das aktuelle Datum vorausgewählt. Der Ablauf der Streckenkunde wird automatisch berechnet und für ein Jahr festgelegt (364 Tage nach Erwerbsdatum).

+

*

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/2_modules/4_account/assets/overview.png b/2_modules/4_account/assets/overview.png new file mode 100644 index 0000000..1ff95c8 Binary files /dev/null and b/2_modules/4_account/assets/overview.png differ diff --git a/2_modules/4_account/index.html b/2_modules/4_account/index.html new file mode 100644 index 0000000..7b408a1 --- /dev/null +++ b/2_modules/4_account/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + + + + + + + + + Übersicht - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Übersicht

+

Das Modul "Account" bietet dem Nutzer die Möglichkeit, seine persönlichen Daten anzuzeigen. Eine Bearbeitung der Daten ist zum +derzeitigen Stand der Anwendung nicht möglich.

+

Übersicht

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/3_extras/1_app/assets/desktop_chrome/desktop_icon.png b/3_extras/1_app/assets/desktop_chrome/desktop_icon.png new file mode 100644 index 0000000..bed3603 Binary files /dev/null and b/3_extras/1_app/assets/desktop_chrome/desktop_icon.png differ diff --git a/3_extras/1_app/assets/desktop_chrome/finish.png b/3_extras/1_app/assets/desktop_chrome/finish.png new file mode 100644 index 0000000..3d7906e Binary files /dev/null and b/3_extras/1_app/assets/desktop_chrome/finish.png differ diff --git a/3_extras/1_app/assets/desktop_chrome/install_1.png b/3_extras/1_app/assets/desktop_chrome/install_1.png new file mode 100644 index 0000000..329fad0 Binary files /dev/null and b/3_extras/1_app/assets/desktop_chrome/install_1.png differ diff --git a/3_extras/1_app/assets/desktop_chrome/install_2.png b/3_extras/1_app/assets/desktop_chrome/install_2.png new file mode 100644 index 0000000..87b63ea Binary files /dev/null and b/3_extras/1_app/assets/desktop_chrome/install_2.png differ diff --git a/3_extras/1_app/assets/smartphone_android/app_details.png b/3_extras/1_app/assets/smartphone_android/app_details.png new file mode 100644 index 0000000..3fa43d4 Binary files /dev/null and b/3_extras/1_app/assets/smartphone_android/app_details.png differ diff --git a/3_extras/1_app/assets/smartphone_android/finish.png b/3_extras/1_app/assets/smartphone_android/finish.png new file mode 100644 index 0000000..2110233 Binary files /dev/null and b/3_extras/1_app/assets/smartphone_android/finish.png differ diff --git a/3_extras/1_app/assets/smartphone_android/install.png b/3_extras/1_app/assets/smartphone_android/install.png new file mode 100644 index 0000000..b743db4 Binary files /dev/null and b/3_extras/1_app/assets/smartphone_android/install.png differ diff --git a/3_extras/1_app/assets/smartphone_apple/Thumbs.db b/3_extras/1_app/assets/smartphone_apple/Thumbs.db new file mode 100644 index 0000000..06c1c5a Binary files /dev/null and b/3_extras/1_app/assets/smartphone_apple/Thumbs.db differ diff --git a/3_extras/1_app/assets/smartphone_apple/install_1.jpg b/3_extras/1_app/assets/smartphone_apple/install_1.jpg new file mode 100644 index 0000000..7dd0837 Binary files /dev/null and b/3_extras/1_app/assets/smartphone_apple/install_1.jpg differ diff --git a/3_extras/1_app/assets/smartphone_apple/install_2.jpg b/3_extras/1_app/assets/smartphone_apple/install_2.jpg new file mode 100644 index 0000000..3ae0975 Binary files /dev/null and b/3_extras/1_app/assets/smartphone_apple/install_2.jpg differ diff --git a/3_extras/1_app/index.html b/3_extras/1_app/index.html new file mode 100644 index 0000000..4f29877 --- /dev/null +++ b/3_extras/1_app/index.html @@ -0,0 +1,810 @@ + + + + + + + + + + + + + + + + + + + + Installation als App - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Installation als App

+

Desktop

+

Google Chrome

+

Die Seite kann als App (PWA) auf dem Desktop installiert werden. Dazu wird die Seite im Browser geöffnet und die Option "Installieren" neben der URL-Eingabe ausgewählt.

+

*

+

Es öffnet sich ein Dialog, in dem die Installation bestätigt werden muss.

+

*

+

Anschließend wird die App als Icon und auf dem Desktop abgelegt.

+

*

+

Nach dem Start der App wird die Anwendung in einem eigenen Fenster geöffnet.

+

*

+

Smartphone

+

Android mit Google Chrome

+

Die Seite kann als App (PWA) auf dem Smartphone installiert werden. Dazu wird die Seite im Browser geöffnet und die Option "App Installieren" in den Einstellungen (Drei-Punkte-Icon) des Chrome-Browsers ausgewählt. Dann wird die Installation bestätigt.

+

*

+

Anschließend wird die App als Icon auf dem Startbildschirm abgelegt und kann dort als App gestartet werden.

+

*

+

Die App ist auch über die App-Übersicht erreichbar, wo sie als eigenständige App angezeigt wird und auch deinstalliert werden kann.

+

*

+

Apple / iOS

+

Auf iOS-Geräten kann die App nicht installiert werden, da Apple keine PWAs unterstützt. Die Seite kann jedoch als Startbildschirm-Lesezeichen über Safari hinzugefügt werden, um sie schneller zu öffnen. Dafür wird die Seite im Safari-Browser geöffnet und die Option "Zum Home-Bildschirm" in den Einstellungen (Teilen-Icon) ausgewählt.

+

*

+

Anschließend wird die Installation mit der Vergabe eines Namens bestätigt.

+

*

+

Die Anwendung wird als Icon auf dem Startbildschirm abgelegt und kann dort als Lesezeichen gestartet werden.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/3_extras/index.html b/3_extras/index.html new file mode 100644 index 0000000..e376fa9 --- /dev/null +++ b/3_extras/index.html @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + Übersicht - Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Zum Inhalt + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Übersicht

+ + + + + + +
+
+ + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..eb1ec90 --- /dev/null +++ b/404.html @@ -0,0 +1,606 @@ + + + + + + + + + + + + + + + + + + Streckenkunde Digital + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..21384b0 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +help.streckenkunde.digital diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.51d95adb.min.js b/assets/javascripts/bundle.51d95adb.min.js new file mode 100644 index 0000000..b20ec68 --- /dev/null +++ b/assets/javascripts/bundle.51d95adb.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Hi=Object.create;var xr=Object.defineProperty;var Pi=Object.getOwnPropertyDescriptor;var $i=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Ii=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,an=Object.prototype.propertyIsEnumerable;var on=(e,t,r)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&on(e,r,t[r]);if(kt)for(var r of kt(t))an.call(t,r)&&on(e,r,t[r]);return e};var sn=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&an.call(e,n)&&(r[n]=e[n]);return r};var Ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Fi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $i(t))!Er.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=Pi(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Hi(Ii(e)):{},Fi(t||!e||!e.__esModule?xr(r,"default",{value:e,enumerable:!0}):r,e));var fn=Ht((wr,cn)=>{(function(e,t){typeof wr=="object"&&typeof cn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(wr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(T){return!!(T&&T!==document&&T.nodeName!=="HTML"&&T.nodeName!=="BODY"&&"classList"in T&&"contains"in T.classList)}function f(T){var Ke=T.type,We=T.tagName;return!!(We==="INPUT"&&a[Ke]&&!T.readOnly||We==="TEXTAREA"&&!T.readOnly||T.isContentEditable)}function c(T){T.classList.contains("focus-visible")||(T.classList.add("focus-visible"),T.setAttribute("data-focus-visible-added",""))}function u(T){T.hasAttribute("data-focus-visible-added")&&(T.classList.remove("focus-visible"),T.removeAttribute("data-focus-visible-added"))}function p(T){T.metaKey||T.altKey||T.ctrlKey||(s(r.activeElement)&&c(r.activeElement),n=!0)}function m(T){n=!1}function d(T){s(T.target)&&(n||f(T.target))&&c(T.target)}function h(T){s(T.target)&&(T.target.classList.contains("focus-visible")||T.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(T.target))}function v(T){document.visibilityState==="hidden"&&(o&&(n=!0),B())}function B(){document.addEventListener("mousemove",z),document.addEventListener("mousedown",z),document.addEventListener("mouseup",z),document.addEventListener("pointermove",z),document.addEventListener("pointerdown",z),document.addEventListener("pointerup",z),document.addEventListener("touchmove",z),document.addEventListener("touchstart",z),document.addEventListener("touchend",z)}function re(){document.removeEventListener("mousemove",z),document.removeEventListener("mousedown",z),document.removeEventListener("mouseup",z),document.removeEventListener("pointermove",z),document.removeEventListener("pointerdown",z),document.removeEventListener("pointerup",z),document.removeEventListener("touchmove",z),document.removeEventListener("touchstart",z),document.removeEventListener("touchend",z)}function z(T){T.target.nodeName&&T.target.nodeName.toLowerCase()==="html"||(n=!1,re())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),B(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var un=Ht(Sr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},a=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(re,z){d.append(z,re)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(T){throw new Error("URL unable to set base "+c+" due to "+T)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,B=!0,re=this;["append","delete","set"].forEach(function(T){var Ke=h[T];h[T]=function(){Ke.apply(h,arguments),v&&(B=!1,re.search=h.toString(),B=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var z=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==z&&(z=this.search,B&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},a=i.prototype,s=function(f){Object.defineProperty(a,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){s(f)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr)});var Qr=Ht((Lt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Lt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Lt=="object"?Lt.ClipboardJS=r():t.ClipboardJS=r()})(Lt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ki}});var a=i(279),s=i.n(a),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(O){return!1}}var d=function(O){var w=p()(O);return m("cut"),w},h=d;function v(j){var O=document.documentElement.getAttribute("dir")==="rtl",w=document.createElement("textarea");w.style.fontSize="12pt",w.style.border="0",w.style.padding="0",w.style.margin="0",w.style.position="absolute",w.style[O?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return w.style.top="".concat(k,"px"),w.setAttribute("readonly",""),w.value=j,w}var B=function(O,w){var k=v(O);w.container.appendChild(k);var F=p()(k);return m("copy"),k.remove(),F},re=function(O){var w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof O=="string"?k=B(O,w):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?k=B(O.value,w):(k=p()(O),m("copy")),k},z=re;function T(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?T=function(w){return typeof w}:T=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},T(j)}var Ke=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=O.action,k=w===void 0?"copy":w,F=O.container,q=O.target,Le=O.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&T(q)==="object"&&q.nodeType===1){if(k==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Le)return z(Le,{container:F});if(q)return k==="cut"?h(q):z(q,{container:F})},We=Ke;function Ie(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(w){return typeof w}:Ie=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},Ie(j)}function Ti(j,O){if(!(j instanceof O))throw new TypeError("Cannot call a class as a function")}function nn(j,O){for(var w=0;w0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Ie(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var q=this;this.listener=c()(F,"click",function(Le){return q.onClick(Le)})}},{key:"onClick",value:function(F){var q=F.delegateTarget||F.currentTarget,Le=this.action(q)||"copy",Rt=We({action:Le,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Le,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return yr("action",F)}},{key:"defaultTarget",value:function(F){var q=yr("target",F);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(F){return yr("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return z(F,q)}},{key:"cut",value:function(F){return h(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof F=="string"?[F]:F,Le=!!document.queryCommandSupported;return q.forEach(function(Rt){Le=Le&&!!document.queryCommandSupported(Rt)}),Le}}]),w}(s()),ki=Ri},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,f){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(f))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return s(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=a(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return c(m,d,h);if(a.nodeList(m))return u(m,d,h);if(a.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return s(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),a=f.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var f=this;function c(){f.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=s.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var is=/["'&<>]/;Jo.exports=as;function as(e){var t=""+e,r=is.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||s(m,d)})})}function s(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof Xe?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){s("next",m)}function u(m){s("throw",m)}function p(m,d){m(d),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof xe=="function"?xe(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(a){return new Promise(function(s,f){a=e[i](a),o(s,f,a.done,a.value)})}}function o(i,a,s,f){Promise.resolve(f).then(function(c){i({value:c,done:s})},a)}}function A(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var $t=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=xe(a),f=s.next();!f.done;f=s.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var u=this.initialTeardown;if(A(u))try{u()}catch(v){i=v instanceof $t?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=xe(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{dn(h)}catch(v){i=i!=null?i:[],v instanceof $t?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new $t(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)dn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Or=Fe.EMPTY;function It(e){return e instanceof Fe||e&&"closed"in e&&A(e.remove)&&A(e.add)&&A(e.unsubscribe)}function dn(e){A(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,s=o.observers;return i||a?Or:(this.currentObservers=null,s.push(r),new Fe(function(){n.currentObservers=null,De(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new U;return r.source=this,r},t.create=function(r,n){return new wn(r,n)},t}(U);var wn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Or},t}(E);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,s=n._timestampProvider,f=n._windowTime;o||(i.push(r),!a&&i.push(s.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,s=a.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var a=r.actions;n!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Ut);var On=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var we=new On(Tn);var R=new U(function(e){return e.complete()});function Dt(e){return e&&A(e.schedule)}function kr(e){return e[e.length-1]}function Qe(e){return A(kr(e))?e.pop():void 0}function Se(e){return Dt(kr(e))?e.pop():void 0}function Vt(e,t){return typeof kr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function zt(e){return A(e==null?void 0:e.then)}function Nt(e){return A(e[ft])}function qt(e){return Symbol.asyncIterator&&A(e==null?void 0:e[Symbol.asyncIterator])}function Kt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ki(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=Ki();function Yt(e){return A(e==null?void 0:e[Qt])}function Gt(e){return ln(this,arguments,function(){var r,n,o,i;return Pt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,Xe(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,Xe(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,Xe(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return A(e==null?void 0:e.getReader)}function $(e){if(e instanceof U)return e;if(e!=null){if(Nt(e))return Qi(e);if(pt(e))return Yi(e);if(zt(e))return Gi(e);if(qt(e))return _n(e);if(Yt(e))return Bi(e);if(Bt(e))return Ji(e)}throw Kt(e)}function Qi(e){return new U(function(t){var r=e[ft]();if(A(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Yi(e){return new U(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?_(function(o,i){return e(o,i,n)}):me,Oe(1),r?He(t):zn(function(){return new Xt}))}}function Nn(){for(var e=[],t=0;t=2,!0))}function fe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,f=s===void 0?!0:s;return function(c){var u,p,m,d=0,h=!1,v=!1,B=function(){p==null||p.unsubscribe(),p=void 0},re=function(){B(),u=m=void 0,h=v=!1},z=function(){var T=u;re(),T==null||T.unsubscribe()};return g(function(T,Ke){d++,!v&&!h&&B();var We=m=m!=null?m:r();Ke.add(function(){d--,d===0&&!v&&!h&&(p=jr(z,f))}),We.subscribe(Ke),!u&&d>0&&(u=new et({next:function(Ie){return We.next(Ie)},error:function(Ie){v=!0,B(),p=jr(re,o,Ie),We.error(Ie)},complete:function(){h=!0,B(),p=jr(re,a),We.complete()}}),$(T).subscribe(u))})(c)}}function jr(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function V(e,t=document){let r=se(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function se(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),N(e===_e()),Y())}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function Yn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,we),l(()=>Be(e)),N(Be(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,we),l(()=>rr(e)),N(rr(e)))}var Bn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),xa?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ya.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Jn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Zn=typeof WeakMap!="undefined"?new WeakMap:new Bn,eo=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Ea.getInstance(),n=new Ra(t,r,this);Zn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){eo.prototype[e]=function(){var t;return(t=Zn.get(this))[e].apply(t,arguments)}});var ka=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:eo}(),to=ka;var ro=new E,Ha=I(()=>H(new to(e=>{for(let t of e)ro.next(t)}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){return Ha.pipe(S(t=>t.observe(e)),x(t=>ro.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(()=>de(e)))),N(de(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var no=new E,Pa=I(()=>H(new IntersectionObserver(e=>{for(let t of e)no.next(t)},{threshold:0}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function sr(e){return Pa.pipe(S(t=>t.observe(e)),x(t=>no.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function oo(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=de(e),o=bt(e);return r>=o.height-n.height-t}),Y())}var cr={drawer:V("[data-md-toggle=drawer]"),search:V("[data-md-toggle=search]")};function io(e){return cr[e].checked}function qe(e,t){cr[e].checked!==t&&cr[e].click()}function je(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),N(t.checked))}function $a(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ia(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(N(!1))}function ao(){let e=b(window,"keydown").pipe(_(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:io("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),_(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!$a(n,r)}return!0}),fe());return Ia().pipe(x(t=>t?R:e))}function Me(){return new URL(location.href)}function ot(e){location.href=e.href}function so(){return new E}function co(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)co(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)co(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function fo(){return location.hash.substring(1)}function uo(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Fa(){return b(window,"hashchange").pipe(l(fo),N(fo()),_(e=>e.length>0),J(1))}function po(){return Fa().pipe(l(e=>se(`[id="${e}"]`)),_(e=>typeof e!="undefined"))}function Nr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function lo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(N(e.matches))}function qr(e,t){return e.pipe(x(r=>r?t():R))}function ur(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(ce(()=>R),x(r=>r.status!==200?Tt(()=>new Error(r.statusText)):H(r)))}function Ue(e,t){return ur(e,t).pipe(x(r=>r.json()),J(1))}function mo(e,t){let r=new DOMParser;return ur(e,t).pipe(x(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function pr(e){let t=M("script",{src:e});return I(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(x(()=>Tt(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),C(()=>document.head.removeChild(t)),Oe(1))))}function ho(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function bo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(ho),N(ho()))}function vo(){return{width:innerWidth,height:innerHeight}}function go(){return b(window,"resize",{passive:!0}).pipe(l(vo),N(vo()))}function yo(){return Q([bo(),go()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(X("size")),o=Q([n,r]).pipe(l(()=>Be(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:a,size:s},{x:f,y:c}])=>({offset:{x:a.x-f,y:a.y-c+i},size:s})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(a=>{let s=document.createElement("script");s.src=i,s.onload=a,document.body.appendChild(s)})),Promise.resolve())}var r=class{constructor(n){this.url=n,this.onerror=null,this.onmessage=null,this.onmessageerror=null,this.m=a=>{a.source===this.w&&(a.stopImmediatePropagation(),this.dispatchEvent(new MessageEvent("message",{data:a.data})),this.onmessage&&this.onmessage(a))},this.e=(a,s,f,c,u)=>{if(s===this.url.toString()){let p=new ErrorEvent("error",{message:a,filename:s,lineno:f,colno:c,error:u});this.dispatchEvent(p),this.onerror&&this.onerror(p)}};let o=new EventTarget;this.addEventListener=o.addEventListener.bind(o),this.removeEventListener=o.removeEventListener.bind(o),this.dispatchEvent=o.dispatchEvent.bind(o);let i=document.createElement("iframe");i.width=i.height=i.frameBorder="0",document.body.appendChild(this.iframe=i),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Startseite

+ +

In dieser Anwenderdokumentation finden Sie Informationen zur Bedienung der Software. Die Dokumentation ist in verschiedene Abschnitte unterteilt, die sich mit unterschiedlichen Modulen des Programms beschäftigen. Die Abschnitte sind in der linken Navigationsleiste aufgelistet.

+

Inhaltsverzeichnis

+
    +
  1. Startseite
  2. +
  3. Allgemeines
      +
    1. Über das Projekt
    2. +
    3. Dokumentation erweitern
    4. +
    5. Entwicklung und Schnittstellen
    6. +
    +
  4. +
  5. Funktionen und Module
      +
    1. Startseite
    2. +
    3. Dashboard
    4. +
    5. Dokumentation
        +
      1. Routes
      2. +
      3. Touren
      4. +
      +
    6. +
    7. Account
    8. +
    +
  6. +
  7. Weitere Informationen
      +
    1. Installation als App
    2. +
    +
  8. +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..4517d6f --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["de"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Startseite","text":"

In dieser Anwenderdokumentation finden Sie Informationen zur Bedienung der Software. Die Dokumentation ist in verschiedene Abschnitte unterteilt, die sich mit unterschiedlichen Modulen des Programms besch\u00e4ftigen. Die Abschnitte sind in der linken Navigationsleiste aufgelistet.

"},{"location":"#inhaltsverzeichnis","title":"Inhaltsverzeichnis","text":"
  1. Startseite
  2. Allgemeines
    1. \u00dcber das Projekt
    2. Dokumentation erweitern
    3. Entwicklung und Schnittstellen
  3. Funktionen und Module
    1. Startseite
    2. Dashboard
    3. Dokumentation
      1. Routes
      2. Touren
    4. Account
  4. Weitere Informationen
    1. Installation als App
"},{"location":"1_general/1_about/","title":"\u00dcber das Projekt","text":"

Herzlich Willkommen zur Anwenderdokumentation f\u00fcr das Projekt \"Streckenkunde Digital\". Diese Dokumentation soll Ihnen als Anwender helfen, sich in der Software zurechtzufinden und die Funktionen zu verstehen. Die Software wurde speziell f\u00fcr Triebfahrzeugf\u00fchrer entwickelt, um die Dokumentation der Streckenkunde zu vereinfachen und zu digitalisieren. Bei Fragen oder Problemen k\u00f6nnen Sie sich gerne an den Support wenden. Die Kontaktdaten finden Sie am Ende dieser Seite.

"},{"location":"1_general/1_about/#kontakt-zum-support","title":"Kontakt zum Support","text":"

Der Support und die Weiterentwicklung des Projekts erfolgt durch folgenden Dienstleister:

Dennis Heinrich Veer\u00dfer Stra\u00dfe 86 29525 Uelzen

Support-Mail: kontakt@streckenkunde.digital Internetseite: dennis-heinri.ch

"},{"location":"1_general/2_changes/","title":"Dokumentation erweitern","text":""},{"location":"1_general/2_changes/#vorschlag-zur-dokumentation-einreichen","title":"Vorschlag zur Dokumentation einreichen","text":"

Um einen Vorschlag zur Dokumentation einzureichen, erstellen Sie bitte ein Issue auf GitHub im Projekt zur Anwenderdokumentation. Dort k\u00f6nnen Sie die gew\u00fcnschte \u00c4nderung oder eine Erg\u00e4nzung mitteilen.

Hier k\u00f6nnen Sie einen Vorschlag einreichen

"},{"location":"1_general/2_changes/#beitragen-an-der-dokumentation","title":"Beitragen an der Dokumentation","text":"

Wenn Sie an der Dokumentation mitarbeiten m\u00f6chten, k\u00f6nnen Sie ihre \u00c4nderungen selbst in das Repository einpflegen. Dazu k\u00f6nnen Sie das Repository klonen und die \u00c4nderungen lokal vornehmen. Anschlie\u00dfend k\u00f6nnen Sie die \u00c4nderungen \u00fcber einen Pull-Request einreichen und werden diese nach einer Pr\u00fcfung in die Dokumentation \u00fcberf\u00fchren.

Mehr Informationen zum Beitragen finden Sie in dem Repository.

"},{"location":"1_general/2_changes/#voraussetzungen-an-den-beitragenden","title":"Voraussetzungen an den Beitragenden","text":"

Zum Beitragen an der Dokumentation sind folgende Voraussetzungen notwendig:

  • Docker um die Dokumentation zu kompilieren und zu starten
  • Das Tool Just, es ist ein Management-Tool f\u00fcr das Ausf\u00fchren von Befehlen
  • Erfahrung im Umgang mit Markdown-Dateien und der Versionsverwaltung Git
"},{"location":"1_general/3_development/","title":"Entwicklung und Schnittstellen","text":"

Die Software bietet eine spezielle Webseite (API), die es erm\u00f6glicht, Nutzerdaten zu bearbeiten. Diese Webseite ist \u00fcber die Adresse /api erreichbar.

  • OpenAPI-Spezifikation: Es gibt eine Anleitung, wie man die API benutzt, die unter /api/openapi.json abrufbar ist.
  • Interaktive Dokumentation: Eine benutzerfreundlichere Version der Dokumentation findest du unter /api/docs.
"},{"location":"1_general/3_development/#authentifizierung","title":"Authentifizierung","text":"

Um sicherzugehen, dass nur berechtigte Personen Zugang haben, nutzt die Software JWT-Token:

  • Nach dem Einloggen erh\u00e4ltst du einen JWT-Token von der Adresse /api/login_check.
  • Diesen Token musst du bei jeder Anfrage im Authorization-Bereich deiner Internetanfrage als Bearer-Token mitschicken.
"},{"location":"2_modules/1_welcome/","title":"Startseite","text":"

Jeder Nutzer ohne eine g\u00fcltige Anmeldung wird auf der Willkommensseite begr\u00fc\u00dft. Hier kann sich der Nutzer entweder anmelden oder ein neues Benutzerkonto registrieren. Au\u00dferdem gibt es die M\u00f6glichkeit, ein neues Passwort anzufordern, falls der Nutzer sein Passwort vergessen hat.

"},{"location":"2_modules/1_welcome/#anmeldung-mit-vorhandenem-benutzerkonto","title":"Anmeldung mit vorhandenem Benutzerkonto","text":"

Jeder Nutzer kann sich auf der Plattform registrieren und anmelden. Dazu wird ein Benutzername und ein Passwort ben\u00f6tigt. Die Anmeldung erfolgt \u00fcber die Webseite und ist f\u00fcr jeden Nutzer zug\u00e4nglich. Der Benutzername ist die E-Mail-Adresse, die bei der Registrierung angegeben wurde. Das Passwort wird bei der Registrierung festgelegt und kann jederzeit durch die Passwort-Vergessen Funktion ge\u00e4ndert werden.

"},{"location":"2_modules/1_welcome/#registrierung-eines-neuen-benutzerkontos","title":"Registrierung eines neuen Benutzerkontos","text":"

Um ein neues Benutzerkonto zu registrieren, muss der Nutzer auf der Webseite die Registrierungsfunktion aufrufen. Dazu wird ein Benutzername (E-Mail), der vollst\u00e4ndige Name des Anwenders und ein Passwort ben\u00f6tigt.

"},{"location":"2_modules/1_welcome/#passwort-vergessen","title":"Passwort vergessen","text":"

Wenn ein Nutzer sein Passwort vergessen hat, kann er \u00fcber die Webseite ein neues Passwort anfordern. Dazu wird die E-Mail-Adresse ben\u00f6tigt, die bei der Registrierung angegeben wurde. Der Nutzer erh\u00e4lt dann eine E-Mail mit einem neuen Passwort zur vorr\u00fcbergehenden Anmeldung.

"},{"location":"2_modules/2_dashboard/","title":"Dashboard","text":"

Auf dem Dashboard sieht der Nutzer eine \u00dcbersicht zum Verfall seiner dokumentierten Streckenkunden, allgemeine Informationen zu seinem Benutzerkonto und eine kleine Statistik \u00fcber die Anzahl der von ihm eingepflegten Strecken und Touren.

"},{"location":"2_modules/2_dashboard/#verfallsubersicht","title":"Verfalls\u00fcbersicht","text":"

In diesem Modul hat der Nutzer die M\u00f6glichkeit, sich einen \u00dcberblick \u00fcber den Verfall seiner Streckenkunden zu verschaffen. Hier werden alle Streckenkunden aufgelistet, die in seinem festgelegten Zeitraum (Auswahl der Tage) ablaufen werden. Der Nutzer kann zudem die Strecken rausfiltern, die er noch nie dokumentiert hat. Daf\u00fcr kann er die Checkbox \"Nur aufgezeichnete Strecken\" verwenden.

"},{"location":"2_modules/2_dashboard/#nur-aufgezeichnete-strecken","title":"Nur aufgezeichnete Strecken","text":"

Es werden nur die Strecken angezeigt, die bereits in der Vergangenheit dokumentiert wurden und in dem angebenen Zeitraum der Tage ablaufen werden und somit ein Verfallsdatum haben. Abgelaufene Strecken werden immer angezeigt, unabh\u00e4ngig der Filter.

"},{"location":"2_modules/2_dashboard/#alle-strecken-anzeigen","title":"Alle Strecken anzeigen","text":"

Alle Strecken werden angezeigt, unabh\u00e4ngig davon, ob sie bereits dokumentiert wurden oder nicht. In diesem Fall wird unter der Strecke \"Keine Aufzeichnung\" dargestellt und alle Strecken die unter dieses Kriterium fallen, werden ganz oben in der Liste dargestellt. Abgelaufene Strecken werden immer angezeigt, unabh\u00e4ngig der Filter.

"},{"location":"2_modules/3_documentation/","title":"Dokumentation","text":"

Auf dieser Seite hat der Nutzer die M\u00f6glichkeit:

  1. Seine Streckenkunden zu dokumentieren
  2. Strecken anzuzeigen oder zu erstellen
  3. Touren anzuzeigen oder zu erstellen

"},{"location":"2_modules/3_documentation/#strecken","title":"Strecken","text":"

Eine Strecke ist ein Abschnitt im Schienennetz, der von einem Start- zu einem Endpunkt f\u00fchrt. Die Strecke besteht immer aus einem Namen, zwei Punkten (Start und Endpunkt) und optional einem Namen, der Unternehmensintern verwendet wird. Die Strecke kann auch in einer Tour inbegriffen sein, um die Dokumentation mehrerer Strecken zu vereinfachen.

"},{"location":"2_modules/3_documentation/#touren","title":"Touren","text":"

Eine Tour enth\u00e4lt mehrere Strecken. Eine Tour kann beispielsweise eine Fahrt von Hamburg nach Berlin sein. In diesem Fall w\u00fcrde die Tour alle Strecken enthalten, die auf dieser Fahrt zur\u00fcckgelegt werden. Somit k\u00f6nnen auf oft befahrenen Abschnitten oder vorgefertigten Touren die Strecken mit einem einzelnen Klick in die Dokumentation \u00fcbernommen werden, statt diese alle vereinzelt zu markieren.

"},{"location":"2_modules/3_documentation/#dokumentieren","title":"Dokumentieren","text":"

Die Dokumentation einer Streckenkunde erfolgt \u00fcber die Markierung der gefahrenen Touren oder einzelner Strecken. Die Markierung erfolgt mit dem Lesezeichen-Symbol. \u00dcber erneuten Klick kann die Markierung wieder entfernt werden.

Wenn mindestens ein Element markiert wurde, erscheint das Modul zur Dokumentation der Streckenkunde. Hier kann der Nutzer ein Datum festlegen, an dem die Streckenkunde erworben wurde. Standardm\u00e4\u00dfig ist immer das aktuelle Datum vorausgew\u00e4hlt. Der Ablauf der Streckenkunde wird automatisch berechnet und f\u00fcr ein Jahr festgelegt (364 Tage nach Erwerbsdatum).

"},{"location":"2_modules/3_documentation/1_routes/","title":"Strecken","text":"

Eine Strecke ist ein Abschnitt im Schienennetz, der von einem Start- zu einem Endpunkt f\u00fchrt. Die Strecke besteht immer aus einem Namen, zwei Punkten (Start und Endpunkt) und optional einem Namen, der Unternehmensintern verwendet wird. Die Strecke kann auch in einer Tour inbegriffen sein, um die Dokumentation mehrerer Strecken zu vereinfachen.

"},{"location":"2_modules/3_documentation/1_routes/#erstellen","title":"Erstellen","text":"

Um eine neue Strecke zu erstellen, klicke auf den Button \"Strecke erstellen\" auf der Seite Dokumentation. Es \u00f6ffnet sich ein Dialog, in dem du die notwendigen Informationen eingeben kannst.

  • Name: Der Name der Strecke.
  • Unternehmens-K\u00fcrzel: (optional) Bezeichner f\u00fcr die Strecke.
  • Start der Strecke: Der Startpunkt der Strecke.
  • Ende der Strecke: Der Endpunkt der Strecke.
  • Zuletzt gefahren am: (optional) Das Datum, an dem die Strecke zuletzt befahren wurde.
    • Standardm\u00e4\u00dfig wird kein Datum angegeben.
    • Mit Eintrag wird die Strecke zur Erstellung mit der Streckenkunde vermerkt.

"},{"location":"2_modules/3_documentation/1_routes/#ansehen","title":"Ansehen","text":"

Um eine Strecke anzusehen, klicke auf den Namen der Strecke an einem beliebigen Punkt innerhalb der Anwendung. Es \u00f6ffnet sich ein Dialog, in dem du die Informationen zur Strecke einsehen kannst. Die Strecke kann z.B. \u00fcber die Suche der Dokumentation gefunden werden. Es werden alle Daten, sowie die G\u00fcltigkeit der Streckenkunde angezeigt.

Hat die Strecke keine dokumentierte Streckenkunde, wird dies mit \"Nicht erfasst\" gekennzeichnet

"},{"location":"2_modules/3_documentation/1_routes/#bearbeiten","title":"Bearbeiten","text":"

Um eine Strecke zu bearbeiten, klicke auf den Namen der Strecke an einem beliebigen Punkt innerhalb der Anwendung um die Strecke anzusehen. Anschlie\u00dfend klicke auf den Button \"Strecke bearbeiten\". Es \u00f6ffnet sich ein Dialog, in dem du die notwendigen Informationen \u00e4ndern oder die Strecke komplett l\u00f6schen kannst. Die Strecke kann z.B. \u00fcber die Suche der Dokumentation gefunden werden.

"},{"location":"2_modules/3_documentation/2_tours/","title":"Touren","text":"

Eine Tour ist z.B. eine Fahrt von Hamburg nach Berlin, welche viele Strecken beinhaltet. Somit k\u00f6nnen auf oft befahrenen Abschnitten oder vorgefertigten Touren die Strecken mit einem einzelnen Klick in der Dokumentation \u00fcbernommen werden, statt alle Strecken vereinzelt zu markieren.

"},{"location":"2_modules/3_documentation/2_tours/#erstellen","title":"Erstellen","text":"

Die Erstellung einer Tour erfolgt \u00fcber den Button \"Tour erstellen\" auf der Seite Dokumentation. Die Tour ben\u00f6tigt einen Namen und mindestens zwei Strecken, um erstellt werden zu k\u00f6nnen. Die Strecken k\u00f6nnen \u00fcber die Suchfunktion ausgew\u00e4hlt werden, und wie bei der Dokumentation markiert werden. Alle markierten Strecken sind dann Bestandteil der Tour.

"},{"location":"2_modules/3_documentation/2_tours/#ansehen","title":"Ansehen","text":"

Um eine Tour anzusehen, klicke auf den Namen einer Tour an einem beliebigen Punkt innerhalb der Anwendung. Es \u00f6ffnet sich ein Dialog, in dem die Informationen, sowie die beinhalteten Strecken einer Tour eingesehen werden k\u00f6nnen. Eine Tour kann z.B. \u00fcber die Suche der Dokumentation gefunden werden. \u00dcber einen Klick auf eine der Strecken in der Tour gelangst du zur Einzelansicht dieser.

"},{"location":"2_modules/3_documentation/2_tours/#bearbeiten","title":"Bearbeiten","text":"

Um eine Tour zu bearbeiten, klicke auf den Namen einer Tour an einem beliebigen Punkt innerhalb der Anwendung um die Tour anzusehen. Anschlie\u00dfend klicke auf den Button \"Tour bearbeiten\". Es \u00f6ffnet sich ein Dialog, in dem du die notwendigen Informationen, sowie die beinhalteten Strecken \u00e4ndern oder die Tour g\u00e4nzlich l\u00f6schen kannst.

Wenn die Auswahl der beinhalteten Strecken ge\u00e4ndert werden, sind diese erst nach dem Speichern aktiv. Die Anwendung merkt sich dennoch die vorherige Auswahl, z.B. um Strecken zwischenzeitlich zu \u00f6ffnen oder zu bearbeiten. Kehrt man zur Bearbeitung zur\u00fcck, sind die Strecken wieder markiert. Die Auswahl der ge\u00e4nderten Strecken ohne Speichern wird verworfen, wenn auf \"Zur\u00fcck zur Ansicht\" geklickt wird.

"},{"location":"2_modules/4_account/","title":"\u00dcbersicht","text":"

Das Modul \"Account\" bietet dem Nutzer die M\u00f6glichkeit, seine pers\u00f6nlichen Daten anzuzeigen. Eine Bearbeitung der Daten ist zum derzeitigen Stand der Anwendung nicht m\u00f6glich.

"},{"location":"3_extras/","title":"\u00dcbersicht","text":""},{"location":"3_extras/1_app/","title":"Installation als App","text":""},{"location":"3_extras/1_app/#desktop","title":"Desktop","text":""},{"location":"3_extras/1_app/#google-chrome","title":"Google Chrome","text":"

Die Seite kann als App (PWA) auf dem Desktop installiert werden. Dazu wird die Seite im Browser ge\u00f6ffnet und die Option \"Installieren\" neben der URL-Eingabe ausgew\u00e4hlt.

Es \u00f6ffnet sich ein Dialog, in dem die Installation best\u00e4tigt werden muss.

Anschlie\u00dfend wird die App als Icon und auf dem Desktop abgelegt.

Nach dem Start der App wird die Anwendung in einem eigenen Fenster ge\u00f6ffnet.

"},{"location":"3_extras/1_app/#smartphone","title":"Smartphone","text":""},{"location":"3_extras/1_app/#android-mit-google-chrome","title":"Android mit Google Chrome","text":"

Die Seite kann als App (PWA) auf dem Smartphone installiert werden. Dazu wird die Seite im Browser ge\u00f6ffnet und die Option \"App Installieren\" in den Einstellungen (Drei-Punkte-Icon) des Chrome-Browsers ausgew\u00e4hlt. Dann wird die Installation best\u00e4tigt.

Anschlie\u00dfend wird die App als Icon auf dem Startbildschirm abgelegt und kann dort als App gestartet werden.

Die App ist auch \u00fcber die App-\u00dcbersicht erreichbar, wo sie als eigenst\u00e4ndige App angezeigt wird und auch deinstalliert werden kann.

"},{"location":"3_extras/1_app/#apple-ios","title":"Apple / iOS","text":"

Auf iOS-Ger\u00e4ten kann die App nicht installiert werden, da Apple keine PWAs unterst\u00fctzt. Die Seite kann jedoch als Startbildschirm-Lesezeichen \u00fcber Safari hinzugef\u00fcgt werden, um sie schneller zu \u00f6ffnen. Daf\u00fcr wird die Seite im Safari-Browser ge\u00f6ffnet und die Option \"Zum Home-Bildschirm\" in den Einstellungen (Teilen-Icon) ausgew\u00e4hlt.

Anschlie\u00dfend wird die Installation mit der Vergabe eines Namens best\u00e4tigt.

Die Anwendung wird als Icon auf dem Startbildschirm abgelegt und kann dort als Lesezeichen gestartet werden.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..f66534b --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,63 @@ + + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + + None + 2024-05-28 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..bd153dc Binary files /dev/null and b/sitemap.xml.gz differ