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)" > - - +
+ + + {{ formatDate(history_line.at) }} + + + {{ history_line.by.username }} + +
+
+ + + + +
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; + } }