index.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. require_once "dependencies.php";
  3. // Simplify the assignment of $page
  4. $page = 'login';
  5. if (isset($_SESSION['moodle_db'])) {
  6. $page = 'menu';
  7. } else if (isset($_SESSION['user'])) {
  8. $page = 'host';
  9. }
  10. $moodle_db = isset($_SESSION['moodle_db']) ? makeConnection($_SESSION['moodle_db']) : null;
  11. ?>
  12. <!DOCTYPE html>
  13. <html lang="en">
  14. <head>
  15. <meta charset="UTF-8">
  16. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  17. <title>Administración de calificaciones</title>
  18. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
  19. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
  20. <script src="https://unpkg.com/petite-vue"></script>
  21. <script>
  22. const store = PetiteVue.reactive({
  23. error: null,
  24. loading: false,
  25. async fetch(url, options = {}, custom_error = null) {
  26. store.loading = true
  27. const response = await fetch(url, options)
  28. store.loading = false
  29. if (!response.ok) {
  30. store.error = custom_error ?? {
  31. title: 'Error en la autorización',
  32. message: 'Puede ser que tu token haya expirado o que no tengas permisos para realizar esta acción',
  33. avoidable: false,
  34. actions: [{
  35. label: 'Cerrar sesión',
  36. handler: () => {
  37. window.location.href = '/action/desconectar.php?action=sign-out'
  38. },
  39. class: 'primary'
  40. }]
  41. }
  42. return
  43. }
  44. return response.json()
  45. },
  46. });
  47. </script>
  48. </head>
  49. <body>
  50. <nav>
  51. <div class="container">
  52. <div class="grid">
  53. <h1>Administración de calificaciones</h1>
  54. <?php if (isset($_SESSION['user']) || isset($_SESSION['moodle_db'])) : ?>
  55. <div class="grid">
  56. <?php if (isset($_SESSION['user'])) : ?>
  57. <form action="/action/desconectar.php" method="post">
  58. <input type="hidden" name="action" value="sign-out">
  59. <button type="submit">Cerrar sesión <i class="fas fa-sign-out-alt"></i></button>
  60. </form>
  61. <?php endif; ?>
  62. <?php if (isset($_SESSION['moodle_db'])) : ?>
  63. <form action="/action/desconectar.php" method="post">
  64. <input type="hidden" name="action" value="desconectar">
  65. <button type="submit">Desconectar <i class="fas fa-times-circle"></i></button>
  66. </form>
  67. <?php endif; ?>
  68. </div>
  69. <?php endif; ?>
  70. </div>
  71. </div>
  72. </nav>
  73. <div class="container" v-scope>
  74. <dialog :open="store.loading">
  75. <div class="grid">
  76. <button aria-busy="true" class="secondary"></button>
  77. </div>
  78. </dialog>
  79. <dialog :open="store.error !== null" v-if="store.error">
  80. <article>
  81. <header>
  82. <a href="#close" aria-label="Close" class="close" @click="store.error = null" v-if="store.error.avoidable"></a>
  83. <strong>
  84. {{ store.error.title }}
  85. </strong>
  86. </header>
  87. <p>
  88. {{ store.error.message }}
  89. </p>
  90. <br>
  91. <div class="grid">
  92. <button v-for="action in store.error.actions" @click="action.handler" :class="action.class">
  93. {{ action.label }}
  94. </button>
  95. </div>
  96. </article>
  97. </dialog>
  98. <?php
  99. if (!isset($page)) {
  100. throw new Exception('No se ha definido la variable $page');
  101. }
  102. require "{$_SERVER['DOCUMENT_ROOT']}/pages/$page.html";
  103. ?>
  104. </div>
  105. </body>
  106. </html>