diff --git a/apps/maarch_entreprise/Views/users-administration.component.html b/apps/maarch_entreprise/Views/users-administration.component.html index 6cb67314451b7251dc4e231b2f4f2d4dce623661..e5220d643412e4f693b11d12b6e791519b150760 100644 --- a/apps/maarch_entreprise/Views/users-administration.component.html +++ b/apps/maarch_entreprise/Views/users-administration.component.html @@ -47,16 +47,24 @@ <td>{{user.mail}}</td> <td style="text-align:right;"> <div class="btn-group" role="group" aria-label="..."> - <button routerLink="/administration/user/{{user.user_id}}" type="button" class="btn btn-default" title="{{lang.edit}}"> + <button routerLink="/administration/users/{{user.user_id}}" type="button" class="btn btn-default" title="{{lang.edit}}"> <a><i style="cursor:pointer" class="fa fa-edit"></i></a> </button> - <button type="button" class="btn btn-default" title="{{lang.suspend}}" *ngIf="user.enabled == 'Y'" (click)="suspendUser(user)"> - <a><i style="cursor:pointer;color: #f0ad4e"class="fa fa-pause"></i></a> + + <button *ngIf="user.enabled == 'Y' && user.inDiffListDest == 'Y'" data-toggle="modal" data-target="#changeDiffListDest" type="button" class="btn btn-default" title="{{lang.suspend}}" (click)="suspendUser(user)"> + <a><i style="cursor:pointer;color:#f0ad4e;" class="fa fa-pause"></i></a> + </button> + <button *ngIf="user.enabled == 'Y' && user.inDiffListDest == 'N'" type="button" class="btn btn-default" title="{{lang.suspend}}" (click)="suspendUser(user)"> + <a><i style="cursor:pointer;color:#f0ad4e;" class="fa fa-pause"></i></a> </button> - <button type="button" class="btn btn-default" title="{{lang.reactivate}}" *ngIf="user.enabled == 'N'" (click)="activateUser(user)"> - <a><i style="cursor:pointer;color: #5cb85c" class="fa fa-check"></i></a> + + <button *ngIf="user.enabled == 'N'" type="button" class="btn btn-default" title="{{lang.authorize}}" (click)="activateUser(user)"> + <a><i style="cursor:pointer;color:#5cb85c;" class="fa fa-check"></i></a> + </button> + <button *ngIf="user.inDiffListDest == 'Y'" type="button" class="btn btn-default" title="{{lang.delete}}" data-toggle="modal" data-target="#changeDiffListDest" (click)="deleteUser(user)"> + <a><i style="cursor:pointer;color: #D9534F" class="fa fa-trash"></i></a> </button> - <button type="button" class="btn btn-default" title="{{lang.delete}}" (click)="deleteUser(user.user_id)"> + <button *ngIf="user.inDiffListDest == 'N'" type="button" class="btn btn-default" title="{{lang.delete}}" (click)="deleteUser(user)"> <a><i style="cursor:pointer;color: #D9534F" class="fa fa-trash"></i></a> </button> </div> @@ -67,3 +75,35 @@ </div> </div> +<div class="modal fade" id="changeDiffListDest" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="myModalLabel">Changement de destinataire des modèles de liste de diffusion</h4> + </div> + <form (ngSubmit)="onSubmit()" #changeDiffListDestForm="ngForm"> + <div class="modal-body"> + <div class="alert alert-warning" role="alert"> + <b>{{this.userDestRedirect.firstname}} {{this.userDestRedirect.lastname}}</b> est en <b>destinataire</b> des modèles liste de difffusion suivante, veuillez choisir un utilisateur de <b>remplacement</b> : + </div> + <div *ngFor="let userDestRedirectModel of userDestRedirectModels" id="{{userDestRedirectModel.object_id}}" class="form-group"> + <div class="input-group input-group-sm"> + <span class="input-group-addon" id="sizing-addon1"><i class="fa fa-share-alt-square"></i> {{userDestRedirectModel.object_id}} - {{userDestRedirectModel.description}}</span> + <div class="form-group typeahead__container" style="margin-bottom:0px;"> + <div class="typeahead__field"> + <input name="redirectDest_{{userDestRedirectModel.object_id}}" [(ngModel)]="userDestRedirectModel.redirectUserId" type="text" class="form-control redirectDest" placeholder="Utilisateur" autocomplete="off" aria-describedby="sizing-addon1" required> + </div> + </div> + </div> + </div> + + </div> + <div class="modal-footer"> + <button *ngIf="userDestRedirect.mode == 'del'" type="button" class="btn btn-danger" (click)="deleteUserModal(userDestRedirect)" [disabled]="!changeDiffListDestForm.form.valid">{{lang.delete}} {{lang.user}}</button> + <button *ngIf="userDestRedirect.mode == 'up'" type="button" class="btn btn-warning" (click)="suspendUserModal(userDestRedirect)" [disabled]="!changeDiffListDestForm.form.valid">{{lang.suspend}} {{lang.user}}</button> + </div> + </form> + </div> + </div> +</div> diff --git a/apps/maarch_entreprise/css/users-administration.component.css b/apps/maarch_entreprise/css/users-administration.component.css index 1e9030fb12316e3059d9dc5d09249d78bd2d5c48..10b1126c69a30a635fd83cd0698b5cd91f856609 100644 --- a/apps/maarch_entreprise/css/users-administration.component.css +++ b/apps/maarch_entreprise/css/users-administration.component.css @@ -16,4 +16,33 @@ nav{ margin-top:10px !important; margin-bottom: 0px !important; +} + +.modal-content{ + background-color: #009DC5 !important; +} +.modal-header h4{ + color: white !important; + +} + +.modal-body{ + background-color: white; + padding:10px; + max-height: 70vh; + overflow: auto; + +} + +.modal-body .list-group li{ + /*border-color: #009DC5 !important;*/ + font-weight: bold; +} + +.modal-footer{ + background:white; +} + +button:disabled{ + opacity:0.3 !important; } \ No newline at end of file diff --git a/apps/maarch_entreprise/js/angular/app/users-administration.component.js b/apps/maarch_entreprise/js/angular/app/users-administration.component.js index aa4aeb79303cbe0651d8d976f273a689573182cc..8d08cc90884cfc08ab056d1cbbe377f9214fee84 100644 --- a/apps/maarch_entreprise/js/angular/app/users-administration.component.js +++ b/apps/maarch_entreprise/js/angular/app/users-administration.component.js @@ -16,6 +16,8 @@ var UsersAdministrationComponent = (function () { function UsersAdministrationComponent(http) { this.http = http; this.users = []; + this.userDestRedirect = {}; + this.userDestRedirectModels = []; this.lang = {}; this.resultInfo = ""; this.loading = false; @@ -62,18 +64,76 @@ var UsersAdministrationComponent = (function () { }, 0); _this.loading = false; }, function (err) { + console.log(err); location.href = "index.php"; }); }; UsersAdministrationComponent.prototype.suspendUser = function (user) { + var _this = this; + if (user.inDiffListDest == 'Y') { + user.mode = 'up'; + this.userDestRedirect = user; + this.http.get(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id') + .map(function (res) { return res.json(); }) + .subscribe(function (data) { + _this.userDestRedirectModels = data.listModels; + setTimeout(function () { + $j(".redirectDest").typeahead({ + order: "asc", + display: "formattedUser", + templateValue: "{{user_id}}", + source: { + ajax: { + type: "GET", + dataType: "json", + url: _this.coreUrl + "rest/users/autocompleter/exclude/" + user.user_id, + } + } + }); + }, 0); + }, function (err) { + console.log(err); + location.href = "index.php"; + }); + } + else { + var r = confirm(this.lang.suspendMsg + ' ?'); + if (r) { + user.enabled = 'N'; + this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user) + .map(function (res) { return res.json(); }) + .subscribe(function (data) { + if (data.errors) { + user.enabled = 'Y'; + _this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + else { + _this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + }); + } + } + }; + UsersAdministrationComponent.prototype.suspendUserModal = function (user) { var _this = this; var r = confirm(this.lang.suspendMsg + ' ?'); if (r) { user.enabled = 'N'; - this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user) + user.redirectListModels = this.userDestRedirectModels; + //first, update listModels + this.http.put(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id', user) .map(function (res) { return res.json(); }) .subscribe(function (data) { if (data.errors) { + user.enabled = 'Y'; _this.resultInfo = data.errors; $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { @@ -81,12 +141,41 @@ var UsersAdministrationComponent = (function () { }); } else { - _this.resultInfo = data.success; - $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); - $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { - $j("#resultInfo").slideUp(500); + //then suspend user + _this.http.put(_this.coreUrl + 'rest/users/' + user.user_id, user) + .map(function (res) { return res.json(); }) + .subscribe(function (data) { + if (data.errors) { + user.enabled = 'Y'; + _this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + else { + user.inDiffListDest = 'N'; + $j('#changeDiffListDest').modal('hide'); + _this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + }, function (err) { + _this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); }); } + }, function (err) { + _this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); }); } }; @@ -95,10 +184,11 @@ var UsersAdministrationComponent = (function () { var r = confirm(this.lang.authorizeMsg + ' ?'); if (r) { user.enabled = 'Y'; - this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user) + this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user) .map(function (res) { return res.json(); }) .subscribe(function (data) { if (data.errors) { + user.enabled = 'N'; _this.resultInfo = data.errors; $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { @@ -112,14 +202,81 @@ var UsersAdministrationComponent = (function () { $j("#resultInfo").slideUp(500); }); } + }, function (err) { + _this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + }); + } + }; + UsersAdministrationComponent.prototype.deleteUser = function (user) { + var _this = this; + if (user.inDiffListDest == 'Y') { + user.mode = 'del'; + this.userDestRedirect = user; + this.http.get(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id') + .map(function (res) { return res.json(); }) + .subscribe(function (data) { + _this.userDestRedirectModels = data.listModels; + setTimeout(function () { + $j(".redirectDest").typeahead({ + order: "asc", + source: { + ajax: { + type: "GET", + dataType: "json", + url: _this.coreUrl + "rest/users/autocompleter/exclude/" + user.user_id, + } + } + }); + }); + }, function (err) { + _this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); }); } + else { + var r = confirm(this.lang.deleteMsg + ' ?'); + if (r) { + this.http.delete(this.coreUrl + 'rest/users/' + user.user_id, user) + .map(function (res) { return res.json(); }) + .subscribe(function (data) { + if (data.errors) { + _this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + else { + for (var i = 0; i < _this.users.length; i++) { + if (_this.users[i].user_id == user.user_id) { + _this.users.splice(i, 1); + } + } + _this.table.row($j("#" + user.user_id)).remove().draw(); + _this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + }); + } + } }; - UsersAdministrationComponent.prototype.deleteUser = function (id) { + UsersAdministrationComponent.prototype.deleteUserModal = function (user) { var _this = this; var r = confirm(this.lang.deleteMsg + ' ?'); if (r) { - this.http.delete(this.coreUrl + 'rest/user/' + id) + user.redirectListModels = this.userDestRedirectModels; + //first, update listModels + this.http.put(this.coreUrl + 'rest/listModels/itemId/' + user.user_id + '/itemMode/dest/objectType/entity_id', user) .map(function (res) { return res.json(); }) .subscribe(function (data) { if (data.errors) { @@ -130,18 +287,40 @@ var UsersAdministrationComponent = (function () { }); } else { - for (var i = 0; i < _this.users.length; i++) { - if (_this.users[i].user_id == id) { - _this.users.splice(i, 1); + //then delete user + _this.http.delete(_this.coreUrl + 'rest/users/' + user.user_id) + .map(function (res) { return res.json(); }) + .subscribe(function (data) { + if (data.errors) { + _this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); + } + else { + user.inDiffListDest = 'N'; + $j('#changeDiffListDest').modal('hide'); + for (var i = 0; i < _this.users.length; i++) { + if (_this.users[i].user_id == user.user_id) { + _this.users.splice(i, 1); + } + } + _this.table.row($j("#" + user.user_id)).remove().draw(); + _this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); } - } - _this.table.row($j("#" + id)).remove().draw(); - _this.resultInfo = data.success; - $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); - $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { - $j("#resultInfo").slideUp(500); }); } + }, function (err) { + _this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function () { + $j("#resultInfo").slideUp(500); + }); }); } }; diff --git a/apps/maarch_entreprise/js/angular/app/users-administration.component.ts b/apps/maarch_entreprise/js/angular/app/users-administration.component.ts index dba6242704732f7f250b3af4ef2d3ba2c646507d..0f68d03b3b76d0f8e4d4c3fd35ac5ee608e7896a 100644 --- a/apps/maarch_entreprise/js/angular/app/users-administration.component.ts +++ b/apps/maarch_entreprise/js/angular/app/users-administration.component.ts @@ -16,6 +16,9 @@ export class UsersAdministrationComponent implements OnInit { coreUrl : string; users : any[] = []; + userDestRedirect : any = {}; + userDestRedirectModels : any[] = []; + lang : any = {}; table : any @@ -67,38 +70,127 @@ export class UsersAdministrationComponent implements OnInit { $j('dataTables_filter input').addClass('form-control'); $j(".datatablesLeft").css({"float":"left"}); $j(".datatablesCenter").css({"text-align":"center"}); - $j(".datatablesRight").css({"float":"right"}); + $j(".datatablesRight").css({"float":"right"}); + }, 0); this.loading = false; }, (err) => { + console.log(err); location.href = "index.php"; }); } suspendUser(user: any) { + if(user.inDiffListDest == 'Y') { + user.mode = 'up'; + this.userDestRedirect = user; + this.http.get(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id') + .map(res => res.json()) + .subscribe((data) => { + this.userDestRedirectModels = data.listModels; + setTimeout(() => { + $j(".redirectDest").typeahead({ + order: "asc", + display: "formattedUser", + templateValue: "{{user_id}}", + source: { + ajax: { + type: "GET", + dataType: "json", + url: this.coreUrl + "rest/users/autocompleter/exclude/"+user.user_id, + } + } + }); + }, 0); + + }, (err) => { + console.log(err); + location.href = "index.php"; + }); + + }else{ + let r = confirm(this.lang.suspendMsg+' ?'); + + if (r) { + user.enabled = 'N'; + this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user) + .map(res => res.json()) + .subscribe((data) => { + if (data.errors) { + user.enabled = 'Y'; + this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } else { + this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } + }); + } + } + } + + suspendUserModal(user: any) { let r = confirm(this.lang.suspendMsg+' ?'); if (r) { user.enabled = 'N'; - this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user) + user.redirectListModels = this.userDestRedirectModels; + //first, update listModels + this.http.put(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id', user) .map(res => res.json()) .subscribe((data) => { if (data.errors) { + user.enabled = 'Y'; this.resultInfo = data.errors; $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ $j("#resultInfo").slideUp(500); }); } else { - this.resultInfo = data.success; - $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); - $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ - $j("#resultInfo").slideUp(500); - }); + //then suspend user + this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user) + .map(res => res.json()) + .subscribe((data) => { + if (data.errors) { + user.enabled = 'Y'; + this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } else { + user.inDiffListDest = 'N'; + $j('#changeDiffListDest').modal('hide'); + this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } + }, (err) => { + this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + }); } + }, (err) => { + this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); }); + }); } + } activateUser(user: any) { @@ -106,10 +198,11 @@ export class UsersAdministrationComponent implements OnInit { if (r) { user.enabled = 'Y'; - this.http.put(this.coreUrl + 'rest/user/' + user.user_id, user) + this.http.put(this.coreUrl + 'rest/users/' + user.user_id, user) .map(res => res.json()) .subscribe((data) => { if (data.errors) { + user.enabled = 'N'; this.resultInfo = data.errors; $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ @@ -122,15 +215,85 @@ export class UsersAdministrationComponent implements OnInit { $j("#resultInfo").slideUp(500); }); } + }, (err) => { + this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + }); + } + } + + deleteUser(user: any) { + + if(user.inDiffListDest == 'Y') { + user.mode = 'del'; + this.userDestRedirect = user; + this.http.get(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id') + .map(res => res.json()) + .subscribe((data) => { + this.userDestRedirectModels = data.listModels; + + setTimeout(() => { + $j(".redirectDest").typeahead({ + order: "asc", + source: { + ajax: { + type: "GET", + dataType: "json", + url: this.coreUrl + "rest/users/autocompleter/exclude/"+user.user_id, + } + } + }); + }); + + }, (err) => { + this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); }); + }); + + }else{ + let r = confirm(this.lang.deleteMsg+' ?'); + + if (r) { + this.http.delete(this.coreUrl + 'rest/users/' + user.user_id, user) + .map(res => res.json()) + .subscribe((data) => { + if (data.errors) { + this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } else { + for (var i = 0;i<this.users.length;i++) { + if(this.users[i].user_id == user.user_id){ + this.users.splice(i,1); + } + } + this.table.row($j("#"+user.user_id)).remove().draw(); + this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } + }); + } } } + deleteUserModal(user: any) { - deleteUser(id: string) { let r = confirm(this.lang.deleteMsg+' ?'); if (r) { - this.http.delete(this.coreUrl + 'rest/user/' + id) + user.redirectListModels = this.userDestRedirectModels; + //first, update listModels + this.http.put(this.coreUrl + 'rest/listModels/itemId/'+user.user_id+'/itemMode/dest/objectType/entity_id', user) .map(res => res.json()) .subscribe((data) => { if (data.errors) { @@ -140,19 +303,42 @@ export class UsersAdministrationComponent implements OnInit { $j("#resultInfo").slideUp(500); }); } else { - for(var i = 0;i<this.users.length;i++){ - if(this.users[i].user_id == id){ - this.users.splice(i,1); - } - } - this.table.row($j("#"+id)).remove().draw(); - this.resultInfo = data.success; - $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); - $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ - $j("#resultInfo").slideUp(500); - }); + //then delete user + this.http.delete(this.coreUrl + 'rest/users/' + user.user_id) + .map(res => res.json()) + .subscribe((data) => { + if (data.errors) { + this.resultInfo = data.errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } else { + user.inDiffListDest = 'N'; + $j('#changeDiffListDest').modal('hide'); + for (var i = 0;i<this.users.length;i++) { + if(this.users[i].user_id == user.user_id){ + this.users.splice(i,1); + } + } + this.table.row($j("#"+user.user_id)).remove().draw(); + + this.resultInfo = data.success; + $j('#resultInfo').removeClass().addClass('alert alert-success alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); + }); + } + }); } + }, (err) => { + this.resultInfo = JSON.parse(err._body).errors; + $j('#resultInfo').removeClass().addClass('alert alert-danger alert-dismissible'); + $j("#resultInfo").fadeTo(3000, 500).slideUp(500, function(){ + $j("#resultInfo").slideUp(500); }); + }); } + } } diff --git a/apps/maarch_entreprise/lang/fr.php b/apps/maarch_entreprise/lang/fr.php index d861c65ae068273c3b8ee30737b6ce4795e8e0ec..d73660aa0aa0cd48a9620837f046927b63dbc773 100755 --- a/apps/maarch_entreprise/lang/fr.php +++ b/apps/maarch_entreprise/lang/fr.php @@ -204,7 +204,8 @@ if (!defined("_REALLY_DELETE")) define("_REALLY_DELETE", "Voulez-vous vraiment s if (!defined("_REALLY_CONTINUE")) define("_REALLY_CONTINUE", "Voulez-vous vraiment continuer "); if (!defined("_DEFINITIVE_ACTION")) define("_DEFINITIVE_ACTION", "Cette action est définitive"); if (!defined("_AND")) define("_AND", " et "); -if (!defined("_PLEASE_CHECK_LISTDIFF")) define("_PLEASE_CHECK_LISTDIFF", " est dans une ou des listes de diffusion. Veuillez le remplacer dans la ou les listes de "); +//if (!defined("_PLEASE_CHECK_LISTDIFF")) define("_PLEASE_CHECK_LISTDIFF", " est dans une ou des listes de diffusion. Veuillez le remplacer dans la ou les listes de "); +if (!defined("_PLEASE_CHECK_LISTDIFF")) define("_PLEASE_CHECK_LISTDIFF", "L'utilisateur est présent en tant que destinataire d'un ou plusieurs modèle(s) de liste de diffusion, veuillez le remplacer par un autre utilisateur."); if (!defined("_THE_USER_JS")) define("_THE_USER_JS", "L\'utilisateur "); diff --git a/core/Controllers/UserController.php b/core/Controllers/UserController.php index dd8c2e6eb64619bb5b0867dc587f6d5933bfa954..54c4ad6e91b5b478b4392babb05864f208c9a0f3 100644 --- a/core/Controllers/UserController.php +++ b/core/Controllers/UserController.php @@ -24,6 +24,7 @@ use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Respect\Validation\Validator; use Core\Models\UserModel; +use Entities\Models\ListModelsModel; include_once 'core/class/docservers_controler.php'; include_once 'core/class/class_history.php'; @@ -102,6 +103,49 @@ class UserController return $response->withJson(['success' => _DELETED_USER]); } + + public function suspendUser(RequestInterface $request, ResponseInterface $response, $aArgs) + { + if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $_SESSION['user']['UserId'], 'location' => 'apps', 'type' => 'admin'])) { + return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); + } + if ($_SESSION['user']['UserId'] != 'superadmin') { + $entities = EntitiesModel::getAllEntitiesByUserId(['userId' => $_SESSION['user']['UserId']]); + $users = UserModel::getByEntities([ + 'select' => ['users.user_id'], + 'entities' => $entities + ]); + $allowed = false; + foreach ($users as $value) { + if ($value['user_id'] == $aArgs['userId']) { + $allowed = true; + } + } + if (!$allowed) { + return $response->withStatus(403)->withJson(['errors' => 'UserId out of perimeter']); + } + } else { + $user = UserModel::getById(['userId' => $aArgs['userId']]); + if (empty($user)) { + return $response->withStatus(400)->withJson(['errors' => 'User not found']); + } + } + $data = $request->getParams(); + if (!$this->checkNeededParameters(['data' => $data, 'needed' => ['firstname', 'lastname']]) + || (!empty($data['mail']) && !filter_var($data['mail'], FILTER_VALIDATE_EMAIL)) + || (!empty($data['phone']) && !preg_match("/^(?:0|\+\d\d\s?)[1-9]([\.\-\s]?\d\d){4}$/", $data['phone']))) { + return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); + } + + //update user + $r = UserModel::update(['userId' => $aArgs['userId'], 'user' => $data]); + + if (!$r) { + return $response->withStatus(500)->withJson(['errors' => 'User Update Error']); + } + + return $response->withJson(['success' => _USER_UPDATED]); + } public function updateProfile(RequestInterface $request, ResponseInterface $response) { @@ -408,6 +452,22 @@ class UserController return $response->withJson($users); } + public function getUsersForAutocompletionWithExclusion(RequestInterface $request, ResponseInterface $response, $aArgs) + { + $excludeUsers = ['superadmin',$aArgs['userId']]; + $users = UserModel::get([ + 'select' => ['user_id', 'firstname', 'lastname'], + 'where' => ['enabled = ?', 'status != ?', 'user_id not in (?)'], + 'data' => ['Y', 'DEL', $excludeUsers] + ]); + + foreach ($users as $key => $value) { + $users[$key]['formattedUser'] = "{$value['firstname']} {$value['lastname']} ({$value['user_id']})"; + } + + return $response->withJson($users); + } + public function getUsersForAdministration(RequestInterface $request, ResponseInterface $response) { if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $_SESSION['user']['UserId'], 'location' => 'apps', 'type' => 'admin'])) { @@ -426,6 +486,28 @@ class UserController 'entities' => $entities ]); } + + $usersId = []; + foreach ($users as $value) { + $usersId[] = $value['user_id']; + } + + $listModels = ListModelsModel::getDiffListByUsersId(['select' => 'item_id', 'users_id' => $usersId, 'object_type' => 'entity_id', 'item_mode' => 'dest']); + + $usersListModels = []; + foreach ($listModels as $value) { + $usersListModels[] = $value['item_id']; + } + + foreach ($users as $key => $value) { + + if (in_array($value['user_id'], $usersListModels)) { + $users[$key]['inDiffListDest'] = 'Y'; + } else { + $users[$key]['inDiffListDest'] = 'N'; + } + } + $return['lang'] = LangModel::getUsersForAdministrationLang(); $return['users'] = $users; return $response->withJson($return); diff --git a/core/Models/LangModelAbstract.php b/core/Models/LangModelAbstract.php index e54e8dd0eaa5f7e4911a171c032ea7e981bda432..4a8e7cc5dd15151dcfd1da45b8d06d9e67e4b86c 100644 --- a/core/Models/LangModelAbstract.php +++ b/core/Models/LangModelAbstract.php @@ -189,6 +189,7 @@ class LangModelAbstract 'absent' => _MISSING, 'edit' => _MODIFY, 'suspend' => _SUSPEND, + 'authorize' => _AUTHORIZE, 'delete' => _DELETE, 'users' => _USERS, 'admin' => _ADMIN, @@ -200,7 +201,9 @@ class LangModelAbstract 'search' => _SEARCH, 'deleteMsg' => _REALLY_DELETE, 'suspendMsg' => _REALLY_SUSPEND, - 'authorizeMsg' => _REALLY_AUTHORIZE + 'authorizeMsg' => _REALLY_AUTHORIZE, + 'checkListDiffMsg' => _PLEASE_CHECK_LISTDIFF, + 'user' => _USER ]; return $aLang; diff --git a/modules/entities/Controllers/ListModelsController.php b/modules/entities/Controllers/ListModelsController.php new file mode 100644 index 0000000000000000000000000000000000000000..c78e693eaf5d77b97da14f289e7635f052ec27b9 --- /dev/null +++ b/modules/entities/Controllers/ListModelsController.php @@ -0,0 +1,53 @@ +<?php + +/** +* Copyright Maarch since 2008 under licence GPLv3. +* See LICENCE.txt file at the root folder for more details. +* This file is part of Maarch software. +* +*/ + +/** +* @brief Resource Controller +* @author dev@maarch.org +* @ingroup core +*/ + +namespace Entities\Controllers; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Respect\Validation\Validator; +use Entities\Models\ListModelsModel; +use Core\Models\UserModel; + + +class ListModelsController +{ + + public function getListModelsDiffListDestByUserId(RequestInterface $request, ResponseInterface $response, $aArgs) + { + $return['listModels'] = ListModelsModel::getDiffListByUserId(['select' => ['object_id','description'], 'itemId' => $aArgs['itemId'],'objectType' => $aArgs['objectType'],'itemMode' => $aArgs['itemMode']]); + + return $response->withJson($return); + } + + public function updateListModelsDiffListDestByUserId(RequestInterface $request, ResponseInterface $response, $aArgs) + { + $data = $request->getParams(); + + foreach ($data['redirectListModels'] as $listModel) { + $user = UserModel::getById(['userId' => $listModel['redirectUserId']]); + $userId = $listModel['redirectUserId']; + if (empty($user)) { + return $response->withStatus(404)->withJson(['errors' => "User « $userId » not found"]); + } + + $r = ListModelsModel::update(['set' =>['item_id' => $listModel['redirectUserId']] ,'where' => ['item_id = ?', 'object_id = ?', 'object_type = ?', 'item_mode = ?'], 'data' => [$data['user_id'], $listModel['object_id'], 'entity_id', 'dest']]); + if (!$r) { + return $response->withStatus(500)->withJson(['errors' => 'ListModels Update Error']); + } + } + return $response->withJson(['success' => 'ListModels Updated']); + } +} diff --git a/modules/entities/Models/ListModelsModel.php b/modules/entities/Models/ListModelsModel.php new file mode 100644 index 0000000000000000000000000000000000000000..69cc1d054263328850e73b89c888be5bf007ed27 --- /dev/null +++ b/modules/entities/Models/ListModelsModel.php @@ -0,0 +1,17 @@ +<?php +/** +* Copyright Maarch since 2008 under licence GPLv3. +* See LICENCE.txt file at the root folder for more details. +* This file is part of Maarch software. + +* @brief ListModelsModel +* @author dev <dev@maarch.org> +* @ingroup core +*/ + +namespace Entities\Models; + +class ListModelsModel extends ListModelsModelAbstract +{ + // Do your stuff in this class +} diff --git a/modules/entities/Models/ListModelsModelAbstract.php b/modules/entities/Models/ListModelsModelAbstract.php new file mode 100644 index 0000000000000000000000000000000000000000..a3505bc0ba2a201c5cae11b286403ca2e0b14bd7 --- /dev/null +++ b/modules/entities/Models/ListModelsModelAbstract.php @@ -0,0 +1,71 @@ +<?php +/** +* Copyright Maarch since 2008 under licence GPLv3. +* See LICENCE.txt file at the root folder for more details. +* This file is part of Maarch software. + +* @brief ListModelsModelAbstract +* @author dev <dev@maarch.org> +* @ingroup core +*/ + +namespace Entities\Models; + +require_once 'apps/maarch_entreprise/services/Table.php'; + +class ListModelsModelAbstract extends \Apps_Table_Service +{ + public static function update(array $aArgs = []) + { + static::checkRequired($aArgs, ['set', 'where', 'data']); + static::checkArray($aArgs, ['set', 'where', 'data']); + + $aReturn = parent::update([ + 'table' => 'listmodels', + 'set' => $aArgs['set'], + 'where' => $aArgs['where'], + 'data' => $aArgs['data'] + ]); + return $aReturn; + } + + public static function getDiffListByUsersId(array $aArgs = []) + { + static::checkRequired($aArgs, ['users_id']); + static::checkRequired($aArgs, ['object_type']); + static::checkRequired($aArgs, ['item_mode']); + + static::checkArray($aArgs, ['users_id']); + static::checkString($aArgs, ['object_type']); + static::checkString($aArgs, ['item_mode']); + + $aReturn = static::select([ + 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], + 'table' => ['listmodels'], + 'where' => ['item_id in (?)', 'object_type = ?', 'item_mode = ?'], + 'data' => [$aArgs['users_id'], $aArgs['object_type'], $aArgs['item_mode']], + ]); + + return $aReturn; + } + + public static function getDiffListByUserId(array $aArgs = []) + { + static::checkRequired($aArgs, ['itemId']); + static::checkRequired($aArgs, ['objectType']); + static::checkRequired($aArgs, ['itemMode']); + + static::checkString($aArgs, ['itemId']); + static::checkString($aArgs, ['objectType']); + static::checkString($aArgs, ['itemMode']); + + $aReturn = static::select([ + 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], + 'table' => ['listmodels'], + 'where' => ['item_id = ?', 'object_type = ?', 'item_mode = ?'], + 'data' => [$aArgs['itemId'], $aArgs['objectType'], $aArgs['itemMode']], + ]); + + return $aReturn; + } +} diff --git a/rest/index.php b/rest/index.php index 5f969f272d101289518713945548760529f50bab..a91c109e65b95bcf45a1de9a35aa7d41b4fedde8 100644 --- a/rest/index.php +++ b/rest/index.php @@ -125,6 +125,10 @@ $app->get('/attachments', \Attachments\Controllers\AttachmentsController::class $app->get('/attachments/{id}', \Attachments\Controllers\AttachmentsController::class . ':getById'); $app->post('/attachments', \Attachments\Controllers\AttachmentsController::class . ':create'); +//ListModels +$app->get('/listModels/itemId/{itemId}/itemMode/{itemMode}/objectType/{objectType}', \Entities\Controllers\ListModelsController::class . ':getListModelsDiffListDestByUserId'); +$app->put('/listModels/itemId/{itemId}/itemMode/{itemMode}/objectType/{objectType}', \Entities\Controllers\ListModelsController::class . ':updateListModelsDiffListDestByUserId'); + //Visa $app->get('/{basketId}/signatureBook/resList', \Visa\Controllers\VisaController::class . ':getResList'); $app->get('/{basketId}/signatureBook/resList/details', \Visa\Controllers\VisaController::class . ':getDetailledResList'); @@ -144,10 +148,11 @@ $app->post('/resExt', \Core\Controllers\ResExtController::class . ':create'); //Users $app->get('/users/autocompleter', \Core\Controllers\UserController::class . ':getUsersForAutocompletion'); +$app->get('/users/autocompleter/exclude/{userId}', \Core\Controllers\UserController::class . ':getUsersForAutocompletionWithExclusion'); $app->get('/users/profile', \Core\Controllers\UserController::class . ':getCurrentUserInfos'); $app->put('/users/profile', \Core\Controllers\UserController::class . ':updateProfile'); $app->put('/users/{userId}', \Core\Controllers\UserController::class . ':update'); -$app->delete('/user/{userId}', \Core\Controllers\UserController::class . ':delete'); +$app->delete('/users/{userId}', \Core\Controllers\UserController::class . ':delete'); $app->post('/users/{userId}/groups/{groupId}', \Core\Controllers\UserController::class . ':addGroup'); $app->put('/users/{userId}/groups/{groupId}', \Core\Controllers\UserController::class . ':updateGroup'); $app->delete('/users/{userId}/groups/{groupId}', \Core\Controllers\UserController::class . ':deleteGroup');