| @@ -547,7 +547,11 @@ app.core.Dict = { | |||||
| "GROUP_MANAGEMENT_MEMBERS_ACTIVE" : "Aktiv", | "GROUP_MANAGEMENT_MEMBERS_ACTIVE" : "Aktiv", | ||||
| "GROUP_MANAGEMENT_MEMBERS_INACTIVE" : "Inaktiv", | "GROUP_MANAGEMENT_MEMBERS_INACTIVE" : "Inaktiv", | ||||
| "GROUP_MANAGEMENT_MEMBERS_NOT_APPROVED" : "Unbestätigt", | "GROUP_MANAGEMENT_MEMBERS_NOT_APPROVED" : "Unbestätigt", | ||||
| "GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS" : "Gruppenstatus ändern" | |||||
| "GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS" : "Gruppenstatus ändern", | |||||
| "BTN_GROUP_MANAGEMENT_MEMBERS_SAVE_STATUS" : "Status speichern", | |||||
| "MEMBER_STATUS_CHANGED" : "Status erfolgreich geändert.", | |||||
| "GROUP_DETAIL_NOTE_INACTIVE_OR_NOT_APPROVED" : "Du bist bereits Mitglied dieser Gruppe, deine volle Mitgliedschaft muss von einem Admin aktiviert werden. Aktuell kannst du noch keine Gruppentermine sehen oder an ihnen teilnehmen.", | |||||
| "GROUP_DETAIL_STATUS" : "Dein Gruppenstatus", | |||||
| }, | }, | ||||
| "en" : { | "en" : { | ||||
| } | } | ||||
| @@ -148,23 +148,29 @@ app.gui.ActionButton = (function() | |||||
| return; | return; | ||||
| } | } | ||||
| switch ( stateId ) | |||||
| { | |||||
| case 'appointment-create': | |||||
| case 'appointment-edit': | |||||
| case 'appointment-edit-attendee': | |||||
| case 'configuration-profile-edit': | |||||
| case 'group-detail-edit': | |||||
| case 'group-members-edit': | |||||
| case 'group-member-management': | |||||
| $actionButton.hide(); | |||||
| break; | |||||
| default: | |||||
| $actionButton.css( 'right', '20px' ); | |||||
| $actionButton.css( 'marginRight', 0); | |||||
| $actionButton.show(); | |||||
| } | |||||
| // switch ( stateId ) | |||||
| // { | |||||
| // case 'appointment-create': | |||||
| // case 'appointment-edit': | |||||
| // case 'appointment-edit-attendee': | |||||
| // case 'configuration-profile-edit': | |||||
| // case 'group-detail-edit': | |||||
| // case 'group-members-edit': | |||||
| // case 'group-member-management': | |||||
| // $actionButton.hide(); | |||||
| // break; | |||||
| // | |||||
| // default: | |||||
| // $actionButton.css( 'right', '20px' ); | |||||
| // $actionButton.css( 'marginRight', 0); | |||||
| // $actionButton.show(); | |||||
| // } | |||||
| // NOTE: Show by default - maybe there are some states when to hide action button later | |||||
| $actionButton.css( 'right', '20px' ); | |||||
| $actionButton.css( 'marginRight', 0); | |||||
| $actionButton.show(); | |||||
| }.bind( this )); | }.bind( this )); | ||||
| } | } | ||||
| , | , | ||||
| @@ -26,10 +26,6 @@ app.state.GroupMemberManagementMember = function() | |||||
| fnRenderMemberForm = function( profile ) | fnRenderMemberForm = function( profile ) | ||||
| { | { | ||||
| console.log(profile); | |||||
| //console.log(profile.getGroupData(groupId)); | |||||
| // console.log(group); | |||||
| //console.log(profile.getGroupData(groupId).status); | |||||
| $memberContainer = $content.find( '[data-id="member-container"]' ).first(); | $memberContainer = $content.find( '[data-id="member-container"]' ).first(); | ||||
| $memberContainer.html( | $memberContainer.html( | ||||
| app.core.View.getTemplate( | app.core.View.getTemplate( | ||||
| @@ -198,10 +194,10 @@ app.state.GroupMemberManagementMember = function() | |||||
| $content.on( 'click', '[data-id="btn-update-role"]', function() | $content.on( 'click', '[data-id="btn-update-role"]', function() | ||||
| { | { | ||||
| var newRole = $content.find( '[data-id="select-member-role"]' ).first().val(); | var newRole = $content.find( '[data-id="select-member-role"]' ).first().val(); | ||||
| if ( memberToEdit.getRoleInGroup( group.getId() ) === newRole ) | |||||
| { | |||||
| return; | |||||
| } | |||||
| // if ( memberToEdit.getRoleInGroup( group.getId() ) === newRole ) | |||||
| // { | |||||
| // return; | |||||
| // } | |||||
| app.gui.PageLoader.show(); | app.gui.PageLoader.show(); | ||||
| app.core.Rpc.call( | app.core.Rpc.call( | ||||
| 'Team', | 'Team', | ||||
| @@ -223,6 +219,34 @@ app.state.GroupMemberManagementMember = function() | |||||
| ); | ); | ||||
| }); | }); | ||||
| $content.on( 'click', '[data-id="btn-update-status"]', function() | |||||
| { | |||||
| var newStatus = $content.find( '[data-id="select-member-status"]' ).first().val(); | |||||
| // if ( memberToEdit.getGroupData( group.getId() ).status === newStatus ) | |||||
| // { | |||||
| // return; | |||||
| // } | |||||
| app.gui.PageLoader.show(); | |||||
| app.core.Rpc.call( | |||||
| 'Team', | |||||
| 'changeMemberStatus', | |||||
| { | |||||
| groupId : group.getId(), | |||||
| memberId : memberToEdit.getId(), | |||||
| newStatus : newStatus | |||||
| }, | |||||
| function( res ) | |||||
| { | |||||
| app.core.View.toastSuccess( _lc( 'MEMBER_STATUS_CHANGED' ) ); | |||||
| if ( app.model.SessionUser.isOwnProfile( memberToEdit ) ) | |||||
| { | |||||
| app.core.Controller.redirect( '#/group/' + group.getId() ); | |||||
| } | |||||
| app.gui.PageLoader.hide(); | |||||
| } | |||||
| ); | |||||
| }); | |||||
| $content.on( 'click', '[data-id="btn-update-contract"]', function() | $content.on( 'click', '[data-id="btn-update-contract"]', function() | ||||
| { | { | ||||
| var contractUnix = null; | var contractUnix = null; | ||||
| @@ -77,6 +77,21 @@ | |||||
| <% } %> | <% } %> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="row"> | |||||
| <% var status = currentProfile.getGroupData( group.getId() ).status %> | |||||
| <%= _lc( 'GROUP_DETAIL_STATUS' ) %>: | |||||
| <% if ( status === 'active' ) { %> | |||||
| <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_ACTIVE' ) %> | |||||
| <% } else if ( status === 'inactive' ) { %> | |||||
| <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_INACTIVE' ) %> | |||||
| <% } else if ( status === 'not_approved' ) { %> | |||||
| <%= _lc( 'GROUP_MANAGEMENT_MEMBERS_NOT_APPROVED' ) %> | |||||
| <% } %> | |||||
| <br> | |||||
| <% if ( status === 'inactive' || status === 'not_approved' ) { %> | |||||
| <%= _lc( 'GROUP_DETAIL_NOTE_INACTIVE_OR_NOT_APPROVED' ) %> | |||||
| <% } %> | |||||
| </div> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -132,9 +132,8 @@ | |||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| <div class="col"> | <div class="col"> | ||||
| <button class="btn btn-primary btn-sm" | |||||
| data-id="btn-update-role"> | |||||
| <%= _lc( 'BTN_SAVE_NEW_ROLE' ) %> | |||||
| <button class="btn btn-primary btn-sm" data-id="btn-update-status"> | |||||
| <%= _lc( 'BTN_GROUP_MANAGEMENT_MEMBERS_SAVE_STATUS' ) %> | |||||
| </button> | </button> | ||||
| </div> | </div> | ||||
| <% if ( 'trainer' === p.getRoleInGroup( g.getId() ) ) { %> | <% if ( 'trainer' === p.getRoleInGroup( g.getId() ) ) { %> | ||||
| @@ -34,7 +34,7 @@ | |||||
| </a> | </a> | ||||
| </li> | </li> | ||||
| <li class="action-list-item"> | <li class="action-list-item"> | ||||
| <a href="<%= '#/group/' + ( currentUser.getGroupData()[0].team_id ) + '/membermanagement' %>"> | |||||
| <a href="<%= '#/group/' + adminGroups[ 0 ].getId() + '/membermanagement' %>"> | |||||
| <i class="fas fa-users"></i> <span><%= _lc( 'GROUP_EDIT_MEMBERS' ) %></span> | <i class="fas fa-users"></i> <span><%= _lc( 'GROUP_EDIT_MEMBERS' ) %></span> | ||||
| </a> | </a> | ||||
| </li> | </li> | ||||
| @@ -237,6 +237,54 @@ class TB_Server_Control_Team { | |||||
| return $resp; | return $resp; | ||||
| } | } | ||||
| public static function changeMemberStatus( TB_Server_Core_RequestData $params ) | |||||
| { | |||||
| $resp = new TB_Server_Core_Response(); | |||||
| $teamId = $params->get( 'groupId' ); | |||||
| $team = TB_Shared_Ent_TeamData_Team::get( $teamId ); | |||||
| $newStatus = $params->get( 'newStatus' ); | |||||
| if (!in_array($newStatus, TB_Shared_Ent_TeamData_Profile::getValidStates())) { | |||||
| throw new \Exception( 'Invalid new status: ' . $newStatus ); | |||||
| } | |||||
| if ( is_null( $team ) ) | |||||
| { | |||||
| throw new \Exception( 'Invalid group id for update member.' ); | |||||
| } | |||||
| $sessionProfile = TB_Server_Core_Session::get()->getProfile(); | |||||
| if ( false === $sessionProfile->isAdminOfTeam( $teamId ) ) | |||||
| { | |||||
| throw new \Exception( 'Not allowed to update member' ); | |||||
| } | |||||
| $memberId = $params->get( 'memberId' ); | |||||
| $memberToUpdate = TB_Shared_Ent_TeamData_Profile::get( $params->get( 'memberId' ) ); | |||||
| if ( is_null( $memberToUpdate ) ) | |||||
| { | |||||
| throw new \Exception( 'cannot find member to update with id', $memberId ); | |||||
| } | |||||
| if ( false === $memberToUpdate->isInTeam( $teamId ) ) | |||||
| { | |||||
| throw new \Exception( 'profile to update is not a member of current team.' ); | |||||
| } | |||||
| if ( $memberToUpdate->isOwnerOfTeam( $teamId ) ) | |||||
| { | |||||
| throw new \Exception( 'Trainer cannot be updated within this function' ); | |||||
| } | |||||
| $memberToUpdate->setStatusInTeam( $teamId, $newStatus ); | |||||
| $memberToUpdate->save(); | |||||
| TB_Server_Core_Notification::notifyNewStatus( $memberToUpdate, $team, $newStatus ); | |||||
| return $resp; | |||||
| } | |||||
| public static function changeMemberContract( TB_Server_Core_RequestData $params ) | public static function changeMemberContract( TB_Server_Core_RequestData $params ) | ||||
| { | { | ||||
| $resp = new TB_Server_Core_Response(); | $resp = new TB_Server_Core_Response(); | ||||
| @@ -262,6 +262,38 @@ class TB_Server_Core_Notification | |||||
| ); | ); | ||||
| } | } | ||||
| /** | |||||
| * @param TB_Shared_Ent_TeamData_Profile $profile | |||||
| * @param TB_Shared_Ent_TeamData_Team $group | |||||
| * @param $newStatus | |||||
| * @throws Exception | |||||
| */ | |||||
| public static function notifyNewStatus(TB_Shared_Ent_TeamData_Profile $profile, TB_Shared_Ent_TeamData_Team $group, $newStatus ) | |||||
| { | |||||
| $profileIds = array( $profile->id ); | |||||
| $statusText = ""; | |||||
| switch ($newStatus) { | |||||
| case TB_Shared_Ent_TeamData_Profile::STATUS_ACTIVE: | |||||
| $statusText = 'Aktiv'; | |||||
| break; | |||||
| case TB_Shared_Ent_TeamData_Profile::STATUS_INACTIVE: | |||||
| $statusText = 'Inaktiv'; | |||||
| break; | |||||
| case TB_Shared_Ent_TeamData_Profile::STATUS_NOT_APPROVED: | |||||
| $statusText = 'Unbestätigt'; | |||||
| break; | |||||
| } | |||||
| $msg = 'Deine Status im Team ' . $group->display_name . ' wurde auf ' . $statusText. ' gesetzt.'; | |||||
| TB_Server_Core_Notification::sendToProfiles( | |||||
| 'Neuer Status', | |||||
| $msg, | |||||
| $profileIds, | |||||
| TB_Server_Core_Notification::createAdditionalData( '#/group/members' . $group->id, true ) | |||||
| ); | |||||
| } | |||||
| /** | /** | ||||
| * @param TB_Shared_Ent_TeamData_Profile $profile | * @param TB_Shared_Ent_TeamData_Profile $profile | ||||
| * @param TB_Shared_Ent_TeamData_Team $group | * @param TB_Shared_Ent_TeamData_Team $group | ||||
| @@ -381,6 +381,12 @@ class TB_Shared_Ent_TeamData_Appointment extends Francis_Db_Row | |||||
| } | } | ||||
| } | } | ||||
| // Check if user is not approved in group yet | |||||
| $profileTeamData = $profile->getTeamsData($this->team_id); | |||||
| if ($profileTeamData['status'] === TB_Shared_Ent_TeamData_Profile::STATUS_NOT_APPROVED) { | |||||
| $isVisible = false; | |||||
| } | |||||
| return $isVisible; | return $isVisible; | ||||
| } | } | ||||
| @@ -69,6 +69,15 @@ class TB_Shared_Ent_TeamData_Profile extends Francis_Db_Row { | |||||
| ); | ); | ||||
| } | } | ||||
| public static function getValidStates() | |||||
| { | |||||
| return array( | |||||
| self::STATUS_ACTIVE, | |||||
| self::STATUS_INACTIVE, | |||||
| self::STATUS_NOT_APPROVED | |||||
| ); | |||||
| } | |||||
| /** | /** | ||||
| * Get first profile by account id | * Get first profile by account id | ||||
| * @param $accountId | * @param $accountId | ||||
| @@ -395,6 +404,36 @@ class TB_Shared_Ent_TeamData_Profile extends Francis_Db_Row { | |||||
| $this->teams_js = $profileTeamData; | $this->teams_js = $profileTeamData; | ||||
| } | } | ||||
| /** | |||||
| * @param $teamId | |||||
| * @param $status | |||||
| */ | |||||
| public function setStatusInTeam($teamId, $status ) | |||||
| { | |||||
| if ( !in_array( $status, self::getValidStates() ) ) | |||||
| { | |||||
| throw new \Exception( "Invalid status to set: " . $status ); | |||||
| } | |||||
| $profileTeamData = array(); | |||||
| if ( is_array( $this->teams_js ) ) | |||||
| { | |||||
| // Make a copy | |||||
| $profileTeamData = unserialize( serialize( $this->teams_js ) ); | |||||
| } | |||||
| foreach( $profileTeamData as &$teamData ) | |||||
| { | |||||
| if ( $teamId === $teamData[ 'team_id' ] ) | |||||
| { | |||||
| $teamData[ 'status' ] = $status; | |||||
| } | |||||
| } | |||||
| $this->teams_js = $profileTeamData; | |||||
| } | |||||
| /** | /** | ||||
| * @param $teamId | * @param $teamId | ||||
| * @param $contract | * @param $contract | ||||