2018-10-25 16:50:16 +02:00
|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
*/
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
'use strict';
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
Application.Controllers.controller("CompleteProfileController", ["$scope", "$rootScope", "$state", "$window", "_t", "growl", "CSRF", "Auth", "Member", "settingsPromise", "activeProviderPromise", "groupsPromise", "cguFile", "memberPromise", "Session", "dialogs", "AuthProvider"
|
|
|
|
, function($scope, $rootScope, $state, $window, _t, growl, CSRF, Auth, Member, settingsPromise, activeProviderPromise, groupsPromise, cguFile, memberPromise, Session, dialogs, AuthProvider) {
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
/* PUBLIC SCOPE */
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# API URL where the form will be posted
|
|
|
|
$scope.actionUrl = `/api/members/${memberPromise.id}`;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# Form action on the above URL
|
|
|
|
$scope.method = 'patch';
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# genre of the application name (eg. "_le_ Fablab" or "_la_ Fabrique")
|
|
|
|
$scope.nameGenre = settingsPromise.name_genre;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# name of the current fablab application (eg. "Fablab de la Casemate")
|
|
|
|
$scope.fablabName = settingsPromise.fablab_name;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# information from the current SSO provider
|
|
|
|
$scope.activeProvider = activeProviderPromise;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# list of user's groups (student/standard/...)
|
|
|
|
$scope.groups = groupsPromise;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# current user, contains information retrieved from the SSO
|
|
|
|
$scope.user = memberPromise;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# disallow the user to change his password as he connect from SSO
|
|
|
|
$scope.preventPassword = true;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# mapping of fields to disable
|
|
|
|
$scope.preventField = {};
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# CGU
|
|
|
|
$scope.cgu = cguFile.custom_asset;
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# Angular-Bootstrap datepicker configuration for birthday
|
|
|
|
$scope.datePicker = {
|
|
|
|
format: Fablab.uibDateFormat,
|
|
|
|
opened: false, // default: datePicker is not shown
|
|
|
|
options: {
|
2016-03-23 18:39:41 +01:00
|
|
|
startingDay: Fablab.weekStartingDay
|
2018-10-25 16:50:16 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// Callback to diplay the datepicker as a dropdown when clicking on the input field
|
|
|
|
// @param $event {Object} jQuery event object
|
|
|
|
//#
|
|
|
|
$scope.openDatePicker = function($event) {
|
|
|
|
$event.preventDefault();
|
|
|
|
$event.stopPropagation();
|
|
|
|
return $scope.datePicker.opened = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// For use with ngUpload (https://github.com/twilson63/ngUpload).
|
|
|
|
// Intended to be the callback when the upload is done: any raised error will be stacked in the
|
|
|
|
// $scope.alerts array. If everything goes fine, the user's profile is updated and the user is
|
|
|
|
// redirected to the home page
|
|
|
|
// @param content {Object} JSON - The upload's result
|
|
|
|
//#
|
|
|
|
$scope.submited = function(content) {
|
|
|
|
if ((content.id == null)) {
|
|
|
|
$scope.alerts = [];
|
|
|
|
return angular.forEach(content, (v, k)=>
|
|
|
|
angular.forEach(v, err=>
|
|
|
|
$scope.alerts.push({
|
2016-03-23 18:39:41 +01:00
|
|
|
msg: k+': '+err,
|
|
|
|
type: 'danger'
|
2018-10-25 16:50:16 +02:00
|
|
|
})
|
|
|
|
)
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
$scope.user.profile.user_avatar = content.profile.user_avatar;
|
|
|
|
Auth._currentUser.profile.user_avatar = content.profile.user_avatar;
|
|
|
|
$scope.user.name = content.name;
|
|
|
|
Auth._currentUser.name = content.name;
|
|
|
|
$scope.user = content;
|
|
|
|
Auth._currentUser = content;
|
|
|
|
$rootScope.currentUser = content;
|
|
|
|
return $state.go('app.public.home');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// For use with 'ng-class', returns the CSS class name for the uploads previews.
|
|
|
|
// The preview may show a placeholder or the content of the file depending on the upload state.
|
|
|
|
// @param v {*} any attribute, will be tested for truthiness (see JS evaluation rules)
|
|
|
|
//#
|
|
|
|
$scope.fileinputClass = function(v){
|
|
|
|
if (v) {
|
|
|
|
return 'fileinput-exists';
|
|
|
|
} else {
|
|
|
|
return 'fileinput-new';
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// Merge the current user into the account with the given auth_token
|
|
|
|
//#
|
|
|
|
$scope.registerAuthToken = () =>
|
|
|
|
Member.merge({id: $rootScope.currentUser.id}, {user: {auth_token: $scope.user.auth_token}}, function(user) {
|
|
|
|
$scope.user = user;
|
|
|
|
Auth._currentUser = user;
|
|
|
|
$rootScope.currentUser = user;
|
|
|
|
return $state.go('app.public.home');
|
|
|
|
}
|
|
|
|
, function(err) {
|
|
|
|
if (err.data.error) {
|
|
|
|
return growl.error(err.data.error);
|
|
|
|
} else {
|
|
|
|
growl.error(_t('an_unexpected_error_occurred_check_your_authentication_code'));
|
|
|
|
return console.error(err);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// Return the email given by the SSO provider, parsed if needed
|
|
|
|
// @return {String} E-mail of the current user
|
|
|
|
//#
|
|
|
|
$scope.ssoEmail = function() {
|
|
|
|
const { email } = memberPromise;
|
|
|
|
if (email) {
|
|
|
|
const duplicate = email.match(/^<([^>]+)>.{20}-duplicate$/);
|
|
|
|
if (duplicate) {
|
|
|
|
return duplicate[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return email;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// Test if the user's mail is marked as duplicate
|
|
|
|
// @return {boolean}
|
|
|
|
//#
|
|
|
|
$scope.hasDuplicate = function() {
|
|
|
|
const { email } = memberPromise;
|
|
|
|
if (email) {
|
|
|
|
return !(email.match(/^<([^>]+)>.{20}-duplicate$/) === null);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// Ask for email confirmation and send the SSO merging token again
|
|
|
|
// @param $event {Object} jQuery event object
|
|
|
|
//#
|
|
|
|
$scope.resendCode = function(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
event.stopPropagation();
|
|
|
|
return dialogs.confirm({
|
|
|
|
templateUrl: '<%= asset_path "profile/resend_code_modal.html" %>',
|
|
|
|
resolve: {
|
|
|
|
object() {
|
|
|
|
return {email: memberPromise.email};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
, email =>
|
|
|
|
// Request the server to send an auth-migration email to the current user
|
|
|
|
AuthProvider.send_code({email}, res => growl.info(_t('code_successfully_sent_again'))
|
|
|
|
, err => growl.error(err.data.error))
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#
|
|
|
|
// Disconnect and re-connect the user to the SSO to force the synchronisation of the profile's data
|
|
|
|
//#
|
|
|
|
$scope.syncProfile = () =>
|
|
|
|
Auth.logout().then(function(oldUser) {
|
|
|
|
Session.destroy();
|
|
|
|
$rootScope.currentUser = null;
|
|
|
|
$rootScope.toCheckNotifications = false;
|
|
|
|
$scope.notifications = {
|
|
|
|
total: 0,
|
2017-01-05 15:06:54 +01:00
|
|
|
unread: 0
|
2018-10-25 16:50:16 +02:00
|
|
|
};
|
|
|
|
return $window.location.href = activeProviderPromise.link_to_sso_connect;
|
|
|
|
})
|
|
|
|
;
|
2016-04-25 14:30:03 +02:00
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
/* PRIVATE SCOPE */
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//#
|
|
|
|
// Kind of constructor: these actions will be realized first when the controller is loaded
|
|
|
|
//#
|
|
|
|
const initialize = function() {
|
|
|
|
CSRF.setMetaTags();
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
// init the birth date to JS object
|
|
|
|
$scope.user.profile.birthday = moment($scope.user.profile.birthday).toDate();
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
// bind fields protection with sso fields
|
|
|
|
return angular.forEach(activeProviderPromise.mapping, map => $scope.preventField[map] = true);
|
|
|
|
};
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
//# !!! MUST BE CALLED AT THE END of the controller
|
|
|
|
return initialize();
|
|
|
|
}
|
2016-03-23 18:39:41 +01:00
|
|
|
|
2018-10-25 16:50:16 +02:00
|
|
|
]);
|