diff --git a/src/app/home/controllers/HomeController.php b/src/app/home/controllers/HomeController.php index 3197de680d0d8fb0948b6e4f2f452ded9c4b3980..b8dd005c2aac8bfe69435d4f34e39ea3d794724d 100755 --- a/src/app/home/controllers/HomeController.php +++ b/src/app/home/controllers/HomeController.php @@ -38,16 +38,18 @@ class HomeController $preferences = json_decode($user['preferences'], true); if (!empty($preferences['homeGroups'])) { - $copyGroups = $groups; - foreach ($copyGroups as $group) { + $orderGroups = []; + $noOrderGroups = []; + foreach ($groups as $group) { $key = array_search($group['id'], $preferences['homeGroups']); if ($key === false) { - $groups[] = $group; + $noOrderGroups[] = $group; } else { - $groups[$key] = $group; + $orderGroups[$key] = $group; } } - $groups = array_values($groups); + ksort($orderGroups); + $groups = array_merge($orderGroups, $noOrderGroups); } foreach ($groups as $group) { diff --git a/src/frontend/app/basket/basket-home.component.html b/src/frontend/app/basket/basket-home.component.html index 6909dc72d7fb626f1a3fb8dd833c13b8b8ee36c6..28a3f98344bec60021de48a39403f0fffc100b2d 100755 --- a/src/frontend/app/basket/basket-home.component.html +++ b/src/frontend/app/basket/basket-home.component.html @@ -3,16 +3,29 @@ <mat-panel-title> <i class="fa fa-inbox panelIconMenu"></i> {{lang.myBaskets}} </mat-panel-title> + <div title="{{lang.listConfiguration}}" (click)="$event.stopPropagation();editGroupOrder()"><mat-icon [ngStyle]="{'color': editOrderGroups ? 'orange' : '#135F7F'}" mat-list-icon class="fa fa-cog"></mat-icon></div> </mat-expansion-panel-header> <ng-container *ngIf="!loading"> <mat-form-field [style.display]="homeData.assignedBaskets.length > 0 || homeData.regroupedBaskets.length > 0 ? 'inline-block' : 'none'" floatLabel="never" appearance="outline" class="basketsFilter" style="padding-left:20px;padding-right:20px;font-size: 11px;"> <input matInput placeholder="{{lang.filterBy}}" #listFilter> </mat-form-field> + <div *ngIf="editOrderGroups" style="color: rgba(0,0,0,0.25);text-align:center"> + {{lang.noticeGroupeOrder}} + </div> + <mat-list *ngIf="editOrderGroups"> + <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="homeData.regroupedBaskets"> + <mat-list-item disableRipple="true" *ngFor="let regroupedBasket of homeData.regroupedBaskets;let i = index" title="{{lang.move}}" dnd-sortable + [sortableIndex]="i" (onDropSuccess)="updateGroupsOrder()"> + <mat-icon color="primary" mat-list-icon class="fa fa-users" style="font-size:19px"></mat-icon> + <span class="basketGroupTitle">{{regroupedBasket.groupDesc}}</span> + </mat-list-item> + </span> + </mat-list> <ng-container *ngFor="let regroupedBasket of homeData.regroupedBaskets"> - <span *ngIf="regroupedBasket.baskets[0]" class="basketGroupTitle">{{regroupedBasket.groupDesc}}</span> - <mat-divider *ngIf="regroupedBasket.baskets[0]" style="width: 80%;"></mat-divider> - <mat-nav-list style="padding-bottom: 10px;"> + <span *ngIf="regroupedBasket.baskets[0] && !editOrderGroups" class="basketGroupTitle">{{regroupedBasket.groupDesc}}</span> + <mat-divider *ngIf="regroupedBasket.baskets[0] && !editOrderGroups" style="width: 80%;"></mat-divider> + <mat-nav-list style="padding-bottom: 10px;" *ngIf="!editOrderGroups"> <ng-container *ngFor="let basket of regroupedBasket.baskets | filterList:listFilter.value:'basket_name'"> <a mat-list-item *ngIf="basket.redirected" disableRipple="true" style="cursor:not-allowed;"> @@ -41,7 +54,7 @@ </ng-container> </mat-nav-list> </ng-container> - <ng-container *ngIf="homeData.assignedBaskets.length>0"> + <ng-container *ngIf="homeData.assignedBaskets.length>0 && !editOrderGroups"> <span color="primary" style="font-weight:bold;" title="{{lang.basketsAssigned}}">{{lang.basketsAssignedShort}}</span> <mat-divider></mat-divider> @@ -65,4 +78,4 @@ {{lang.noAvailableBasket}} </div> </ng-container> -</mat-expansion-panel> \ No newline at end of file +</mat-expansion-panel> diff --git a/src/frontend/app/basket/basket-home.component.ts b/src/frontend/app/basket/basket-home.component.ts index 6e69243cedd5b958c410fc91644851f053b8761a..3b0c6cd773b94e04d466b9aad63ff9f7c54bbafe 100755 --- a/src/frontend/app/basket/basket-home.component.ts +++ b/src/frontend/app/basket/basket-home.component.ts @@ -3,8 +3,10 @@ import { HttpClient } from '@angular/common/http'; import { LANG } from '../translate.component'; import { MatSidenav } from '@angular/material/sidenav'; import { AppService } from '../../service/app.service'; -import { tap, finalize } from 'rxjs/operators'; +import { tap, finalize, catchError } from 'rxjs/operators'; import { MatExpansionPanel } from '@angular/material'; +import { of } from 'rxjs'; +import { NotificationService } from '../notification.service'; declare function $j(selector: any) : any; @@ -27,10 +29,12 @@ export class BasketHomeComponent implements OnInit { @Input() snavL: MatSidenav; @Output('refreshEvent') refreshEvent = new EventEmitter<string>(); @ViewChild('basketPanel', { static: true }) basketPanel: MatExpansionPanel; + editOrderGroups: boolean = false; constructor( public http: HttpClient, - public appService: AppService + public appService: AppService, + private notify: NotificationService ) { } @@ -80,4 +84,19 @@ export class BasketHomeComponent implements OnInit { this.basketPanel.close(); } } + + editGroupOrder() { + this.editOrderGroups = !this.editOrderGroups; + } + + updateGroupsOrder() { + var groupsOrder = this.homeData.regroupedBaskets.map((element: any) => element.groupSerialId); + this.http.put("../../rest/currentUser/profile/preferences", { homeGroups: groupsOrder }).pipe( + tap(() => this.notify.success(this.lang.parameterUpdated)), + catchError((err) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); + } } diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index 629fe0d42cf6ebcfa606201d0cac22b1e81512f6..197cf86430448595addf7fa5cc65a43b6a24ee50 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -1338,4 +1338,6 @@ export const LANG_EN = { "editorOptionAdmin": "Manage editor option", "documentEditor": "Document editor", "contactsList": "Contacts list", + "listConfiguration": "Manage list display", + "noticeGroupeOrder": "Drag and drop group to set order", }; diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index bb158d1432c1bb0dc58678fdb44f4ec702e9f6e4..1326e068cc97f4a193eb3ac58b39a80616f004f5 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -1376,4 +1376,6 @@ export const LANG_FR = { "editorOptionAdmin": "Gérer les paramètres d'édition", "documentEditor": "Editeur de document", "contactsList": "Liste des contacts", + "listConfiguration": "Paramétrer l'affichage de la liste", + "noticeGroupeOrder": "Glisser-déposer les groupes pour définir l'ordre", }; diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index b965c4675f4bb5c47557994dc6a1dc00d0d468b5..2a791e0b590c476fab33f5b6af1341e1213ed571 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -1363,4 +1363,6 @@ export const LANG_NL = { "editorOptionAdmin": "Manage editor option", //_TO_TRANSLATE "documentEditor": "Document editor", //_TO_TRANSLATE "contactsList": "Contacts list", //_TO_TRANSLATE + "listConfiguration": "Manage list display", //_TO_TRANSLATE + "noticeGroupeOrder": "Drag and drop group to set order", //_TO_TRANSLATE }; diff --git a/test/unitTests/app/user/UserControllerTest.php b/test/unitTests/app/user/UserControllerTest.php index 4afe896ed0ea34a6e1f166ef9c1d45b2d5cd42f1..3c92cad8a6e6a3cf7d5eba64f9d60aeee418c729 100755 --- a/test/unitTests/app/user/UserControllerTest.php +++ b/test/unitTests/app/user/UserControllerTest.php @@ -773,7 +773,7 @@ class UserControllerTest extends TestCase 'lastname' => 'ADMIN', 'mail' => 'dev@maarch.org', 'initials' => 'SU', - 'preferences' => ['homeGroups' => [999]] + 'preferences' => ['documentEdition' => 'maarchOnline'] ]; $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request); @@ -781,7 +781,7 @@ class UserControllerTest extends TestCase $this->assertSame(400, $response->getStatusCode()); $responseBody = json_decode((string)$response->getBody(), true); - $this->assertSame('Body preferences[homeGroups] is not filled with all user\'s groups', $responseBody['errors']); + $this->assertSame('Body preferences[documentEdition] is not allowed', $responseBody['errors']); } public function testSetRedirectedBasket()