selector_rutas.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Supervisor - Seleccionar rutas</title>
  7. <?php
  8. include 'import/html_css_files.php';
  9. ?>
  10. <style>
  11. [v-cloak] {
  12. display: none;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <?php
  18. include "import/html_header.php";
  19. html_header(
  20. "Selecciona la ruta a supervisar",
  21. "Sistema de gestión de checador",
  22. );
  23. ?>
  24. <main class="container-fluid px-4" id="app" v-cloak @vue:mounted="mounted">
  25. <!-- filtros -->
  26. <div class="card mt-4">
  27. <div class="card-header bg-dark d-flex justify-content-between align-items-center flex-wrap text-white">
  28. <h2 class="col-md-10 col-12 text-white font-weight-bold text-uppercase text-center">
  29. Facultad de ingeniería: {{ store.rutas.data[store.rutas.selected]?.ruta ?? '' }}
  30. </h2>
  31. <button type="button" class="btn btn-success btn-sm" data-toggle="modal"
  32. data-target="#editar-ubicaciones">
  33. <i class="ing-editar"></i>
  34. </button>
  35. </div>
  36. <div class="card-body bg-info">
  37. <div class="container-fluid">
  38. <div class="row flex-nowrap overflow-auto">
  39. <!-- size big -->
  40. <div class="col-9 col-sm-7 col-md-4 col-lg-3 col-xl-2 my-2"
  41. v-for="(ruta, index) in store.rutas.data" :key="ruta.id">
  42. <span class="shadow badge badge-pill py-2 px-4" @click="store.selectRuta(ruta.id)"
  43. :class="{ 'badge-primary': store.rutas.selected == ruta.id, 'badge-light text-primary': store.rutas.selected != ruta.id, 'badge-dark text-muted disabled' : ruta.horarios.every(({estado}) => estado != 0) && store.rutas.selected != ruta.id }">
  44. {{ ruta.ruta }}
  45. <span class="badge mx-3" v-if="ruta.horarios.some(({estado}) => estado == 0)"
  46. :class="{ 'badge-success': ruta.horarios.length > 0, 'badge-danger': ruta.horarios.length == 0 }">
  47. {{ruta.horarios.filter(({estado}) => estado != 0).length}} / {{
  48. ruta.horarios.length}}
  49. </span>
  50. <span v-else class="badge mx-3"
  51. :class="{ 'badge-success': ruta.horarios.length > 0, 'badge-danger': ruta.horarios.length == 0 }">
  52. <i class="ing-aceptar"></i>
  53. </span>
  54. <span class="sr-only">Faltan {{ruta.horarios.filter(({estado}) => estado == 0).length}}
  55. horarios por registrar</span>
  56. </span>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. <div class="card-footer bg-dark d-flex justify-content-between align-items-center flex-wrap text-white">
  62. <button class="btn btn-info" :disabled="store.bloquesHorario.selected == 0"
  63. @click="store.selectBloque(store.bloquesHorario.selected - 1)">
  64. <i class="ing-caret ing-rotate-90"></i>
  65. <span class="d-none d-md-inline-block">
  66. Bloque horario anterior
  67. </span>
  68. </button>
  69. <h3 class="text-white font-weight-bold text-uppercase text-center">
  70. {{ store.hora_inicio.slice(0, 5) }} - {{ store.hora_fin.slice(0, 5) }}
  71. </h3>
  72. <button class="btn btn-info" @click="store.selectBloque(store.bloquesHorario.selected + 1)"
  73. :disabled="store.bloquesHorario.selected == store.bloquesHorario.data.length - 1">
  74. <span class="d-none d-md-inline-block">
  75. Bloque horario siguiente
  76. </span>
  77. <i class="ing-caret ing-rotate-270"></i>
  78. </button>
  79. </div>
  80. </div>
  81. <div class="mt-3 d-flex justify-content-center flex-wrap">
  82. <!-- refresh -->
  83. <div class="table-responsive">
  84. <table class="table table-hover table-striped table-bordered table-sm">
  85. <thead class="thead-dark">
  86. <tr>
  87. <th scope="col" class="text-center align-middle text-nowrap px-2">
  88. <button @click="store.invertir" class="btn btn-info mr-3" v-if="clases.length > 0">
  89. <i class="ing-cambiar ing-rotate-90"></i>
  90. </button>
  91. Salón
  92. </th>
  93. <th scope="col" class="text-center align-middle text-nowrap px-2">Profesor</th>
  94. <th scope="col" class="text-center align-middle text-nowrap px-2">Horario</th>
  95. <th scope="col" class="text-center align-middle text-nowrap px-2">Acciones</th>
  96. </tr>
  97. </thead>
  98. <tbody>
  99. <tr v-if="clases.length == 0">
  100. <td colspan="6" class="text-center">No hay clases en este horario</td>
  101. </tr>
  102. <tr v-for="clase in clases" :key="clase.id">
  103. <td class="text-center align-middle">{{ clase.salon }}</td>
  104. <td class="text-center align-middle">{{ clase.profesor }} {{ clase.materia }}
  105. <td class="text-center align-middle">
  106. {{ clase.hora_inicio }} - {{ clase.hora_fin }}
  107. </td>
  108. <td class="text-center align-middle text-nowrap">
  109. <button class="btn btn-outline text-center mx-2" v-for="estado in estados"
  110. :key="estado.id" @click="store.cambiarEstado(clase.id, estado.id)"
  111. :class="[{'active': estado.id === clase.estado}, `btn-outline-${estado.color}`]">
  112. <i :class="estado.icon"></i>
  113. </button>
  114. <button class="btn btn-outline-primary text-center mx-2" data-toggle="modal"
  115. data-target="#editar-comentario" :class="{ 'active': clase.comentario != '' }"
  116. @click="store.selectEditor(clase.id)">
  117. <i class="ing-editar"></i>
  118. <span class="badge badge-pill badge-primary"
  119. v-if="clase.comentario != ''">...</span>
  120. <span class="sr-only">Editar comentario</span>
  121. </button>
  122. </td>
  123. </tr>
  124. </tbody>
  125. </table>
  126. </div>
  127. </div>
  128. <!-- MODAL -->
  129. <div class="modal" tabindex="-1" id="editar-ubicaciones">
  130. <div class="modal-dialog">
  131. <div class="modal-content">
  132. <div class="modal-header">
  133. <h5 class="modal-title">Editar rutas</h5>
  134. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  135. <span aria-hidden="true">&times;</span>
  136. </button>
  137. </div>
  138. <div class="modal-body">
  139. <div class="container">
  140. <h2>Reordena las rutas</h2>
  141. <ul id="sortable" class="list-group">
  142. <li class="list-group-item" v-for="ruta in store.rutas.data" :key="ruta.id"
  143. :id="'ruta-' + ruta.id"
  144. :class="[ruta.horarios.every(horario => horario.estado != 0) ? ['disabled', 'bg-light', 'undraggable'] : '']">
  145. {{ruta.ruta}}
  146. </li>
  147. </ul>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. <button class="btn btn-primary btn-lg btn-block mb-4" @click="store.guardarCambios">
  154. <i class="ing-guardar"></i>
  155. Guardar cambios
  156. </button>
  157. <div class="modal" tabindex="-1" id="editar-comentario">
  158. <div class="modal-dialog">
  159. <div class="modal-content">
  160. <div class="modal-header">
  161. <h5 class="modal-title">Añadir comentario</h5>
  162. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  163. <span aria-hidden="true">&times;</span>
  164. </button>
  165. </div>
  166. <div class="modal-body">
  167. <div class="container">
  168. <h2 class="text-center">Comentarios de la clase</h2>
  169. <br>
  170. <div class="input-group">
  171. <div class="input-group-prepend">
  172. <span class="input-group-text bg-primary text-white">Comentario
  173. <button class="btn btn-light ml-2 text-primary"
  174. @click="store.limpiarComentario">
  175. <i class="ing-borrar"></i>
  176. </button>
  177. </span>
  178. </div>
  179. <textarea class="form-control" aria-label="Comentarios de la clase"
  180. v-model="store.editor.texto"></textarea>
  181. </div>
  182. </div>
  183. </div>
  184. <div class="modal-footer">
  185. <button type="button" class="btn btn-outline-danger" data-dismiss="modal">
  186. <i class="ing-cancelar"></i>
  187. Cancelar
  188. </button>
  189. <button type="button" class="btn btn-primary" data-dismiss="modal"
  190. @click="store.guardarComentario">
  191. Guardar comentario
  192. </button>
  193. </div>
  194. </div>
  195. </div>
  196. </div>
  197. </main>
  198. <?php
  199. include "import/html_footer.php";
  200. ?>
  201. <!-- filtro modal -->
  202. <script src="js/jquery.min.js"></script>
  203. <script src="js/jquery-ui.js"></script>
  204. <script src="js/jquery-ui.touch-punch.min.js"></script>
  205. <script src="js/bootstrap/bootstrap.min.js"></script>
  206. <?php include_once 'js/messages.php'; ?>
  207. <script src="https://unpkg.com/petite-vue"></script>
  208. <script>
  209. </script>
  210. </body>
  211. </html>