Commit 57b7f0d8 by Fernando Martínez Santiago

Merge branch 'develop' of http://gitlab.ujaen.es/yotta/pictogram into develop

# Conflicts:
#	android/Pictogram/tabletlibrary/build.gradle
#	android/Pictogram/tabletlibrary/src/main/java/com/yottacode/pictogram/tabletlibrary/gui/communicator/PictogramActivity.java
#	android/Pictogram/tabletlibrary/src/main/java/com/yottacode/pictogram/tabletlibrary/gui/login/MainActivity.java
#	android/Pictogram/tabletlibrary/src/main/java/com/yottacode/pictogram/tabletlibrary/net/NetServiceTablet.java
parents 4eca7813 66419d00
Showing with 545 additions and 238 deletions
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yottacode.pictogram.supervisor_tablet">
<!-- The app has the permission to receive the RECEIVE_BOOT_COMPLETED broadcast -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- For kiosk mode -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- For the service that restarts the app when another app go to foreground -->
......@@ -20,6 +19,7 @@
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yottacode.pictogram.tabletlibrary">
<application
android:allowBackup="true"
android:label="@string/app_name"
......
......@@ -402,9 +402,8 @@ public class PictogramActivity extends Activity implements VocabularyTalk.iVocab
@Override
protected void onStop() {
super.onStop();
this.pictoCategoryGridAdapter.allPictosInGrid();
this.pictoMainGridAdapter.allPictosInGrid();
Log.i(LOG_TAG, "Closing app");
Log.i(LOG_TAG, "Closing Pictogram Activity");
PCBcontext.setActivityContext(null);
PCBcontext.getNetService().closeNotifyStatus();
}
......@@ -1042,6 +1041,7 @@ protected void showOnlyTape(boolean onlyTape) {
}
Intent serialActivity = new Intent(getBaseContext(), com.yottacode.pictogram.tabletlibrary.gui.login.SerialActivity.class);
if (lastUserName != null) {
Log.i(this.getClass().getCanonicalName(), "Switch user to " + lastUserName);
serialActivity.putExtra("switch_usr", lastUserName);
......
......@@ -2,6 +2,10 @@ package com.yottacode.pictogram.tabletlibrary.gui.login;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.provider.ContactsContract;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
......@@ -10,6 +14,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.yottacode.pictogram.tabletlibrary.R;
import com.yottacode.pictogram.tools.PCBcontext;
import java.util.Vector;
......@@ -19,6 +24,7 @@ import java.util.Vector;
*/
public class CustomList extends ArrayAdapter<String>{
private boolean color;
private final Activity context;
private final String[] name_surname;
private final Vector<Bitmap> images;
......@@ -34,6 +40,7 @@ public class CustomList extends ArrayAdapter<String>{
this.context = context;
this.name_surname = name_surname;
this.images = images;
this.color = true;
}
/**
......@@ -51,9 +58,27 @@ public class CustomList extends ArrayAdapter<String>{
ImageView imageView = (ImageView) rowView.findViewById(R.id.loginStudentPhoto);
txtTitle.setText(name_surname[position]);
ImageView fondo = (ImageView) rowView.findViewById(R.id.fondo);
//if(color){
// color = false;
// rowView.setBackgroundColor(ContextCompat.getColor(context, R.color.VerdeApp));
// txtTitle.setTextColor(ContextCompat.getColor(context, R.color.BlancoApp));
// fondo.setBackgroundResource(R.drawable.round_design_photo_green);
//}else{
// color = true;
rowView.setBackgroundColor(ContextCompat.getColor(context, R.color.BlancoApp));
txtTitle.setTextColor(ContextCompat.getColor(context, R.color.VerdeApp));
fondo.setBackgroundResource(R.drawable.round_design_photo_white);
//}
//imageView.setImageResource(R.drawable.user);
if (images.size()>0) imageView.setImageBitmap(images.elementAt(position));
else imageView.setImageResource(R.drawable.anonymous_student);
if (images.size()>0){
imageView.setImageBitmap(images.elementAt(position));
}else{
imageView.setImageResource(R.drawable.anonymous_student);
}
return rowView;
}
}
......@@ -42,8 +42,10 @@ public class CustomListLogin extends ArrayAdapter<User>{
ImageView imageView = (ImageView) rowView.findViewById(R.id.photo);
ImageView fondo = (ImageView) rowView.findViewById(R.id.fondoFotoLogin);
try {
Bitmap photo=getItem(position).is_supervisor() ? getItem(position).get_bitmap_sup(getContext()) : getItem(position).get_bitmap_stu(getContext());
fondo.setImageResource(R.drawable.round_design_photo_white);
if (photo!=null) imageView.setImageBitmap(photo);
else imageView.setImageResource(R.drawable.anonymous_student);
} catch (IOException e) {
......
......@@ -25,7 +25,6 @@ public class MainActivity extends Activity {
// For deactivating the lock screen (just before setContentView)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
Intent serialActivity = new Intent(this, com.yottacode.pictogram.tabletlibrary.gui.login.SerialActivity.class);
serialActivity.putExtra("resetPrevUser", false);
startActivity(serialActivity);
......
......@@ -34,28 +34,35 @@ public class NetServiceTablet implements NetService.iNetServiceDevice {
TaskStackBuilder stackBuilder = TaskStackBuilder.create(PCBcontext.getContext());
stackBuilder.addParentStack(PictogramActivity.class);
stackBuilder.addNextIntent(resultIntent);
if (PCBcontext.getContext().getResources().getBoolean(R.bool.NotifyAllwaysVisible)){
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);
}
}
public void notifyStatus(boolean updated) {
String user="";
if (PCBcontext.getPcbdb()!=null) {
if (PCBcontext.getPcbdb()!=null ) {
user=PCBcontext.getPcbdb().getCurrentUser().get_name_stu()+" "+PCBcontext.getPcbdb().getCurrentUser().get_surname_stu();
if (PCBcontext.getPcbdb().getCurrentUser().is_supervisor())
user += " (" + PCBcontext.getPcbdb().getCurrentUser().get_name_sup() + ")";
}
if (updated)
builder.setSmallIcon(R.drawable.application_online)
if (PCBcontext.getActivityContext()!=null) {
if (updated)
builder.setSmallIcon(R.drawable.application_online)
.setContentTitle(PCBcontext.getContext().getResources().getString(R.string.pictogram_online))
.setContentText(user);
else
builder.setSmallIcon(R.drawable.application_offline)
else
builder.setSmallIcon(R.drawable.application_offline)
.setContentTitle(PCBcontext.getContext().getResources().getString(R.string.pictogram_offline))
.setContentText(user);
NotificationManager mNotificationManager =
NotificationManager mNotificationManager =
(NotificationManager) PCBcontext.getContext().getSystemService(PCBcontext.getContext().NOTIFICATION_SERVICE);
mNotificationManager.notify(notifyID, builder.build());
mNotificationManager.notify(notifyID, builder.build());
}
}
public void closeNotifyStatus(){
NotificationManager mNotificationManager =
......@@ -69,7 +76,8 @@ public class NetServiceTablet implements NetService.iNetServiceDevice {
Log.i(LOG_TAG,"App restarting");
Context context=activity.getBaseContext();
Intent serialActivity = new Intent(context, com.yottacode.pictogram.tabletlibrary.gui.login.SerialActivity.class);
Class serialClass;
Intent serialActivity = new Intent(context, com.yottacode.pictogram.tabletlibrary.gui.login.SerialActivity.class);
serialActivity.putExtra("resetPrevUser", false);
serialActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(serialActivity);
......@@ -82,7 +90,7 @@ public class NetServiceTablet implements NetService.iNetServiceDevice {
Context context=PCBcontext.getContext();
Intent serialActivity = new Intent(context, com.yottacode.pictogram.tabletlibrary.gui.login.SerialActivity.class);
Intent serialActivity = new Intent(context, com.yottacode.pictogram.tabletlibrary.gui.login.SerialActivity.class);
serialActivity.putExtra("resetPrevUser", direct_login);
context.startActivity(serialActivity);
......
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- main color -->
<item
android:bottom="2dp"
android:left="2dp"
android:right="2dp">
<shape>
<solid android:color="@color/BlancoApp" />
</shape>
</item>
<item>
<selector >
<item android:state_enabled="true"
android:state_focused="true">
<shape>
<stroke
android:width="2dp"
android:color="@color/VerdeApp"/>
</shape>
</item>
<item android:state_enabled="true">
<shape>
<stroke
android:width="2dp"
android:color="@color/gray"/>
</shape>
</item>
</selector>
</item>
<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="5.0dp">
<shape>
<solid android:color="@color/BlancoApp" />
</shape>
</item>
</layer-list>
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#AfD260"/>
<stroke android:width="3dip" android:color="#EEEEEE" />
<corners android:radius="10dip"/>
<padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
</shape>
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#EEEEEE"/>
<stroke android:width="3dip" android:color="#AFD260" />
<corners android:radius="10dip"/>
<padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
</shape>
......@@ -6,62 +6,64 @@
tools:context="com.yottacode.pictogram.tabletlibrary.gui.login.LoginActivity">
<RelativeLayout
android:id="@+id/loginTopbarLayout"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_margin="8dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="8dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="0dp"
android:id="@+id/loginTopbarLayout">
android:layout_height="70dp"
android:background="@color/VerdeApp"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:id="@+id/loginTopbarSupervisorPhoto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="left"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:background="@color/accent_material_dark"
android:scaleType="centerCrop" />
android:scaleType="centerCrop"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />
<LinearLayout
android:orientation="vertical"
android:id="@+id/loginTopbarSupervisorNameLayout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/loginTopbarSupervisorNameLayout"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/loginTopbarSupervisorPhoto"
android:gravity="center_vertical">
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/loginTopbarSupervisorFullName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text=""
android:id="@+id/loginTopbarSupervisorFullName" />
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/BlancoApp" />
<TextView
android:id="@+id/loginTopbarSupervisorUserName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text=""
android:id="@+id/loginTopbarSupervisorUserName"
android:textColor="@color/abc_secondary_text_material_light" />
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/BlancoApp" />
</LinearLayout>
<Button
style="?android:attr/buttonStyleSmall"
android:id="@+id/loginTopbarLogout"
style="@android:style/TextAppearance.Material.Button"
android:textColor="@color/BlancoApp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/logout"
android:id="@+id/loginTopbarLogout"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:enabled="false" />
android:enabled="false"
android:text="@string/logout" />
</RelativeLayout>
......@@ -77,27 +79,18 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/loginTopbarLayout">
android:layout_below="@+id/loginTopbarLayout"
android:paddingTop="10dp">
<fragment
android:id="@+id/loginStudentGrid"
class="com.yottacode.pictogram.tabletlibrary.gui.login.StudentFragmentGrid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="com.yottacode.pictogram.tabletlibrary.gui.login.StudentFragmentGrid"
android:id="@+id/loginStudentGrid"
android:layout_gravity="center"
android:layout_gravity="top"
tools:layout="@layout/fragment_new_student" />
</FrameLayout>
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/imageView4"
android:background="@drawable/pictogram_logo"
android:layout_marginRight="30dp"
android:layout_below="@+id/view"
android:layout_alignEnd="@+id/loginTopbarLayout"
android:layout_marginTop="320dp" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/loginStudentGridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numColumns="auto_fit"
android:gravity="center_vertical|center|center_horizontal"
android:stackFromBottom="false"
android:padding="32dp"
android:horizontalSpacing="16dp"
android:verticalSpacing="16dp" />
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/loginStudentGridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numColumns="5"
android:stackFromBottom="false" />
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal">
<ImageView
android:id="@+id/loginStudentPhoto"
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_centerHorizontal="true" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="50dp"
android:layout_marginTop="50dp"
android:orientation="vertical">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/fondo"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignBottom="@+id/loginStudentName"
android:layout_centerHorizontal="false"
android:layout_gravity="center"
android:background="@drawable/round_design_photo_green" />
<ImageView
android:id="@+id/loginStudentPhoto"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignWithParentIfMissing="true"
android:layout_centerHorizontal="false"
android:layout_centerVertical="true"
android:layout_gravity="center" />
</FrameLayout>
<TextView
android:id="@+id/loginStudentName"
android:layout_width="128dp"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_below="@+id/loginStudentPhoto"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_centerHorizontal="true"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:gravity="center" />
</RelativeLayout>
\ No newline at end of file
android:layout_gravity="center"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:text="Nombre"
android:layout_height="wrap_content"
android:id="@+id/label_name"
android:layout_weight="0.15"
android:textSize="18sp"
android:textColor="@android:color/black"
android:layout_alignTop="@+id/photo"
android:layout_toEndOf="@+id/photo"
android:layout_width="wrap_content"
android:layout_marginStart="15dp" />
<TextView
android:text="Apellidos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/label_surname"
android:textSize="18sp"
android:textAlignment="textStart"
android:textColor="@android:color/black"
android:layout_alignBottom="@+id/photo"
android:layout_toEndOf="@+id/photo"
android:layout_marginStart="15dp" />
<ImageView
app:srcCompat="@drawable/anonymous_student"
android:id="@+id/photo"
android:layout_weight="0.15"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
android:layout_gravity="center"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:background="@color/BlancoApp"
android:orientation="vertical">
<LinearLayout
android:layout_width="276dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<FrameLayout
android:layout_width="50dp"
android:layout_height="50dp">
<ImageView
android:id="@+id/fondoFotoLogin"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
app:srcCompat="@drawable/round_design_photo_white" />
<ImageView
android:id="@+id/photo"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_gravity="center"
android:layout_weight="1"
app:srcCompat="@drawable/anonymous_student" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="left"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/label_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/photo"
android:layout_marginStart="15dp"
android:layout_toEndOf="@+id/photo"
android:layout_weight="0.15"
android:text="Nombre"
android:textColor="@color/VerdeApp"
android:textSize="18sp" />
<TextView
android:id="@+id/label_surname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/photo"
android:layout_marginStart="15dp"
android:layout_toEndOf="@+id/photo"
android:layout_weight="0.15"
android:text="Apellidos"
android:textAlignment="textStart"
android:textColor="@color/VerdeApp"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
......@@ -14,5 +14,7 @@
<color name="guideline">@color/white_translucent</color>
<color name="corner">@android:color/white</color>
<color name="surrounding_area">@color/black_translucent</color>
<color name="VerdeApp">#6a8e1a</color>
<color name="BlancoApp">#eeeeee</color>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:android="http://schemas.android.com/tools">
<style name="sessionBtn">
<item name="android:layout_height">64dp</item>
<item name="android:layout_width">64dp</item>
......
......@@ -169,6 +169,7 @@ module.exports = function roomsHook (sails) {
*/
disconnect: function(socket) {
var rooms = socketRooms[sails.sockets.getId(socket)];
if(!rooms) return;
for (var i = 0; i < rooms.length; i++)
sails.hooks.rooms.unsubscribeFromRoom(rooms[i].room, socket);
}
......
<html>
<head>
<meta charset="utf-8">
<title>Pictogram Web</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="css/main.css">
<link rel="icon" href="img/logo_pictogram.png" type='image/png'>
</head>
<body>
<div class="header-image">
<div class="row">
<div class="col-md-12 text-center">
<img ng-src="img/logo_pictogram.png" alt="Pictogram" title="Pictogram" src="img/logo_pictogram.png">
</div>
</div>
</div>
<div id="es">
<div class="container vertical-center">
<div class="row">
<div class="col-md-12 text-center">
<br>
<h1>Navegador no compatible con Pictogram <i class="fa fa-frown-o" aria-hidden="true"></i></h1>
<br>
<h4>Le recomendamos utilizar la última versión de <a href="https://www.google.com/chrome/" target="_blank">Google Chrome</a> o <a href="https://www.mozilla.org/firefox/new/" target="_blank">Mozilla Firefox</a>.</h4>
</div>
</div>
</div>
<div class="languages">
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="languages-margin text-muted text-center">Si los problemas persisten, contacte con <a href="mailto:soporte@yottacode.com" translate="" class="ng-scope">atención al cliente</a>.</div>
</div>
</div>
</div>
</div>
</div>
<div id="en">
<div class="container vertical-center">
<div class="row">
<div class="col-md-12 text-center">
<br>
<h1>Browser not compatible with Pictogram <i class="fa fa-frown-o" aria-hidden="true"></i></h1>
<br>
<h4>We recommend using the latest version of <a href="https://www.google.com/chrome/" target="_blank">Google Chrome</a> or <a href="https://www.mozilla.org/firefox/new/" target="_blank">Mozilla Firefox</a>.</h4>
</div>
</div>
</div>
<div class="languages">
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="languages-margin text-muted text-center">If problems persist, contact with <a href="mailto:soporte@yottacode.com" translate="" class="ng-scope">customer support</a>.</div>
</div>
</div>
</div>
</div>
</div>
<script>
/* SIMPLY DOCUMENT TRANSLATION */
// Browser default language
var lang = (navigator.language || navigator.userLanguage).split("-")[0];
// If language not available, set english as default
if(lang != "en" && lang != "es"){
lang = "en";
}
// Show div acording to language
document.getElementById('en').style.display = (lang=='en')? 'inline' : 'none';
document.getElementById('es').style.display = (lang=='es')? 'inline' : 'none';
</script>
</body>
</html>
......@@ -33,6 +33,8 @@
"attributes_updated": "Changes saved",
"attributes_updating": "Saving...",
"August": "August",
"average_time_between_pictos": "Average time between pictograms",
"average_time_per_try": "Average time per try",
"background": "Background",
"beep": "Beep",
"birthdate": "Birthdate",
......@@ -120,6 +122,7 @@
"error_on_update": "Error on update",
"error_loading_pictos": "Error loading pictos information",
"error_general": "An error has been produced",
"error_rate": "Error rate",
"expand_navigation": "Expand navigation",
"expand_navigation": "Expand navigation",
"expression": "Expression",
......@@ -235,6 +238,7 @@
"office_updated": "Office updated",
"offices": "Offices",
"options": "Options",
"or": "or",
"own_instructions": "Own method templates",
"own_labels": "Your labels",
"own_pictos": "Your pictograms",
......@@ -397,6 +401,8 @@
"vibration": "Vibration",
"view": "View",
"voice": "Voice",
"warning": "Warning",
"warning_browser_incompatible": "Your browser may not be compatible with Pictogram Web. We recommend using the latest version of",
"warning_last_session_bad": "Last session was interrupted. Please, you must evaluate last tries and press 'close seesion' button",
"warning_no_pictos_found": "No pictograms found with specified keyword",
"warning_no_tablet_online":"No Pictogran Tablet online detected",
......
......@@ -33,6 +33,8 @@
"attributes_updated": "Cambios guardados",
"attributes_updating": "Guardando...",
"August": "Agosto",
"average_time_between_pictos": "Tiempo medio entre pictogramas",
"average_time_per_try": "Tiempo medio por intento",
"background": "Fondo",
"beep": "Pitido",
"birthdate": "Fecha de nacimiento",
......@@ -123,6 +125,7 @@
"error_on_upload": "Error al subir la imagen. Compruebe que el archivo no supera 1MB de tamaño.",
"error_loading_pictos": "Error cargando información de los pictos",
"error_general": "Se ha producido un error",
"error_rate": "Tasa de error",
"February": "Febrero",
"feedback_picto": "Efecto de selección",
"filter": "Filtrar",
......@@ -235,6 +238,7 @@
"office_updated": "Gabinete actualizado",
"offices": "Gabinetes",
"options": "Opciones",
"or": "o",
"own_instructions": "Plantillas de métodos propias",
"own_labels": "Etiquetas propias",
"own_pictos": "Pictogramas propios",
......@@ -397,6 +401,8 @@
"vibration": "Vibración",
"view": "Vista",
"voice": "Voz",
"warning": "Advertencia",
"warning_browser_incompatible": "Su navegador podría ser incompatible con Pictogram Web. Le recomendamos utilizar la última versión de",
"warning_last_session_bad": "La última sesión no se cerró correctamente. Por favor, evalúe los ensayos y pulse 'cerrar sesión' ",
"warning_no_pictos_found": "No se encontraron pictogramas con las palabras introducidas",
"warning_no_tablet_online":"No se detectó ningún usuario de Pictogram Tablet online",
......
// Return client browser. ex: $scope.clientBrowser == [ "Firefox", "51"]
var clientBrowser = (function(){
var ua= navigator.userAgent, tem,
M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if(/trident/i.test(M[1])){
tem= /\brv[ :]+(\d+)/g.exec(ua) || [];
return 'IE '+(tem[1] || '');
}
if(M[1]=== 'Chrome'){
tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
if(tem!= null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
}
M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
return M.join(' ');
})().split(" ");
// Return if client browser valid or not
var validBrowser = false;
//Browser filter
if(clientBrowser[0] == "Firefox" && parseInt(clientBrowser[1]) >= 35 )
validBrowser = true;
if(clientBrowser[0] == "Chrome" && parseInt(clientBrowser[1]) >= 45 )
validBrowser = true;
if(clientBrowser[0] == "Opera" && parseInt(clientBrowser[1]) >= 35 )
validBrowser = true;
if(clientBrowser[0] == "Edge" )
validBrowser = true;
// Redirect to view
if(!validBrowser) window.location = "browserNotCompatible.html";
<!-- Office image -->
<div class="row">
<div class="col-md-12 text-center">
<!-- Logo Pictogram
......@@ -11,56 +12,67 @@
</p>
</div>
</div>
<div class="row">
<!--/. Office image -->
<!-- Rejilla 3 elementos de igual ancho -->
<div class="col-md-2">&nbsp;</div>
<div class="col-md-4">
<div id="login">
<!-- Formulario -->
<!-- LoginCtrl controls here, see app.js -->
<form name="loginForm" ng-submit="login()" novalidate>
<!-- Main row -->
<div class="row">
<div class="form-group">
<label translate>email</label>:
<input type="email" class="form-control" id="login_email" placeholder="{{ 'your_email' | translate}}" required ng-model="credentials.email" />
</div>
<div class="form-group">
<label translate>password</label>:
<input type="password" class="form-control" id="login_password" placeholder="{{ 'your_password' | translate}}" required ng-model="credentials.password" />
<!-- Form column and offset -->
<div class="col-md-4 col-md-offset-2">
<div id="login">
<!-- Formulario -->
<!-- LoginCtrl controls here, see app.js -->
<form name="loginForm" ng-submit="login()" novalidate>
<!-- Email -->
<div class="form-group">
<label translate>email</label>:
<input type="email" class="form-control" id="login_email" placeholder="{{ 'your_email' | translate}}" required ng-model="credentials.email" />
</div>
<!-- Password -->
<div class="form-group">
<label translate>password</label>:
<input type="password" class="form-control" id="login_password" placeholder="{{ 'your_password' | translate}}" required ng-model="credentials.password" />
</div>
<!-- Remember -->
<div class="checkbox">
<label>
<input type="checkbox" id="login_savepassword" ng-model="credentials.savepassword" />{{ 'remember' | translate }}
</label>
</div>
<div class="row">
<div class="col-md-12">
<!-- Login -->
<div class="pull-left">
<button type="submit" class="btn btn-primary" translate>login</button>
</div>
<div class="checkbox">
<label>
<input type="checkbox" id="login_savepassword" ng-model="credentials.savepassword" />{{ 'remember' | translate }}
</label>
<!-- Spinner -->
<div class="pull-left">
<i ng-class="{'fa fa-spinner fa-spin fa-2x fa-fw margin-bottom': true, 'spin_disabled': !submitted}"></i>
</div>
<div class="row">
<div class="col-md-12">
<div class="pull-left">
<button type="submit" class="btn btn-primary" translate>login</button>
</div>
<div class="pull-left">
<i ng-class="{'fa fa-spinner fa-spin fa-2x fa-fw margin-bottom': true, 'spin_disabled': !submitted}"></i>
</div>
<div class="pull-right margin-top7">
<a href="/app/#/signin" translate>create_an_account</a>
</div>
</div>
</div>
<div class="text-center margin-top15">
<br/>
<a href="/app/#/changepass" translate>password_forgotten</a>
<!-- Create account -->
<div class="pull-right margin-top7">
<a href="/app/#/signin" translate>create_an_account</a>
</div>
</form>
</div>
</div>
<!-- Fin login -->
</div>
<div class="col-md-4">
<img src="img/login.png" alt="Pictogram" title="Pictogram" />
</div>
<div class="col-md-2">&nbsp;</div>
<!-- Remember password -->
<div class="text-center margin-top15">
<br>
<a href="/app/#/changepass" translate>password_forgotten</a>
</div>
</form>
</div>
<!-- Fin de row -->
<!--/. login -->
</div>
<!--/. form column -->
<!-- Image column -->
<div class="col-md-4">
<img src="img/login.png" alt="Pictogram" title="Pictogram" />
</div>
<!--/. image column -->
</div>
<!--/. main row -->
<footer-translate></footer-translate>
<footer-translate></footer-translate>
This diff could not be displayed because it is too large.
<!-- Reports tab-->
<div class="panel panel-default student_tab_panel">
<div class="panel-body">
<div class="row">
<div class="col-md-4">
<h1>{{'methods' | translate}}</h1>
</div>
</div>
<div class="row">
<div class="col-lg-4 bg-light-gray">
<h1 class="text-center">{{'global' | translate}}</h1>
<hr>
<div class="col-md-3">
<div class="form-group">
<p class="input-group">
<select class="form-control" name="method_select" id="method_select" ng-model="selected_method">
<option value="-1" selected>{{'select_method' | translate}}</option>
<option ng-repeat="elem in elems track by $index" class="{{elem.class}}" value="{{elem}}">{{elem.name}}</option>
</select>
</p>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<p class="input-group">
<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">
<button type="button" class="btn btn-default" ng-click="openCalendar($event,1)"><i class="glyphicon glyphicon-calendar"></i></button>
</span>
</p>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<p class="input-group">
<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">
<button type="button" class="btn btn-default" ng-click="openCalendar($event,2)"><i class="glyphicon glyphicon-calendar"></i></button>
</span>
</p>
</div>
<table class="table table-bordered">
<tbody>
<tr>
<td>{{'sessions' | translate}}</td>
<td>{{ ws_number }}</td>
</tr>
<tr>
<td>{{'time_sessions_total' | translate}}</td>
<td>{{ ws_time }}</td>
</tr>
<tr>
<td>{{'tries_done' | translate}}</td>
<td>{{ tries_number }}</td>
</tr>
<tr>
<td>{{'time_tries_total' | translate}}</td>
<td>{{ tries_time }}</td>
</tr>
</tbody>
</table>
<hr>
<canvas id="bar1" class="chart chart-bar" chart-data="dataChart1" chart-labels="labels1" chart-series="series1"></canvas>
<h3>{{ dataChart1 }} {{ labels1 }}</h3>
</div>
<div class="col-md-3">
<div class="form-group">
<p class="input-group">
<button type="button" class="btn btn-default" ng-click="filter()">{{'filter' | translate}}</i></button>
</p>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-lg-4 bg-light-gray">
<h1 class="text-center"><small>{{'error_rate' | translate}}</small></h1>
<hr>
<canvas id="bar1" class="chart chart-line" chart-options="optionsChartTime" chart-data="dataChart1" chart-labels="labels1" chart-series="series1"></canvas>
</div>
<div class="col-lg-4">
<h1 class="text-center">{{'annual' | translate}} <small>{{ year }}</small></h1>
<h1 class="text-center"><small>{{'average_time_per_try' | translate}}</small></h1>
<hr>
<table class="table table-bordered">
<tbody>
<tr>
<td>{{'sessions' | translate}}</td>
<td>{{ ws_number_year }}</td>
</tr>
<tr>
<td>{{'time_sessions_total' | translate}}</td>
<td>{{ ws_time_year }}</td>
</tr>
<tr>
<td>{{'tries_done' | translate}}</td>
<td>{{ tries_number_year }}</td>
</tr>
<tr>
<td>{{'time_tries_total' | translate}}</td>
<td>{{ tries_time_year }}</td>
</tr>
</tbody>
</table>
<hr>
<canvas id="bar2" class="chart chart-bar" chart-data="dataChart2" chart-labels="labels2" chart-series="series2"></canvas>
<canvas id="bar2" class="chart chart-line" chart-options="optionsChartTime" chart-data="dataChart2" chart-labels="labels2" chart-series="series2"></canvas>
</div>
<div class="col-lg-4 bg-light-gray">
<h1 class="text-center">{{'monthly' | translate}} <small>{{ month }}</small></h1>
<h1 class="text-center"><small>{{'average_time_between_pictos' | translate}}</small></h1>
<hr>
<canvas id="bar3" class="chart chart-line" chart-options="optionsChartTime" chart-data="dataChart3" chart-labels="labels3" chart-series="series3"></canvas>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<table class="table table-bordered">
<tbody>
<tr>
<td>{{'sessions' | translate}}</td>
<td>{{ ws_number_month }}</td>
<td>&nbsp;</td>
<td>{{ 'total' | translate }}</td>
<td>{{ 'success' | translate }}</td>
<td>{{ 'supervised_success' | translate }}</td>
<td>{{ 'spontaneous_success' | translate }}</td>
<td>{{ 'fail' | translate }}</td>
<td>{{ 'discarded' | translate }}</td>
<td>{{ 'model' | translate }}</td>
<td>{{ 'broken' | translate }}</td>
</tr>
<tr>
<td>{{'time_sessions_total' | translate}}</td>
<td>{{ ws_time_month }}</td>
</tr>
<tr>
<td>{{'tries_done' | translate}}</td>
<td>{{ tries_number_month }}</td>
</tr>
<tr>
<td>{{'time_tries_total' | translate}}</td>
<td>{{ tries_time_month }}</td>
<td>{{ 'tries' | translate }}</td>
<td>{{ tries_count.total }}</td>
<td>{{ tries_count.success }}</td>
<td>{{ tries_count.supervised_success }}</td>
<td>{{ tries_count.spontaneous_success }}</td>
<td>{{ tries_count.fail }}</td>
<td>{{ tries_count.discarded }}</td>
<td>{{ tries_count.model }}</td>
<td>{{ tries_count.broken }}</td>
</tr>
</tbody>
</table>
<hr>
<canvas id="bar3" class="chart chart-bar" chart-data="dataChart3" chart-labels="labels3" chart-series="series3"></canvas>
</div>
</div>
......
......@@ -1020,3 +1020,14 @@ form .progress {
width: 0;
height: 0;
}
.method-opt{
font-weight: 600;
}
.header-image {
width: 100%;
background-color: #f8f8f8;
padding-top: 20px;
padding-bottom: 20px;
border-bottom: 1px solid #e7e7e7;
}
......@@ -5,7 +5,7 @@ var ASSETS_PATH = path.join(__dirname, '..', 'assets');
var UPLOAD_PATH = path.join(__dirname, '..', '..', 'upload');
module.exports.pictogram = {
version: "1.0", // actual version of the server, to be checked by the client
version: "1.1", // actual version of the server, to be checked by the client
admin: {
email: 'amontejo@ujaen.es',
password: '$2a$06$flEEOc15SerMeYWARrN9w.KSpJuM.jDsaTgrtD0ESzbxKHPl0f/zq' //y00ttaa!!
......
......@@ -468,7 +468,7 @@ function sqlTypeCast(attr) {
break;
case 'datetime':
expandedType = 'DATETIME';
expandedType = 'DATETIME(3)';
break;
case 'time':
......@@ -499,7 +499,8 @@ function toSqlDate(date) {
('00' + date.getDate()).slice(-2) + ' ' +
('00' + date.getHours()).slice(-2) + ':' +
('00' + date.getMinutes()).slice(-2) + ':' +
('00' + date.getSeconds()).slice(-2);
('00' + date.getSeconds()).slice(-2) + '.' +
('00' + date.getMilliseconds()).slice(-3);
return date;
}
......
......@@ -242,7 +242,8 @@ utils.toSqlDate = function toSqlDate(date) {
('00' + date.getDate()).slice(-2) + ' ' +
('00' + date.getHours()).slice(-2) + ':' +
('00' + date.getMinutes()).slice(-2) + ':' +
('00' + date.getSeconds()).slice(-2);
('00' + date.getSeconds()).slice(-2) + "." +
('00' + date.getMilliseconds()).slice(-3);
return date;
};
......@@ -3,6 +3,7 @@ module.exports = function (grunt) {
var jsLibs = [
// JQuery is added because ng-file-upload produces errors if not
'assets/app/bower_components/jquery/dist/jquery.min.js',
'assets/scripts/check_browser.js',
'assets/app/bower_components/angular/angular.js',
'assets/app/bower_components/angular-bootstrap/ui-bootstrap.min.js',
'assets/app/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.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