Rôles, tableau de bord et tests unitaires

This commit is contained in:
Yasser Boulayoune 2026-04-07 16:26:00 +02:00
parent f508a2fcb5
commit 1799035236
51 changed files with 4350 additions and 0 deletions

View file

@ -0,0 +1,128 @@
{% extends 'base.html.twig' %}
{% block title %}Edit {{ server.name }} - ServerControl{% endblock %}
{% block stylesheets %}
<style>
.form-section-title {
font-size: .7rem;
font-weight: 700;
letter-spacing: .1em;
text-transform: uppercase;
color: #6c757d;
margin-bottom: .75rem;
padding-bottom: .4rem;
border-bottom: 1px solid rgba(108,117,125,.2);
}
.field-icon { color: #6c757d; }
.input-group-text { background: transparent; }
</style>
{% endblock %}
{% block body %}
<div class="row justify-content-center">
<div class="col-md-7 col-lg-6">
<a href="{{ path('app_server_show', {id: server.id}) }}" class="text-muted text-decoration-none small">
<i class="bi bi-arrow-left me-1"></i>Back to {{ server.name }}
</a>
<div class="card mt-3">
<div class="card-header py-3 d-flex align-items-center gap-2">
<i class="bi bi-pencil-square fs-5 text-warning"></i>
<div>
<h5 class="mb-0">Edit server</h5>
<small class="text-muted">{{ server.name }} — {{ server.ipAddress }}</small>
</div>
</div>
<div class="card-body p-4">
{{ form_start(form) }}
<p class="form-section-title"><i class="bi bi-info-circle me-1"></i>General</p>
<div class="mb-3">
<label class="form-label fw-semibold">Server name</label>
<div class="input-group">
<span class="input-group-text field-icon"><i class="bi bi-tag"></i></span>
{{ form_widget(form.name, {attr: {class: 'form-control'}}) }}
</div>
{{ form_errors(form.name) }}
</div>
<div class="mb-4">
<label class="form-label fw-semibold">Description <span class="text-muted fw-normal">(optional)</span></label>
<div class="input-group">
<span class="input-group-text field-icon"><i class="bi bi-card-text"></i></span>
{{ form_widget(form.description, {attr: {class: 'form-control', rows: 2}}) }}
</div>
{{ form_errors(form.description) }}
</div>
<p class="form-section-title"><i class="bi bi-terminal me-1"></i>SSH Connection</p>
<div class="row g-3 mb-3">
<div class="col-8">
<label class="form-label fw-semibold">IP Address</label>
<div class="input-group">
<span class="input-group-text field-icon"><i class="bi bi-router"></i></span>
{{ form_widget(form.ipAddress, {attr: {class: 'form-control'}}) }}
</div>
{{ form_errors(form.ipAddress) }}
</div>
<div class="col-4">
<label class="form-label fw-semibold">SSH Port</label>
<div class="input-group">
<span class="input-group-text field-icon"><i class="bi bi-plug"></i></span>
{{ form_widget(form.sshPort, {attr: {class: 'form-control'}}) }}
</div>
{{ form_errors(form.sshPort) }}
</div>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">SSH User</label>
<div class="input-group">
<span class="input-group-text field-icon"><i class="bi bi-person-badge"></i></span>
{{ form_widget(form.sshUser, {attr: {class: 'form-control'}}) }}
</div>
{{ form_errors(form.sshUser) }}
</div>
<div class="mb-4">
<label class="form-label fw-semibold">SSH Password</label>
<div class="input-group">
<span class="input-group-text field-icon"><i class="bi bi-key"></i></span>
{{ form_widget(form.sshPassword, {attr: {class: 'form-control', placeholder: 'Leave blank to keep current password', id: 'ssh-password-input'}}) }}
<button class="btn btn-outline-secondary" type="button" onclick="togglePwd()">
<i class="bi bi-eye" id="pwd-eye"></i>
</button>
</div>
<div class="form-text"><i class="bi bi-info-circle me-1"></i>Leave blank to keep the current password.</div>
{{ form_errors(form.sshPassword) }}
</div>
<div class="d-flex gap-2 pt-2 border-top">
<button type="submit" class="btn btn-warning px-4">
<i class="bi bi-floppy me-1"></i>Save changes
</button>
<a href="{{ path('app_server_show', {id: server.id}) }}" class="btn btn-outline-secondary">Cancel</a>
</div>
{{ form_end(form) }}
</div>
</div>
</div>
</div>
{% endblock %}
{% block javascripts %}
<script>
function togglePwd() {
const input = document.getElementById('ssh-password-input');
const eye = document.getElementById('pwd-eye');
if (input.type === 'password') {
input.type = 'text';
eye.className = 'bi bi-eye-slash';
} else {
input.type = 'password';
eye.className = 'bi bi-eye';
}
}
</script>
{% endblock %}