From c9aa2948049518019e1b3133a3a5cfb8492d9ccc Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Thu, 26 Sep 2019 18:08:25 +0200
Subject: [PATCH] FIX #11781 TIME 0:20 add dnd order indexing actions

---
 .../indexing-administration.component.html    | 27 +++++++++++-----
 .../indexing-administration.component.scss    | 32 ++++++++++++++++++-
 .../indexing-administration.component.ts      | 21 ++++++++++--
 3 files changed, 69 insertions(+), 11 deletions(-)

diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.html b/src/frontend/app/administration/group/indexing/indexing-administration.component.html
index 798a8188149..524c85682c5 100644
--- a/src/frontend/app/administration/group/indexing/indexing-administration.component.html
+++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.html
@@ -3,10 +3,12 @@
 </div>
 <div class="row" style="margin:0px;">
     <div class="col-md-12">
-        <div *ngIf="!indexingInfo.canIndex" class="alert-message alert-message-danger" role="alert" style="margin-top: 30px;">{{lang.warnIndex}} 
+        <div *ngIf="!indexingInfo.canIndex" class="alert-message alert-message-danger" role="alert"
+            style="margin-top: 30px;">{{lang.warnIndex}}
             <button mat-raised-button (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.enableIndex}}</button>
         </div>
-        <button *ngIf="indexingInfo.canIndex" color="warn" mat-raised-button (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.disableIndex}}</button>
+        <button *ngIf="indexingInfo.canIndex" color="warn" mat-raised-button
+            (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.disableIndex}}</button>
     </div>
     <div class="col-md-8" style="margin-top:20px;">
         <div class="formType">
@@ -16,11 +18,19 @@
             <mat-hint class="infoActions">
                 {{lang.actionsInfo}}
             </mat-hint>
-            <plugin-autocomplete [labelPlaceholder]="'Associer une nouvelle action'" [labelList]="'Action(s) disponible(s)'"
-                [datas]="actionList" [targetSearchKey]="'label_action'" (triggerEvent)="addAction($event)"></plugin-autocomplete>
-            <mat-list class="selectedActionList" role="list">
-                <mat-list-item class="selectedAction" role="listitem" *ngFor="let action of indexingInfo.actions;let i=index">
-                    <div class="actionLabel">{{action.label_action}}</div>
+            <plugin-autocomplete [labelPlaceholder]="'Associer une nouvelle action'"
+                [labelList]="'Action(s) disponible(s)'" [datas]="actionList" [targetSearchKey]="'label_action'"
+                (triggerEvent)="addAction($event)"></plugin-autocomplete>
+            <mat-list cdkDropList [cdkDropListData]="indexingInfo.actions" (cdkDropListDropped)="drop($event)"
+                class="selectedActionList" role="list">
+                <mat-list-item class="selectedAction" role="listitem"
+                    *ngFor="let action of indexingInfo.actions;let i=index" [cdkDragData]="action" cdkDrag
+                    cdkDragLockAxis="y">
+                    <div>
+                        <i class="fas fa-bars fa-2x" color="primary" style="cursor: move" cdkDragHandle></i>
+                    </div>
+                    <div class="actionLabel">
+                        {{action.label_action}}</div>
                     <div>
                         <button mat-icon-button color="warn" (click)="removeAction(i)">
                             <mat-icon class="fa fa-trash"></mat-icon>
@@ -38,7 +48,8 @@
             </div>
             <mat-form-field appearance="outline">
                 <mat-icon color="primary" class="fa fa-search" matPrefix></mat-icon>
-                <input matInput id="jstree_search" name="jstree_search" type="text" placeholder="{{lang.searchEntities}}">
+                <input matInput id="jstree_search" name="jstree_search" type="text"
+                    placeholder="{{lang.searchEntities}}">
             </mat-form-field>
             <div #jstree id="jstree"></div>
         </div>
diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.scss b/src/frontend/app/administration/group/indexing/indexing-administration.component.scss
index 271348c973e..626eeaa940b 100644
--- a/src/frontend/app/administration/group/indexing/indexing-administration.component.scss
+++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.scss
@@ -19,6 +19,7 @@
     height: 70px;
 
     .actionLabel {
+        padding-left: 10px;
         flex: 1;
     }
 }
@@ -62,4 +63,33 @@ a {
     .mat-form-field-appearance-outline {
         font-size: 11px;
     }
-}
\ No newline at end of file
+}
+
+.cdk-drag-preview {
+    background: white;
+    i, .mat-icon-button {
+        visibility: hidden;
+    }
+
+    border-radius: 4px;
+    box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
+                0 8px 10px 1px rgba(0, 0, 0, 0.14),
+                0 3px 14px 2px rgba(0, 0, 0, 0.12);
+  }
+  
+  .cdk-drag-placeholder {
+    opacity: 0;
+  }
+  
+  .cdk-drag-animating {
+    transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
+  }
+  
+  .selectedAction:last-child {
+    border: none;
+  }
+  
+  .selectedAction.cdk-drop-list-dragging .selectedAction:not(.cdk-drag-placeholder) {
+    transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
+  }
+  
\ No newline at end of file
diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts
index 998d0e7e95c..ef7efca2ca1 100644
--- a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts
+++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts
@@ -8,6 +8,7 @@ import { of } from 'rxjs';
 import { MatDialogRef, MatDialog } from '@angular/material/dialog';
 import { ConfirmComponent } from '../../../../plugins/modal/confirm.component';
 import { HeaderService } from '../../../../service/header.service';
+import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
 
 declare function $j(selector: any): any;
 
@@ -120,7 +121,7 @@ export class IndexingAdministrationComponent implements OnInit {
                 "three_state": false //no cascade selection
             },
             'core': {
-                force_text : true,
+                force_text: true,
                 'themes': {
                     'name': 'proton',
                     'responsive': true
@@ -335,5 +336,21 @@ export class IndexingAdministrationComponent implements OnInit {
             })
         ).subscribe();
     }
-
+    drop(event: CdkDragDrop<string[]>) {
+
+        if (event.previousContainer === event.container) {
+            moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
+            const newActionListIds = this.indexingInfo.actions.map((action: any) => action.id);
+
+            this.http.put('../../rest/groups/' + this.groupId + '/indexing', { actions: newActionListIds }).pipe(
+                tap(() => {
+                    this.notify.success(this.lang.actionAdded);
+                }),
+                catchError((err: any) => {
+                    this.notify.handleErrors(err);
+                    return of(false);
+                })
+            ).subscribe();
+        }
+    }
 }
-- 
GitLab