infrastruktur karte
This commit is contained in:
@@ -20,7 +20,8 @@ $floors = $sql->get(
|
||||
[]
|
||||
);
|
||||
$rooms = $sql->get(
|
||||
"SELECT r.id, r.name, r.floor_id, f.name AS floor_name, f.svg_path, b.id AS building_id, l.id AS location_id
|
||||
"SELECT r.id, r.name, r.floor_id, r.x, r.y, r.width, r.height, r.polygon_points,
|
||||
f.name AS floor_name, f.svg_path, b.id AS building_id, l.id AS location_id
|
||||
FROM rooms r
|
||||
LEFT JOIN floors f ON f.id = r.floor_id
|
||||
LEFT JOIN buildings b ON b.id = f.building_id
|
||||
@@ -92,13 +93,13 @@ if ($type === 'patchpanel') {
|
||||
}
|
||||
}
|
||||
|
||||
$defaultPanelSize = ['width' => 140, 'height' => 40];
|
||||
$defaultPanelSize = ['width' => 20, 'height' => 5];
|
||||
$defaultOutletSize = 10;
|
||||
$showPanelPlacementFields = $type === 'patchpanel' && $selectedFloorId > 0;
|
||||
|
||||
if ($type === 'patchpanel') {
|
||||
$panel['width'] = $panel['width'] ?? $defaultPanelSize['width'];
|
||||
$panel['height'] = $panel['height'] ?? $defaultPanelSize['height'];
|
||||
$panel['width'] = $defaultPanelSize['width'];
|
||||
$panel['height'] = $defaultPanelSize['height'];
|
||||
$panel['pos_x'] = $panel['pos_x'] ?? 30;
|
||||
$panel['pos_y'] = $panel['pos_y'] ?? 30;
|
||||
} else {
|
||||
@@ -127,6 +128,7 @@ $mapOutlets = $sql->get(
|
||||
?>
|
||||
|
||||
<div class="floor-infra-edit">
|
||||
<link rel="stylesheet" href="/assets/css/floor-infrastructure-edit.css">
|
||||
<h1><?php echo $pageTitle; ?></h1>
|
||||
|
||||
<form method="post" action="?module=floor_infrastructure&action=save" class="infra-edit-form">
|
||||
@@ -204,8 +206,7 @@ $mapOutlets = $sql->get(
|
||||
data-reference-panels="<?php echo htmlspecialchars(json_encode($mapPatchPanels, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), ENT_QUOTES, 'UTF-8'); ?>"
|
||||
data-reference-outlets="<?php echo htmlspecialchars(json_encode($mapOutlets, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<img id="floor-plan-svg" class="floor-plan-svg" alt="Stockwerksplan">
|
||||
<div id="floor-plan-marker" class="floor-plan-marker panel-marker"
|
||||
style="--marker-width: <?php echo $markerWidth; ?>px; --marker-height: <?php echo $markerHeight; ?>px;"></div>
|
||||
<svg id="floor-plan-overlay" class="floor-plan-overlay" viewBox="0 0 1 1" preserveAspectRatio="xMidYMid meet" aria-hidden="true"></svg>
|
||||
</div>
|
||||
<p class="floor-plan-hint">Nur das aktuell bearbeitete Patchpanel ist verschiebbar. Andere Objekte werden als Referenz halbtransparent angezeigt. Neue Objekte starten bei Position 30 x 30.</p>
|
||||
<p class="floor-plan-position">Koordinate: <span id="floor-plan-position"></span></p>
|
||||
@@ -242,6 +243,11 @@ $mapOutlets = $sql->get(
|
||||
<option value="<?php echo $room['id']; ?>"
|
||||
data-floor-id="<?php echo $room['floor_id'] ?? 0; ?>"
|
||||
data-floor-svg-url="<?php echo htmlspecialchars($room['floor_svg_url']); ?>"
|
||||
data-room-x="<?php echo (int)($room['x'] ?? 0); ?>"
|
||||
data-room-y="<?php echo (int)($room['y'] ?? 0); ?>"
|
||||
data-room-width="<?php echo (int)($room['width'] ?? 0); ?>"
|
||||
data-room-height="<?php echo (int)($room['height'] ?? 0); ?>"
|
||||
data-room-polygon="<?php echo htmlspecialchars((string)($room['polygon_points'] ?? ''), ENT_QUOTES, 'UTF-8'); ?>"
|
||||
<?php echo ($outlet['room_id'] ?? 0) === $room['id'] ? 'selected' : ''; ?>>
|
||||
<?php echo htmlspecialchars($room['floor_name'] . ' / ' . $room['name']); ?>
|
||||
</option>
|
||||
@@ -265,10 +271,9 @@ $mapOutlets = $sql->get(
|
||||
data-reference-panels="<?php echo htmlspecialchars(json_encode($mapPatchPanels, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), ENT_QUOTES, 'UTF-8'); ?>"
|
||||
data-reference-outlets="<?php echo htmlspecialchars(json_encode($mapOutlets, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<img id="floor-plan-svg" class="floor-plan-svg" alt="Stockwerksplan">
|
||||
<div id="floor-plan-marker" class="floor-plan-marker outlet-marker"
|
||||
style="--marker-width: <?php echo $markerWidth; ?>px; --marker-height: <?php echo $markerHeight; ?>px;"></div>
|
||||
<svg id="floor-plan-overlay" class="floor-plan-overlay" viewBox="0 0 1 1" preserveAspectRatio="xMidYMid meet" aria-hidden="true"></svg>
|
||||
</div>
|
||||
<p class="floor-plan-hint">Nur die aktuell bearbeitete Wandbuchse ist verschiebbar. Andere Objekte werden als Referenz halbtransparent angezeigt. Netzwerkdosen sind immer 10 x 10.</p>
|
||||
<p class="floor-plan-hint">Nur die aktuell bearbeitete Wandbuchse ist verschiebbar. Blau = Patchpanel, Gruen = Dosen-Referenz, Orange = gewaehlter Raum. Netzwerkdosen sind immer 10 x 10.</p>
|
||||
<p class="floor-plan-position">Koordinate: <span id="floor-plan-position"></span></p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -292,119 +297,7 @@ $mapOutlets = $sql->get(
|
||||
//TODO drag an drop auf der stockwerkskarte für die patchfelder und wandbuchsen. buchsen haben eine einheitliche größe, und sind quadratisch, patchfelder sind auch für sich einheitlich, sind rechteckig und breiter als hoch
|
||||
//TODO style in css files einsortieren
|
||||
?>
|
||||
<style>
|
||||
.floor-infra-edit {
|
||||
padding: 25px;
|
||||
max-width: 700px;
|
||||
}
|
||||
.infra-edit-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
}
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
.form-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
.form-actions {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
.info {
|
||||
font-size: 0.9em;
|
||||
color: #555;
|
||||
}
|
||||
.floor-plan-block {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
.floor-plan-canvas {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 260px;
|
||||
border: 1px solid #d4d4d4;
|
||||
border-radius: 8px;
|
||||
background-color: #fff;
|
||||
background-image:
|
||||
linear-gradient(90deg, rgba(0, 0, 0, 0.05) 1px, transparent 1px),
|
||||
linear-gradient(rgba(0, 0, 0, 0.05) 1px, transparent 1px);
|
||||
background-size: 40px 40px;
|
||||
cursor: crosshair;
|
||||
overflow: hidden;
|
||||
}
|
||||
.floor-plan-svg {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
pointer-events: none;
|
||||
z-index: 0;
|
||||
opacity: 0.75;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.floor-plan-marker {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: var(--marker-width, 32px);
|
||||
height: var(--marker-height, 32px);
|
||||
transition: left 0.1s ease, top 0.1s ease;
|
||||
touch-action: none;
|
||||
z-index: 2;
|
||||
}
|
||||
.floor-plan-marker.is-active {
|
||||
cursor: move;
|
||||
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.8), 0 0 0 4px rgba(13, 110, 253, 0.35);
|
||||
}
|
||||
.floor-plan-marker.panel-marker {
|
||||
background: rgba(13, 110, 253, 0.25);
|
||||
border: 2px solid #0d6efd;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.floor-plan-marker.outlet-marker {
|
||||
background: rgba(25, 135, 84, 0.25);
|
||||
border: 2px solid #198754;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.floor-plan-reference {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
opacity: 0.35;
|
||||
z-index: 1;
|
||||
}
|
||||
.floor-plan-reference.panel-marker {
|
||||
background: rgba(13, 110, 253, 0.22);
|
||||
border: 2px solid rgba(13, 110, 253, 0.7);
|
||||
border-radius: 6px;
|
||||
}
|
||||
.floor-plan-reference.outlet-marker {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: rgba(25, 135, 84, 0.22);
|
||||
border: 2px solid rgba(25, 135, 84, 0.7);
|
||||
border-radius: 4px;
|
||||
}
|
||||
.floor-plan-hint {
|
||||
font-size: 0.85em;
|
||||
color: #444;
|
||||
margin: 0;
|
||||
}
|
||||
.floor-plan-position {
|
||||
margin: 0;
|
||||
font-size: 0.85em;
|
||||
color: #666;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="/assets/js/floor-infrastructure-edit.js" defer></script>
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user