solved several bugs when updating supervisor data

parent 273202b5
......@@ -65,14 +65,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
......@@ -81,6 +73,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
......@@ -125,8 +125,8 @@
<orderEntry type="library" exported="" name="androidasync-2.1.8" level="project" />
<orderEntry type="library" exported="" name="play-services-ads-9.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="junit-4.12" level="project" />
<orderEntry type="library" exported="" name="ion-2.1.8" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="json-20090211" level="project" />
<orderEntry type="library" exported="" name="ion-2.1.8" level="project" />
<orderEntry type="library" exported="" name="play-services-ads-lite-9.2.1" level="project" />
</component>
</module>
\ No newline at end of file
......@@ -42,6 +42,12 @@
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavorDebug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavorDebug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavorDebug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/assets" type="java-test-resource" />
......@@ -50,12 +56,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDefaultFlavorDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/DefaultFlavor/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/DefaultFlavor/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavor/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavor/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/DefaultFlavor/assets" type="java-resource" />
......@@ -123,6 +123,8 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/24.1.1/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.1.1/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/23.0.1/jars" />
......@@ -142,12 +144,18 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.gms/play-services-wearable/9.2.1/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.google.android.support/wearable/2.0.0-alpha2/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 24 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
......
......@@ -936,7 +936,7 @@ module.exports = {
Student.findOne({ id: req.body.id }).then(function (student) {
if (!student) {
throw new Error();
throw new Error("Student not found");
}
newAvatarFileName = sails.config.pictogram.paths.getStudentAvatarFileName(student.id);
......@@ -946,7 +946,7 @@ module.exports = {
saveAs: newAvatarFileName
}, function whenDone(error, uploadedFiles) {
if (error || (uploadedFiles.length === 0)) {
throw new Error();
throw new Error("upload failed");
}
try {
......@@ -964,12 +964,12 @@ module.exports = {
});
} catch (updateAvatarError) {
fs.unlinkSync(newAvatarFileDescriptor);
res.serverError();
res.serverError("Error when updating profile image in server");
}
});
})
.catch(function () {
res.badRequest();
.catch(function (err) {
res.badRequest("Could not find supervisor: " + err);
});
},
......
......@@ -480,40 +480,44 @@ module.exports = {
Supervisor.findOne({ id: req.body.id }).then(function (supervisor) {
if (!supervisor) {
throw new Error();
throw new Error("Supervisor not found");
}
newAvatarFileName = sails.config.pictogram.paths.getSupervisorAvatarFileName(supervisor.id);
sails.log.debug("Saving file to " + newAvatarDirectory + "/" + newAvatarFileName);
req.file('file').upload({
maxBytes: 1000000,
dirname: newAvatarDirectory,
saveAs: newAvatarFileName
}, function whenDone(error, uploadedFiles) {
if (error || (uploadedFiles.length === 0)) {
throw new Error();
throw new Error("upload failed");
}
try {
newAvatarFileDescriptor = uploadedFiles[0].fd;
if (supervisor.pic !== sails.config.pictogram.paths.defaultAvatarFileName) {
sails.log.debug("removing old profile image");
fs.unlinkSync(path.join(newAvatarDirectory, supervisor.pic));
}
supervisor.pic = newAvatarFileName;
delete supervisor.password;
sails.log.debug("saving supervisor data " + JSON.stringify(supervisor));
supervisor.save(function (updateSupervisorError) {
if (updateSupervisorError) {
throw updateSupervisorError;
}
res.ok();
return res.ok({file: {name: supervisor.pic}});
});
} catch (updateAvatarError) {
fs.unlinkSync(newAvatarFileDescriptor);
res.serverError();
return res.serverError("Error when updating profile image in server: " + updateAvatarError);
}
});
})
.catch(function () {
res.badRequest();
.catch(function (err) {
});
},
......
......@@ -151,7 +151,7 @@ module.exports = {
function (cb) {
var bcrypt = require('bcrypt-nodejs');
if (attrs.password) {
if (attrs.password && attrs.password.length > 0) {
attrs.password = bcrypt.hashSync(attrs.password, bcrypt.genSaltSync());
}
cb();
......@@ -191,7 +191,7 @@ module.exports = {
function (cb) {
var bcrypt = require('bcrypt-nodejs');
if (attrs.password) {
if (attrs.password && attrs.password.length > 0) {
attrs.password = bcrypt.hashSync(attrs.password, bcrypt.genSaltSync());
}
cb();
......
......@@ -136,8 +136,8 @@
"mark": "Mark",
"max_licenses_reached": "Maximum number of licenses reached by the office",
"May": "May",
"method_name_duplicated": "template already exists.Please, change the name",
"method_save": "Method saved as a new template",
"method_name_duplicated": "Template '{{method_name}}' already exists",
"method_save": "'{{method_name}}' saved as a new template",
"methods": "Methods",
"minutes": "minutes",
"month_totals": "Month totals",
......@@ -174,6 +174,7 @@
"password_confirm": "Repeat password",
"password_match": "The passwords must match",
"password_new_type": "Type the new password",
"password_short": "Password must have {{minlength}} characters length at least",
"password_type": "Password",
"pause_session": "Pause session",
"personal_data": "Personal data",
......
......@@ -136,8 +136,8 @@
"mark": "Marcar",
"max_licenses_reached": "Número de licencias máximo alcanzado por la oficina",
"May": "Mayo",
"method_name_duplicated": "plantilla ya existe. Por favor, cambie el nombre",
"method_save": "Método guardado como nueva plantilla",
"method_name_duplicated": "La plantilla '{{method_name}}' ya existe",
"method_save": "'{{method_name}}' guardado como nueva plantilla",
"methods": "Métodos",
"minutes": "minutos",
"month_totals": "Totales mes",
......@@ -175,6 +175,7 @@
"password_match": "Las contraseñas deben coincidir",
"password_new_type": "Escriba la nueva contraseña",
"password_type": "Escriba la contraseña",
"password_short": "La contraseña es muy corta, debe tener al menos una longitud de {{minlength}} caracteres",
"pause_session": "Pausar sesión",
"personal_data": "Datos personales",
"personal_data": "Datos personales",
......
......@@ -20,6 +20,13 @@ var dashboardApp = angular.module('dashboardApp', [
'ngLodash'
]);
/* Main constants */
dashboardApp.constant('CONSTANTS', {
appName: 'Pictogram Dashboard',
appVersion: 0.1,
password_minlength: 8
});
/* Toast (notification) configuration */
dashboardApp.config(['ngToastProvider', function (ngToast) {
ngToast.configure({
......
......@@ -11,6 +11,7 @@ function SignInCtrl($scope,
reCAPTCHA,
$translate,
config,
CONSTANTS,
ngToast) {
$scope.formdata = {
name: '',
......@@ -31,17 +32,18 @@ function SignInCtrl($scope,
$scope.signin = function () {
// Validate email match
if ($scope.formdata.email !== $scope.formdata.email_confirm) {
$translate('email_match').then(function (translation) {
ngToast.danger({ content: translation });
});
ngToast.danger({ content: $translate.instant('email_match') });
return;
}
// Validate password match
if ($scope.formdata.password !== $scope.formdata.password_confirm) {
$translate('password_match').then(function (translation) {
ngToast.danger({ content: translation });
});
ngToast.danger({ content: $translate.instant('password_match') });
return;
}
if ($scope.formdata.password.length < CONSTANTS.password_minlength) {
ngToast.danger({ content: $translate.instant('password_short', {minlength: CONSTANTS.password_minlength}) });
return;
}
......@@ -55,14 +57,10 @@ function SignInCtrl($scope,
$http
.post(config.backend + '/sup', $scope.formdata)
.success(function () {
$translate('user_created').then(function (translation) {
ngToast.success({ content: translation });
});
ngToast.success({ content: $translate.instant('user_created') });
})
.error(function () {
$translate('user_exists', {email: $scope.formdata.email}).then(function (translation) {
ngToast.danger({ content: translation });
});
ngToast.danger({ content: $translate.instant('user_exists', {email: $scope.formdata.email}) });
});
};
});
......@@ -121,7 +121,7 @@ dashboardControllers.controller('StudentInstructionsCtrl', function StudentInstr
.success(function(data, status, headers, config) {
console.log('Delete Method Template and its Instructions');
$translate('template_deleted').then(t => {ngToast.success({content: t})});
ngToast.success({content: $translate.instant('template_deleted')});
// Delete in select
for(var i=0; i<$scope.methods_available.length; i++) {
......@@ -171,26 +171,18 @@ dashboardControllers.controller('StudentInstructionsCtrl', function StudentInstr
// Add to select method
$scope.methods_available.push({ id: method.id, name: method.name });
// creating a toast using "success", "info", "warning" or "danger" shortcut methods:
var myToastMsg = $translate('method_save').then(function (translation) {
// Show message
ngToast.success({
content: method.name+':'+translation,
content: $translate.instant('method_saved', {method_name: method.name}),
timeout: 6000 // By default 4000
});
});
}
,function(data, status, headers, config) { //error
console.log("Error from API: " + data.error+"("+data.status+")");
var myToastMsg = $translate('method_name_duplicated').then(function (translation) {
// Show message
ngToast.success({
content: method.name+':'+translation,
content: $translate.instant('method_name_duplicated', {method_name: method.name}),
timeout: 6000 // By default 4000
});
});
}
);
};
......@@ -216,16 +208,13 @@ dashboardControllers.controller('StudentInstructionsCtrl', function StudentInstr
})
.error(function(data, status, headers, config) {
console.log("Error from API: " + data.error);
var myToastMsg = $translate('cannot_delete_method').then(function (translation) {
// Show message
ngToast.warning({
content: translation,
content: $translate.instant('cannot_delete_method'),
timeout: 6000 // By default 4000
});
});
});
});
});
};
// Add instruction
......@@ -291,14 +280,12 @@ dashboardControllers.controller('StudentInstructionsCtrl', function StudentInstr
})
.error(function(data, status, headers, config) {
console.log("Error from API: " + data.error);
var myToastMsg = $translate('cannot_delete_instruction').then(function (translation) {
// Show message
ngToast.warning({
content: translation,
content: $translate.instant('cannot_delete_instruction'),
timeout: 6000 // By default 4000
});
});
});
};
// Modal window to open instruction details
......
......@@ -44,19 +44,17 @@ dashboardControllers.controller('StudentSetupCtrl', function StudentSetupCtrl(
folder: 'students',
id: $scope.studentData.id
},
file: file,
}).progress(function () {
file: file
})
.progress(function () {
// TODO show progress to user
}).success(function (data) {
$translate('student_updated').then(function (translation) {
ngToast.success({ content: translation });
});
$scope.studentData.pic = '/upload/students/' + data.file.name;
})
.success(function (data) {
ngToast.success({ content: $translate.instant('student_updated') });
$scope.studentData.pic = '/upload/studentAvatar/' + data.file.name;
});
} else {
$translate('error_only_support_images').then(function (translation) {
ngToast.danger({ content: translation });
});
ngToast.danger({ content: $translate.instant('error_only_support_images') });
}
}
};
......
......@@ -13,7 +13,8 @@ dashboardControllers.controller('SetupCtrl', function SetupCtrl(
$location,
$upload,
ngToast,
config) {
config,
CONSTANTS) {
var user;
// Don't show the message at the begining
......@@ -32,6 +33,8 @@ dashboardControllers.controller('SetupCtrl', function SetupCtrl(
for (i = 0; i < $files.length; i++) {
file = $files[i]; // { name, size, type }
// Check accepted file types
if (file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif') {
extension = file.name.split('.').pop();
filename = user.id + file.name;
......@@ -51,15 +54,15 @@ dashboardControllers.controller('SetupCtrl', function SetupCtrl(
// TODO show file upload progress to user
})
.success(function (data) {
// TODO show success ngToast
$scope.user.pic = '/upload/supervisors/' + data.file.name;
$scope.user.pic = '/upload/supervisorAvatar/' + data.file.name;
user.pic = $scope.user.pic;
$window.sessionStorage.user = JSON.stringify(user);
})
.error(function (err) {
console.log("ERROR while uploading image: " + err);
});
} else {
$translate('error_only_support_images').then(function (translation) {
ngToast.error({ content: translation });
});
ngToast.danger({ content: $translate.instant('error_only_support_images') });
}
}
};
......@@ -69,21 +72,25 @@ dashboardControllers.controller('SetupCtrl', function SetupCtrl(
var supervisor;
var actualEmail;
if ($scope.formdata.password !== $scope.formdata.password_confirm) {
$translate('password_match').then(function (translation) {
ngToast.danger({ content: translation });
});
if ($scope.formdata.password && $scope.formdata.password !== $scope.formdata.password_confirm) {
ngToast.danger({ content: $translate.instant('password_match') });
return;
}
if ($scope.formdata.password && $scope.formdata.password.length < CONSTANTS.password_minlength) {
ngToast.danger({ content: $translate.instant('password_short', {minlength: CONSTANTS.password_minlength}) });
return;
}
if (!$scope.setupForm.$valid) {
$translate('invalid_fields').then(function (translation) {
ngToast.danger({ content: translation });
});
ngToast.danger({ content: $translate.instant('invalid_fields') });
return;
}
supervisor = $scope.formdata;
if (supervisor.password && supervisor.password.length == 0)
delete supervisor.password;
actualEmail = JSON.parse($window.sessionStorage.user).email;
// Comprobation for new email
......@@ -92,11 +99,12 @@ dashboardControllers.controller('SetupCtrl', function SetupCtrl(
delete supervisor.email;
}
// image is updated when uploading a file, not here
delete supervisor.pic;
$http.put(config.backend + '/sup/' + supervisor.id, supervisor)
.success(function (data) {
$translate('data_saved').then(function (translation) {
ngToast.success({ content: translation });
});
ngToast.success({ content: $translate.instant('data_saved') });
// Modify the name in the header
$scope.name = data.name + ' ' + data.surname;
......@@ -113,12 +121,11 @@ dashboardControllers.controller('SetupCtrl', function SetupCtrl(
delete user.password;
delete user.password_confirm;
$window.sessionStorage.user = JSON.stringify(user);
})
.error(function () {
$translate('data_no_saved').then(function (translation) {
ngToast.danger({ content: translation });
});
ngToast.danger({ content: $translate.instant('data_no_saved') });
});
};
});
......@@ -12,6 +12,8 @@ module.exports.pictogram = {
serialSize: 10, // number of characters in generated serial numbers
pageLimit: 10, // number of elements per "page"
password_minlength: 8, // minimal size for the password string
urls: {
/**
* Gets the public url of a supervisor avatar
......
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