Skip to content

Commit

Permalink
new: Allow to change the status when answering a ticket
Browse files Browse the repository at this point in the history
  • Loading branch information
marien-probesys committed Nov 8, 2022
1 parent 3cf3cfa commit feafea8
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 1 deletion.
1 change: 1 addition & 0 deletions assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
@import "./components/icons.css";
@import "./components/images.css";
@import "./components/layout.css";
@import "./components/lines.css";
@import "./components/messages.css";
@import "./components/popups.css";
@import "./components/tables.css";
Expand Down
10 changes: 10 additions & 0 deletions assets/stylesheets/components/forms.css
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ select {
border-color 0.2s ease-in-out;
}

.form-group--inline select {
width: auto;
}

select:not([multiple]) {
padding-right: 3.5rem;

Expand Down Expand Up @@ -89,6 +93,12 @@ select[aria-invalid] {
border-color: var(--color-error11);
}

.form-group--inline {
display: flex;

align-items: center;
}

.form__error {
padding-left: 1.25em;

Expand Down
31 changes: 31 additions & 0 deletions assets/stylesheets/components/lines.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/* This file is part of Bileto. */
/* Copyright 2022 Probesys */
/* SPDX-License-Identifier: AGPL-3.0-or-later */

.line {
display: flex;

flex-direction: column;
align-items: center;
}

@media (min-width: 800px) {
.line {
flex-direction: row;
}
}

.line > *:not(.line__extend) + *:not(.line__extend) {
margin-top: 2rem;
}

@media (min-width: 800px) {
.line > *:not(.line__extend) + *:not(.line__extend) {
margin-top: 0;
margin-left: 2rem;
}
}

.line__extend {
flex-grow: 1;
}
24 changes: 24 additions & 0 deletions src/Controller/Tickets/MessagesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use App\Entity\Message;
use App\Entity\Ticket;
use App\Repository\MessageRepository;
use App\Repository\TicketRepository;
use App\Utils\Time;
use Symfony\Component\HtmlSanitizer\HtmlSanitizerInterface;
use Symfony\Component\HttpFoundation\Response;
Expand All @@ -24,6 +25,7 @@ public function create(
Ticket $ticket,
Request $request,
MessageRepository $messageRepository,
TicketRepository $ticketRepository,
ValidatorInterface $validator,
HtmlSanitizerInterface $appMessageSanitizer
): Response {
Expand All @@ -34,6 +36,9 @@ public function create(
$messageContent = $request->request->get('message', '');
$messageContent = $appMessageSanitizer->sanitize($messageContent);

/** @var string $status */
$status = $request->request->get('status', '');

/** @var string $csrfToken */
$csrfToken = $request->request->get('_csrf_token', '');

Expand All @@ -43,6 +48,8 @@ public function create(
'messages' => $ticket->getMessages(),
'organization' => $ticket->getOrganization(),
'message' => $messageContent,
'status' => $status,
'statuses' => Ticket::getStatusesWithLabels(),
'error' => $this->csrfError(),
]);
}
Expand All @@ -63,11 +70,28 @@ public function create(
'messages' => $ticket->getMessages(),
'organization' => $ticket->getOrganization(),
'message' => $messageContent,
'status' => $status,
'statuses' => Ticket::getStatusesWithLabels(),
'errors' => $this->formatErrors($errors),
]);
}

$ticket->setStatus($status);

$errors = $validator->validate($ticket);
if (count($errors) > 0) {
return $this->renderBadRequest('tickets/messages/_messages.html.twig', [
'ticket' => $ticket,
'messages' => $ticket->getMessages(),
'message' => $messageContent,
'status' => $status,
'statuses' => Ticket::getStatusesWithLabels(),
'errors' => $this->formatErrors($errors),
]);
}

$messageRepository->save($message, true);
$ticketRepository->save($ticket, true);

return $this->redirectToRoute('ticket', [
'uid' => $ticket->getUid(),
Expand Down
2 changes: 2 additions & 0 deletions src/Controller/TicketsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public function show(Ticket $ticket): Response
'messages' => $ticket->getMessages(),
'organization' => $ticket->getOrganization(),
'message' => '',
'status' => 'pending',
'statuses' => Ticket::getStatusesWithLabels(),
]);
}
}
27 changes: 26 additions & 1 deletion templates/tickets/show.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,32 @@
>{{ message }}</textarea>
</div>

<div class="form__actions">
<div class="line">
<div class="line__extend"></div>

<div class="form-group--inline">
<label for="status">
{{ 'Status to' | trans }}
</label>

<select
id="status"
name="status"
required
{% if errors.status is defined %}
autofocus
aria-invalid="true"
aria-errormessage="status-error"
{% endif %}
>
{% for value, label in statuses %}
<option value="{{ value }}" {{ value == status ? 'selected' }}>
{{ label | trans }}
</option>
{% endfor %}
</select>
</div>

<button id="form-create-message-submit" class="button--primary" type="submit">
{{ 'Answer' | trans }}
</button>
Expand Down
26 changes: 26 additions & 0 deletions tests/Controller/Tickets/MessagesControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,32 @@ public function testPostCreateSanitizesTheMessageContent(): void
$this->assertSame('My message', $message->getContent());
}

public function testPostCreateChangesTheTicketStatus(): void
{
$now = new \DateTimeImmutable('2022-11-02');
Time::freeze($now);
$client = static::createClient();
$user = UserFactory::createOne();
$client->loginUser($user->object());
$ticket = TicketFactory::createOne([
'createdBy' => $user,
'status' => 'assigned',
]);
$messageContent = 'My message';

$this->assertSame(0, MessageFactory::count());

$client->request('GET', "/tickets/{$ticket->getUid()}");
$crawler = $client->submitForm('form-create-message-submit', [
'message' => $messageContent,
'status' => 'pending',
]);

Time::unfreeze();
$ticket->refresh();
$this->assertSame('pending', $ticket->getStatus());
}

public function testPostCreateFailsIfMessageIsEmpty(): void
{
$client = static::createClient();
Expand Down
1 change: 1 addition & 0 deletions translations/messages.en_GB.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,4 @@ Answer: Answer
'Opened on': 'Opened on'
'Ticket number': 'Ticket number'
'You have not yet created any ticket.': 'You have not yet created any ticket.'
'Status to': 'Status to'
1 change: 1 addition & 0 deletions translations/messages.fr_FR.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,4 @@ Answer: Répondre
'Opened on': 'Ouvert le'
'Ticket number': 'Numéro de ticket'
'You have not yet created any ticket.': 'Vous n’avez pas encore créé de ticket.'
'Status to': 'Statut vers'

0 comments on commit feafea8

Please sign in to comment.