working on issue #376

parent e8ea01d6
# Acciones a realizar
- En /sails/src/assets lanzar "bower install"
# Changes for new grid system # Changes for new grid system
Solo hay que lanzar, desde MySQL el archivo roles/database/files/new-grid-system-adapt.sql - Lanzar, desde MySQL el archivo roles/database/files/new-grid-system-adapt.sql
...@@ -30,7 +30,8 @@ ...@@ -30,7 +30,8 @@
"ngMask": "angular-mask#~3.1.1", "ngMask": "angular-mask#~3.1.1",
"angular-recaptcha": "^4.0.1", "angular-recaptcha": "^4.0.1",
"ui-bootstrap": "~2.5.0", "ui-bootstrap": "~2.5.0",
"ngInfiniteScroll": "^1.3.4" "ngInfiniteScroll": "^1.3.4",
"angular-file-saver": "^1.1.3"
}, },
"resolutions": { "resolutions": {
"angular": ">=1 <1.3.0", "angular": ">=1 <1.3.0",
......
...@@ -122,6 +122,7 @@ ...@@ -122,6 +122,7 @@
"disclaimer_requested": "Conditions of use must be read and accepted", "disclaimer_requested": "Conditions of use must be read and accepted",
"double_click": "Double click", "double_click": "Double click",
"down": "Down", "down": "Down",
"download": "Download",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"duration_in_months": "Duration (months)", "duration_in_months": "Duration (months)",
"drag": "Drag", "drag": "Drag",
...@@ -164,6 +165,7 @@ ...@@ -164,6 +165,7 @@
"finished": "Finished", "finished": "Finished",
"firmware": "Firmware id", "firmware": "Firmware id",
"free_category": "Free category", "free_category": "Free category",
"from": "from",
"gender": "Gender", "gender": "Gender",
"general_labels": "General labels", "general_labels": "General labels",
"generate": "Generate", "generate": "Generate",
...@@ -466,6 +468,7 @@ ...@@ -466,6 +468,7 @@
"time_tries_per_days": "Time of tries per days in", "time_tries_per_days": "Time of tries per days in",
"time_tries_per_month": "Time of tries per months in", "time_tries_per_month": "Time of tries per months in",
"title": "Title", "title": "Title",
"to": "to",
"totals": "Totals", "totals": "Totals",
"to_add": "To add", "to_add": "To add",
"tpl_date_frame": "de {{ begin | date:'dd-MM-yyyy' }} a {{ end | date:'dd-MM-yyyy' }}", "tpl_date_frame": "de {{ begin | date:'dd-MM-yyyy' }} a {{ end | date:'dd-MM-yyyy' }}",
......
...@@ -121,6 +121,7 @@ ...@@ -121,6 +121,7 @@
"disclaimer_requested": "Las condiciones de uso deben ser leídas y aceptadas", "disclaimer_requested": "Las condiciones de uso deben ser leídas y aceptadas",
"double_click": "Doble clic", "double_click": "Doble clic",
"down": "Abajo", "down": "Abajo",
"download": "Descargar",
"duplicate": "Duplicar", "duplicate": "Duplicar",
"duration_in_months": "Duración (meses)", "duration_in_months": "Duración (meses)",
"drag": "Arrastrar", "drag": "Arrastrar",
...@@ -163,6 +164,7 @@ ...@@ -163,6 +164,7 @@
"finished": "Completada", "finished": "Completada",
"firmware": "Id firmware", "firmware": "Id firmware",
"free_category": "Categoría libre", "free_category": "Categoría libre",
"from": "desde",
"gender": "Género", "gender": "Género",
"general_labels": "Generales", "general_labels": "Generales",
"generate": "Generar", "generate": "Generar",
...@@ -464,6 +466,7 @@ ...@@ -464,6 +466,7 @@
"time_tries_per_days": "Tiempo de ensayos por días en", "time_tries_per_days": "Tiempo de ensayos por días en",
"time_tries_per_month": "Tiempo de ensayos por meses en", "time_tries_per_month": "Tiempo de ensayos por meses en",
"title": "Título", "title": "Título",
"to": "hasta",
"totals": "Totales", "totals": "Totales",
"to_add": "Para añadir", "to_add": "Para añadir",
"tpl_date_frame": "de {{ begin | date:'dd-MM-yyyy' }} a {{ end | date:'dd-MM-yyyy' }}", "tpl_date_frame": "de {{ begin | date:'dd-MM-yyyy' }} a {{ end | date:'dd-MM-yyyy' }}",
......
...@@ -20,7 +20,8 @@ var dashboardApp = angular.module('dashboardApp', [ ...@@ -20,7 +20,8 @@ var dashboardApp = angular.module('dashboardApp', [
'ngLodash', 'ngLodash',
'ngMask', 'ngMask',
'vcRecaptcha', 'vcRecaptcha',
'infinite-scroll' 'infinite-scroll',
'ngFileSaver'
]); ]);
/* Main constants */ /* Main constants */
...@@ -226,6 +227,5 @@ dashboardApp.factory('newconfirm', function ($window, $q, $timeout) { ...@@ -226,6 +227,5 @@ dashboardApp.factory('newconfirm', function ($window, $q, $timeout) {
return newconfirm; return newconfirm;
}); });
// force websocket transport protocol // force websocket transport protocol
//io.sails.transports=['polling']; //io.sails.transports=['polling'];
...@@ -10,7 +10,9 @@ dashboardControllers.controller('StudentReportsCtrl', function StudentReportsCtr ...@@ -10,7 +10,9 @@ dashboardControllers.controller('StudentReportsCtrl', function StudentReportsCtr
config, config,
ngToast, ngToast,
$filter, $filter,
$translate) { $translate,
FileSaver,
Blob) {
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// //
...@@ -43,6 +45,9 @@ dashboardControllers.controller('StudentReportsCtrl', function StudentReportsCtr ...@@ -43,6 +45,9 @@ dashboardControllers.controller('StudentReportsCtrl', function StudentReportsCtr
$scope.elems = []; $scope.elems = [];
var tsvData = "";
const SEPARATOR = '\t';
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -55,21 +60,47 @@ dashboardControllers.controller('StudentReportsCtrl', function StudentReportsCtr ...@@ -55,21 +60,47 @@ dashboardControllers.controller('StudentReportsCtrl', function StudentReportsCtr
.get(config.backend+'/stu/'+ $scope.studentData.id +'/tries') .get(config.backend+'/stu/'+ $scope.studentData.id +'/tries')
.success(function(data) { .success(function(data) {
$scope.fulldata = data; $scope.fulldata = data;
for(var i =0; i<$scope.fulldata.methods.length; i++){ tsvData = "method" + SEPARATOR + "instruction" + SEPARATOR + "instruction_begin" + SEPARATOR + "instruction_end" + SEPARATOR + "session_begin" + SEPARATOR + "session_end" + SEPARATOR + "try_begin" + SEPARATOR + "try_end" + SEPARATOR + "action" + SEPARATOR + "action_timestamp" + SEPARATOR + "action_expression\n";
$scope.elems.push({id:$scope.fulldata.methods[i].id, class:"method-opt", name: $scope.fulldata.methods[i].name}); for(var i =0; i<data.methods.length; i++){
for(var j=0; j<$scope.fulldata.methods[i].instructions.length; j++){ $scope.elems.push({id:data.methods[i].id, class:"method-opt", name: data.methods[i].name});
if ($scope.fulldata.methods[i].instructions[j].working_sessions) for(var j=0; j<data.methods[i].instructions.length; j++){
$scope.elems.push({id:$scope.fulldata.methods[i].instructions[j].id, if (data.methods[i].instructions[j].working_sessions) {
class:"instruction-opt", name: "- - "+$scope.fulldata.methods[i].instructions[j].name, id_method: $scope.fulldata.methods[i].id}); $scope.elems.push({id:data.methods[i].instructions[j].id,
class:"instruction-opt", name: "- - "+data.methods[i].instructions[j].name, id_method: data.methods[i].id});
for(var k=0; k<data.methods[i].instructions[j].working_sessions.length; k++)
for(var l=0; l<data.methods[i].instructions[j].working_sessions[k].tries.length; l++)
for(var m=0; m<data.methods[i].instructions[j].working_sessions[k].tries[l].actions.length; m++)
tsvData +=
data.methods[i].name + SEPARATOR +
data.methods[i].instructions[j].name + SEPARATOR +
data.methods[i].instructions[j].begin + SEPARATOR +
data.methods[i].instructions[j].end + SEPARATOR +
data.methods[i].instructions[j].working_sessions[k].begin + SEPARATOR +
data.methods[i].instructions[j].working_sessions[k].end + SEPARATOR +
data.methods[i].instructions[j].working_sessions[k].tries[l].begin + SEPARATOR +
data.methods[i].instructions[j].working_sessions[k].tries[l].end + SEPARATOR +
data.methods[i].instructions[j].working_sessions[k].tries[l].actions[m].timestamp + SEPARATOR +
data.methods[i].instructions[j].working_sessions[k].tries[l].actions[m].description &&
data.methods[i].instructions[j].working_sessions[k].tries[l].actions[m].description.attributes &&
data.methods[i].instructions[j].working_sessions[k].tries[l].actions[m].description.attributes.expression ? data.methods[i].instructions[j].working_sessions[k].tries[l].actions[m].description.attributes.expression : '' + '\n';
}
} }
} }
$scope.filter(); $scope.filter();
}) })
.error(function(data, status, headers, config) { .error(function(data, status, headers, config) {
console.log("Error from API: " + data.error); console.log("Error from API: " + data.error);
}); });
/** /**
* Download data in CSV format
*/
$scope.download = function() {
var data = new Blob([tsvData], { type: 'text/plain;charset=utf-8' });
FileSaver.saveAs(data, 'report.tsv');
};
/**
* Opens the calendar for selecting student's birthdate. * Opens the calendar for selecting student's birthdate.
* Prevents the propagation of the click event. * Prevents the propagation of the click event.
* @param {event} Click event * @param {event} Click event
......
...@@ -20,14 +20,9 @@ ...@@ -20,14 +20,9 @@
<!-- filter selector --> <!-- filter selector -->
<div id="filter"> <div id="filter">
<div class="row">
<div class="col-xs-12">
<h1 class="page-header">{{'filter' | translate}}</h1>
</div>
</div>
<!-- selectors --> <!-- selectors -->
<div class="row"> <div class="row">
<div class="col-xs-3 col-xs-offset-1"> <div class="col-xs-3">
<div class="form-group"> <div class="form-group">
<p class="input-group"> <p class="input-group">
<select class="form-control" name="method_select" id="method_select" ng-model="selected_method"> <select class="form-control" name="method_select" id="method_select" ng-model="selected_method">
...@@ -40,6 +35,7 @@ ...@@ -40,6 +35,7 @@
<div class="col-xs-3"> <div class="col-xs-3">
<div class="form-group"> <div class="form-group">
<p class="input-group"> <p class="input-group">
<span class="input-group-addon" translate>from</span>
<input type="text" class="form-control" datepicker-popup=" {{ 'day_format' | translate }}" ng-model="reportDateSince" placeholder="{{ 'since' | translate }}" is-open="openedSince" close-text="{{'close' | translate}}" /> <input type="text" class="form-control" datepicker-popup=" {{ 'day_format' | translate }}" ng-model="reportDateSince" placeholder="{{ 'since' | translate }}" is-open="openedSince" close-text="{{'close' | translate}}" />
<span class="input-group-btn"> <span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="openCalendar($event,1)"><i class="glyphicon glyphicon-calendar"></i></button> <button type="button" class="btn btn-default" ng-click="openCalendar($event,1)"><i class="glyphicon glyphicon-calendar"></i></button>
...@@ -50,6 +46,7 @@ ...@@ -50,6 +46,7 @@
<div class="col-xs-3"> <div class="col-xs-3">
<div class="form-group"> <div class="form-group">
<p class="input-group"> <p class="input-group">
<span class="input-group-addon" translate>to</span>
<input type="text" class="form-control" datepicker-popup=" {{ 'day_format' | translate }}" ng-model="reportDateTo" placeholder="{{ 'to' | translate }}" is-open="openedTo" close-text="{{'close' | translate}}" /> <input type="text" class="form-control" datepicker-popup=" {{ 'day_format' | translate }}" ng-model="reportDateTo" placeholder="{{ 'to' | translate }}" is-open="openedTo" close-text="{{'close' | translate}}" />
<span class="input-group-btn"> <span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="openCalendar($event,2)"><i class="glyphicon glyphicon-calendar"></i></button> <button type="button" class="btn btn-default" ng-click="openCalendar($event,2)"><i class="glyphicon glyphicon-calendar"></i></button>
...@@ -74,38 +71,15 @@ ...@@ -74,38 +71,15 @@
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
<h1 ng-if="!showPrint" class="page-header">{{'methods' | translate}}</h1> <h2 ng-if="!showPrint">{{'methods' | translate}}</h2>
<h1 ng-if="showPrint" class="page-header">{{printName | translate}} <small id="inform-content-date">{{ 'tpl_date_frame' | translate:{'begin':reportDateSince, 'end':reportDateTo} }}</small></h1> <h2 ng-if="showPrint">{{printName | translate}} <small id="inform-content-date">{{ 'tpl_date_frame' | translate:{'begin':reportDateSince, 'end':reportDateTo} }}</small></h2>
</div> <a target="_self" ng-click="download()" download="report.csv" class="btn btn-default btn-sm" popover="{{ 'download' | translate }}" popover-trigger="mouseenter">
</div> <span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> {{ 'download' | translate }} TSV
</a>
<!-- graphics headers -->
<div class="row">
<div class="col-xs-4">
<h1 class="text-center"><small>{{'error_rate' | translate}}</small></h1>
</div>
<div class="col-xs-4">
<h1 class="text-center"><small>{{'average_time_per_try' | translate}}</small></h1>
</div>
<div class="col-xs-4">
<h1 class="text-center"><small>{{'average_time_between_pictos' | translate}}</small></h1>
</div>
</div>
<!-- graphics -->
<div class="row">
<div class="col-xs-4 bg-light-gray">
<canvas id="error_rate" class="chart chart-line" chart-options="optionsChartDateRate" chart-data="dataChart1" chart-labels="labels1" chart-series="series1"></canvas>
</div>
<div class="col-xs-4">
<canvas id="avg_time_trie" class="chart chart-line" chart-options="optionsChartDateSeconds" chart-data="dataChart2" chart-labels="labels2" chart-series="series2"></canvas>
</div>
<div class="col-xs-4 bg-light-gray">
<canvas id="avg_time_pictos" class="chart chart-line" chart-options="optionsChartDateSeconds" chart-data="dataChart3" chart-labels="labels3" chart-series="series3"></canvas>
</div> </div>
</div> </div>
<br> <br/>
<!-- table --> <!-- table -->
<div class="row"> <div class="row">
...@@ -143,16 +117,42 @@ ...@@ -143,16 +117,42 @@
</div> </div>
</div> </div>
<!-- graphics headers -->
<div class="row">
<div class="col-xs-4">
<h2 class="text-center"><small>{{'error_rate' | translate}}</small></h2>
</div>
<div class="col-xs-4">
<h2 class="text-center"><small>{{'average_time_per_try' | translate}}</small></h2>
</div>
<div class="col-xs-4">
<h2 class="text-center"><small>{{'average_time_between_pictos' | translate}}</small></h2>
</div>
</div>
<!-- graphics -->
<div class="row">
<div class="col-xs-4 bg-light-gray">
<canvas id="error_rate" class="chart chart-line" chart-options="optionsChartDateRate" chart-data="dataChart1" chart-labels="labels1" chart-series="series1"></canvas>
</div>
<div class="col-xs-4">
<canvas id="avg_time_trie" class="chart chart-line" chart-options="optionsChartDateSeconds" chart-data="dataChart2" chart-labels="labels2" chart-series="series2"></canvas>
</div>
<div class="col-xs-4 bg-light-gray">
<canvas id="avg_time_pictos" class="chart chart-line" chart-options="optionsChartDateSeconds" chart-data="dataChart3" chart-labels="labels3" chart-series="series3"></canvas>
</div>
</div>
<!-- graphics headers 2 --> <!-- graphics headers 2 -->
<div class="row"> <div class="row">
<div class="col-xs-4 bg-light-gray"> <div class="col-xs-4 bg-light-gray">
<h1 class="text-center"><small>{{'vocabulary_size' | translate}}</small></h1> <h2 class="text-center"><small>{{'vocabulary_size' | translate}}</small></h2>
</div> </div>
<div class="col-xs-4"> <div class="col-xs-4">
<h1 class="text-center"><small>{{'phrase_size' | translate}}</small></h1> <h2 class="text-center"><small>{{'phrase_size' | translate}}</small></h2>
</div> </div>
<div class="col-xs-4"> <div class="col-xs-4">
<h1 class="text-center"><small>{{'phrase_build_time' | translate}}</small></h1> <h2 class="text-center"><small>{{'phrase_build_time' | translate}}</small></h2>
</div> </div>
</div> </div>
......
...@@ -31,6 +31,7 @@ module.exports = function (grunt) { ...@@ -31,6 +31,7 @@ module.exports = function (grunt) {
'assets/app/bower_components/ngImgCrop/compile/minified/ng-img-crop.js', 'assets/app/bower_components/ngImgCrop/compile/minified/ng-img-crop.js',
'assets/app/bower_components/bootstrap-filestyle/src/bootstrap-filestyle.min.js', 'assets/app/bower_components/bootstrap-filestyle/src/bootstrap-filestyle.min.js',
'assets/app/bower_components/ngMask/dist/ngMask.min.js', 'assets/app/bower_components/ngMask/dist/ngMask.min.js',
'assets/app/bower_components/angular-file-saver/dist/angular-file-saver.bundle.min.js',
'assets/scripts/lib/sails.io.js' 'assets/scripts/lib/sails.io.js'
]; ];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment