Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 26 additions & 9 deletions app/assets/javascripts/controllers/admin/members.coffee.erb
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ class MembersController
##
# Controller used in the members/groups management page
##
Application.Controllers.controller "AdminMembersController", ["$scope","$sce", 'membersPromise', 'adminsPromise', 'growl', 'Admin', 'dialogs', '_t', 'Member', 'Export'
, ($scope, $sce, membersPromise, adminsPromise, growl, Admin, dialogs, _t, Member, Export) ->
Application.Controllers.controller "AdminMembersController", ["$scope","$sce", 'membersPromise', 'deactivateMembersPromise', 'adminsPromise', 'growl', 'Admin', 'dialogs', '_t', 'Member', 'Export'
, ($scope, $sce, membersPromise, deactivateMembersPromise, adminsPromise, growl, Admin, dialogs, _t, Member, Export) ->



Expand All @@ -122,6 +122,7 @@ Application.Controllers.controller "AdminMembersController", ["$scope","$sce", '

## members list
$scope.members = membersPromise
$scope.deactivateMembers = deactivateMembersPromise

$scope.member =
## Members plain-text filtering. Default: not filtered
Expand Down Expand Up @@ -179,13 +180,9 @@ Application.Controllers.controller "AdminMembersController", ["$scope","$sce", '
object: ->
title: _t('confirmation_required')
msg: $sce.trustAsHtml(
_t('do_you_really_want_to_remove_this_member') +
_t('do_you_really_want_to_pause_this_member') +
'<br/><br/>' +
_t('notice_member_projects_will_be_deleted') +
'<br/><br/>' +
_t('warning_if_multiple_period_suscription_is_active') +
'<br/><br/>' +
_t('this_may_take_a_while_please_wait')
_t('warning_account_marked_as_inactive')
)
, -> # cancel confirmed
Member.delete id: member.id, ->
Expand All @@ -194,6 +191,26 @@ Application.Controllers.controller "AdminMembersController", ["$scope","$sce", '
, (error)->
growl.error(_t('unable_to_delete_the_member'))

##
# Ask for confirmation then activate the specified member
# @param members {Array} full list of deactivateMembers
# @param member {Object} member to delete
##
$scope.activateMember = (deactivateMembers, member)->
dialogs.confirm
resolve:
object: ->
title: _t('confirmation_required')
msg: $sce.trustAsHtml(
_t('member_is_active')
)
, -> # activate confirmed
Member.activate id: member.id, (member) ->
deactivateMembers.splice(findMemberIdxById(deactivateMembers, member.id), 1)
growl.success(_t('member_successfully_active'))
, (error)->
growl.error(_t('unable_to_active_the_member'))



##
Expand Down Expand Up @@ -295,7 +312,7 @@ Application.Controllers.controller "AdminMembersController", ["$scope","$sce", '
# @param concat {boolean} if true, the result will be append to $scope.members instead of being affected
##
memberSearch = (concat) ->
Member.list { query: { search: $scope.member.searchText, order_by: $scope.member.order, page: $scope.member.page, size: USERS_PER_PAGE } }, (members) ->
Member.list { query: { search: $scope.member.searchText, order_by: $scope.member.order, page: $scope.member.page, size: USERS_PER_PAGE , is_active: true} }, (members) ->
if concat
$scope.members = $scope.members.concat(members)
else
Expand Down
8 changes: 7 additions & 1 deletion app/assets/javascripts/router.coffee.erb
Original file line number Diff line number Diff line change
Expand Up @@ -1010,6 +1010,9 @@ angular.module('application.router', ['ui.router']).
'main@':
templateUrl: '<%= asset_path "admin/members/index.html.erb" %>'
controller: 'AdminMembersController'
'deactivateMembers@app.admin.members':
templateUrl: '<%= asset_path "admin/members/deactivate_members.html.erb" %>'
controller: 'AdminMembersController'
'groups@app.admin.members':
templateUrl: '<%= asset_path "admin/groups/index.html.erb" %>'
controller: 'GroupsController'
Expand All @@ -1021,7 +1024,7 @@ angular.module('application.router', ['ui.router']).
controller: 'AuthentificationController'
resolve:
membersPromise: ['Member', (Member)->
Member.list({ query: { search: '', order_by: 'id', page: 1, size: 20 } }).$promise
Member.list({ query: { search: '', order_by: 'id', page: 1, size: 20, is_active: true} }).$promise
]
adminsPromise: ['Admin', (Admin)->
Admin.query().$promise
Expand All @@ -1035,6 +1038,9 @@ angular.module('application.router', ['ui.router']).
authProvidersPromise: ['AuthProvider', (AuthProvider)->
AuthProvider.query().$promise
]
deactivateMembersPromise: ['Member', (Member)->
Member.list({ query: { is_active: 'f', search: '', order_by: 'id', page: 1, size: 20, is_active: false } }).$promise
]
translations: [ 'Translations', (Translations) ->
Translations.query('app.admin.members').$promise
]
Expand Down
4 changes: 4 additions & 0 deletions app/assets/javascripts/services/member.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,8 @@ Application.Services.factory 'Member', ["$resource", ($resource)->
mapping:
method: 'GET'
url: '/api/members/mapping'
activate:
method: 'POST'
url: '/api/members/activate'
isArray: false
]
73 changes: 73 additions & 0 deletions app/assets/templates/admin/members/deactivate_members.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<div class="col-md-12">
<table class="table">
<thead>
<tr>
<th style="width:15%">
<a href="" ng-click="setOrderMember('last_name')">{{ 'surname' | translate }}
<i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='last_name', 'fa fa-sort-alpha-desc': member.order=='-last_name', 'fa fa-arrows-v': member.order }"></i>
</a>
</th>

<th style="width:15%">
<a href="" ng-click="setOrderMember('first_name')">{{ 'first_name' | translate }}
<i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='first_name', 'fa fa-sort-alpha-desc': member.order=='-first_name', 'fa fa-arrows-v': member.order }"></i>
</a>
</th>

<th style="width:15%" class="hidden-xs">
<a href="" ng-click="setOrderMember('email')">{{ 'email' | translate }}
<i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='email', 'fa fa-sort-alpha-desc': member.order=='-email', 'fa fa-arrows-v': member.order }"></i>
</a>
</th>

<th style="width:10%" class="hidden-xs hidden-sm hidden-md">
<a href="" ng-click="setOrderMember('phone')">{{ 'phone' | translate }}
<i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': member.order=='phone', 'fa fa-sort-numeric-desc': member.order=='-phone', 'fa fa-arrows-v': member.order }"></i>
</a>
</th>

<th style="width:20%" class="hidden-xs hidden-sm">
<a href="" ng-click="setOrderMember('group')">{{ 'user_type' | translate }}
<i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='group', 'fa fa-sort-alpha-desc': member.order=='-group', 'fa fa-arrows-v': member.order }"></i>
</a>
</th>

<th style="width:15%" class="hidden-xs hidden-sm hidden-md">
<a href="" ng-click="setOrderMember('plan')">{{ 'subscription' | translate }}
<i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': member.order=='plan', 'fa fa-sort-alpha-desc': member.order=='-plan', 'fa fa-arrows-v': member.order }"></i>
</a>
</th>

<th style="width:10%"></th>
</tr>
</thead>

<tbody>
<tr ng-repeat="_member in deactivateMembers">
<td class="text-c">{{ _member.profile.last_name }}</td>
<td class="text-c">{{ _member.profile.first_name }}</td>
<td class="hidden-xs">{{ _member.email }}</td>
<td class="hidden-xs hidden-sm hidden-md">{{ _member.profile.phone }}</td>
<td class="text-u-c text-sm hidden-xs hidden-sm">{{ _member.group.name }}</td>
<td class="hidden-xs hidden-sm hidden-md">{{ _member.subscribed_plan | humanReadablePlanName }}</td>
<td>
<div class="buttons">
<button class="btn btn-default" ui-sref="app.admin.members_edit({id: _member.id})">
<i class="fa fa-edit"></i> {{ 'edit' | translate }}
</button>
<span class="label label-danger text-white" ng-show="_member.need_completion" translate>{{ 'incomplete_profile' }}</span>
</div>
</td>
<td>
<button class="btn btn-success" ng-click="activateMember(deactivateMembers, _member)">
<i class="fas fa-play"></i>
</button>
</td>
</tr>
</tbody>
</table>

<div class="text-center">
<button class="btn btn-warning" ng-click="showNextMembers()" ng-hide="member.noMore"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'display_more_users' | translate }}</button>
</div>
</div>
7 changes: 6 additions & 1 deletion app/assets/templates/admin/members/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<div class="col-xs-10 col-sm-10 col-md-8 b-l">
<section class="heading-title">
<h1 translate>{{ 'users_management' }}</h1>
</section>
</
</div>

</div>
Expand Down Expand Up @@ -38,6 +38,11 @@
<uib-tab heading="{{ 'authentication' | translate }}">
<div ui-view="authentification"></div>
</uib-tab>

<uib-tab heading="{{ 'deactivate_members' | translate }}">
<div ui-view="deactivateMembers"></div>
</uib-tab>

</uib-tabset>
</div>
</div>
Expand Down
1 change: 0 additions & 1 deletion app/assets/templates/admin/members/members.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
</a>
<iframe name="export-frame" height="0" width="0" class="none"></iframe>
</div>

<table class="table">
<thead>
<tr>
Expand Down
12 changes: 10 additions & 2 deletions app/controllers/api/members_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,19 @@ def update

def destroy
authorize User
STDERR.puts "IN THE DESTROY FUNCTION"
@member.soft_destroy
sign_out(@member) unless current_user.is_admin?
head :no_content
end

def activate
@member = User.friendly.find(params[:id])
STDERR.puts "IN THE ACTIVATE FUNCTION"
@member.activate_member
head :no_content
end

# export subscriptions
def export_subscriptions
authorize :export
Expand Down Expand Up @@ -168,7 +176,7 @@ def merge
def list
authorize User

p = params.require(:query).permit(:search, :order_by, :page, :size)
p = params.require(:query).permit(:search, :order_by, :page, :size, :is_active)

unless p[:page].is_a? Integer
render json: {error: 'page must be an integer'}, status: :unprocessable_entity
Expand Down Expand Up @@ -201,7 +209,7 @@ def list

@query = User.includes(:profile, :group, :subscriptions)
.joins(:profile, :group, :roles, 'LEFT JOIN "subscriptions" ON "subscriptions"."user_id" = "users"."id" LEFT JOIN "plans" ON "plans"."id" = "subscriptions"."plan_id"')
.where("users.is_active = 'true' AND roles.name = 'member'")
.where("users.is_active = #{p[:is_active]} AND roles.name = 'member'")
.order("#{order_key} #{direction}")
.page(p[:page])
.per(p[:size])
Expand Down
6 changes: 5 additions & 1 deletion app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,11 @@ def stripe_customer

def soft_destroy
update_attribute(:is_active, false)
uninvolve_from_projects
# uninvolve_from_projects
end

def activate_member
update_attribute(:is_active, true)
end

def uninvolve_from_projects
Expand Down
6 changes: 6 additions & 0 deletions config/locales/app.admin.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,8 @@ en:
authentication: "Authentication"
do_you_really_want_to_delete_this_administrator_this_cannot_be_undone: "Do you really want to delete this administrator? This cannot be undone."
do_you_really_want_to_remove_this_member: "Do you really want to remove this member? It will be marked as inactive and will be hidden."
do_you_really_want_to_pause_this_member: "Do you really want to pause this member account?"
warning_account_marked_as_inactive: "It will be marked as inactive and will no longer be able to access the features for members in the platform until its account is reactivated."
notice_member_projects_will_be_deleted: "All of the user project records will be deleted. This can not be undone."
warning_if_multiple_period_suscription_is_active: "Warning: If the user has a current enrollment membership with multiple payment periods, the subscription must be stoped from the Stripe account dashboard."
this_may_take_a_while_please_wait: "Warning: This may take a while, please be patient."
Expand All @@ -439,6 +441,10 @@ en:
state: "State"
unknown: "Unknown: "
active: "Active"
member_is_active: "Do you really want to active this member?"
member_successfully_active: "Member successfully active"
unable_to_active_the_member: "Unable to active Member"
deactivate_members: "Deactivate Members"
pending: "Pending"
previous_provider: "Previous provider"
do_you_really_want_to_delete_the_TYPE_authentication_provider_NAME: "Do you really want to delete the {{TYPE}} authentication provider: {{NAME}}?" # angular interpolation
Expand Down
2 changes: 2 additions & 0 deletions config/locales/app.admin.es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,8 @@ es:
groups: "Grupos"
authentication: "Autenticación"
do_you_really_want_to_delete_this_administrator_this_cannot_be_undone: "¿Desea realmente eliminar este administrador? Esto no se puede deshacer."
do_you_really_want_to_pause_this_member: "¿Desea realmente pausar este usuario?."
warning_account_marked_as_inactive: "Se marcará como inactivo y ya no podrá acceder a las funciones para los usuarios de la plataforma hasta que se reactive su cuenta."
this_may_take_a_while_please_wait: "Advertencia: esto puede tomar un tiempo, por favor, tenga paciencia."
administrator_successfully_deleted: "Administrador eliminado correctamente."
unable_to_delete_the_administrator: "No se puede eliminar el administrador."
Expand Down
2 changes: 2 additions & 0 deletions config/locales/app.admin.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,8 @@ fr:
groups: "Groupes"
authentication: "Authentification"
do_you_really_want_to_delete_this_administrator_this_cannot_be_undone: "Êtes-vous sûr de vouloir supprimer cet administrateur ? Cette opération est irréversible."
do_you_really_want_to_pause_this_member: "Voulez-vous vraiment mettre en pause ce compte membre?"
warning_account_marked_as_inactive: "Il sera marqué comme inactif et ne pourra plus accéder aux fonctionnalités des membres de la plate-forme tant que son compte ne sera pas réactivé."
this_may_take_a_while_please_wait: "Attention : ceci peut prendre un certain temps, merci de patienter."
administrator_successfully_deleted: "L'administrateur a bien été supprimé."
unable_to_delete_the_administrator: "L'administrateur n'a pas pu être supprimé."
Expand Down
2 changes: 2 additions & 0 deletions config/locales/app.admin.pt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,8 @@ pt:
groups: "Grupos"
authentication: "Autenticação"
do_you_really_want_to_delete_this_administrator_this_cannot_be_undone: "Você realmente deseja excluir este administrador? Isso não pode ser revertido."
do_you_really_want_to_pause_this_member: "Você realmente deseja pausar essa conta de membro?"
warning_account_marked_as_inactive: "Ele será marcado como inativo e não poderá mais acessar os recursos dos membros da plataforma até que sua conta seja reativada."
this_may_take_a_while_please_wait: "Atenção: Isso pode demorar um pouco, por favor, seja paciente."
administrator_successfully_deleted: "Administrator excluído com sucesso."
unable_to_delete_the_administrator: "Impossível excluir administrador."
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
post 'list', action: 'list', on: :collection
get 'search/:query', action: 'search', on: :collection
get 'mapping', action: 'mapping', on: :collection
post 'activate', action: 'activate', on: :collection
end
resources :reservations, only: [:show, :create, :index, :update]
resources :notifications, only: [:index, :show, :update] do
Expand Down