diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 80d59123c68878c9335e76c11ad2fff8e872548d..caf56bbb0f08b5e0939a1d31b328e3c81101e69d 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Entity\Server; use App\Entity\Users; use App\Entity\WebResetter; use App\Repository\ServerRepository; @@ -160,4 +161,33 @@ class AdminController extends AbstractController 'expandedDevice'=> $deviceID ]); } + + #[Route('/admin/servers/{expandedDevice}', name: 'app_admin_servers', methods: ['GET'])] + public function getServers(ServerRepository $serverRepository, int $expandedDevice = -1): Response { + return $this->render('pages/admin/server.html.twig', [ + 'servers' => $serverRepository->findAll(), + 'expandedId' => $expandedDevice + ]); + + } + + #[Route('/admin/servers', name: 'app_admin_servers_edit', methods: ['POST'])] + public function editServer(ServerRepository $serverRepository, Request $request, ManagerRegistry $doctrine): Response + { + $server = $serverRepository->findOneBy(['id' => $request->request->get('server')]); + if (!$server) { + $server = new Server(); + $doctrine->getManager()->persist($server); + } + + $server->setName($request->request->get('name')); + $server->setIpAddress($request->request->get('ipaddress')); + $server->setApikey($request->request->get('apikey')); + + $doctrine->getManager()->flush(); + + return $this->redirectToRoute('app_admin_servers', [ + 'expandedDevice' => $server->getId() + ]); + } } \ No newline at end of file diff --git a/src/Twig/Components/ServerAccordionComponent.php b/src/Twig/Components/ServerAccordionComponent.php new file mode 100644 index 0000000000000000000000000000000000000000..9139924657ecb1c54006cb6ae7639ea354121797 --- /dev/null +++ b/src/Twig/Components/ServerAccordionComponent.php @@ -0,0 +1,20 @@ +<?php + +namespace App\Twig\Components; + +use App\Entity\Server; +use Symfony\UX\TwigComponent\Attribute\AsTwigComponent; + +#[AsTwigComponent('server_accordion')] +final class ServerAccordionComponent +{ + public ?Server $server; + public bool $expanded = false; + + public function __construct() + { + if (!isset($this->server)) { + $this->server = new Server(); + } + } +} diff --git a/templates/components/header.html.twig b/templates/components/header.html.twig index 7c98d6aa567ff3076077ca629ddf4f0f3cf6b82c..8ebbfa615748ca53be095fe5a0bcab84f5d343bd 100644 --- a/templates/components/header.html.twig +++ b/templates/components/header.html.twig @@ -8,6 +8,7 @@ {% if is_granted('ROLE_ADMIN') %} {{ component('nav_item', {page: 'app_admin_users', title: 'Users'}) }} {{ component('nav_item', {page: 'app_admin_devices', title: 'Devices'}) }} + {{ component('nav_item', {page: 'app_admin_servers', title: 'Servers'}) }} {% endif %} </ul> diff --git a/templates/components/server_accordion.html.twig b/templates/components/server_accordion.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..974649e7a87bfa54ecffd5877fc6311a475fb823 --- /dev/null +++ b/templates/components/server_accordion.html.twig @@ -0,0 +1,33 @@ +<div class="accordion-item"> + <h2 class="accordion-header" id="headingserver{{ server.id }}"> + <button class="accordion-button {% if not expanded %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapseserver{{ server.id }}" aria-expanded="true" aria-controls="collapseserver{{ server.id }}"> + {% if server.id %} + {{ server.name }} + {% else %} + Create new Server + {% endif %} + </button> + </h2> + <div id="collapseserver{{ server.id }}" class="accordion-collapse collapse {% if expanded %}show{% endif %}" aria-labelledby="headingserver{{ server.id }}" data-bs-parent="#accordionExample"> + <div class="accordion-body"> + <form method="post" action="{{ path('app_admin_servers_edit') }}"> + <input type="hidden" name="server" value="{{ server.id ?: 'new' }}"> + <div class="mb-3"> + <label for="displayNameInput" class="form-label">Name</label> + <input type="text" class="form-control" id="displayNameInput" name="name" placeholder="My Server" value="{{ server.name }}"> + </div> + <div class="mb-3"> + <label for="displayIpInput" class="form-label">IP Address</label> + <input type="text" class="form-control" id="displayIpInput" name="ipaddress" placeholder="192.168.0.1" value="{{ server.ipAddress }}" maxlength="15"> + </div> + <div class="mb-3"> + <label for="displayApikeyInput" class="form-label">API Key</label> + <input type="text" class="form-control" id="displayApikeyInput" name="apikey" placeholder="verysecureapikey" value="{{ server.apikey }}"> + </div> + <div class="mb-3"> + <button class="btn btn-primary"><i class="fa-solid fa-save" aria-hidden="true"></i> Save</button> + </div> + </form> + </div> + </div> +</div> \ No newline at end of file diff --git a/templates/pages/admin/server.html.twig b/templates/pages/admin/server.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..8fdfbe370b9b87787417bf0e7e741e558909b83d --- /dev/null +++ b/templates/pages/admin/server.html.twig @@ -0,0 +1,12 @@ +{% extends 'page.html.twig' %} +{% block title %}Devices{% endblock %} +{% block content %} + <div class="container"> + <div class="accordion"> + {% for server in servers %} + {{ component('server_accordion', {server: server, expanded: server.id == expandedId}) }} + {% endfor %} + {{ component('server_accordion') }} + </div> + </div> +{% endblock %} \ No newline at end of file