From 28f10cda3ed281d6f56f5745b7f8c1777c1866a0 Mon Sep 17 00:00:00 2001 From: Jonas Leder <jonas@jonasled.de> Date: Fri, 31 Mar 2023 23:37:27 +0200 Subject: [PATCH] add page to edit servers --- src/Controller/AdminController.php | 30 +++++++++++++++++ .../Components/ServerAccordionComponent.php | 20 +++++++++++ templates/components/header.html.twig | 1 + .../components/server_accordion.html.twig | 33 +++++++++++++++++++ templates/pages/admin/server.html.twig | 12 +++++++ 5 files changed, 96 insertions(+) create mode 100644 src/Twig/Components/ServerAccordionComponent.php create mode 100644 templates/components/server_accordion.html.twig create mode 100644 templates/pages/admin/server.html.twig diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 80d5912..caf56bb 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 0000000..9139924 --- /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 7c98d6a..8ebbfa6 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 0000000..974649e --- /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 0000000..8fdfbe3 --- /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 -- GitLab