Automatic eslint fixes

This commit is contained in:
Julien Fastré 2025-05-27 10:21:25 +02:00
parent b035020c6f
commit 25be5c9ea3
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
19 changed files with 310 additions and 244 deletions

View File

@ -1 +1 @@
import './banner.scss'; import "./banner.scss";

View File

@ -2,104 +2,108 @@ import {
DateTime, DateTime,
TranslatableString, TranslatableString,
User, User,
UserGroupOrUser UserGroupOrUser,
} from "../../../../ChillMainBundle/Resources/public/types"; } from "../../../../ChillMainBundle/Resources/public/types";
import { Person } from "../../../../ChillPersonBundle/Resources/public/types"; import { Person } from "../../../../ChillPersonBundle/Resources/public/types";
export interface Motive { export interface Motive {
type: "ticket_motive" type: "ticket_motive";
id: number, id: number;
active: boolean, active: boolean;
label: TranslatableString label: TranslatableString;
} }
interface TicketHistory<T extends string, D extends object> { interface TicketHistory<T extends string, D extends object> {
event_type: T, event_type: T;
at: DateTime, at: DateTime;
by: User, by: User;
data: D data: D;
} }
export interface PersonHistory { export interface PersonHistory {
type: "ticket_person_history", type: "ticket_person_history";
id: number, id: number;
startDate: DateTime, startDate: DateTime;
endDate: null|DateTime, endDate: null | DateTime;
person: Person, person: Person;
removedBy: null, removedBy: null;
createdBy: User|null, createdBy: User | null;
createdAt: DateTime|null createdAt: DateTime | null;
} }
export interface MotiveHistory { export interface MotiveHistory {
type: "ticket_motive_history", type: "ticket_motive_history";
id: number, id: number;
startDate: null, startDate: null;
endDate: null|DateTime, endDate: null | DateTime;
motive: Motive, motive: Motive;
createdBy: User|null, createdBy: User | null;
createdAt: DateTime|null, createdAt: DateTime | null;
} }
export interface Comment { export interface Comment {
type: "ticket_comment", type: "ticket_comment";
id: number, id: number;
content: string, content: string;
createdBy: User|null, createdBy: User | null;
createdAt: DateTime|null, createdAt: DateTime | null;
updatedBy: User|null, updatedBy: User | null;
updatedAt: DateTime|null, updatedAt: DateTime | null;
} }
export interface AddresseeHistory { export interface AddresseeHistory {
type: "ticket_addressee_history", type: "ticket_addressee_history";
id: number, id: number;
startDate: DateTime|null, startDate: DateTime | null;
addressee: UserGroupOrUser, addressee: UserGroupOrUser;
endDate: DateTime|null, endDate: DateTime | null;
removedBy: User|null, removedBy: User | null;
createdBy: User|null, createdBy: User | null;
createdAt: DateTime|null, createdAt: DateTime | null;
updatedBy: User|null, updatedBy: User | null;
updatedAt: DateTime|null, updatedAt: DateTime | null;
} }
export interface AddresseeState { export interface AddresseeState {
addressees: UserGroupOrUser[], addressees: UserGroupOrUser[];
} }
export interface PersonsState { export interface PersonsState {
persons: Person[] persons: Person[];
} }
export interface CreateTicketState {} export interface CreateTicketState {}
//interface AddPersonEvent extends TicketHistory<"add_person", PersonHistory> {}; //interface AddPersonEvent extends TicketHistory<"add_person", PersonHistory> {};
export interface AddCommentEvent extends TicketHistory<"add_comment", Comment> {}; export interface AddCommentEvent
export interface SetMotiveEvent extends TicketHistory<"set_motive", MotiveHistory> {}; extends TicketHistory<"add_comment", Comment> {}
export 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> {}; //interface RemoveAddressee extends TicketHistory<"remove_addressee", AddresseeHistory> {};
export interface AddresseesStateEvent extends TicketHistory<"addressees_state", AddresseeState> {}; export interface AddresseesStateEvent
export interface CreateTicketEvent extends TicketHistory<"create_ticket", CreateTicketState> {}; extends TicketHistory<"addressees_state", AddresseeState> {}
export interface PersonStateEvent extends TicketHistory<"persons_state", PersonsState> {}; export interface CreateTicketEvent
extends TicketHistory<"create_ticket", CreateTicketState> {}
export interface PersonStateEvent
extends TicketHistory<"persons_state", PersonsState> {}
export type TicketHistoryLine = export type TicketHistoryLine =
/* AddPersonEvent */ /* AddPersonEvent */
CreateTicketEvent | | CreateTicketEvent
AddCommentEvent | | AddCommentEvent
SetMotiveEvent | /*AddAddressee | RemoveAddressee | */ | SetMotiveEvent /*AddAddressee | RemoveAddressee | */
AddresseesStateEvent | | AddresseesStateEvent
PersonStateEvent; | PersonStateEvent;
export interface Ticket { export interface Ticket {
type: "ticket_ticket", type: "ticket_ticket";
id: number, id: number;
externalRef: string, externalRef: string;
currentAddressees: UserGroupOrUser[], currentAddressees: UserGroupOrUser[];
currentPersons: Person[], currentPersons: Person[];
currentMotive: null|Motive, currentMotive: null | Motive;
history: TicketHistoryLine[], history: TicketHistoryLine[];
createdAt: DateTime|null, createdAt: DateTime | null;
updatedBy: User|null, updatedBy: User | null;
} }

View File

@ -38,7 +38,7 @@ export default defineComponent({
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,
); );
onMounted(async () => { onMounted(async () => {

View File

@ -8,7 +8,10 @@
</label> </label>
</div> </div>
<form v-if="activeTab !== 'set_persons'" @submit.prevent="submitAction"> <form
v-if="activeTab !== 'set_persons'"
@submit.prevent="submitAction"
>
<add-comment-component <add-comment-component
v-model="content" v-model="content"
v-if="activeTab === 'add_comment'" v-if="activeTab === 'add_comment'"
@ -44,7 +47,9 @@
</ul> </ul>
</form> </form>
<template v-else> <template v-else>
<persons-selector-component @closeRequested="closeAllActions()" /> <persons-selector-component
@closeRequested="closeAllActions()"
/>
</template> </template>
</div> </div>
</div> </div>
@ -54,7 +59,9 @@
<a :href="returnPath" class="btn btn-cancel">Annuler</a> <a :href="returnPath" class="btn btn-cancel">Annuler</a>
</li> </li>
<li v-else class="nav-item p-2 go-back"> <li v-else class="nav-item p-2 go-back">
<a href="/fr/ticket/ticket/list" class="btn btn-cancel">Annuler</a> <a href="/fr/ticket/ticket/list" class="btn btn-cancel"
>Annuler</a
>
</li> </li>
<li class="nav-item p-2"> <li class="nav-item p-2">
<button <button
@ -176,40 +183,47 @@ export default defineComponent({
const { t } = useI18n(); const { t } = useI18n();
const toast = inject("toast") as any; const toast = inject("toast") as any;
const activeTab = ref( const activeTab = ref(
"" as "" | "add_comment" | "set_motive" | "add_addressee" | "set_persons" "" as
| ""
| "add_comment"
| "set_motive"
| "add_addressee"
| "set_persons",
); );
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[]);
const userGroups = computed( const userGroups = computed(
() => store.getters.getUserGroups as UserGroup[] () => store.getters.getUserGroups as UserGroup[],
); );
const users = computed(() => store.getters.getUsers as User[]); const users = computed(() => store.getters.getUsers as User[]);
const hasReturnPath = computed((): boolean => { const hasReturnPath = computed((): boolean => {
const params = new URL(document.location.toString()).searchParams; const params = new URL(document.location.toString()).searchParams;
return params.has('returnPath'); return params.has("returnPath");
}); });
const returnPath = computed((): string => { const returnPath = computed((): string => {
const params = new URL(document.location.toString()).searchParams; const params = new URL(document.location.toString()).searchParams;
const returnPath = params.get('returnPath'); const returnPath = params.get("returnPath");
if (null === returnPath) { if (null === returnPath) {
throw new Error("there isn't any returnPath, please check the existence before"); throw new Error(
"there isn't any returnPath, please check the existence before",
);
} }
return returnPath; return returnPath;
}) });
const motive = ref( const motive = ref(
ticket.value.currentMotive ticket.value.currentMotive
? ticket.value.currentMotive ? ticket.value.currentMotive
: ({} as Motive) : ({} as Motive),
); );
const content = ref("" as Comment["content"]); const content = ref("" as Comment["content"]);
const addressees = ref( const addressees = ref(
ticket.value.currentAddressees as Array<UserGroupOrUser> ticket.value.currentAddressees as UserGroupOrUser[],
); );
async function submitAction() { async function submitAction() {
@ -264,7 +278,7 @@ export default defineComponent({
const closeAllActions = function () { const closeAllActions = function () {
activeTab.value = ""; activeTab.value = "";
} };
return { return {
actionIcons: ref(store.getters.getActionIcons), actionIcons: ref(store.getters.getActionIcons),
@ -287,7 +301,6 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.go-back { .go-back {
margin-right: auto; margin-right: auto;
} }

View File

@ -21,7 +21,11 @@
</div> </div>
<div v-if="users.length > 0" class="col-12"> <div v-if="users.length > 0" class="col-12">
<span class="badge-user"> <span class="badge-user">
<user-render-box-badge v-for="user in users" :key="user.id" :user="user"></user-render-box-badge> <user-render-box-badge
v-for="user in users"
:key="user.id"
:user="user"
></user-render-box-badge>
</span> </span>
</div> </div>
</template> </template>
@ -52,22 +56,22 @@ export default defineComponent({
props.addressees.filter( props.addressees.filter(
(addressee) => (addressee) =>
addressee.type == "user_group" && addressee.type == "user_group" &&
addressee.excludeKey == "" addressee.excludeKey == "",
) as UserGroup[] ) as UserGroup[],
); );
const userGroupLevels = computed( const userGroupLevels = computed(
() => () =>
props.addressees.filter( props.addressees.filter(
(addressee) => (addressee) =>
addressee.type == "user_group" && addressee.type == "user_group" &&
addressee.excludeKey == "level" addressee.excludeKey == "level",
) as UserGroup[] ) as UserGroup[],
); );
const users = computed( const users = computed(
() => () =>
props.addressees.filter( props.addressees.filter(
(addressee) => addressee.type == "user" (addressee) => addressee.type == "user",
) as User[] ) as User[],
); );
return { userGroups, users, userGroupLevels }; return { userGroups, users, userGroupLevels };
}, },

View File

@ -4,7 +4,7 @@
<div class="mb-5 level-line"> <div class="mb-5 level-line">
<span <span
v-for="userGroupItem in userGroups.filter( v-for="userGroupItem in userGroups.filter(
(userGroup) => userGroup.excludeKey == 'level' (userGroup) => userGroup.excludeKey == 'level',
)" )"
:key="userGroupItem.id" :key="userGroupItem.id"
class="m-2 as-user-group" class="m-2 as-user-group"
@ -19,7 +19,7 @@
v-model="userGroupLevel" v-model="userGroupLevel"
@click=" @click="
Object.values(userGroupLevel).includes( Object.values(userGroupLevel).includes(
userGroupItem.id userGroupItem.id,
) )
? (userGroupLevel = {}) ? (userGroupLevel = {})
: (userGroupLevel = userGroupItem) : (userGroupLevel = userGroupItem)
@ -37,7 +37,7 @@
<div class="mb-2 level-line"> <div class="mb-2 level-line">
<span <span
v-for="userGroupItem in userGroups.filter( v-for="userGroupItem in userGroups.filter(
(userGroup) => userGroup.excludeKey == '' (userGroup) => userGroup.excludeKey == '',
)" )"
:key="userGroupItem.id" :key="userGroupItem.id"
class="m-2" class="m-2"
@ -93,10 +93,10 @@ import {
User, User,
UserGroup, UserGroup,
UserGroupOrUser, UserGroupOrUser,
} from "../../../../../../../ChillMainBundle/Resources/public/types"; } from "ChillMainAssets/types";
// Components // Components
import AddPersons from "../../../../../../../ChillPersonBundle/Resources/public/vuejs/_components/AddPersons.vue"; import AddPersons from "ChillPersonAssets/Resources/public/vuejs/_components/AddPersons.vue";
export default defineComponent({ export default defineComponent({
name: "AddresseeSelectorComponent", name: "AddresseeSelectorComponent",
@ -124,18 +124,19 @@ export default defineComponent({
const addressees = ref([...props.modelValue] as UserGroupOrUser[]); const addressees = ref([...props.modelValue] as UserGroupOrUser[]);
const userGroups = [ const userGroups = [
...props.modelValue.filter( ...props.modelValue.filter(
(addressee) => addressee.type == "user_group" (addressee) => addressee.type == "user_group",
), ),
] as UserGroup[]; ] as UserGroup[];
const userGroupLevel = ref( const userGroupLevel = ref(
userGroups.filter( userGroups.filter(
(userGroup) => userGroup.excludeKey == "level" (userGroup) => userGroup.excludeKey == "level",
)[0] as UserGroup | {} )[0] as UserGroup | {},
); );
const userGroup = ref( const userGroup = ref(
userGroups.filter((userGroup) => userGroup.excludeKey == "") as userGroups.filter(
| UserGroup[] (userGroup) => userGroup.excludeKey == "",
) as UserGroup[],
); );
const users = ref([ const users = ref([
...props.modelValue.filter((addressee) => addressee.type == "user"), ...props.modelValue.filter((addressee) => addressee.type == "user"),
@ -157,7 +158,7 @@ export default defineComponent({
const { selected, modal } = datas; const { selected, modal } = datas;
users.value = selected.map((selected: any) => selected.result); users.value = selected.map((selected: any) => selected.result);
addressees.value = addressees.value.filter( addressees.value = addressees.value.filter(
(addressee) => addressee.type === "user_group" (addressee) => addressee.type === "user_group",
); );
addressees.value = [...addressees.value, ...users.value]; addressees.value = [...addressees.value, ...users.value];
ctx.emit("update:modelValue", addressees.value); ctx.emit("update:modelValue", addressees.value);
@ -180,14 +181,14 @@ export default defineComponent({
function removeUser(user: User) { function removeUser(user: User) {
users.value.splice(users.value.indexOf(user), 1); users.value.splice(users.value.indexOf(user), 1);
addressees.value = addressees.value.filter( addressees.value = addressees.value.filter(
(addressee) => addressee.id !== user.id (addressee) => addressee.id !== user.id,
); );
ctx.emit("update:modelValue", addressees.value); ctx.emit("update:modelValue", addressees.value);
} }
watch(userGroupLevel, (userGroupLevelAdd, userGroupLevelRem) => { watch(userGroupLevel, (userGroupLevelAdd, userGroupLevelRem) => {
const index = addressees.value.indexOf( const index = addressees.value.indexOf(
userGroupLevelRem as UserGroup userGroupLevelRem as UserGroup,
); );
if (index !== -1) { if (index !== -1) {
addressees.value.splice(index, 1); addressees.value.splice(index, 1);
@ -200,10 +201,10 @@ export default defineComponent({
const userGroupLevel = addressees.value.filter( const userGroupLevel = addressees.value.filter(
(addressee) => (addressee) =>
addressee.type == "user_group" && addressee.type == "user_group" &&
addressee.excludeKey == "level" addressee.excludeKey == "level",
) as UserGroup[]; ) as UserGroup[];
const users = addressees.value.filter( const users = addressees.value.filter(
(addressee) => addressee.type == "user" (addressee) => addressee.type == "user",
) as UserGroup[]; ) as UserGroup[];
addressees.value = [...users, ...userGroupLevel, ...userGroupAdd]; addressees.value = [...users, ...userGroupLevel, ...userGroupAdd];
ctx.emit("update:modelValue", addressees.value); ctx.emit("update:modelValue", addressees.value);

View File

@ -14,7 +14,10 @@
<div class="col-md-6 col-sm-12"> <div class="col-md-6 col-sm-12">
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<span class="badge text-bg-chill-green text-white" style="font-size: 1rem;"> <span
class="badge text-bg-chill-green text-white"
style="font-size: 1rem"
>
{{ $t("banner.open") }} {{ $t("banner.open") }}
</span> </span>
</div> </div>
@ -38,7 +41,15 @@
<h3 class="text-primary"> <h3 class="text-primary">
{{ $t("banner.concerned_patient") }} {{ $t("banner.concerned_patient") }}
</h3> </h3>
<on-the-fly v-for="person in ticket.currentPersons" :key="person.id" :type="person.type" :id="person.id" :buttonText="person.textAge" :displayBadge="'true' === 'true'" action="show"></on-the-fly> <on-the-fly
v-for="person in ticket.currentPersons"
:key="person.id"
:type="person.type"
:id="person.id"
:buttonText="person.textAge"
:displayBadge="'true' === 'true'"
action="show"
></on-the-fly>
</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>
@ -106,10 +117,10 @@ export default defineComponent({
const timeDiff = Math.abs(today.value.getTime() - date.getTime()); const timeDiff = Math.abs(today.value.getTime() - date.getTime());
const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); const daysDiff = Math.floor(timeDiff / (1000 * 3600 * 24));
const hoursDiff = Math.floor( const hoursDiff = Math.floor(
(timeDiff % (1000 * 3600 * 24)) / (1000 * 3600) (timeDiff % (1000 * 3600 * 24)) / (1000 * 3600),
); );
const minutesDiff = Math.floor( const minutesDiff = Math.floor(
(timeDiff % (1000 * 3600)) / (1000 * 60) (timeDiff % (1000 * 3600)) / (1000 * 60),
); );
const secondsDiff = Math.floor((timeDiff % (1000 * 60)) / 1000); const secondsDiff = Math.floor((timeDiff % (1000 * 60)) / 1000);
@ -125,7 +136,7 @@ export default defineComponent({
"banner.hours", "banner.hours",
{ {
count: hoursDiff, count: hoursDiff,
} },
)} ${t("banner.minutes", { )} ${t("banner.minutes", {
count: minutesDiff, count: minutesDiff,
})}`; })}`;

View File

@ -1,16 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { useStore } from "vuex"; import { useStore } from "vuex";
import AddPersons from "ChillPersonAssets/vuejs/_components/AddPersons.vue"; import AddPersons from "ChillPersonAssets/vuejs/_components/AddPersons.vue";
import { computed, inject, reactive } from "vue"; import { computed, inject, reactive } from "vue";
import { Ticket } from "../../../types"; import { Ticket } from "../../../types";
import {Person} from "../../../../../../../ChillPersonBundle/Resources/public/types" import { Person } from "../../../../../../../ChillPersonBundle/Resources/public/types";
import OnTheFly from "ChillMainAssets/vuejs/OnTheFly/components/OnTheFly.vue"; import OnTheFly from "ChillMainAssets/vuejs/OnTheFly/components/OnTheFly.vue";
import { ToastPluginApi } from "vue-toast-notification"; import { ToastPluginApi } from "vue-toast-notification";
const emit = defineEmits<{ const emit = defineEmits<(e: "closeRequested") => void>();
(e: 'closeRequested'): void
}>()
const store = useStore(); const store = useStore();
const toast = inject("toast") as ToastPluginApi; const toast = inject("toast") as ToastPluginApi;
@ -19,44 +16,55 @@ const persons = computed(() => ticket.value.currentPersons);
const addPersonsOptions = { const addPersonsOptions = {
uniq: false, uniq: false,
type: ['person'], type: ["person"],
priority: null, priority: null,
button: { button: {
class: 'btn-submit', class: "btn-submit",
}, },
}; };
const added: Person[] = reactive([]); const added: Person[] = reactive([]);
const removed: Person[] = reactive([]); const removed: Person[] = reactive([]);
const computeCurrentPersons = (initial: Person[], added: Person[], removed: Person[]): Person[] => { const computeCurrentPersons = (
initial: Person[],
added: Person[],
removed: Person[],
): Person[] => {
for (let p of added) { for (let p of added) {
if (initial.findIndex((element) => element.id === p.id) === -1) { if (initial.findIndex((element) => element.id === p.id) === -1) {
initial.push(p); initial.push(p);
} }
} }
return initial.filter((p) => removed.findIndex((element) => element.id === p.id) === -1); return initial.filter(
} (p) => removed.findIndex((element) => element.id === p.id) === -1,
);
};
const currentPersons = computed((): Person[] => { const currentPersons = computed((): Person[] => {
return computeCurrentPersons(persons.value, added, removed); return computeCurrentPersons(persons.value, added, removed);
}) });
const removePerson = (p: Person) => { const removePerson = (p: Person) => {
removed.push(p); removed.push(p);
} };
const addNewEntity = (n: {modal: {showModal: boolean}, selected: Array<{result: Person}>}) => { const addNewEntity = (n: {
modal: { showModal: boolean };
selected: { result: Person }[];
}) => {
n.modal.showModal = false; n.modal.showModal = false;
for (let p of n.selected) { for (let p of n.selected) {
added.push(p.result); added.push(p.result);
} }
} };
const save = async function (): Promise<void> { const save = async function (): Promise<void> {
try { try {
await store.dispatch("setPersons", { persons: computeCurrentPersons(persons.value, added, removed) }); await store.dispatch("setPersons", {
persons: computeCurrentPersons(persons.value, added, removed),
});
toast.success("Patients concernés sauvegardés"); toast.success("Patients concernés sauvegardés");
} catch (e: any) { } catch (e: any) {
console.error("error while saving", e); console.error("error while saving", e);
@ -64,16 +72,25 @@ const save = async function(): Promise<void> {
return Promise.resolve(); return Promise.resolve();
} }
emit("closeRequested"); emit("closeRequested");
} };
</script> </script>
<template> <template>
<div> <div>
<ul v-if="currentPersons.length > 0" class="person-list"> <ul v-if="currentPersons.length > 0" class="person-list">
<li v-for="person in currentPersons" :key="person.id"> <li v-for="person in currentPersons" :key="person.id">
<on-the-fly :type="person.type" :id="person.id" :buttonText="person.textAge" :displayBadge="'true' === 'true'" action="show"></on-the-fly> <on-the-fly
<button type="button" class="btn btn-delete remove-person" @click="removePerson(person)"></button> :type="person.type"
:id="person.id"
:buttonText="person.textAge"
:displayBadge="'true' === 'true'"
action="show"
></on-the-fly>
<button
type="button"
class="btn btn-delete remove-person"
@click="removePerson(person)"
></button>
</li> </li>
</ul> </ul>
<p v-else class="chill-no-data-statement">Aucun patient</p> <p v-else class="chill-no-data-statement">Aucun patient</p>

View File

@ -2,17 +2,14 @@
import { User } from "../../../../../../../ChillMainBundle/Resources/public/types"; import { User } from "../../../../../../../ChillMainBundle/Resources/public/types";
interface TicketHistoryCreateComponentConfig { interface TicketHistoryCreateComponentConfig {
by: User by: User;
} }
const props = defineProps<TicketHistoryCreateComponentConfig>(); const props = defineProps<TicketHistoryCreateComponentConfig>();
</script> </script>
<template> <template>
<p>Ticket créé par {{ props.by.text }}</p> <p>Ticket créé par {{ props.by.text }}</p>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss"></style>
</style>

View File

@ -7,7 +7,9 @@
<div class="card-header"> <div class="card-header">
<div class="history-header"> <div class="history-header">
<div class="description"> <div class="description">
<i :class="`${actionIcons[history_line.event_type]} me-1`"></i> <i
:class="`${actionIcons[history_line.event_type]} me-1`"
></i>
<span>{{ explainSentence(history_line) }}</span> <span>{{ explainSentence(history_line) }}</span>
</div> </div>
<div> <div>
@ -17,7 +19,9 @@
</div> </div>
<div> <div>
<span class="badge-user"> <span class="badge-user">
<user-render-box-badge :user="history_line.by"></user-render-box-badge> <user-render-box-badge
:user="history_line.by"
></user-render-box-badge>
</span> </span>
</div> </div>
</div> </div>
@ -110,7 +114,11 @@ export default defineComponent({
return `${date.getDate()} ${month} ${date.getFullYear()}, ${date.toLocaleTimeString()}`; return `${date.getDate()} ${month} ${date.getFullYear()}, ${date.toLocaleTimeString()}`;
} }
return { actionIcons: ref(store.getters.getActionIcons), formatDate, explainSentence }; return {
actionIcons: ref(store.getters.getActionIcons),
formatDate,
explainSentence,
};
}, },
}); });
</script> </script>

View File

@ -2,7 +2,13 @@
<div class="col-12"> <div class="col-12">
<ul class="persons-list"> <ul class="persons-list">
<li v-for="person in personHistory.persons" :key="person.id"> <li v-for="person in personHistory.persons" :key="person.id">
<on-the-fly :type="person.type" :id="person.id" :buttonText="person.textAge" :displayBadge="'true' === 'true'" action="show"></on-the-fly> <on-the-fly
:type="person.type"
:id="person.id"
:buttonText="person.textAge"
:displayBadge="'true' === 'true'"
action="show"
></on-the-fly>
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -1,28 +1,32 @@
<template> <template>
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<div class="btn-group" @click="handleClick"> <div class="btn-group" @click="handleClick">
<button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> <button
{{ $t('ticket.previous_tickets') }} type="button"
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-chill-green"> class="btn btn-light dropdown-toggle"
data-bs-toggle="dropdown"
aria-expanded="false"
>
{{ $t("ticket.previous_tickets") }}
<span
class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-chill-green"
>
{{ tickets.length }} {{ tickets.length }}
<span class="visually-hidden">Tickets</span> <span class="visually-hidden">Tickets</span>
</span> </span>
</button> </button>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent } from "vue";
import { PropType, defineComponent } from 'vue';
// Types // Types
import { Ticket } from '../../../types'; import { Ticket } from "../../../types";
export default defineComponent({ export default defineComponent({
name: 'TicketSelectorComponent', name: "TicketSelectorComponent",
props: { props: {
tickets: { tickets: {
type: Object as PropType<Ticket[]>, type: Object as PropType<Ticket[]>,
@ -31,10 +35,10 @@ export default defineComponent({
}, },
setup() { setup() {
function handleClick() { function handleClick() {
alert('Sera disponible plus tard') alert("Sera disponible plus tard");
}
return { handleClick }
} }
return { handleClick };
},
}); });
</script> </script>

View File

@ -1,32 +1,31 @@
import App from './App.vue'; import App from "./App.vue";
import { createApp } from "vue"; import { createApp } from "vue";
import { _createI18n } from "../../../../../../ChillMainBundle/Resources/public/vuejs/_js/i18n"; import { _createI18n } from "../../../../../../ChillMainBundle/Resources/public/vuejs/_js/i18n";
import VueToast from 'vue-toast-notification'; import VueToast from "vue-toast-notification";
import 'vue-toast-notification/dist/theme-sugar.css'; import "vue-toast-notification/dist/theme-sugar.css";
import { store } from "./store"; import { store } from "./store";
import messages from './i18n/messages'; import messages from "./i18n/messages";
declare global { declare global {
interface Window { interface Window {
initialTicket: string initialTicket: string;
} }
} }
const i18n = _createI18n(messages, false); const i18n = _createI18n(messages, false);
const _app = createApp({ const _app = createApp({
template: '<app></app>', template: "<app></app>",
}); });
_app _app.use(store)
.use(store)
.use(i18n) .use(i18n)
// Cant use this.$toast in components in composition API so we need to provide it // Cant use this.$toast in components in composition API so we need to provide it
// Fix: with vue-toast-notification@^3 // Fix: with vue-toast-notification@^3
.use(VueToast).provide('toast', _app.config.globalProperties.$toast) .use(VueToast)
.component('app', App) .provide("toast", _app.config.globalProperties.$toast)
.mount('#ticketRoot'); .component("app", App)
.mount("#ticketRoot");

View File

@ -5,13 +5,13 @@ import { State as CommentStates, moduleComment } from "./modules/comment";
import { State as AddresseeStates, moduleAddressee } from "./modules/addressee"; import { State as AddresseeStates, moduleAddressee } from "./modules/addressee";
import { State as PersonsState, modulePersons } from "./modules/persons"; import { State as PersonsState, modulePersons } from "./modules/persons";
export type RootState = { export interface RootState {
motive: MotiveStates; motive: MotiveStates;
ticket: TicketStates; ticket: TicketStates;
comment: CommentStates; comment: CommentStates;
addressee: AddresseeStates; addressee: AddresseeStates;
persons: PersonsState; persons: PersonsState;
}; }
export const store = createStore<RootState>({ export const store = createStore<RootState>({
modules: { modules: {

View File

@ -13,14 +13,14 @@ import {
} from "../../../../../../../../ChillMainBundle/Resources/public/types"; } from "../../../../../../../../ChillMainBundle/Resources/public/types";
export interface State { export interface State {
userGroups: Array<UserGroup>; userGroups: UserGroup[];
users: Array<User>; users: User[];
} }
export const moduleAddressee: Module<State, RootState> = { export const moduleAddressee: Module<State, RootState> = {
state: () => ({ state: () => ({
userGroups: [] as Array<UserGroup>, userGroups: [] as UserGroup[],
users: [] as Array<User>, users: [] as User[],
}), }),
getters: { getters: {
getUserGroups(state) { getUserGroups(state) {
@ -44,7 +44,7 @@ export const moduleAddressee: Module<State, RootState> = {
fetchResults("/api/1.0/main/user-group.json").then( fetchResults("/api/1.0/main/user-group.json").then(
(results) => { (results) => {
commit("setUserGroups", results); commit("setUserGroups", results);
} },
); );
} catch (e: any) { } catch (e: any) {
throw e.name; throw e.name;
@ -62,7 +62,7 @@ export const moduleAddressee: Module<State, RootState> = {
async setAdressees( async setAdressees(
{ commit }, { commit },
datas: { ticketId: number; addressees: Array<UserGroupOrUser> } datas: { ticketId: number; addressees: UserGroupOrUser[] },
) { ) {
const { ticketId, addressees } = datas; const { ticketId, addressees } = datas;
try { try {
@ -73,7 +73,7 @@ export const moduleAddressee: Module<State, RootState> = {
addressees: addressees.map((addressee) => { addressees: addressees.map((addressee) => {
return { id: addressee.id, type: addressee.type }; return { id: addressee.id, type: addressee.type };
}), }),
} },
); );
commit("setTicket", result); commit("setTicket", result);
} catch (e: any) { } catch (e: any) {

View File

@ -9,30 +9,29 @@ import { RootState } from "..";
import { Comment } from "../../../../types"; import { Comment } from "../../../../types";
export interface State { export interface State {
comments: Array<Comment>; comments: Comment[];
} }
export const moduleComment: Module<State, RootState> = { export const moduleComment: Module<State, RootState> = {
state: () => ({ state: () => ({
comments: [] as Array<Comment>, comments: [] as Comment[],
}), }),
getters: {}, getters: {},
mutations: {}, mutations: {},
actions: { actions: {
async createComment( async createComment(
{ commit }, { commit },
datas: { ticketId: number; content: Comment["content"] } datas: { ticketId: number; content: Comment["content"] },
) { ) {
const { ticketId, content } = datas; const { ticketId, content } = datas;
try { try {
const result = await makeFetch( const result = await makeFetch(
"POST", "POST",
`/api/1.0/ticket/${ticketId}/comment/add`, `/api/1.0/ticket/${ticketId}/comment/add`,
{ content } { content },
); );
commit("setTicket", result); commit("setTicket", result);
} } catch (e: any) {
catch(e: any) {
throw e.name; throw e.name;
} }
}, },

View File

@ -9,12 +9,12 @@ import { RootState } from "..";
import { Motive } from "../../../../types"; import { Motive } from "../../../../types";
export interface State { export interface State {
motives: Array<Motive>; motives: Motive[];
} }
export const moduleMotive: Module<State, RootState> = { export const moduleMotive: Module<State, RootState> = {
state: () => ({ state: () => ({
motives: [] as Array<Motive>, motives: [] as Motive[],
}), }),
getters: { getters: {
getMotives(state) { getMotives(state) {
@ -30,7 +30,7 @@ export const moduleMotive: Module<State, RootState> = {
async fetchMotives({ commit }) { async fetchMotives({ commit }) {
try { try {
const results = (await fetchResults( const results = (await fetchResults(
"/api/1.0/ticket/motive.json" "/api/1.0/ticket/motive.json",
)) as Motive[]; )) as Motive[];
commit("setMotives", results); commit("setMotives", results);
} catch (e: any) { } catch (e: any) {
@ -40,7 +40,7 @@ export const moduleMotive: Module<State, RootState> = {
async createMotive( async createMotive(
{ commit }, { commit },
datas: { ticketId: number; motive: Motive } datas: { ticketId: number; motive: Motive },
) { ) {
const { ticketId, motive } = datas; const { ticketId, motive } = datas;
try { try {
@ -52,7 +52,7 @@ export const moduleMotive: Module<State, RootState> = {
id: motive.id, id: motive.id,
type: motive.type, type: motive.type,
}, },
} },
); );
commit("setTicket", result); commit("setTicket", result);
} catch (e: any) { } catch (e: any) {

View File

@ -1,20 +1,21 @@
import { import { makeFetch } from "../../../../../../../../ChillMainBundle/Resources/public/lib/api/apiMethods";
makeFetch,
} from "../../../../../../../../ChillMainBundle/Resources/public/lib/api/apiMethods";
import { Person } from "../../../../../../../../ChillPersonBundle/Resources/public/types"; import { Person } from "../../../../../../../../ChillPersonBundle/Resources/public/types";
import { Module } from "vuex"; import { Module } from "vuex";
import { RootState } from ".."; import { RootState } from "..";
import { Ticket } from "../../../../types"; import { Ticket } from "../../../../types";
export interface State {}; export interface State {}
export const modulePersons: Module<State, RootState> = { export const modulePersons: Module<State, RootState> = {
actions: { actions: {
async setPersons( async setPersons(
{ commit, rootState: RootState }, { commit, rootState: RootState },
payload: { persons: Person[] } payload: { persons: Person[] },
) { ) {
const persons = payload.persons.map((person: Person) => ({id: person.id, type: person.type})); const persons = payload.persons.map((person: Person) => ({
id: person.id,
type: person.type,
}));
try { try {
const result: Ticket = await makeFetch( const result: Ticket = await makeFetch(
"POST", "POST",
@ -28,5 +29,5 @@ export const modulePersons: Module<State, RootState> = {
throw e.name; throw e.name;
} }
}, },
} },
} };

View File

@ -5,7 +5,7 @@ import { Ticket } from "../../../../types";
export interface State { export interface State {
ticket: Ticket; ticket: Ticket;
action_icons: Object; action_icons: object;
} }
export const moduleTicket: Module<State, RootState> = { export const moduleTicket: Module<State, RootState> = {
@ -26,7 +26,7 @@ export const moduleTicket: Module<State, RootState> = {
getters: { getters: {
getTicket(state) { getTicket(state) {
state.ticket.history = state.ticket.history.sort((a, b) => state.ticket.history = state.ticket.history.sort((a, b) =>
b.at.datetime.localeCompare(a.at.datetime) b.at.datetime.localeCompare(a.at.datetime),
); );
return state.ticket; return state.ticket;
}, },
@ -39,9 +39,11 @@ export const moduleTicket: Module<State, RootState> = {
(result, item) => { (result, item) => {
const { datetime } = item.at; const { datetime } = item.at;
if ( if (
!["add_addressee", "remove_addressee", "add_person"].includes( ![
item.event_type "add_addressee",
) "remove_addressee",
"add_person",
].includes(item.event_type)
) { ) {
result[datetime] = item; result[datetime] = item;
return result; return result;
@ -57,9 +59,9 @@ export const moduleTicket: Module<State, RootState> = {
*/ */
return result; return result;
}, },
{} as any {} as any,
); );
return Object.values(addresseeHistory) as Array<Ticket["history"]>; return Object.values(addresseeHistory) as Ticket["history"][];
}, },
}, },
mutations: { mutations: {