index.php 4.6 KB

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