Compare commits

...
56 Commits
Author SHA1 Message Date
Tower d6232f6418 Merge branch 'DEV' into LIVE 2026-07-05 19:13:32 +02:00
Tower 878b691ab1 Merge branch 'main' into DEV 2026-07-05 19:13:20 +02:00
Tower caf62ea701 fix logout 2026-07-05 19:13:08 +02:00
Tower a7368eb18f Merge branch 'DEV' into LIVE 2026-07-05 19:07:18 +02:00
Tower 38adea29cf Merge branch 'main' into DEV 2026-07-05 19:07:07 +02:00
Tower 82fe6e85d8 mobile css fixes 2026-07-05 19:06:04 +02:00
Tower f6fbc8404c Merge branch 'DEV' into LIVE 2026-07-01 20:10:15 +02:00
Tower e45fecf6ff Merge branch 'main' into DEV 2026-07-01 20:09:58 +02:00
Tower 40c26e625b add new vergabe service for papa 2026-07-01 16:39:56 +02:00
Bruno Eckhardt 5dce558640 Merge branch 'DEV' into LIVE 2026-05-20 12:33:38 +02:00
Bruno Eckhardt ffb6f38af0 Merge branch 'main' into DEV 2026-05-20 12:33:26 +02:00
Bruno Eckhardt 2901a5e362 add create and save new api token 2026-05-20 12:31:20 +02:00
Tower 2231d65465 fixed user_rights control, when new service is created rights are setted for bruno 2026-05-19 21:55:55 +02:00
Tower 4558a717fa new rightscontroller for new service creating 2026-05-19 21:55:14 +02:00
Tower 3e54b917ca Merge branch 'DEV' into LIVE 2026-05-19 19:50:24 +02:00
Tower 4756d0586f Merge branch 'main' into DEV 2026-05-19 19:50:14 +02:00
Bruno Eckhardt 86a1eecd8d Merge branch 'DEV' into LIVE 2026-05-19 10:38:34 +02:00
Bruno Eckhardt 9dcf0ced19 Merge branch 'main' into DEV 2026-05-19 10:38:20 +02:00
Bruno Eckhardt c05f9f721c Merge branch 'DEV' into LIVE 2026-05-19 10:11:25 +02:00
Bruno Eckhardt 04c89fb676 Merge branch 'main' into DEV 2026-05-19 10:11:14 +02:00
Bruno Eckhardt 5160bbc5a5 Merge branch 'DEV' into LIVE 2026-05-19 07:17:41 +02:00
Bruno Eckhardt e9550b9a05 Merge branch 'main' into DEV 2026-05-19 07:17:31 +02:00
Bruno Eckhardt c5aabcf5d1 Merge branch 'DEV' into LIVE 2026-05-11 14:17:44 +02:00
Bruno Eckhardt e13ac6c503 Merge branch 'main' into DEV 2026-05-11 14:17:15 +02:00
Bruno Eckhardt bcaaac8a19 Merge branch 'DEV' into LIVE 2026-05-11 13:18:35 +02:00
Bruno Eckhardt e2ee377e35 Merge branch 'main' into DEV 2026-05-11 13:18:23 +02:00
Bruno Eckhardt 57813e3309 Merge branch 'DEV' into LIVE 2026-05-11 13:14:55 +02:00
Bruno Eckhardt 9eb06a3a16 Merge branch 'main' into DEV 2026-05-11 13:14:46 +02:00
Bruno Eckhardt a920fe99a8 Merge branch 'DEV' into LIVE 2026-05-11 13:09:39 +02:00
Bruno Eckhardt 0776ae8dd0 Merge branch 'main' into DEV 2026-05-11 13:09:30 +02:00
Bruno Eckhardt 21fa9145cb Merge branch 'DEV' into LIVE 2026-05-11 12:55:32 +02:00
Bruno Eckhardt c350f4c776 Merge branch 'main' into DEV 2026-05-11 12:55:21 +02:00
Tower fd5f3093c6 Merge branch 'DEV' into LIVE 2026-04-10 21:44:08 +02:00
Tower c47723ec00 Merge branch 'main' into DEV 2026-04-10 21:43:42 +02:00
Tower 737ea6e962 Merge branch 'DEV' into LIVE 2026-04-08 16:54:39 +02:00
Tower 0e5cdcd725 Merge branch 'main' into DEV 2026-04-08 16:54:24 +02:00
Bruno Eckhardt 739fda06e7 db fix 2026-04-08 16:36:53 +02:00
Bruno Eckhardt 3d170a38d8 Merge branch 'main' into DEV 2026-04-08 16:35:47 +02:00
Bruno Eckhardt 03febbc877 fix 2026-03-27 06:57:33 +01:00
Bruno Eckhardt bdc41bbd48 Merge branch 'main' into LIVE 2026-03-27 06:56:36 +01:00
Bruno Eckhardt 1f3e8228d1 fix 2026-03-26 08:13:59 +01:00
Bruno Eckhardt dccec7642b Merge branch 'DEV' into LIVE
# Conflicts:
#	WEBROOT/controller/DatabaseConnect.php
2026-03-26 08:13:20 +01:00
Bruno Eckhardt 6f74a11a79 Merge branch 'main' into DEV 2026-03-26 08:11:59 +01:00
Bruno Eckhardt ea51b1808a Merge branch 'main' into DEV 2026-03-25 08:47:16 +01:00
Bruno Eckhardt 2eacb68fd6 Merge branch 'main' into LIVE 2026-03-25 08:47:05 +01:00
Bruno Eckhardt 8c53e850c1 Merge branch 'main' into LIVE 2026-03-25 07:46:45 +01:00
Bruno Eckhardt 0d9b9e7b07 Merge branch 'main' into DEV 2026-03-25 07:46:23 +01:00
Bruno Eckhardt 9b6060d39f Merge branch 'main' into DEV 2026-03-23 15:45:43 +01:00
Bruno Eckhardt 01d6c69b3e Merge branch 'main' into LIVE 2026-03-23 15:45:26 +01:00
Bruno Eckhardt 7c94592b2c Merge branch 'main' into LIVE 2026-03-23 10:48:08 +01:00
Bruno Eckhardt 883a1fd76f Merge branch 'main' into DEV 2026-03-23 10:37:03 +01:00
Bruno Eckhardt dd08ec793a Merge branch 'main' into DEV 2026-03-23 08:58:33 +01:00
Bruno Eckhardt 24799dffbe Merge branch 'main' into LIVE 2026-03-23 08:58:26 +01:00
Bruno Eckhardt 34f464f442 dev db 2026-03-23 08:20:25 +01:00
Bruno Eckhardt d1464d874f Merge branch 'main' into LIVE 2026-03-23 08:19:28 +01:00
Bruno Eckhardt 8f5a616dd8 live db 2026-03-23 08:18:54 +01:00
8 changed files with 338 additions and 1 deletions

No files matched your search

+7
View File
@@ -17,6 +17,7 @@ $serviceGroups = array (
array (
0 => 'home_info',
1 => 'links',
2 => 'vergabe'
),
),
'Ausbildung' =>
@@ -77,6 +78,12 @@ $services = array (
'active' => true,
'adminOnly' => false,
),
'vergabe' =>
array (
'name' => 'Vergabe',
'active' => true,
'adminOnly' => false,
),
'print_static' =>
array (
'name' => 'Berichte Drucken',
+29
View File
@@ -1,5 +1,7 @@
<?php
require(__DIR__ . '/DatabaseController.php');
class ApiController {
/**
@@ -99,4 +101,31 @@ class ApiController {
'{"status": "success"}',
);
}
/**
* create new api token
*
*/
private function createToken() {
return bin2hex(random_bytes(32));
}
/**
* save created api token
*
* @return bool
*/
public function saveToken() {
try {
DatabaseInsert(
"API_Credentials",
"TOKEN, BENUTZER",
$this->createToken(),
"API-User"
);
} catch (Exception $error) {
return false;
}
return true;
}
}
+1 -1
View File
@@ -44,7 +44,7 @@ function db_connect() {
]
];
$enviroment = 'vpn';
$enviroment = 'live';
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
+87
View File
@@ -0,0 +1,87 @@
<?php
require_once(__DIR__ . '/DatabaseController.php');
class RightsController {
/**
* save new site with sitename
*
* @param string $sitename
*/
private function saveSite($sitename) {
DatabaseInsert(
"Backend_Seiten",
"DATEINAME",
$sitename
);
}
/**
* get site id by sitename
*
* @param string $sitename
* @return int
*/
private function getSiteID($sitename) {
$id = DatabaseShow(
"Backend_Seiten",
"ID",
"DATEINAME = ?",
$sitename
);
return $id[0]['ID'];
}
/**
* get user id
*
* @param string $name
* @param string $lastname
* @return int
*/
private function getUserID($name, $lastname) {
$id = DatabaseShow(
"Benutzer",
"ID",
"NAME = ? AND NACHNAME = ?",
$name,
$lastname
);
return $id[0]['ID'];
}
/**
* Rights Handler for saving default user is Bruno
*
* @param string $sitename
* @param string $name
* @param string $lastname
* @return string
*/
public function RightsHandler($sitename, $name = 'Bruno', $lastname = 'Eckhardt') {
try {
$sitename = strtolower($sitename);
$this->saveSite($sitename);
DatabaseInsert(
"Benutzer_Berechtigungen",
"BENUTZER_ID, SEITEN_ID",
$this->getUserID($name, $lastname),
$this->getSiteID($sitename)
);
} catch (Exception $error) {
return json_encode(
[
"status" => "failed",
"error" => $error->getMessage()
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
);
}
return json_encode(
[
"status" => "success",
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
);
}
}
+3
View File
@@ -0,0 +1,3 @@
<?php
session_destroy();
+4
View File
@@ -1,5 +1,8 @@
<?php
include_once(__DIR__ . '/../controller/RightsController.php');
include_once(__DIR__ . '/../config.php');
$configFile = 'config.php';
$backupDir = 'config_backups';
@@ -47,6 +50,7 @@ if (isset($_POST['save']) && ($_SESSION['logged_in'] ?? false)) {
$serviceToGroupMapping[$s['targetGroup']][] = $finalId;
}
}
(new RightsController())->RightsHandler($s['name']);
}
$newServiceGroups = [];
+60
View File
@@ -0,0 +1,60 @@
<?php
include_once __DIR__ . '/../controller/DatabaseController.php';
include_once __DIR__ . '/../controller/RoutesController.php';
$conn = db_connect();
$view = $_GET['view'] ?? 'show';
$selectedService = $_GET['service'] ?? null;
// --- LOGIK: Überstunden-Eintrag (Abbau) speichern ---
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_entry'])) {
$was = $_POST['was'];
$wer = $_POST['wer'];
$wann = $_POST['wann'];
$rueckgabe = $_POST['rueckgabe'];
DatabaseInsert(
"Vergabe",
"WAS, WER, WANN, RUECKGABE",
$was,
$wer,
$wann,
$rueckgabe
);
redirectToWebsite((new getSpecificData())->getReferer());
exit;
}
?>
<div class="arbeitsberichte-wrapper">
<div class="vergabe-form">
<form method="POST" class="vergabe-grid">
<div class="form-group">
<label>Wann ausgeliehen</label>
<input type="date" name="wann" value="<?= date('Y-m-d') ?>" required>
</div>
<div class="form-group">
<label>Rückgabe</label>
<input type="date" name="rueckgabe" value="<?= date('Y-m-d') ?>" required>
</div>
<div class="form-group">
<label>An wen</label>
<input type="text" name="wer" placeholder="Name eingeben" required>
</div>
<div class="form-group">
<label>Was</label>
<input type="text" name="was" placeholder="Gegenstand eingeben" required>
</div>
<button type="submit" name="add_entry" class="btn-submit-vergabe">
💾 Speichern
</button>
</form>
</div>
</div>
+147
View File
@@ -1071,3 +1071,150 @@ select {
body.dark-mode select {
background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg fill='%23ccc' height='20' viewBox='0 0 20 20' width='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 7l5 5 5-5z'/%3E%3C/svg%3E");
}
/* ===== Vergabe Formular ===== */
.vergabe-form {
background: var(--card-bg);
border: 1px solid var(--card-border);
border-left: 5px solid var(--btn-bg);
border-radius: 10px;
padding: 20px;
margin-bottom: 25px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05);
}
/* Desktop-First Grid Layout */
.vergabe-grid {
display: grid;
/* Nutzt minmax, damit die Datumsfelder auf kleineren Desktop-Monitoren nicht zerquetschen */
grid-template-columns: minmax(140px, 1fr) minmax(140px, 1fr) 1.3fr 2fr auto;
gap: 15px;
align-items: end;
}
.vergabe-grid .form-group {
margin: 0;
}
.vergabe-grid input,
.btn-submit-vergabe {
width: 100%;
/* Wichtig für Responsiveness */
padding: 10px 16px;
font-size: 15px;
border-radius: 5px;
box-sizing: border-box;
}
body.dark-mode input[type="date"] {
color-scheme: dark;
}
/* Dedizierter Speicher-Button Style */
.btn-submit-vergabe {
background: var(--btn-add-bg);
color: white;
border: none;
font-weight: 600;
cursor: pointer;
height: 43px;
/* Gleicht die Höhe der Inputs inklusive Padding/Border perfekt aus */
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s ease, transform 0.1s ease;
}
.btn-submit-vergabe:hover {
opacity: 0.9;
transform: translateY(-1px);
}
.btn-submit-vergabe:active {
transform: scale(0.98);
}
/* ===== Mobile Optimierung (Tablets & Smartphones) ===== */
@media (max-width: 1024px) {
.vergabe-grid {
/* Schaltet auf Mobilgeräten in eine saubere 1-spaltige Liste um */
grid-template-columns: 1fr;
gap: 12px;
/* Schafft vertikalen Abstand zwischen den Feldern */
}
.btn-submit-vergabe {
margin-top: 5px;
height: 48px;
/* Größere Touch-Fläche für Smartphones */
font-size: 1rem;
}
}
/* ===== Globale Mobile Anpassungen ===== */
@media (max-width: 768px) {
/* 1. Haupt-Layout untereinander brechen lassen */
.main {
flex-direction: column;
height: calc(100vh - 60px);
/* Behält die feste Gesamthöhe bei */
overflow-y: auto;
/* Erlaubt das Scrollen der gesamten Seite falls nötig */
}
/* 2. Sidebar nimmt volle Breite ein und passt sich dem Inhalt an */
.sidebar {
width: 100%;
height: auto;
/* Keine feste Höhe mehr auf Mobile */
border-right: none;
border-bottom: 1px solid #333;
/* Trennlinie nach unten statt nach rechts */
overflow-y: visible;
/* Scrollbar hier deaktivieren */
}
/* 3. Inhaltsbereich nimmt den Rest des Platzes ein */
.content {
width: 100%;
height: auto;
overflow-y: visible;
/* Verhindert doppelte Scrollbalken */
padding: 15px 10px;
}
/* 4. Das Vergabe-Formular bricht sauber in eine Spalte um */
.vergabe-grid {
grid-template-columns: 1fr !important;
/* Erzwingt eine Spalte */
gap: 12px;
}
/* 5. Inputs und Buttons nehmen die volle Breite der Box ein */
.vergabe-grid input,
.btn-submit-vergabe,
.vergabe-grid button {
width: 100% !important;
box-sizing: border-box;
}
/* Optional: Header-Buttons (Logout / Light Mode) für Mobile optimieren, falls sie überlappen */
#darkModeToggle,
#logoutButton {
position: static;
/* Entfernt absolute Positionierung im mobilen Header */
margin: 5px;
padding: 6px 12px;
font-size: 0.9rem;
}
header {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
padding: 10px;
height: auto;
}
}