const usersPerPage = 25 ;
BlazeComponent . extendComponent ( {
mixins ( ) {
return [ Mixins . InfiniteScrolling ] ;
} ,
onCreated ( ) {
this . error = new ReactiveVar ( '' ) ;
this . loading = new ReactiveVar ( false ) ;
this . people = new ReactiveVar ( true ) ;
this . findUsersOptions = new ReactiveVar ( { } ) ;
this . number = new ReactiveVar ( 0 ) ;
this . page = new ReactiveVar ( 1 ) ;
this . loadNextPageLocked = false ;
this . callFirstWith ( null , 'resetNextPeak' ) ;
this . autorun ( ( ) => {
const limit = this . page . get ( ) * usersPerPage ;
this . subscribe ( 'people' , this . findUsersOptions . get ( ) , limit , ( ) => {
this . loadNextPageLocked = false ;
const nextPeakBefore = this . callFirstWith ( null , 'getNextPeak' ) ;
this . calculateNextPeak ( ) ;
const nextPeakAfter = this . callFirstWith ( null , 'getNextPeak' ) ;
if ( nextPeakBefore === nextPeakAfter ) {
this . callFirstWith ( null , 'resetNextPeak' ) ;
}
} ) ;
} ) ;
} ,
events ( ) {
return [
{
'click #searchButton' ( ) {
this . filterPeople ( ) ;
} ,
'keydown #searchInput' ( event ) {
if ( event . keyCode === 13 && ! event . shiftKey ) {
this . filterPeople ( ) ;
}
} ,
} ,
] ;
} ,
filterPeople ( ) {
const value = $ ( '#searchInput' )
. first ( )
. val ( ) ;
if ( value === '' ) {
this . findUsersOptions . set ( { } ) ;
} else {
const regex = new RegExp ( value , 'i' ) ;
this . findUsersOptions . set ( {
$or : [
{ username : regex } ,
{ 'profile.fullname' : regex } ,
{ 'emails.address' : regex } ,
] ,
} ) ;
}
} ,
loadNextPage ( ) {
if ( this . loadNextPageLocked === false ) {
this . page . set ( this . page . get ( ) + 1 ) ;
this . loadNextPageLocked = true ;
}
} ,
calculateNextPeak ( ) {
const element = this . find ( '.main-body' ) ;
if ( element ) {
const altitude = element . scrollHeight ;
this . callFirstWith ( this , 'setNextPeak' , altitude ) ;
}
} ,
reachNextPeak ( ) {
this . loadNextPage ( ) ;
} ,
setError ( error ) {
this . error . set ( error ) ;
} ,
setLoading ( w ) {
this . loading . set ( w ) ;
} ,
peopleList ( ) {
const users = Users . find ( this . findUsersOptions . get ( ) , {
fields : { _id : true } ,
} ) ;
this . number . set ( users . count ( false ) ) ;
return users ;
} ,
peopleNumber ( ) {
return this . number . get ( ) ;
} ,
} ) . register ( 'people' ) ;
Template . peopleRow . helpers ( {
userData ( ) {
const userCollection = this . esSearch ? ESSearchResults : Users ;
return userCollection . findOne ( this . userId ) ;
} ,
} ) ;
Template . editUserPopup . onCreated ( function ( ) {
this . authenticationMethods = new ReactiveVar ( [ ] ) ;
this . errorMessage = new ReactiveVar ( '' ) ;
Meteor . call ( 'getAuthenticationsEnabled' , ( _ , result ) => {
if ( result ) {
// TODO : add a management of different languages
// (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')})
this . authenticationMethods . set ( [
{ value : 'password' } ,
// Gets only the authentication methods availables
... Object . entries ( result )
. filter ( e => e [ 1 ] )
. map ( e => ( { value : e [ 0 ] } ) ) ,
] ) ;
}
} ) ;
} ) ;
Template . editUserPopup . helpers ( {
user ( ) {
return Users . findOne ( this . userId ) ;
} ,
authentications ( ) {
return Template . instance ( ) . authenticationMethods . get ( ) ;
} ,
isSelected ( match ) {
const userId = Template . instance ( ) . data . userId ;
const selected = Users . findOne ( userId ) . authenticationMethod ;
return selected === match ;
} ,
isLdap ( ) {
const userId = Template . instance ( ) . data . userId ;
const selected = Users . findOne ( userId ) . authenticationMethod ;
return selected === 'ldap' ;
} ,
errorMessage ( ) {
return Template . instance ( ) . errorMessage . get ( ) ;
} ,
} ) ;
BlazeComponent . extendComponent ( {
onCreated ( ) { } ,
user ( ) {
return Users . findOne ( this . userId ) ;
} ,
events ( ) {
return [
{
'click a.edit-user' : Popup . open ( 'editUser' ) ,
} ,
] ;
} ,
} ) . register ( 'peopleRow' ) ;
Template . editUserPopup . events ( {
submit ( event , templateInstance ) {
event . preventDefault ( ) ;
const user = Users . findOne ( this . userId ) ;
const fullname = templateInstance . find ( '.js-profile-fullname' ) . value . trim ( ) ;
const username = templateInstance . find ( '.js-profile-username' ) . value . trim ( ) ;
const password = templateInstance . find ( '.js-profile-password' ) . value ;
const isAdmin = templateInstance . find ( '.js-profile-isadmin' ) . value . trim ( ) ;
const isActive = templateInstance . find ( '.js-profile-isactive' ) . value . trim ( ) ;
const email = templateInstance . find ( '.js-profile-email' ) . value . trim ( ) ;
const authentication = templateInstance
. find ( '.js-authenticationMethod' )
. value . trim ( ) ;
const isChangePassword = password . length > 0 ;
const isChangeUserName = username !== user . username ;
const isChangeEmail =
email . toLowerCase ( ) !== user . emails [ 0 ] . address . toLowerCase ( ) ;
Users . update ( this . userId , {
$set : {
'profile.fullname' : fullname ,
isAdmin : isAdmin === 'true' ,
loginDisabled : isActive === 'true' ,
authenticationMethod : authentication ,
} ,
} ) ;
if ( isChangePassword ) {
Meteor . call ( 'setPassword' , password , this . userId ) ;
}
if ( isChangeUserName && isChangeEmail ) {
Meteor . call (
'setUsernameAndEmail' ,
username ,
email . toLowerCase ( ) ,
this . userId ,
function ( error ) {
const usernameMessageElement = templateInstance . $ ( '.username-taken' ) ;
const emailMessageElement = templateInstance . $ ( '.email-taken' ) ;
if ( error ) {
const errorElement = error . error ;
if ( errorElement === 'username-already-taken' ) {
usernameMessageElement . show ( ) ;
emailMessageElement . hide ( ) ;
} else if ( errorElement === 'email-already-taken' ) {
usernameMessageElement . hide ( ) ;
emailMessageElement . show ( ) ;
}
} else {
usernameMessageElement . hide ( ) ;
emailMessageElement . hide ( ) ;
Popup . close ( ) ;
}
} ,
) ;
} else if ( isChangeUserName ) {
Meteor . call ( 'setUsername' , username , this . userId , function ( error ) {
const usernameMessageElement = templateInstance . $ ( '.username-taken' ) ;
if ( error ) {
const errorElement = error . error ;
if ( errorElement === 'username-already-taken' ) {
usernameMessageElement . show ( ) ;
}
} else {
usernameMessageElement . hide ( ) ;
Popup . close ( ) ;
}
} ) ;
} else if ( isChangeEmail ) {
Meteor . call ( 'setEmail' , email . toLowerCase ( ) , this . userId , function (
error ,
) {
const emailMessageElement = templateInstance . $ ( '.email-taken' ) ;
if ( error ) {
const errorElement = error . error ;
if ( errorElement === 'email-already-taken' ) {
emailMessageElement . show ( ) ;
}
} else {
emailMessageElement . hide ( ) ;
Popup . close ( ) ;
}
} ) ;
} else Popup . close ( ) ;
} ,
'click #deleteButton' : Popup . afterConfirm ( 'userDelete' , function ( ) {
Users . remove ( this . userId ) ;
Popup . close ( ) ;
} ) ,
} ) ;