197 lines
6.3 KiB
PHP
197 lines
6.3 KiB
PHP
<?php
|
||
/**
|
||
* app/modules/floor_infrastructure/list.php
|
||
*
|
||
* Übersicht über Patchpanels und Netzwerkbuchsen auf Stockwerken
|
||
*/
|
||
|
||
$floorId = (int)($_GET['floor_id'] ?? 0);
|
||
|
||
$floors = $sql->get("SELECT id, name FROM floors ORDER BY name", "", []);
|
||
|
||
$where = '';
|
||
$types = '';
|
||
$params = [];
|
||
|
||
if ($floorId > 0) {
|
||
$where = "WHERE p.floor_id = ?";
|
||
$types = "i";
|
||
$params[] = $floorId;
|
||
}
|
||
|
||
$patchPanels = $sql->get(
|
||
"SELECT p.*, f.name AS floor_name
|
||
FROM floor_patchpanels p
|
||
LEFT JOIN floors f ON f.id = p.floor_id
|
||
$where
|
||
ORDER BY f.name, p.name",
|
||
$types,
|
||
$params
|
||
);
|
||
|
||
$networkOutlets = $sql->get(
|
||
"SELECT o.*, r.name AS room_name, f.name AS floor_name
|
||
FROM network_outlets o
|
||
LEFT JOIN rooms r ON r.id = o.room_id
|
||
LEFT JOIN floors f ON f.id = r.floor_id
|
||
ORDER BY f.name, r.name, o.name",
|
||
"",
|
||
[]
|
||
);
|
||
?>
|
||
|
||
<div class="floor-infra">
|
||
<h1>Stockwerksinfrastruktur</h1>
|
||
|
||
<div class="toolbar">
|
||
<a href="?module=floor_infrastructure&action=edit&type=patchpanel" class="button button-primary">
|
||
+ Patchpanel hinzufügen
|
||
</a>
|
||
<a href="?module=floor_infrastructure&action=edit&type=outlet" class="button">
|
||
+ Wandbuchse hinzufügen
|
||
</a>
|
||
</div>
|
||
|
||
<form method="get" class="filter-form">
|
||
<input type="hidden" name="module" value="floor_infrastructure">
|
||
<input type="hidden" name="action" value="list">
|
||
|
||
<select name="floor_id">
|
||
<option value="">- Alle Stockwerke -</option>
|
||
<?php foreach ($floors as $floor): ?>
|
||
<option value="<?php echo $floor['id']; ?>" <?php echo $floor['id'] === $floorId ? 'selected' : ''; ?>>
|
||
<?php echo htmlspecialchars($floor['name']); ?>
|
||
</option>
|
||
<?php endforeach; ?>
|
||
</select>
|
||
|
||
<button class="button">Filter</button>
|
||
<a href="?module=floor_infrastructure&action=list" class="button">Zurücksetzen</a>
|
||
</form>
|
||
|
||
<section class="infra-section">
|
||
<h2>Patchpanels</h2>
|
||
<?php if (!empty($patchPanels)): ?>
|
||
<table class="infra-table">
|
||
<thead>
|
||
<tr>
|
||
<th>Name</th>
|
||
<th>Stockwerk</th>
|
||
<th>Position</th>
|
||
<th>Größe</th>
|
||
<th>Ports</th>
|
||
<th>Aktionen</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php foreach ($patchPanels as $panel): ?>
|
||
<tr>
|
||
<td><?php echo htmlspecialchars($panel['name']); ?></td>
|
||
<td><?php echo htmlspecialchars($panel['floor_name'] ?? '—'); ?></td>
|
||
<td><?php echo $panel['pos_x'] . ' × ' . $panel['pos_y']; ?></td>
|
||
<td><?php echo $panel['width'] . ' × ' . $panel['height']; ?></td>
|
||
<td><?php echo $panel['port_count']; ?></td>
|
||
<td class="actions">
|
||
<a href="?module=floor_infrastructure&action=edit&type=patchpanel&id=<?php echo $panel['id']; ?>" class="button button-small">Bearbeiten</a>
|
||
</td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
<?php else: ?>
|
||
<p class="empty-state">Noch keine Patchpanels definiert.</p>
|
||
<?php endif; ?>
|
||
</section>
|
||
|
||
<section class="infra-section">
|
||
<h2>Wandbuchsen</h2>
|
||
<?php if (!empty($networkOutlets)): ?>
|
||
<table class="infra-table">
|
||
<thead>
|
||
<tr>
|
||
<th>Name</th>
|
||
<th>Stockwerk</th>
|
||
<th>Raum</th>
|
||
<th>Koordinaten</th>
|
||
<th>Kommentar</th>
|
||
<th>Aktionen</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php foreach ($networkOutlets as $outlet): ?>
|
||
<tr>
|
||
<td><?php echo htmlspecialchars($outlet['name']); ?></td>
|
||
<td><?php echo htmlspecialchars($outlet['floor_name'] ?? '—'); ?></td>
|
||
<td><?php echo htmlspecialchars($outlet['room_name'] ?? '—'); ?></td>
|
||
<td><?php echo $outlet['x'] . ' × ' . $outlet['y']; ?></td>
|
||
<td><?php echo htmlspecialchars($outlet['comment']); ?></td>
|
||
<td class="actions">
|
||
<a href="?module=floor_infrastructure&action=edit&type=outlet&id=<?php echo $outlet['id']; ?>" class="button button-small">Bearbeiten</a>
|
||
</td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
<?php else: ?>
|
||
<p class="empty-state">Noch keine Wandbuchsen angelegt.</p>
|
||
<?php endif; ?>
|
||
</section>
|
||
|
||
<section class="infra-plan">
|
||
<h2>Stockwerksplan-Verortung</h2>
|
||
<p>Die eingetragenen Patchpanels und Wandbuchsen erscheinen später als feste Objekte auf dem Stockwerks-SVG. Die Polygon-Positionen werden momentan noch durch numerische X/Y-Werte gesteuert.</p>
|
||
<p><small>TODO: SVG-Editor mit Drag & Drop für diese Objekte erweitern (siehe Stockwerke-Modul).</small></p>
|
||
</section>
|
||
</div>
|
||
|
||
<style>
|
||
.floor-infra {
|
||
padding: 25px;
|
||
}
|
||
.toolbar {
|
||
display: flex;
|
||
gap: 10px;
|
||
margin-bottom: 15px;
|
||
}
|
||
.filter-form {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
flex-wrap: wrap;
|
||
margin-bottom: 25px;
|
||
}
|
||
.filter-form select {
|
||
padding: 8px 10px;
|
||
border-radius: 4px;
|
||
border: 1px solid #ccc;
|
||
}
|
||
.infra-section {
|
||
margin-bottom: 30px;
|
||
}
|
||
.infra-table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin-top: 10px;
|
||
}
|
||
.infra-table th,
|
||
.infra-table td {
|
||
padding: 10px;
|
||
border-bottom: 1px solid #ddd;
|
||
}
|
||
.infra-plan {
|
||
padding: 15px;
|
||
background: #f7f7f7;
|
||
border: 1px dashed #ccc;
|
||
border-radius: 6px;
|
||
}
|
||
.empty-state {
|
||
padding: 20px;
|
||
background: #fafafa;
|
||
border: 1px dashed #ccc;
|
||
border-radius: 6px;
|
||
}
|
||
.actions .button-small {
|
||
margin-right: 6px;
|
||
}
|
||
</style>
|