Docker-Images bauen und veröffentlichen / build (, omsorgCore/Dockerfile, omsorgcore) (push) Successful in 16s
Docker-Images bauen und veröffentlichen / build (, omsorgWeb/Dockerfile, omsorgweb) (push) Successful in 5s
Docker-Images bauen und veröffentlichen / build (, omsorgapp/Dockerfile, omsorgapp) (push) Successful in 19s
- Facility: TravelCostMode (Pauschale/ProKilometer) + TravelCostPerKm, alongside the existing flat rate; fixes FacilityService.UpdateAsync silently dropping all Konditionen fields on update. - New EmployeeFacilityDistance (Mitarbeiter x Einrichtung -> km) with full office-side CRUD in omsorgapp, plus a self-service endpoint/UI so field staff can maintain their own commute distance via OMSORG Connect (new ModuleType.EmployeeFacilityDistances, Own-scope, no Facilities access needed). - Roles can now be deleted (blocked with a 409 while still assigned to a user). - Fix employeesApi.js missing the Date-object conversion for dateOfBirth/entryDate/ exitDate that crashed employee creation whenever a date was filled in; add a clear/remove control for those date fields. - Requirements: flesh out FR-REC-3 with a staged Akquise cadence, add FR-REC-5/6 for CRM feature scope and success metrics. - Regenerate api-client-ts and api-client-php for all of the above. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
78 lines
2.5 KiB
PHP
78 lines
2.5 KiB
PHP
<?php
|
|
// Minimale Hülle für dieses Milestone - nur Dashboard/Einstellungen im Nav, keine
|
|
// Admin-Sichtbarkeit (Connect hat kategorisch keine Admin-Oberfläche, siehe CLAUDE.md).
|
|
function layout_start(string $title, string $currentPage = 'dashboard'): void {
|
|
$name = current_name();
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title><?= e($title) ?></title>
|
|
<link rel="stylesheet" href="../app.css">
|
|
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
|
</head>
|
|
<body>
|
|
|
|
<div class="dashboard-layout">
|
|
|
|
<aside class="sidebar glass">
|
|
<div class="sidebar-brand">
|
|
<img src="../assets/omsorg-wordmark-new.png" alt="OMSORG">
|
|
<span class="sidebar-app-name">Mitarbeiter-App</span>
|
|
</div>
|
|
|
|
<div class="sidebar-user">
|
|
<div class="sidebar-avatar"><?= e(mb_substr($name, 0, 1)) ?></div>
|
|
<div>
|
|
<b><?= e($name) ?></b>
|
|
<small><?= e(current_role()) ?></small>
|
|
</div>
|
|
</div>
|
|
|
|
<nav class="sidebar-nav">
|
|
<a href="dashboard.php" class="<?= $currentPage === 'dashboard' ? 'active' : '' ?>">
|
|
<span class="nav-icon">⊞</span><span class="nav-label"> Dashboard</span>
|
|
</a>
|
|
<?php if (has_permission('Absences', 'View')): ?>
|
|
<a href="urlaubsantrag.php" class="<?= $currentPage === 'urlaubsantrag' ? 'active' : '' ?>">
|
|
<span class="nav-icon">🗓</span><span class="nav-label"> Urlaub & Abwesenheit</span>
|
|
</a>
|
|
<?php endif; ?>
|
|
<?php if (has_permission('TimeEntries', 'View')): ?>
|
|
<a href="stundenerfassung.php" class="<?= $currentPage === 'stundenerfassung' ? 'active' : '' ?>">
|
|
<span class="nav-icon">⏱</span><span class="nav-label"> Zeiterfassung</span>
|
|
</a>
|
|
<?php endif; ?>
|
|
<?php if (has_permission('EmployeeFacilityDistances', 'View')): ?>
|
|
<a href="fahrtstrecken.php" class="<?= $currentPage === 'fahrtstrecken' ? 'active' : '' ?>">
|
|
<span class="nav-icon">🚗</span><span class="nav-label"> Fahrtstrecken</span>
|
|
</a>
|
|
<?php endif; ?>
|
|
<a href="settings.php" class="<?= $currentPage === 'settings' ? 'active' : '' ?>">
|
|
<span class="nav-icon">⚙</span><span class="nav-label"> Einstellungen</span>
|
|
</a>
|
|
</nav>
|
|
|
|
<div class="sidebar-footer">
|
|
<a href="../actions/logout.php" class="sidebar-logout">Abmelden</a>
|
|
</div>
|
|
</aside>
|
|
|
|
<main class="main-content">
|
|
<div class="main-inner">
|
|
<?php
|
|
}
|
|
|
|
function layout_end(): void {
|
|
?>
|
|
</div>
|
|
</main>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|
|
<?php
|
|
}
|