Merge branch 'master' into fronkdev

This commit is contained in:
Frank Schubert
2025-04-10 13:27:50 +02:00
74 changed files with 2760 additions and 1027 deletions
+17 -4
View File
@@ -99,6 +99,18 @@ $pagination_entity_name = "Zustimmungserklärungen";
</select>
</div>
<div class="col-2">
<label class="form-label" for="filter_electric_approval">Elektriker freigegeben</label>
<select name="filter[electric_approval]" id="filter_electric_approval" class="form-control">
<option value="">Alle</option>
<option value="!NULL" <?=(array_key_exists("electric_approval", $filter) && $filter["electric_approval"] == "!NULL") ? "selected='selected'" : ""?>>Ja</option>
<option value="NULL" <?=(array_key_exists("electric_approval", $filter) && $filter["electric_approval"] == "NULL") ? "selected='selected'" : ""?>>Nein</option>
</select>
</div>
</div>
<div class="row mt-2">
<div class="col-2">
<label class="form-label" for="filter_conduit_installed_ftu">Leerrohr bis HAK</label>
<select name="filter[conduit_installed_ftu]" id="filter_conduit_installed_ftu" class="form-control">
@@ -108,10 +120,7 @@ $pagination_entity_name = "Zustimmungserklärungen";
</select>
</div>
</div>
<div class="row mt-2">
<div class="col-2">
<div class="col-1">
<label class="form-label" for="filter_inhouse_cabling">Inhouse erledigt</label>
<select name="filter[inhouse_cabling]" id="filter_inhouse_cabling" class="form-control">
<option value="">Alle</option>
@@ -331,6 +340,8 @@ $pagination_entity_name = "Zustimmungserklärungen";
<th>KG</th>
<th>GST-Nr.</th>
<th>Einlagezahl</th>
<th>Wohneinheiten</th>
<th>Bestellungen</th>
<th class="text-center">Anzahl Eigentümer</th>
<th>Anfrageresultat</th>
<th></th>
@@ -354,6 +365,8 @@ $pagination_entity_name = "Zustimmungserklärungen";
<td><?=$item->kg?></td>
<td><?=$item->gst?></td>
<td><?=$item->ez?></td>
<td><?=$item->adb_hausnummer->unit_count ?? ''?></td>
<td><?=$item->preorder_count?></td>
<td class="text-center">
<?php
+1 -1
View File
@@ -144,7 +144,7 @@ $pagination_entity_name = "Adressen";
</td>
</tr>
<tr>
<th>Elektriker</th>
<th>Freigabe Elektriker</th>
<td class="text-monospace"><a data-toggle="modal" data-target="#electricianDateModal" href="#"><i class="fas fa-fw fa-edit"></i></a> <?=($item->inspection_date_electrician) ? date("d.m.Y", $item->inspection_date_electrician) : ""?></td>
<td><input type="checkbox" id="inspection_electrician" class="switchery" data-size="small" data-color="#25b343" data-toggle-param="inspection_electrician" <?=($item->inspection_electrician) ? "checked='checked'" : ""?> /></td>
<td>
+10 -1
View File
@@ -78,7 +78,7 @@
<?php if(array_key_exists("status_id", $filter)): ?>
<?=($filter['status_id'] == $status->id) ? "selected='selected'" : ""?>
<?php else: ?>
<?=($status->id == 3) ? "selected='selected'" : ""?>
<?=(!in_array($me->id, ["145","62","56"]) && $status->id == 3) ? "selected='selected'" : ""?>
<?php endif; ?>
>
<?=$status->code?> - <?=__($status->name."-t")?></option>
@@ -104,6 +104,15 @@
<input type="text" class="form-control" name="filter[building_street]" id="filter_building_street" value="<?=$filter['building_street']?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_linework_enabled">Baufreigabe</label>
<select name="filter[linework_enabled]" id="filter_linework_enabled" class="form-control">
<option value="">Alle</option>
<option value="1" <?=(array_key_exists("linework_enabled", $filter) && $filter["linework_enabled"] == "1") ? "selected='selected'" : ""?>>Ja</option>
<option value="0" <?=(array_key_exists("linework_enabled", $filter) && $filter["linework_enabled"] == "0") ? "selected='selected'" : ""?>>Nein</option>
</select>
</div>
+438 -185
View File
@@ -1,198 +1,451 @@
<?php
$pagination_baseurl = $this->getUrl($Mod,"Index");
$pagination_baseurl_params = ["filter" => $filter];
$pagination_entity_name = "Patchungen";
if(!is_array($filter)) $filter = [];
// --- Configuration ---
$pagination_baseurl = $this->getUrl($Mod,"Index");
$pagination_baseurl_params = ["filter" => $filter]; // Filters passed via GET
$pagination_entity_name = "Patchungen";
// Ensure $filter is always an array
if(!is_array($filter)) {
$filter = [];
}
// Helper function for safe output (assuming not already handled by framework/template engine)
function e($string) {
return htmlspecialchars($string ?? '', ENT_QUOTES, 'UTF-8');
}
$additionalHead = [
'<link rel="manifest" href="/assets/pwa/patching-manifest.json">'
];
?>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/header.php"); ?>
<!-- start page title -->
<div class="row">
<div class="col-12">
<div class="page-title-box">
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="<?=self::getUrl("Dashboard")?>"><?=MFAPPNAME_SLUG?></a></li>
<li class="breadcrumb-item active">Patchungen</li>
</ol>
</div>
<h4 class="page-title">Patchungen</h4>
<div class="col-12">
<div class="page-title-box">
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="<?=e(self::getUrl("Dashboard"))?>"><?=e(MFAPPNAME_SLUG)?></a></li>
<li class="breadcrumb-item active">Patchungen</li>
</ol>
</div>
<h4 class="page-title">Patchungen</h4>
</div>
</div>
</div>
</div>
<!-- end page title -->
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-body mb-3">
<h4 class="header-title mb-3">Filter</h4>
<form method="get" action="<?=self::getUrl("Patching")?>">
<div class="row">
<div class="col-1">
<label class="form-label" for="filter_network_id">Netzgebiet</label>
<select name="filter[network_id]" id="filter_network_id" class="form-control">
<option></option>
<?php foreach($mynetworks as $fnet): ?>
<option value="<?=$fnet->id?>" <?=($filter['network_id'] == $fnet->id) ? "selected='selected'" : ""?>><?=$fnet->name?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-2">
<label class="form-label" for="filter_pop_id">POP</label>
<select name="filter[pop_id]" id="filter_pop_id" class="form-control">
<option></option>
<?php foreach($mynetworks as $fnet): ?>
<?php if(is_array($fnet->pops) && count($fnet->pops)): ?>
<optgroup label="<?=$fnet->name?>">
<?php foreach($fnet->pops as $pop): ?>
<option value="<?=$pop->id?>" <?=($filter['pop_id'] == $pop->id) ? "selected='selected'" : ""?>><?=$pop->name?></option>
<?php endforeach; ?>
</optgroup>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-2">
<label class="form-label" for="filter_patched">Patchstatus</label>
<select name="filter[patched]" id="filter_patched" class="form-control">
<option value="0" <?=($filter['patched'] < 1) ? "selected='selected'" : ""?>>Nicht gepatched</option>
<option value="1" <?=($filter['patched'] == 1) ? "selected='selected'" : ""?>>Gepatched</option>
<option value="2" <?=($filter['patched'] == 2) ? "selected='selected'" : ""?>>Vorpatchen</option>
</select>
</div>
<div class="col-2">
<label class="form-label" for="filter_hide_delayed_finish">Verzögerte Herstellung</label>
<select name="filter[hide_delayed_finish]" id="filter_hide_delayed_finish" class="form-control">
<option value="0" <?=(array_key_exists("hide_delayed_finish", $filter) &&$filter['hide_delayed_finish'] != 1) ? "selected='selected'" : ""?>>Anzeigen</option>
<option value="1" <?=(!array_key_exists("hide_delayed_finish", $filter) || $filter['hide_delayed_finish'] == 1) ? "selected='selected'" : ""?>>Nicht anzeigen</option>
</select>
</div>
<div class="col-1">
<label class="form-label" for="filter_code">Objekt ID</label>
<input type="text" class="form-control" name="filter[code]" id="filter_code" value="<?=$filter['code']?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_street">Straße</label>
<input type="text" class="form-control" name="filter[street]" id="filter_street" value="<?=$filter['street']?>" />
</div>
</div>
<div class="row mt-2">
<div class="col">
<button type="submit" class="btn btn-primary">Filter anwenden</button>
<a class="btn btn-secondary" href="<?=self::getUrl("Patching")?>">Filter zurücksetzen</a>
</div>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-body mb-3">
<h4 class="header-title">Patchungen</h4>
<div class="col-lg-12">
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
<div class="card">
<div class="card-body mb-3">
<h4 class="header-title mb-3">Filter</h4>
<table class="table table-striped table-hover">
<tr class="table-bordered text-center">
<th colspan="4">Standort</th>
<th colspan="2">ODF</th>
<th colspan="5">Abschluss/Device</th>
<th></th>
</tr>
<tr class="table-bordered">
<th>Netzgebiet</th>
<th>POP</th>
<th>Kunde</th>
<th>Standort</th>
<th>Patchposition ODF</th>
<th>ODF Port</th>
<th>Typ</th>
<th>Splitter / Gerät</th>
<th>Port</th>
<th>Gepatched</th>
<th>Von</th>
<th></th>
</tr>
<?php foreach($terminations as $term): ?>
<tr>
<td><?=$term->building->network->name?></td>
<td>
<?php if($term->getPop()): ?>
<?=$term->getPop()->name?>
<?php else: ?>
<?=$term->building->pop->name?>
<?php endif; ?>
</td>
<td><?=($term->order->owner) ? $term->order->owner->customer_number : ""?><br /> <?=($term->order->owner) ? $term->order->owner->getCompanyOrName() : ""?></td>
<td>
<?=$term->building->street?><br />
<?=$term->building->zip?> <?=$term->building->city?>
</td>
<td class="text-mono text-primary" title="Schrank: <?=($term->workflowitems["ist_schrank"]->value->id) ? $term->workflowitems["ist_schrank"]->value->value_string : $term->workflowitems["schrank"]->value->value_string?> / Einschub: <?=($term->workflowitems["ist_baugruppe"]->value->id) ? $term->workflowitems["ist_baugruppe"]->value->value_string : $term->workflowitems["baugruppe"]->value->value_string?> / Modul: <?=($term->workflowitems["ist_modul"]->value->id) ? $term->workflowitems["ist_modul"]->value->value_string : $term->workflowitems["modul"]->value->value_string?> / Port: <?=($term->workflowitems["ist_ports"]->value->id) ? $term->workflowitems["ist_ports"]->value->value_string : $term->workflowitems["ports"]->value->value_string?>">
<?=($term->workflowitems["ist_schrank"]->value->id) ? $term->workflowitems["ist_schrank"]->value->value_string : $term->workflowitems["schrank"]->value->value_string?> /
<?=($term->workflowitems["ist_baugruppe"]->value->id) ? $term->workflowitems["ist_baugruppe"]->value->value_string : $term->workflowitems["baugruppe"]->value->value_string?> /
<?=($term->workflowitems["ist_modul"]->value->id) ? $term->workflowitems["ist_modul"]->value->value_string : $term->workflowitems["modul"]->value->value_string?> /
<?=($term->workflowitems["ist_ports"]->value->id) ? $term->workflowitems["ist_ports"]->value->value_string : $term->workflowitems["ports"]->value->value_string?>
</td>
<td>
<select name="linework_port" form="term-form-<?=$term->id?>" class="form-control">
<?php foreach($term->getLineworkportPairs() as $ports): ?>
<?php foreach($ports as $p): ?>
<option value="<?=$p?>" <?=($term->patching->linework_ports == $p) ? "selected='selected'" : ""?>><?=$p?></option>
<?php endforeach; ?>
<?php endforeach; ?>
</select>
</td>
<td>
<select name="device_type" form="term-form-<?=$term->id?>" class="form-control">
<option></option>
<option value="splitter" <?=($term->patching->device_type == "splitter") ? "selected='selected'" : ""?>>Splitter</option>
<option value="pon" <?=($term->patching->device_type == "pon") ? "selected='selected'" : ""?>>Shared PON-Port</option>
<option value="switch" <?=($term->patching->device_type == "switch") ? "selected='selected'" : ""?>>Switch</option>
</select>
</td>
<td><input type="text" class="form-control" form="term-form-<?=$term->id?>" name="device_name" value="<?=$term->patching->device_name?>" placeholder="Splitte / Gerät" /></td>
<td><input type="text" class="form-control" form="term-form-<?=$term->id?>" name="device_port" value="<?=$term->patching->device_port?>" placeholder="Port" /></td>
<td><input type="checkbox" class="form-control" form="term-form-<?=$term->id?>" name="patched" value="1" <?=($term->patching->patched == 1) ? "checked='checked'" : ""?> /></td>
<td <?=($term->patching->patched == 1 && $term->patching->patched_by) ? "title='Gepatched: ".date("d.m.Y H:i",$term->patching->patched_date)." von ".$term->patching->patcher->name." (".$term->patching->patcher->address->getCompanyOrName(true).")'" : ""?>>
<?php if($term->patching->patched == 1 && $term->patching->patched_by): ?>
<?=($term->patching->patcher) ? $term->patching->patcher->getAbbrName() : ""?>
<?php endif; ?>
</td>
<td>
<form method="post" id="term-form-<?=$term->id?>" action="<?=self::getUrl("Patching","save", ["s" => $pagination['start'], "filter" => $filter])?>">
<input type="hidden" name="termination_id" value="<?=$term->id?>" />
<input type="submit" class="btn btn-primary" value="Speichern" />
</form>
</td>
</tr>
<?php endforeach; ?>
</table>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
</div>
<form method="get" action="<?=e(self::getUrl("Patching"))?>">
<div class="row">
<div class="col-12 col-md-6 col-lg-2 mb-3">
<label class="form-label" for="filter_network_id">Netzgebiet</label>
<select name="filter[network_id]" id="filter_network_id" class="form-control">
<option value=""></option>
<?php foreach($mynetworks as $fnet): ?>
<option value="<?=e($fnet->id)?>" <?=($filter['network_id'] ?? null == $fnet->id) ? "selected='selected'" : ""?>><?=e($fnet->name)?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-12 col-md-6 col-lg-2 mb-3">
<label class="form-label" for="filter_pop_id">POP</label>
<select name="filter[pop_id]" id="filter_pop_id" class="form-control">
<option value=""></option>
<?php foreach($mynetworks as $fnet): ?>
<?php if(is_array($fnet->pops) && count($fnet->pops)): ?>
<optgroup label="<?=e($fnet->name)?>">
<?php foreach($fnet->pops as $pop): ?>
<option value="<?=e($pop->id)?>" <?=($filter['pop_id'] ?? null == $pop->id) ? "selected='selected'" : ""?>><?=e($pop->name)?></option>
<?php endforeach; ?>
</optgroup>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<div class="col-12 col-md-6 col-lg-2 mb-3">
<label class="form-label" for="filter_patched">Patchstatus</label>
<select name="filter[patched]" id="filter_patched" class="form-control">
<option value="0" <?=((int)($filter['patched'] ?? 0) < 1) ? "selected='selected'" : ""?>>Nicht gepatched</option>
<option value="1" <?=((int)($filter['patched'] ?? 0) == 1) ? "selected='selected'" : ""?>>Gepatched</option>
<option value="2" <?=((int)($filter['patched'] ?? 0) == 2) ? "selected='selected'" : ""?>>Vorpatchen</option>
</select>
</div>
<div class="col-12 col-md-6 col-lg-2 mb-3">
<label class="form-label" for="filter_hide_delayed_finish">Verzögerte Herstellung</label>
<select name="filter[hide_delayed_finish]" id="filter_hide_delayed_finish" class="form-control">
<option value="0" <?=(isset($filter["hide_delayed_finish"]) && $filter['hide_delayed_finish'] != 1) ? "selected='selected'" : ""?>>Anzeigen</option>
<option value="1" <?=(!isset($filter["hide_delayed_finish"]) || $filter['hide_delayed_finish'] == 1) ? "selected='selected'" : ""?>>Nicht anzeigen</option>
</select>
</div>
<div class="col-12 col-md-6 col-lg-1 mb-3">
<label class="form-label" for="filter_code">Objekt ID</label>
<input type="text" class="form-control" name="filter[code]" id="filter_code" value="<?=e($filter['code'] ?? '')?>" />
</div>
<div class="col-12 col-md-6 col-lg-3 mb-3">
<label class="form-label" for="filter_street">Straße</label>
<input type="text" class="form-control" name="filter[street]" id="filter_street" value="<?=e($filter['street'] ?? '')?>" />
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<button type="submit" class="btn btn-primary">Filter anwenden</button>
<a class="btn btn-secondary" href="<?=e(self::getUrl("Patching"))?>">Filter zurücksetzen</a>
</div>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-body mb-3">
<h4 class="header-title">Patchungen</h4>
<?php // Include pagination controls - Top ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
<div class="table-responsive mt-3"> <?php // Added table-responsive wrapper and margin-top ?>
<table class="table table-striped table-hover">
<thead class="table-bordered"> <?php // Added thead and border class ?>
<tr>
<th colspan="4" class="text-center">Standort</th>
<th colspan="2" class="text-center">ODF</th>
<th colspan="5" class="text-center">Abschluss/Device</th>
<th>Aktion</th> <?php // Renamed last header ?>
</tr>
<tr>
<th>Netzgebiet</th>
<th class="text-nowrap">POP</th> <?php // Added text-nowrap for min-width effect ?>
<th class="text-nowrap">Kunde</th> <?php // Added text-nowrap ?>
<th>Standort</th> <?php // Allow wrapping ?>
<th class="text-nowrap">Patchposition ODF</th> <?php // Added text-nowrap ?>
<th style="min-width: 105px">ODF Port</th> <?php // Select handles resize ok ?>
<th style="min-width: 195px">Typ</th> <?php // Select handles resize ok ?>
<th style="min-width: 190px" class="text-nowrap">Splitter / Gerät</th> <?php // Added text-nowrap ?>
<th style="min-width: 90px" class="text-nowrap">Port</th> <?php // Added text-nowrap ?>
<th>Gepatched</th>
<th class="text-nowrap">Von</th> <?php // Added text-nowrap ?>
<th class="text-nowrap">Speichern</th> <?php // Added text-nowrap ?>
</tr>
</thead>
<tbody>
<?php foreach($terminations as $term): ?>
<?php
// --- Prepare complex data for cleaner output ---
// ODF Patch Position
$wfItems = $term->workflowitems ?? [];
$istSchrankValue = $wfItems["ist_schrank"]->value ?? null;
$schrankValue = $wfItems["schrank"]->value ?? null;
$istBaugruppeValue = $wfItems["ist_baugruppe"]->value ?? null;
$baugruppeValue = $wfItems["baugruppe"]->value ?? null;
$istModulValue = $wfItems["ist_modul"]->value ?? null;
$modulValue = $wfItems["modul"]->value ?? null;
$istPortsValue = $wfItems["ist_ports"]->value ?? null;
$portsValue = $wfItems["ports"]->value ?? null;
$schrank = ($istSchrankValue && $istSchrankValue->id) ? $istSchrankValue->value_string : ($schrankValue ? $schrankValue->value_string : '');
$baugruppe = ($istBaugruppeValue && $istBaugruppeValue->id) ? $istBaugruppeValue->value_string : ($baugruppeValue ? $baugruppeValue->value_string : '');
$modul = ($istModulValue && $istModulValue->id) ? $istModulValue->value_string : ($modulValue ? $modulValue->value_string : '');
$ports = ($istPortsValue && $istPortsValue->id) ? $istPortsValue->value_string : ($portsValue ? $portsValue->value_string : '');
$odfPositionTitle = "Schrank: " . e($schrank) . " / Einschub: " . e($baugruppe) . " / Modul: " . e($modul) . " / Port: " . e($ports);
$odfPositionDisplay = e($schrank) . " / " . e($baugruppe) . " / " . e($modul) . " / " . e($ports);
// Patched By Info
$patching = $term->patching ?? null;
$patcher = $patching ? ($patching->patcher ?? null) : null;
$patchedByTitle = '';
$patchedByDisplay = '';
if ($patching && $patching->patched == 1 && $patching->patched_by && $patcher) {
$patcherName = $patcher->name ?? 'Unbekannt';
$patcherCompany = $patcher->address ? $patcher->address->getCompanyOrName(true) : 'N/A';
$patchedDate = date("d.m.Y H:i", $patching->patched_date);
$patchedByTitle = "Gepatched: {$patchedDate} von " . e($patcherName) . " (" . e($patcherCompany) . ")";
$patchedByDisplay = $patcher->getAbbrName() ?? '';
}
// Customer Info
$customer = $term->order->owner ?? null;
$customerNumber = $customer ? $customer->customer_number : '';
$customerName = $customer ? $customer->getCompanyOrName() : '';
// Location Info
$building = $term->building ?? null;
$networkName = $building ? ($building->network->name ?? '') : '';
$popName = '';
$termPop = $term->getPop(); // Call potentially expensive method once
if ($termPop) {
$popName = $termPop->name ?? '';
} elseif ($building && $building->pop) {
$popName = $building->pop->name ?? '';
}
$street = $building->street ?? '';
$zip = $building->zip ?? '';
$city = $building->city ?? '';
// Linework Ports
$lineworkPorts = $term->getLineworkportPairs() ?? [];
$currentLineworkPort = $patching ? $patching->linework_ports : null;
// Device Info
$deviceType = $patching ? $patching->device_type : '';
$deviceName = $patching ? $patching->device_name : '';
$devicePort = $patching ? $patching->device_port : '';
$isPatched = $patching ? ($patching->patched == 1) : false;
?>
<tr class="align-middle"> <?php // Added align-middle ?>
<td><?=e($networkName)?></td>
<td><?=e($popName)?></td>
<td><?=e($customerNumber)?><br /><?=e($customerName)?></td>
<td>
<?=e($street)?><br />
<?=e($zip)?> <?=e($city)?>
</td>
<td class="text-mono text-primary" title="<?=$odfPositionTitle?>">
<?=$odfPositionDisplay?>
</td>
<td>
<select name="linework_port" form="term-form-<?=e($term->id)?>" class="form-control"> <?php // Removed -sm ?>
<?php foreach($lineworkPorts as $portGroup): ?>
<?php foreach($portGroup as $p): ?>
<option value="<?=e($p)?>" <?=($currentLineworkPort == $p) ? "selected='selected'" : ""?>><?=e($p)?></option>
<?php endforeach; ?>
<?php endforeach; ?>
</select>
</td>
<td>
<select name="device_type" form="term-form-<?=e($term->id)?>" class="form-control"> <?php // Removed -sm ?>
<option value=""></option>
<option value="splitter" <?=($deviceType == "splitter") ? "selected='selected'" : ""?>>Splitter</option>
<option value="pon" <?=($deviceType == "pon") ? "selected='selected'" : ""?>>Shared PON-Port</option>
<option value="switch" <?=($deviceType == "switch") ? "selected='selected'" : ""?>>Switch</option>
</select>
</td>
<td><input type="text" class="form-control device-name-input" form="term-form-<?=e($term->id)?>" name="device_name" value="<?=e($deviceName)?>" placeholder="Splitter / Gerät" /></td> <?php // Removed -sm ?>
<td><input type="text" class="form-control" form="term-form-<?=e($term->id)?>" name="device_port" value="<?=e($devicePort)?>" placeholder="Port" /></td> <?php // Removed -sm ?>
<td class="text-center"> <?php // Added text-center ?>
<input type="hidden" name="patched" value="0" form="term-form-<?=e($term->id)?>" /> <?php // Ensure 0 is sent if checkbox is unchecked ?>
<input type="checkbox" class="form-check-input" style="position:unset !important;height: 2em; width: 2em;" form="term-form-<?=e($term->id)?>" name="patched" value="1" <?=($isPatched) ? "checked='checked'" : ""?> /> <?php // Adjusted checkbox style slightly ?>
</td>
<td <?=!empty($patchedByTitle) ? 'title="' . $patchedByTitle . '"' : ''?>>
<?=e($patchedByDisplay)?>
</td>
<td>
<form method="post" id="term-form-<?=e($term->id)?>" action="<?=e(self::getUrl("Patching","save", ["s" => $pagination['start'] ?? 0, "filter" => $filter]))?>">
<input type="hidden" name="termination_id" value="<?=e($term->id)?>" />
<button type="submit" class="btn btn-primary">Speichern</button> <?php // Changed value to button text, removed -sm ?>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div> <?php // End table-responsive ?>
<?php // Include pagination controls - Bottom ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
</div>
</div>
</div>
</div>
</div>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
<style>
@media (max-width: 768px) {
.pagination {
overflow-x: auto;
white-space: nowrap;
}
}
.select2-selection__rendered {
line-height: 38px !important;
}
.select2-container .select2-selection--single {
height: 38px !important;
}
.select2-selection__arrow {
height: 37px !important;
}
@media all and (display-mode: standalone) {
#topnav {
display: none !important;
}
.wrapper {
padding-top: 0 !important;
}
}
</style>
<script>
window.DEVICES = <?= json_encode($devices) ?>;
window.DEVICES = window.DEVICES.filter(device => {
return device.name.toLowerCase().includes('olt') || device.name.toLowerCase().includes('pon')
});
</script>
<script>
$(function() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/Patching/sw', { scope: '/' })
.then(registration => {
console.log('Patching PWA Service Worker registered with scope:', registration.scope);
})
.catch(error => {
console.error('Patching PWA Service Worker registration failed:', error);
});
}
if (typeof $().select2 === 'undefined') {
console.error('Select2 library is not loaded.');
// Optionally display an error to the user or fall back gracefully
return; // Stop execution if Select2 is missing
}
const ipNumRegex = /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[/-](\d+)$/;
// Helper: Find device object by IP
function findDeviceByIp(ip) {
if (!window.DEVICES || !Array.isArray(window.DEVICES)) {
console.error('DEVICES array not found or invalid.');
return null;
}
return window.DEVICES.find(device => device.ip === ip);
}
// Helper: Update the original hidden input field's value
function updateOriginalInput($originalInput, ip, number) {
const cleanNumber = String(number).trim(); // Ensure number is a string and trimmed
if (ip && cleanNumber) {
$originalInput.val(ip + '/' + cleanNumber).trigger('change'); // Update and trigger change
} else {
$originalInput.val('').trigger('change'); // Clear if incomplete and trigger change
}
}
// --- Initialize for each device name input ---
$('.device-name-input').each(function() {
const $originalInput = $(this);
const $td = $originalInput.closest('td'); // Get the parent cell for structure
let initialValue = $originalInput.val().trim();
// Create wrapper for the Select2 component (Select + Number Input)
// Hide it initially
const $selectWrapper = $('<div class="device-select-wrapper" style="display: none; align-items: center; gap: 5px;"></div>');
const $select = $('<select class="form-control device-select" style="flex-grow: 1; width: auto;"></select>'); // Let flexbox handle width
const $numberInput = $('<input type="number" class="form-control device-number" placeholder="Nr." style="width: 70px; flex-grow: 0; flex-shrink: 0;">'); // Fixed width number input
// Populate Select options
$select.append('<option value="">Gerät auswählen...</option>'); // Placeholder
if (window.DEVICES && Array.isArray(window.DEVICES)) {
window.DEVICES.forEach(device => {
// Display name and IP for clarity in dropdown
const displayText = `${device.name} (${device.ip})`;
$select.append($('<option></option>').val(device.ip).text(displayText));
});
} else {
console.warn("DEVICES array is missing or invalid for row:", $originalInput.attr('form'));
// Optionally add a disabled option indicating an error
$select.append('<option value="" disabled>Device list error</option>');
}
$selectWrapper.append($select).append($numberInput);
$td.append($selectWrapper); // Add the hidden wrapper to the cell
// Function to show Select2 component and hide original input
function showSelectComponent(ip, number) {
$originalInput.hide();
$select.val(ip || '').trigger('change.select2'); // Set value and update Select2 display
$numberInput.val(number || '');
$selectWrapper.css('display', 'flex'); // Use flex to show side-by-side
}
// Function to show original input and hide Select2 component
function showOriginalInput() {
$selectWrapper.hide();
$originalInput.show();
}
// Initial state determination
const match = initialValue.match(ipNumRegex);
if (match) {
const initialIp = match[1];
const initialNumber = match[2];
const foundDevice = findDeviceByIp(initialIp);
if (foundDevice) {
// Valid format and known device -> Show Select2 component
showSelectComponent(initialIp, initialNumber);
} else {
// Valid format but unknown device -> Show original input
showOriginalInput();
}
} else if (!initialValue) {
// Empty -> Show Select2 component (empty)
showSelectComponent(null, null);
} else {
// Invalid format -> Show original input
showOriginalInput();
}
// Initialize Select2 *after* adding options and inserting into DOM
$select.select2({
width: 'style', // Adjust width based on container
// dropdownParent: $td // Optional: Attach dropdown to cell if needed for positioning
});
// --- Event Listeners ---
// Update original input when Select2 or number changes
$select.on('change', function() {
const selectedIp = $(this).val();
const currentNumber = $numberInput.val();
updateOriginalInput($originalInput, selectedIp, currentNumber);
});
$numberInput.on('input change', function() { // Use 'input change' for better responsiveness
const currentIp = $select.val();
const selectedNumber = $(this).val();
updateOriginalInput($originalInput, currentIp, selectedNumber);
});
// Check original input on change/blur to potentially switch view
$originalInput.on('change blur', function() {
const currentValue = $(this).val().trim();
const currentMatch = currentValue.match(ipNumRegex);
if (currentMatch) {
const currentIp = currentMatch[1];
const currentNumber = currentMatch[2];
const device = findDeviceByIp(currentIp);
if (device) {
// Switched to valid/known format -> Show Select2
showSelectComponent(currentIp, currentNumber);
}
// else: Keep showing original input (valid format, but unknown device)
}
// else: Keep showing original input (invalid format)
});
}); // End .each loop
});
</script>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
+14 -2
View File
@@ -74,7 +74,7 @@
<?php if(array_key_exists("status_id", $filter)): ?>
<?=($filter['status_id'] == $status->id) ? "selected='selected'" : ""?>
<?php else: ?>
<?=($status->id == 3) ? "selected='selected'" : ""?>
<?=(!in_array($me->id, ["145","62","56"]) && $status->id == 3) ? "selected='selected'" : ""?>
<?php endif; ?>
>
<?=$status->code?> - <?=__($status->name."-b")?></option>
@@ -91,6 +91,15 @@
<label class="form-label" for="filter_street">Straße</label>
<input type="text" class="form-control" name="filter[street]" id="filter_street" value="<?=$filter['street']?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_pipework_enabled">Baufreigabe</label>
<select name="filter[pipework_enabled]" id="filter_pipework_enabled" class="form-control">
<option value="">Alle</option>
<option value="1" <?=(array_key_exists("pipework_enabled", $filter) && $filter["pipework_enabled"] == "1") ? "selected='selected'" : ""?>>Ja</option>
<option value="0" <?=(array_key_exists("pipework_enabled", $filter) && $filter["pipework_enabled"] == "0") ? "selected='selected'" : ""?>>Nein</option>
</select>
</div>
@@ -99,7 +108,10 @@
<div class="row mt-2">
<div>
<button type="submit" class="btn btn-primary">Filter anwenden</button>
<a class="btn btn-secondary" href="<?=self::getUrl("Pipework")?>">Filter zurücksetzen</a>
<a class="btn btn-secondary" href="<?=self::getUrl("Pipework")?>">Filter zurücksetzen</a>
<?php if ($me->is(["Admin"])) :?>
<a class="btn btn-outline-secondary" href="<?=self::getUrl("Pipework", "History")?>">Zur Historie</a>
<?php endif; ?>
</div>
<div style="width: 512px;">
<div class="row">
+69 -2
View File
@@ -322,8 +322,8 @@ $pagination_entity_name = "Vorbestellungen";
</select>
</div>
<div class="col-sm-12 col-md-2">
<label class="form-label" for="filter_rimo_workorder">Rimo Workorder Status</label>
<div class="col-sm-12 col-md-1">
<label class="form-label" for="filter_rimo_workorder">Workorder Status</label>
<select name="filter[rimo_workorder_status][]" id="filter_rimo_workorder_status" multiple class="form-control">
<option value="Clarify" <?=(isset($filter) && array_key_exists("rimo_workorder_status", $filter) && is_array($filter['rimo_workorder_status']) && in_array("Clarify", $filter['rimo_workorder_status'])) ? "selected='selected'" : ""?>>Clarify</option>
<option value="Accepted" <?=(isset($filter) && array_key_exists("rimo_workorder_status", $filter) && is_array($filter['rimo_workorder_status'])&& in_array("Accepted", $filter['rimo_workorder_status'])) ? "selected='selected'" : ""?>>Accepted</option>
@@ -335,6 +335,13 @@ $pagination_entity_name = "Vorbestellungen";
</select>
</div>
<div class="col-sm-12 col-md-1">
<label class="form-label" for="filter_fcp">FCP</label>
<select name="filter[fcp][]" id="filter_fcp" multiple class="form-control">
<option value="">Kein FCP gefunden</option>
</select>
</div>
<div class="col-sm-12 col-md-2">
<label class="form-label" for="filter_rimo_workorder_team_id">Rimo Workorder Assigned Team</label>
<select name="filter[rimo_workorder_team_id]" id="filter_rimo_workorder_team_id" class="form-control">
@@ -848,6 +855,8 @@ $pagination_entity_name = "Vorbestellungen";
});
//fetch fcps and show on map
getFCPs(preorderMap);
// calculate center position
mapCenterPos = GetCenterFromDegrees(all_coords);
@@ -856,6 +865,23 @@ $pagination_entity_name = "Vorbestellungen";
return true;
}
async function getFCPs(map) {
var fcp = await $.get("<?=self::getUrl("Preorder", "Api")?>", {
do: "getFCPsForCampaign",
campaign_id: "<?=$campaign->id?>"
});
if(fcp.status == "OK") {
fcp.result.forEach((fcp) => {
var icon = L.MakiMarkers.icon({icon: "viewpoint", color: "yellow", size: "m"});
var marker = L.marker([fcp.lat, fcp.lng], {icon: icon}).addTo(map);
var google_maps_link = "https://www.google.com/maps/search/?api=1&query=" + fcp.lat + "," + fcp.lng;
var popup_content = "<a href='" + google_maps_link + "' target='_blank'>Google Maps</a><br />" + fcp.text;
marker.bindPopup(popup_content);
});
}
}
function centerMap() {
preorderMap.setView(mapCenterPos, 12);
}
@@ -1483,4 +1509,45 @@ $pagination_entity_name = "Vorbestellungen";
}
</script>
<script>
$(document).ready(function() {
const fcpSelect = $("#filter_fcp");
const campaignSelect = $("#filter_preordercampaign_id");
const apiUrl = "<?=self::getUrl("Preorder", "Api")?>";
fcpSelect.select2({ data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true });
campaignSelect.on("change", function() {
const campaign_id = $(this).val();
if (!campaign_id) {
fcpSelect.empty().select2({ data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true });
return;
}
$.get(apiUrl, { do: "getFCPsForCampaign", campaign_id: campaign_id }, (success) => {
let fcpData = [];
let opts = { data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true };
if (success?.status === "OK" && Array.isArray(success.result)) {
fcpData = success.result;
fcpData.unshift({ id: "", text: "" });
fcpData.sort((a, b) => {
const aN = a.text.replace(/\D/g, ""), bN = b.text.replace(/\D/g, "");
return aN && bN ? parseInt(aN, 10) - parseInt(bN, 10) : a.text.localeCompare(b.text);
});
opts = { data: fcpData, placeholder: "", allowClear: true };
fcpSelect.empty().select2(opts);
const searchParams = new URLSearchParams(window.location.search);
const fcpValues = searchParams.getAll("filter[fcp][]");
if (fcpValues && fcpValues.length > 0) {
fcpSelect.val(fcpValues).trigger("change");
}
} else {
fcpSelect.empty().select2(opts);
}
}, "json").fail(() => {
fcpSelect.empty().select2({ data: [], placeholder: "Fehler", allowClear: true });
});
});
campaignSelect.trigger("change");
});
</script>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
+11
View File
@@ -12,6 +12,7 @@ if(!$no_filename) {
$status_flags_header = [];
foreach(PreorderStatusflagModel::getAll() as $sflag) {
$status_flags_header[$sflag->code] = $sflag->code;
$status_flags_header[$sflag->code . " Datum"] = $sflag->code . " Datum";
}
?>
@@ -35,6 +36,16 @@ while($data = mysqli_fetch_object($res)):
$statusflags = [];
foreach($preorder->statusflags as $sflag) {
$statusflags[$sflag->code] = $sflag->value->value ? 1 : 0;
if($sflag->value->value) {
$historyEntry = PreorderHistoryModel::getFirst([
"preorder_id" => $preorder->id,
"key" => "preorderstatusflag-".$sflag->id."-value",
"new_value" => 1
]);
$statusflags[$sflag->code . " Datum"] = ($historyEntry) ? date("Y-m-d H:i:s", $historyEntry->create) : "";
} else {
$statusflags[$sflag->code . " Datum"] = "";
}
}
$discounts = [];
@@ -416,6 +416,33 @@
<td class="text-monospace"><?=$preorder->adb_wohneinheit->ftu_data["id"]?>
</tr>
</table>
<h3>FCP</h3>
<?php
if($preorder->fcp): ?>
<table class="table table-sm table-striped">
<tr>
<th>FCP Name:</th>
<td class="text-monospace"><?=$preorder->fcp->name?>
</tr><tr>
<th>FCP External ID:</th>
<td class="text-monospace"><?=$preorder->fcp->rimo_id?>
</tr>
<tr>
<th>FCP Execution State:</th>
<td class="text-monospace"><?=$preorder->fcp->rimo_ex_state?>
</tr><tr>
<th>FCP Operational State:</th>
<td class="text-monospace"><?=($preorder->fcp->rimo_op_state != "Undefined") ? $preorder->fcp->rimo_op_state : ""?>
</tr><tr>
<th>FCP Building Type:</th>
<td class="text-monospace"><?=$preorder->fcp->building_type?>
</tr>
</table>
<?php else: ?>
<p>Kein FCP zugewiesen</p>
<?php endif; ?>
</div>
</div>
+118 -1
View File
@@ -73,6 +73,10 @@
<?php else: ?>
<a class="btn btn-secondary" href="<?=self::getUrl("Preorderlogistics")?>">Filter zurücksetzen</a>
<?php endif; ?>
<button id="printAllInView" type="button" class="btn btn-success">Alle in der Liste drucken</button>
<button id="csvExportAddressesAndMarkAsSent" type="button" class="btn btn-success">CSV Export für Versand</button>
</div>
</div>
</form>
@@ -106,7 +110,16 @@
<th></th>
</tr>
<?php foreach($preorders as $preorder): ?>
<tr class="preorder-list-tr" id="preorder-<?=$preorder->id?>">
<tr class="preorder-list-tr" id="preorder-<?=$preorder->id?>"
data-ucode="<?=$preorder->ucode?>"
data-oaid="<?=$preorder->oaid?>"
data-addr-name="<?=$preorder->company ? $preorder->company : $preorder->firstname." ".$preorder->lastname?>"
data-addr-street="<?=$preorder->street?><?=($preorder->housenumber) ? " ".$preorder->housenumber : ""?>"
data-addr-zip="<?=$preorder->zip?>"
data-addr-city="<?=$preorder->city?>"
data-phone="<?=$preorder->phone?>"
data-email="<?=$preorder->email?>"
>
<td class="text-right align-middle"><button type="button" class="btn btn-sm btn-success font-weight-bold" onclick="printShippingSlip(<?=$preorder->id?>)"><i class="fas fa-fw fa-print"></i> DRUCKEN</button> </td>
<td class="text-center align-middle">
<label>Versandt <i class="fas fa-check text-success hidden" id="sent-label-<?=$preorder->id?>"></i>
@@ -197,4 +210,108 @@
</script>
<script>
function printAllInView() {
console.log("printAllInView");
$("#printAllInView").html('<i class="fas fa-spinner fa-spin"></i> Bitte warten...');
$("#printAllInView").prop("disabled", true);
var preorderIds = [];
$(".preorder-list-tr").each(function() {
var id = $(this).attr("id").replace("preorder-", "");
preorderIds.push(id);
});
var printUrls = preorderIds.map(function(id) {
return "<?=self::getUrl("Preorderlogistics", "print")?>?id=" + id;
});
var printWindows = [];
var loadedCount = 0;
var combinedHtml = "";
function loadAndCombine(url, index) {
$.get(url, function(html) {
combinedHtml += html;
loadedCount++;
if (loadedCount === printUrls.length) {
var combinedWindow = window.open("", "_blank");
combinedWindow.document.write(combinedHtml);
combinedWindow.document.close();
// sleep for 1 second to allow the window to load
setTimeout(function() {
combinedWindow.focus();
combinedWindow.print();
}, 1000);
$("#printAllInView").html('Alle in der Liste drucken');
$("#printAllInView").prop("disabled", false);
}
});
}
printUrls.forEach(loadAndCombine);
}
$("#printAllInView").on("click", printAllInView);
async function csvExportAddressesAndMarkAsSent(){
//show confirmation dialog to the user browser api
if(!confirm("Möchten Sie die Adressen als CSV exportieren und als versendet markieren?")) {
return;
}
$("#csvExportAddressesAndMarkAsSent").html('<i class="fas fa-spinner fa-spin"></i> Bitte warten...');
// show a confirmation dialog to the user
// use .preorder-list-tr and data-ucode, data-oaid, data-addr-name, data-addr-street, data-addr-zip, data-addr-city to export to csv
// after exporting mark as sent for each preorder
var preorderIds = [];
$(".preorder-list-tr").each(function() {
var id = $(this).attr("id").replace("preorder-", "");
preorderIds.push(id);
});
var csvData = "ucode,oaid,addr_name,addr_street,addr_zip,addr_city,phone,email\n";
$(".preorder-list-tr").each(function() {
var ucode = $(this).data("ucode");
var oaid = $(this).data("oaid");
var addr_name = $(this).data("addr-name");
var addr_street = $(this).data("addr-street");
var addr_zip = $(this).data("addr-zip");
var addr_city = $(this).data("addr-city");
var phone = $(this).data("phone");
var email = $(this).data("email");
csvData += ucode + "," + oaid + "," + addr_name + "," + addr_street + "," + addr_zip + "," + addr_city + "," + phone + "," + email + "\n";
});
// create a blob from the csv data
var blob = new Blob([csvData], { type: "text/csv;charset=utf-8;" });
var link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.setAttribute("download", "addresses.csv");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// mark all as sent
for (const preorderId of preorderIds) {
await $.post("<?=self::getUrl("Preorderlogistics", "Api")?>", {
do: "saveSent",
id: preorderId,
sent: 1
});
$("#sent-label-" + preorderId).show();
$("#sent-" + preorderId).prop("checked", true);
}
window.notify('success', 'Adressen als CSV exportiert und als versendet markiert');
$("#csvExportAddressesAndMarkAsSent").html('CSV Export für Versand');
}
$("#csvExportAddressesAndMarkAsSent").on("click", csvExportAddressesAndMarkAsSent);
</script>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
@@ -17,17 +17,18 @@
<style>
body {
margin-top: 0;
padding-top: 20pt;
font-family: "Calibri", "Open Sans", "Dejavu Sans", dejavusans, sans-serif;
font-size: 12pt;
font-size: 11pt;
}
.container {
padding-top: 20pt;
margin-left: 64pt;
margin-right: 64pt;
}
</style>
</head>
<body>
<div>
<div class="container">
<div style="text-align: right;">
<img src="<?=self::getResourcePath()?>assets/images/rml-logo-header.png" style="height:80pt;" />
@@ -42,8 +43,9 @@
<?php endif; ?>
<?php if($preorder->lastname): ?>
<?=$preorder->firstname?> <?=$preorder->lastname?><br />
<?php endif; ?>
<?=$preorder->street?><br />
<?=$preorder->street?> <?=$preorder->housenumber?><br />
<?=$preorder->zip?> <?=$preorder->city?>
</p>
<p style="text-align: right; padding-top: 4pt;">Liezen, <?=date("d.m.Y")?></p>
@@ -98,11 +100,10 @@
<div>
<p style="font-size: 8pt">PS: Für die Region, bleibt in der Region, gehört der Region. Dieser Mehrwert zeichnet unsere regionale Glasfaser-Offensive in den 29 Gemeinden des Bezirks Liezen aus. Sie sind mit Ihrem Glasfaseranschluss jetzt ein Teil davon.</p>
</div>
<br><br>
</div>
<img src="<?=self::getResourcePath()?>assets/images/rml-preorderlogistic-footer.png" style="width:100%;margin-top: 12pt;margin-left:4pt;margin-right:4pt" />
</div>
<div style="position: absolute; bottom:0;">
<img src="<?=self::getResourcePath()?>assets/images/rml-preorderlogistic-footer.png" style="width:100%;" />
</div>
</body>
</html>
</html>
+1
View File
@@ -21,6 +21,7 @@ $additionalCSS = [
...$additionalCSS,
'plugins/daterangepicker/daterangepicker.css',
'plugins/vue/tt-components/css/tt-table.css',
'plugins/vue/tt-components/css/tt-tooltip.css',
'plugins/vue/tt-components/css/tt-loader.css',
'plugins/vue/tt-components/css/tt-position-manager.css',
];
+5
View File
@@ -75,6 +75,11 @@
<?php endforeach; ?>
<?php endif; ?>
<?php if(isset($additionalHead) && is_array($additionalHead) && count($additionalHead)):
foreach($additionalHead as $head): ?>
<?=$head?>
<?php endforeach; endif;?>
<?php if(MFAPPNAME == "devthetool"): ?>
<style type="text/css">
body {
+8 -8
View File
@@ -141,17 +141,16 @@
<?php endif; ?>
<?php if($me->is(["Admin"]) || $me->can(["Cpeprovisioning", "Cpeshipping"])): ?>
<li class="has-submenu mobile-hide">
<li class="has-submenu">
<a href="#">
<i class="fad fa-fw fa-running"></i>Netzbetrieb <div class="arrow-down"></div>
</a>
<ul class="submenu">
<?php if($me->isAdmin() || $me->can("Cpeprovisioning")): ?><li><a href="<?=self::getUrl("Cpeprovisioning")?>"><i class="fad fa-fw fa-hdd text-info"></i> CPE Provisioning</a></li><?php endif; ?>
<?php if($me->isAdmin() || $me->can("Cpeshipping")): ?><li><a href="<?=self::getUrl("Cpeshipping")?>"><i class="fad fa-fw fa-shipping-fast text-info"></i> CPE Versand</a></li><?php endif; ?>
<?php if($me->isAdmin() || $me->can("Cpeprovisioning")): ?><li class="mobile-hide"><a href="<?=self::getUrl("Cpeprovisioning")?>"><i class="fad fa-fw fa-hdd text-info"></i> CPE Provisioning</a></li><?php endif; ?>
<?php if($me->isAdmin() || $me->can("Cpeshipping")): ?><li class="mobile-hide"><a href="<?=self::getUrl("Cpeshipping")?>"><i class="fad fa-fw fa-shipping-fast text-info"></i> CPE Versand</a></li><?php endif; ?>
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("Domain")?>"><i class="fad fa-fw fa-globe text-info"></i> Domains</a></li><?php endif; ?>
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("IpNetwork")?>"><i class="fa-solid fa-network-wired text-info"></i> IPAM</a></li><?php endif; ?>
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("DeviceMonitoring/congestion")?>"><i class="fa-solid fa-block-brick-fire text-info"></i> Device Congestion</a></li><?php endif; ?>
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("MaintenanceNotification")?>"><i class="fa-solid fa-envelope-badge text-info"></i> Wartungsmeldungen</a></li><?php endif; ?>
<?php if($me->isAdmin()) : ?><li class="mobile-hide"><a href="<?=self::getUrl("MaintenanceNotification")?>"><i class="fa-solid fa-envelope-badge text-info"></i> Wartungsmeldungen</a></li><?php endif; ?>
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("Radius")?>"><i class="fas fa-broadcast-tower text-info"></i> Radius</a></li><?php endif; ?>
</ul>
</li>
@@ -169,9 +168,10 @@
<ul class="submenu">
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li class="has-sub-submenu font-weight-bold"><a>XINON</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li><a href="<?=self::getUrl("WarehouseArticle")?>"><i class="far fa-fw fa-box text-info"></i> Artikel</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseItem")?>"><i class="far fa-fw fa-boxes text-info"></i> Lagerbestand (WIP)</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOrderRecommendation")?>"><i class="far fa-fw fa-box-full text-info"></i> Bestellvorschläge (WIP)</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOrder")?>"><i class="far fa-fw fa-shopping-bag text-info"></i> Bestellungen (WIP)</a></li><?php endif; ?>
<!-- --><?php //if($me->can("WarehouseAdmin")): ?><!--<li><a href="--><?php //=self::getUrl("WarehouseItem")?><!--"><i class="far fa-fw fa-boxes text-info"></i> Lagerbestand (WIP)</a></li>--><?php //endif; ?>
<!-- --><?php //if($me->can("WarehouseAdmin")): ?><!--<li><a href="--><?php //=self::getUrl("WarehouseOrderRecommendation")?><!--"><i class="far fa-fw fa-box-full text-info"></i> Bestellvorschläge (WIP)</a></li>--><?php //endif; ?>
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOrder")?>"><i class="far fa-fw fa-shopping-bag text-info"></i> Bestellungen</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOffer")?>"><i class="far fa-fw fa-file-signature text-info"></i> Angebote</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li><a href="<?=self::getUrl("WarehouseOrderRequest")?>"><i class="far fa-fw fa-shopping-cart text-info"></i> Bestellwünsche</a></li><?php endif; ?>
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li><a href="<?=self::getUrl("WarehouseShippingNote")?>"><i class="far fa-fw fa-shipping-fast text-info"></i> Lieferscheine</a></li><?php endif; ?>
+11 -3
View File
@@ -50,13 +50,21 @@
<?php endforeach; ?>
<?php endif; ?>
<?php if(MFAPPNAME == "devthetool"): ?>
<style type="text/css">
<?php if(isset($additionalHead) && is_array($additionalHead) && count($additionalHead)):
foreach($additionalHead as $head): ?>
<?=$head?>
<?php endforeach; endif;?>
<style>
<?php if(MFAPPNAME == "devthetool"): ?>
body {
border-left: 8px dashed #f672a7;
}
<?php endif; ?>
body {
min-height: 100vh;
}
</style>
<?php endif; ?>
</head>