Spaces:
Running
Running
DEVELOPPE MOI UNE APP POUR UN TECHNICIEN INFORMATQUE, creation de fiche client, avec nombre pc, et nombre serveur, lors de passage sur site pour les visites preventives, il pourra creer une fiche vp de controle, qui compendra l'ensemble des controles de maintenantce du poste et ou du serveur, il devra remplir la fiche suite aux controles, lensemble des champs de saisies ont des listes deroulantes avec tout les choix possibles pars point de controle, ou des cases a coche....le but etant de remplir rapidement les elements controles
Browse files- README.md +8 -5
- clients.html +138 -0
- components/footer.js +56 -0
- components/navbar.js +102 -0
- index.html +76 -19
- reports.html +113 -0
- script.js +42 -0
- style.css +21 -18
- vp-detail.html +169 -0
- vp.html +150 -0
README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: TechGuard VP Manager ️🔧
|
| 3 |
+
colorFrom: purple
|
| 4 |
+
colorTo: yellow
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
clients.html
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Gestion Clients | TechGuard VP</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/navbar.js"></script>
|
| 12 |
+
<script src="components/footer.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gray-100">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8">
|
| 18 |
+
<div class="flex justify-between items-center mb-8">
|
| 19 |
+
<h1 class="text-3xl font-bold text-gray-800">Gestion des Clients</h1>
|
| 20 |
+
<button onclick="openClientModal()" class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 21 |
+
<i data-feather="plus" class="mr-2"></i> Nouveau Client
|
| 22 |
+
</button>
|
| 23 |
+
</div>
|
| 24 |
+
|
| 25 |
+
<div class="bg-white rounded-lg shadow overflow-hidden">
|
| 26 |
+
<div class="overflow-x-auto">
|
| 27 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 28 |
+
<thead class="bg-gray-50">
|
| 29 |
+
<tr>
|
| 30 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Nom</th>
|
| 31 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Adresse</th>
|
| 32 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">PC</th>
|
| 33 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Serveurs</th>
|
| 34 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
|
| 35 |
+
</tr>
|
| 36 |
+
</thead>
|
| 37 |
+
<tbody class="bg-white divide-y divide-gray-200">
|
| 38 |
+
<!-- Sample data - would be populated from API in real app -->
|
| 39 |
+
<tr>
|
| 40 |
+
<td class="px-6 py-4 whitespace-nowrap">Entreprise A</td>
|
| 41 |
+
<td class="px-6 py-4 whitespace-nowrap">123 Rue Principale, Paris</td>
|
| 42 |
+
<td class="px-6 py-4 whitespace-nowrap">15</td>
|
| 43 |
+
<td class="px-6 py-4 whitespace-nowrap">2</td>
|
| 44 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 45 |
+
<button class="text-blue-600 hover:text-blue-800 mr-3">
|
| 46 |
+
<i data-feather="edit"></i>
|
| 47 |
+
</button>
|
| 48 |
+
<button class="text-red-600 hover:text-red-800">
|
| 49 |
+
<i data-feather="trash-2"></i>
|
| 50 |
+
</button>
|
| 51 |
+
</td>
|
| 52 |
+
</tr>
|
| 53 |
+
<tr>
|
| 54 |
+
<td class="px-6 py-4 whitespace-nowrap">Société B</td>
|
| 55 |
+
<td class="px-6 py-4 whitespace-nowrap">456 Avenue Centrale, Lyon</td>
|
| 56 |
+
<td class="px-6 py-4 whitespace-nowrap">8</td>
|
| 57 |
+
<td class="px-6 py-4 whitespace-nowrap">1</td>
|
| 58 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 59 |
+
<button class="text-blue-600 hover:text-blue-800 mr-3">
|
| 60 |
+
<i data-feather="edit"></i>
|
| 61 |
+
</button>
|
| 62 |
+
<button class="text-red-600 hover:text-red-800">
|
| 63 |
+
<i data-feather="trash-2"></i>
|
| 64 |
+
</button>
|
| 65 |
+
</td>
|
| 66 |
+
</tr>
|
| 67 |
+
</tbody>
|
| 68 |
+
</table>
|
| 69 |
+
</div>
|
| 70 |
+
</div>
|
| 71 |
+
</main>
|
| 72 |
+
|
| 73 |
+
<!-- Client Modal -->
|
| 74 |
+
<div id="clientModal" class="fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center hidden">
|
| 75 |
+
<div class="bg-white rounded-lg shadow-xl w-full max-w-2xl">
|
| 76 |
+
<div class="flex justify-between items-center border-b px-6 py-4">
|
| 77 |
+
<h3 class="text-xl font-semibold text-gray-800">Nouveau Client</h3>
|
| 78 |
+
<button onclick="closeClientModal()" class="text-gray-500 hover:text-gray-700">
|
| 79 |
+
<i data-feather="x"></i>
|
| 80 |
+
</button>
|
| 81 |
+
</div>
|
| 82 |
+
<div class="p-6">
|
| 83 |
+
<form id="clientForm">
|
| 84 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 85 |
+
<div>
|
| 86 |
+
<label for="clientName" class="block text-sm font-medium text-gray-700 mb-1">Nom du client</label>
|
| 87 |
+
<input type="text" id="clientName" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 88 |
+
</div>
|
| 89 |
+
<div>
|
| 90 |
+
<label for="clientAddress" class="block text-sm font-medium text-gray-700 mb-1">Adresse</label>
|
| 91 |
+
<input type="text" id="clientAddress" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 92 |
+
</div>
|
| 93 |
+
<div>
|
| 94 |
+
<label for="pcCount" class="block text-sm font-medium text-gray-700 mb-1">Nombre de PC</label>
|
| 95 |
+
<input type="number" id="pcCount" min="0" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 96 |
+
</div>
|
| 97 |
+
<div>
|
| 98 |
+
<label for="serverCount" class="block text-sm font-medium text-gray-700 mb-1">Nombre de serveurs</label>
|
| 99 |
+
<input type="number" id="serverCount" min="0" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 100 |
+
</div>
|
| 101 |
+
</div>
|
| 102 |
+
<div class="mt-6">
|
| 103 |
+
<label for="clientNotes" class="block text-sm font-medium text-gray-700 mb-1">Notes</label>
|
| 104 |
+
<textarea id="clientNotes" rows="3" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"></textarea>
|
| 105 |
+
</div>
|
| 106 |
+
</form>
|
| 107 |
+
</div>
|
| 108 |
+
<div class="flex justify-end border-t px-6 py-4">
|
| 109 |
+
<button onclick="closeClientModal()" class="mr-3 px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50">Annuler</button>
|
| 110 |
+
<button onclick="saveClient()" class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700">Enregistrer</button>
|
| 111 |
+
</div>
|
| 112 |
+
</div>
|
| 113 |
+
</div>
|
| 114 |
+
|
| 115 |
+
<custom-footer></custom-footer>
|
| 116 |
+
|
| 117 |
+
<script>
|
| 118 |
+
feather.replace();
|
| 119 |
+
|
| 120 |
+
function openClientModal() {
|
| 121 |
+
document.getElementById('clientModal').classList.remove('hidden');
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
function closeClientModal() {
|
| 125 |
+
document.getElementById('clientModal').classList.add('hidden');
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
function saveClient() {
|
| 129 |
+
if (validateForm('clientForm')) {
|
| 130 |
+
// Here you would typically save to API
|
| 131 |
+
alert('Client enregistré avec succès!');
|
| 132 |
+
closeClientModal();
|
| 133 |
+
}
|
| 134 |
+
}
|
| 135 |
+
</script>
|
| 136 |
+
<script src="script.js"></script>
|
| 137 |
+
</body>
|
| 138 |
+
</html>
|
components/footer.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomFooter extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.footer {
|
| 7 |
+
background-color: #1a202c;
|
| 8 |
+
}
|
| 9 |
+
.footer-link:hover {
|
| 10 |
+
color: #4299e1;
|
| 11 |
+
transition: color 0.3s ease;
|
| 12 |
+
}
|
| 13 |
+
</style>
|
| 14 |
+
<footer class="footer text-white py-8">
|
| 15 |
+
<div class="container mx-auto px-4">
|
| 16 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
| 17 |
+
<div>
|
| 18 |
+
<h3 class="text-xl font-bold mb-4">TechGuard VP</h3>
|
| 19 |
+
<p class="text-gray-400">Solution de gestion des visites préventives pour techniciens informatiques.</p>
|
| 20 |
+
</div>
|
| 21 |
+
<div>
|
| 22 |
+
<h4 class="text-lg font-semibold mb-4">Navigation</h4>
|
| 23 |
+
<ul class="space-y-2">
|
| 24 |
+
<li><a href="index.html" class="footer-link text-gray-400 hover:text-white">Accueil</a></li>
|
| 25 |
+
<li><a href="clients.html" class="footer-link text-gray-400 hover:text-white">Clients</a></li>
|
| 26 |
+
<li><a href="vp.html" class="footer-link text-gray-400 hover:text-white">Visites Préventives</a></li>
|
| 27 |
+
<li><a href="reports.html" class="footer-link text-gray-400 hover:text-white">Rapports</a></li>
|
| 28 |
+
</ul>
|
| 29 |
+
</div>
|
| 30 |
+
<div>
|
| 31 |
+
<h4 class="text-lg font-semibold mb-4">Support</h4>
|
| 32 |
+
<ul class="space-y-2">
|
| 33 |
+
<li><a href="#" class="footer-link text-gray-400 hover:text-white">Documentation</a></li>
|
| 34 |
+
<li><a href="#" class="footer-link text-gray-400 hover:text-white">FAQ</a></li>
|
| 35 |
+
<li><a href="#" class="footer-link text-gray-400 hover:text-white">Contact</a></li>
|
| 36 |
+
</ul>
|
| 37 |
+
</div>
|
| 38 |
+
<div>
|
| 39 |
+
<h4 class="text-lg font-semibold mb-4">Contact</h4>
|
| 40 |
+
<ul class="space-y-2">
|
| 41 |
+
<li class="flex items-center text-gray-400"><i data-feather="mail" class="mr-2"></i> contact@techguardvp.com</li>
|
| 42 |
+
<li class="flex items-center text-gray-400"><i data-feather="phone" class="mr-2"></i> +33 1 23 45 67 89</li>
|
| 43 |
+
<li class="flex items-center text-gray-400"><i data-feather="map-pin" class="mr-2"></i> Paris, France</li>
|
| 44 |
+
</ul>
|
| 45 |
+
</div>
|
| 46 |
+
</div>
|
| 47 |
+
<div class="border-t border-gray-700 mt-8 pt-8 text-center text-gray-400">
|
| 48 |
+
<p>© 2023 TechGuard VP. Tous droits réservés.</p>
|
| 49 |
+
</div>
|
| 50 |
+
</div>
|
| 51 |
+
</footer>
|
| 52 |
+
`;
|
| 53 |
+
}
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
customElements.define('custom-footer', CustomFooter);
|
components/navbar.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomNavbar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.navbar {
|
| 7 |
+
transition: all 0.3s ease;
|
| 8 |
+
}
|
| 9 |
+
.nav-link {
|
| 10 |
+
position: relative;
|
| 11 |
+
}
|
| 12 |
+
.nav-link:after {
|
| 13 |
+
content: '';
|
| 14 |
+
position: absolute;
|
| 15 |
+
width: 0;
|
| 16 |
+
height: 2px;
|
| 17 |
+
bottom: -2px;
|
| 18 |
+
left: 0;
|
| 19 |
+
background-color: #3b82f6;
|
| 20 |
+
transition: width 0.3s ease;
|
| 21 |
+
}
|
| 22 |
+
.nav-link:hover:after {
|
| 23 |
+
width: 100%;
|
| 24 |
+
}
|
| 25 |
+
</style>
|
| 26 |
+
<nav class="navbar bg-white shadow-md">
|
| 27 |
+
<div class="container mx-auto px-4">
|
| 28 |
+
<div class="flex justify-between items-center h-16">
|
| 29 |
+
<div class="flex items-center">
|
| 30 |
+
<a href="index.html" class="flex items-center">
|
| 31 |
+
<i data-feather="shield" class="text-blue-600 mr-2"></i>
|
| 32 |
+
<span class="text-xl font-bold text-gray-800">TechGuard VP</span>
|
| 33 |
+
</a>
|
| 34 |
+
</div>
|
| 35 |
+
<div class="hidden md:block">
|
| 36 |
+
<div class="ml-10 flex items-baseline space-x-8">
|
| 37 |
+
<a href="clients.html" class="nav-link text-gray-700 hover:text-blue-600 px-3 py-2 text-sm font-medium">Clients</a>
|
| 38 |
+
<a href="vp.html" class="nav-link text-gray-700 hover:text-blue-600 px-3 py-2 text-sm font-medium">Visites Préventives</a>
|
| 39 |
+
<a href="reports.html" class="nav-link text-gray-700 hover:text-blue-600 px-3 py-2 text-sm font-medium">Rapports</a>
|
| 40 |
+
</div>
|
| 41 |
+
</div>
|
| 42 |
+
<div class="hidden md:block">
|
| 43 |
+
<div class="ml-4 flex items-center md:ml-6">
|
| 44 |
+
<button class="p-1 rounded-full text-gray-400 hover:text-gray-500 focus:outline-none">
|
| 45 |
+
<i data-feather="bell"></i>
|
| 46 |
+
</button>
|
| 47 |
+
<div class="ml-3 relative">
|
| 48 |
+
<div>
|
| 49 |
+
<button class="max-w-xs flex items-center text-sm rounded-full focus:outline-none">
|
| 50 |
+
<img class="h-8 w-8 rounded-full" src="http://static.photos/people/200x200/1" alt="User profile">
|
| 51 |
+
</button>
|
| 52 |
+
</div>
|
| 53 |
+
</div>
|
| 54 |
+
</div>
|
| 55 |
+
</div>
|
| 56 |
+
<div class="-mr-2 flex md:hidden">
|
| 57 |
+
<button id="mobile-menu-button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none">
|
| 58 |
+
<i data-feather="menu"></i>
|
| 59 |
+
</button>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
<!-- Mobile menu -->
|
| 64 |
+
<div id="mobile-menu" class="hidden md:hidden">
|
| 65 |
+
<div class="px-2 pt-2 pb-3 space-y-1 sm:px-3">
|
| 66 |
+
<a href="clients.html" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-blue-600 hover:bg-gray-50">Clients</a>
|
| 67 |
+
<a href="vp.html" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-blue-600 hover:bg-gray-50">Visites Préventives</a>
|
| 68 |
+
<a href="reports.html" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-blue-600 hover:bg-gray-50">Rapports</a>
|
| 69 |
+
</div>
|
| 70 |
+
<div class="pt-4 pb-3 border-t border-gray-200">
|
| 71 |
+
<div class="flex items-center px-5">
|
| 72 |
+
<div class="flex-shrink-0">
|
| 73 |
+
<img class="h-10 w-10 rounded-full" src="http://static.photos/people/200x200/1" alt="User profile">
|
| 74 |
+
</div>
|
| 75 |
+
<div class="ml-3">
|
| 76 |
+
<div class="text-base font-medium text-gray-800">Jean Dupont</div>
|
| 77 |
+
<div class="text-sm font-medium text-gray-500">Technicien</div>
|
| 78 |
+
</div>
|
| 79 |
+
</div>
|
| 80 |
+
</div>
|
| 81 |
+
</div>
|
| 82 |
+
</nav>
|
| 83 |
+
`;
|
| 84 |
+
|
| 85 |
+
// Add mobile menu toggle functionality
|
| 86 |
+
const mobileMenuButton = this.shadowRoot.getElementById('mobile-menu-button');
|
| 87 |
+
const mobileMenu = this.shadowRoot.getElementById('mobile-menu');
|
| 88 |
+
|
| 89 |
+
mobileMenuButton.addEventListener('click', () => {
|
| 90 |
+
mobileMenu.classList.toggle('hidden');
|
| 91 |
+
const icon = mobileMenuButton.querySelector('i');
|
| 92 |
+
if (mobileMenu.classList.contains('hidden')) {
|
| 93 |
+
icon.setAttribute('data-feather', 'menu');
|
| 94 |
+
} else {
|
| 95 |
+
icon.setAttribute('data-feather', 'x');
|
| 96 |
+
}
|
| 97 |
+
feather.replace();
|
| 98 |
+
});
|
| 99 |
+
}
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
customElements.define('custom-navbar', CustomNavbar);
|
index.html
CHANGED
|
@@ -1,19 +1,76 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>TechGuard VP Manager</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/navbar.js"></script>
|
| 12 |
+
<script src="components/footer.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gray-100">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8">
|
| 18 |
+
<div class="text-center mb-12">
|
| 19 |
+
<h1 class="text-4xl font-bold text-gray-800 mb-4">TechGuard VP Manager</h1>
|
| 20 |
+
<p class="text-xl text-gray-600">Gestion des visites préventives pour techniciens informatiques</p>
|
| 21 |
+
</div>
|
| 22 |
+
|
| 23 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
|
| 24 |
+
<!-- Client Card -->
|
| 25 |
+
<div class="bg-white rounded-lg shadow-lg overflow-hidden hover:shadow-xl transition-shadow duration-300">
|
| 26 |
+
<div class="bg-blue-600 p-4 text-white">
|
| 27 |
+
<i data-feather="users" class="inline mr-2"></i>
|
| 28 |
+
<h2 class="text-xl font-semibold inline">Clients</h2>
|
| 29 |
+
</div>
|
| 30 |
+
<div class="p-6">
|
| 31 |
+
<p class="text-gray-700 mb-6">Gérez vos clients et leurs équipements informatiques.</p>
|
| 32 |
+
<a href="clients.html" class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 33 |
+
<i data-feather="arrow-right" class="mr-2"></i> Accéder
|
| 34 |
+
</a>
|
| 35 |
+
</div>
|
| 36 |
+
</div>
|
| 37 |
+
|
| 38 |
+
<!-- VP Card -->
|
| 39 |
+
<div class="bg-white rounded-lg shadow-lg overflow-hidden hover:shadow-xl transition-shadow duration-300">
|
| 40 |
+
<div class="bg-green-600 p-4 text-white">
|
| 41 |
+
<i data-feather="clipboard" class="inline mr-2"></i>
|
| 42 |
+
<h2 class="text-xl font-semibold inline">Visites Préventives</h2>
|
| 43 |
+
</div>
|
| 44 |
+
<div class="p-6">
|
| 45 |
+
<p class="text-gray-700 mb-6">Créez et complétez vos fiches de contrôle préventif.</p>
|
| 46 |
+
<a href="vp.html" class="bg-green-600 hover:bg-green-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 47 |
+
<i data-feather="arrow-right" class="mr-2"></i> Accéder
|
| 48 |
+
</a>
|
| 49 |
+
</div>
|
| 50 |
+
</div>
|
| 51 |
+
|
| 52 |
+
<!-- Reports Card -->
|
| 53 |
+
<div class="bg-white rounded-lg shadow-lg overflow-hidden hover:shadow-xl transition-shadow duration-300">
|
| 54 |
+
<div class="bg-purple-600 p-4 text-white">
|
| 55 |
+
<i data-feather="file-text" class="inline mr-2"></i>
|
| 56 |
+
<h2 class="text-xl font-semibold inline">Rapports</h2>
|
| 57 |
+
</div>
|
| 58 |
+
<div class="p-6">
|
| 59 |
+
<p class="text-gray-700 mb-6">Consultez et exportez vos rapports de maintenance.</p>
|
| 60 |
+
<a href="reports.html" class="bg-purple-600 hover:bg-purple-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 61 |
+
<i data-feather="arrow-right" class="mr-2"></i> Accéder
|
| 62 |
+
</a>
|
| 63 |
+
</div>
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
</main>
|
| 67 |
+
|
| 68 |
+
<custom-footer></custom-footer>
|
| 69 |
+
|
| 70 |
+
<script>
|
| 71 |
+
feather.replace();
|
| 72 |
+
</script>
|
| 73 |
+
<script src="script.js"></script>
|
| 74 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 75 |
+
</body>
|
| 76 |
+
</html>
|
reports.html
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Rapports | TechGuard VP</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/navbar.js"></script>
|
| 12 |
+
<script src="components/footer.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gray-100">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8">
|
| 18 |
+
<h1 class="text-3xl font-bold text-gray-800 mb-8">Rapports</h1>
|
| 19 |
+
|
| 20 |
+
<div class="bg-white rounded-lg shadow overflow-hidden mb-8">
|
| 21 |
+
<div class="p-6 border-b border-gray-200">
|
| 22 |
+
<h2 class="text-xl font-semibold text-gray-800">Filtrer les rapports</h2>
|
| 23 |
+
<div class="mt-4 grid grid-cols-1 md:grid-cols-4 gap-4">
|
| 24 |
+
<div>
|
| 25 |
+
<label for="reportClient" class="block text-sm font-medium text-gray-700 mb-1">Client</label>
|
| 26 |
+
<select id="reportClient" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500">
|
| 27 |
+
<option value="">Tous les clients</option>
|
| 28 |
+
<option value="1">Entreprise A</option>
|
| 29 |
+
<option value="2">Société B</option>
|
| 30 |
+
</select>
|
| 31 |
+
</div>
|
| 32 |
+
<div>
|
| 33 |
+
<label for="reportTechnician" class="block text-sm font-medium text-gray-700 mb-1">Technicien</label>
|
| 34 |
+
<select id="reportTechnician" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500">
|
| 35 |
+
<option value="">Tous les techniciens</option>
|
| 36 |
+
<option value="1">Jean Dupont</option>
|
| 37 |
+
<option value="2">Marie Martin</option>
|
| 38 |
+
</select>
|
| 39 |
+
</div>
|
| 40 |
+
<div>
|
| 41 |
+
<label for="reportDateFrom" class="block text-sm font-medium text-gray-700 mb-1">De</label>
|
| 42 |
+
<input type="date" id="reportDateFrom" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500">
|
| 43 |
+
</div>
|
| 44 |
+
<div>
|
| 45 |
+
<label for="reportDateTo" class="block text-sm font-medium text-gray-700 mb-1">À</label>
|
| 46 |
+
<input type="date" id="reportDateTo" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500">
|
| 47 |
+
</div>
|
| 48 |
+
</div>
|
| 49 |
+
<div class="mt-4 flex justify-end">
|
| 50 |
+
<button class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 51 |
+
<i data-feather="filter" class="mr-2"></i> Filtrer
|
| 52 |
+
</button>
|
| 53 |
+
</div>
|
| 54 |
+
</div>
|
| 55 |
+
|
| 56 |
+
<div class="overflow-x-auto">
|
| 57 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 58 |
+
<thead class="bg-gray-50">
|
| 59 |
+
<tr>
|
| 60 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th>
|
| 61 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Client</th>
|
| 62 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Technicien</th>
|
| 63 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Statut</th>
|
| 64 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
|
| 65 |
+
</tr>
|
| 66 |
+
</thead>
|
| 67 |
+
<tbody class="bg-white divide-y divide-gray-200">
|
| 68 |
+
<tr>
|
| 69 |
+
<td class="px-6 py-4 whitespace-nowrap">15/06/2023</td>
|
| 70 |
+
<td class="px-6 py-4 whitespace-nowrap">Entreprise A</td>
|
| 71 |
+
<td class="px-6 py-4 whitespace-nowrap">Jean Dupont</td>
|
| 72 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 73 |
+
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-green-100 text-green-800">Complété</span>
|
| 74 |
+
</td>
|
| 75 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 76 |
+
<button class="text-blue-600 hover:text-blue-800 mr-3">
|
| 77 |
+
<i data-feather="download"></i>
|
| 78 |
+
</button>
|
| 79 |
+
<button class="text-purple-600 hover:text-purple-800">
|
| 80 |
+
<i data-feather="eye"></i>
|
| 81 |
+
</button>
|
| 82 |
+
</td>
|
| 83 |
+
</tr>
|
| 84 |
+
<tr>
|
| 85 |
+
<td class="px-6 py-4 whitespace-nowrap">10/06/2023</td>
|
| 86 |
+
<td class="px-6 py-4 whitespace-nowrap">Société B</td>
|
| 87 |
+
<td class="px-6 py-4 whitespace-nowrap">Marie Martin</td>
|
| 88 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 89 |
+
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-green-100 text-green-800">Complété</span>
|
| 90 |
+
</td>
|
| 91 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 92 |
+
<button class="text-blue-600 hover:text-blue-800 mr-3">
|
| 93 |
+
<i data-feather="download"></i>
|
| 94 |
+
</button>
|
| 95 |
+
<button class="text-purple-600 hover:text-purple-800">
|
| 96 |
+
<i data-feather="eye"></i>
|
| 97 |
+
</button>
|
| 98 |
+
</td>
|
| 99 |
+
</tr>
|
| 100 |
+
</tbody>
|
| 101 |
+
</table>
|
| 102 |
+
</div>
|
| 103 |
+
</div>
|
| 104 |
+
</main>
|
| 105 |
+
|
| 106 |
+
<custom-footer></custom-footer>
|
| 107 |
+
|
| 108 |
+
<script>
|
| 109 |
+
feather.replace();
|
| 110 |
+
</script>
|
| 111 |
+
<script src="script.js"></script>
|
| 112 |
+
</body>
|
| 113 |
+
</html>
|
script.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Shared JavaScript functions
|
| 2 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 3 |
+
// Initialize tooltips
|
| 4 |
+
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
|
| 5 |
+
tooltipTriggerList.map(function (tooltipTriggerEl) {
|
| 6 |
+
return new bootstrap.Tooltip(tooltipTriggerEl);
|
| 7 |
+
});
|
| 8 |
+
});
|
| 9 |
+
|
| 10 |
+
// Form validation function
|
| 11 |
+
function validateForm(formId) {
|
| 12 |
+
const form = document.getElementById(formId);
|
| 13 |
+
const inputs = form.querySelectorAll('input[required], select[required], textarea[required]');
|
| 14 |
+
let isValid = true;
|
| 15 |
+
|
| 16 |
+
inputs.forEach(input => {
|
| 17 |
+
if (!input.value) {
|
| 18 |
+
input.classList.add('border-red-500');
|
| 19 |
+
isValid = false;
|
| 20 |
+
} else {
|
| 21 |
+
input.classList.remove('border-red-500');
|
| 22 |
+
}
|
| 23 |
+
});
|
| 24 |
+
|
| 25 |
+
return isValid;
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
// Toggle dropdown function
|
| 29 |
+
function toggleDropdown(dropdownId) {
|
| 30 |
+
const dropdown = document.getElementById(dropdownId);
|
| 31 |
+
dropdown.classList.toggle('hidden');
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
// Close dropdown when clicking outside
|
| 35 |
+
document.addEventListener('click', function(event) {
|
| 36 |
+
const dropdowns = document.querySelectorAll('.dropdown-content');
|
| 37 |
+
dropdowns.forEach(dropdown => {
|
| 38 |
+
if (!dropdown.contains(event.target) && !event.target.matches('.dropdown-toggle')) {
|
| 39 |
+
dropdown.classList.add('hidden');
|
| 40 |
+
}
|
| 41 |
+
});
|
| 42 |
+
});
|
style.css
CHANGED
|
@@ -1,28 +1,31 @@
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
font-size: 15px;
|
| 14 |
-
margin-bottom: 10px;
|
| 15 |
-
margin-top: 5px;
|
| 16 |
}
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
padding: 16px;
|
| 22 |
-
border: 1px solid lightgray;
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Custom styles that can't be handled by Tailwind */
|
| 2 |
body {
|
| 3 |
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
+
/* Animation for form inputs */
|
| 7 |
+
.form-input {
|
| 8 |
+
transition: all 0.3s ease;
|
| 9 |
}
|
| 10 |
|
| 11 |
+
.form-input:focus {
|
| 12 |
+
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);
|
|
|
|
|
|
|
|
|
|
| 13 |
}
|
| 14 |
|
| 15 |
+
/* Custom scrollbar */
|
| 16 |
+
::-webkit-scrollbar {
|
| 17 |
+
width: 8px;
|
|
|
|
|
|
|
|
|
|
| 18 |
}
|
| 19 |
|
| 20 |
+
::-webkit-scrollbar-track {
|
| 21 |
+
background: #f1f1f1;
|
| 22 |
}
|
| 23 |
+
|
| 24 |
+
::-webkit-scrollbar-thumb {
|
| 25 |
+
background: #888;
|
| 26 |
+
border-radius: 4px;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
::-webkit-scrollbar-thumb:hover {
|
| 30 |
+
background: #555;
|
| 31 |
+
}
|
vp-detail.html
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Détail VP | TechGuard VP</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/navbar.js"></script>
|
| 12 |
+
<script src="components/footer.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gray-100">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8">
|
| 18 |
+
<div class="flex justify-between items-center mb-8">
|
| 19 |
+
<div>
|
| 20 |
+
<h1 class="text-3xl font-bold text-gray-800">Visite Préventive</h1>
|
| 21 |
+
<p class="text-gray-600">Client: Entreprise A - 15/06/2023</p>
|
| 22 |
+
</div>
|
| 23 |
+
<div class="flex space-x-4">
|
| 24 |
+
<button class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 25 |
+
<i data-feather="printer" class="mr-2"></i> Imprimer
|
| 26 |
+
</button>
|
| 27 |
+
<button class="bg-green-600 hover:bg-green-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 28 |
+
<i data-feather="save" class="mr-2"></i> Enregistrer
|
| 29 |
+
</button>
|
| 30 |
+
</div>
|
| 31 |
+
</div>
|
| 32 |
+
|
| 33 |
+
<div class="bg-white rounded-lg shadow overflow-hidden mb-8">
|
| 34 |
+
<div class="border-b border-gray-200">
|
| 35 |
+
<nav class="flex -mb-px">
|
| 36 |
+
<button class="whitespace-nowrap py-4 px-6 border-b-2 font-medium text-sm border-blue-500 text-blue-600">
|
| 37 |
+
<i data-feather="monitor" class="inline mr-2"></i> Postes de travail
|
| 38 |
+
</button>
|
| 39 |
+
<button class="whitespace-nowrap py-4 px-6 border-b-2 font-medium text-sm border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300">
|
| 40 |
+
<i data-feather="server" class="inline mr-2"></i> Serveurs
|
| 41 |
+
</button>
|
| 42 |
+
<button class="whitespace-nowrap py-4 px-6 border-b-2 font-medium text-sm border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300">
|
| 43 |
+
<i data-feather="file-text" class="inline mr-2"></i> Notes
|
| 44 |
+
</button>
|
| 45 |
+
</nav>
|
| 46 |
+
</div>
|
| 47 |
+
|
| 48 |
+
<div class="p-6">
|
| 49 |
+
<div class="mb-8">
|
| 50 |
+
<h3 class="text-lg font-medium text-gray-900 mb-4">Contrôles généraux</h3>
|
| 51 |
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
| 52 |
+
<!-- Checkbox controls -->
|
| 53 |
+
<div class="flex items-center">
|
| 54 |
+
<input id="check1" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
| 55 |
+
<label for="check1" class="ml-2 block text-sm text-gray-900">Nettoyage physique des postes</label>
|
| 56 |
+
</div>
|
| 57 |
+
<div class="flex items-center">
|
| 58 |
+
<input id="check2" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
| 59 |
+
<label for="check2" class="ml-2 block text-sm text-gray-900">Vérification des sauvegardes</label>
|
| 60 |
+
</div>
|
| 61 |
+
<div class="flex items-center">
|
| 62 |
+
<input id="check3" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
| 63 |
+
<label for="check3" class="ml-2 block text-sm text-gray-900">Mises à jour système</label>
|
| 64 |
+
</div>
|
| 65 |
+
<div class="flex items-center">
|
| 66 |
+
<input id="check4" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
| 67 |
+
<label for="check4" class="ml-2 block text-sm text-gray-900">Vérification antivirus</label>
|
| 68 |
+
</div>
|
| 69 |
+
<div class="flex items-center">
|
| 70 |
+
<input id="check5" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
| 71 |
+
<label for="check5" class="ml-2 block text-sm text-gray-900">Test des UPS</label>
|
| 72 |
+
</div>
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
|
| 76 |
+
<div class="mb-8">
|
| 77 |
+
<h3 class="text-lg font-medium text-gray-900 mb-4">Détails par poste</h3>
|
| 78 |
+
|
| 79 |
+
<div class="overflow-x-auto">
|
| 80 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 81 |
+
<thead class="bg-gray-50">
|
| 82 |
+
<tr>
|
| 83 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Poste</th>
|
| 84 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">État</th>
|
| 85 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Disque</th>
|
| 86 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">RAM</th>
|
| 87 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
|
| 88 |
+
</tr>
|
| 89 |
+
</thead>
|
| 90 |
+
<tbody class="bg-white divide-y divide-gray-200">
|
| 91 |
+
<tr>
|
| 92 |
+
<td class="px-6 py-4 whitespace-nowrap">PC-001</td>
|
| 93 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 94 |
+
<select class="border border-gray-300 rounded px-2 py-1 text-sm">
|
| 95 |
+
<option>Opérationnel</option>
|
| 96 |
+
<option>Problème mineur</option>
|
| 97 |
+
<option>Problème majeur</option>
|
| 98 |
+
<option>Hors service</option>
|
| 99 |
+
</select>
|
| 100 |
+
</td>
|
| 101 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 102 |
+
<select class="border border-gray-300 rounded px-2 py-1 text-sm">
|
| 103 |
+
<option>OK</option>
|
| 104 |
+
<option>Espace faible</option>
|
| 105 |
+
<option>Erreurs</option>
|
| 106 |
+
</select>
|
| 107 |
+
</td>
|
| 108 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 109 |
+
<select class="border border-gray-300 rounded px-2 py-1 text-sm">
|
| 110 |
+
<option>OK</option>
|
| 111 |
+
<option>Utilisation élevée</option>
|
| 112 |
+
</select>
|
| 113 |
+
</td>
|
| 114 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 115 |
+
<button class="text-blue-600 hover:text-blue-800">
|
| 116 |
+
<i data-feather="edit"></i>
|
| 117 |
+
</button>
|
| 118 |
+
</td>
|
| 119 |
+
</tr>
|
| 120 |
+
<tr>
|
| 121 |
+
<td class="px-6 py-4 whitespace-nowrap">PC-002</td>
|
| 122 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 123 |
+
<select class="border border-gray-300 rounded px-2 py-1 text-sm">
|
| 124 |
+
<option>Opérationnel</option>
|
| 125 |
+
<option selected>Problème mineur</option>
|
| 126 |
+
<option>Problème majeur</option>
|
| 127 |
+
<option>Hors service</option>
|
| 128 |
+
</select>
|
| 129 |
+
</td>
|
| 130 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 131 |
+
<select class="border border-gray-300 rounded px-2 py-1 text-sm">
|
| 132 |
+
<option>OK</option>
|
| 133 |
+
<option selected>Espace faible</option>
|
| 134 |
+
<option>Erreurs</option>
|
| 135 |
+
</select>
|
| 136 |
+
</td>
|
| 137 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 138 |
+
<select class="border border-gray-300 rounded px-2 py-1 text-sm">
|
| 139 |
+
<option>OK</option>
|
| 140 |
+
<option>Utilisation élevée</option>
|
| 141 |
+
</select>
|
| 142 |
+
</td>
|
| 143 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 144 |
+
<button class="text-blue-600 hover:text-blue-800">
|
| 145 |
+
<i data-feather="edit"></i>
|
| 146 |
+
</button>
|
| 147 |
+
</td>
|
| 148 |
+
</tr>
|
| 149 |
+
</tbody>
|
| 150 |
+
</table>
|
| 151 |
+
</div>
|
| 152 |
+
</div>
|
| 153 |
+
|
| 154 |
+
<div>
|
| 155 |
+
<h3 class="text-lg font-medium text-gray-900 mb-4">Observations</h3>
|
| 156 |
+
<textarea rows="4" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" placeholder="Ajoutez vos observations ici..."></textarea>
|
| 157 |
+
</div>
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
</main>
|
| 161 |
+
|
| 162 |
+
<custom-footer></custom-footer>
|
| 163 |
+
|
| 164 |
+
<script>
|
| 165 |
+
feather.replace();
|
| 166 |
+
</script>
|
| 167 |
+
<script src="script.js"></script>
|
| 168 |
+
</body>
|
| 169 |
+
</html>
|
vp.html
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Visites Préventives | TechGuard VP</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/navbar.js"></script>
|
| 12 |
+
<script src="components/footer.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gray-100">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8">
|
| 18 |
+
<div class="flex justify-between items-center mb-8">
|
| 19 |
+
<h1 class="text-3xl font-bold text-gray-800">Visites Préventives</h1>
|
| 20 |
+
<button onclick="openVPModal()" class="bg-green-600 hover:bg-green-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-300 inline-flex items-center">
|
| 21 |
+
<i data-feather="plus" class="mr-2"></i> Nouvelle VP
|
| 22 |
+
</button>
|
| 23 |
+
</div>
|
| 24 |
+
|
| 25 |
+
<div class="bg-white rounded-lg shadow overflow-hidden mb-8">
|
| 26 |
+
<div class="overflow-x-auto">
|
| 27 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 28 |
+
<thead class="bg-gray-50">
|
| 29 |
+
<tr>
|
| 30 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Client</th>
|
| 31 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th>
|
| 32 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Technicien</th>
|
| 33 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Statut</th>
|
| 34 |
+
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
|
| 35 |
+
</tr>
|
| 36 |
+
</thead>
|
| 37 |
+
<tbody class="bg-white divide-y divide-gray-200">
|
| 38 |
+
<!-- Sample data - would be populated from API in real app -->
|
| 39 |
+
<tr>
|
| 40 |
+
<td class="px-6 py-4 whitespace-nowrap">Entreprise A</td>
|
| 41 |
+
<td class="px-6 py-4 whitespace-nowrap">15/06/2023</td>
|
| 42 |
+
<td class="px-6 py-4 whitespace-nowrap">Jean Dupont</td>
|
| 43 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 44 |
+
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-green-100 text-green-800">Complétée</span>
|
| 45 |
+
</td>
|
| 46 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 47 |
+
<a href="vp-detail.html" class="text-blue-600 hover:text-blue-800 mr-3">
|
| 48 |
+
<i data-feather="eye"></i>
|
| 49 |
+
</a>
|
| 50 |
+
<button class="text-red-600 hover:text-red-800">
|
| 51 |
+
<i data-feather="trash-2"></i>
|
| 52 |
+
</button>
|
| 53 |
+
</td>
|
| 54 |
+
</tr>
|
| 55 |
+
<tr>
|
| 56 |
+
<td class="px-6 py-4 whitespace-nowrap">Société B</td>
|
| 57 |
+
<td class="px-6 py-4 whitespace-nowrap">20/06/2023</td>
|
| 58 |
+
<td class="px-6 py-4 whitespace-nowrap">Marie Martin</td>
|
| 59 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 60 |
+
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-yellow-100 text-yellow-800">En cours</span>
|
| 61 |
+
</td>
|
| 62 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 63 |
+
<a href="vp-detail.html" class="text-blue-600 hover:text-blue-800 mr-3">
|
| 64 |
+
<i data-feather="eye"></i>
|
| 65 |
+
</a>
|
| 66 |
+
<button class="text-red-600 hover:text-red-800">
|
| 67 |
+
<i data-feather="trash-2"></i>
|
| 68 |
+
</button>
|
| 69 |
+
</td>
|
| 70 |
+
</tr>
|
| 71 |
+
</tbody>
|
| 72 |
+
</table>
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
</main>
|
| 76 |
+
|
| 77 |
+
<!-- VP Modal -->
|
| 78 |
+
<div id="vpModal" class="fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center hidden">
|
| 79 |
+
<div class="bg-white rounded-lg shadow-xl w-full max-w-4xl">
|
| 80 |
+
<div class="flex justify-between items-center border-b px-6 py-4">
|
| 81 |
+
<h3 class="text-xl font-semibold text-gray-800">Nouvelle Visite Préventive</h3>
|
| 82 |
+
<button onclick="closeVPModal()" class="text-gray-500 hover:text-gray-700">
|
| 83 |
+
<i data-feather="x"></i>
|
| 84 |
+
</button>
|
| 85 |
+
</div>
|
| 86 |
+
<div class="p-6">
|
| 87 |
+
<form id="vpForm">
|
| 88 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 89 |
+
<div>
|
| 90 |
+
<label for="vpClient" class="block text-sm font-medium text-gray-700 mb-1">Client</label>
|
| 91 |
+
<select id="vpClient" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 92 |
+
<option value="">Sélectionner un client</option>
|
| 93 |
+
<option value="1">Entreprise A</option>
|
| 94 |
+
<option value="2">Société B</option>
|
| 95 |
+
</select>
|
| 96 |
+
</div>
|
| 97 |
+
<div>
|
| 98 |
+
<label for="vpDate" class="block text-sm font-medium text-gray-700 mb-1">Date</label>
|
| 99 |
+
<input type="date" id="vpDate" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 100 |
+
</div>
|
| 101 |
+
<div>
|
| 102 |
+
<label for="vpTechnician" class="block text-sm font-medium text-gray-700 mb-1">Technicien</label>
|
| 103 |
+
<select id="vpTechnician" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 104 |
+
<option value="">Sélectionner un technicien</option>
|
| 105 |
+
<option value="1">Jean Dupont</option>
|
| 106 |
+
<option value="2">Marie Martin</option>
|
| 107 |
+
</select>
|
| 108 |
+
</div>
|
| 109 |
+
<div>
|
| 110 |
+
<label for="vpType" class="block text-sm font-medium text-gray-700 mb-1">Type de visite</label>
|
| 111 |
+
<select id="vpType" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
|
| 112 |
+
<option value="">Sélectionner un type</option>
|
| 113 |
+
<option value="standard">Standard</option>
|
| 114 |
+
<option value="complete">Complète</option>
|
| 115 |
+
<option value="server">Serveurs uniquement</option>
|
| 116 |
+
</select>
|
| 117 |
+
</div>
|
| 118 |
+
</div>
|
| 119 |
+
</form>
|
| 120 |
+
</div>
|
| 121 |
+
<div class="flex justify-end border-t px-6 py-4">
|
| 122 |
+
<button onclick="closeVPModal()" class="mr-3 px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50">Annuler</button>
|
| 123 |
+
<button onclick="saveVP()" class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700">Commencer</button>
|
| 124 |
+
</div>
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
|
| 128 |
+
<custom-footer></custom-footer>
|
| 129 |
+
|
| 130 |
+
<script>
|
| 131 |
+
feather.replace();
|
| 132 |
+
|
| 133 |
+
function openVPModal() {
|
| 134 |
+
document.getElementById('vpModal').classList.remove('hidden');
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
function closeVPModal() {
|
| 138 |
+
document.getElementById('vpModal').classList.add('hidden');
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
function saveVP() {
|
| 142 |
+
if (validateForm('vpForm')) {
|
| 143 |
+
// Here you would typically save to API and redirect to VP detail page
|
| 144 |
+
window.location.href = 'vp-detail.html';
|
| 145 |
+
}
|
| 146 |
+
}
|
| 147 |
+
</script>
|
| 148 |
+
<script src="script.js"></script>
|
| 149 |
+
</body>
|
| 150 |
+
</html>
|