diff --git a/apps/maarch_entreprise/Views/baskets-administration.component.html b/apps/maarch_entreprise/Views/baskets-administration.component.html index daa9ab160788e79d2c060d0d76de796bb1ab01da..5585ad10804adce991ff4bd556c49e00df5bfc17 100644 --- a/apps/maarch_entreprise/Views/baskets-administration.component.html +++ b/apps/maarch_entreprise/Views/baskets-administration.component.html @@ -76,7 +76,6 @@ </mat-sidenav-content> <mat-sidenav #snav2 [mode]="mobileQuery.matches ? 'over' : 'side'" [fixedInViewport]="mobileQuery.matches" fixedTopGap="56" position='end' [opened]="mobileQuery.matches ? false : false"> - <mat-list> <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="basketsOrder"> <mat-list-item disableRipple="true" *ngFor="let basket of basketsOrder;let i = index" title="deplacer" dnd-sortable @@ -86,7 +85,6 @@ </mat-list-item> </span> </mat-list> - </mat-sidenav> </mat-sidenav-container> </div> \ No newline at end of file diff --git a/apps/maarch_entreprise/Views/priorities-administration.component.html b/apps/maarch_entreprise/Views/priorities-administration.component.html index b1403e74bf13791b6a37e86dad4210f6e21af2ef..e3e48d2614dbc67e07160631aa0ff70fdeae9509 100755 --- a/apps/maarch_entreprise/Views/priorities-administration.component.html +++ b/apps/maarch_entreprise/Views/priorities-administration.component.html @@ -22,6 +22,12 @@ {{lang.add}} </p> </a> + <a mat-list-item (click)="snav2.toggle()"> + <mat-icon color="primary" mat-list-icon class="fa fa-list-ol"></mat-icon> + <p mat-line> + {{lang.basketsOrder}} + </p> + </a> </mat-nav-list> <mat-divider></mat-divider> <menu-app></menu-app> @@ -93,11 +99,16 @@ </mat-card> </mat-sidenav-content> <mat-sidenav #snav2 [mode]="mobileQuery.matches ? 'over' : 'side'" [fixedInViewport]="mobileQuery.matches" fixedTopGap="56" - position='end' [opened]="mobileQuery.matches ? false : false"> - - <mat-nav-list> - <h3 mat-subheader>Actions</h3> - </mat-nav-list> + position='end' [opened]="mobileQuery.matches ? false : false"> + <mat-list> + <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="prioritiesOrder"> + <mat-list-item disableRipple="true" *ngFor="let priority of prioritiesOrder;let i = index" title="deplacer" dnd-sortable + [sortableIndex]="i" (onDropSuccess)="updatePrioritiesOrder()"> + <mat-icon color="primary" mat-list-icon class="fa fa-inbox"></mat-icon> + <p mat-line>{{i+1}} - {{priority.label}}</p> + </mat-list-item> + </span> + </mat-list> </mat-sidenav> </mat-sidenav-container> </div> \ No newline at end of file diff --git a/apps/maarch_entreprise/class/class_business_app_tools_Abstract.php b/apps/maarch_entreprise/class/class_business_app_tools_Abstract.php index d7c0ee256e3dce9aacaf8656ba23e2bf6d063e82..b901bf3fe8e31475a1dc92fe9b8ab945d59d11db 100755 --- a/apps/maarch_entreprise/class/class_business_app_tools_Abstract.php +++ b/apps/maarch_entreprise/class/class_business_app_tools_Abstract.php @@ -560,7 +560,7 @@ abstract class business_app_tools_Abstract extends Database $_SESSION['mail_priorities_color'] = []; $_SESSION['default_mail_priority'] = 0; - $priorities = \Priority\models\PriorityModel::get(); + $priorities = \Priority\models\PriorityModel::get(['orderBy' => ['"order" NULLS LAST']]); $i = 0; foreach ($priorities as $priority) { $_SESSION['mail_priorities'][$i] = $priority['label']; diff --git a/apps/maarch_entreprise/js/angular/app/administration/priorities-administration.component.ts b/apps/maarch_entreprise/js/angular/app/administration/priorities-administration.component.ts index 0ee7d78c609653e668c1942ed5d10c85a907a589..d618710e6d2f3d109f9e868494b9b67b29eb51c5 100644 --- a/apps/maarch_entreprise/js/angular/app/administration/priorities-administration.component.ts +++ b/apps/maarch_entreprise/js/angular/app/administration/priorities-administration.component.ts @@ -3,7 +3,7 @@ import { MediaMatcher } from '@angular/cdk/layout'; import { HttpClient } from '@angular/common/http'; import { LANG } from '../translate.component'; import { NotificationService } from '../notification.service'; -import { MatPaginator, MatTableDataSource, MatSort } from '@angular/material'; +import {MatPaginator, MatTableDataSource, MatSort } from '@angular/material'; declare function $j(selector: any): any; @@ -23,9 +23,11 @@ export class PrioritiesAdministrationComponent implements OnInit { loading : boolean = false; priorities : any[] = []; + prioritiesOrder : any[] = []; dataSource : any; displayedColumns = ['label', 'delays', 'working_days', 'default_priority', 'actions']; + @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; applyFilter(filterValue: string) { @@ -53,6 +55,12 @@ export class PrioritiesAdministrationComponent implements OnInit { .subscribe((data: any) => { this.priorities = data["priorities"]; this.loading = false; + this.http.get(this.coreUrl + "rest/sortedPriorities") + .subscribe((data: any) => { + this.prioritiesOrder = data['priotities']; + }, () => { + location.href = "index.php"; + }); setTimeout(() => { this.dataSource = new MatTableDataSource(this.priorities); this.dataSource.paginator = this.paginator; @@ -79,4 +87,14 @@ export class PrioritiesAdministrationComponent implements OnInit { }) } } + + updatePrioritiesOrder() { + this.http.put(this.coreUrl + "rest/sortedPriorities", this.prioritiesOrder) + .subscribe((data: any) => { + this.prioritiesOrder = data['priorities']; + this.notify.success(this.lang.modificationSaved); + }, (err) => { + this.notify.error(err.error.errors); + }); + } } diff --git a/rest/index.php b/rest/index.php index 2ab3fdbff25d06d34ca89a5f9533245926b1dea8..8fd578d8236f6bce6403440e9ed89334cdb9f0b1 100755 --- a/rest/index.php +++ b/rest/index.php @@ -228,6 +228,8 @@ $app->post('/priorities', \Priority\controllers\PriorityController::class . ':cr $app->get('/priorities/{id}', \Priority\controllers\PriorityController::class . ':getById'); $app->put('/priorities/{id}', \Priority\controllers\PriorityController::class . ':update'); $app->delete('/priorities/{id}', \Priority\controllers\PriorityController::class . ':delete'); +$app->get('/sortedPriorities', \Priority\controllers\PriorityController::class . ':getSorted'); +$app->put('/sortedPriorities', \Priority\controllers\PriorityController::class . ':updateSort'); //Reports $app->get('/reports/groups', \Report\controllers\ReportController::class . ':getGroups'); diff --git a/sql/data_fr.sql b/sql/data_fr.sql index c475e2cb151f2b1d297fc1ab7ebdb1a15d1f51fd..edcccbe7bd3e4a2d77d333802fb5539402669516 100755 --- a/sql/data_fr.sql +++ b/sql/data_fr.sql @@ -1697,10 +1697,10 @@ Select setval('templates_seq', (select max(template_id)+1 from templates), false /* PRIORITIES */ TRUNCATE TABLE priorities; -INSERT INTO priorities (id, label, color, working_days, delays, default_priority) VALUES ('poiuytre1357nbvc', 'Normal', '#009dc5', TRUE, null, TRUE); -INSERT INTO priorities (id, label, color, working_days, delays, default_priority) VALUES ('poiuytre1379nbvc', 'Urgent', '#ffa500', TRUE, 8, FALSE); -INSERT INTO priorities (id, label, color, working_days, delays, default_priority) VALUES ('poiuytre1391nbvc', 'Très urgent', '#ff0000', TRUE, 4, FALSE); -INSERT INTO priorities (id, label, color, working_days, delays, default_priority) VALUES ('poiuytre1313nbvc', 'SVA/SVR', '#ffa500', TRUE, null, FALSE); +INSERT INTO priorities (id, label, color, working_days, delays, default_priority, "order") VALUES ('poiuytre1357nbvc', 'Normal', '#009dc5', TRUE, null, TRUE, 1); +INSERT INTO priorities (id, label, color, working_days, delays, default_priority, "order") VALUES ('poiuytre1379nbvc', 'Urgent', '#ffa500', TRUE, 8, FALSE, 2); +INSERT INTO priorities (id, label, color, working_days, delays, default_priority, "order") VALUES ('poiuytre1391nbvc', 'Très urgent', '#ff0000', TRUE, 4, FALSE, 3); +INSERT INTO priorities (id, label, color, working_days, delays, default_priority, "order") VALUES ('poiuytre1313nbvc', 'SVA/SVR', '#ffa500', TRUE, null, FALSE, 4); ------------ --NOTIFICATIONS diff --git a/sql/develop.sql b/sql/develop.sql index ff7d476073a79b2b293ff60773701d5bc7b845b2..4e1f7fe999d5dbefdbc59b1eacacc873c2b077e6 100755 --- a/sql/develop.sql +++ b/sql/develop.sql @@ -23,6 +23,7 @@ CREATE TABLE priorities working_days boolean NOT NULL, delays integer, default_priority boolean NOT NULL DEFAULT FALSE, + order integer, CONSTRAINT priorities_pkey PRIMARY KEY (id) ) WITH (OIDS=FALSE); diff --git a/sql/structure.sql b/sql/structure.sql index 0b538f4c8d0f8a6558b68a750f24c74afdf61dcc..5257d305d984d6b0d013d7ae9e80746a5431da02 100755 --- a/sql/structure.sql +++ b/sql/structure.sql @@ -1981,6 +1981,7 @@ CREATE TABLE priorities working_days boolean NOT NULL, delays integer, default_priority boolean NOT NULL DEFAULT FALSE, + order integer, CONSTRAINT priorities_pkey PRIMARY KEY (id) ) WITH (OIDS=FALSE); diff --git a/src/app/basket/controllers/BasketController.php b/src/app/basket/controllers/BasketController.php index 916fd41ecb532405cbbc9c49a3fc33c94580930d..8ffe4a05f1515080c8bb899370a686ea93306a74 100644 --- a/src/app/basket/controllers/BasketController.php +++ b/src/app/basket/controllers/BasketController.php @@ -180,11 +180,6 @@ class BasketController return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); } - $theBasket = BasketModel::getById(['id' => $aArgs['id'], 'select' => ['basket_order']]); - if (empty($theBasket)) { - return $response->withStatus(400)->withJson(['errors' => 'Basket not found']); - } - $data = $request->getParams(); foreach ($data as $key => $basketToUpdate) { diff --git a/src/app/priority/controllers/PriorityController.php b/src/app/priority/controllers/PriorityController.php index 880ab5e60f07d0b9fa5666a9cf60be435e9aca2c..d355e7e7ff65721421406f2743f6c5216aded30d 100644 --- a/src/app/priority/controllers/PriorityController.php +++ b/src/app/priority/controllers/PriorityController.php @@ -116,4 +116,49 @@ class PriorityController return $response->withJson(['priorities' => PriorityModel::get()]); } + + public function getSorted(Request $request, Response $response) + { + if (!ServiceModel::hasService(['id' => 'admin_priorities', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) { + return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); + } + + $priorities = PriorityModel::get([ + 'select' => ['id', 'label', '"order"'], + 'orderBy' => ['"order" NULLS LAST'] + ]); + + return $response->withJson(['priotities' => $priorities]); + } + + public function updateSort(Request $request, Response $response) + { + if (!ServiceModel::hasService(['id' => 'admin_priorities', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) { + return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); + } + + $data = $request->getParams(); + + foreach ($data as $key => $priorityToUpdate) { + if ($key != $priorityToUpdate['order']) { + PriorityModel::updateOrder(['id' => $priorityToUpdate['id'], 'order' => $key]); + } + } + + HistoryController::add([ + 'tableName' => 'priorities', + 'recordId' => $GLOBALS['userId'], + 'eventType' => 'UP', + 'info' => _PRIORITY_SORT_MODIFICATION, + 'moduleId' => 'priority', + 'eventId' => 'priorityModification', + ]); + + $priorities = PriorityModel::get([ + 'select' => ['id', 'label', '"order"'], + 'orderBy' => ['"order" NULLS LAST'] + ]); + + return $response->withJson(['priorities' => $priorities]); + } } diff --git a/src/app/priority/models/PriorityModelAbstract.php b/src/app/priority/models/PriorityModelAbstract.php index ff7873800ea0370eaf18dbf78cee10a4543fb888..fccccffac039ef9c8406abdc8f7d0b936b584164 100644 --- a/src/app/priority/models/PriorityModelAbstract.php +++ b/src/app/priority/models/PriorityModelAbstract.php @@ -20,11 +20,14 @@ abstract class PriorityModelAbstract { public static function get(array $aArgs = []) { - ValidatorModel::arrayType($aArgs, ['select']); + ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']); $aReturn = DatabaseModel::select([ 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], 'table' => ['priorities'], + 'where' => $aArgs['where'], + 'data' => $aArgs['data'], + 'order_by' => $aArgs['orderBy'] ]); return $aReturn; @@ -96,6 +99,24 @@ abstract class PriorityModelAbstract return true; } + public static function updateOrder(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['id']); + ValidatorModel::stringType($aArgs, ['id']); + ValidatorModel::intVal($aArgs, ['order']); + + DatabaseModel::update([ + 'table' => 'priorities', + 'set' => [ + '"order"' => $aArgs['order'] + ], + 'where' => ['id = ?'], + 'data' => [$aArgs['id']] + ]); + + return true; + } + public static function resetDefaultPriority() { DatabaseModel::update([ diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php index 4a8154a4842248b74c7f9012e455858634af3499..3d608d29a4ae3de62be71930e646410f7d974b69 100644 --- a/src/core/lang/lang-en.php +++ b/src/core/lang/lang-en.php @@ -57,6 +57,7 @@ define('_PARAMETER_SUPPRESSION', 'Parameter suppression'); define('_PRIORITY_CREATION', 'Priority creation'); define('_PRIORITY_MODIFICATION', 'Priority modification'); define('_PRIORITY_SUPPRESSION', 'Priority suppression'); +define('_PRIORITY_SORT_MODIFICATION', 'Priorities order modification'); define('_REPORT_MODIFICATION', 'Report modification'); define('_STATUS_ADDED', 'Statut added'); define('_STATUS_DELETED', 'Statut deleted'); diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php index af87aabdd1601e1ca3bdb46c6a10fc99db9110ce..fe99a6545a90df5e522a7f9f6cd12db78c367eda 100644 --- a/src/core/lang/lang-fr.php +++ b/src/core/lang/lang-fr.php @@ -57,6 +57,7 @@ define('_PARAMETER_SUPPRESSION', 'Suppression paramètre'); define('_PRIORITY_CREATION', 'Création priorité'); define('_PRIORITY_MODIFICATION', 'Modification priorité'); define('_PRIORITY_SUPPRESSION', 'Suppression priorité'); +define('_PRIORITY_SORT_MODIFICATION', 'Modification ordre priorités'); define('_REPORT_MODIFICATION', 'Modification états et édition'); define('_STATUS_ADDED', 'Statut ajouté'); define('_STATUS_DELETED', 'Statut supprimé');