diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b89914..45d0842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # CHANGELOG +## v8.0.1 + +* Readded the `nfclogin` button to the login page +* Fixed failed require for `statusMessages.arbeit.inc.php` + +## v8.0 + +* Reworked the whole web UI, some elements may have not been migrated yet. +* Plugin Hub now integrates the Navigation Bar + +## v7.13.1.1 + +* Added colors to status messages +* Security fixes + ## v7.13.1 * Fixed issues with LDAP authentication diff --git a/README.md b/README.md index 89f8afb..aa8b019 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # TimeTrack - small enterprise time recording TimeTrack aims to be an easy-to-use time recording software for small enterprises. -It's a fork from TimeTrack Oval, v6.2 (license-based model, within cloud & more features) ## Features diff --git a/VERSION b/VERSION index 15958dd..5210382 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.13.1 \ No newline at end of file +8.0.1 \ No newline at end of file diff --git a/api/v1/class/i18n/suite/footer/snippets_DE.json b/api/v1/class/i18n/suite/footer/snippets_DE.json new file mode 100644 index 0000000..e24aea8 --- /dev/null +++ b/api/v1/class/i18n/suite/footer/snippets_DE.json @@ -0,0 +1,4 @@ +{ + "privacy": "Datenschutz", + "support": "Support" +} \ No newline at end of file diff --git a/api/v1/class/i18n/suite/footer/snippets_EN.json b/api/v1/class/i18n/suite/footer/snippets_EN.json new file mode 100644 index 0000000..f3bec5e --- /dev/null +++ b/api/v1/class/i18n/suite/footer/snippets_EN.json @@ -0,0 +1,4 @@ +{ + "privacy": "Privacy", + "support": "Support" +} \ No newline at end of file diff --git a/api/v1/class/i18n/suite/footer/snippets_NL.json b/api/v1/class/i18n/suite/footer/snippets_NL.json new file mode 100644 index 0000000..c37fefd --- /dev/null +++ b/api/v1/class/i18n/suite/footer/snippets_NL.json @@ -0,0 +1,4 @@ +{ + "privacy": "Privacyverklaring", + "support": "Ondersteuning" +} \ No newline at end of file diff --git a/api/v1/class/i18n/suite/privacy/snippets_DE.json b/api/v1/class/i18n/suite/privacy/snippets_DE.json new file mode 100644 index 0000000..698e98c --- /dev/null +++ b/api/v1/class/i18n/suite/privacy/snippets_DE.json @@ -0,0 +1,10 @@ +{ + "h1": "Datenschutzerklärung", + "intro": "Diese Anwendung verarbeitet personenbezogene Daten ausschließlich im Rahmen der Funktionsweise von TimeTrack.", + "data_collected": "Erhobene Daten: Vorname, Nachname, E-Mail-Adresse, Passwort (gehasht). Bei Verwendung von LDAP erfolgt die Authentifizierung über den verbundenen Verzeichnisdienst.", + "email_usage": "TimeTrack kann E-Mails an Benutzer versenden, z. B. für Benachrichtigungen oder zur Passwortzurücksetzung.", + "plugins": "Installierte Plugins können auf bestimmte Daten zugreifen, wenn dies für ihre Funktion erforderlich ist. Die Weitergabe erfolgt ohne gesonderte Nachfrage.", + "locality": "TimeTrack ist eine lokal installierte Open-Source-Anwendung. Alle Daten verbleiben auf dem lokalen System, sofern nicht explizit anderweitig konfiguriert.", + "contact": "Kontakt", + "contact_note": "Bei Fragen oder Anliegen zur Verarbeitung Ihrer personenbezogenen Daten können Sie sich jederzeit an uns wenden. Email:" +} diff --git a/api/v1/class/i18n/suite/privacy/snippets_EN.json b/api/v1/class/i18n/suite/privacy/snippets_EN.json new file mode 100644 index 0000000..158a541 --- /dev/null +++ b/api/v1/class/i18n/suite/privacy/snippets_EN.json @@ -0,0 +1,10 @@ +{ + "h1": "Privacy Policy", + "intro": "This application processes personal data strictly within the functional scope of TimeTrack.", + "data_collected": "Data collected: First name, last name, email address, password (hashed). If LDAP is used, authentication is handled via the connected directory service.", + "email_usage": "TimeTrack may send emails to users, e.g., for notifications or password resets.", + "plugins": "Installed plugins may access certain data when necessary for their function. This transfer occurs without additional confirmation.", + "locality": "TimeTrack is a locally installed open-source application. All data remains on the local system unless explicitly configured otherwise.", + "contact": "Contact", + "contact_note": "If you have any questions or concerns regarding the processing of your personal data, you can contact us at any time. Email:" +} diff --git a/api/v1/class/i18n/suite/privacy/snippets_NL.json b/api/v1/class/i18n/suite/privacy/snippets_NL.json new file mode 100644 index 0000000..2163dce --- /dev/null +++ b/api/v1/class/i18n/suite/privacy/snippets_NL.json @@ -0,0 +1,10 @@ +{ + "h1": "Privacybeleid", + "intro": "Deze applicatie verwerkt persoonsgegevens uitsluitend binnen de functionele werking van TimeTrack.", + "data_collected": "Verzamelde gegevens: Voornaam, achternaam, e-mailadres, wachtwoord (gehasht). Bij gebruik van LDAP wordt authenticatie afgehandeld via de gekoppelde directoryservice.", + "email_usage": "TimeTrack kan e-mails naar gebruikers verzenden, bijvoorbeeld voor meldingen of het opnieuw instellen van wachtwoorden.", + "plugins": "Geïnstalleerde plugins kunnen toegang hebben tot bepaalde gegevens indien dit nodig is voor hun werking. Deze overdracht vindt plaats zonder verdere bevestiging.", + "locality": "TimeTrack is een lokaal geïnstalleerde open-source applicatie. Alle gegevens blijven op het lokale systeem, tenzij anders geconfigureerd.", + "contact": "Contact", + "contact_note": "Als u vragen of zorgen heeft over de verwerking van uw persoonsgegevens, kunt u te allen tijde contact met ons opnemen. E-mail:" +} diff --git a/api/v1/class/i18n/suite/status/snippets_DE.json b/api/v1/class/i18n/suite/status/snippets_DE.json index 88d7532..14ec08d 100644 --- a/api/v1/class/i18n/suite/status/snippets_DE.json +++ b/api/v1/class/i18n/suite/status/snippets_DE.json @@ -1,30 +1,30 @@ { - "worktime_deleted": "[BLUE]Hinweis: Arbeitszeit erfolgreich gelöscht![/BLUE]", - "logged_out": "[BLUE]Hinweis: Erfolgreich ausgeloggt![/BLUE]", - "error_sickness": "[RED]Fehler: Deine Krankheit konnte nicht gespeichert werden. Bitte kontaktiere deinen Administrator![/RED]", - "error_vacation": "[RED]Fehler: Deine Urlaub konnte nicht gespeichert werden. Bitte kontaktiere deinen Administrator![/RED]", - "vacation_added": "[GREEN]Hinweis: Dein Urlaub wurde erfolgreich gespeichert![/GREEN]", - "sickness_added": "[BLUE]Hinweis: Deine Krankheit wurde erfolgreich gespeichert![/BLUE]", - "notifications_entry_deleted": "Hinweis: Benachrichtigungeneintrag gelöscht![/BLUE]", - "noperms": "[YELLOW]Hinweis: Fehlende Berechtigungen[/YELLOW]", - "user_deleted": "[BLUE]Hinweis: Benutzer erfolgreich gelöscht![/BLUE]", - "created_user": "[GREEN]Hinweis: Benutzer erfolgreich erstellt![/GREEN]", - "worktime_added": "[GREEN]Hinweis: Arbeitszeit erfolgreich hinzugefügt![/GREEN]", - "password_changed": "[YELLOW]Hinweis: Dein Passwort wurde erfolgreich geändert. Bitte melde dich erneut an.[/YELLOW]", - "password_change_failed": "[RED]Fehler: Dein Passwort konnte nicht geändert werden, bitte kontaktiere den Support.[/RED]", - "password_reset": "[YELLOW]Hinweis: Es wurde eine E-Mail verschickt, damit du dein Passwort zurücksetzen kannst.[/YELLOW]", - "nodata": "[RED]Fehler: Es wurde kein Benutzername oder Passwort eingegeben.[/RED]", - "wrongdata": "[RED]Fehler: Falsche Anmeldedaten.[/RED]", - "worktime_review": "[GREEN]Hinweis: Arbeitszeit erfolgreich auf Prüfung gestellt![/GREEN]", - "worktime_review_unlock": "[GREEN]Hinweis: Prüfung erfolgreich aufgehoben für Arbeitszeit![/GREEN]", - "worktime_easymode_start": "[GREEN]Hinweis: Deine Schicht wurde erfolgreich gestartet![/GREEN]", - "worktime_easymode_end": "[GREEN]Hinweis: Deine Schicht wurde erfolgreich beendet![/GREEN]", - "worktime_easymode_pause_start": "[GREEN]Hinweis: Deine Pause wurde erfolgreich gestartet![/GREEN]", - "worktime_easymode_pause_end": "[GREEN]Hinweis: Deine Pause wurde erfolgreich beendet![/GREEN]", - "easymode_toggled": "[GREEN]Hinweis: Der Modus wurde erfolgreich gewechselt![GREEN]", - "error": "[RED]Hinweis: Ein Fehler ist aufgetreten. Bitte überprüfe den Log, falls möglich.[/RED]", - "statemismatch": "[RED]Fehler: Sicherheitsfehler[/RED]", - "ldapauth": "[RED]Fehler: Die Authentifizierung über LDAP ist fehlgeschlagen.[/RED]", - "ldapcreated": "[YELLOW]Hinweis: Bitte melde dich erneut an. Dein Benutzerkonto wurde nun erstellt. (LDAP allowed self-login)[/YELLOW]", - "notification_not_found": "[RED]Fehler: Benachrichtigung nicht gefunden.[/RED]" + "worktime_deleted": "Hinweis: Arbeitszeit erfolgreich gelöscht!", + "logged_out": "Hinweis: Erfolgreich ausgeloggt!", + "error_sickness": "Fehler: Deine Krankheit konnte nicht gespeichert werden. Bitte kontaktiere deinen Administrator!", + "error_vacation": "Fehler: Deine Urlaub konnte nicht gespeichert werden. Bitte kontaktiere deinen Administrator!", + "vacation_added": "Hinweis: Dein Urlaub wurde erfolgreich gespeichert!", + "sickness_added": "Hinweis: Deine Krankheit wurde erfolgreich gespeichert!", + "notifications_entry_deleted": "Hinweis: Benachrichtigungeneintrag gelöscht!", + "noperms": "Hinweis: Fehlende Berechtigungen", + "user_deleted": "Hinweis: Benutzer erfolgreich gelöscht!", + "created_user": "Hinweis: Benutzer erfolgreich erstellt!", + "worktime_added": "Hinweis: Arbeitszeit erfolgreich hinzugefügt!", + "password_changed": "Hinweis: Dein Passwort wurde erfolgreich geändert. Bitte melde dich erneut an.", + "password_change_failed": "Fehler: Dein Passwort konnte nicht geändert werden, bitte kontaktiere den Support.", + "password_reset": "Hinweis: Es wurde eine E-Mail verschickt, damit du dein Passwort zurücksetzen kannst.", + "nodata": "Fehler: Es wurde kein Benutzername oder Passwort eingegeben.", + "wrongdata": "Fehler: Falsche Anmeldedaten.", + "worktime_review": "Hinweis: Arbeitszeit erfolgreich auf Prüfung gestellt!", + "worktime_review_unlock": "Hinweis: Prüfung erfolgreich aufgehoben für Arbeitszeit!", + "worktime_easymode_start": "Hinweis: Deine Schicht wurde erfolgreich gestartet!", + "worktime_easymode_end": "Hinweis: Deine Schicht wurde erfolgreich beendet!", + "worktime_easymode_pause_start": "Hinweis: Deine Pause wurde erfolgreich gestartet!", + "worktime_easymode_pause_end": "Hinweis: Deine Pause wurde erfolgreich beendet!", + "easymode_toggled": "Hinweis: Der Modus wurde erfolgreich gewechselt!", + "error": "Hinweis: Ein Fehler ist aufgetreten. Bitte überprüfe den Log, falls möglich.", + "statemismatch": "Fehler: Sicherheitsfehler", + "ldapauth": "Fehler: Die Authentifizierung über LDAP ist fehlgeschlagen.", + "ldapcreated": "Hinweis: Bitte melde dich erneut an. Dein Benutzerkonto wurde nun erstellt. (LDAP allowed self-login)", + "notification_not_found": "Fehler: Benachrichtigung nicht gefunden." } diff --git a/api/v1/class/i18n/suite/status/snippets_EN.json b/api/v1/class/i18n/suite/status/snippets_EN.json index c86c7c7..baf04cf 100644 --- a/api/v1/class/i18n/suite/status/snippets_EN.json +++ b/api/v1/class/i18n/suite/status/snippets_EN.json @@ -1,30 +1,30 @@ { - "worktime_deleted": "[BLUE]Note: Work time successfully deleted![/BLUE]", - "logged_out": "[BLUE]Note: Successfully logged out![/BLUE]", - "error_sickness": "[RED]Error: Your sickness could not be saved. Please contact your administrator![/RED]", - "error_vacation": "[RED]Error: Your vacation could not be saved. Please contact your administrator![/RED]", - "vacation_added": "[GREEN]Note: Your vacation has been saved successfully![/GREEN]", - "sickness_added": "[BLUE]Note: Your sickness has been saved successfully![/BLUE]", - "notifications_entry_deleted": "Note: Notification entry deleted![/BLUE]", - "noperms": "[YELLOW]Note: Missing permissions[/YELLOW]", - "user_deleted": "[BLUE]Note: User successfully deleted![/BLUE]", - "created_user": "[GREEN]Note: User successfully created![/GREEN]", - "worktime_added": "[GREEN]Note: Work time successfully added![/GREEN]", - "password_changed": "[YELLOW]Note: Your password has been changed successfully. Please log in again.[/YELLOW]", - "password_change_failed": "[RED]Error: Your password could not be changed, please contact support.[/RED]", - "password_reset": "[YELLOW]Note: An email has been sent so you can reset your password.[/YELLOW]", - "nodata": "[RED]Error: No username or password entered.[/RED]", - "wrongdata": "[RED]Error: Incorrect login credentials.[/RED]", - "worktime_review": "[GREEN]Note: Work time successfully submitted for review![/GREEN]", - "worktime_review_unlock": "[GREEN]Note: Review successfully removed for work time![/GREEN]", - "worktime_easymode_start": "[GREEN]Note: Your shift has started successfully![/GREEN]", - "worktime_easymode_end": "[GREEN]Note: Your shift has ended successfully![/GREEN]", - "worktime_easymode_pause_start": "[GREEN]Note: Your break has started successfully![/GREEN]", - "worktime_easymode_pause_end": "[GREEN]Note: Your break has ended successfully![/GREEN]", - "easymode_toggled": "[GREEN]Note: Mode successfully toggled![GREEN]", - "error": "[RED]Note: An error has occurred. Please check the log if possible.[/RED]", - "statemismatch": "[RED]Error: Security error[/RED]", - "ldapauth": "[RED]Error: LDAP authentication failed.[/RED]", - "ldapcreated": "[YELLOW]Note: Please log in again. Your user account has now been created. (LDAP allowed self-login)[/YELLOW]", - "notification_not_found": "[RED]Error: Notification not found.[/RED]" + "worktime_deleted": "Note: Work time successfully deleted!", + "logged_out": "Note: Successfully logged out!", + "error_sickness": "Error: Your sickness could not be saved. Please contact your administrator!", + "error_vacation": "Error: Your vacation could not be saved. Please contact your administrator!", + "vacation_added": "Note: Your vacation has been saved successfully!", + "sickness_added": "Note: Your sickness has been saved successfully!", + "notifications_entry_deleted": "Note: Notification entry deleted!", + "noperms": "Note: Missing permissions", + "user_deleted": "Note: User successfully deleted!", + "created_user": "Note: User successfully created!", + "worktime_added": "Note: Work time successfully added!", + "password_changed": "Note: Your password has been changed successfully. Please log in again.", + "password_change_failed": "Error: Your password could not be changed, please contact support.", + "password_reset": "Note: An email has been sent so you can reset your password.", + "nodata": "Error: No username or password entered.", + "wrongdata": "Error: Incorrect login credentials.", + "worktime_review": "Note: Work time successfully submitted for review!", + "worktime_review_unlock": "Note: Review successfully removed for work time!", + "worktime_easymode_start": "Note: Your shift has started successfully!", + "worktime_easymode_end": "Note: Your shift has ended successfully!", + "worktime_easymode_pause_start": "Note: Your break has started successfully!", + "worktime_easymode_pause_end": "Note: Your break has ended successfully!", + "easymode_toggled": "Note: Mode successfully toggled!", + "error": "Note: An error has occurred. Please check the log if possible.", + "statemismatch": "Error: Security error", + "ldapauth": "Error: LDAP authentication failed.", + "ldapcreated": "Note: Please log in again. Your user account has now been created. (LDAP allowed self-login)", + "notification_not_found": "Error: Notification not found." } diff --git a/api/v1/class/i18n/suite/status/snippets_NL.json b/api/v1/class/i18n/suite/status/snippets_NL.json index 5276d6b..8dee092 100644 --- a/api/v1/class/i18n/suite/status/snippets_NL.json +++ b/api/v1/class/i18n/suite/status/snippets_NL.json @@ -1,30 +1,30 @@ { - "worktime_deleted": "[BLUE]Opmerking: Werkuren succesvol verwijderd![/BLUE]", - "logged_out": "[BLUE]Opmerking: Succesvol uitgelogd![/BLUE]", - "error_sickness": "[RED]Fout: Je ziekte kon niet worden opgeslagen. Neem contact op met je beheerder![/RED]", - "error_vacation": "[RED]Fout: Je vakantie kon niet worden opgeslagen. Neem contact op met je beheerder![/RED]", - "vacation_added": "[GREEN]Opmerking: Je vakantie is succesvol opgeslagen![/GREEN]", - "sickness_added": "[BLUE]Opmerking: Je ziekte is succesvol opgeslagen![/BLUE]", - "notifications_entry_deleted": "Opmerking: Notificatie-item verwijderd![/BLUE]", - "noperms": "[YELLOW]Opmerking: Onvoldoende rechten[/YELLOW]", - "user_deleted": "[BLUE]Opmerking: Gebruiker succesvol verwijderd![/BLUE]", - "created_user": "[GREEN]Opmerking: Gebruiker succesvol aangemaakt![/GREEN]", - "worktime_added": "[GREEN]Opmerking: Werkuren succesvol toegevoegd![/GREEN]", - "password_changed": "[YELLOW]Opmerking: Je wachtwoord is succesvol gewijzigd. Log opnieuw in.[/YELLOW]", - "password_change_failed": "[RED]Fout: Je wachtwoord kon niet worden gewijzigd, neem contact op met support.[/RED]", - "password_reset": "[YELLOW]Opmerking: Er is een e-mail verstuurd om je wachtwoord te resetten.[/YELLOW]", - "nodata": "[RED]Fout: Geen gebruikersnaam of wachtwoord ingevoerd.[/RED]", - "wrongdata": "[RED]Fout: Onjuiste inloggegevens.[/RED]", - "worktime_review": "[GREEN]Opmerking: Werkuren succesvol ter controle ingediend![/GREEN]", - "worktime_review_unlock": "[GREEN]Opmerking: Controle succesvol opgeheven voor werkuren![/GREEN]", - "worktime_easymode_start": "[GREEN]Opmerking: Je dienst is succesvol gestart![/GREEN]", - "worktime_easymode_end": "[GREEN]Opmerking: Je dienst is succesvol beëindigd![/GREEN]", - "worktime_easymode_pause_start": "[GREEN]Opmerking: Je pauze is succesvol gestart![/GREEN]", - "worktime_easymode_pause_end": "[GREEN]Opmerking: Je pauze is succesvol beëindigd![/GREEN]", - "easymode_toggled": "[GREEN]Opmerking: Modus succesvol gewijzigd![GREEN]", - "error": "[RED]Opmerking: Er is een fout opgetreden. Controleer het logbestand indien mogelijk.[/RED]", - "statemismatch": "[RED]Fout: Beveiligingsfout[/RED]", - "ldapauth": "[RED]Fout: LDAP-authenticatie mislukt.[/RED]", - "ldapcreated": "[YELLOW]Opmerking: Log opnieuw in. Je account is nu aangemaakt. (LDAP self-login toegestaan)[/YELLOW]", - "notification_not_found": "[RED]Fout: Notificatie niet gevonden.[/RED]" + "worktime_deleted": "Opmerking: Werkuren succesvol verwijderd!", + "logged_out": "Opmerking: Succesvol uitgelogd!", + "error_sickness": "Fout: Je ziekte kon niet worden opgeslagen. Neem contact op met je beheerder!", + "error_vacation": "Fout: Je vakantie kon niet worden opgeslagen. Neem contact op met je beheerder!", + "vacation_added": "Opmerking: Je vakantie is succesvol opgeslagen!", + "sickness_added": "Opmerking: Je ziekte is succesvol opgeslagen!", + "notifications_entry_deleted": "Opmerking: Notificatie-item verwijderd!", + "noperms": "Opmerking: Onvoldoende rechten", + "user_deleted": "Opmerking: Gebruiker succesvol verwijderd!", + "created_user": "Opmerking: Gebruiker succesvol aangemaakt!", + "worktime_added": "Opmerking: Werkuren succesvol toegevoegd!", + "password_changed": "Opmerking: Je wachtwoord is succesvol gewijzigd. Log opnieuw in.", + "password_change_failed": "Fout: Je wachtwoord kon niet worden gewijzigd, neem contact op met support.", + "password_reset": "Opmerking: Er is een e-mail verstuurd om je wachtwoord te resetten.", + "nodata": "Fout: Geen gebruikersnaam of wachtwoord ingevoerd.", + "wrongdata": "Fout: Onjuiste inloggegevens.", + "worktime_review": "Opmerking: Werkuren succesvol ter controle ingediend!", + "worktime_review_unlock": "Opmerking: Controle succesvol opgeheven voor werkuren!", + "worktime_easymode_start": "Opmerking: Je dienst is succesvol gestart!", + "worktime_easymode_end": "Opmerking: Je dienst is succesvol beëindigd!", + "worktime_easymode_pause_start": "Opmerking: Je pauze is succesvol gestart!", + "worktime_easymode_pause_end": "Opmerking: Je pauze is succesvol beëindigd!", + "easymode_toggled": "Opmerking: Modus succesvol gewijzigd!", + "error": "Opmerking: Er is een fout opgetreden. Controleer het logbestand indien mogelijk.", + "statemismatch": "Fout: Beveiligingsfout", + "ldapauth": "Fout: LDAP-authenticatie mislukt.", + "ldapcreated": "Opmerking: Log opnieuw in. Je account is nu aangemaakt. (LDAP self-login toegestaan)", + "notification_not_found": "Fout: Notificatie niet gevonden." } diff --git a/api/v1/class/mode/mode.arbeit.inc.php b/api/v1/class/mode/mode.arbeit.inc.php index cd575c7..ee6e749 100644 --- a/api/v1/class/mode/mode.arbeit.inc.php +++ b/api/v1/class/mode/mode.arbeit.inc.php @@ -1,13 +1,15 @@ $value){ + foreach (Arbeitszeit::get_all_types() as $type => $value) { $data .= ""; } return $data; } - private static function get_normal_mode_html(){ + private static function get_normal_mode_html() + { $nodes = new Nodes; - if($nodes->checkNode("mode.inc", "get_normal_mode_html") == false){ + if ($nodes->checkNode("mode.inc", "get_normal_mode_html") == false) { return; } $i18n = new i18n; $loc = $i18n->loadLanguage(null, "mode/easymode"); $t = self::compute_html_worktime_types(); - $data = <<< DATA -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- -
-


{$loc["h_vacation"]}

-

{$loc["v_note"]}

- -
+ $data = << +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+ + +
+ +
+ + + +
+
+

+ +
{$loc["h_vacation"]} +

+
+
+

{$loc["v_note"]}

+ +
+
+ +
+
+

+ +
{$loc["h_sickness"]} +

+
+ +
-
-


{$loc["h_sickness"]}

- -
DATA; return $data; } - private static function get_easymode_html(){ + private static function get_easymode_html() + { $nodes = new Nodes; - if($nodes->checkNode("mode.inc", "get_easymode_html") == false){ + if ($nodes->checkNode("mode.inc", "get_easymode_html") == false) { return; } $i18n = new i18n; @@ -88,86 +132,96 @@ private static function get_easymode_html(){ $worktime = Arbeitszeit::get_worktime_by_id($active); - if($active === false){ + if ($active === false) { Exceptions::error_rep("No or multiple active easymode worktime entry found. Checking for multiple entries..."); - if(Arbeitszeit::fix_easymode_worktime($_SESSION["username"])){ + if (Arbeitszeit::fix_easymode_worktime($_SESSION["username"])) { self::get_easymode_html(); } - $data = <<< DATA + $data = <<An error occurred while checking for active easymode entries. Either a connection error to the database or you have multiple entries marked as active. If the problem persists, contact the system administrator!

Error-Code: DEM-CHK_FAIL_EM_ENY_AC

DATA; goto skip_to_output; - } elseif(!$worktime && $active === true){ + } elseif (!$worktime && $active === true) { Exceptions::error_rep("An error occurred while checking for active easymode entries. Please ask your administrator to remove the current active worktime entry! | Active worktime: " . $worktime); - $data = <<< DATA + $data = <<An error occurred while checking for active easymode entries. Please ask your administrator to remove the current active worktime entry!

DATA; - - } elseif($active == -1){ - $data = <<< DATA -
-

{$loc["easymode_enabled_note"]}

-
- - - -
-
- -
+ + } elseif ($active == -1) { + $data = << +

{$loc["easymode_enabled_note"]}

+ +
+ + + +
+
+ +


{$loc["h_vacation"]}

-

{$loc["v_note"]}

- -
+

{$loc["v_note"]}

+ + + + -
+


{$loc["h_sickness"]}

- -
+ + + +
DATA; } else { $worktimedata = Arbeitszeit::get_worktime_by_id($active); - if($worktimedata["pause_start"] == null){ - $data = <<< DATA -
-

{$loc["note_ps"]}

- ID: {$active} -
- - - - -
-
- DATA; - } elseif($worktimedata["pause_end"] == null){ - $data = <<< DATA -
-

{$loc["note_pe"]}

- ID: {$active} -
- - - - -
-
- DATA; + if ($worktimedata["pause_start"] == null) { + $data = << +

{$loc["note_ps"]}

+ ID: {$active} + +
+ + + + +
+ + +DATA; + } elseif ($worktimedata["pause_end"] == null) { + $data = << +

{$loc["note_pe"]}

+ ID: {$active} + +
+ + + + +
+ + +DATA; } else { - $data = <<< DATA -
-

{$loc["note_se"]}

- ID: {$active} -
- - - - -
-
+ $data = << +

{$loc["note_se"]}

+ ID: {$active} + +
+ + + + +
+ + DATA; } } diff --git a/api/v1/class/notifications/notifications.arbeit.inc.php b/api/v1/class/notifications/notifications.arbeit.inc.php index 479e9e9..906d515 100644 --- a/api/v1/class/notifications/notifications.arbeit.inc.php +++ b/api/v1/class/notifications/notifications.arbeit.inc.php @@ -125,10 +125,13 @@ public function get_notifications_html(){ $id = $row["id"]; $html = <<< DATA -
-

{$this->i18n["notifications_notify"]} $date

-

$location: $note | $date - $time

-
+ +
+

{$this->i18n["notifications_notify"]} $date

+

$location: $note | $date – $time

+
+
+ DATA; } diff --git a/api/v1/class/status/statusmessages.arbeit.inc.php b/api/v1/class/status/statusMessages.arbeit.inc.php similarity index 92% rename from api/v1/class/status/statusmessages.arbeit.inc.php rename to api/v1/class/status/statusMessages.arbeit.inc.php index eeabb6e..cd7bddd 100644 --- a/api/v1/class/status/statusmessages.arbeit.inc.php +++ b/api/v1/class/status/statusMessages.arbeit.inc.php @@ -79,7 +79,11 @@ public function message($id) { if (isset($this->messages[$id])) { Exceptions::error_rep("Status message with ID '$id' found.", 1, "N/A"); - return "
×" . $this->messages[$id] . "
"; + $type = $this->types[$id] ?? "info"; // z. B. "error", "warn", "info" + return "
+ × + " . $this->i18n()->sanitizeOutput($this->messages[$id]) . " +
"; } else { Exceptions::error_rep("Status message with ID '$id' not found.", 1, "N/A"); return null; diff --git a/assets/css/v8.css b/assets/css/v8.css new file mode 100644 index 0000000..db3a365 --- /dev/null +++ b/assets/css/v8.css @@ -0,0 +1,516 @@ +:root { + --primary: #00b894; + --bg: #121212; + --text: #dadfe1; + --card: #1e1e1e; + --radius: 12px; + --font-main: "Inter", sans-serif; + --font-mono: "JetBrains Mono", monospace; +} + +html, body { + margin: 0; + padding: 0; + font-family: var(--font-main); + background: var(--bg); + color: var(--text); + min-height: 100vh; + overflow-x: hidden; +} + +a { + color: var(--primary); + text-decoration: none; +} + +h1, h2, h3 { + font-weight: 600; +} + +input, button { + border-radius: var(--radius); + border: none; + padding: 0.75rem; + margin-top: 0.5rem; + font-family: var(--font-main); +} + +button { + background: var(--primary); + color: black; + cursor: pointer; + transition: background 0.3s; +} + +button:hover { + background: #00a37c; +} + +.card { + background-color: var(--card); + padding: 2rem; + border-radius: var(--radius); + box-shadow: 0 0 10px rgba(0,0,0,0.3); +} + +footer { + font-size: 0.85rem; + text-align: center; + padding: 2rem; + color: #888; +} + +.animated-bg { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: radial-gradient(var(--primary) 0.5px, transparent 0.5px); + background-size: 20px 20px; + opacity: 0.03; + z-index: -1; + animation: moveGrid 30s linear infinite; +} + +@keyframes moveGrid { + 0% { background-position: 0 0; } + 100% { background-position: 1000px 1000px; } +} + +.topnav { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + background: #1f1f1f; + padding: 0.75rem 1.5rem; + box-shadow: 0 2px 4px rgba(0,0,0,0.4); + font-size: 0.95rem; + border-bottom: 1px solid #333; +} + +.topnav a { + color: var(--text); + margin-right: 1rem; + text-decoration: none; + padding: 0.3rem 0.5rem; + transition: color 0.2s; +} + +.topnav a:hover { + color: var(--primary); +} + +.topnav .topnav-right { + display: flex; + align-items: center; + gap: 1rem; +} + +.user-label { + font-weight: bold; + font-family: var(--font-mono); + color: var(--primary); +} + +.nav-version { + font-size: 0.8rem; + color: red; + font-family: var(--font-mono); + margin-left: 1rem; +} + + +.status-message { + background-color: rgba(0, 184, 148, 0.15); + border-left: 4px solid var(--primary); + padding: 1rem 1.5rem; + margin-bottom: 1.5rem; + border-radius: var(--radius); + font-family: var(--font-mono); + position: relative; + animation: fadeIn 0.4s ease; + color: var(--text); +} + +.status-message.error { + background-color: rgba(231, 76, 60, 0.15); + border-left-color: #e74c3c; +} + +.status-message.warn { + background-color: rgba(241, 196, 15, 0.15); + border-left-color: #f1c40f; +} + +.status-message.info { + background-color: rgba(52, 152, 219, 0.15); + border-left-color: #3498db; +} + +.status-message .dismiss-button { + position: absolute; + top: 0.7rem; + right: 1rem; + background: none; + border: none; + color: #aaa; + font-size: 1.2rem; + cursor: pointer; + transition: color 0.2s ease; +} + +.status-message .dismiss-button:hover { + color: var(--primary); +} + +.status-message.dismissed { + opacity: 0; + pointer-events: none; + transition: opacity 0.3s ease; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(-5px); } + to { opacity: 1; transform: translateY(0); } +} + +.table-wrapper { + overflow-x: auto; + margin-top: 1rem; + border-radius: var(--radius); +} + +.v8-table { + width: 100%; + border-collapse: collapse; + font-size: 0.95rem; + font-family: var(--font-mono); + background-color: var(--card); + border: 1px solid #2c2c2c; +} + +.v8-table th, +.v8-table td { + padding: 0.75rem 1rem; + text-align: left; + border-bottom: 1px solid #333; +} + +.v8-table thead { + background-color: #1a1a1a; + color: var(--primary); + border-bottom: 2px solid var(--primary); +} + +.v8-table tr:hover { + background-color: rgba(0, 184, 148, 0.05); + transition: background 0.2s; +} + +.card h1, .card h2, .card h3 { + color: var(--primary); + margin-top: 1.5rem; +} + +.card p, .card li, .card ul, .card code { + line-height: 1.6; + font-size: 0.95rem; +} + +.card pre { + background-color: #222; + padding: 1rem; + border-radius: var(--radius); + overflow-x: auto; + margin-top: 1rem; +} + +/* Allgemeine Border-Klasse */ +.v8-bordered { + border: 1px solid #2d2d2d; + border-radius: var(--radius); + padding: 1.25rem; + background-color: var(--card); + box-shadow: inset 0 0 0 9999px rgba(255, 255, 255, 0.01); /* subtile Tiefe */ +} + +/* Optional für klarere Trennung */ +.v8-bordered.accent { + border-color: var(--primary); +} + +.v8-bordered.error { + border-color: #e74c3c; +} + +.v8-bordered.warn { + border-color: #f1c40f; +} + +.card ul, +.v8-bordered ul { + list-style: none; + padding-left: 0; + margin: 1rem 0; +} + +.card ul li, +.v8-bordered ul li { + position: relative; + padding-left: 1.5rem; + margin-bottom: 0.5rem; + font-size: 0.95rem; + line-height: 1.5; +} + +.card ul li::before, +.v8-bordered ul li::before { + content: "•"; + position: absolute; + left: 0; + color: var(--primary); + font-weight: bold; +} + + +.log-box { + background-color: var(--card); + max-height: 400px; + overflow-y: auto; +} + +.log-output { + font-family: var(--font-mono); + font-size: 0.85rem; + background-color: #1a1a1a; + padding: 1rem; + border-radius: var(--radius); + margin-top: 1rem; + white-space: pre-wrap; + word-break: break-word; + border: 1px solid #2a2a2a; + color: #ccc; + max-height: 300px; + overflow-y: auto; +} + +/* Optional Highlighting */ +.log-output .error, +.log-output .fail { + color: #e74c3c; + font-weight: bold; +} +.log-output .warn { + color: #f39c12; +} +.log-output .info { + color: #3498db; +} + +/* === v8 Animations === */ +@keyframes fadeSlideUp { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} +@keyframes glowPulse { + 0% { box-shadow: 0 0 0px rgba(255, 255, 255, 0); } + 50% { box-shadow: 0 0 10px rgba(255, 255, 255, 0.07); } + 100% { box-shadow: 0 0 0px rgba(255, 255, 255, 0); } +} + +/* Default fade-in for most visible elements */ +body > *:not(script):not(style):not(link) { + animation: fadeSlideUp 0.5s ease-out both; + animation-delay: 0.05s; +} + +/* Inputs, Buttons, Textareas */ +input, button, textarea, select { + transition: all 0.3s ease; + animation: fadeSlideUp 0.3s ease-out both; +} +input:hover, button:hover, textarea:hover, select:hover { + filter: brightness(1.05); +} +input:focus, textarea:focus, select:focus { + outline: none; + box-shadow: 0 0 0 2px var(--accent-glow, #4ae); +} + +/* Cards & Boxes */ +.box, .card { + animation: fadeSlideUp 0.4s ease-out both; + animation-delay: 0.1s; +} + +.v8-glow { + animation: glowPulse 3s ease-in-out infinite; +} + +footer, .footer { + animation: fadeSlideUp 0.6s ease-out both; + animation-delay: 0.4s; + opacity: 0.9; + padding: 1em; + text-align: center; + font-size: 0.9em; + transition: all 0.3s ease; + background-color: rgba(0, 0, 0, 0.05); + border-top: 1px solid rgba(255, 255, 255, 0.05); +} + +footer:hover, .footer:hover { + opacity: 1; + transform: translateY(-2px); + box-shadow: 0 0 8px rgba(255, 255, 255, 0.03); +} + +footer.glow-top { + position: relative; + overflow: hidden; + background-color: #111; +} + +footer.glow-top::before { + content: ""; + position: absolute; + top: 0; + left: -50%; + width: 200%; + height: 3px; /* nur ein dünner Streifen oben */ + background: linear-gradient( + 90deg, + transparent 0%, + rgba(255,255,255,0.3) 50%, + transparent 100% + ); + animation: slideGlow 4s linear infinite; + pointer-events: none; +} + +@keyframes slideGlow { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } +} + +.notification-banner { + background: #111; + border-bottom: 2px solid #444; + padding: 12px 20px; + animation: fadeSlideIn 0.6s ease-out; + box-shadow: 0 2px 10px rgba(0,0,0,0.2); + color: white; +} + +.notification-banner:hover { + background: #1a1a1a; +} + +.notification-banner h2 { + margin: 0; + font-size: 1.2em; +} + +.notification-banner p { + margin: 5px 0 0; + font-size: 0.9em; +} + +.notification-banner span { + color: #aaa; + font-size: 0.85em; +} + +.notification-banner a { + color: inherit; + text-decoration: none; + display: block; +} + +@keyframes fadeSlideIn { + from { + opacity: 0; + transform: translateY(-15px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +table { + border-collapse: collapse; + width: 100%; + background-color: #111; + color: #fff; + font-family: 'Roboto', sans-serif; + margin-bottom: 20px; +} + +th, td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #444; +} + +tr:hover { + background-color: #1a1a1a; + transition: background-color 0.2s ease-in-out; +} + + +a:hover { + text-decoration: underline; +} + +td:first-child { + white-space: nowrap; +} + +.form-row { + display: flex; + align-items: center; + gap: 1rem; + margin-bottom: 1rem; + flex-wrap: wrap; +} + +.form-row label { + min-width: 160px; + font-weight: 500; +} + +.form-row input, +.form-row select { + flex: 1; + min-width: 200px; +} + +.form-container { + max-width: 800px; + margin: auto; +} + +.form-row select { + flex: 1; + min-width: 220px; +} + +.card form .button { + transition: background 0.2s ease; +} + +.card form .button:hover { + background: var(--accent-dark, #333); +} diff --git a/assets/gui/standard_footer.php b/assets/gui/standard_footer.php new file mode 100644 index 0000000..860b18d --- /dev/null +++ b/assets/gui/standard_footer.php @@ -0,0 +1,22 @@ +get_app_ini(); +$base_url = $ini["general"]["base_url"]; +$name = $ini["general"]["app_name"]; + +$locale = locale_accept_from_http($_SERVER["HTTP_ACCEPT_LANGUAGE"]); +$lang = $i18n->loadLanguage(null, "footer"); +?> + +
+ OpenDucks IT © — + · + "> +
\ No newline at end of file diff --git a/assets/gui/standard_nav.php b/assets/gui/standard_nav.php index 920b387..393ee8f 100644 --- a/assets/gui/standard_nav.php +++ b/assets/gui/standard_nav.php @@ -14,25 +14,26 @@ $locale = locale_accept_from_http($_SERVER["HTTP_ACCEPT_LANGUAGE"]); $lang = $i18n->loadLanguage(null, "nav"); ?> - - \ No newline at end of file + + diff --git a/composer.json b/composer.json index 28c4e10..9c0b299 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "TimeTrack is a PHP-written time recording tool for small businesses", "type": "software", "license": "GNU GPL", - "version": "7.13.1", + "version": "8.0", "authors": [ { "name": "Ente", diff --git a/errors/403.html b/errors/403.html index 19662c5..fe8b83c 100644 --- a/errors/403.html +++ b/errors/403.html @@ -1,20 +1,25 @@ + + + + 403 | Unauthorized + + + + + +
- - - 403 | Unauthorized - - - - +
+
+

403 | Unauthorized

+

Access to this resource has been denied

+

Either you do not have the necessary permissions or the resource does not exist anymore.

+

Please check back later. Thank you!

+
+

Return to Home

+
- -

403 | This request has been denied

- -
-

Your request to access this ressource has been denied.

-

Either you do not have the permissions to access the resource or it simply does not exist (anymore).

-

Please check back later, thank you!

-
- - \ No newline at end of file + + + diff --git a/errors/500.php b/errors/500.php index 1ff6035..a62eb03 100644 --- a/errors/500.php +++ b/errors/500.php @@ -8,26 +8,33 @@ ?> + + + + 500 | Internal Server Error + + + + + +
- - - 500 | Internal Server Error - - - - +
+
+

500 | Internal Server Error

+

A critical error occurred

+

Error Code:

+

Message:

+

Stack Trace:

+
+
+      
+
+ +
+
+
- -

500 | Internal Server Error

- -
-

A critical error occurred - Code:

-

Message:

-

Trace (if available):

-                
-            
- - -
- - \ No newline at end of file + + + diff --git a/errors/503.html b/errors/503.html index 42d4488..df13bc1 100644 --- a/errors/503.html +++ b/errors/503.html @@ -1,20 +1,24 @@ + + + + 503 | Service not available + + + + + +
- - - 503 | Service not available - - - - +
+
+

503 | Service not available

+

Maintenance or a system failure

+

This service is currently not available due to scheduled maintenance or an unexpected issue.

+

Please check back later – thank you for your patience!

+
+
- -

503 | Service not available

- -
-

Maintenance or a System failure

-

This service is currently not available either to a maintenance or a system failure

-

Please check back later, thank you!

-
- - \ No newline at end of file + + + diff --git a/suite/actions/auth/reset.php b/suite/actions/auth/reset.php index 81c3677..b0977a2 100644 --- a/suite/actions/auth/reset.php +++ b/suite/actions/auth/reset.php @@ -43,23 +43,34 @@ } } ?> + - - - Passwort zurücksetzen - Neues Passwort festlegen | <?php echo $ini["general"]["app_name"]; ?> - - - - + + + + Passwort zurücksetzen | <?= $ini["general"]["app_name"]; ?> + + + + + +
+ +
+
+

🔐

+

+ +
"> + " required> + "> + +
+
+
-
" method="POST"> -

Password forgot?

-

Please enter your new password in the below's form.

-

You will recieve a email after submiting your new password.

- - " hidden> -
- -
- - \ No newline at end of file + + + diff --git a/suite/admin/notifications/edit.php b/suite/admin/notifications/edit.php index 1a5ff74..45ac113 100644 --- a/suite/admin/notifications/edit.php +++ b/suite/admin/notifications/edit.php @@ -16,28 +16,44 @@ $data = $arbeit->notifications()->get_notifications_entry($id); ?> - - - <?php echo $language["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - - -

-
-
- "> -

- "> -

- "> -

- "> -

- + + + + <?= $language["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + +
+

+ +
+ + + " required> + + + " required> + + + " placeholder="Ort" required> + + + + +
- - \ No newline at end of file +
+ + + + diff --git a/suite/admin/users/edit.php b/suite/admin/users/edit.php index 1778004..4b239b3 100644 --- a/suite/admin/users/edit.php +++ b/suite/admin/users/edit.php @@ -17,42 +17,80 @@ ?> - - - <?php echo $language["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - - -

-
-

-

- - - - - - - - benutzer()->get_all_users_html(); ?> + + + + <?= $language["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

+ + +
+

+
+ + +
+

+
+
+ + + + + + + + + + benutzer()->get_all_users_html(); ?> +
+
+
-

-
- -
- -
- -
- -
- - -
+ +
+

+ +
+ + +
+ + +
+ + +
+ + +
+ +
+ +
- - \ No newline at end of file + + + + + diff --git a/suite/admin/users/settings.php b/suite/admin/users/settings.php index a4a7d42..1711a91 100644 --- a/suite/admin/users/settings.php +++ b/suite/admin/users/settings.php @@ -15,11 +15,13 @@ -

{$language["log_title"]}

+
+

{$language["log_title"]}

{$language["log_p1"]}

-
{$log_contents}
+
{$log_contents}
+
+ DAT; ?> \ No newline at end of file diff --git a/suite/admin/worktime/all.php b/suite/admin/worktime/all.php index 746bb75..b97cc1a 100644 --- a/suite/admin/worktime/all.php +++ b/suite/admin/worktime/all.php @@ -19,40 +19,66 @@ } ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

|

-
-

-

-
" method="POST"> -

- - -
- + + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

|

+ +
+

+

+ + " style="margin-top: 1rem;"> +

+ + + + + + + + +
- - - - - - - - - - - - - get_specific_worktime_html($date_month, $date_year) ?> -
+
+
+ + + + + + + + + + + + + + + get_specific_worktime_html($date_month, $date_year); ?> + +
+
- - \ No newline at end of file +
+ + + + diff --git a/suite/admin/worktime/sick/all.php b/suite/admin/worktime/sick/all.php index f5a558a..bc47ac9 100644 --- a/suite/admin/worktime/sick/all.php +++ b/suite/admin/worktime/sick/all.php @@ -20,29 +20,47 @@ } ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

|

-
-

-

- - - - - - - - - - sickness()->display_sickness_all(); ?> -
+ + + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

|

+ +
+

+

+ +
+ + + + + + + + + + + sickness()->display_sickness_all(); ?> + +
+
- - \ No newline at end of file +
+ + + + diff --git a/suite/admin/worktime/vacation/all.php b/suite/admin/worktime/vacation/all.php index 082a8f6..b980c7a 100644 --- a/suite/admin/worktime/vacation/all.php +++ b/suite/admin/worktime/vacation/all.php @@ -19,29 +19,46 @@ } ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

|

-
-

-

+ + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + - - - - - - - + + + - vacation()->display_vacation_all() ?> -
+ +
+ + + +
+

|

+ +
+

+

+ +
+ + + + + + + + + + + vacation()->display_vacation_all(); ?> + +
+
- - \ No newline at end of file +
+ + + + diff --git a/suite/forgot_password.php b/suite/forgot_password.php index 0f34e7b..212a659 100644 --- a/suite/forgot_password.php +++ b/suite/forgot_password.php @@ -6,20 +6,36 @@ $loc = $arbeitszeit->i18n()->loadLanguage(NULL, "reset"); ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - + + + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + + +
+ +
+
+

+

- -

-

- -
- + + + +
- - \ No newline at end of file +
+ + + + + diff --git a/suite/index.php b/suite/index.php index 076c1de..cd3f178 100644 --- a/suite/index.php +++ b/suite/index.php @@ -10,25 +10,45 @@ $language = $arbeit->i18n()->loadLanguage(NULL, "index"); ?> - - - <?php echo $language["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - - - - notifications()->get_notifications_html(); ?> - -

|

-
-

- - mode()->check($_SESSION["username"]); ?> + + + + <?= $language["title"] ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + + + + + +
+ + + notifications()->get_notifications_html(); ?> + + + + +
+

|

+ +
+

+ mode()->check($_SESSION["username"]); ?>
-

">

- + +

+ + "> +

+
+ + + + diff --git a/suite/login.php b/suite/login.php index bddbdab..b30eb3c 100644 --- a/suite/login.php +++ b/suite/login.php @@ -1,4 +1,5 @@ get_app_ini(); $base_url = $ini["general"]["base_url"]; $language = $arbeit->i18n()->loadLanguage(NULL, "login"); + ?> - - - <?php echo $language["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - -

-
- "> -

- "> -
- -
- -
-
- + + + <?= $language["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + +
+ +
+
+

+
+ " required> + " required>
+ + +
+ read_plugin_configuration("nfclogin")["enabled"] == "true"){ require_once dirname(__DIR__, 1) . "/api/v1/class/plugins/plugins/nfclogin/src/Main.php"; $nfc = new NFClogin; echo "
" . $nfc->nfcloginHtml() . "
"; } + ?> +
+

+
+ - ?> - - + \ No newline at end of file diff --git a/suite/notifications/all.php b/suite/notifications/all.php index 324d08c..f4fa79f 100644 --- a/suite/notifications/all.php +++ b/suite/notifications/all.php @@ -12,49 +12,74 @@ } ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

-
-

-

-

-

+ + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

+ + +
+

+

+

+

-
+ +
- " name="datum" required> -
- " name="uhrzeit" required> -
- -
- + + " name="datum" required> + + + " name="uhrzeit" required> + + +
- + + + +
-
-

:

- - - - - - - - - - notifications()->get_notifications_edit_html(); ?> -
- - - -
+ +
+

:

+ +
+ + + + + + + + + + + + notifications()->get_notifications_edit_html(); ?> + +
- - - -
+
- - \ No newline at end of file +
+ + + + diff --git a/suite/notifications/view.php b/suite/notifications/view.php index c0c82e4..d443620 100644 --- a/suite/notifications/view.php +++ b/suite/notifications/view.php @@ -16,31 +16,48 @@ $iid = htmlspecialchars($id); ?> - - - <?php echo $loc["title"] ?> | <?php echo $arbeit->get_app_ini()["general"]["app_name"]; ?> - - - - - - - -

-
-

:

-

:

-

:

-

:

+ + + + <?= $loc["title"]; ?> | <?= $arbeit->get_app_ini()["general"]["app_name"]; ?> + + + + + + + + + + +
+ + + +
+

+ +
+

:

+

:

+

:

+

:

benutzer()->is_admin($arbeit->benutzer()->get_user($_SESSION["username"]))){ - echo <<< DATA - {$loc["a_delete"]} | {$loc["a_delete_note"]} - DATA; + if ($arbeit->benutzer()->is_admin($arbeit->benutzer()->get_user($_SESSION["username"]))) { + echo << + + 🗑️ {$loc["a_delete"]} + +

{$loc["a_delete_note"]}

+
+ HTML; } ?> - - \ No newline at end of file + + + + + diff --git a/suite/plugins/index.php b/suite/plugins/index.php index 3bc550f..22945eb 100644 --- a/suite/plugins/index.php +++ b/suite/plugins/index.php @@ -8,31 +8,61 @@ $pl = new PluginBuilder(); ?> - - - Plugin Hub | <?php echo $arbeit->get_app_ini()["general"]["app_name"]; ?> - - - - - -
- load_plugin_view($arbeit->i18n()->sanitizeOutput($_GET["pn"]), $arbeit->i18n()->sanitizeOutput($_GET["p_view"])); - if($f == false){ - echo "

An error occurred while getting the requested view! Probably it simply does not exist or could not be imported. More information can be found within the log.

"; - print_r($_GET); - } - - e: - ?> - + + + + + Plugin Hub | <?= $arbeit->get_app_ini()["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

🧩 Plugin Hub

+ +
+ + + + + \ No newline at end of file diff --git a/suite/privacy.php b/suite/privacy.php new file mode 100644 index 0000000..43c58f7 --- /dev/null +++ b/suite/privacy.php @@ -0,0 +1,48 @@ +get_app_ini(); +$loc = $arbeitszeit->i18n()->loadLanguage(NULL, "privacy"); +?> + + + + + + <?= $loc["h1"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + +
+ +
+
+

+

+
+
    +
  • +
  • +
  • +
+
+ +
+

+


+ "> + + +

+
+
+ + + + + + diff --git a/suite/users/changes.php b/suite/users/changes.php index 6e22a80..f5733ea 100644 --- a/suite/users/changes.php +++ b/suite/users/changes.php @@ -10,27 +10,38 @@ $data = $arbeit->benutzer()->get_user($_SESSION["username"]); ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - - - - notifications()->get_notifications_html() ?> - -

|

-
-

- text(file_get_contents($_SERVER["DOCUMENT_ROOT"] . "/CHANGELOG.md")); + + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + + + + +
+ notifications()->get_notifications_html(); ?> + + +
+

|

+ +
+

+ text(file_get_contents($_SERVER["DOCUMENT_ROOT"] . "/CHANGELOG.md")); ?>
- - \ No newline at end of file +
+ + + + diff --git a/suite/users/settings.php b/suite/users/settings.php index 52a9abe..87ac1b4 100644 --- a/suite/users/settings.php +++ b/suite/users/settings.php @@ -11,42 +11,73 @@ $data = $arbeit->benutzer()->get_user($_SESSION["username"]); ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

-
-

:

-

:

-

:

-

:

-

:

- -
- -

-

/suite/users/changes.php">

- benutzer()->is_admin($arbeit->benutzer()->get_user($_SESSION["username"]))){ echo "

YOU ARE USING AN ADMIN ACCOUNT!

"; } ?> -
- Status - Easymode: " . $arbeit->get_easymode_status($_SESSION["username"]) . "

"; - ?> -
-
- -
-
- -

-

: ">

-

|

-

TimeTrack Version: getTimeTrackVersion(); ?> | API Version: getToilVersion(); ?>

- benutzer()->is_admin($arbeit->benutzer()->get_user($_SESSION["username"]))){ require_once "../admin/users/settings.php"; } ?> + + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

+ +
+

:

+

:

+

:

+

:

+

:

+ +
+ +

+

+ + /suite/users/changes.php"> + +

+ + benutzer()->is_admin($arbeit->benutzer()->get_user($_SESSION["username"]))): ?> +

+ ⚠️ YOU ARE USING AN ADMIN ACCOUNT! +

+ + +

Status – Easymode: get_easymode_status($_SESSION["username"]); ?>

+ +
+ +
+
+ +

+
+

: + "> +

+

+ | + +

+

TimeTrack Version: getTimeTrackVersion(); ?> | API Version: getToilVersion(); ?>

- + + benutzer()->is_admin($arbeit->benutzer()->get_user($_SESSION["username"]))): ?> +
+ +
+ +
+ + + + diff --git a/suite/worktime/all.php b/suite/worktime/all.php index ee0c431..2a1616c 100644 --- a/suite/worktime/all.php +++ b/suite/worktime/all.php @@ -16,31 +16,49 @@ } ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

|

-
-

+ + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + - - - - - - - - - - + +
- get_employee_worktime_html($_SESSION["username"]); ?> -
+ + +
+

|

+ +
+

+ +
+ + + + + + + + + + + + + + get_employee_worktime_html($_SESSION["username"]); ?> + +
+
- - \ No newline at end of file +
+ + + + + diff --git a/suite/worktime/sick/index.php b/suite/worktime/sick/index.php index 47998b6..e74be6b 100644 --- a/suite/worktime/sick/index.php +++ b/suite/worktime/sick/index.php @@ -8,28 +8,45 @@ $arbeit->auth()->login_validation(); ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

|

-
-

-
-

- -
-

:

- -
- -
-
-

+ + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

|

+ +
+

+ +
+

+ + +

:

+ + + +
+ +

+ +

- - \ No newline at end of file +
+ + + + diff --git a/suite/worktime/vacation/index.php b/suite/worktime/vacation/index.php index 36550b5..51ec500 100644 --- a/suite/worktime/vacation/index.php +++ b/suite/worktime/vacation/index.php @@ -10,28 +10,45 @@ $arbeit->auth()->login_validation(); ?> - - - <?php echo $loc["title"] ?> | <?php echo $ini["general"]["app_name"]; ?> - - - - - -

|

-
-

-
-

- -
-

:

- -
- -
-
-

+ + + + <?= $loc["title"]; ?> | <?= $ini["general"]["app_name"]; ?> + + + + + + + +
+ + + +
+

|

+ +
+

+ +
+

+ + +

:

+ + + +
+ +

+ +

- - \ No newline at end of file +
+ + + +