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

View File

@ -38,7 +38,7 @@ export default defineComponent({
const ticket = computed(() => store.getters.getTicket as Ticket);
const ticketHistory = computed(
() => store.getters.getDistinctAddressesHistory
() => store.getters.getDistinctAddressesHistory,
);
onMounted(async () => {

View File

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

View File

@ -1,29 +1,33 @@
<template>
<div class="col-12">
<span
v-for="userGroup in userGroupLevels"
:key="userGroup.id"
class="badge-user-group"
:style="`background-color: ${userGroup.backgroundColor}; color: ${userGroup.foregroundColor};`"
>
{{ userGroup.label.fr }}
</span>
</div>
<div class="col-12">
<span
v-for="userGroup in userGroups"
:key="userGroup.id"
class="badge-user-group"
:style="`background-color: ${userGroup.backgroundColor}; color: ${userGroup.foregroundColor};`"
>
{{ userGroup.label.fr }}
</span>
</div>
<div v-if="users.length > 0" class="col-12">
<span class="badge-user">
<user-render-box-badge v-for="user in users" :key="user.id" :user="user"></user-render-box-badge>
</span>
</div>
<div class="col-12">
<span
v-for="userGroup in userGroupLevels"
:key="userGroup.id"
class="badge-user-group"
:style="`background-color: ${userGroup.backgroundColor}; color: ${userGroup.foregroundColor};`"
>
{{ userGroup.label.fr }}
</span>
</div>
<div class="col-12">
<span
v-for="userGroup in userGroups"
:key="userGroup.id"
class="badge-user-group"
:style="`background-color: ${userGroup.backgroundColor}; color: ${userGroup.foregroundColor};`"
>
{{ userGroup.label.fr }}
</span>
</div>
<div v-if="users.length > 0" class="col-12">
<span class="badge-user">
<user-render-box-badge
v-for="user in users"
:key="user.id"
:user="user"
></user-render-box-badge>
</span>
</div>
</template>
<script lang="ts">
@ -39,7 +43,7 @@ import UserRenderBoxBadge from "ChillMainAssets/vuejs/_components/Entity/UserRen
export default defineComponent({
name: "AddresseeComponent",
components: {UserRenderBoxBadge},
components: { UserRenderBoxBadge },
props: {
addressees: {
type: Array as PropType<UserGroupOrUser[]>,
@ -52,22 +56,22 @@ export default defineComponent({
props.addressees.filter(
(addressee) =>
addressee.type == "user_group" &&
addressee.excludeKey == ""
) as UserGroup[]
addressee.excludeKey == "",
) as UserGroup[],
);
const userGroupLevels = computed(
() =>
props.addressees.filter(
(addressee) =>
addressee.type == "user_group" &&
addressee.excludeKey == "level"
) as UserGroup[]
addressee.excludeKey == "level",
) as UserGroup[],
);
const users = computed(
() =>
props.addressees.filter(
(addressee) => addressee.type == "user"
) as User[]
(addressee) => addressee.type == "user",
) as User[],
);
return { userGroups, users, userGroupLevels };
},

View File

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

View File

@ -14,7 +14,10 @@
<div class="col-md-6 col-sm-12">
<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") }}
</span>
</div>
@ -38,7 +41,15 @@
<h3 class="text-primary">
{{ $t("banner.concerned_patient") }}
</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 class="col-md-6 col-sm-12">
<h3 class="text-primary">{{ $t("banner.speaker") }}</h3>
@ -68,7 +79,7 @@ import AddresseeComponent from "./AddresseeComponent.vue";
// Types
import { Ticket } from "../../../types";
import {ISOToDatetime} from "../../../../../../../ChillMainBundle/Resources/public/chill/js/date";
import { ISOToDatetime } from "../../../../../../../ChillMainBundle/Resources/public/chill/js/date";
import OnTheFly from "ChillMainAssets/vuejs/OnTheFly/components/OnTheFly.vue";
export default defineComponent({
@ -106,15 +117,15 @@ export default defineComponent({
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)
(timeDiff % (1000 * 3600 * 24)) / (1000 * 3600),
);
const minutesDiff = Math.floor(
(timeDiff % (1000 * 3600)) / (1000 * 60)
(timeDiff % (1000 * 3600)) / (1000 * 60),
);
const secondsDiff = Math.floor((timeDiff % (1000 * 60)) / 1000);
if (daysDiff < 1 && hoursDiff < 1 && minutesDiff < 1) {
return `${t("banner.seconds", {count: secondsDiff})}`;
return `${t("banner.seconds", { count: secondsDiff })}`;
} else if (daysDiff < 1 && hoursDiff < 1) {
return `${t("banner.minutes", { count: minutesDiff })}`;
} else if (daysDiff < 1) {
@ -125,7 +136,7 @@ export default defineComponent({
"banner.hours",
{
count: hoursDiff,
}
},
)} ${t("banner.minutes", {
count: minutesDiff,
})}`;

View File

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

View File

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

View File

@ -7,7 +7,9 @@
<div class="card-header">
<div class="history-header">
<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>
</div>
<div>
@ -17,7 +19,9 @@
</div>
<div>
<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>
</div>
</div>
@ -42,18 +46,18 @@
<ticket-history-create-component
:by="history_line.by"
v-else-if="history_line.event_type == 'create_ticket'"
/>
/>
</div>
</div>
</template>
<script lang="ts">
import {PropType, defineComponent, ref, computed} from "vue";
import { PropType, defineComponent, ref, computed } from "vue";
import { useStore } from "vuex";
// Types
import { DateTime } from "../../../../../../../ChillMainBundle/Resources/public/types";
import {TicketHistoryLine} from "../../../types";
import { TicketHistoryLine } from "../../../types";
// Components
import TicketHistoryPersonComponent from "./TicketHistoryPersonComponent.vue";
@ -62,7 +66,7 @@ import TicketHistoryCommentComponent from "./TicketHistoryCommentComponent.vue";
import TicketHistoryAddresseeComponent from "./TicketHistoryAddresseeComponent.vue";
import TicketHistoryCreateComponent from "./TicketHistoryCreateComponent.vue";
import UserRenderBoxBadge from "ChillMainAssets/vuejs/_components/Entity/UserRenderBoxBadge.vue";
import {ISOToDatetime} from "../../../../../../../ChillMainBundle/Resources/public/chill/js/date";
import { ISOToDatetime } from "../../../../../../../ChillMainBundle/Resources/public/chill/js/date";
export default defineComponent({
name: "TicketHistoryListComponent",
@ -96,8 +100,8 @@ export default defineComponent({
return "Nouveau motifs";
case "create_ticket":
return "Ticket créé";
}
};
}
};
function formatDate(d: DateTime): string {
const date = ISOToDatetime(d.datetime);
@ -110,7 +114,11 @@ export default defineComponent({
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>

View File

@ -2,7 +2,13 @@
<div class="col-12">
<ul class="persons-list">
<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>
</ul>
</div>
@ -12,7 +18,7 @@
import { PropType, defineComponent } from "vue";
// Type
import {PersonsState} from "../../../types";
import { PersonsState } from "../../../types";
import OnTheFly from "ChillMainAssets/vuejs/OnTheFly/components/OnTheFly.vue";
export default defineComponent({

View File

@ -1,28 +1,32 @@
<template>
<div class="d-flex justify-content-end">
<div class="btn-group" @click="handleClick">
<button type="button" 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 }}
<span class="visually-hidden">Tickets</span>
</span>
</button>
<button
type="button"
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 }}
<span class="visually-hidden">Tickets</span>
</span>
</button>
</div>
</div>
</div>
</template>
<script lang="ts">
import { PropType, defineComponent } from 'vue';
import { PropType, defineComponent } from "vue";
// Types
import { Ticket } from '../../../types';
import { Ticket } from "../../../types";
export default defineComponent({
name: 'TicketSelectorComponent',
name: "TicketSelectorComponent",
props: {
tickets: {
type: Object as PropType<Ticket[]>,
@ -31,10 +35,10 @@ export default defineComponent({
},
setup() {
function handleClick() {
alert('Sera disponible plus tard')
alert("Sera disponible plus tard");
}
return { handleClick }
}
return { handleClick };
},
});
</script>

View File

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

View File

@ -3,15 +3,15 @@ import { State as MotiveStates, moduleMotive } from "./modules/motive";
import { State as TicketStates, moduleTicket } from "./modules/ticket";
import { State as CommentStates, moduleComment } from "./modules/comment";
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;
ticket: TicketStates;
comment: CommentStates;
addressee: AddresseeStates;
persons: PersonsState;
};
}
export const store = createStore<RootState>({
modules: {

View File

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

View File

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

View File

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

View File

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

View File

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