Generalize ticket actions

This commit is contained in:
Boris Waaub 2024-05-22 00:38:47 +02:00
parent c73c1eb8d5
commit a20f9b4f86
15 changed files with 213 additions and 138 deletions

View File

@ -36,6 +36,7 @@ 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( const ticketHistory = computed(
() => store.getters.getDistinctAddressesHistory () => store.getters.getDistinctAddressesHistory
); );

View File

@ -11,20 +11,20 @@
<form @submit.prevent="submitAction"> <form @submit.prevent="submitAction">
<add-comment-component <add-comment-component
v-model="content" v-model="content"
v-if="activeTab === 'comment'" v-if="activeTab === 'add_comment'"
/> />
<addressee-selector-component <addressee-selector-component
v-model="addressees" v-model="addressees"
:user-groups="userGroups" :user-groups="userGroups"
:users="users" :users="users"
v-if="activeTab === 'transfert'" v-if="activeTab === 'add_addressee'"
/> />
<motive-selector-component <motive-selector-component
v-model="motive" v-model="motive"
:motives="motives" :motives="motives"
v-if="activeTab === 'motive'" v-if="activeTab === 'set_motive'"
/> />
<ul class="record_actions sticky-form-buttons"> <ul class="record_actions sticky-form-buttons">
@ -52,13 +52,13 @@
type="button" type="button"
class="m-2 btn btn-light" class="m-2 btn btn-light"
@click=" @click="
activeTab === 'comment' activeTab === 'add_comment'
? (activeTab = '') ? (activeTab = '')
: (activeTab = 'comment') : (activeTab = 'add_comment')
" "
> >
<i class="fa fa-comment"></i> <i :class="actionIcons['add_comment']"></i>
{{ $t("comment.title") }} {{ $t("add_comment.title") }}
</button> </button>
</li> </li>
<li class="nav-item"> <li class="nav-item">
@ -66,13 +66,13 @@
type="button" type="button"
class="m-2 btn btn-light" class="m-2 btn btn-light"
@click=" @click="
activeTab === 'transfert' activeTab === 'add_addressee'
? (activeTab = '') ? (activeTab = '')
: (activeTab = 'transfert') : (activeTab = 'add_addressee')
" "
> >
<i class="fa fa-paper-plane"></i> <i :class="actionIcons['add_addressee']"></i>
{{ $t("transfert.title") }} {{ $t("add_addressee.title") }}
</button> </button>
</li> </li>
<li class="nav-item"> <li class="nav-item">
@ -80,13 +80,13 @@
type="button" type="button"
class="m-2 btn btn-light" class="m-2 btn btn-light"
@click=" @click="
activeTab === 'motive' activeTab === 'set_motive'
? (activeTab = '') ? (activeTab = '')
: (activeTab = 'motive') : (activeTab = 'set_motive')
" "
> >
<i class="fa fa-paint-brush"></i> <i :class="actionIcons['set_motive']"></i>
{{ $t("motive.title") }} {{ $t("set_motive.title") }}
</button> </button>
</li> </li>
<li class="nav-item"> <li class="nav-item">
@ -133,7 +133,9 @@ export default defineComponent({
const store = useStore(); const store = useStore();
const { t } = useI18n(); const { t } = useI18n();
const toast = inject("toast") as any; const toast = inject("toast") as any;
const activeTab = ref("" as "" | "comment" | "motive" | "transfert"); const activeTab = ref(
"" as "" | "add_comment" | "set_motive" | "add_addressee"
);
const ticket = computed(() => store.getters.getTicket as Ticket); const ticket = computed(() => store.getters.getTicket as Ticket);
const motives = computed(() => store.getters.getMotives as Motive[]); const motives = computed(() => store.getters.getMotives as Motive[]);
@ -155,9 +157,9 @@ export default defineComponent({
async function submitAction() { async function submitAction() {
try { try {
switch (activeTab.value) { switch (activeTab.value) {
case "comment": case "add_comment":
if (!content.value) { if (!content.value) {
toast.error(t("comment.error")); toast.error(t("add_comment.error"));
} else { } else {
await store.dispatch("createComment", { await store.dispatch("createComment", {
ticketId: ticket.value.id, ticketId: ticket.value.id,
@ -165,31 +167,31 @@ export default defineComponent({
}); });
content.value = ""; content.value = "";
activeTab.value = ""; activeTab.value = "";
toast.success(t("comment.success")); toast.success(t("add_comment.success"));
} }
break; break;
case "motive": case "set_motive":
if (!motive.value.id) { if (!motive.value.id) {
toast.error(t("motive.error")); toast.error(t("set_motive.error"));
} else { } else {
await store.dispatch("createMotive", { await store.dispatch("createMotive", {
ticketId: ticket.value.id, ticketId: ticket.value.id,
motive: motive.value, motive: motive.value,
}); });
activeTab.value = ""; activeTab.value = "";
toast.success(t("motive.success")); toast.success(t("set_motive.success"));
} }
break; break;
case "transfert": case "add_addressee":
if (!addressees.value.length) { if (!addressees.value.length) {
toast.error(t("transfert.error")); toast.error(t("add_addressee.error"));
} else { } else {
await store.dispatch("setAdressees", { await store.dispatch("setAdressees", {
ticketId: ticket.value.id, ticketId: ticket.value.id,
addressees: addressees.value, addressees: addressees.value,
}); });
activeTab.value = ""; activeTab.value = "";
toast.success(t("transfert.success")); toast.success(t("add_addressee.success"));
} }
break; break;
} }
@ -203,6 +205,7 @@ export default defineComponent({
} }
return { return {
actionIcons: ref(store.getters.getActionIcons),
activeTab, activeTab,
ticket, ticket,
motives, motives,

View File

@ -3,7 +3,7 @@
<div class="col-12"> <div class="col-12">
<ckeditor <ckeditor
name="content" name="content"
:placeholder="$t('comment.content')" :placeholder="$t('add_comment.content')"
:editor="editor" :editor="editor"
v-model="content" v-model="content"
tag-name="textarea" tag-name="textarea"

View File

@ -29,7 +29,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent, ref } from "vue"; import { PropType, computed, defineComponent, ref } from "vue";
// Types // Types
import { import {
@ -37,7 +37,6 @@ import {
UserGroup, UserGroup,
UserGroupOrUser, UserGroupOrUser,
} from "../../../../../../../ChillMainBundle/Resources/public/types"; } from "../../../../../../../ChillMainBundle/Resources/public/types";
import { Ticket } from "../../../types";
export default defineComponent({ export default defineComponent({
name: "AddresseeComponent", name: "AddresseeComponent",
@ -48,23 +47,27 @@ export default defineComponent({
}, },
}, },
setup(props, ctx) { setup(props, ctx) {
const userGroups = ref( const userGroups = computed(
props.addressees.filter( () =>
(addressee) => props.addressees.filter(
addressee.type == "user_group" && addressee.excludeKey == "" (addressee) =>
) as UserGroup[] addressee.type == "user_group" &&
addressee.excludeKey == ""
) as UserGroup[]
); );
const userGroupLevels = ref( const userGroupLevels = computed(
props.addressees.filter( () =>
(addressee) => props.addressees.filter(
addressee.type == "user_group" && (addressee) =>
addressee.excludeKey == "level" addressee.type == "user_group" &&
) as UserGroup[] addressee.excludeKey == "level"
) as UserGroup[]
); );
const users = ref( const users = computed(
props.addressees.filter( () =>
(addressee) => addressee.type == "user" props.addressees.filter(
) as User[] (addressee) => addressee.type == "user"
) as User[]
); );
return { userGroups, users, userGroupLevels }; return { userGroups, users, userGroupLevels };
}, },

View File

@ -66,8 +66,8 @@
<add-persons <add-persons
:options="addPersonsOptions" :options="addPersonsOptions"
key="add-person-ticket" key="add-person-ticket"
buttonTitle="transfert.user_label" buttonTitle="add_addressee.user_label"
modalTitle="transfert.user_label" modalTitle="add_addressee.user_label"
ref="addPersons" ref="addPersons"
@addNewPersons="addNewEntity" @addNewPersons="addNewEntity"
/> />
@ -121,10 +121,12 @@ export default defineComponent({
emits: ["update:modelValue"], emits: ["update:modelValue"],
setup(props, ctx) { setup(props, ctx) {
const addressees = ref(props.modelValue as UserGroupOrUser[]); const addressees = ref([...props.modelValue] as UserGroupOrUser[]);
const userGroups = props.modelValue.filter( const userGroups = [
(addressee) => addressee.type == "user_group" ...props.modelValue.filter(
) as UserGroup[]; (addressee) => addressee.type == "user_group"
),
] as UserGroup[];
const userGroupLevel = ref( const userGroupLevel = ref(
userGroups.filter( userGroups.filter(
@ -135,10 +137,9 @@ export default defineComponent({
userGroups.filter((userGroup) => userGroup.excludeKey == "") as userGroups.filter((userGroup) => userGroup.excludeKey == "") as
| UserGroup[] | UserGroup[]
); );
const users = ref( const users = ref([
props.modelValue.filter((addressee) => addressee.type == "user") as ...props.modelValue.filter((addressee) => addressee.type == "user"),
| User[] ] as User[]);
);
const addPersons = ref(); const addPersons = ref();
const { t } = useI18n(); const { t } = useI18n();
@ -184,24 +185,26 @@ export default defineComponent({
} }
watch(userGroupLevel, (userGroupLevelAdd, userGroupLevelRem) => { watch(userGroupLevel, (userGroupLevelAdd, userGroupLevelRem) => {
if (userGroupLevelRem) { const index = addressees.value.indexOf(
addressees.value.splice( userGroupLevelRem as UserGroup
addressees.value.indexOf(userGroupLevelRem as UserGroup), );
1 if (index !== -1) {
); addressees.value.splice(index, 1);
} }
addressees.value.push(userGroupLevelAdd as UserGroup); addressees.value.push(userGroupLevelAdd as UserGroup);
ctx.emit("update:modelValue", addressees.value); ctx.emit("update:modelValue", addressees.value);
}); });
watch(userGroup, (userGroupAdd) => { watch(userGroup, (userGroupAdd) => {
const userGroups = addressees.value.filter( const userGroupLevel = addressees.value.filter(
(addressee) => addressee.type === "user_group" (addressee) =>
addressee.type == "user_group" &&
addressee.excludeKey == "level"
) as UserGroup[]; ) as UserGroup[];
addressees.value = userGroups.filter( const users = addressees.value.filter(
(addressee) => addressee.excludeKey !== "" (addressee) => addressee.type == "user"
); ) as UserGroup[];
addressees.value = [...addressees.value, ...userGroupAdd]; addressees.value = [...users, ...userGroupLevel, ...userGroupAdd];
ctx.emit("update:modelValue", addressees.value); ctx.emit("update:modelValue", addressees.value);
}); });
@ -218,7 +221,7 @@ export default defineComponent({
customUserGroupLabel(selectedUserGroup: UserGroup) { customUserGroupLabel(selectedUserGroup: UserGroup) {
return selectedUserGroup.label return selectedUserGroup.label
? selectedUserGroup.label.fr ? selectedUserGroup.label.fr
: t("transfert.user_group_label"); : t("add_addresseeuser_group_label");
}, },
}; };
}, },

View File

@ -13,16 +13,18 @@
</div> </div>
<div class="col-md-6 col-sm-12"> <div class="col-md-6 col-sm-12">
<div class="float-end"> <div class="d-flex justify-content-end">
<h1> <h1>
<span class="badge text-bg-chill-green text-white"> <span class="badge text-bg-chill-green text-white">
{{ $t("banner.open") }} {{ $t("banner.open") }}
</span> </span>
</h1> </h1>
</div>
<div class="d-flex justify-content-end">
<h3 class="fst-italic" v-if="ticket.createdAt"> <h3 class="fst-italic" v-if="ticket.createdAt">
{{ {{
$t("banner.since", { $t("banner.since", {
count: getSince(ticket.createdAt), time: since,
}) })
}} }}
</h3> </h3>
@ -68,17 +70,14 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent, ref, watch } from "vue"; import { PropType, computed, defineComponent, ref } from "vue";
import { useI18n } from "vue-i18n";
// Components // Components
import PersonRenderBox from "../../../../../../../ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue"; import PersonRenderBox from "../../../../../../../ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue";
import AddresseeComponent from "./AddresseeComponent.vue"; import AddresseeComponent from "./AddresseeComponent.vue";
// Types // Types
import {
User,
UserGroup,
} from "../../../../../../../ChillMainBundle/Resources/public/types";
import { Ticket } from "../../../types"; import { Ticket } from "../../../types";
export default defineComponent({ export default defineComponent({
@ -93,16 +92,46 @@ export default defineComponent({
PersonRenderBox, PersonRenderBox,
AddresseeComponent, AddresseeComponent,
}, },
setup() { setup(props) {
function getSince(createdAt: any) { const { t } = useI18n();
const today = new Date(); const today = ref(new Date());
const date = new Date(createdAt.date); const createdAt = ref(props.ticket.createdAt as any);
const timeDiff = Math.abs(today.getTime() - date.getTime()); setInterval(function () {
const daysDiff = Math.ceil(timeDiff / (1000 * 3600 * 24)); today.value = new Date();
return daysDiff; }, 5000);
}
return { getSince }; const since = computed(() => {
const date = new Date(createdAt.value.date);
const timeDiff = Math.abs(today.value.getTime() - date.getTime());
const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24));
const hoursDiff = Math.floor(
(timeDiff % (1000 * 3600 * 24)) / (1000 * 3600)
);
const minutesDiff = Math.floor(
(timeDiff % (1000 * 3600)) / (1000 * 60)
);
if (daysDiff < 1) {
return `${t("banner.hours", { count: hoursDiff })} ${t(
"banner.and"
)} ${t("banner.minutes", {
count: minutesDiff,
})}`;
} else {
return `${t("banner.days", { count: daysDiff })}, ${t(
"banner.hours",
{
count: hoursDiff,
}
)} ${t("banner.and")} ${t("banner.minutes", {
count: minutesDiff,
})}`;
}
});
return { since };
}, },
}); });
</script> </script>

View File

@ -1,11 +1,22 @@
<template> <template>
<div class="row"> <div class="row">
<div class="col-12 col-lg-4 col-md-6"> <div class="col-12 col-lg-4 col-md-6">
<vue-multiselect name="selectMotive" id="selectMotive" label="label" :custom-label="customLabel" <vue-multiselect
track-by="id" open-direction="top" :multiple="false" :searchable="true" name="selectMotive"
:placeholder="$t('motive.label')" :select-label="$t('multiselect.select_label')" id="selectMotive"
:deselect-label="$t('multiselect.deselect_label')" :selected-label="$t('multiselect.selected_label')" label="label"
:options="motives" v-model="motive" /> :custom-label="customLabel"
track-by="id"
open-direction="top"
:multiple="false"
:searchable="true"
:placeholder="$t('set_motive.label')"
:select-label="$t('multiselect.select_label')"
:deselect-label="$t('multiselect.deselect_label')"
:selected-label="$t('multiselect.selected_label')"
:options="motives"
v-model="motive"
/>
</div> </div>
</div> </div>
</template> </template>
@ -46,7 +57,7 @@ export default defineComponent({
return { return {
motive, motive,
customLabel(motive: Motive) { customLabel(motive: Motive) {
return motive.label ? motive.label.fr : t('motive.label'); return motive.label ? motive.label.fr : t("set_motive.label");
}, },
}; };
}, },

View File

@ -1,12 +1,6 @@
<template> <template>
<div class="col-12"> <div class="col-12">
<i class="fa fa-comment"></i> <div v-html="convertMarkdownToHtml(commentHistory.content)"></div>
<span class="mx-1">
{{ $t("history.comment") }}
</span>
<div class="mt-2">
<div v-html="convertMarkdownToHtml(commentHistory.content)"></div>
</div>
</div> </div>
</template> </template>
@ -27,7 +21,6 @@ export default defineComponent({
}, },
}, },
setup() { setup() {
const preprocess = (markdown: string): string => { const preprocess = (markdown: string): string => {
return markdown; return markdown;
}; };
@ -62,6 +55,4 @@ export default defineComponent({
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped></style>
</style>

View File

@ -6,12 +6,13 @@
> >
<template v-if="!Array.isArray(history_line)"> <template v-if="!Array.isArray(history_line)">
<div class="card-header"> <div class="card-header">
<span class="fw-bold fst-italic"> <i :class="`${actionIcons[history_line.event_type]} me-1`"></i>
<span class="fw-bold fst-italic mx-1">
{{ formatDate(history_line.at) }} {{ formatDate(history_line.at) }}
</span> </span>
<span class="badge bg-white text-black mx-1">{{ <span class="badge bg-white text-black mx-1">
history_line.by.username {{ history_line.by.username }}
}}</span> </span>
</div> </div>
<div class="card-body row"> <div class="card-body row">
<ticket-history-person-component <ticket-history-person-component
@ -52,10 +53,11 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent } from "vue"; import { PropType, defineComponent, ref } from "vue";
import { DateTime } from "../../../../../../../ChillMainBundle/Resources/public/types"; import { useStore } from "vuex";
// Types // Types
import { DateTime } from "../../../../../../../ChillMainBundle/Resources/public/types";
import { Ticket } from "../../../types"; import { Ticket } from "../../../types";
// Components // Components
@ -80,13 +82,15 @@ export default defineComponent({
}, },
setup() { setup() {
const store = useStore();
function formatDate(d: DateTime) { function formatDate(d: DateTime) {
const date = new Date(d.datetime); const date = new Date(d.datetime);
const month = date.toLocaleString("default", { month: "long" }); const month = date.toLocaleString("default", { month: "long" });
return `${date.getDate()} ${month} ${date.getFullYear()}, ${date.toLocaleTimeString()}`; return `${date.getDate()} ${month} ${date.getFullYear()}, ${date.toLocaleTimeString()}`;
} }
return { formatDate }; return { actionIcons: ref(store.getters.getActionIcons), formatDate };
}, },
}); });
</script> </script>

View File

@ -1,21 +1,17 @@
<template> <template>
<div class="col-12"> <div class="col-12">
<i class="fa fa-paint-brush"></i> {{ motiveHistory.motive.label.fr }}
<span class="mx-1">
{{ $t('history.motive',{ motive: motiveHistory.motive.label.fr }) }}
</span>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent } from "vue";
import { PropType, defineComponent } from 'vue';
// Types // Types
import { MotiveHistory } from '../../../types'; import { MotiveHistory } from "../../../types";
export default defineComponent({ export default defineComponent({
name: 'TicketHistoryMotiveComponent', name: "TicketHistoryMotiveComponent",
props: { props: {
motiveHistory: { motiveHistory: {
type: Object as PropType<MotiveHistory>, type: Object as PropType<MotiveHistory>,
@ -23,7 +19,7 @@ export default defineComponent({
}, },
}, },
setup() {} setup() {},
}); });
</script> </script>

View File

@ -1,21 +1,40 @@
<template> <template>
<div class="col-12" v-if="personHistory.createdBy"> <div class="col-12" v-if="personHistory.createdBy">
<i class="fa fa-eyedropper"></i>
<span class="mx-1"> <span class="mx-1">
{{ $t("history.user", { username: personHistory.createdBy.username }) }} {{ $t("history.user") }}
<span class="badge bg-primary m-1">
{{ personHistory.createdBy.username }}
</span>
</span> </span>
</div> </div>
<div class="col-12"> <div class="col-12">
<i class="fa fa-bolt" style="min-width: 16px"></i>
<span class="mx-1"> <span class="mx-1">
{{ $t("history.person", { person: personHistory.person.text }) }} {{ $t("history.person") }}
</span> </span>
<person-render-box
render="badge"
:key="personHistory.person.id"
:person="personHistory.person"
:options="{
addLink: true,
addId: false,
addAltNames: false,
addEntity: true,
addInfo: true,
hLevel: 3,
isMultiline: true,
isConfidential: false,
}"
/>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent } from "vue"; import { PropType, defineComponent } from "vue";
// Components
import PersonRenderBox from "../../../../../../../ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue";
// Type // Type
import { PersonHistory, Ticket } from "../../../types"; import { PersonHistory, Ticket } from "../../../types";
@ -27,6 +46,9 @@ export default defineComponent({
required: true, required: true,
}, },
}, },
components: {
PersonRenderBox,
},
setup() {}, setup() {},
}); });

View File

@ -10,29 +10,23 @@ const messages = {
close: "Fermer", close: "Fermer",
}, },
history: { history: {
person: "Ouverture par appel téléphonique de {person}", person: "Ouverture par appel téléphonique de ",
user: "Prise en charge par {username}", user: "Prise en charge par ",
motive: "Motif indiqué: {motive}",
comment: "Commentaire",
add_addressee_user_group: "Groupe {user_group} transferé",
remove_addressee_user_group: "Groupe {user_group} retiré",
add_addressee_user: " Utilisateur {user} Transferé",
remove_addressee_user: "Utilisateur {user} retiré",
}, },
comment: { add_comment: {
title: "Commentaire", title: "Commentaire",
label: "Ajouter un commentaire", label: "Ajouter un commentaire",
success: "Commentaire enregistré", success: "Commentaire enregistré",
content: "Ajouter un commentaire", content: "Ajouter un commentaire",
error: "Aucun commentaire ajouté", error: "Aucun commentaire ajouté",
}, },
motive: { set_motive: {
title: "Motif", title: "Motif",
label: "Choisir un motif", label: "Choisir un motif",
success: "Motif enregistré", success: "Motif enregistré",
error: "Aucun motif sélectionné", error: "Aucun motif sélectionné",
}, },
transfert: { add_addressee: {
title: "Transfert", title: "Transfert",
user_group_label: "Transferer vers un groupe", user_group_label: "Transferer vers un groupe",
user_label: "Transferer vers un ou plusieurs utilisateurs", user_label: "Transferer vers un ou plusieurs utilisateurs",
@ -43,7 +37,11 @@ const messages = {
concerned_patient: "Patient concerné", concerned_patient: "Patient concerné",
speaker: "Destinataire(s)", speaker: "Destinataire(s)",
open: "Ouvert", open: "Ouvert",
since: "Aucun jour | Depuis 1 jour | Depuis {count} jours", since: "Depuis {time}",
and: "et",
days: "1 jour | {count} jours",
hours: "1 heure | {count} heures",
minutes: "1 minute | {count} minutes",
no_motive: "Pas de motif", no_motive: "Pas de motif",
}, },
}, },

View File

@ -2,21 +2,20 @@ import { createStore } from "vuex";
import { State as MotiveStates, moduleMotive } from "./modules/motive"; import { State as MotiveStates, moduleMotive } from "./modules/motive";
import { State as TicketStates, moduleTicket } from "./modules/ticket"; import { State as TicketStates, moduleTicket } from "./modules/ticket";
import { State as CommentStates, moduleComment } from "./modules/comment"; import { State as CommentStates, moduleComment } from "./modules/comment";
import { State as UserStates, moduleUser } from "./modules/user"; import { State as UserStates, moduleUser } from "./modules/addressee";
export type RootState = { export type RootState = {
motive: MotiveStates; motive: MotiveStates;
ticket: TicketStates; ticket: TicketStates;
comment: CommentStates; comment: CommentStates;
user: UserStates; user: UserStates;
}; };
export const store = createStore({ export const store = createStore({
modules: { modules: {
motive:moduleMotive, motive: moduleMotive,
ticket:moduleTicket, ticket: moduleTicket,
comment:moduleComment, comment: moduleComment,
user:moduleUser, user: moduleUser,
},
}
}); });

View File

@ -5,16 +5,31 @@ import { Ticket } from "../../../../types";
export interface State { export interface State {
ticket: Ticket; ticket: Ticket;
action_icons: Object;
} }
export const moduleTicket: Module<State, RootState> = { export const moduleTicket: Module<State, RootState> = {
state: () => ({ state: () => ({
ticket: {} as Ticket, ticket: {} as Ticket,
action_icons: {
add_person: "fa fa-eyedropper",
add_comment: "fa fa-comment",
set_motive: "fa fa-paint-brush",
add_addressee: "fa fa-paper-plane",
},
toto: "toto",
}), }),
getters: { getters: {
getTicket(state) { getTicket(state) {
state.ticket.history = state.ticket.history.sort((a, b) =>
b.at.datetime.localeCompare(a.at.datetime)
);
return state.ticket; return state.ticket;
}, },
getActionIcons(state) {
return state.action_icons;
},
getDistinctAddressesHistory(state) { getDistinctAddressesHistory(state) {
const addresseeHistory = state.ticket.history.reduce( const addresseeHistory = state.ticket.history.reduce(
(result, item) => { (result, item) => {