new.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. /**
  3. * Vue de création d'un nouveau projet
  4. */
  5. include __DIR__ . '/../partials/header.php';
  6. ?>
  7. <main class="main-content">
  8. <div class="container-fluid">
  9. <div class="row justify-content-center">
  10. <div class="col-lg-8 col-xl-6">
  11. <!-- En-tête de la page -->
  12. <div class="d-flex align-items-center mb-4">
  13. <div>
  14. <h1 class="h3 mb-0">
  15. <i class="bi bi-plus-circle me-2"></i>Nouveau projet
  16. </h1>
  17. <p class="text-muted mb-0">Créez une nouvelle carte personnalisée</p>
  18. </div>
  19. </div>
  20. <!-- Formulaire de création -->
  21. <div class="card">
  22. <div class="card-header">
  23. <h5 class="card-title mb-0">
  24. <i class="bi bi-pencil-square me-2"></i>Configuration du projet
  25. </h5>
  26. </div>
  27. <div class="card-body">
  28. <form id="newProjectForm" action="/projects" method="POST">
  29. <!-- Nom de la carte -->
  30. <div class="mb-3">
  31. <label for="mapName" class="form-label">
  32. <i class="bi bi-tag me-1"></i>Nom de la carte <span class="text-danger">*</span>
  33. </label>
  34. <input type="text" class="form-control" id="mapName" name="name" required
  35. placeholder="Ex: Ma belle carte" maxlength="100">
  36. <div class="form-text">Choisissez un nom descriptif pour votre carte</div>
  37. </div>
  38. <!-- Dimensions de la carte -->
  39. <div class="mb-3">
  40. <label class="form-label">
  41. <i class="bi bi-aspect-ratio me-1"></i>Dimensions de la carte <span class="text-danger">*</span>
  42. </label>
  43. <div class="row g-2">
  44. <div class="col-md-6">
  45. <input type="number" class="form-control" id="mapWidth" name="width"
  46. placeholder="Largeur" min="50" max="500" value="50" required>
  47. <div class="form-text">Largeur en parcelle</div>
  48. </div>
  49. <div class="col-md-6">
  50. <input type="number" class="form-control" id="mapHeight" name="height"
  51. placeholder="Hauteur" min="50" max="500" value="50" required>
  52. <div class="form-text">Hauteur en parcelle</div>
  53. </div>
  54. </div>
  55. </div>
  56. <!-- Description -->
  57. <div class="mb-3">
  58. <label for="mapDescription" class="form-label">
  59. <i class="bi bi-textarea me-1"></i>Description
  60. </label>
  61. <textarea class="form-control" id="mapDescription" name="description" rows="3"
  62. placeholder="Décrivez votre carte (optionnel)" maxlength="500"></textarea>
  63. <div class="form-text">Ajoutez une description pour vous souvenir du but de cette carte</div>
  64. </div>
  65. <!-- Modèles -->
  66. <div class="mb-4">
  67. <label for="mapTemplate" class="form-label">
  68. <i class="bi bi-palette me-1"></i>Modèle de départ <span class="text-danger">*</span>
  69. </label>
  70. <select class="form-select" id="mapTemplate" name="template" required>
  71. <option value="" disabled selected>Choisissez un modèle</option>
  72. <option value="desert">🏜️ Paysage désertique</option>
  73. <option value="coastal">🏖️ Paysage littoral</option>
  74. <option value="mountain">🏔️ Paysage de montagne</option>
  75. <option value="rural">🌾 Paysage rural</option>
  76. <option value="urban">🏙️ Paysage urbain</option>
  77. </select>
  78. <div class="form-text">Le modèle définit l'apparence de base de votre carte</div>
  79. </div>
  80. <!-- Aperçu du modèle sélectionné -->
  81. <div id="templatePreview" class="mb-4" style="display: none;">
  82. <div class="card bg-light">
  83. <div class="card-body text-center">
  84. <div id="templateImage" class="mb-2">
  85. <!-- L'image du modèle sera chargée ici via JavaScript -->
  86. </div>
  87. <h6 id="templateTitle"></h6>
  88. <p id="templateDescription" class="text-muted small mb-0"></p>
  89. </div>
  90. </div>
  91. </div>
  92. <!-- Boutons d'action -->
  93. <div class="d-flex gap-2 justify-content-end">
  94. <a href="/" class="btn btn-outline-secondary">
  95. <i class="bi bi-x-circle me-1"></i>Annuler
  96. </a>
  97. <button type="submit" class="btn btn-primary">
  98. <i class="bi bi-check-circle me-1"></i>Créer le projet
  99. </button>
  100. </div>
  101. </form>
  102. </div>
  103. </div>
  104. <!-- Informations supplémentaires -->
  105. <div class="card mt-4">
  106. <div class="card-body">
  107. <h6 class="card-title">
  108. <i class="bi bi-info-circle me-1"></i>Informations
  109. </h6>
  110. <ul class="list-unstyled small mb-0">
  111. <li class="mb-2">
  112. <i class="bi bi-dot me-2"></i>
  113. <strong>Dimensions :</strong> Les dimensions recommandées sont entre 50x50 et 500x500 parcelles
  114. </li>
  115. <li class="mb-2">
  116. <i class="bi bi-dot me-2"></i>
  117. <strong>Modèles :</strong> Vous pourrez modifier l'apparence de l'arrière plan après la création du projet
  118. </li>
  119. <li class="mb-0">
  120. <i class="bi bi-dot me-2"></i>
  121. <strong>Sauvegarde :</strong> Votre projet sera automatiquement sauvegardé lors de la création
  122. </li>
  123. </ul>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. </main>
  130. <script>
  131. // Gestion de l'aperçu du modèle
  132. document.getElementById('mapTemplate').addEventListener('change', function() {
  133. const selectedTemplate = this.value;
  134. const previewDiv = document.getElementById('templatePreview');
  135. const templateImage = document.getElementById('templateImage');
  136. const templateTitle = document.getElementById('templateTitle');
  137. const templateDescription = document.getElementById('templateDescription');
  138. if (selectedTemplate) {
  139. // Données des modèles
  140. const templates = {
  141. desert: {
  142. title: 'Paysage désertique',
  143. description: 'Terrain sablonneux avec dunes et oasis occasionnelles',
  144. emoji: '🏜️'
  145. },
  146. coastal: {
  147. title: 'Paysage littoral',
  148. description: 'Côtes avec plages, falaises et éléments marins',
  149. emoji: '🏖️'
  150. },
  151. mountain: {
  152. title: 'Paysage de montagne',
  153. description: 'Reliefs escarpés avec sommets enneigés et vallées',
  154. emoji: '🏔️'
  155. },
  156. rural: {
  157. title: 'Paysage rural',
  158. description: 'Champs, forêts et éléments agricoles traditionnels',
  159. emoji: '🌾'
  160. },
  161. urban: {
  162. title: 'Paysage urbain',
  163. description: 'Villes avec bâtiments, routes et infrastructures modernes',
  164. emoji: '🏙️'
  165. }
  166. };
  167. const template = templates[selectedTemplate];
  168. templateImage.innerHTML = `<span style="font-size: 3rem;">${template.emoji}</span>`;
  169. templateTitle.textContent = template.title;
  170. templateDescription.textContent = template.description;
  171. previewDiv.style.display = 'block';
  172. } else {
  173. previewDiv.style.display = 'none';
  174. }
  175. });
  176. // Validation du formulaire
  177. document.getElementById('newProjectForm').addEventListener('submit', function(e) {
  178. const name = document.getElementById('mapName').value.trim();
  179. const width = parseInt(document.getElementById('mapWidth').value);
  180. const height = parseInt(document.getElementById('mapHeight').value);
  181. if (!name) {
  182. alert('Veuillez saisir un nom pour votre carte.');
  183. e.preventDefault();
  184. return;
  185. }
  186. if (width < 100 || width > 2000 || height < 100 || height > 2000) {
  187. alert('Les dimensions doivent être comprises entre 100x100 et 2000x2000 pixels.');
  188. e.preventDefault();
  189. return;
  190. }
  191. // Ici vous pouvez ajouter la logique de création du projet
  192. console.log('Création du projet:', { name, width, height, template: document.getElementById('mapTemplate').value });
  193. });
  194. </script>
  195. <?php
  196. include __DIR__ . '/../partials/footer.php';
  197. ?>