From 2ba338343f160d619125c1a6dd9a60510bdd1483 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Fri, 8 Feb 2019 20:05:23 +0100
Subject: [PATCH] FEAT #9156 front admin list result

---
 .../administration/administration.module.ts   |   8 +-
 .../basket-administration.component.html      | 118 +-------
 .../basket-administration.component.scss      | 189 ------------
 .../basket/basket-administration.component.ts | 271 ------------------
 .../list/list-administration.component.html   | 108 +++++++
 .../list/list-administration.component.scss   | 201 +++++++++++++
 .../list/list-administration.component.ts     | 245 ++++++++++++++++
 7 files changed, 563 insertions(+), 577 deletions(-)
 create mode 100644 src/frontend/app/administration/basket/list/list-administration.component.html
 create mode 100644 src/frontend/app/administration/basket/list/list-administration.component.scss
 create mode 100644 src/frontend/app/administration/basket/list/list-administration.component.ts

diff --git a/src/frontend/app/administration/administration.module.ts b/src/frontend/app/administration/administration.module.ts
index 540492c59a4..e0b35ee967c 100755
--- a/src/frontend/app/administration/administration.module.ts
+++ b/src/frontend/app/administration/administration.module.ts
@@ -46,7 +46,9 @@ import { SecuritiesAdministrationComponent }            from './security/securit
 import { SendmailAdministrationComponent }            from './sendmail/sendmail-administration.component';
 
 import { TechnicalAdministrationComponent }            from './technical/technical-administration.component';
+// TO DO CHANGE COMPONENT NAME
 import { ListAdministrationComponent }            from './list/list-administration.component';
+import { ListAdministrationComponent2 }            from './basket/list/list-administration.component';
 
 @NgModule({
     imports:      [
@@ -100,7 +102,8 @@ import { ListAdministrationComponent }            from './list/list-administrati
         SecuritiesAdministrationComponent,
         SendmailAdministrationComponent,
         TechnicalAdministrationComponent,
-        ListAdministrationComponent
+        ListAdministrationComponent,
+        ListAdministrationComponent2
     ],
     entryComponents: [
         UsersAdministrationRedirectModalComponent,
@@ -111,7 +114,8 @@ import { ListAdministrationComponent }            from './list/list-administrati
         BasketAdministrationGroupListModalComponent,
         DoctypesAdministrationRedirectModalComponent,
         TechnicalAdministrationComponent,
-        ListAdministrationComponent
+        ListAdministrationComponent,
+        ListAdministrationComponent2
     ],
 })
 export class AdministrationModule {}
\ No newline at end of file
diff --git a/src/frontend/app/administration/basket/basket-administration.component.html b/src/frontend/app/administration/basket/basket-administration.component.html
index 3213f0a9fcb..03f771d820d 100755
--- a/src/frontend/app/administration/basket/basket-administration.component.html
+++ b/src/frontend/app/administration/basket/basket-administration.component.html
@@ -113,7 +113,7 @@
                             <span>{{group.group_desc}}</span>
                             <mat-icon color="warn" class="fa fa-times" matTooltip="{{lang.unlinkGroup}}" (click)="unlinkGroup(i)"></mat-icon>
                         </ng-template>
-                        <mat-tab-group (selectedTabChange)="initResultList($event,i)">
+                        <mat-tab-group>
                             <mat-tab label="Action(s)">
                                 <div class="col-md-6">
                                     <mat-form-field style="margin-top:5px;">
@@ -194,120 +194,8 @@
                                     </mat-accordion>
                                 </div>
                             </mat-tab>
-                            <mat-tab label="Page de résultat">
-                                <mat-toolbar class="editorTool">
-                                    <span>
-                                        <button *ngIf="displayMode=='label'" color="default" mat-button (click)="toggleData()">
-                                            Mode données
-                                        </button>
-                                        <button *ngIf="displayMode=='sample'" color="primary" mat-button (click)="toggleData()">
-                                            Mode édition
-                                        </button>
-                                        <span class="separator"></span>
-                                    </span>
-                                    <span class="area">
-                                        <form style="width:100%;">
-                                            <mat-form-field appearance="outline" floatLabel="never">
-                                                <input name="availableData" type="text" matInput [formControl]="dataControl"
-                                                    placeholder="Données disponibles" [matAutocomplete]="auto">
-                                                <mat-autocomplete #auto="matAutocomplete">
-                                                    <mat-option *ngFor="let item of filteredDataOptions | async"
-                                                        [value]="item.label" (click)="addData(item)" class="dataList">
-                                                        <span class="dataIcon">
-                                                            <i color="primary" class="fa {{item.icon}} fa-2x"></i>
-                                                        </span>
-                                                        <span class="dataLabel">
-                                                            {{item.label}}
-                                                        </span>
-                                                    </mat-option>
-                                                </mat-autocomplete>
-                                            </mat-form-field>
-                                        </form>
-                                    </span>
-                                    <span>
-                                        <span class="separator"></span>
-                                        <button color="warn" mat-button (click)="removeAllData()" style="float:right;">
-                                            Tout effacer
-                                        </button>
-                                    </span>
-                                </mat-toolbar>
-                                <mat-card style="border-bottom: solid 1px rgba(0,0,0,0.12);">
-                                    <mat-toolbar class="secondaryInformations example-list" cdkDropListOrientation="horizontal"
-                                        cdkDropList [cdkDropListData]="displayedSecondaryData" (cdkDropListDropped)="drop($event)">
-                                        <span class="example-box" *ngFor="let item of displayedSecondaryData;let itData=index"
-                                            cdkDrag>
-                                            <button *ngIf="displayMode=='label'" color="primary" mat-icon-button
-                                                [matMenuTriggerFor]="menu">
-                                                <mat-icon fontSet="fas" fontIcon="fa-ellipsis-v fa-2x"></mat-icon>
-                                            </button>
-                                            <mat-menu #menu="matMenu">
-                                                <button mat-menu-item style="text-align: center;" (click)="removeData(item,itData)">
-                                                    <mat-icon style="height: auto;" color="warn" fontSet="fas" fontIcon="fa-trash fa-2x"></mat-icon>
-                                                    <span>{{lang.delete}}</span>
-                                                </button>
-                                                <mat-divider></mat-divider>
-                                                <button mat-menu-item (click)="setFont(item,'boldFontData')">
-                                                    <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-bold fa-2x"></mat-icon>
-                                                    <span>Gras</span>
-                                                </button>
-                                                <button mat-menu-item (click)="setFont(item,'centerData')">
-                                                    <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-align-center fa-2x"></mat-icon>
-                                                    <span>Centré</span>
-                                                </button>
-                                                <button mat-menu-item (click)="setFont(item,'rightData')">
-                                                    <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-align-right fa-2x"></mat-icon>
-                                                    <span>Droite</span>
-                                                </button>
-                                                <button mat-menu-item (click)="setFont(item,'bigFontData')">
-                                                    <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-text-height fa-2x"></mat-icon>
-                                                    <span>Grand</span>
-                                                </button>
-                                            </mat-menu>
-                                            <span style="width:100%;" [class]="item.class.join(' ')">
-                                                <i class="fa {{item.icon}}"></i>&nbsp;
-                                                <span style="width:100%;" [innerHTML]="item[displayMode]"></span>
-                                            </span>
-                                        </span>
-                                    </mat-toolbar>
-                                    <div class="resultRow newRow">
-                                        <span class="resultCol" *ngFor="let item of displayedMainData;let i=index"
-                                            [class]="item.class.join(' ')">
-                                            <span *ngIf="i == 0">
-                                                <mat-icon color="primary" class="fm fm-letter-status-inprogress fm-2x"></mat-icon><br />
-                                                <span style="color: rgba(0,0,0,0.4);font-size: 90%;">{{item[displayMode]}}</span>
-                                            </span>
-                                            <span *ngIf="i == 1">
-                                                {{item[displayMode]}}
-                                            </span>
-                                        </span>
-                                        <mat-button-toggle-group class="actions" multiple>
-                                            <button color="primary" mat-icon-button title="{{lang.notes}}" [disabled]="displayMode == 'label'">
-                                                <mat-icon [matBadgeHidden]="displayMode == 'label'" fontSet="fas"
-                                                    matBadge="2" fontIcon="fa-comments fa-2x"></mat-icon>
-                                            </button>
-                                            <button color="primary" mat-icon-button title="{{lang.attachments}}"
-                                                [disabled]="displayMode == 'label'">
-                                                <mat-icon [matBadgeHidden]="displayMode == 'label'" fontSet="fas"
-                                                    matBadge="7" fontIcon="fa-paperclip fa-2x"></mat-icon>
-                                            </button>
-                                            <button color="primary" mat-icon-button title="{{lang.diffusionList}}"
-                                                [disabled]="displayMode == 'label'">
-                                                <mat-icon fontSet="fas" fontIcon="fa-sitemap fa-2x"></mat-icon>
-                                            </button>
-                                            <button color="primary" mat-icon-button title="{{lang.linkDetails}}"
-                                                [disabled]="displayMode == 'label'">
-                                                <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon>
-                                            </button>
-                                        </mat-button-toggle-group>
-                                    </div>
-                                </mat-card>
-                                <div class="row">
-                                    <div class="col-md-12 text-center">
-                                        <button color="primary" mat-raised-button (click)="saveTemplate()">
-                                            {{lang.validate}}
-                                        </button>
-                                    </div>
-                                </div>
+                            <mat-tab label="Page de résultats">
+                                <list-administration [currentBasketGroup]="group"></list-administration>
                             </mat-tab>
                         </mat-tab-group>
                     </mat-tab>
diff --git a/src/frontend/app/administration/basket/basket-administration.component.scss b/src/frontend/app/administration/basket/basket-administration.component.scss
index 513a6d3325d..a9f5f1be551 100644
--- a/src/frontend/app/administration/basket/basket-administration.component.scss
+++ b/src/frontend/app/administration/basket/basket-administration.component.scss
@@ -1,192 +1,3 @@
 .mat-chip {
     padding: 25px !important;
-}
-
-.availableData {
-    margin: 10px;
-    display: flex;
-}
-
-.secondaryInformations {
-    border: solid 1px #F9983066;
-    font-size: 10px;
-    height: 30px;
-    color: #666;
-}
-
-.resultRow {
-    align-items: center;
-    display: flex;
-    padding: 5px;
-
-    &-mobile {
-        font-size: 80%;
-    }
-}
-
-.resultCol {
-    flex: 1;
-    overflow: hidden;
-    text-overflow: ellipsis;
-
-    &-mobile {
-        overflow: inherit;
-        text-overflow: inherit;
-        word-break: break-all;
-    }
-}
-
-.actions {
-    text-align: right;
-    box-shadow: none;
-    border: none;
-    flex: 1;
-    justify-content: flex-end;
-    overflow: inherit;
-}
-
-.elemToDrag {
-    flex: 1;
-    border: dashed 1px;
-    padding: 10px;
-    height: 10px;
-    line-height: 0px;
-    cursor: move;
-    margin-right: 5px;
-    margin-left: 5px;
-}
-
-.columns {
-    width: 100%;
-    height: 90px;
-    padding: 20px 10px;
-    border-bottom: solid 1px #ccc;
-    color: rgba(0, 0, 0, 0.87);
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    justify-content: space-between;
-    box-sizing: border-box;
-    background: white;
-    font-size: 14px;
-}
-
-.mat-badge-content {
-    background: #F99830;   
-}
-
-.example-list {
-    max-width: 100%;
-    height: 30px;
-    display: flex;
-    flex-direction: row;
-    border-radius: 4px;
-    overflow: hidden;
-    border: solid 1px #F9983066;
-    font-size: 10px;
-    background: #f5f5f5;
-}
-
-.example-box {
-    padding: 20px 10px;
-    //border-right: solid 1px #ccc;
-    color: #666;
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    justify-content: space-between;
-    box-sizing: border-box;
-    cursor: move;
-    background: #f5f5f5;
-    flex-grow: 1;
-    flex-basis: 0;
-}
-
-.cdk-drag-preview {
-    box-sizing: border-box;
-    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);
-}
-
-.example-box:last-child {
-    border: none;
-}
-
-.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder) {
-    transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
-}
-
-.editorTool {
-    display: flex;
-    height: 44px;
-    font-size: 10px;
-    margin-bottom: 10px;
-
-    .area {
-        flex: 1;
-    }
-
-    .separator {
-        border-left: solid 1px #666;
-        height: 70%;
-        margin-left: 10px;
-        margin-right: 10px;
-    }
-
-    .mat-form-field {
-        height: 35px;
-    }
-}
-
-/deep/ .mat-option-text {
-    display: flex !important;
-
-    .dataIcon {
-        width: 30px;
-        
-        i {
-            font-size: 14px;
-        }
-    }
-    .dataLabel {
-        flex: 1;
-    }
-}
-
-.centerData {
-    text-align: center;
-}
-
-.rightData {
-    text-align: right;
-}
-
-.boldFontData {
-    font-weight: bold;
-}
-
-.bigFontData {
-    font-size: 14px;
-}
-
-.smallFontData {
-    font-size: 10px;
-}
-
-.normalData {
-    flex: 1;
-}
-
-.longData {
-    flex: 3;
 }
\ No newline at end of file
diff --git a/src/frontend/app/administration/basket/basket-administration.component.ts b/src/frontend/app/administration/basket/basket-administration.component.ts
index cf2d263e736..d766f57a94d 100755
--- a/src/frontend/app/administration/basket/basket-administration.component.ts
+++ b/src/frontend/app/administration/basket/basket-administration.component.ts
@@ -8,9 +8,6 @@ import { NotificationService } from '../../notification.service';
 import { HeaderService } from '../../../service/header.service';
 import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin';
 import { FormControl } from '@angular/forms';
-import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
-import { Observable } from 'rxjs';
-import { startWith, map } from 'rxjs/operators';
 
 declare function $j(selector: any): any;
 declare var angularGlobals: any;
@@ -47,101 +44,6 @@ export class BasketAdministrationComponent implements OnInit {
     resultPages: any[] = [];
     list_display: any[] = [];
     creationMode: boolean;
-    availableData: any = [
-        {
-            'id': 'priority_label',
-            'label': 'Priorité',
-            'sample': 'normal',
-            'class': [],
-            'icon': 'fa-traffic-light '
-        },
-        {
-            'id': 'category',
-            'label': 'Catégorie',
-            'sample': 'courrier arrivée',
-            'class': [],
-            'icon': 'fa-file'
-        },
-        {
-            'id': 'type',
-            'label': 'Type de courrier',
-            'sample': 'Réclamation',
-            'class': [],
-            'icon': 'fa-suitcase'
-        },
-        {
-            'id': 'attribution',
-            'label': 'Attributaire (entité destinatrice)',
-            'sample': 'Barbara BAIN (Pôle Jeunesse et Sport)',
-            'class': [],
-            'icon': 'fa-sitemap'
-        },
-        {
-            'id': 'senders',
-            'label': 'Destinataire',
-            'sample': 'Patricia PETIT',
-            'class': [],
-            'icon': 'fa-user'
-        },
-        {
-            'id': 'recipients',
-            'label': 'Expéditeur',
-            'sample': 'Alain DUBOIS (MAARCH)',
-            'class': [],
-            'icon': 'fa-book'
-        },
-        {
-            'id': 'creation_limit_date',
-            'label': 'Date de création - Date limite',
-            'sample': '1er mai - <i class="fa fa-stopwatch"></i>&nbsp;<b color="warn">3 jour(s)</b>',
-            'class': [],
-            'icon': 'fa-calendar'
-        },
-        {
-            'id': 'workflow_visa',
-            'label': 'Circuit de visa',
-            'sample': '<i color="accent" class="fa fa-check"></i> Barbara BAIN -> <i class="fa fa-hourglass-half"></i> <b>Bruno BOULE</b> -> <i class="fa fa-hourglass-half"></i> Patricia PETIT',
-            'class': [],
-            'icon': 'fa-list-ol'
-        },
-        {
-            'id': 'workflow_avis',
-            'label': 'Nombre d\'avis donné',
-            'sample': '<b>3</b> avis donné(s)',
-            'class': [],
-            'icon': 'fa-comment-alt'
-        },
-    ];
-    displayedMainData: any = [];
-    displayedSecondaryData: any = [{
-        'id': 'priority_label',
-            'class': [],
-        },
-        {
-            'id': 'category',
-            'class': [],
-        },
-        {
-            'id': 'type',
-            'class': [],
-        },
-        {
-            'id': 'senders',
-            'class': [],
-        },
-        {
-            'id': 'recipients',
-            'class': [],
-        },
-        {
-            'id': 'creation_limit_date',
-            'class': [],
-        }
-    ];
-    displayMode: string = 'label';
-    dataControl = new FormControl();
-    filteredDataOptions: Observable<string[]>;
-    resultListLoaded: boolean = false;
 
     displayedColumns = ['label_action', 'actions'];
     orderColumns = ['alt_identifier', 'creation_date', 'process_limit_date', 'res_id', 'priority'];
@@ -442,179 +344,6 @@ export class BasketAdministrationComponent implements OnInit {
                 });
         }
     }
-
-    toggleData() {
-        if (this.displayMode == 'label') {
-            this.displayMode = 'sample';
-        } else {
-            this.displayMode = 'label';
-        }
-
-    }
-
-    initResultList(e: any, indexGroup: any) {
-        if (e.index == 1) {
-            console.log('init');
-
-            this.filteredDataOptions = this.dataControl.valueChanges
-            .pipe(
-            startWith(''),
-            map(value => this._filterData(value))
-            );
-
-            let indexData: number = 0;
-
-            this.availableData = [
-                {
-                    'id': 'priority_label',
-                    'label': 'Priorité',
-                    'sample': 'normal',
-                    'class': [],
-                    'icon': 'fa-traffic-light '
-                },
-                {
-                    'id': 'category',
-                    'label': 'Catégorie',
-                    'sample': 'courrier arrivée',
-                    'class': [],
-                    'icon': 'fa-file'
-                },
-                {
-                    'id': 'type',
-                    'label': 'Type de courrier',
-                    'sample': 'Réclamation',
-                    'class': [],
-                    'icon': 'fa-suitcase'
-                },
-                {
-                    'id': 'attribution',
-                    'label': 'Attributaire (entité destinatrice)',
-                    'sample': 'Barbara BAIN (Pôle Jeunesse et Sport)',
-                    'class': [],
-                    'icon': 'fa-sitemap'
-                },
-                {
-                    'id': 'senders',
-                    'label': 'Destinataire',
-                    'sample': 'Patricia PETIT',
-                    'class': [],
-                    'icon': 'fa-user'
-                },
-                {
-                    'id': 'recipients',
-                    'label': 'Expéditeur',
-                    'sample': 'Alain DUBOIS (MAARCH)',
-                    'class': [],
-                    'icon': 'fa-book'
-                },
-                {
-                    'id': 'creation_limit_date',
-                    'label': 'Date de création - Date limite',
-                    'sample': '1er mai - <i class="fa fa-stopwatch"></i>&nbsp;<b color="warn">3 jour(s)</b>',
-                    'class': [],
-                    'icon': 'fa-calendar'
-                },
-                {
-                    'id': 'workflow_visa',
-                    'label': 'Circuit de visa',
-                    'sample': '<i color="accent" class="fa fa-check"></i> Barbara BAIN -> <i class="fa fa-hourglass-half"></i> <b>Bruno BOULE</b> -> <i class="fa fa-hourglass-half"></i> Patricia PETIT',
-                    'class': [],
-                    'icon': 'fa-list-ol'
-                },
-                {
-                    'id': 'workflow_avis',
-                    'label': 'Nombre d\'avis donné',
-                    'sample': '<b>3</b> avis donné(s)',
-                    'class': [],
-                    'icon': 'fa-comment-alt'
-                },
-            ];
-            if (this.basketGroups[indexGroup].list_display.length > 0) {
-                this.displayedSecondaryData = [];
-                this.basketGroups[indexGroup].list_display.forEach((element: any) => {
-                    indexData = this.availableData.map((e: any) => { return e.id; }).indexOf(element.id);
-                    this.availableData[indexData].class = element.class;
-                    this.displayedSecondaryData.push(this.availableData[indexData]);
-                    this.availableData.splice(indexData, 1);
-                });
-            }
-            
-            this.displayedMainData = [
-                {
-                    'id': 'status_chrono',
-                    'label': 'N°Chrono',
-                    'sample': 'MAARCH/2018A/1',
-                    'class': ['centerData', 'normalData'],
-                    'icon': ''
-                },
-                {
-                    'id': 'subject',
-                    'label': 'Objet',
-                    'sample': 'Plainte concernant des nuisances sonore nocturne (le 20/12/2018)',
-                    'class': ['longData'],
-                    'icon': ''
-                },
-            ];
-
-            this.resultListLoaded = true;
-        }
-
-    }
-
-    setFont(item: any, value: string) {
-        const index = item.class.indexOf(value);
-
-        if (index === -1) {
-            item.class.push(value);
-        } else {
-            item.class.splice(index, 1);
-        }
-    }
-
-    addData(data: any) {
-        let i = this.availableData.map((e: any) => { return e.id; }).indexOf(data.id);
-        this.displayedSecondaryData.push(data);
-        this.availableData.splice(i, 1);
-        this.dataControl.setValue('');
-    }
-
-    removeData(data: any, i: number) {
-        this.availableData.push(data);
-        this.displayedSecondaryData.splice(i, 1);
-        this.dataControl.setValue('');
-    }
-
-    removeAllData() {
-        this.availableData = this.availableData.concat(this.displayedSecondaryData);
-        this.displayedSecondaryData = [];
-        this.dataControl.setValue('');
-    }
-
-    drop(event: CdkDragDrop<string[]>) {
-        if (event.previousContainer === event.container) {
-            moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
-        }
-    }
-
-    saveTemplate() {
-        let template: any = [];
-        this.displayedSecondaryData.forEach((element: any) => {
-            template.push(
-                {
-                    'id': element.id,
-                    'class': element.class,
-                }
-            );
-        });
-
-        console.log(template);
-    }
-
-    private _filterData(value: string): string[] {
-        const filterValue = value.toLowerCase();
-    
-        return this.availableData.filter((option:any) => option.label.toLowerCase().includes(filterValue));
-    }
 }
 
 @Component({
diff --git a/src/frontend/app/administration/basket/list/list-administration.component.html b/src/frontend/app/administration/basket/list/list-administration.component.html
new file mode 100644
index 00000000000..ce349963bdf
--- /dev/null
+++ b/src/frontend/app/administration/basket/list/list-administration.component.html
@@ -0,0 +1,108 @@
+<mat-toolbar class="editorTool">
+    <span>
+        <button color="primary" *ngIf="displayMode=='label'" mat-icon-button (click)="toggleData()" title="Prévisualisation">
+            <mat-icon fontSet="fas" fontIcon="fa-eye" title="Mode données"></mat-icon>
+        </button>
+        <button color="primary" *ngIf="displayMode=='sample'" mat-icon-button (click)="toggleData()" title="Édition">
+            <mat-icon fontSet="fas" fontIcon="fa-edit" title="Mode édition"></mat-icon>
+        </button>
+    </span>
+    <span class="area">
+        <form style="width:100%;">
+            <mat-form-field appearance="outline" floatLabel="never">
+                <input name="availableData" type="text" matInput [formControl]="dataControl" placeholder="Données disponibles"
+                    [matAutocomplete]="auto">
+                <mat-autocomplete #auto="matAutocomplete" (optionSelected)="addData($event)">
+                    <mat-option *ngFor="let item of filteredDataOptions | async" [value]="item" class="dataList">
+                        <span class="dataIcon">
+                            <i color="primary" class="fa {{item.icon}} fa-2x"></i>
+                        </span>
+                        <span class="dataLabel">
+                            {{item.label}}
+                        </span>
+                    </mat-option>
+                </mat-autocomplete>
+            </mat-form-field>
+        </form>
+    </span>
+    <span>
+        <button color="warn" mat-button (click)="removeAllData()" style="float:right;" [disabled]="displayMode=='sample'">
+            Tout effacer
+        </button>
+    </span>
+</mat-toolbar>
+<mat-card style="border-bottom: solid 1px rgba(0,0,0,0.12);">
+    <ng-container *ngIf="(displayedSecondaryData.length > 0 && displayMode=='sample') || displayMode=='label'">
+        <mat-toolbar class="secondaryInformations example-list" cdkDropListOrientation="horizontal" cdkDropList
+            [cdkDropListData]="displayedSecondaryData" (cdkDropListDropped)="drop($event)">
+            <span class="example-box" *ngFor="let item of displayedSecondaryData;let itData=index" cdkDrag>
+                <button *ngIf="displayMode=='label'" color="primary" mat-icon-button [matMenuTriggerFor]="menu">
+                    <mat-icon fontSet="fas" fontIcon="fa-ellipsis-v fa-2x"></mat-icon>
+                </button>
+                <mat-menu #menu="matMenu">
+                    <button mat-menu-item style="text-align: center;" (click)="removeData(item,itData)">
+                        <mat-icon style="height: auto;" color="warn" fontSet="fas" fontIcon="fa-trash fa-2x"></mat-icon>
+                        <span>{{lang.delete}}</span>
+                    </button>
+                    <mat-divider></mat-divider>
+                    <button [class.isSelectedMenu]="item.cssClasses.indexOf('boldFontData') > 0" mat-menu-item (click)="setStyle(item,'boldFontData')">
+                        <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-bold fa-2x"></mat-icon>
+                        <span>Gras</span>
+                    </button>
+                    <button [class.isSelectedMenu]="item.cssClasses.indexOf('align_centerData') > 0" mat-menu-item (click)="setStyle(item,'align_centerData')">
+                        <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-align-center fa-2x"></mat-icon>
+                        <span>Centré</span>
+                    </button>
+                    <button [class.isSelectedMenu]="item.cssClasses.indexOf('align_rightData') > 0" mat-menu-item (click)="setStyle(item,'align_rightData')">
+                        <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-align-right fa-2x"></mat-icon>
+                        <span>Droite</span>
+                    </button>
+                    <button [class.isSelectedMenu]="item.cssClasses.indexOf('bigFontData') > 0" mat-menu-item (click)="setStyle(item,'bigFontData')">
+                        <mat-icon style="height: auto;" fontSet="fas" fontIcon="fa-text-height fa-2x"></mat-icon>
+                        <span>Grand</span>
+                    </button>
+                </mat-menu>
+                <span style="width:100%;" [class]="item.cssClasses.join(' ')">
+                    <i class="fa {{item.icon}}"></i>&nbsp;
+                    <span style="width:100%;" [innerHTML]="item[displayMode]"></span>
+                </span>
+            </span>
+        </mat-toolbar>
+    </ng-container>
+    <div class="resultRow newRow">
+        <span class="resultCol" *ngFor="let item of displayedMainData;let i=index" [class]="item.cssClasses.join(' ')">
+            <span *ngIf="i == 0">
+                <mat-icon *ngIf="displayMode=='label'" color="primary" class="fm fm-letter fm-2x"></mat-icon>
+                <mat-icon *ngIf="displayMode=='sample'" color="warn" class="fm fm-letter-status-inprogress fm-2x"></mat-icon><br />
+                <span style="color: rgba(0,0,0,0.4);font-size: 90%;">{{item[displayMode]}}</span>
+            </span>
+            <span *ngIf="i == 1">
+                {{item[displayMode]}}
+            </span>
+        </span>
+        <mat-button-toggle-group class="actions" multiple>
+            <button color="primary" mat-icon-button title="{{lang.notes}}" [disabled]="displayMode == 'label'">
+                <mat-icon [matBadgeHidden]="displayMode == 'label'" fontSet="fas" matBadge="2" fontIcon="fa-comments fa-2x"></mat-icon>
+            </button>
+            <button color="primary" mat-icon-button title="{{lang.attachments}}" [disabled]="displayMode == 'label'">
+                <mat-icon [matBadgeHidden]="displayMode == 'label'" fontSet="fas" matBadge="7" fontIcon="fa-paperclip fa-2x"></mat-icon>
+            </button>
+            <button color="primary" mat-icon-button title="{{lang.diffusionList}}" [disabled]="displayMode == 'label'">
+                <mat-icon fontSet="fas" fontIcon="fa-sitemap fa-2x"></mat-icon>
+            </button>
+            <button color="primary" mat-icon-button title="{{lang.linkDetails}}" [disabled]="displayMode == 'label'">
+                <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon>
+            </button>
+        </mat-button-toggle-group>
+    </div>
+</mat-card>
+<div class="row">
+    <div class="col-md-12 text-center">
+        <button color="primary" mat-raised-button (click)="saveTemplate()" [disabled]="checkModif()">
+            {{lang.validate}}
+        </button>
+        <button color="default" mat-raised-button (click)="cancelModification()" [disabled]="checkModif()">
+            {{lang.cancel}}
+        </button>
+    </div>
+</div>
\ No newline at end of file
diff --git a/src/frontend/app/administration/basket/list/list-administration.component.scss b/src/frontend/app/administration/basket/list/list-administration.component.scss
new file mode 100644
index 00000000000..30e2d8c659d
--- /dev/null
+++ b/src/frontend/app/administration/basket/list/list-administration.component.scss
@@ -0,0 +1,201 @@
+.availableData {
+  margin: 10px;
+  display: flex;
+}
+
+.secondaryInformations {
+  border: solid 1px #F9983066;
+  font-size: 10px;
+  height: 30px;
+  color: #666;
+}
+
+.resultRow {
+  align-items: center;
+  display: flex;
+  padding: 5px;
+
+  &-mobile {
+    font-size: 80%;
+  }
+}
+
+.resultCol {
+  flex: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+
+  &-mobile {
+    overflow: inherit;
+    text-overflow: inherit;
+    word-break: break-all;
+  }
+}
+
+.actions {
+  text-align: right;
+  box-shadow: none;
+  border: none;
+  flex: 1;
+  justify-content: flex-end;
+  overflow: inherit;
+}
+
+.elemToDrag {
+  flex: 1;
+  border: dashed 1px;
+  padding: 10px;
+  height: 10px;
+  line-height: 0px;
+  cursor: move;
+  margin-right: 5px;
+  margin-left: 5px;
+}
+
+.columns {
+  width: 100%;
+  height: 90px;
+  padding: 20px 10px;
+  border-bottom: solid 1px #ccc;
+  color: rgba(0, 0, 0, 0.87);
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  box-sizing: border-box;
+  background: white;
+  font-size: 14px;
+}
+
+.mat-badge-content {
+  background: #F99830;
+}
+
+.example-list {
+  max-width: 100%;
+  height: 30px;
+  display: flex;
+  flex-direction: row;
+  border-radius: 4px;
+  overflow: hidden;
+  border: solid 1px #F9983066;
+  font-size: 10px;
+  background: #f5f5f5;
+}
+
+.example-box {
+  padding: 20px 10px;
+  //border-right: solid 1px #ccc;
+  color: #666;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  box-sizing: border-box;
+  cursor: move;
+  background: #f5f5f5;
+  flex-grow: 1;
+  flex-basis: 0;
+}
+
+.cdk-drag-preview {
+  box-sizing: border-box;
+  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);
+}
+
+.example-box:last-child {
+  border: none;
+}
+
+.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder) {
+  transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
+}
+
+.editorTool {
+  display: flex;
+  height: 44px;
+  font-size: 10px;
+  margin-bottom: 10px;
+
+  .area {
+    flex: 1;
+  }
+
+  .separator {
+    border-left: solid 1px #666;
+    height: 70%;
+    margin-left: 10px;
+    margin-right: 10px;
+  }
+
+  .mat-form-field {
+    height: 35px;
+  }
+
+  /deep/ .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline {
+    background: inherit;
+  }
+
+  /deep/ .mat-form-field-outline {
+    background: white;
+  }
+}
+
+/deep/ .mat-option-text {
+  display: flex !important;
+
+  .dataIcon {
+    width: 30px;
+
+    i {
+      font-size: 14px;
+    }
+  }
+
+  .dataLabel {
+    flex: 1;
+  }
+}
+
+.isSelectedMenu {
+  box-shadow: inset 0px 0px 5px 0px #656565;
+}
+
+.align_centerData {
+  text-align: center;
+}
+
+.align_rightData {
+  text-align: right;
+}
+
+.boldFontData {
+  font-weight: bold;
+}
+
+.bigFontData {
+  font-size: 14px;
+}
+
+.smallFontData {
+  font-size: 10px;
+}
+
+.normalData {
+  flex: 1;
+}
+
+.longData {
+  flex: 3;
+}
\ No newline at end of file
diff --git a/src/frontend/app/administration/basket/list/list-administration.component.ts b/src/frontend/app/administration/basket/list/list-administration.component.ts
new file mode 100644
index 00000000000..37048a19a48
--- /dev/null
+++ b/src/frontend/app/administration/basket/list/list-administration.component.ts
@@ -0,0 +1,245 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { LANG } from '../../../translate.component';
+import { NotificationService } from '../../../notification.service';
+import { Observable } from 'rxjs';
+import { FormControl } from '@angular/forms';
+import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
+import { startWith, map } from 'rxjs/operators';
+
+@Component({
+    selector: 'list-administration',
+    templateUrl: "list-administration.component.html",
+    styleUrls: ['list-administration.component.scss'],
+    providers: [NotificationService],
+})
+export class ListAdministrationComponent2 implements OnInit {
+
+    lang: any = LANG;
+    loading: boolean = false;
+
+    displayedMainData: any = [
+        {
+            'value': 'status_chrono',
+            'label': 'N°Chrono',
+            'sample': 'MAARCH/2018A/1',
+            'cssClasses': ['align_centerData', 'normalData'],
+            'icon': ''
+        },
+        {
+            'value': 'subject',
+            'label': 'Objet',
+            'sample': 'Plainte concernant des nuisances sonore nocturne (le 20/12/2018)',
+            'cssClasses': ['longData'],
+            'icon': ''
+        },];
+
+    availableData: any = [
+        {
+            'value': 'priority_label',
+            'label': 'Priorité',
+            'sample': 'normal',
+            'cssClasses': [],
+            'icon': 'fa-traffic-light '
+        },
+        {
+            'value': 'category',
+            'label': 'Catégorie',
+            'sample': 'courrier arrivée',
+            'cssClasses': [],
+            'icon': 'fa-exchange-alt'
+        },
+        {
+            'value': 'type',
+            'label': 'Type de courrier',
+            'sample': 'Réclamation',
+            'cssClasses': [],
+            'icon': 'fa-suitcase'
+        },
+        {
+            'value': 'attribution',
+            'label': 'Attributaire (entité destinatrice)',
+            'sample': 'Barbara BAIN (Pôle Jeunesse et Sport)',
+            'cssClasses': [],
+            'icon': 'fa-sitemap'
+        },
+        {
+            'value': 'senders',
+            'label': 'Destinataire',
+            'sample': 'Patricia PETIT',
+            'cssClasses': [],
+            'icon': 'fa-user'
+        },
+        {
+            'value': 'recipients',
+            'label': 'Expéditeur',
+            'sample': 'Alain DUBOIS (MAARCH)',
+            'cssClasses': [],
+            'icon': 'fa-book'
+        },
+        {
+            'value': 'creation_limit_date',
+            'label': 'Date de création - Date limite',
+            'sample': '1er mai - <i class="fa fa-stopwatch"></i>&nbsp;<b color="warn">3 jour(s)</b>',
+            'cssClasses': [],
+            'icon': 'fa-calendar'
+        },
+        {
+            'value': 'workflow_visa',
+            'label': 'Circuit de visa',
+            'sample': '<i color="accent" class="fa fa-check"></i> Barbara BAIN -> <i class="fa fa-hourglass-half"></i> <b>Bruno BOULE</b> -> <i class="fa fa-hourglass-half"></i> Patricia PETIT',
+            'cssClasses': [],
+            'icon': 'fa-list-ol'
+        },
+        {
+            'value': 'workflow_avis',
+            'label': 'Nombre d\'avis donné',
+            'sample': '<b>3</b> avis donné(s)',
+            'cssClasses': [],
+            'icon': 'fa-comment-alt'
+        },
+    ];
+    availableDataClone: any = [];
+
+    displayedSecondaryData: any = [];
+    displayedSecondaryDataClone: any = [];
+
+    displayMode: string = 'label';
+    dataControl = new FormControl();
+    filteredDataOptions: Observable<string[]>;
+
+    @Input('currentBasketGroup') private basketGroup: any;
+
+    constructor(public http: HttpClient, private notify: NotificationService) { }
+
+    ngOnInit(): void {
+        this.filteredDataOptions = this.dataControl.valueChanges
+            .pipe(
+                startWith(''),
+                map(value => this._filterData(value))
+            );
+
+        this.availableDataClone = JSON.parse(JSON.stringify(this.availableData));
+        this.displayedSecondaryData = [];
+        let indexData: number = 0;
+        this.basketGroup.list_display.forEach((element: any) => {
+            indexData = this.availableData.map((e: any) => { return e.value; }).indexOf(element.value);
+            this.availableData[indexData].cssClasses = element.cssClasses;
+            this.displayedSecondaryData.push(this.availableData[indexData]);
+            this.availableData.splice(indexData, 1);
+        });
+        this.displayedSecondaryDataClone = JSON.parse(JSON.stringify(this.displayedSecondaryData));
+    }
+
+    toggleData() {
+        this.dataControl.disabled ? this.dataControl.enable() : this.dataControl.disable();
+
+        if (this.displayMode == 'label') {
+            this.displayMode = 'sample';
+        } else {
+            this.displayMode = 'label';
+        }
+
+    }
+
+    setStyle(item: any, value: string) {
+        let typeFont = value.split('_');
+
+        if(typeFont.length == 2) {
+            item.cssClasses.forEach((element: any, index: number) => {
+                if (element.includes(typeFont[0]) && element != value) {
+                    item.cssClasses.splice(index, 1);
+                }
+            });
+        }
+        
+        const index = item.cssClasses.indexOf(value);
+
+        if (index === -1) {
+            item.cssClasses.push(value);
+        } else {
+            item.cssClasses.splice(index, 1);
+        }
+    }
+
+    addData(event: any) {
+        if (this.displayedSecondaryData.length >= 7) {
+            this.dataControl.setValue('');
+            alert("Le nombre maximal d'élements affichés a été atteint");
+        } else {
+            let i = this.availableData.map((e: any) => { return e.value; }).indexOf(event.option.value.value);
+            this.displayedSecondaryData.push(event.option.value);
+            this.availableData.splice(i, 1);
+            this.dataControl.setValue('');
+        }
+    }
+
+    removeData(data: any, i: number) {
+        this.availableData.push(data);
+        this.displayedSecondaryData.splice(i, 1);
+        this.dataControl.setValue('');
+    }
+
+    removeAllData() {
+        this.availableData = this.availableData.concat(this.displayedSecondaryData);
+        this.displayedSecondaryData = [];
+        this.dataControl.setValue('');
+    }
+
+    drop(event: CdkDragDrop<string[]>) {
+        if (event.previousContainer === event.container) {
+            moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
+        }
+    }
+
+    saveTemplate() {
+        let template: any = [];
+        this.displayedSecondaryData.forEach((element: any) => {
+            template.push(
+                {
+                    'value': element.value,
+                    'cssClasses': element.cssClasses,
+                }
+            );
+        });
+
+        this.http.put("../../rest/baskets/" + this.basketGroup.basket_id + "/groups/" + this.basketGroup.group_id, { 'list_display': template })
+            .subscribe(() => {
+                this.displayedSecondaryDataClone = JSON.parse(JSON.stringify(this.displayedSecondaryData));
+                this.notify.success(this.lang.actionsGroupBasketUpdated);
+            }, (err) => {
+                this.notify.error(err.error.errors);
+            });
+    }
+
+    private _filterData(value: any): string[] {
+        let filterValue = '';
+
+        if (typeof value === 'string') {
+            filterValue = value.toLowerCase();
+        } else if (value !== null) {
+            filterValue = value.label.toLowerCase();
+        }
+        return this.availableData.filter((option: any) => option.label.toLowerCase().includes(filterValue));
+    }
+
+    checkModif() { 
+        if (JSON.stringify(this.displayedSecondaryData) === JSON.stringify(this.displayedSecondaryDataClone)) {
+            return true 
+        } else {
+           return false;
+        }
+    }
+
+    cancelModification() {
+        this.displayedSecondaryData = JSON.parse(JSON.stringify(this.displayedSecondaryDataClone));
+        this.availableData = JSON.parse(JSON.stringify(this.availableDataClone));
+        
+        let indexData: number = 0;
+        this.displayedSecondaryData.forEach((element: any) => {
+            indexData = this.availableData.map((e: any) => { return e.value; }).indexOf(element.value);
+            this.availableData.splice(indexData, 1);
+        });
+        this.dataControl.setValue('');
+    }
+}
-- 
GitLab