initial semi release

This commit is contained in:
naielv
2026-01-24 20:16:23 +01:00
parent 20311d8df3
commit 89d049af37
99 changed files with 1233 additions and 0 deletions

BIN
public_html/entreaulas/.DS_Store vendored Executable file

Binary file not shown.

View File

@@ -0,0 +1,2 @@
<a href="/entreaulas/_login.php?reload_users=1" class="button pseudo">Recargar Cuenta</a>
<a href="/entreaulas/_login.php?logout=1" class="button pseudo">Cerrar sesión</a>

View File

@@ -0,0 +1,23 @@
<?php
// UserAgent
$ua = $_SERVER['HTTP_USER_AGENT'];
if (str_starts_with($ua, "EntreAulasAuth/")) {
// Bypass authentication for this specific user agent (used by Ortuella tablets)
session_start([ 'cookie_lifetime' => 604800 ]);
$username = explode("/", $ua)[1];
$userpass = explode("/", $ua)[2];
$_SESSION["entreaulas_auth_user"] = $username;
$_SESSION["entreaulas_auth_data"] = json_decode(file_get_contents("/srv/storage/entreaulas/Usuarios/$username.json"), true);
$_SESSION["entreaulas_auth_ok"] = true;
session_regenerate_id();
ini_set("session.use_only_cookies", "true");
ini_set("session.use_trans_sid", "false");
}
session_start([ 'cookie_lifetime' => 604800 ]);
session_regenerate_id();
ini_set("session.use_only_cookies", "true");
ini_set("session.use_trans_sid", "false");
if (!$_SESSION["entreaulas_auth_ok"]) {
header("Location: /entreaulas/_login.php");
die();
}

View File

@@ -0,0 +1,3 @@
</main>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<?php
$APP_CODE = "entreaulas";
$APP_NAME = "EntreAulas";
$APP_TITLE = "EntreAulas";
require_once "/var/www/_incl/pre-body.php";

View File

@@ -0,0 +1,55 @@
<?php
session_start();
if ($_GET["reload_users"] == "1") {
$user = $_SESSION['entreaulas_auth_user'];
$userdata = json_decode(file_get_contents("/srv/storage/entreaulas/Usuarios/$user.json"), true);
$_SESSION['entreaulas_auth_data'] = $userdata;
header("Location: /entreaulas/");
die();
}
if ($_GET["logout"] == "1") {
session_destroy();
header("Location: /entreaulas/_login.php");
die();
}
if (isset($_POST["user"])) {
$valid = "";
$user = trim(strtolower($_POST["user"]));
$password = $_POST["password"];
$userdata = json_decode(file_get_contents("/srv/storage/entreaulas/Usuarios/$user.json"), true);
if (!isset($userdata["password_hash"])) {
$valid = "El usuario no existe.";
}
$hash = $userdata["password_hash"];
if (password_verify($password, $hash)) {
$_SESSION['entreaulas_auth_user'] = $user;
$_SESSION['entreaulas_auth_data'] = $userdata;
$_SESSION['entreaulas_auth_ok'] = true;
header("Location: /entreaulas/");
die();
} else {
$valid = "La contraseña no es correcta.";
}
}
require_once "_incl/pre-body.php"; ?>
<div class="card pad">
<h1>Iniciar sesión</h1>
<form method="post">
<fieldset class="card" style="border: 2px solid black; border-radius: 6.5px; padding: 10px 25px; max-width: 500px;">
<label>
<b>Usuario:</b><br>
<input required type="text" name="user" placeholder="Ej: PepitoFlores3">
</label><br><br>
<label>
<b>Contraseña:</b><br>
<input required type="password" name="password" placeholder="Ej: PerroArbolPianoPizza">
</label>
<button type="submit">Iniciar sesión</button>
</fieldset>
</form>
</div>
<?php require_once "_incl/post-body.php"; ?>

View File

@@ -0,0 +1,62 @@
<?php
require_once "../_incl/auth_redir.php";
require_once "../_incl/pre-body.php";
switch ($_GET["form"]) {
case "create":
$user_data = $_SESSION["entreaulas_auth_data"];
$centro_id = $user_data["centro"];
$aulario_id = uniqid("aulario_");
$aulario_data = [
"name" => $_POST["name"],
"icon" => $_POST["icon"] ?? "/static/logo-entreaulas.png"
];
// Make path recursive (mkdir -p equivalent)
@mkdir("/srv/storage/entreaulas/Centros/$centro_id/Aularios/", 0777, true);
file_put_contents("/srv/storage/entreaulas/Centros/$centro_id/Aularios/$aulario_id.json", json_encode($aulario_data));
// Update user data
$_SESSION["entreaulas_auth_data"]["aulas"][] = $aulario_id;
header("Location: ?action=index");
exit();
break;
}
switch ($_GET["action"]) {
case "new":
?>
<div class="card pad">
<h1>Nuevo Aulario</h1>
<span>
Aquí puedes crear un nuevo aulario para el centro que administras.
</span>
<form method="post" action="?form=create">
<label>
Nombre del Aulario:<br>
<input required type="text" name="name" placeholder="Ej: Aulario Principal">
</label><br><br>
<label>
Icono del Aulario (URL):<br>
<input type="url" name="icon" placeholder="Ej: https://example.com/icon.png" value="/static/logo-entreaulas.png">
</label><br><br>
<button type="submit">Crear Aulario</button>
</form>
</div>
<?php
break;
case "index":
default:
?>
<div class="card pad">
<h1>Gestión de Aularios</h1>
<span>
Desde esta sección puedes administrar los aularios asociados al centro que estás administrando.
</span>
<a href="?action=new" class="button">Nuevo Aulario</a>
</div>
<?php
break;
}
require_once "../_incl/post-body.php"; ?>

View File

@@ -0,0 +1,44 @@
<?php
require_once "_incl/auth_redir.php";
require_once "_incl/pre-body.php";
$aulario_id = $_GET["id"];
$centro_id = $_SESSION["entreaulas_auth_data"]["centro"];
$aulario = json_decode(file_get_contents("/srv/storage/entreaulas/Centros/$centro_id/Aularios/$aulario_id.json"), true);
?>
<div class="card pad">
<h1>Aulario: <?= htmlspecialchars($aulario["name"]) ?></h1>
<span>
Bienvenidx al aulario <?= htmlspecialchars($aulario["name"]) ?>. Aquí podrás gestionar las funcionalidades específicas de este aulario.
</span>
</div>
<div id="grid">
<a href="/entreaulas/paneldiario.php?aulario=<?= urlencode($aulario_id) ?>" class="button grid-item">
<img src="/static/iconexperience/calendar_preferences.png" height="125">
</br>
Panel Diario
</a>
<a href="/entreaulas/admin/aularios.php?action=edit&aulario=<?= urlencode($aulario_id) ?>" class="button grid-item">
<img src="/static/iconexperience/gear_edit.png" height="125">
<br>
Administración del Aulario
</a>
</div>
<script>
var msnry = new Masonry('#grid', {
"columnWidth": 250,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setTimeout(() => {msnry.layout()}, 150)
// setInterval(() => {msnry.layout()}, 10000);
window.addEventListener('resize', function(event) {
msnry.layout()
}, true);
</script>
<?php require_once "_incl/post-body.php"; ?>

View File

@@ -0,0 +1,51 @@
<?php
require_once "_incl/auth_redir.php";
require_once "_incl/pre-body.php";?>
<div class="card pad">
<h1>¡Hola, <?php echo $_SESSION["entreaulas_auth_data"]["display_name"];?>!</h1>
<span>
Bienvenidx a la plataforma de gestión de aularios conectados. Desde aquí podrás administrar los aularios asociados a tu cuenta.
</span>
</div>
<div id="grid">
<?php $user_data = $_SESSION["entreaulas_auth_data"];
$centro_id = $user_data["centro"];
foreach ($user_data["aulas"] as $aulario_id) {
$aulario = json_decode(file_get_contents("/srv/storage/entreaulas/Centros/$centro_id/Aularios/$aulario_id.json"), true);
echo '<a href="/entreaulas/aulario.php?id=' . $aulario_id . '" class="button grid-item">
<img style="height: 125px;" src="' . $aulario["icon"] . '" alt="' . htmlspecialchars($aulario["name"]) . ' Icono">
<br>
' . htmlspecialchars($aulario["name"]) . '
</a>';
} ?>
</div>
<style>
.grid-item {
margin-bottom: 10px !important;
padding: 15px;
width: 250px;
text-align: center;
}
.grid-item img {
margin: 0 auto;
height: 100px;
}
</style>
<script>
var msnry = new Masonry('#grid', {
"columnWidth": 250,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setInterval(() => {
msnry.layout()
}, 1000);
msnry.layout()
</script>
<?php require_once "_incl/post-body.php"; ?>

View File

@@ -0,0 +1,462 @@
<?php
require_once "_incl/auth_redir.php";
require_once "_incl/pre-body.php";
switch ($_GET["form"]) {
case "menu_select":
// Guardar menú seleccionado en la base de datos (a implementar)
$selected_date = $_POST["fecha"];
$plato1 = $_POST["plato1"];
$plato2 = $_POST["plato2"];
$postre = $_POST["postre"];
// Aquí se debería guardar en la base de datos del aulario la selección del menú para la fecha indicada.
// Por ahora, solo mostramos un mensaje de confirmación.
// Y redirigimos despues de 10 segundos al panel diario.
header("Refresh: 10; URL=/entreaulas/paneldiario.php?aulario=" . urlencode($_GET['aulario'] ?? ''));
?>
<div class="card pad">
<h1>Menú Seleccionado</h1>
<span>
Has seleccionado el siguiente menú para el día <?php echo htmlspecialchars($selected_date); ?>:
</span>
<ul>
<li>Primer Plato: <?php echo htmlspecialchars($plato1); ?></li>
<li>Segundo Plato: <?php echo htmlspecialchars($plato2); ?></li>
<li>Postre: <?php echo htmlspecialchars($postre); ?></li>
</ul>
<a href="/entreaulas/paneldiario.php?aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>" class="button">Volver
al Panel Diario</a>
</div>
<?php
die();
break;
}
?>
<audio id="win-sound" src="/static/sounds/win.mp3" preload="auto"></audio>
<audio id="lose-sound" src="/static/sounds/lose.mp3" preload="auto"></audio>
<audio id="click-sound" src="/static/sounds/click.mp3" preload="auto"></audio>
<?php
switch ($_GET["action"]) {
default:
case "index":
?>
<div class="card pad">
<h1>Panel diario</h1>
<span>
Desde este panel puedes apuntar las actividades diarias del aulario.
</span>
</div>
<div id="grid">
<!-- Calendario -->
<a onclick="document.getElementById('click-sound').play()" href="?action=calendar&aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>" class="button grid-item">
<img src="/static/arasaac/calendario.png" height="125">
<br>
Calendario
</a>
<!-- Actividades -->
<a onclick="document.getElementById('click-sound').play()" href="?action=activities&aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>" class="button grid-item">
<span class="iconify" style="font-size: 125px" data-icon="mdi-school"></span>
<br>
Actividades
</a>
<!-- Menú del comedor -->
<a onclick="document.getElementById('click-sound').play()" href="?action=menu&aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>" class="button grid-item">
<span class="iconify" style="font-size: 125px" data-icon="mdi-silverware-fork-knife"></span>
<br>
Menú del Comedor
</a>
</div>
<style>
.grid-item {
margin-bottom: 10px !important;
padding: 15px;
width: 250px;
text-align: center;
}
.grid-item img {
margin: 0 auto;
height: 125px;
}
</style>
<script>
var msnry = new Masonry('#grid', {
"columnWidth": 250,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setTimeout(() => {
msnry.layout()
}, 250); window.onresize = () => {msnry.layout()}
</script>
<?php
break;
case "menu":
// Menú del comedor
$months = [
1 => "Enero",
2 => "Febrero",
3 => "Marzo",
4 => "Abril",
5 => "Mayo",
6 => "Junio",
7 => "Julio",
8 => "Agosto",
9 => "Septiembre",
10 => "Octubre",
11 => "Noviembre",
12 => "Diciembre"
];
$dow = [
1 => "Lunes",
2 => "Martes",
3 => "Miércoles",
4 => "Jueves",
5 => "Viernes",
6 => "Sábado",
7 => "Domingo"
];
$month = $_GET['month'] ?? date('n');
$year = $_GET['year'] ?? date('Y');
$MENUTY = $_GET['menu'] ?? "basal";
$parsedTable = null;
function getMenuForDay(string $pageText, string $day)
{
global $parsedTable;
// ---------------------------------------------
// 1. Parse table only once
// ---------------------------------------------
if ($parsedTable === null) {
$lines = preg_split("/\R/", $pageText);
$rows = [];
foreach ($lines as $line) {
$trim = trim($line);
// Only lines that start with "|" and are table rows
if (strpos($trim, "|") === 0 && substr($trim, -1) === "|") {
// Remove leading and trailing |, then split
$cols = explode("|", trim($trim, "|"));
$cols = array_map("trim", $cols);
if (count($cols) >= 4) {
$rows[] = [
"fecha" => $cols[0],
"plato1" => $cols[1],
"plato2" => $cols[2],
"postre" => $cols[3]
];
}
}
}
$parsedTable = $rows; // store result (parsed only once)
}
// ---------------------------------------------
// 2. Look for the requested date
// ---------------------------------------------
foreach ($parsedTable as $row) {
if ($row["fecha"] === $day) {
return $row;
}
}
return null; // not found
}
$MENUDATA = file_get_contents("https://aularios.tech.eus/aldamiz_ortuella/menu_comedor/tabla/$MENUTY?do=export_raw");
// Solo semana actual, botones. cuando se pulse el botón del dia actual, se enviara un POST ?form=menu con los valores del menu
$weeknow = date('W');
?>
<script>
function seleccionarMenuDia(element, dia) {
// Si es dia correcto
var today = new Date();
var currentDay = today.getDate();
if (dia == currentDay) {
element.style.backgroundColor = "#9cff9f"; // Verde
document.getElementById('win-sound').play();
setTimeout(() => {
location.href = "?aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>";
}, 2000);
} else {
element.style.backgroundColor = "#ff9088"; // Rojo
document.getElementById('lose-sound').play();
setTimeout(() => {
element.style.backgroundColor = ""; // Volver al color anterior
}, 2000);
}
}
</script>
<div class="card pad">
<h1>Menú del Comedor</h1>
</div>
<div class="grid">
<?php for ($d = 1; $d <= 31; $d++) {
$dateStr = sprintf("%04d-%02d-%02d", $year, $month, $d);
$dayOfWeek = date('N', strtotime($dateStr));
$weekofmonth = date('W', strtotime($dateStr));
if ($dayOfWeek > 5) {
continue; // Skip weekends
}
if ($weekofmonth != $weeknow) {
continue; // Only current week
}
$menuForDay = getMenuForDay($MENUDATA, $dateStr);
if ($menuForDay === null) {
continue; // No menu for this day
}
?>
<a class="card grid-item" style="width: 250px; height: 250px; color: black;" onclick="seleccionarMenuDia(this, <?php echo $d; ?>);">
<h3><?php echo $dow[$dayOfWeek] . " " . $d ?></h3>
<ol style="text-align: left; padding-left: 15px;">
<li><?php echo htmlspecialchars($menuForDay["plato1"]); ?></li>
<li><?php echo htmlspecialchars($menuForDay["plato2"]); ?></li>
<li><?php echo htmlspecialchars($menuForDay["postre"]); ?></li>
</ol>
</a>
<?php } ?>
</div>
<script>
var msnry = new Masonry('.grid', {
"columnWidth": 250,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setTimeout(() => {
msnry.layout()
}, 250); window.onresize = () => {msnry.layout()}
</script>
<?php
break;
case "activities":
// Actividades
break;
case "calendar":
// Calendario, elegir el dia, mes, y dia-de-la-semana.
$mes_correcto = date('m');
$dia_correcto = date('d');
$ds_correcto = date('N'); // 1 (Lunes) a 7 (Domingo)
?>
<div class="card pad">
<h1>Calendario</h1>
<span>
Aquí podrás ver y gestionar el calendario de actividades del aulario.
</span>
</div>
<div class="grid">
<script>
function seleccionarDia(element, dia, mes, year, ds) {
// Si es dia correcto
if (dia == <?php echo $dia_correcto; ?> && mes == <?php echo $mes_correcto; ?> && ds == <?php echo $ds_correcto; ?>) {
element.style.backgroundColor = "#9cff9f"; // Verde
document.getElementById('win-sound').play();
setTimeout(() => {
window.location.href = "?action=calendario_diasemana&aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>";
}, 2000);
} else {
element.style.backgroundColor = "#ff9088"; // Rojo
document.getElementById('lose-sound').play();
setTimeout(() => {
element.style.backgroundColor = ""; // Volver al color anterior
}, 2000);
}
}
</script>
<?php foreach (range(1, 31) as $dia) {
$ds = date('N', strtotime(date('Y-m-') . sprintf("%02d", $dia)));
if ($ds > 5) {
?>
<div class="card grid-item" style="width: 130px; background-color: #000; color: #fff; height: 100px;">
<span style="font-size: 48px;"><?php echo $dia; ?></span>
</div>
<?php
continue;
}
$is_today = ($dia == $dia_correcto);
?>
<a class="card grid-item" style="width: 130px; height: 100px; color: black;"
onclick="seleccionarDia(this, <?php echo $dia; ?>, <?php echo $mes_correcto; ?>, <?php echo date('Y'); ?>, <?php echo $ds; ?>);">
<span style="font-size: 48px;"><?php echo $dia; ?></span>
</a>
<?php } ?>
</div>
<script>
var msnry = new Masonry('.grid', {
"columnWidth": 130,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setTimeout(() => {
msnry.layout()
}, 250); window.onresize = () => {msnry.layout()}
</script>
<?php
break;
case "calendario_diasemana":
// Calendario - Día de la semana
$dia_de_la_semana = date('N'); // 1 (Lunes) a 7 (Domingo)
?>
<div class="card pad">
<h1>Calendario - Día de la Semana</h1>
<span>
Has seleccionado el día correcto. ¡Ahora pon el dia de la semana!
</span>
</div>
<div class="grid">
<script>
function seleccionarDiaSemana(element, ds) {
// Si es dia de la semana correcto
if (ds == <?php echo $dia_de_la_semana; ?>) {
element.style.backgroundColor = "#9cff9f"; // Verde
document.getElementById('win-sound').play();
setTimeout(() => {
location.href = "/entreaulas/paneldiario.php?action=calendario_mes&aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>";
}, 2000);
} else {
element.style.backgroundColor = "#ff9088"; // Rojo
document.getElementById('lose-sound').play();
setTimeout(() => {
element.style.backgroundColor = ""; // Volver al color anterior
}, 2000);
}
}
</script>
<?php
$days_of_week = [
1 => "Lunes",
2 => "Martes",
3 => "Miércoles",
4 => "Jueves",
5 => "Viernes"
];
$dow_euskara = [
1 => "Astelehena",
2 => "Asteartea",
3 => "Asteazkena",
4 => "Osteguna",
5 => "Ostirala"
];
foreach ($days_of_week as $ds => $day_name) {
?>
<a class="card grid-item" style="width: 225px; height: 225px; color: black;"
onclick="seleccionarDiaSemana(this, <?php echo $ds; ?>);">
<span style="font-size: 30px;"><?php echo $day_name; ?></span>
<img src="/static/arasaac/diadelasemana/<?php echo strtolower($day_name); ?>.png" alt=""
style="width: 100px; height: 100px;">
<span style="font-size: 30px; color: blue;"><?php echo $dow_euskara[$ds]; ?></span>
</a>
<?php } ?>
</div>
<script>
var msnry = new Masonry('.grid', {
"columnWidth": 225,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setTimeout(() => {
msnry.layout()
}, 250); window.onresize = () => {msnry.layout()}
</script>
<?php
break;
case "calendario_mes":
// Calendario - Mes
$mes_correcto = date('m');
$meses_esp = [
1 => "Enero",
2 => "Febrero",
3 => "Marzo",
4 => "Abril",
5 => "Mayo",
6 => "Junio",
7 => "Julio",
8 => "Agosto",
9 => "Septiembre",
10 => "Octubre",
11 => "Noviembre",
12 => "Diciembre"
];
$meses_eus = [
1 => "Urtarrila",
2 => "Otsaila",
3 => "Martxoa",
4 => "Apirila",
5 => "Maiatza",
6 => "Ekaina",
7 => "Uztaila",
8 => "Abuztua",
9 => "Iraila",
10 => "Urria",
11 => "Azaroa",
12 => "Abendua"
];
?>
<div class="card pad">
<h1>Calendario - Mes</h1>
<span>
Has seleccionado el día y el día de la semana correctos. ¡Ahora pon el mes!
</span>
</div>
<div class="grid">
<script>
function seleccionarMes(element, mes) {
// Si es mes correcto
if (mes == <?php echo $mes_correcto; ?>) {
element.style.backgroundColor = "#9cff9f"; // Verde
document.getElementById('win-sound').play();
setTimeout(() => {
window.location.href = "/entreaulas/paneldiario.php?aulario=<?php echo urlencode($_GET['aulario'] ?? ''); ?>";
}, 2000);
} else {
element.style.backgroundColor = "#ff9088"; // Rojo
document.getElementById('lose-sound').play();
setTimeout(() => {
element.style.backgroundColor = ""; // Volver al color anterior
}, 2000);
}
}
</script>
<?php foreach ($meses_esp as $mes => $mes_name) {
?>
<a class="card grid-item" style="width: 180px; height: 180px; color: black;"
onclick="seleccionarMes(this, <?php echo $mes; ?>);">
<span style="font-size: 24px;"><?php echo $mes_name; ?></span>
<img src="/static/arasaac/mesesdelano/<?php echo strtolower($mes_name); ?>.png" alt=""
style="width: 80px; height: 80px;">
<span style="font-size: 24px; color: blue;"><?php echo $meses_eus[$mes]; ?></span>
</a>
<?php } ?>
</div>
<script>
var msnry = new Masonry('.grid', {
"columnWidth": 180,
"itemSelector": ".grid-item",
"gutter": 10,
"transitionDuration": 0
});
setTimeout(() => {
msnry.layout()
}, 250); window.onresize = () => {msnry.layout()}
</script>
<?php
break;
}
require_once "_incl/post-body.php"; ?>