Fusionner les utilisateurs/goupes en une "Card"

This commit is contained in:
Boris Waaub 2024-05-06 20:07:15 +02:00
parent 3f9745d8cf
commit ab850b7b70
7 changed files with 104 additions and 49 deletions

View File

@ -1,6 +1,7 @@
<template> <template>
<span class="chill-entity entity-user"> <span class="chill-entity entity-user">
{{ user.label }} {{ user.label }}
{{ user }}
<span class="user-job" v-if="user.user_job !== null">({{ user.user_job.label.fr }})</span> <span class="main-scope" v-if="user.main_scope !== null">({{ user.main_scope.name.fr }})</span> <span v-if="user.isAbsent" class="badge bg-danger rounded-pill" :title="Absent">A</span> <span class="user-job" v-if="user.user_job !== null">({{ user.user_job.label.fr }})</span> <span class="main-scope" v-if="user.main_scope !== null">({{ user.main_scope.name.fr }})</span> <span v-if="user.isAbsent" class="badge bg-danger rounded-pill" :title="Absent">A</span>
</span> </span>
</template> </template>

View File

@ -68,8 +68,9 @@ interface AddPersonEvent extends TicketHistory<"add_person", PersonHistory> {};
interface AddCommentEvent extends TicketHistory<"add_comment", Comment> {}; interface AddCommentEvent extends TicketHistory<"add_comment", Comment> {};
interface SetMotiveEvent extends TicketHistory<"set_motive", MotiveHistory> {}; interface SetMotiveEvent extends TicketHistory<"set_motive", MotiveHistory> {};
interface AddAddressee extends TicketHistory<"add_addressee", AddresseeHistory> {}; interface AddAddressee extends TicketHistory<"add_addressee", AddresseeHistory> {};
interface RemoveAddressee extends TicketHistory<"remove_addressee", AddresseeHistory> {};
type TicketHistoryLine = AddPersonEvent | AddCommentEvent | SetMotiveEvent | AddAddressee; type TicketHistoryLine = AddPersonEvent | AddCommentEvent | SetMotiveEvent | AddAddressee | RemoveAddressee;
export interface Ticket { export interface Ticket {
type: "ticket_ticket", type: "ticket_ticket",

View File

@ -52,17 +52,27 @@
</div> </div>
<div class="col-md-6 col-sm-12"> <div class="col-md-6 col-sm-12">
<h3 class="text-primary">{{ $t("banner.speaker") }}</h3> <h3 class="text-primary">{{ $t("banner.speaker") }}</h3>
<h2> <h2>
<!-- Not rendering correctly -->
<!-- <user-render-box-badge
v-for="user in ticket.currentAddressees.filter((addressee) => addressee.type == 'user')"
:user="user"
:key="user.id"
/> -->
<span <span
class="badge text-bg-light m-1" class="badge text-bg-light m-1"
v-for="addressee in ticket.currentAddressees" v-for="user_group in ticket.currentAddressees.filter((addressee) => addressee.type == 'user') as Array<User>"
:key="addressee.id" :key="user_group.id"
> >
{{ {{ user_group.label }}
typeof addressee.label == "string" </span>
? addressee.label <span
: addressee.label.fr class="badge text-bg-light m-1"
}} v-for="user_group in ticket.currentAddressees.filter((addressee) => addressee.type == 'user_group') as Array<UserGroup>"
:key="user_group.id"
>
{{ user_group.label.fr }}
</span> </span>
</h2> </h2>
</div> </div>
@ -71,7 +81,7 @@
</Teleport> </Teleport>
<div class="container-xxl pt-1" style="padding-bottom: 55px"> <div class="container-xxl pt-1" style="padding-bottom: 55px">
<ticket-selector-component :tickets="[]" /> <ticket-selector-component :tickets="[]" />
<ticket-history-list-component :history="ticket.history" /> <ticket-history-list-component :history="ticketHistory" />
</div> </div>
<action-toolbar-component /> <action-toolbar-component />
</template> </template>
@ -81,6 +91,11 @@ import { computed, defineComponent, inject, onMounted, ref } from "vue";
import { useStore } from "vuex"; import { useStore } from "vuex";
// Types // Types
import {
DateTime,
User,
UserGroup,
} from "../../../../../../ChillMainBundle/Resources/public/types";
import { Motive, Ticket } from "../../types"; import { Motive, Ticket } from "../../types";
// Components // Components
@ -88,7 +103,6 @@ import TicketSelectorComponent from "./components/TicketSelectorComponent.vue";
import TicketHistoryListComponent from "./components/TicketHistoryListComponent.vue"; import TicketHistoryListComponent from "./components/TicketHistoryListComponent.vue";
import ActionToolbarComponent from "./components/ActionToolbarComponent.vue"; import ActionToolbarComponent from "./components/ActionToolbarComponent.vue";
import UserRenderBoxBadge from "../../../../../../ChillMainBundle/Resources/public/vuejs/_components/Entity/UserRenderBoxBadge.vue"; import UserRenderBoxBadge from "../../../../../../ChillMainBundle/Resources/public/vuejs/_components/Entity/UserRenderBoxBadge.vue";
import { DateTime } from "../../../../../../ChillMainBundle/Resources/public/types";
export default defineComponent({ export default defineComponent({
name: "App", name: "App",
@ -107,6 +121,9 @@ export default defineComponent({
const motives = computed(() => store.getters.getMotives as Motive[]); const motives = computed(() => store.getters.getMotives as Motive[]);
const ticket = computed(() => store.getters.getTicket as Ticket); const ticket = computed(() => store.getters.getTicket as Ticket);
const ticketHistory = computed(
() => store.getters.getDistinctAddressesHistory
);
function getSince(createdAt: DateTime) { function getSince(createdAt: DateTime) {
const today = new Date(); const today = new Date();
@ -127,6 +144,7 @@ export default defineComponent({
}); });
return { return {
ticketHistory,
headline, headline,
motives, motives,
ticket, ticket,

View File

@ -1,19 +1,17 @@
<template> <template>
<div class="col-12" v-if="addressee.type == 'user_group'"> <div class="col-12" >
<i class="fa fa-paper-plane"></i> <i class="fa fa-paper-plane" v-if="event_type === 'add_addressee'"></i>
<span class="mx-1"> <i class="fa fa-paper-plane-o" v-else></i>
<span class="mx-1" v-if="addressee.type == 'user_group'">
{{ {{
$t("history.transfert_user_group", { $t(`history.${event_type}_user_group`, {
user_group: addressee.label.fr, user_group: addressee.label.fr,
}) })
}} }}
</span> </span>
</div> <span class="mx-1" v-else-if="addressee.type == 'user'">
<div class="col-12" v-if="addressee.type == 'user'">
<i class="fa fa-paper-plane"></i>
<span class="mx-1">
{{ {{
$t("history.transfert_user", { $t(`history.${event_type}_user`, {
user: addressee.username, user: addressee.username,
}) })
}} }}
@ -35,8 +33,11 @@ export default defineComponent({
type: Object as PropType<AddresseeHistory>, type: Object as PropType<AddresseeHistory>,
required: true, required: true,
}, },
event_type: {
type: String,
required: true,
},
}, },
setup(props, ctx) { setup(props, ctx) {
return { return {
addressee: ref(props.addresseeHistory.addressee as UserGroupOrUser), addressee: ref(props.addresseeHistory.addressee as UserGroupOrUser),

View File

@ -4,32 +4,47 @@
v-for="history_line in history" v-for="history_line in history"
:key="history.indexOf(history_line)" :key="history.indexOf(history_line)"
> >
<div class="card-header"> <template v-if="!Array.isArray(history_line)">
<span class="fw-bold fst-italic"> <div class="card-header">
{{ formatDate(history_line.at) }} <span class="fw-bold fst-italic">
</span> {{ formatDate(history_line.at) }}
<span class="badge bg-white text-black mx-1">{{ </span>
history_line.by.username <span class="badge bg-white text-black mx-1">{{
}}</span> history_line.by.username
</div> }}</span>
<div class="card-body row fst-italic"> </div>
<ticket-history-person-component <div class="card-body row fst-italic">
:personHistory="history_line.data" <ticket-history-person-component
v-if="history_line.event_type == 'add_person'" :personHistory="history_line.data"
/> v-if="history_line.event_type == 'add_person'"
<ticket-history-motive-component />
:motiveHistory="history_line.data" <ticket-history-motive-component
v-else-if="history_line.event_type == 'set_motive'" :motiveHistory="history_line.data"
/> v-else-if="history_line.event_type == 'set_motive'"
<ticket-history-comment-component />
:commentHistory="history_line.data" <ticket-history-comment-component
v-else-if="history_line.event_type == 'add_comment'" :commentHistory="history_line.data"
/> v-else-if="history_line.event_type == 'add_comment'"
<ticket-history-addressee-component />
:addresseeHistory="history_line.data" </div>
v-else-if="history_line.event_type == 'add_addressee'" </template>
/> <template v-else>
</div> <div class="card-header">
<span class="fw-bold fst-italic">
{{ formatDate(history_line[0].at) }}
</span>
<span class="badge bg-white text-black mx-1">{{
history_line[0].by.username
}}</span>
</div>
<div
class="card-body row fst-italic"
v-for="addressee in history_line"
:key="history_line.indexOf(addressee)"
>
<ticket-history-addressee-component :addresseeHistory="addressee.data" :event_type="addressee.event_type"/>
</div>
</template>
</div> </div>
</template> </template>

View File

@ -10,8 +10,10 @@ const messages = {
user: "Prise en charge par {username}", user: "Prise en charge par {username}",
motive: "Motif indiqué: {motive}", motive: "Motif indiqué: {motive}",
comment: "Commentaire: {comment}", comment: "Commentaire: {comment}",
transfert_user_group: "Transferé au groupe: {user_group}", add_addressee_user_group: "Groupe {user_group} transferé",
transfert_user: "Transferé vers l'utilisateur: {user}", remove_addressee_user_group: "Groupe {user_group} retiré",
add_addressee_user: " Utilisateur {user} Transferé",
remove_addressee_user: "Utilisateur {user} retiré",
}, },
comment: { comment: {
title: "Commentaire", title: "Commentaire",

View File

@ -14,7 +14,24 @@ export const moduleTicket: Module<State, RootState> ={
getters: { getters: {
getTicket(state) { getTicket(state) {
return state.ticket; return state.ticket;
} },
getDistinctAddressesHistory(state) {
const addresseeHistory = state.ticket.history.reduce((result, item) => {
const { datetime } = item.at;
if (!["add_addressee","remove_addressee"].includes(item.event_type)) {
result[datetime] = item
return result;
}
if (!result[datetime]) {
result[datetime] = [];
}
result[datetime].push(item);
return result;
}, {} as any);
return Object.values(addresseeHistory) as Array<Ticket["history"]>;
}
}, },
mutations: { mutations: {
setTicket(state, ticket) { setTicket(state, ticket) {