index.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <head>
  4. <meta charset="utf8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  6. <title>Talleres de invierno</title>
  7. <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
  8. <link rel="stylesheet" href="node_modules/choices.js/public/assets/styles/choices.min.css">
  9. </head>
  10. <body>
  11. <div id="container" class="container">
  12. <?php
  13. session_start();
  14. if (isset($_SESSION['response'])):
  15. $response = json_decode($_SESSION['response']);
  16. ?>
  17. <div class="mt-4 alert alert-<?= key($response) ?>">
  18. <?= current($response) ?>
  19. </div>
  20. <?php
  21. unset($_SESSION['response']);
  22. endif;
  23. ?>
  24. <div class="row">
  25. <div class="col-sm-12 col-md-6 mt-4">
  26. <img src="images/posters/2019-09-01.png" class="img-fluid" alt="poster">
  27. <p class="small text-center">
  28. &copy; Autor no especifica licencia
  29. -
  30. <a href="images/posters/2019-09-01.png">PNG</a>
  31. </p>
  32. <img src="images/posters/2019-09-01_2.png" class="img-fluid" alt="poster">
  33. <p class="small text-center">
  34. &copy; Autor no especifica licencia
  35. -
  36. <a href="images/posters/2019-09-01_2.png">PNG</a>
  37. </p>
  38. </div>
  39. <div class="col-sm-12 col-md-6 pt-4">
  40. <h1>Talleres de invierno en el Ateneo Anarquista de Santiago</h1>
  41. <p class="lead">Uso básico de terminal e instalación de Debian GNU/Linux.</p>
  42. <p>Comienza a utilizar las simples pero poderosas herramientas que hacen a GNU/Linux tan valorado por quienes saben de informática y liberación tecnológica y luego libera tu propio equipo y/o aprende a liberar el de tus amigos.</p>
  43. <ul style="font-weight: bold">
  44. <li>No requiere conocimientos previos.</li>
  45. <li>Puedes asistir a un solo taller o ambos.</li>
  46. <li>
  47. Para participar activamente* debes llevar:
  48. <ul>
  49. <li>Un pendrive vacío (para ambos talleres).</li>
  50. <li>Un computador con su info respaldada, si quieres instalar.</li>
  51. <li>Puntualidad, si llegas atrasado te perderás de contenido.</li>
  52. </ul>
  53. </li>
  54. <li>El evento es gratuito, se recibirán colaboraciones voluntarias en beneficio del Ateneo.</li>
  55. </ul>
  56. <p>* También puedes asistir como oyente.</p>
  57. <p>Conoce más del Ateneo en <a href="https://ateneostgo.org">AteneoStgo.org</a>.</p>
  58. <h2>Reserva un cupo</h2>
  59. <form id="bookingForm" action="booking.php" method="POST" novalidate>
  60. <div class="form-group">
  61. <label for="name">Nombre o apodo</label>
  62. <input type="text" name="name" class="form-control" id="name" required>
  63. </div>
  64. <div class="form-group">
  65. <label for="email">E-mail</label>
  66. <input type="email" name="email" class="form-control" id="email" required>
  67. </div>
  68. <div class="form-group">
  69. <label for="reserves">Talleres a los que asistirás</label>
  70. <select name="reserves[]" id="reserves" multiple>
  71. <option value="terminal">Terminal: comandos básicos - 15 hrs</option>
  72. <option value="debian">Instalación de Debian GNU/Linux - 17 hrs</option>
  73. </select>
  74. </div>
  75. <div class="custom-control custom-checkbox">
  76. <input type="checkbox" class="custom-control-input" name="mailing" id="mailing">
  77. <label class="custom-control-label" for="mailing">Deseo recibir correos de otras actividades relacionadas al software libre</label>
  78. </div>
  79. <textarea name="message" class="d-none"></textarea>
  80. <div class="text-right mt-2">
  81. <button type="submit" class="btn btn-lg btn-primary">Confirmar asistencia</button>
  82. </div>
  83. </form>
  84. </div>
  85. </div>
  86. <div class="text-center m-3">
  87. <a href="./contacto">Contacto</a> -
  88. También puedes <a href="cancel.php" id="cancelLink">anular tu reserva aquí</a>
  89. </div>
  90. </div>
  91. <script type="application/javascript" src="node_modules/jquery/dist/jquery.slim.min.js"></script>
  92. <script type="application/javascript" src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
  93. <script type="application/javascript" src="node_modules/choices.js/public/assets/scripts/choices.min.js"></script>
  94. <script type="application/javascript">
  95. let choices = new Choices(document.getElementById('reserves'), {
  96. noResultsText: 'No se encontraron resultados',
  97. noChoicesText: 'No hay más opciones',
  98. itemSelectText: 'Presiona para seleccionar',
  99. shouldSort: false
  100. })
  101. function alertGen(alertObj, callback) {
  102. const alertDiv = document.createElement('div')
  103. alertDiv.classList.add(
  104. 'alert-' + Object.keys(alertObj)[0],
  105. 'alert', 'alert-dismissable', 'fade', 'show', 'mt-4')
  106. alertDiv.innerHTML = Object.values(alertObj)[0]
  107. const closeButton = document.createElement('button')
  108. closeButton.setAttribute('type', 'text')
  109. closeButton.classList.add('close')
  110. closeButton.dataset.dismiss = 'alert'
  111. closeButton.innerHTML = '<span>&times;</span>'
  112. alertDiv.appendChild(closeButton)
  113. container.insertBefore(alertDiv, container.childNodes[0])
  114. setTimeout(() => {
  115. document.getElementsByTagName('html')[0].scrollIntoView({behavior: "smooth"})
  116. }, 100);
  117. callback()
  118. }
  119. const container = document.getElementById('container')
  120. document.getElementById('bookingForm').addEventListener('submit', (event) => {
  121. event.preventDefault()
  122. const formData = new FormData(event.target)
  123. formData.append('fetch', true)
  124. fetch(event.target.getAttribute('action'), {
  125. method: event.target.getAttribute('method'),
  126. body: formData,
  127. })
  128. .then(response => response.json())
  129. .then((response) => {
  130. alertGen(response, () => event.target.reset())
  131. })
  132. .catch(error => console.error(error))
  133. })
  134. document.getElementById('cancelLink').addEventListener('click', (event) => {
  135. event.preventDefault()
  136. fetch(event.target.getAttribute('href'))
  137. .then(response => response.text())
  138. .then((response) => {
  139. const modalDiv = document.createElement('div')
  140. modalDiv.classList.add('modal', 'fade')
  141. const modalDialogDiv = document.createElement('div')
  142. modalDialogDiv.classList.add('modal-dialog', 'modal-sm')
  143. modalDiv.appendChild(modalDialogDiv)
  144. const modalContentDiv = document.createElement('div')
  145. modalContentDiv.classList.add('modal-content')
  146. modalContentDiv.innerHTML = response
  147. modalDialogDiv.appendChild(modalContentDiv)
  148. container.appendChild(modalDiv)
  149. $(modalDiv).modal('show')
  150. $(modalDiv).on('hidden.bs.modal', function (event) {
  151. $(modalDiv).remove();
  152. });
  153. document.getElementById('cancelForm').addEventListener('submit', (event) => {
  154. event.preventDefault()
  155. const formData = new FormData(event.target)
  156. formData.append('fetch', true)
  157. fetch(event.target.getAttribute('action'), {
  158. method: event.target.getAttribute('method'),
  159. body: formData,
  160. })
  161. .then(response => response.json())
  162. .then((response) => {
  163. alertGen(response, () => $(modalDiv).modal('hide'))
  164. })
  165. .catch(error => console.error(error))
  166. })
  167. })
  168. .catch(error => console.error(error))
  169. })
  170. </script>
  171. </body>
  172. </html>