From 93236a76a59e3398f03145beca5eb8ab270d5f86 Mon Sep 17 00:00:00 2001
From: Alex Orluc <alex.orluc@maarch.org>
Date: Thu, 22 Mar 2018 20:57:54 +0100
Subject: [PATCH] FIX #244, #249 add select parent_entity_id

---
 .../entities-administration.component.html    | 35 +++++++++++++------
 .../administration/administration.module.ts   |  5 ++-
 .../entities-administration.component.ts      | 22 ++++++++----
 .../js/angular/app/app.module.ts              |  2 +-
 .../js/angular/plugins/sorting.pipe.ts        | 17 +++++++++
 5 files changed, 62 insertions(+), 19 deletions(-)
 create mode 100644 apps/maarch_entreprise/js/angular/plugins/sorting.pipe.ts

diff --git a/apps/maarch_entreprise/Views/entities-administration.component.html b/apps/maarch_entreprise/Views/entities-administration.component.html
index 213d4d318dc..96cbb41064d 100644
--- a/apps/maarch_entreprise/Views/entities-administration.component.html
+++ b/apps/maarch_entreprise/Views/entities-administration.component.html
@@ -62,12 +62,26 @@
                             <div class="form-group">
                                 <div class="col-sm-12">
                                     <mat-form-field>
-                                        <input matInput [(ngModel)]="currentEntity.parent_entity_id" required name="parent_entity_id" id="parent_entity_id" title="{{lang.isLinkedTo}}" type="text"
-                                            placeholder="{{lang.isLinkedTo}}" maxlength="32" disabled>
+                                        <mat-select id="parent_entity_id" name="parent_entity_id" title="{{lang.isLinkedTo}}" placeholder="{{lang.isLinkedTo}}" [(ngModel)]="currentEntity.parent_entity_id"
+                                            (change)="selectParentEntity(currentEntity.parent_entity_id)" *ngIf="creationMode">
+                                            <mat-option value="">
+                                            </mat-option>
+                                            <mat-option *ngFor="let entity of entities | sortBy : 'entity_label'" [value]="entity.entity_id">
+                                                {{entity.entity_label}}
+                                            </mat-option>
+                                        </mat-select>
+                                        <mat-select id="parent_entity_id" name="parent_entity_id" title="{{lang.isLinkedTo}}" placeholder="{{lang.isLinkedTo}}" [(ngModel)]="currentEntity.parent_entity_id"
+                                            *ngIf="!creationMode">
+                                            <mat-option value="">
+                                            </mat-option>
+                                            <mat-option *ngFor="let entity of entities | sortBy : 'entity_label'" [value]="entity.entity_id">
+                                                {{entity.entity_label}}
+                                            </mat-option>
+                                        </mat-select>
                                     </mat-form-field>
                                     <mat-form-field>
-                                        <mat-select id="entity_type" name="entity_type" title="{{lang.entityType}}" placeholder="{{lang.entityType}}" [(ngModel)]="currentEntity.entity_type" maxlength="32"
-                                            required>
+                                        <mat-select id="entity_type" name="entity_type" title="{{lang.entityType}}" placeholder="{{lang.entityType}}" [(ngModel)]="currentEntity.entity_type"
+                                            maxlength="32" required>
                                             <mat-option *ngFor="let entity_type of entityTypeList" [value]="entity_type.id">
                                                 {{entity_type.label}}
                                             </mat-option>
@@ -144,12 +158,14 @@
                                         </div>
                                         <div class="col-sm-4">
                                             <mat-form-field>
-                                                <input matInput [(ngModel)]="currentEntity.city" name="city" id="city" title="{{lang.city}}" type="text" placeholder="{{lang.city}}" maxlength="255">
+                                                <input matInput [(ngModel)]="currentEntity.city" name="city" id="city" title="{{lang.city}}" type="text" placeholder="{{lang.city}}"
+                                                    maxlength="255">
                                             </mat-form-field>
                                         </div>
                                         <div class="col-sm-4">
                                             <mat-form-field>
-                                                <input matInput [(ngModel)]="currentEntity.country" name="country" id="country" title="{{lang.country}}" type="text" placeholder="{{lang.country}}" maxlength="255">
+                                                <input matInput [(ngModel)]="currentEntity.country" name="country" id="country" title="{{lang.country}}" type="text" placeholder="{{lang.country}}"
+                                                    maxlength="255">
                                             </mat-form-field>
                                         </div>
                                     </div>
@@ -200,8 +216,7 @@
                         <div class="row" style="margin:0px;">
                             <div class="col-md-12">
                                 <mat-form-field>
-                                    <input #autocompleteFilter type="text" placeholder="{{lang.addUserOrEntity}}" matInput [matAutocomplete]="auto"
-                                        [formControl]="elementCtrl">
+                                    <input #autocompleteFilter type="text" placeholder="{{lang.addUserOrEntity}}" matInput [matAutocomplete]="auto" [formControl]="elementCtrl">
                                     <mat-autocomplete #auto="matAutocomplete">
                                         <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id" (click)="addElemListModel(elem)">
                                             <p mat-line>
@@ -260,8 +275,8 @@
                                 </mat-form-field>
                                 <mat-list>
                                     <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.visaTemplate">
-                                        <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.visaTemplate; let i = index" title="{{lang.move}}" dnd-sortable
-                                            [sortableIndex]="i" (onDropSuccess)="updateDiffListVisa(template)">
+                                        <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.visaTemplate; let i = index" title="{{lang.move}}"
+                                            dnd-sortable [sortableIndex]="i" (onDropSuccess)="updateDiffListVisa(template)">
                                             <mat-icon color="primary" [class]="template.item_mode == 'visa' ? 'fa fa-user' : 'fa fa-certificate'" mat-list-icon></mat-icon>
                                             <p mat-line>{{template.idToDisplay}}
                                                 <small style="opacity:0.5;">{{template.descriptionToDisplay}}</small>
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 5a2bd8f8931..6a16810ccf6 100644
--- a/apps/maarch_entreprise/js/angular/app/administration/administration.module.ts
+++ b/apps/maarch_entreprise/js/angular/app/administration/administration.module.ts
@@ -3,6 +3,8 @@ import { CommonModule }                         from '@angular/common';
 import { FormsModule, ReactiveFormsModule }     from '@angular/forms';
 import { HttpClientModule }                     from '@angular/common/http';
 
+import { SortPipe }                             from '../../plugins/sorting.pipe';
+
 import { MenuComponent }                        from '../menu/menu.component';
 import { MenuNavComponent }                     from '../menu/menu-nav.component';
 import { AppMaterialModule }                    from '../app-material.module';
@@ -76,7 +78,8 @@ import { NotificationAdministrationComponent }          from './notification-adm
         BasketAdministrationGroupListModalComponent,
         DoctypesAdministrationRedirectModalComponent,
         DiffusionModelsAdministrationComponent,
-        DiffusionModelAdministrationComponent
+        DiffusionModelAdministrationComponent,
+        SortPipe
     ],
     entryComponents: [
         UsersAdministrationRedirectModalComponent,
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
index 137706a1dbb..1e4598f98b2 100644
--- a/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.ts
+++ b/apps/maarch_entreprise/js/angular/app/administration/entities-administration.component.ts
@@ -6,14 +6,13 @@ import { ConfirmModalComponent } from '../confirmModal.component';
 import { NotificationService } from '../notification.service';
 import { MatSidenav, MatPaginator, MatTableDataSource, MatSort, MatDialog, MatDialogConfig, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
 
-
+import { SortPipe }  from '../../plugins/sorting.pipe';
 import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin';
 
 declare function $j(selector: any): any;
 
 declare var angularGlobals: any;
 
-
 @Component({
     templateUrl: "../../../../Views/entities-administration.component.html",
     providers: [NotificationService]
@@ -99,10 +98,13 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
                             'data': this.entities,
                             "check_callback": function (operation: any, node: any, node_parent: any, node_position: any, more: any) {
                                 if (operation == 'move_node') {
-                                    if (!node_parent.original.allowed) {
-                                        return false
-                                    } else
+                                    if (node_parent.id =='#') {
+                                        return false;
+                                    } else if (!node_parent.original.allowed) {
+                                        return false;
+                                    } else {
                                         return true;
+                                    }       
                                 }
                             }
                         },
@@ -333,14 +335,15 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
             this.currentEntity.parent_entity_id = '';
         }
 
-        if (this.creationMode) {
+        if (this.creationMode) { 
             this.http.post(this.coreUrl + "rest/entities", this.currentEntity)
                 .subscribe((data: any) => {
+                    this.currentEntity.listTemplate = [];
                     this.entities = data['entities'];
+                    this.creationMode = false;
                     $j('#jstree').jstree(true).settings.core.data = this.entities;
                     $j('#jstree').jstree("refresh");
                     this.notify.success(this.lang.entityAdded);
-                    this.creationMode = false;
                 }, (err) => {
                     this.notify.error(err.error.errors);
                 });
@@ -378,6 +381,11 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
         }
     }
 
+    selectParentEntity(entity_id:any) {
+        $j('#jstree').jstree('deselect_all');
+        $j('#jstree').jstree('select_node', entity_id);
+    }
+
     removeEntity() {
         if (this.currentEntity.documents > 0 || this.currentEntity.redirects > 0 || this.currentEntity.instances > 0 || this.currentEntity.users.length > 0) {
             this.config = { data: { entity: this.currentEntity } };
diff --git a/apps/maarch_entreprise/js/angular/app/app.module.ts b/apps/maarch_entreprise/js/angular/app/app.module.ts
index c4eaac18c78..d4a6e49773c 100755
--- a/apps/maarch_entreprise/js/angular/app/app.module.ts
+++ b/apps/maarch_entreprise/js/angular/app/app.module.ts
@@ -14,7 +14,7 @@ import { AdministrationModule }                 from './administration/administr
 
 import { ProfileComponent }                     from './profile.component';
 import { SignatureBookComponent, SafeUrlPipe }  from './signature-book.component';
-import { SaveNumericPackageComponent }  from './save-numeric-package.component';
+import { SaveNumericPackageComponent }          from './save-numeric-package.component';
 
 @NgModule({
     imports: [
diff --git a/apps/maarch_entreprise/js/angular/plugins/sorting.pipe.ts b/apps/maarch_entreprise/js/angular/plugins/sorting.pipe.ts
new file mode 100644
index 00000000000..d7a07746c3b
--- /dev/null
+++ b/apps/maarch_entreprise/js/angular/plugins/sorting.pipe.ts
@@ -0,0 +1,17 @@
+import { Pipe } from '@angular/core';
+ 
+@Pipe({name: "sortBy"})
+export class SortPipe {
+  transform(array: Array<string>, args: string): Array<string> {
+    array.sort((a: any, b: any) => {
+	    if ( a[args] < b[args] ){
+	    	return -1;
+	    }else if( a[args] > b[args] ){
+	        return 1;
+	    }else{
+	    	return 0;	
+	    }
+    });
+    return array;
+  }
+}
\ No newline at end of file
-- 
GitLab