mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-14 14:24:24 +00:00
Generalize ticket actions
This commit is contained in:
parent
c73c1eb8d5
commit
a20f9b4f86
@ -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
|
||||||
);
|
);
|
||||||
|
@ -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,
|
||||||
|
@ -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"
|
||||||
|
@ -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 };
|
||||||
},
|
},
|
||||||
|
@ -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");
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -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>
|
||||||
|
@ -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");
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -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>
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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() {},
|
||||||
});
|
});
|
||||||
|
@ -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",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -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,
|
||||||
|
},
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
@ -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) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user