From 55b2327d1a7789d1d79bf31cfa6a4817201f9c7b Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Mon, 12 Feb 2018 11:56:35 +0100
Subject: [PATCH] FEAT #70 Entities Administration front

---
 .../entities-administration.component.html    |   6 +
 .../entity-administration.component.html      |  12 ++
 .../administration-routing.module.js          |   5 +
 .../administration-routing.module.ts          |  55 ++++-----
 .../administration/administration.module.js   |   6 +-
 .../administration/administration.module.ts   |  16 ++-
 .../entities-administration.component.js      |  70 ++++++++++++
 .../entities-administration.component.ts      |  68 ++++++++++++
 .../entity-administration.component.js        | 104 ++++++++++++++++++
 .../entity-administration.component.ts        | 102 +++++++++++++++++
 .../js/angular/lang/lang-en.ts                |  32 +++---
 .../js/angular/lang/lang-fr.ts                |  40 +++----
 apps/maarch_entreprise/js/angularFunctions.js |   2 +
 rest/index.php                                |   1 +
 .../entity/controllers/EntityController.php   |  10 ++
 15 files changed, 461 insertions(+), 68 deletions(-)
 create mode 100644 apps/maarch_entreprise/Views/entities-administration.component.html
 create mode 100644 apps/maarch_entreprise/Views/entity-administration.component.html
 create mode 100644 apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.js
 create mode 100644 apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.ts
 create mode 100644 apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.js
 create mode 100644 apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.ts

diff --git a/apps/maarch_entreprise/Views/entities-administration.component.html b/apps/maarch_entreprise/Views/entities-administration.component.html
new file mode 100644
index 00000000000..d51c4a99dbd
--- /dev/null
+++ b/apps/maarch_entreprise/Views/entities-administration.component.html
@@ -0,0 +1,6 @@
+<div *ngIf="loading">
+    <i class="fa fa-spinner fa-spin fa-5x" style="margin-left: 50%;margin-top: 16%;font-size: 8em"></i>
+</div>
+<div *ngIf="!loading" class="container-fluid">
+    <h1 style="margin-top: 0"><i class="fa fa-inbox fa-2x"></i> {{lang.administration}}</h1>
+</div>
diff --git a/apps/maarch_entreprise/Views/entity-administration.component.html b/apps/maarch_entreprise/Views/entity-administration.component.html
new file mode 100644
index 00000000000..c5d204d5c49
--- /dev/null
+++ b/apps/maarch_entreprise/Views/entity-administration.component.html
@@ -0,0 +1,12 @@
+<div class="page-header">
+</div>
+<div *ngIf="loading">
+    <mat-spinner style="margin:auto;"></mat-spinner>
+</div>
+<div *ngIf="!loading" class="container-fluid">
+    <div class="row row-eq-height">
+        <div class="col-md-offset-4 col-md-4" style="border-left:solid 1px white;border-right:solid 1px white;background-color: #CEE9F1;border-top: solid 2px #FDD16C;border-bottom: solid 2px #FDD16C;padding:10px;">
+            <h2>Informations</h2>
+        </div>
+    </div>
+</div>
diff --git a/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.js b/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.js
index b7e253cfab7..557787754d1 100644
--- a/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.js
+++ b/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.js
@@ -16,6 +16,8 @@ var group_administration_component_1 = require("./group-administration.component
 var baskets_administration_component_1 = require("./baskets-administration.component");
 var baskets_order_administration_component_1 = require("./baskets-order-administration.component");
 var basket_administration_component_1 = require("./basket-administration.component");
+var entities_administration_component_1 = require("./entities-administration.component");
+var entity_administration_component_1 = require("./entity-administration.component");
 var statuses_administration_component_1 = require("./statuses-administration.component");
 var status_administration_component_1 = require("./status-administration.component");
 var actions_administration_component_1 = require("./actions-administration.component");
@@ -49,6 +51,9 @@ var AdministrationRoutingModule = /** @class */ (function () {
                     { path: 'administration/baskets-sorted', component: baskets_order_administration_component_1.BasketsOrderAdministrationComponent },
                     { path: 'administration/baskets/new', component: basket_administration_component_1.BasketAdministrationComponent },
                     { path: 'administration/baskets/:id', component: basket_administration_component_1.BasketAdministrationComponent },
+                    { path: 'administration/entities', component: entities_administration_component_1.EntitiesAdministrationComponent },
+                    { path: 'administration/entities/new', component: entity_administration_component_1.EntityAdministrationComponent },
+                    { path: 'administration/entities/:id', component: entity_administration_component_1.EntityAdministrationComponent },
                     { path: 'administration/statuses', component: statuses_administration_component_1.StatusesAdministrationComponent },
                     { path: 'administration/statuses/new', component: status_administration_component_1.StatusAdministrationComponent },
                     { path: 'administration/statuses/:identifier', component: status_administration_component_1.StatusAdministrationComponent },
diff --git a/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.ts b/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.ts
index eab7ab31fbf..a38ca42a2e1 100755
--- a/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.ts
+++ b/apps/maarch_entreprise/js/angular/app/administration/administration-routing.module.ts
@@ -1,29 +1,31 @@
-import { NgModule }              from '@angular/core';
-import { RouterModule }  from '@angular/router';
+import { NgModule }     from '@angular/core';
+import { RouterModule } from '@angular/router';
 
-import { AdministrationComponent }              from './administration.component';
-import { UsersAdministrationComponent }         from './users-administration.component';
-import { UserAdministrationComponent }          from './user-administration.component';
-import { GroupsAdministrationComponent }        from './groups-administration.component';
-import { GroupAdministrationComponent }         from './group-administration.component';
-import { BasketsAdministrationComponent }       from './baskets-administration.component';
-import { BasketsOrderAdministrationComponent }  from './baskets-order-administration.component';
-import { BasketAdministrationComponent }        from './basket-administration.component';
-import { StatusesAdministrationComponent }      from './statuses-administration.component';
-import { StatusAdministrationComponent }        from './status-administration.component';
-import { ActionsAdministrationComponent }       from './actions-administration.component';
-import { ActionAdministrationComponent }        from './action-administration.component';
-import { ParameterAdministrationComponent }     from './parameter-administration.component';
-import { ParametersAdministrationComponent }    from './parameters-administration.component';
-import { PrioritiesAdministrationComponent }    from './priorities-administration.component';
-import { PriorityAdministrationComponent }      from './priority-administration.component';
-import { ReportsAdministrationComponent }       from './reports-administration.component';
-import { NotificationsAdministrationComponent } from './notifications-administration.component';
-import { NotificationAdministrationComponent }  from './notification-administration.component';
-import { NotificationsScheduleAdministrationComponent }  from './notifications-schedule-administration.component';
-import { HistoryAdministrationComponent }       from './history-administration.component';
-import { HistoryBatchAdministrationComponent }  from './historyBatch-administration.component';
-import { UpdateStatusAdministrationComponent }  from './update-status-administration.component';
+import { AdministrationComponent }                      from './administration.component';
+import { UsersAdministrationComponent }                 from './users-administration.component';
+import { UserAdministrationComponent }                  from './user-administration.component';
+import { GroupsAdministrationComponent }                from './groups-administration.component';
+import { GroupAdministrationComponent }                 from './group-administration.component';
+import { BasketsAdministrationComponent }               from './baskets-administration.component';
+import { BasketsOrderAdministrationComponent }          from './baskets-order-administration.component';
+import { BasketAdministrationComponent }                from './basket-administration.component';
+import { EntitiesAdministrationComponent }              from './entities-administration.component';
+import { EntityAdministrationComponent }                from './entity-administration.component';
+import { StatusesAdministrationComponent }              from './statuses-administration.component';
+import { StatusAdministrationComponent }                from './status-administration.component';
+import { ActionsAdministrationComponent }               from './actions-administration.component';
+import { ActionAdministrationComponent }                from './action-administration.component';
+import { ParameterAdministrationComponent }             from './parameter-administration.component';
+import { ParametersAdministrationComponent }            from './parameters-administration.component';
+import { PrioritiesAdministrationComponent }            from './priorities-administration.component';
+import { PriorityAdministrationComponent }              from './priority-administration.component';
+import { ReportsAdministrationComponent }               from './reports-administration.component';
+import { NotificationsAdministrationComponent }         from './notifications-administration.component';
+import { NotificationAdministrationComponent }          from './notification-administration.component';
+import { NotificationsScheduleAdministrationComponent } from './notifications-schedule-administration.component';
+import { HistoryAdministrationComponent }               from './history-administration.component';
+import { HistoryBatchAdministrationComponent }          from './historyBatch-administration.component';
+import { UpdateStatusAdministrationComponent }          from './update-status-administration.component';
 
  
 @NgModule({
@@ -40,6 +42,9 @@ import { UpdateStatusAdministrationComponent }  from './update-status-administra
             { path: 'administration/baskets-sorted', component: BasketsOrderAdministrationComponent },
             { path: 'administration/baskets/new', component: BasketAdministrationComponent },
             { path: 'administration/baskets/:id', component: BasketAdministrationComponent },
+            { path: 'administration/entities', component: EntitiesAdministrationComponent },
+            { path: 'administration/entities/new', component: EntityAdministrationComponent },
+            { path: 'administration/entities/:id', component: EntityAdministrationComponent },
             { path: 'administration/statuses', component: StatusesAdministrationComponent },
             { path: 'administration/statuses/new', component: StatusAdministrationComponent },
             { path: 'administration/statuses/:identifier', component: StatusAdministrationComponent },
diff --git a/apps/maarch_entreprise/js/angular/app/administration/administration.module.js b/apps/maarch_entreprise/js/angular/app/administration/administration.module.js
index e2630c7a3e5..8e803ce36bb 100644
--- a/apps/maarch_entreprise/js/angular/app/administration/administration.module.js
+++ b/apps/maarch_entreprise/js/angular/app/administration/administration.module.js
@@ -14,12 +14,14 @@ var app_material_module_1 = require("../app-material.module");
 var administration_routing_module_1 = require("./administration-routing.module");
 var administration_component_1 = require("./administration.component");
 var users_administration_component_1 = require("./users-administration.component");
-var user_administration_component_1 = require("./user-administration.component");
 var groups_administration_component_1 = require("./groups-administration.component");
+var user_administration_component_1 = require("./user-administration.component");
 var group_administration_component_1 = require("./group-administration.component");
 var baskets_administration_component_1 = require("./baskets-administration.component");
 var baskets_order_administration_component_1 = require("./baskets-order-administration.component");
 var basket_administration_component_1 = require("./basket-administration.component");
+var entities_administration_component_1 = require("./entities-administration.component");
+var entity_administration_component_1 = require("./entity-administration.component");
 var statuses_administration_component_1 = require("./statuses-administration.component");
 var status_administration_component_1 = require("./status-administration.component");
 var actions_administration_component_1 = require("./actions-administration.component");
@@ -57,6 +59,8 @@ var AdministrationModule = /** @class */ (function () {
                 baskets_administration_component_1.BasketsAdministrationComponent,
                 baskets_order_administration_component_1.BasketsOrderAdministrationComponent,
                 basket_administration_component_1.BasketAdministrationComponent,
+                entities_administration_component_1.EntitiesAdministrationComponent,
+                entity_administration_component_1.EntityAdministrationComponent,
                 statuses_administration_component_1.StatusesAdministrationComponent,
                 status_administration_component_1.StatusAdministrationComponent,
                 actions_administration_component_1.ActionsAdministrationComponent,
diff --git a/apps/maarch_entreprise/js/angular/app/administration/administration.module.ts b/apps/maarch_entreprise/js/angular/app/administration/administration.module.ts
index 7fa0b0fe096..b0c86c5ef61 100755
--- a/apps/maarch_entreprise/js/angular/app/administration/administration.module.ts
+++ b/apps/maarch_entreprise/js/angular/app/administration/administration.module.ts
@@ -1,19 +1,21 @@
-import { NgModule }         from '@angular/core';
-import { CommonModule }     from '@angular/common';
-import { FormsModule, ReactiveFormsModule }      from '@angular/forms';
-import { HttpClientModule } from '@angular/common/http';
+import { NgModule }                             from '@angular/core';
+import { CommonModule }                         from '@angular/common';
+import { FormsModule, ReactiveFormsModule }     from '@angular/forms';
+import { HttpClientModule }                     from '@angular/common/http';
 
 import { AppMaterialModule }                    from '../app-material.module';
 import { AdministrationRoutingModule }          from './administration-routing.module';
 
 import { AdministrationComponent }                      from './administration.component';
-import { UsersAdministrationComponent, UsersAdministrationRedirectModalComponent }  from './users-administration.component';
+import { UsersAdministrationComponent, UsersAdministrationRedirectModalComponent }      from './users-administration.component';
+import { GroupsAdministrationComponent, GroupsAdministrationRedirectModalComponent }    from './groups-administration.component';
 import { UserAdministrationComponent }                  from './user-administration.component';
-import { GroupsAdministrationComponent, GroupsAdministrationRedirectModalComponent }                from './groups-administration.component';
 import { GroupAdministrationComponent }                 from './group-administration.component';
 import { BasketsAdministrationComponent }               from './baskets-administration.component';
 import { BasketsOrderAdministrationComponent }          from './baskets-order-administration.component';
 import { BasketAdministrationComponent }                from './basket-administration.component';
+import { EntitiesAdministrationComponent }              from './entities-administration.component';
+import { EntityAdministrationComponent }                from './entity-administration.component';
 import { StatusesAdministrationComponent }              from './statuses-administration.component';
 import { StatusAdministrationComponent }                from './status-administration.component';
 import { ActionsAdministrationComponent }               from './actions-administration.component';
@@ -49,6 +51,8 @@ import { NotificationAdministrationComponent }          from './notification-adm
         BasketsAdministrationComponent,
         BasketsOrderAdministrationComponent,
         BasketAdministrationComponent,
+        EntitiesAdministrationComponent,
+        EntityAdministrationComponent,
         StatusesAdministrationComponent,
         StatusAdministrationComponent,
         ActionsAdministrationComponent,
diff --git a/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.js b/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.js
new file mode 100644
index 00000000000..52721d5cfdc
--- /dev/null
+++ b/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.js
@@ -0,0 +1,70 @@
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var core_1 = require("@angular/core");
+var http_1 = require("@angular/common/http");
+var translate_component_1 = require("../translate.component");
+var notification_service_1 = require("../notification.service");
+var EntitiesAdministrationComponent = /** @class */ (function () {
+    function EntitiesAdministrationComponent(http, notify) {
+        this.http = http;
+        this.notify = notify;
+        this.lang = translate_component_1.LANG;
+        this.entities = [];
+        this.loading = false;
+    }
+    EntitiesAdministrationComponent.prototype.updateBreadcrumb = function (applicationName) {
+        if ($j('#ariane')[0]) {
+            $j('#ariane')[0].innerHTML = "<a href='index.php?reinit=true'>" + applicationName + "</a> > <a onclick='location.hash = \"/administration\"' style='cursor: pointer'>Administration</a> > Entités";
+        }
+    };
+    EntitiesAdministrationComponent.prototype.ngOnInit = function () {
+        var _this = this;
+        this.updateBreadcrumb(angularGlobals.applicationName);
+        this.coreUrl = angularGlobals.coreUrl;
+        this.loading = true;
+        this.http.get(this.coreUrl + "rest/entities")
+            .subscribe(function (data) {
+            _this.entities = data['entities'];
+            _this.loading = false;
+        }, function () {
+            location.href = "index.php";
+        });
+    };
+    EntitiesAdministrationComponent.prototype.updateStatus = function (entity, method) {
+        var _this = this;
+        this.http.put(this.coreUrl + "rest/entities/" + entity['entity_id'] + "/status", { "method": method })
+            .subscribe(function (data) {
+            _this.notify.success("");
+        }, function (err) {
+            _this.notify.error(err.error.errors);
+        });
+    };
+    EntitiesAdministrationComponent.prototype.delete = function (entity) {
+        var _this = this;
+        this.http.delete(this.coreUrl + "rest/entities/" + entity['entity_id'])
+            .subscribe(function (data) {
+            _this.notify.success(_this.lang.entityDeleted);
+            _this.entities = data['entities'];
+        }, function (err) {
+            _this.notify.error(err.error.errors);
+        });
+    };
+    EntitiesAdministrationComponent = __decorate([
+        core_1.Component({
+            templateUrl: angularGlobals["entities-administrationView"],
+            providers: [notification_service_1.NotificationService]
+        }),
+        __metadata("design:paramtypes", [http_1.HttpClient, notification_service_1.NotificationService])
+    ], EntitiesAdministrationComponent);
+    return EntitiesAdministrationComponent;
+}());
+exports.EntitiesAdministrationComponent = EntitiesAdministrationComponent;
diff --git a/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.ts b/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.ts
new file mode 100644
index 00000000000..4fcc3cc1a74
--- /dev/null
+++ b/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.ts
@@ -0,0 +1,68 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { LANG } from '../translate.component';
+import { NotificationService } from '../notification.service';
+
+declare function $j(selector: any) : any;
+
+declare var angularGlobals : any;
+
+
+@Component({
+    templateUrl : angularGlobals["entities-administrationView"],
+    providers   : [NotificationService]
+})
+export class EntitiesAdministrationComponent implements OnInit {
+
+    coreUrl                     : string;
+    lang                        : any       = LANG;
+
+    entities                    : any[]     = [];
+
+    loading                     : boolean   = false;
+
+
+    constructor(public http: HttpClient, private notify: NotificationService) {
+    }
+
+    updateBreadcrumb(applicationName: string) {
+        if ($j('#ariane')[0]) {
+            $j('#ariane')[0].innerHTML = "<a href='index.php?reinit=true'>" + applicationName + "</a> > <a onclick='location.hash = \"/administration\"' style='cursor: pointer'>Administration</a> > Entités";
+        }
+    }
+
+    ngOnInit(): void {
+        this.updateBreadcrumb(angularGlobals.applicationName);
+        this.coreUrl = angularGlobals.coreUrl;
+
+        this.loading = true;
+
+        this.http.get(this.coreUrl + "rest/entities")
+            .subscribe((data : any) => {
+                this.entities = data['entities'];
+
+                this.loading = false;
+            }, () => {
+                location.href = "index.php";
+            });
+    }
+
+    updateStatus(entity: any, method: string) {
+        this.http.put(this.coreUrl + "rest/entities/" + entity['entity_id'] + "/status", {"method" : method})
+            .subscribe((data : any) => {
+                this.notify.success("");
+            }, (err) => {
+                this.notify.error(err.error.errors);
+            });
+    }
+
+    delete(entity: any) {
+        this.http.delete(this.coreUrl + "rest/entities/" + entity['entity_id'])
+            .subscribe((data : any) => {
+                this.notify.success(this.lang.entityDeleted);
+                this.entities = data['entities'];
+            }, (err) => {
+                this.notify.error(err.error.errors);
+            });
+    }
+}
diff --git a/apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.js b/apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.js
new file mode 100644
index 00000000000..565d521717b
--- /dev/null
+++ b/apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.js
@@ -0,0 +1,104 @@
+"use strict";
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var core_1 = require("@angular/core");
+var http_1 = require("@angular/common/http");
+var router_1 = require("@angular/router");
+var translate_component_1 = require("../translate.component");
+var notification_service_1 = require("../notification.service");
+var EntityAdministrationComponent = /** @class */ (function () {
+    function EntityAdministrationComponent(http, route, router, notify) {
+        this.http = http;
+        this.route = route;
+        this.router = router;
+        this.notify = notify;
+        this.lang = translate_component_1.LANG;
+        this.entity = {};
+        this.loading = false;
+    }
+    EntityAdministrationComponent.prototype.updateBreadcrumb = function (applicationName) {
+        if ($j('#ariane')[0]) {
+            $j('#ariane')[0].innerHTML = "<a href='index.php?reinit=true'>" + applicationName + "</a> > <a onclick='location.hash = \"/administration\"' style='cursor: pointer'>Administration</a> > <a onclick='location.hash = \"/administration/entities\"' style='cursor: pointer'>Entités</a>";
+        }
+    };
+    EntityAdministrationComponent.prototype.ngOnInit = function () {
+        var _this = this;
+        this.updateBreadcrumb(angularGlobals.applicationName);
+        this.coreUrl = angularGlobals.coreUrl;
+        this.loading = true;
+        this.route.params.subscribe(function (params) {
+            if (typeof params['id'] == "undefined") {
+                _this.creationMode = true;
+                _this.entityIdAvailable = false;
+                _this.loading = false;
+            }
+            else {
+                _this.creationMode = false;
+                _this.entityIdAvailable = true;
+                _this.id = params['id'];
+                _this.http.get(_this.coreUrl + "rest/entities/" + _this.id + "/details")
+                    .subscribe(function (data) {
+                    _this.entity = data.basket;
+                    _this.loading = false;
+                }, function () {
+                    location.href = "index.php";
+                });
+            }
+        });
+    };
+    EntityAdministrationComponent.prototype.isAvailable = function () {
+        var _this = this;
+        if (this.entity.id) {
+            this.http.get(this.coreUrl + "rest/entities/" + this.entity.id)
+                .subscribe(function () {
+                _this.entityIdAvailable = false;
+            }, function (err) {
+                _this.entityIdAvailable = false;
+                if (err.error.errors == "Entity not found") {
+                    _this.entityIdAvailable = true;
+                }
+            });
+        }
+        else {
+            this.entityIdAvailable = false;
+        }
+    };
+    EntityAdministrationComponent.prototype.onSubmit = function () {
+        var _this = this;
+        if (this.creationMode) {
+            this.http.post(this.coreUrl + "rest/entities", this.entity)
+                .subscribe(function (data) {
+                _this.notify.success(_this.lang.entityAdded);
+                _this.router.navigate(["/administration/entities"]);
+            }, function (err) {
+                _this.notify.error(err.error.errors);
+            });
+        }
+        else {
+            this.http.put(this.coreUrl + "rest/entities/" + this.id, this.entity)
+                .subscribe(function (data) {
+                _this.notify.success(_this.lang.entityUpdated);
+                _this.router.navigate(["/administration/entities"]);
+            }, function (err) {
+                _this.notify.error(err.error.errors);
+            });
+        }
+    };
+    EntityAdministrationComponent = __decorate([
+        core_1.Component({
+            templateUrl: angularGlobals["entity-administrationView"],
+            providers: [notification_service_1.NotificationService]
+        }),
+        __metadata("design:paramtypes", [http_1.HttpClient, router_1.ActivatedRoute, router_1.Router, notification_service_1.NotificationService])
+    ], EntityAdministrationComponent);
+    return EntityAdministrationComponent;
+}());
+exports.EntityAdministrationComponent = EntityAdministrationComponent;
diff --git a/apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.ts b/apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.ts
new file mode 100644
index 00000000000..f9d7b3d9e4e
--- /dev/null
+++ b/apps/maarch_entreprise/js/angular/app/administration/entity-administration.component.ts
@@ -0,0 +1,102 @@
+import { Component, OnInit} from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Router, ActivatedRoute } from '@angular/router';
+import { LANG } from '../translate.component';
+import { NotificationService } from '../notification.service';
+
+declare function $j(selector: any) : any;
+
+declare var angularGlobals : any;
+
+
+@Component({
+    templateUrl : angularGlobals["entity-administrationView"],
+    providers   : [NotificationService]
+})
+export class EntityAdministrationComponent implements OnInit {
+
+    coreUrl             : string;
+    lang                : any       = LANG;
+
+    id                  : string;
+    creationMode        : boolean;
+
+    entity              : any       = {};
+    entityIdAvailable   : boolean;
+
+    loading             : boolean   = false;
+
+
+    constructor(public http: HttpClient, private route: ActivatedRoute, private router: Router, private notify: NotificationService) {
+    }
+
+    updateBreadcrumb(applicationName: string) {
+        if ($j('#ariane')[0]) {
+            $j('#ariane')[0].innerHTML = "<a href='index.php?reinit=true'>" + applicationName + "</a> > <a onclick='location.hash = \"/administration\"' style='cursor: pointer'>Administration</a> > <a onclick='location.hash = \"/administration/entities\"' style='cursor: pointer'>Entités</a>";
+        }
+    }
+
+    ngOnInit(): void {
+        this.updateBreadcrumb(angularGlobals.applicationName);
+        this.coreUrl = angularGlobals.coreUrl;
+
+        this.loading = true;
+
+        this.route.params.subscribe((params) => {
+            if (typeof params['id'] == "undefined") {
+                this.creationMode = true;
+                this.entityIdAvailable = false;
+                this.loading = false;
+            } else {
+                this.creationMode = false;
+                this.entityIdAvailable = true;
+                this.id = params['id'];
+                this.http.get(this.coreUrl + "rest/entities/" + this.id + "/details")
+                    .subscribe((data : any) => {
+                        this.entity = data.basket;
+
+                        this.loading = false;
+                    }, () => {
+                        location.href = "index.php";
+                    });
+            }
+        });
+    }
+
+    isAvailable() {
+        if (this.entity.id) {
+            this.http.get(this.coreUrl + "rest/entities/" + this.entity.id)
+                .subscribe(() => {
+                    this.entityIdAvailable = false;
+                }, (err) => {
+                    this.entityIdAvailable = false;
+                    if (err.error.errors == "Entity not found") {
+                        this.entityIdAvailable = true;
+                    }
+                });
+        } else {
+            this.entityIdAvailable = false;
+        }
+    }
+
+    onSubmit() {
+        if (this.creationMode) {
+            this.http.post(this.coreUrl + "rest/entities", this.entity)
+                .subscribe((data : any) => {
+                    this.notify.success(this.lang.entityAdded);
+                    this.router.navigate(["/administration/entities"]);
+                }, (err) => {
+                    this.notify.error(err.error.errors);
+                });
+        } else {
+            this.http.put(this.coreUrl + "rest/entities/" + this.id, this.entity)
+                .subscribe((data : any) => {
+                    this.notify.success(this.lang.entityUpdated);
+                    this.router.navigate(["/administration/entities"]);
+                }, (err) => {
+                    this.notify.error(err.error.errors);
+                });
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/apps/maarch_entreprise/js/angular/lang/lang-en.ts b/apps/maarch_entreprise/js/angular/lang/lang-en.ts
index 4e06e5b8d2d..ce6db8b6126 100755
--- a/apps/maarch_entreprise/js/angular/lang/lang-en.ts
+++ b/apps/maarch_entreprise/js/angular/lang/lang-en.ts
@@ -115,22 +115,22 @@ export const LANG_EN = {
     "no"                        : "No",
     "noReplacement"             : "No replacement",
     "notes"                     : "Notes",
-    "NotificationAdded"         : "Notification added",
-    "notificationCreation"      : "Notification creation",
-    "notificationDeleted"       : "Notification deleted",
-    "NotificationDiffusionType" : "Diffusion type",
-    "NotificationEnabled"       : "Enabled",
-    "NotificationEvent"         : "Event",
-    "NotificationJoinDocument"  : "Join document to notification",
-    "NotificationModel"         : "Model",
-    "notificationModification"  : "Notification modification",  
-    "notifications"             : "Notification(s)",
-    "notificationSchedule"      : "Notifications schedule",
-    "NotificationScheduleInfo"     : "This part is used to define when notifications will be sent.\n\nIf you choose * from all the drop-down lists, the notification will be sent every minute 365 days a year.\n\nFrequency example :\n14 30 * * * [courrier] Nouveaux courriers à traiter : La notification sera envoyée tous les jours à 14h30\n9 30 * * Lundi [courrier] Nouveaux courriers à traiter : La notification sera envoyée tous les lundi à 9h30",
-    "NotificationScheduleUpdated"  : "Schedule updated",
-    "notificationsSchedule"        : "Notifications schedule",
-    "NotificationToEnable"      : "To enable",
-    "notificationUpdated"       : "Notification updated",
+    "NotificationAdded"             : "Notification added",
+    "notificationCreation"          : "Notification creation",
+    "notificationDeleted"           : "Notification deleted",
+    "NotificationDiffusionType"     : "Diffusion type",
+    "NotificationEnabled"           : "Enabled",
+    "NotificationEvent"             : "Event",
+    "NotificationJoinDocument"      : "Join document to notification",
+    "NotificationModel"             : "Model",
+    "notificationModification"      : "Notification modification",
+    "notifications"                 : "Notification(s)",
+    "notificationSchedule"          : "Notifications schedule",
+    "NotificationScheduleInfo"      : "This part is used to define when notifications will be sent.\n\nIf you choose * from all the drop-down lists, the notification will be sent every minute 365 days a year.\n\nFrequency example :\n14 30 * * * [courrier] Nouveaux courriers à traiter : La notification sera envoyée tous les jours à 14h30\n9 30 * * Lundi [courrier] Nouveaux courriers à traiter : La notification sera envoyée tous les lundi à 9h30",
+    "NotificationScheduleUpdated"   : "Schedule updated",
+    "notificationsSchedule"         : "Notifications schedule",
+    "NotificationToEnable"          : "To enable",
+    "notificationUpdated"           : "Notification updated",
     "parameter"                 : "Parameter",
     "parameterAdded"            : "Parameter added",
     "parameterDeleted"          : "Parameter deleted",
diff --git a/apps/maarch_entreprise/js/angular/lang/lang-fr.ts b/apps/maarch_entreprise/js/angular/lang/lang-fr.ts
index 8b9595c011b..6e6c764d603 100755
--- a/apps/maarch_entreprise/js/angular/lang/lang-fr.ts
+++ b/apps/maarch_entreprise/js/angular/lang/lang-fr.ts
@@ -208,24 +208,24 @@ export const LANG_FR = {
     "totalProcessed"               : "Élément(s) analysé(s)",
     "type"                         : "Type",
     "unselectAll"                  : "Tout désélectionner",
-    "update"                       : "Modifier",
-    "updateStatus"                 : "Changement de statut de courrier",
-    "updateStatusInformations"     : "En saisissant le n° chrono ou le n° GED du document, vous modifierez le statut du courrier. Le courrier sera disponible dans la bannette des utilisateurs auquel il était affecté suivant le statut que vous aurez défini.",
-    "user"                         : "utilisateur",
-    "userAdded"                    : "Utilisateur ajouté",
-    "userAuthorized"               : "Utilisateur autorisé",
-    "userCreation"                 : "Création d'un utilisateur",
-    "userDeleted"                  : "Utilisateur supprimé",
-    "userModification"             : "Modification de l'utilisateur",
-    "users"                        : "Utilisateur(s)",
-    "userSuspended"                : "Utilisateur suspendu",
-    "userUpdated"                  : "Utilisateur modifié",
-    "validate"                     : "Valider",
-    "value"                        : "valeur",
-    "view"                         : "Consulter",
-    "visa"                         : "Circuit de visa",
-    "workingDays"                  : "Jours ouvrés",
-    "yes"                          : "Oui",
-    "createScriptNotification"     : "Créer le script",
-    "ScriptCreated"     : "Script créé",
+    "update"                        : "Modifier",
+    "updateStatus"                  : "Changement de statut de courrier",
+    "updateStatusInformations"      : "En saisissant le n° chrono ou le n° GED du document, vous modifierez le statut du courrier. Le courrier sera disponible dans la bannette des utilisateurs auquel il était affecté suivant le statut que vous aurez défini.",
+    "user"                          : "utilisateur",
+    "userAdded"                     : "Utilisateur ajouté",
+    "userAuthorized"                : "Utilisateur autorisé",
+    "userCreation"                  : "Création d'un utilisateur",
+    "userDeleted"                   : "Utilisateur supprimé",
+    "userModification"              : "Modification de l'utilisateur",
+    "users"                         : "Utilisateur(s)",
+    "userSuspended"                 : "Utilisateur suspendu",
+    "userUpdated"                   : "Utilisateur modifié",
+    "validate"                      : "Valider",
+    "value"                         : "valeur",
+    "view"                          : "Consulter",
+    "visa"                          : "Circuit de visa",
+    "workingDays"                   : "Jours ouvrés",
+    "yes"                           : "Oui",
+    "createScriptNotification"      : "Créer le script",
+    "ScriptCreated"                 : "Script créé",
 };
\ No newline at end of file
diff --git a/apps/maarch_entreprise/js/angularFunctions.js b/apps/maarch_entreprise/js/angularFunctions.js
index 4c0b5010dda..c06291a9879 100755
--- a/apps/maarch_entreprise/js/angularFunctions.js
+++ b/apps/maarch_entreprise/js/angularFunctions.js
@@ -12,6 +12,8 @@ function triggerAngular(prodmode, locationToGo) {
         'baskets-administration',
         'baskets-order-administration',
         'basket-administration',
+        'entities-administration',
+        'entity-administration',
         'status-administration',
         'statuses-administration',
         'actions-administration',
diff --git a/rest/index.php b/rest/index.php
index 86c60d9c262..220e22764e1 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -207,6 +207,7 @@ $app->put('/currentUser/groups/{groupId}/baskets/{basketId}', \Core\Controllers\
 
 //Entities
 $app->get('/entities', \Entity\controllers\EntityController::class . ':get');
+$app->get('/entities/{id}', \Entity\controllers\EntityController::class . ':getById');
 $app->delete('/entities/{id}', \Entity\controllers\EntityController::class . ':delete');
 $app->get('/entities/{id}/details', \Entity\controllers\EntityController::class . ':getDetailledById');
 $app->put('/entities/{id}/reassign/{newEntityId}', \Entity\controllers\EntityController::class . ':reassignEntity');
diff --git a/src/app/entity/controllers/EntityController.php b/src/app/entity/controllers/EntityController.php
index 8f1d7cf9eb1..eb286a5ce81 100644
--- a/src/app/entity/controllers/EntityController.php
+++ b/src/app/entity/controllers/EntityController.php
@@ -40,6 +40,16 @@ class EntityController
         return $response->withJson(['entities' => $entities]);
     }
 
+    public function getById(Request $request, Response $response, array $aArgs)
+    {
+        $entity = EntityModel::getById(['entityId' => $aArgs['id']]);
+        if (empty($entity)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Entity not found']);
+        }
+
+        return $response->withJson(['entity' => $entity]);
+    }
+
     public function getDetailledById(Request $request, Response $response, array $aArgs)
     {
         if (!ServiceModel::hasService(['id' => 'manage_entities', 'userId' => $GLOBALS['userId'], 'location' => 'entities', 'type' => 'admin'])) {
-- 
GitLab