Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ee8655b
Refactor block rendering to use Mustache templates
IsaacDev2024 Jan 8, 2026
6b0d489
Create admin_view.mustache for learning styles
serna0120 Jan 8, 2026
a9029c3
Add continue_test.mustache template
serna0120 Jan 8, 2026
ed9db40
Add results template with learning styles and JS logic
serna0120 Jan 8, 2026
e53138b
Create teacher_dashboard.mustache template
serna0120 Jan 8, 2026
9e82e19
Create test_invitation.mustache template
serna0120 Jan 8, 2026
81d95cd
Add view_individual_progress.mustache template
serna0120 Jan 8, 2026
26792cd
Implement individual results view layout
serna0120 Jan 8, 2026
37ae1ee
Add learning style questionnaire template
serna0120 Jan 8, 2026
994badb
Add radar_handler.min.js for radar chart functionality
sorejuela Jan 8, 2026
a0008ff
Add view_handler.min.js for form handling
sorejuela Jan 8, 2026
797e001
Add radar chart handler with initialization logic
sorejuela Jan 8, 2026
0e8fa08
Add auto-save and validation to learning style form
sorejuela Jan 8, 2026
fad6469
Update participant terminology to 'Student'
sorejuela Jan 8, 2026
8414097
Update participant terminology in Spanish language file
sorejuela Jan 8, 2026
91faa1d
Rename learning_style_icon.svg to icon.svg
sorejuela Jan 8, 2026
fefa27a
Change RELEASES.md to CHANGELOG.md in workflow
sorejuela Jan 8, 2026
0b7ca10
Modernize admin view with templates and optimized SQL
IsaacDev2024 Jan 8, 2026
bfd4053
Modernize layout and refactor view_individual.php
IsaacDev2024 Jan 8, 2026
c74df6c
Refactor response handling and enhance navigation logic
IsaacDev2024 Jan 8, 2026
81b7867
Add PHPDoc comments to lib.php
IsaacDev2024 Jan 8, 2026
b2fbd27
Add PHPDoc comments to download_results.php
IsaacDev2024 Jan 8, 2026
2d1a332
Add documentation header to block_learning_style.php
IsaacDev2024 Jan 8, 2026
d29c93c
Update CHANGELOG for version 2.0.1
IsaacDev2024 Jan 8, 2026
23dfb46
Update release date for version 2.0.1
IsaacDev2024 Jan 8, 2026
97c3403
Change image source in README
serna0120 Jan 8, 2026
344df11
Update version to 2.0.1 and adjust copyright year
IsaacDev2024 Jan 8, 2026
5040c1d
Add GNU General Public License v3 to LICENSE file
IsaacDev2024 Jan 9, 2026
4138b46
Add LICENSE file
IsaacDev2024 Jan 9, 2026
a054300
Return Chart instance from radar_handler
IsaacDev2024 Jan 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,9 @@ jobs:
id: changelog
run: |
# Extraer changelog para la versión actual
if [ -f "RELEASES.md" ]; then
if [ -f "CHANGELOG.md" ]; then
# Buscar la sección de la versión actual
awk '/## \["'"${{ needs.check-version.outputs.version }}"'"\]/{flag=1; next} /## \[/{flag=0} flag' RELEASES.md > current_changelog.md
awk '/## \['"${{ needs.check-version.outputs.version }}"'\]/{flag=1; next} /## \[/{flag=0} flag' CHANGELOG.md > current_changelog.md

if [ -s current_changelog.md ]; then
echo "Found changelog entry for version ${{ needs.check-version.outputs.version }}"
Expand All @@ -106,7 +106,7 @@ jobs:
else
echo "No specific changelog entry found, using default message"
echo "### Cambios en esta versión" > current_changelog.md
echo "- Consultar RELEASES.md para detalles completos" >> current_changelog.md
echo "- Consultar CHANGELOG.md para detalles completos" >> current_changelog.md
echo "- Version: ${{ needs.check-version.outputs.version }}" >> current_changelog.md
fi
else
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

Todas las modificaciones importantes del proyecto se documentarán en este archivo.

## [2.0.1] — 2026-01-08
- Paginación en la lista de estudiantes en el panel de administración.
- Nueva forma de mostrar las estadísticas generales en el panel de administración.
- Uso de arquitectura de plantillas Mustache para todas las vistas del bloque.
- Refactorización completa del código para separar lógica de presentación.
- Mejora en la mantenibilidad y escalabilidad del código.
- Optimización del rendimiento en búsquedas.
- Pequeñas mejoras de seguridad.

## [2.0.0] — Inicio de registro
- A partir de la versión 2.0.0 se comienza a documentar este CHANGELOG.
- Renovación completa y moderna de la UI/UX del bloque, test, panel de administración y vistas individuales (Todas con diseño responsivo).
Expand Down
674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ El profesor cuenta con una vista ejecutiva desde el bloque, donde puede monitori
Un panel de administración que centraliza el seguimiento grupal. Permite visualizar quiénes han completado el proceso, quiénes están en curso y gestionar los resultados colectivos para adaptar la estrategia pedagógica del aula.

<p align="center">
<img src="https://github.com/user-attachments/assets/258d6fe2-4468-450d-8ec1-f53e01ffb0e0" alt="Panel de Administración" width="800">
<img src="https://github.com/user-attachments/assets/bcb983b3-fce0-4346-8693-095d86008932" alt="Panel de Administración" width="800">
</p>

**Seguimiento Individualizado y Detallado**
Expand Down
712 changes: 245 additions & 467 deletions admin_view.php

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions amd/build/radar_handler.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions amd/build/view_handler.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

74 changes: 74 additions & 0 deletions amd/src/radar_handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
define(['core/chartjs'], function(Chart) {
"use strict";

return {
init: function(params) {
var canvas = document.getElementById(params.canvasId);
if (!canvas) { return; }
var ctx = canvas.getContext('2d');

return new Chart(ctx, {
type: 'radar',
data: {
labels: params.labels,
datasets: [{
label: params.datasetLabel,
data: [
params.data.vis,
params.data.sen,
params.data.act,
params.data.glo,
params.data.vrb,
params.data.int,
params.data.ref,
params.data.seq
],
backgroundColor: 'rgba(21, 103, 249, 0.2)',
borderColor: 'rgba(21, 103, 249, 1)',
borderWidth: 2,
pointBackgroundColor: 'rgba(21, 103, 249, 1)'
}]
},
options: {
responsive: true,
scales: {
r: {
min: 0,
max: 11,
angleLines: {
display: true,
color: 'rgba(0, 0, 0, 0.1)'
},
grid: {
color: function(context) {
if (context.tick.value % 2 === 1) {
return 'transparent';
}
return 'rgba(0, 0, 0, 0.1)';
},
lineWidth: 1
},
ticks: {
stepSize: 1,
display: true,
backdropColor: 'transparent',
callback: function(value) {
return value % 2 !== 0 ? value : '';
},
font: {
size: 12
}
},
pointLabels: {
font: {size: 14}
}
}
},
plugins: {
legend: { display: false }
}
}
});
}
};
});
195 changes: 195 additions & 0 deletions amd/src/view_handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
define(['jquery', 'core/ajax'], function($, Ajax) {
"use strict";

return {
init: function(params) {

// Auto-save functionality (silent, no visual feedback)
var autoSaveTimer = null;
var isSaving = false;
var formUrl = params.formUrl;

function autoSaveProgress() {
if (isSaving) return;

isSaving = true;
var formData = new FormData(document.getElementById('learningStyleForm'));
formData.set('action', 'autosave');

fetch(formUrl, {
method: 'POST',
body: formData
})
.then(function(response) { return response.json(); })
.then(function(data) {
// Silent save - no visual feedback
isSaving = false;
})
.catch(function(error) {
// console.error('Auto-save error:', error);
isSaving = false;
});
}

// Listen to changes in selects for auto-save
$('.select-q').on('change', function() {
// Remove red highlight when user answers the question
var select = $(this);
var listItem = select.closest('.learning_style_item');

// Remove error styling if present
if (listItem.hasClass('question-error-highlight')) {
listItem.css({
'border': '',
'background-color': '',
'border-radius': '',
'padding': '',
'margin-bottom': '',
'box-shadow': ''
});
listItem.removeClass('question-error-highlight');
}

// Clear previous timer
if (autoSaveTimer) {
clearTimeout(autoSaveTimer);
}

// Auto-save after 2 seconds of inactivity
autoSaveTimer = setTimeout(autoSaveProgress, 2000);
});

// Handle form submission for navigation
$('#learningStyleForm').on('submit', function(e) {
// Determine which button triggered the submit
// Note: e.originalEvent.submitter is supported in modern browsers
var submitter = e.originalEvent.submitter;
var action = submitter ? submitter.value : 'next';

// For "previous" button, always allow navigation without validation
if (action === 'previous') {
return true;
}

// Only validate for "next" and "finish" actions
if (action !== 'next' && action !== 'finish') {
return true;
}

// Validate current page for next/finish
var selectsOnPage = $('.select-q');
var allAnswered = true;
var firstUnanswered = null;

selectsOnPage.each(function() {
if ($(this).val() === '') {
allAnswered = false;
var listItem = $(this).closest('.learning_style_item');

if (listItem.length) {
listItem.css({
'border': '3px solid #d32f2f',
'background-color': '#ffebee',
'border-radius': '10px',
'padding': '24px 28px',
'margin-bottom': '1.5rem',
'box-shadow': '0 4px 8px rgba(211, 47, 47, 0.3)'
});
listItem.addClass('question-error-highlight');

if (!firstUnanswered) {
firstUnanswered = listItem;
}
}
}
});

if (!allAnswered) {
e.preventDefault();

// Scroll to first unanswered question (card)
if (firstUnanswered) {
firstUnanswered[0].scrollIntoView({
behavior: 'smooth',
block: 'center'
});
}

return false;
}
});

// Auto-scroll to first unanswered question when continuing test
if (params.shouldAutoScroll) {
// Wait a bit for the page to fully render
setTimeout(function() {
// Find first unanswered question on current page
var found = false;
$('.select-q').each(function() {
if (found) return;

if ($(this).val() === '') {
var listItem = $(this).closest('.learning_style_item');

// Add green highlight to the entire card
if (listItem.length) {
listItem.css({
'border': '3px solid #28a745',
'background-color': '#d4edda',
'border-radius': '10px',
'padding': '24px 28px',
'margin-bottom': '1.5rem',
'box-shadow': '0 4px 8px rgba(40, 167, 69, 0.3)',
'transition': 'all 0.3s ease'
});

// Scroll to it
listItem[0].scrollIntoView({
behavior: 'smooth',
block: 'center'
});

// Remove highlight after 5 seconds
setTimeout(function() {
listItem.css({
'border': '',
'background-color': '',
'border-radius': '',
'padding': '',
'margin-bottom': '',
'box-shadow': ''
});
}, 5000);
}
found = true;
}
});
}, 300);
}

// Scroll to finish button when coming from block with all questions answered
if (params.scrollToFinish) {
setTimeout(function() {
var finishBtn = $('#submitBtn');
if (finishBtn.length) {
finishBtn[0].scrollIntoView({
behavior: 'smooth',
block: 'center'
});

// Add green pulsing highlight to the button
finishBtn.css({
'box-shadow': '0 0 20px rgba(40, 167, 69, 0.8)',
'transition': 'all 0.3s ease'
});

// Remove highlight after 5 seconds
setTimeout(function() {
finishBtn.css('box-shadow', '');
}, 5000);
}
}, 300);
}
}
};
});
Loading