diff --git a/src/client/app/js/app/core/Controller.js b/src/client/app/js/app/core/Controller.js index 71ec91b..3d1defe 100644 --- a/src/client/app/js/app/core/Controller.js +++ b/src/client/app/js/app/core/Controller.js @@ -228,9 +228,13 @@ app.core.Controller = (function(){ { app.core.StateManager.switchTo( new app.state.GroupMemberManagement(), r.params ); }); + // rlite.add( 'group/:groupId/membermanagement/:memberId', function( r ) + // { + // app.core.StateManager.switchTo( new app.state.GroupMemberManagement(), r.params ); + // }); rlite.add( 'group/:groupId/membermanagement/:memberId', function( r ) { - app.core.StateManager.switchTo( new app.state.GroupMemberManagement(), r.params ); + app.core.StateManager.switchTo( new app.state.GroupMemberManagementMember(), r.params ); }); rlite.add( 'group/:groupId/members', function( r ) { diff --git a/src/client/app/js/app/core/Dict.js b/src/client/app/js/app/core/Dict.js index 006fb8b..25d8c93 100644 --- a/src/client/app/js/app/core/Dict.js +++ b/src/client/app/js/app/core/Dict.js @@ -544,6 +544,10 @@ app.core.Dict = { "STATS_REPORTING" : 'Reporting', 'STATS_PLANNING' : 'Planung', "DO_YOU_REALLY_WANT_TO_DELETE_THIS_CONTRACT" : "Möchtest Du diesen Vertrag wirklich löschen?", + "GROUP_MANAGEMENT_MEMBERS_ACTIVE" : "Aktiv", + "GROUP_MANAGEMENT_MEMBERS_INACTIVE" : "Inaktiv", + "GROUP_MANAGEMENT_MEMBERS_NOT_APPROVED" : "Unbestätigt", + "GROUP_MANAGEMENT_MEMBERS_CHANGE_STATUS" : "Gruppenstatus ändern" }, "en" : { } diff --git a/src/client/app/js/app/state/GroupMemberManagement.js b/src/client/app/js/app/state/GroupMemberManagement.js index 80e18cd..4d69a78 100644 --- a/src/client/app/js/app/state/GroupMemberManagement.js +++ b/src/client/app/js/app/state/GroupMemberManagement.js @@ -12,135 +12,15 @@ app.state.GroupMemberManagement = function() state.onEnter = function( p ) { let $content = app.core.View.getContent(), - fnRenderMemberForm = null, - fnGetMemberById = null, - fnUpdateMemberById = null, group = null, - adminNoteXhr = null, - playerHistoryXhr = null, memberToEdit = null, - currentMember, members = [], + membersActive = [], + membersInactive = [], + membersNotApproved = [], groupId = p.groupId, - memberId = p.hasOwnProperty( 'memberId' ) ? p.memberId : null; - - fnRenderMemberForm = function( profile ) - { - $memberContainer = $content.find( '[data-id="member-container"]' ).first(); - $memberContainer.html( - app.core.View.getTemplate( - 'group-member-management-body', - { - p : profile, - g : group - } - ) - ); - }; - - fnUpdateAppointmentLog = function() - { - if ( !memberToEdit ) - { - return; - } - - if ( playerHistoryXhr ) - { - playerHistoryXhr.abort(); - } - - playerHistoryXhr = app.core.Rpc.call( - 'Team', - 'getProfileAppointmentLog', - { - groupId : group.getId(), - profileId : memberToEdit.getId(), - startDt : $content.find( '[data-id="input-appointment-log-from"]' ).first().val(), - endDt : $content.find( '[data-id="input-appointment-log-until"]' ).first().val() - }, - function( res) - { - $content.find( '[data-id="container-appointment-log"]' ).first().html( - app.core.View.getTemplate( - 'group-member-management-body-appointment-log', - { - logs : res.appointmentLog - } - ) - ); - }, - function() - { - // Do nothing. - } - ); - }; - - fnGetMemberById = function( profileId ) - { - var p = null; - - for ( var mi = 0; mi < members.length; mi++ ) - { - if ( members[ mi ].getId() == profileId ) - { - p = members[ mi ]; - break; - } - } - - return p; - }; - - fnUpdateMemberById = function( newMember ) - { - for ( var mi = 0; mi < members.length; mi++ ) - { - if ( members[ mi ].getId() == newMember.getId() ) - { - members[ mi ] = newMember; - break; - } - } - }; - - fnUpdateMemberToEdit = function( mmid ) - { - memberToEdit = fnGetMemberById( mmid ); - fnRenderMemberForm( memberToEdit ); - if ( memberToEdit ) - { - if ( adminNoteXhr ) - { - adminNoteXhr.abort(); - } - adminNoteXhr = app.core.Rpc.call( - 'Team', - 'getAdminNote', - { - groupId : group.getId(), - profileId : memberToEdit.getId() - }, - function( res ) - { - $content.find( '[data-id="admin-note"]' ).first().html( - app.core.View.getTemplate( - 'group-member-management-body-adminnote', - { - adminNote : res.adminNote ? res.adminNote : '' - } - ) - ); - }, - function() - { - // Do nothing - } - ); - } - fnUpdateAppointmentLog(); - }; + memberId = p.hasOwnProperty( 'memberId' ) ? p.memberId : null, + activeTab = 'inactive'; app.gui.PageLoader.show(); @@ -150,7 +30,7 @@ app.state.GroupMemberManagement = function() { teamId : groupId, includeEmails : true, includeMembers: true }, function( res ) { - + members.push( res ); var member = null, $memberContainer = null, emails = res.emails ? res.emails : []; @@ -168,11 +48,23 @@ app.state.GroupMemberManagement = function() break; } } - members.push( member ); + if ( member.getId() == app.model.SessionUser.getProfileId() ) { currentProfile = member; } + + switch (member.getGroupData(groupId).status) { + case 'active': + membersActive.push(member); + break; + case 'inactive': + membersInactive.push(member); + break; + case 'not_approved': + membersNotApproved.push(member); + break; + } } app.core.View.setContent( @@ -180,9 +72,13 @@ app.state.GroupMemberManagement = function() 'group-member-management', { members : members, + membersActive: membersActive, + membersInactive: membersInactive, + membersNotApproved: membersNotApproved, group : group, groups : app.model.SessionUser.getAdminGroups(), - currentProfile : currentProfile + currentProfile : currentProfile, + activeTab: activeTab } ) ); @@ -191,142 +87,17 @@ app.state.GroupMemberManagement = function() app.core.Controller.redirect( '#/group/' + $(this).val() + '/membermanagement' ); }); - $content.on( 'click', '[data-id="btn-update-role"]', function() - { - var newRole = $content.find( '[data-id="select-member-role"]' ).first().val(); - if ( memberToEdit.getRoleInGroup( group.getId() ) === newRole ) - { - return; - } - app.gui.PageLoader.show(); - app.core.Rpc.call( - 'Team', - 'changeMemberRole', - { - groupId : group.getId(), - memberId : memberToEdit.getId(), - newRole : newRole - }, - function( res ) - { - app.core.View.toastSuccess( _lc( 'MEMBER_ROLE_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() - { - var contractUnix = null; - - if ( $content.find( '[data-id="input-contract-moment"]' ).first().val().length ) - { - contractUnix = app.util.Helper.getMomentFromInputDate( $content.find( '[data-id="input-contract-moment"]' ).first() ).unix(); - } - - app.gui.PageLoader.show(); - app.core.Rpc.call( - 'Team', - 'changeMemberContract', - { - groupId : group.getId(), - memberId : memberToEdit.getId(), - contract : $content.find( '[data-id="input-contract"]' ).first().val(), - contractDate : contractUnix - }, - function( res ) - { - app.core.View.toastSuccess( _lc( 'MEMBER_CONTRACT_UPDATED' ) ); - app.gui.PageLoader.hide(); - if ( res && res.hasOwnProperty( 'updated_member' ) ) - { - memberToEdit.setGroupData( res.updated_member.teams_js ); - } - } - ); - }); - - $content.on( 'click', '[data-type="appointment-log-item"]', function() - { - app.core.Controller.redirect( '#/appointment/' + $(this).attr( 'data-appointment-id' ) ); - }); - - $content.on( 'click', '[data-id="btn-update-appointment-log"]', function() - { - app.core.View.setContentLoader( - $content.find( '[data-id="container-appointment-log"]' ).first() - ); - fnUpdateAppointmentLog(); - }); - - $content.on( 'click', '[data-id="btn-save-admin-note"]', function() - { - app.gui.PageLoader.show(); - app.core.Rpc.call( - 'Team', - 'updateAdminNote', - { - groupId : group.getId(), - profileId : memberToEdit.getId(), - adminNote : $content.find( '[data-id="textarea-admin-note"]' ).first().val() - }, - function() - { - app.core.View.toastSuccess( _lc( 'ADMIN_NOTE_SAVED' ) ); - app.gui.PageLoader.hide(); - } - ); - - $content.find( '[data-id=""]' ).first().val() - }); - $content.find( '[data-id="select-profil-id"]' ).first().change( function() { app.core.Controller.redirect( '#/group/' + group.getId() + '/membermanagement/' + $(this).val() ); }); - $content.find( '[data-id="btn-remove-member"]' ).first().click( function() + $content.on( 'click', '[data-type="member-link"]', function() { - if ( !memberToEdit ) - { - app.core.View.toastInfo( _lc( 'PLEASE_SELECT_MEMBER' ) ); - return; - } - - if ( 'trainer' == memberToEdit.getRoleInGroup( group.getId() ) ) - { - app.core.View.toastInfo( _lc( 'GROUP_OWNER_CANNOT_BE_REMOVED_FROM_GROUP' ) ); - return; - } - - app.core.View.confirm( - _lc( 'DO_YOU_REALLY_WANT_TO_REMOVE_THIS_MEMBER_FROM_TEAM' ), - function() - { - app.gui.PageLoader.show(); - app.core.Rpc.call( - 'Team', - 'removeMember', - { - groupId : group.getId(), - profileId : memberToEdit.getId() - }, - function( res ) - { - app.core.Controller.redirect( '#/group/' + group.getId() + '/members' ); - app.core.View.toastSuccess( _lc( 'MEMBER_REMOVED' ) ); - } - ); - }, - _lc( 'YES_REMOVE' ) - ); + var memberId = $(this).attr( 'data-member-id' ); + app.core.Controller.redirect( '#/group/' + group.getId() + '/membermanagement/' + memberId ); }); - fnRenderMemberForm( null ); if ( memberId ) { diff --git a/src/client/app/js/app/state/GroupMemberManagementMember.js b/src/client/app/js/app/state/GroupMemberManagementMember.js new file mode 100644 index 0000000..5cc2ddf --- /dev/null +++ b/src/client/app/js/app/state/GroupMemberManagementMember.js @@ -0,0 +1,348 @@ +/** + * (c) by aheadware.com + */ + +var app = app || {}; +app.state = app.state || {}; + +app.state.GroupMemberManagementMember = function() +{ + var state = app.core.StateManager.createState( 'group-member-management-member' ); + + state.onEnter = function( p ) + { + let $content = app.core.View.getContent(), + fnRenderMemberForm = null, + fnGetMemberById = null, + fnUpdateMemberById = null, + group = null, + adminNoteXhr = null, + playerHistoryXhr = null, + memberToEdit = null, + currentMember, + members = [], + groupId = p.groupId, + memberId = p.hasOwnProperty( 'memberId' ) ? p.memberId : null; + + 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.html( + app.core.View.getTemplate( + 'group-member-management-member-body', + { + p : profile, + g : group, + } + ) + ); + }; + + fnUpdateAppointmentLog = function() + { + if ( !memberToEdit ) + { + return; + } + + if ( playerHistoryXhr ) + { + playerHistoryXhr.abort(); + } + + playerHistoryXhr = app.core.Rpc.call( + 'Team', + 'getProfileAppointmentLog', + { + groupId : group.getId(), + profileId : memberToEdit.getId(), + startDt : $content.find( '[data-id="input-appointment-log-from"]' ).first().val(), + endDt : $content.find( '[data-id="input-appointment-log-until"]' ).first().val() + }, + function( res) + { + $content.find( '[data-id="container-appointment-log"]' ).first().html( + app.core.View.getTemplate( + 'group-member-management-member-body-appointment-log', + { + logs : res.appointmentLog + } + ) + ); + }, + function() + { + // Do nothing. + } + ); + }; + + fnGetMemberById = function( profileId ) + { + var p = null; + + for ( var mi = 0; mi < members.length; mi++ ) + { + if ( members[ mi ].getId() == profileId ) + { + p = members[ mi ]; + break; + } + } + + return p; + }; + + fnUpdateMemberById = function( newMember ) + { + for ( var mi = 0; mi < members.length; mi++ ) + { + if ( members[ mi ].getId() == newMember.getId() ) + { + members[ mi ] = newMember; + break; + } + } + }; + + fnUpdateMemberToEdit = function( mmid ) + { + memberToEdit = fnGetMemberById( mmid ); + fnRenderMemberForm( memberToEdit ); + if ( memberToEdit ) + { + if ( adminNoteXhr ) + { + adminNoteXhr.abort(); + } + adminNoteXhr = app.core.Rpc.call( + 'Team', + 'getAdminNote', + { + groupId : group.getId(), + profileId : memberToEdit.getId() + }, + function( res ) + { + $content.find( '[data-id="admin-note"]' ).first().html( + app.core.View.getTemplate( + 'group-member-management-member-body-adminnote', + { + adminNote : res.adminNote ? res.adminNote : '' + } + ) + ); + }, + function() + { + // Do nothing + } + ); + } + fnUpdateAppointmentLog(); + }; + + app.gui.PageLoader.show(); + + app.core.Rpc.call( + 'Team', + 'getDetails', + { teamId : groupId, includeEmails : true, includeMembers: true }, + function( res ) + { + + var member = null, + $memberContainer = null, + emails = res.emails ? res.emails : []; + + group = new app.model.Group( res.team ); + + for ( var mi = 0; mi < res.members.length; mi++ ) + { + member = new app.model.Profile( res.members[ mi ] ); + for ( var ei = 0; ei < emails.length; ei++ ) + { + if ( member.getAccountId() == emails[ ei ].id ) + { + member.setEmail( emails[ ei ].email ); + break; + } + } + members.push( member ); + if ( member.getId() == app.model.SessionUser.getProfileId() ) + { + currentProfile = member; + } + } + + app.core.View.setContent( + app.core.View.getTemplate( + 'group-member-management-member', + { + members : members, + group : group, + groups : app.model.SessionUser.getAdminGroups(), + currentProfile : currentProfile + } ) + ); + + $content.find( '[data-id="select-group-id"]' ).first().change( function() + { + app.core.Controller.redirect( '#/group/' + $(this).val() + '/membermanagement' ); + }); + + $content.on( 'click', '[data-id="btn-update-role"]', function() + { + var newRole = $content.find( '[data-id="select-member-role"]' ).first().val(); + if ( memberToEdit.getRoleInGroup( group.getId() ) === newRole ) + { + return; + } + app.gui.PageLoader.show(); + app.core.Rpc.call( + 'Team', + 'changeMemberRole', + { + groupId : group.getId(), + memberId : memberToEdit.getId(), + newRole : newRole + }, + function( res ) + { + app.core.View.toastSuccess( _lc( 'MEMBER_ROLE_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() + { + var contractUnix = null; + + if ( $content.find( '[data-id="input-contract-moment"]' ).first().val().length ) + { + contractUnix = app.util.Helper.getMomentFromInputDate( $content.find( '[data-id="input-contract-moment"]' ).first() ).unix(); + } + + app.gui.PageLoader.show(); + app.core.Rpc.call( + 'Team', + 'changeMemberContract', + { + groupId : group.getId(), + memberId : memberToEdit.getId(), + contract : $content.find( '[data-id="input-contract"]' ).first().val(), + contractDate : contractUnix + }, + function( res ) + { + app.core.View.toastSuccess( _lc( 'MEMBER_CONTRACT_UPDATED' ) ); + app.gui.PageLoader.hide(); + if ( res && res.hasOwnProperty( 'updated_member' ) ) + { + memberToEdit.setGroupData( res.updated_member.teams_js ); + } + } + ); + }); + + $content.on( 'click', '[data-type="appointment-log-item"]', function() + { + app.core.Controller.redirect( '#/appointment/' + $(this).attr( 'data-appointment-id' ) ); + }); + + $content.on( 'click', '[data-id="btn-update-appointment-log"]', function() + { + app.core.View.setContentLoader( + $content.find( '[data-id="container-appointment-log"]' ).first() + ); + fnUpdateAppointmentLog(); + }); + + $content.on( 'click', '[data-id="btn-save-admin-note"]', function() + { + app.gui.PageLoader.show(); + app.core.Rpc.call( + 'Team', + 'updateAdminNote', + { + groupId : group.getId(), + profileId : memberToEdit.getId(), + adminNote : $content.find( '[data-id="textarea-admin-note"]' ).first().val() + }, + function() + { + app.core.View.toastSuccess( _lc( 'ADMIN_NOTE_SAVED' ) ); + app.gui.PageLoader.hide(); + } + ); + + $content.find( '[data-id=""]' ).first().val() + }); + + $content.find( '[data-id="select-profil-id"]' ).first().change( function() + { + app.core.Controller.redirect( '#/group/' + group.getId() + '/membermanagement/' + $(this).val() ); + }); + + $content.find( '[data-id="btn-remove-member"]' ).first().click( function() + { + if ( !memberToEdit ) + { + app.core.View.toastInfo( _lc( 'PLEASE_SELECT_MEMBER' ) ); + return; + } + + if ( 'trainer' == memberToEdit.getRoleInGroup( group.getId() ) ) + { + app.core.View.toastInfo( _lc( 'GROUP_OWNER_CANNOT_BE_REMOVED_FROM_GROUP' ) ); + return; + } + + app.core.View.confirm( + _lc( 'DO_YOU_REALLY_WANT_TO_REMOVE_THIS_MEMBER_FROM_TEAM' ), + function() + { + app.gui.PageLoader.show(); + app.core.Rpc.call( + 'Team', + 'removeMember', + { + groupId : group.getId(), + profileId : memberToEdit.getId() + }, + function( res ) + { + app.core.Controller.redirect( '#/group/' + group.getId() + '/members' ); + app.core.View.toastSuccess( _lc( 'MEMBER_REMOVED' ) ); + } + ); + }, + _lc( 'YES_REMOVE' ) + ); + }); + + fnRenderMemberForm( null ); + + if ( memberId ) + { + $content.find( '[data-id="select-profil-id"]' ).first().val( memberId ); + $content.find( '[data-id="select-profil-id"]' ).first().trigger( 'change' ); + fnUpdateMemberToEdit( memberId ) + } + + app.gui.PageLoader.hide(); + } + ); + }; + + return state; +}; \ No newline at end of file diff --git a/src/client/app/tmpl/group-member-management-member-body-adminnote.html b/src/client/app/tmpl/group-member-management-member-body-adminnote.html new file mode 100644 index 0000000..ad329bb --- /dev/null +++ b/src/client/app/tmpl/group-member-management-member-body-adminnote.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/client/app/tmpl/group-member-management-member-body-appointment-log.html b/src/client/app/tmpl/group-member-management-member-body-appointment-log.html new file mode 100644 index 0000000..e9f06fe --- /dev/null +++ b/src/client/app/tmpl/group-member-management-member-body-appointment-log.html @@ -0,0 +1,62 @@ +
| + <%= _lc( 'COURSE' ) %> + | ++ <%= _lc( 'STARTTIME' ) %> + | ++ <%= _lc( 'ENDTIME' ) %> + | ++ + | +
|---|---|---|---|
|
+ <%= logs[ li ].subject %> + + <%= _lc( 'ATTENDANCE' ) %> + <% if ( 'accepted' === logs[ li ].status ) { %> + (<%= _lc( 'WITH_ACCEPTED_FEEDBACK' ) %>) + <% } else { %> + (<%= _lc( 'WITHOUT_ACCEPTED_FEEDBACK' ) %>) + <% } %> + + |
+ + <%= app.util.Helper.getMomentFromUTCTime( logs[ li ].start_dt ).format( 'DD.MM.YYYY [-] HH:mm' ) %> + | ++ <%= app.util.Helper.getMomentFromUTCTime( logs[ li ].end_dt ).format( 'DD.MM.YYYY [-] HH:mm' ) %> + | ++ + | +
| + <%= _lc( 'NO_LOG_ENTRIES_FOUND' ) %> + | +|||