diff --git a/src/Bundle/ChillTicketBundle/src/Resources/public/types.ts b/src/Bundle/ChillTicketBundle/src/Resources/public/types.ts
index 5ff90bc42..55607e2a4 100644
--- a/src/Bundle/ChillTicketBundle/src/Resources/public/types.ts
+++ b/src/Bundle/ChillTicketBundle/src/Resources/public/types.ts
@@ -64,13 +64,18 @@ export interface AddresseeHistory {
updatedAt: DateTime|null,
}
+export interface AddresseeState {
+ addressees: UserGroupOrUser[],
+}
+
interface AddPersonEvent extends TicketHistory<"add_person", PersonHistory> {};
interface AddCommentEvent extends TicketHistory<"add_comment", Comment> {};
interface SetMotiveEvent extends TicketHistory<"set_motive", MotiveHistory> {};
-interface AddAddressee extends TicketHistory<"add_addressee", AddresseeHistory> {};
-interface RemoveAddressee extends TicketHistory<"remove_addressee", AddresseeHistory> {};
+//interface AddAddressee extends TicketHistory<"add_addressee", AddresseeHistory> {};
+//interface RemoveAddressee extends TicketHistory<"remove_addressee", AddresseeHistory> {};
+interface AddresseesStateEvent extends TicketHistory<"addressees_state", AddresseeState> {};
-type TicketHistoryLine = AddPersonEvent | AddCommentEvent | SetMotiveEvent | AddAddressee | RemoveAddressee;
+type TicketHistoryLine = AddPersonEvent | AddCommentEvent | SetMotiveEvent | /*AddAddressee | RemoveAddressee | */ AddresseesStateEvent;
export interface Ticket {
type: "ticket_ticket",
diff --git a/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/ActionToolbarComponent.vue b/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/ActionToolbarComponent.vue
index 10ec72a8f..aa299ad26 100644
--- a/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/ActionToolbarComponent.vue
+++ b/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/ActionToolbarComponent.vue
@@ -100,7 +100,7 @@
: (activeTab = 'add_addressee')
"
>
-
+
{{ $t("add_addressee.title") }}
diff --git a/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/TicketHistoryListComponent.vue b/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/TicketHistoryListComponent.vue
index e8b834f9d..512a1e5c5 100644
--- a/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/TicketHistoryListComponent.vue
+++ b/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/components/TicketHistoryListComponent.vue
@@ -4,51 +4,33 @@
v-for="history_line in history"
:key="history.indexOf(history_line)"
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/store/modules/ticket.ts b/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/store/modules/ticket.ts
index 375846c25..430c7b320 100644
--- a/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/store/modules/ticket.ts
+++ b/src/Bundle/ChillTicketBundle/src/Resources/public/vuejs/TicketApp/store/modules/ticket.ts
@@ -15,7 +15,8 @@ export const moduleTicket: Module = {
add_person: "fa fa-eyedropper",
add_comment: "fa fa-comment",
set_motive: "fa fa-paint-brush",
- add_addressee: "fa fa-paper-plane",
+ //add_addressee: "fa fa-paper-plane",
+ addressees_state: "fa fa-paper-plane",
},
toto: "toto",
}),
diff --git a/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php b/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php
index 938ee2e9b..c505a835c 100644
--- a/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php
+++ b/src/Bundle/ChillTicketBundle/src/Serializer/Normalizer/TicketNormalizer.php
@@ -11,6 +11,8 @@ declare(strict_types=1);
namespace Chill\TicketBundle\Serializer\Normalizer;
+use Chill\MainBundle\Entity\User;
+use Chill\MainBundle\Entity\UserGroup;
use Chill\TicketBundle\Entity\AddresseeHistory;
use Chill\TicketBundle\Entity\Comment;
use Chill\TicketBundle\Entity\MotiveHistory;
@@ -82,6 +84,7 @@ final class TicketNormalizer implements NormalizerInterface, NormalizerAwareInte
],
$ticket->getComments()->toArray(),
),
+ /*
...array_map(
fn (AddresseeHistory $history) => [
'event_type' => 'add_addressee',
@@ -100,6 +103,8 @@ final class TicketNormalizer implements NormalizerInterface, NormalizerAwareInte
],
$ticket->getAddresseeHistories()->filter(fn (AddresseeHistory $history) => null !== $history->getEndDate())->toArray()
),
+ */
+ ...$this->addresseesStates($ticket),
];
usort(
@@ -119,4 +124,56 @@ final class TicketNormalizer implements NormalizerInterface, NormalizerAwareInte
$events
);
}
+
+ private function addresseesStates(Ticket $ticket): array
+ {
+ /** @var array{string, array{added: list, removed: list}} $changes */
+ $changes = [];
+ $dateFormat = 'Y-m-d-m-Y-H-i-s';
+
+ foreach ($ticket->getAddresseeHistories() as $history) {
+ $changes[$history->getStartDate()->format($dateFormat)]['added'][] = $history;
+ }
+ foreach ($ticket->getAddresseeHistories() as $history) {
+ if (null !== $history->getEndDate()) {
+ $changes[$history->getEndDate()->format($dateFormat)]['removed'][] = $history;
+ }
+ }
+
+ ksort($changes);
+
+ $currents = [];
+ $steps = [];
+ foreach ($changes as $change) {
+ $historiesAdded = $change['added'] ?? [];
+ $historiesRemoved = $change['removed'] ?? [];
+
+ if (0 < count($historiesAdded)) {
+ $at = $historiesAdded[0]->getStartDate();
+ $by = $historiesAdded[0]->getCreatedBy();
+ } elseif (0 < count($historiesRemoved)) {
+ $at = $historiesRemoved[0]->getStartDate();
+ $by = $historiesRemoved[0]->getRemovedBy();
+ } else {
+ throw new \LogicException('it should have at least one history');
+ }
+
+ $removed = array_map(fn (AddresseeHistory $history) => $history->getAddressee(), $historiesRemoved);
+ $currents = array_filter($currents, fn (User|UserGroup $a) => !in_array($a, $removed, true));
+ foreach ($historiesAdded as $history) {
+ $currents[] = $history->getAddressee();
+ }
+
+ $steps[] = [
+ 'event_type' => 'addressees_state',
+ 'at' => $at,
+ 'by' => $by,
+ 'data' => [
+ 'addressees' => array_values($currents),
+ ],
+ ];
+ }
+
+ return $steps;
+ }
}