2011-06-03 06:40:29 +02:00
< ? php
2014-09-24 15:36:26 +02:00
2023-03-05 03:00:38 +01:00
use Engelsystem\Config\GoodieType ;
2023-04-06 19:19:04 +02:00
use Engelsystem\Http\Validation\Rules\Username ;
2022-11-06 12:41:52 +01:00
use Engelsystem\Models\Group ;
2018-10-09 21:47:31 +02:00
use Engelsystem\Models\User\User ;
2022-11-06 12:41:52 +01:00
use Illuminate\Database\Query\JoinClause ;
use Illuminate\Support\Collection ;
2017-01-21 13:58:53 +01:00
2017-01-03 03:22:48 +01:00
/**
* @ return string
*/
2017-01-02 03:57:23 +01:00
function admin_user_title ()
{
2018-08-29 21:55:32 +02:00
return __ ( 'All Angels' );
2013-11-25 21:04:58 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return string
*/
2017-01-02 03:57:23 +01:00
function admin_user ()
{
2018-10-31 12:48:22 +01:00
$user = auth () -> user ();
2017-01-21 23:07:20 +01:00
$tshirt_sizes = config ( 'tshirt_sizes' );
2017-07-18 21:38:53 +02:00
$request = request ();
2017-01-02 03:57:23 +01:00
$html = '' ;
2023-03-05 03:00:38 +01:00
$goodie = GoodieType :: from ( config ( 'goodie_type' ));
$goodie_enabled = $goodie !== GoodieType :: None ;
$goodie_tshirt = $goodie === GoodieType :: Tshirt ;
2017-01-02 15:43:36 +01:00
2017-07-18 21:38:53 +02:00
if ( ! $request -> has ( 'id' )) {
2019-09-08 02:25:49 +02:00
throw_redirect ( users_link ());
2014-12-27 21:55:24 +01:00
}
2017-01-02 15:43:36 +01:00
2017-07-18 21:38:53 +02:00
$user_id = $request -> input ( 'id' );
if ( ! $request -> has ( 'action' )) {
2018-10-09 21:47:31 +02:00
$user_source = User :: find ( $user_id );
if ( ! $user_source ) {
2018-08-29 21:55:32 +02:00
error ( __ ( 'This user does not exist.' ));
2019-09-08 02:25:49 +02:00
throw_redirect ( users_link ());
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2022-12-23 03:20:10 +01:00
$html .= __ ( 'Here you can change the user entry. Under the item \'Arrived\' the angel is marked as present, a yes at Active means that the angel was active.' );
2023-03-05 03:00:38 +01:00
if ( $goodie_enabled ) {
if ( $goodie_tshirt ) {
2023-01-27 21:01:23 +01:00
$html .= ' ' . __ ( 'If the angel is active, it can claim a T-shirt. If T-shirt is set to \'Yes\', the angel already got their T-shirt.' );
2023-03-05 03:00:38 +01:00
} else {
$html .= ' ' . __ ( 'If the angel is active, it can claim a goodie. If goodie is set to \'Yes\', the angel already got their goodie.' );
2023-01-27 21:01:23 +01:00
}
2022-12-23 03:20:10 +01:00
}
$html .= '<br /><br />' ;
2017-08-28 16:21:10 +02:00
$html .= '<form action="'
. page_link_to ( 'admin_user' , [ 'action' => 'save' , 'id' => $user_id ])
. '" method="post">' . " \n " ;
2018-09-03 16:33:13 +02:00
$html .= form_csrf ();
2022-06-16 23:00:56 +02:00
$html .= '<table>' . " \n " ;
2017-01-03 14:12:17 +01:00
$html .= '<input type="hidden" name="Type" value="Normal">' . " \n " ;
$html .= '<tr><td>' . " \n " ;
$html .= '<table>' . " \n " ;
2023-10-03 18:59:46 +02:00
$html .= ' <tr><td>' . __ ( 'general.nick' ) . '</td><td>' . '<input size="40" name="eNick" value="' . $user_source -> name . '" class="form-control" maxlength="24"></td></tr>' . " \n " ;
2022-12-23 03:20:10 +01:00
$html .= ' <tr><td>' . __ ( 'Last login' ) . '</td><td><p class="help-block">'
2023-02-04 02:43:47 +01:00
. ( $user_source -> last_login_at ? $user_source -> last_login_at -> format ( __ ( 'Y-m-d H:i' )) : '-' )
2017-01-03 15:32:12 +01:00
. '</p></td></tr>' . " \n " ;
2019-08-24 10:56:59 +02:00
if ( config ( 'enable_user_name' )) {
2023-10-03 21:34:03 +02:00
$html .= ' <tr><td>' . __ ( 'settings.profile.firstname' ) . '</td><td>' . '<input size="40" name="eName" value="' . $user_source -> personalData -> last_name . '" class="form-control" maxlength="64"></td></tr>' . " \n " ;
2023-10-03 18:59:46 +02:00
$html .= ' <tr><td>' . __ ( 'settings.profile.lastname' ) . '</td><td>' . '<input size="40" name="eVorname" value="' . $user_source -> personalData -> first_name . '" class="form-control" maxlength="64"></td></tr>' . " \n " ;
2019-08-24 10:56:59 +02:00
}
2023-10-03 18:59:46 +02:00
$html .= ' <tr><td>' . __ ( 'settings.profile.mobile' ) . '</td><td>' . '<input type= "tel" size="40" name="eHandy" value="' . $user_source -> contact -> mobile . '" class="form-control" maxlength="40"></td></tr>' . " \n " ;
2019-04-23 12:42:01 +02:00
if ( config ( 'enable_dect' )) {
2023-10-02 16:15:25 +02:00
$html .= ' <tr><td>' . __ ( 'general.dect' ) . '</td><td>' . '<input size="40" name="eDECT" value="' . $user_source -> contact -> dect . '" class="form-control" maxlength="40"></td></tr>' . " \n " ;
2019-04-23 12:42:01 +02:00
}
2018-10-09 21:47:31 +02:00
if ( $user_source -> settings -> email_human ) {
2023-10-03 21:34:03 +02:00
$html .= ' <tr><td>' . __ ( 'general.email' ) . '</td><td>' . '<input type="email" size="40" name="eemail" value="' . $user_source -> email . '" class="form-control" maxlength="254"></td></tr>' . " \n " ;
2022-12-23 03:20:10 +01:00
}
2023-03-05 03:00:38 +01:00
if ( $goodie_tshirt ) {
2022-12-23 03:20:10 +01:00
$html .= ' <tr><td>' . __ ( 'user.shirt_size' ) . '</td><td>'
. html_select_key (
'size' ,
'eSize' ,
$tshirt_sizes ,
$user_source -> personalData -> shirt_size ,
2023-05-11 19:04:07 +02:00
__ ( 'form.select_placeholder' )
2022-12-23 03:20:10 +01:00
)
. '</td></tr>' . " \n " ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$options = [
2018-08-29 21:55:32 +02:00
'1' => __ ( 'Yes' ),
2023-02-05 18:03:00 +01:00
'0' => __ ( 'No' ),
2017-01-02 15:43:36 +01:00
];
// Gekommen?
2023-10-03 21:34:03 +02:00
$html .= ' <tr><td>' . __ ( 'user.arrived' ) . '</td><td>' . " \n " ;
2019-04-24 11:01:37 +02:00
if ( $user_source -> state -> arrived ) {
2019-08-04 17:55:07 +02:00
$html .= __ ( 'Yes' );
2018-12-27 19:08:35 +01:00
} else {
2019-08-04 17:55:07 +02:00
$html .= __ ( 'No' );
2018-12-27 19:08:35 +01:00
}
$html .= '</td></tr>' . " \n " ;
2017-01-02 15:43:36 +01:00
// Aktiv?
2022-12-23 03:20:10 +01:00
$html .= ' <tr><td>' . __ ( 'user.active' ) . '</td><td>' . " \n " ;
2018-10-09 21:47:31 +02:00
$html .= html_options ( 'eAktiv' , $options , $user_source -> state -> active ) . '</td></tr>' . " \n " ;
2017-01-02 15:43:36 +01:00
// Aktiv erzwingen
2018-11-12 14:41:23 +01:00
if ( auth () -> can ( 'admin_active' )) {
2018-08-29 21:55:32 +02:00
$html .= ' <tr><td>' . __ ( 'Force active' ) . '</td><td>' . " \n " ;
2018-10-09 21:47:31 +02:00
$html .= html_options ( 'force_active' , $options , $user_source -> state -> force_active ) . '</td></tr>' . " \n " ;
2017-01-02 15:43:36 +01:00
}
2023-03-05 03:00:38 +01:00
if ( $goodie_enabled ) {
2022-12-23 03:20:10 +01:00
// T-Shirt bekommen?
2023-03-05 03:00:38 +01:00
if ( $goodie_tshirt ) {
2023-01-27 21:01:23 +01:00
$html .= ' <tr><td>' . __ ( 'T-Shirt' ) . '</td><td>' . " \n " ;
2023-03-05 03:00:38 +01:00
} else {
$html .= ' <tr><td>' . __ ( 'Goodie' ) . '</td><td>' . " \n " ;
2023-01-27 21:01:23 +01:00
}
2022-12-23 03:20:10 +01:00
$html .= html_options ( 'eTshirt' , $options , $user_source -> state -> got_shirt ) . '</td></tr>' . " \n " ;
}
2022-06-16 23:00:56 +02:00
$html .= '</table>' . " \n " . '</td><td></td></tr>' ;
2017-01-02 15:43:36 +01:00
2017-01-03 14:12:17 +01:00
$html .= '</td></tr>' . " \n " ;
$html .= '</table>' . " \n " . '<br />' . " \n " ;
2023-03-10 15:53:54 +01:00
$html .= '<button type="submit" class="btn btn-primary">' . __ ( 'form.save' ) . '</button>' . " \n " ;
2017-01-03 14:12:17 +01:00
$html .= '</form>' ;
2017-01-02 15:43:36 +01:00
2017-01-03 14:12:17 +01:00
$html .= '<hr />' ;
2017-01-02 15:43:36 +01:00
2022-12-23 03:20:10 +01:00
$html .= form_info ( '' , __ ( 'Please visit the angeltypes page or the users profile to manage the users angeltypes.' ));
2017-01-02 15:43:36 +01:00
2022-12-23 03:20:10 +01:00
$html .= ' ' . __ ( 'Here you can reset the password of this angel:' ) . '<form action="'
2017-08-28 16:21:10 +02:00
. page_link_to ( 'admin_user' , [ 'action' => 'change_pw' , 'id' => $user_id ])
. '" method="post">' . " \n " ;
2018-09-03 16:33:13 +02:00
$html .= form_csrf ();
2017-01-03 14:12:17 +01:00
$html .= '<table>' . " \n " ;
2023-10-01 22:33:58 +02:00
$html .= ' <tr><td>' . __ ( 'settings.password' ) . '</td><td>' . '<input type="password" size="40" name="new_pw" value="" class="form-control" autocomplete="new-password"></td></tr>' . " \n " ;
2022-12-23 03:20:10 +01:00
$html .= ' <tr><td>' . __ ( 'Confirm password' ) . '</td><td>' . '<input type="password" size="40" name="new_pw2" value="" class="form-control" autocomplete="new-password"></td></tr>' . " \n " ;
2017-01-02 15:43:36 +01:00
2017-01-03 15:32:12 +01:00
$html .= '</table>' . " \n " . '<br />' . " \n " ;
2023-03-10 15:53:54 +01:00
$html .= '<button type="submit" class="btn btn-primary">' . __ ( 'form.save' ) . '</button>' . " \n " ;
2017-01-03 14:12:17 +01:00
$html .= '</form>' ;
2017-01-02 15:43:36 +01:00
2017-01-03 14:12:17 +01:00
$html .= '<hr />' ;
2017-01-02 15:43:36 +01:00
2022-11-06 12:41:52 +01:00
/** @var Group $my_highest_group */
$my_highest_group = $user -> groups () -> orderByDesc ( 'id' ) -> first ();
2017-07-28 20:11:09 +02:00
if ( ! empty ( $my_highest_group )) {
2022-11-06 12:41:52 +01:00
$my_highest_group = $my_highest_group -> id ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2022-11-06 12:41:52 +01:00
$angel_highest_group = $user_source -> groups () -> orderByDesc ( 'id' ) -> first ();
2019-07-28 15:33:01 +02:00
if ( ! empty ( $angel_highest_group )) {
2022-11-06 12:41:52 +01:00
$angel_highest_group = $angel_highest_group -> id ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2020-09-12 23:03:38 +02:00
if (
( $user_id != $user -> id || auth () -> can ( 'admin_groups' ))
2019-07-28 15:33:01 +02:00
&& ( $my_highest_group >= $angel_highest_group || is_null ( $angel_highest_group ))
2020-09-12 23:03:38 +02:00
) {
2022-12-23 03:20:10 +01:00
$html .= __ ( 'Here you can define the user groups of the angel:' ) . '<form action="'
2017-08-28 16:21:10 +02:00
. page_link_to ( 'admin_user' , [ 'action' => 'save_groups' , 'id' => $user_id ])
. '" method="post">' . " \n " ;
2018-09-03 16:33:13 +02:00
$html .= form_csrf ();
2022-11-30 00:14:08 +01:00
$html .= '<div>' ;
2017-01-02 15:43:36 +01:00
2022-11-06 12:41:52 +01:00
$groups = changeableGroups ( $my_highest_group , $user_id );
2017-01-02 03:57:23 +01:00
foreach ( $groups as $group ) {
2022-11-30 00:14:08 +01:00
$html .= '<div class="form-check">'
. '<input class="form-check-input" type="checkbox" id="' . $group -> id . '" name="groups[]" value="' . $group -> id . '" '
2022-11-06 12:41:52 +01:00
. ( $group -> selected ? ' checked="checked"' : '' )
2022-11-30 00:14:08 +01:00
. ' /><label class="form-check-label" for="' . $group -> id . '">' . $group -> name . '</label></div>' ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2022-11-30 00:14:08 +01:00
$html .= '</div><br>' ;
2017-01-02 15:43:36 +01:00
2023-03-10 15:53:54 +01:00
$html .= '<button type="submit" class="btn btn-primary">' . __ ( 'form.save' ) . '</button>' . " \n " ;
2017-01-03 14:12:17 +01:00
$html .= '</form>' ;
2017-01-02 15:43:36 +01:00
2017-01-03 14:12:17 +01:00
$html .= '<hr />' ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$html .= buttons ([
2023-02-05 18:03:00 +01:00
button ( user_delete_link ( $user_source -> id ), icon ( 'trash' ) . __ ( 'delete' ), 'btn-danger' ),
2017-01-02 15:43:36 +01:00
]);
2023-02-05 16:34:16 +01:00
$html .= '<hr>' ;
2017-01-02 03:57:23 +01:00
} else {
2017-07-18 21:38:53 +02:00
switch ( $request -> input ( 'action' )) {
2017-01-02 15:43:36 +01:00
case 'save_groups' :
2022-11-06 12:41:52 +01:00
$angel = User :: findOrFail ( $user_id );
if ( $angel -> id != $user -> id || auth () -> can ( 'admin_groups' )) {
/** @var Group $my_highest_group */
$my_highest_group = $user -> groups () -> orderByDesc ( 'id' ) -> first ();
/** @var Group $angel_highest_group */
$angel_highest_group = $angel -> groups () -> orderByDesc ( 'id' ) -> first ();
2017-01-21 13:58:53 +01:00
if (
2019-07-28 15:33:01 +02:00
$my_highest_group
2017-01-21 13:58:53 +01:00
&& (
2019-07-28 15:33:01 +02:00
empty ( $angel_highest_group )
2022-11-06 12:41:52 +01:00
|| ( $my_highest_group -> id >= $angel_highest_group -> id )
2017-01-21 13:58:53 +01:00
)
) {
2022-11-06 12:41:52 +01:00
$groups_source = changeableGroups ( $my_highest_group -> id , $angel -> id );
2017-01-02 15:43:36 +01:00
$groups = [];
2022-11-06 12:41:52 +01:00
$groupList = [];
2017-01-02 15:43:36 +01:00
foreach ( $groups_source as $group ) {
2022-11-06 12:41:52 +01:00
$groups [ $group -> id ] = $group ;
$groupList [] = $group -> id ;
2017-01-02 15:43:36 +01:00
}
2017-07-18 21:38:53 +02:00
$groupsRequest = $request -> input ( 'groups' );
if ( ! is_array ( $groupsRequest )) {
$groupsRequest = [];
2017-01-02 15:43:36 +01:00
}
2022-11-06 12:41:52 +01:00
$angel -> groups () -> detach ();
2017-01-02 15:43:36 +01:00
$user_groups_info = [];
2017-07-18 21:38:53 +02:00
foreach ( $groupsRequest as $group ) {
2022-11-06 12:41:52 +01:00
if ( in_array ( $group , $groupList )) {
$group = $groups [ $group ];
$angel -> groups () -> attach ( $group );
$user_groups_info [] = $group -> name ;
2017-01-02 15:43:36 +01:00
}
}
2017-01-03 14:12:17 +01:00
engelsystem_log (
2022-11-06 12:41:52 +01:00
'Set groups of ' . User_Nick_render ( $angel , true ) . ' to: '
2017-12-25 23:12:52 +01:00
. join ( ', ' , $user_groups_info )
2017-01-03 14:12:17 +01:00
);
2022-12-23 03:20:10 +01:00
$html .= success ( __ ( 'User groups saved.' ), true );
2017-01-02 15:43:36 +01:00
} else {
2022-12-23 03:20:10 +01:00
$html .= error ( __ ( 'You cannot edit angels with more rights.' ), true );
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
} else {
2022-12-23 03:20:10 +01:00
$html .= error ( __ ( 'You cannot edit your own rights.' ), true );
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
break ;
case 'save' :
2018-10-08 21:15:56 +02:00
$force_active = $user -> state -> force_active ;
2018-10-09 21:47:31 +02:00
$user_source = User :: find ( $user_id );
2018-11-12 14:41:23 +01:00
if ( auth () -> can ( 'admin_active' )) {
2017-07-18 21:38:53 +02:00
$force_active = $request -> input ( 'force_active' );
2017-01-02 15:43:36 +01:00
}
2018-10-17 01:30:10 +02:00
if ( $user_source -> settings -> email_human ) {
2018-10-14 18:24:42 +02:00
$user_source -> email = $request -> postData ( 'eemail' );
}
2023-04-06 19:19:04 +02:00
$nick = trim ( $request -> get ( 'eNick' ));
$nickValid = ( new Username ()) -> validate ( $nick );
if ( $nickValid ) {
$user_source -> name = $nick ;
2019-04-28 14:34:04 +02:00
}
2018-10-14 18:24:42 +02:00
$user_source -> save ();
2022-12-23 03:20:10 +01:00
2019-08-24 12:53:26 +02:00
if ( config ( 'enable_user_name' )) {
$user_source -> personalData -> first_name = $request -> postData ( 'eVorname' );
$user_source -> personalData -> last_name = $request -> postData ( 'eName' );
}
2023-03-05 03:00:38 +01:00
if ( $goodie_tshirt ) {
2022-12-23 03:20:10 +01:00
$user_source -> personalData -> shirt_size = $request -> postData ( 'eSize' );
}
2018-10-14 18:24:42 +02:00
$user_source -> personalData -> save ();
2022-12-23 03:20:10 +01:00
2018-10-14 18:24:42 +02:00
$user_source -> contact -> mobile = $request -> postData ( 'eHandy' );
$user_source -> contact -> dect = $request -> postData ( 'eDECT' );
$user_source -> contact -> save ();
2022-12-23 03:20:10 +01:00
2023-03-05 03:00:38 +01:00
if ( $goodie_enabled ) {
2022-12-23 03:20:10 +01:00
$user_source -> state -> got_shirt = $request -> postData ( 'eTshirt' );
}
2018-10-14 18:24:42 +02:00
$user_source -> state -> active = $request -> postData ( 'eAktiv' );
$user_source -> state -> force_active = $force_active ;
$user_source -> state -> save ();
2017-01-03 14:12:17 +01:00
engelsystem_log (
2019-08-22 23:26:00 +02:00
'Updated user: ' . $user_source -> name . ' (' . $user_source -> id . ')'
2023-03-05 03:00:38 +01:00
. ( $goodie_tshirt ? ', t-shirt: ' : '' . $user_source -> personalData -> shirt_size )
2019-08-22 23:26:00 +02:00
. ', active: ' . $user_source -> state -> active
. ', force-active: ' . $user_source -> state -> force_active
2023-03-05 03:00:38 +01:00
. ( $goodie_tshirt ? ', tshirt: ' : ', goodie: ' . $user_source -> state -> got_shirt )
2017-01-03 14:12:17 +01:00
);
2023-08-13 23:32:36 +02:00
$html .= success ( __ ( 'Changes were saved.' ) . " \n " , true );
2017-01-02 15:43:36 +01:00
break ;
case 'change_pw' :
2017-12-25 23:12:52 +01:00
if (
$request -> postData ( 'new_pw' ) != ''
&& $request -> postData ( 'new_pw' ) == $request -> postData ( 'new_pw2' )
) {
2018-10-09 21:47:31 +02:00
$user_source = User :: find ( $user_id );
2018-11-27 12:01:36 +01:00
auth () -> setPassword ( $user_source , $request -> postData ( 'new_pw' ));
2019-05-31 04:03:19 +02:00
engelsystem_log ( 'Set new password for ' . User_Nick_render ( $user_source , true ));
2022-12-23 03:20:10 +01:00
$html .= success ( __ ( 'Password reset done.' ), true );
2017-01-02 15:43:36 +01:00
} else {
2017-12-25 23:12:52 +01:00
$html .= error (
2022-12-23 03:20:10 +01:00
__ ( 'The entries must match and must not be empty!' ),
2017-12-25 23:12:52 +01:00
true
);
2017-01-02 15:43:36 +01:00
}
break ;
2014-12-27 21:55:24 +01:00
}
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2023-10-25 17:38:23 +02:00
$link = button ( page_link_to ( 'users' , [ 'action' => 'view' , 'user_id' => $user_id ]), icon ( 'chevron-left' ), 'btn-sm' );
return page_with_title (
$link . ' ' . __ ( 'Edit user' ),
[
2023-02-05 18:03:00 +01:00
$html ,
2023-10-25 17:38:23 +02:00
]
);
2011-06-03 06:40:29 +02:00
}
2022-11-06 12:41:52 +01:00
/**
* @ param $myHighestGroup
* @ param $angelId
* @ return Collection | Group []
*/
function changeableGroups ( $myHighestGroup , $angelId ) : Collection
{
return Group :: query ()
-> where ( 'groups.id' , '<=' , $myHighestGroup )
-> join ( 'users_groups' , function ( $query ) use ( $angelId ) {
/** @var JoinClause $query */
$query -> where ( 'users_groups.group_id' , '=' , $query -> raw ( 'groups.id' ))
-> where ( 'users_groups.user_id' , $angelId );
}, null , null , 'left outer' )
-> orderBy ( 'name' )
-> get ([
'groups.*' ,
2023-02-05 18:03:00 +01:00
'users_groups.group_id as selected' ,
2022-11-06 12:41:52 +01:00
]);
}