Skip to content

Commit 8d051dc

Browse files
authored
Add user to mission modal (#392)
1 parent 8435725 commit 8d051dc

25 files changed

+231
-47
lines changed

assets/css/availability-table.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ table.availability-table {
6868
.engaged {
6969
background-color: $colorMission;
7070
color: $colorMissionText;
71+
72+
&.btn-outline-light {
73+
background-color: white;
74+
border-color: $colorMission;
75+
color: $colorMissionOutlineText;
76+
}
7177
}
7278

7379
.locked {

assets/css/variables.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ $colorBooked: #67a2d3;
77
$colorLocked: #7a7a7a;
88
$colorMission: #f9d948;
99
$colorMissionText: #333;
10+
$colorMissionOutlineText: #a7912e;
1011

1112
$footerColor: #f7f7f7;
1213

assets/js/_planning-missions.js

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,14 @@ function displayMissionModal($modal, id) {
7575
return;
7676
}
7777

78+
const url = window.location.pathname.indexOf('organizations') >= 0 ? `/organizations/missions/${id}/modal` : `/user/availability/missions/${id}/modal`;
79+
displayAjaxModal($modal, url);
80+
}
81+
82+
function displayAjaxModal($modal, url) {
7883
const $loading = $modal.find('.loading').show();
7984
const $content = $modal.find('.content').html('');
8085

81-
const url = window.location.pathname.indexOf('organizations') >= 0 ? `/organizations/missions/${id}/modal` : `/user/availability/missions/${id}/modal`;
82-
8386
$.ajax({
8487
method: 'GET',
8588
url,
@@ -96,7 +99,33 @@ function displayMissionModal($modal, id) {
9699
$modal.modal('show');
97100
}
98101

99-
export function fetchMissions(url) {
102+
function addUserToMission(url) {
103+
$('.mission-choose').prop('disabled', true);
104+
105+
$.ajax({
106+
method: 'POST',
107+
dataType: 'json',
108+
url,
109+
success: function () {
110+
$('#modal-add-mission').modal('hide');
111+
fetchMissions();
112+
},
113+
error: function () {
114+
window.alert('Une erreur est survenue pendant la requête');
115+
$('.mission-choose').prop('disabled', false);
116+
},
117+
});
118+
}
119+
120+
export function fetchMissions() {
121+
let url;
122+
123+
if ($('.planning').length) {
124+
url = '/organizations/missions/find' + window.location.search;
125+
} else {
126+
url = window.location.pathname + '/missions';
127+
}
128+
100129
$.ajax({
101130
method: 'GET',
102131
dataType: 'json',
@@ -122,4 +151,34 @@ export function initMissionsEvents() {
122151
$modal.find('.loading').show();
123152
$modal.find('.content').html('');
124153
});
154+
155+
$('#modal-add-mission')
156+
.on('show.bs.modal', function (event) {
157+
const $modal = $(this);
158+
const $link = $(event.relatedTarget);
159+
const url = $link.data('href');
160+
161+
displayAjaxModal($modal, url);
162+
})
163+
.on('hidden.bs.modal', function () {
164+
const $modal = $(this);
165+
$modal.find('.loading').show();
166+
$modal.find('.content').html('');
167+
});
168+
169+
$(document).on('click', '.mission-choose', function () {
170+
addUserToMission($(this).data('href'));
171+
});
172+
173+
// Allow modals stacking
174+
$(document).on('show.bs.modal', '.modal', function () {
175+
const zIndex = 1040 + 10 * $('.modal:visible').length;
176+
$(this).css('z-index', zIndex);
177+
setTimeout(function () {
178+
$('.modal-backdrop')
179+
.not('.modal-stack')
180+
.css('z-index', zIndex - 1)
181+
.addClass('modal-stack');
182+
});
183+
});
125184
}

assets/js/availability-form.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,5 @@ $(document).ready(function () {
5959

6060
addPopovers($table);
6161
initMissionsEvents();
62-
fetchMissions(window.location.pathname + '/missions');
62+
fetchMissions();
6363
});

assets/js/planning.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ $(document).ready(function () {
5757

5858
initUpdateEvents();
5959
initMissionsEvents();
60-
fetchMissions('/organizations/missions/find' + window.location.search);
60+
fetchMissions();
6161

6262
$('#hideUsers').on('change', hideUselessFilters);
6363
$('#hideAssets').on('change', hideUselessFilters);

config/routes.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ _organizations_planning:
88
type: annotation
99
prefix: /organizations/planning
1010

11+
_organizations_missions:
12+
resource: ../src/Controller/Organization/Mission
13+
type: annotation
14+
# TODO Use organization ID
15+
prefix: /organizations/missions
16+
1117
_organizations_assets:
1218
resource: ../src/Controller/Organization/CommissionableAsset
1319
type: annotation
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Controller\Organization\Mission;
6+
7+
use App\Entity\Mission;
8+
use App\Entity\User;
9+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
10+
use Symfony\Component\HttpFoundation\JsonResponse;
11+
use Symfony\Component\HttpFoundation\Response;
12+
use Symfony\Component\Routing\Annotation\Route;
13+
14+
/**
15+
* @Route("/{mission<\d+>}/users/add/{userToAdd<\d+>}", name="app_organization_mission_add_user", methods={"POST"})
16+
*/
17+
class AddUserAjaxController extends AbstractController
18+
{
19+
public function __invoke(Mission $mission, User $userToAdd): Response
20+
{
21+
if (!$mission->users->contains($userToAdd)) {
22+
$mission->users->add($userToAdd);
23+
}
24+
25+
$this->getDoctrine()->getManager()->flush();
26+
27+
return new JsonResponse();
28+
}
29+
}

src/Controller/Organization/Mission/MissionController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use Symfony\Component\Routing\Annotation\Route;
1919

2020
/**
21-
* @Route("/missions")
21+
* @Route("/")
2222
* @Security("is_granted('ROLE_PARENT_ORGANIZATION')")
2323
*/
2424
class MissionController extends AbstractController

src/Controller/Organization/Mission/MissionModalController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
use Symfony\Component\Routing\Annotation\Route;
1111

1212
/**
13-
* @Route("/missions/{id<\d+>}/modal", name="app_organization_mission_modal", methods={"GET"})
13+
* @Route("/{id<\d+>}/modal", name="app_organization_mission_modal", methods={"GET"})
1414
*/
1515
class MissionModalController extends AbstractController
1616
{

src/Controller/Organization/Mission/MissionsFindByFiltersController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use Symfony\Component\Serializer\SerializerInterface;
1212

1313
/**
14-
* @Route("/missions/find", name="app_organization_mission_find_by_filters", methods={"GET"})
14+
* @Route("/find", name="app_organization_mission_find_by_filters", methods={"GET"})
1515
*/
1616
class MissionsFindByFiltersController
1717
{

0 commit comments

Comments
 (0)