256 lines
6.6 KiB
Vue
256 lines
6.6 KiB
Vue
<template lang="pug">
|
||
.calendar-container.flex
|
||
calendar-sidebar(
|
||
:url="url",
|
||
:schedules-data="schedulesData",
|
||
:open-form-create="openFormCreateEvent",
|
||
:event-statuses="eventStatuses",
|
||
@width="changeWidth",
|
||
)
|
||
calendar-schedule(
|
||
:url="url",
|
||
:schedules-data="schedulesData",
|
||
:current-date="currentDate",
|
||
:time-information="timeInformation",
|
||
:events-data="eventsData",
|
||
:sidebar-width="sidebarWidth",
|
||
:event-statuses="eventStatuses",
|
||
:change-form-was-closed="changeFormWasClosed",
|
||
@previous-date="switchPreviousDate",
|
||
@next-date="switchNextDate",
|
||
@selected-layout="changeCalendarLayout",
|
||
@reset-change-form="resetChangeFormState",
|
||
@selected-event="writeEventData",
|
||
@delete-event="openModal",
|
||
:open-form-create-event="openFormCreateEvent"
|
||
)
|
||
transition(name="form")
|
||
calendar-form-add-event(
|
||
v-model="isOpenForm"
|
||
:close-form="closeFormCreateEvent",
|
||
:selected-event-data="selectedEvent",
|
||
:event-statuses="eventStatuses",
|
||
:time-information="timeInformation",
|
||
:current-date="currentDate",
|
||
@clear-selected-event-data="clearSelectedEvent",
|
||
@close-change-form="setChangeFormState"
|
||
)
|
||
base-modal(
|
||
v-model="showModal",
|
||
title="Удаление события"
|
||
)
|
||
calendar-delete-modal(
|
||
:event-statuses="eventStatuses",
|
||
:owner-event="selectedEvent",
|
||
:close-modal="changeShowModal",
|
||
@update-events="fetchEventsData"
|
||
)
|
||
</template>
|
||
|
||
<script>
|
||
//TODO: Вынести emits в массив
|
||
import { fetchWrapper } from "../../shared/fetchWrapper.js";
|
||
import * as moment from "moment/moment";
|
||
import CalendarSchedule from "./components/CalendarSchedule.vue";
|
||
import CalendarSidebar from "./components/CalendarSidebar.vue";
|
||
import CalendarFormAddEvent from "./components/CalendarFormAddEvent.vue";
|
||
import BaseModal from "@/components/base/BaseModal.vue";
|
||
import CalendarDeleteModal from "./components/CalendarDeleteModal.vue";
|
||
export default {
|
||
name: "TheCalendar",
|
||
components: {
|
||
CalendarSchedule,
|
||
CalendarSidebar,
|
||
CalendarFormAddEvent,
|
||
BaseModal,
|
||
CalendarDeleteModal,
|
||
},
|
||
props: {
|
||
url: String,
|
||
},
|
||
data() {
|
||
return {
|
||
sidebarWidth: "72px",
|
||
calendarLayout: "",
|
||
currentDate: moment(),
|
||
selectedEvent: {},
|
||
showModal: false,
|
||
timeInformation: {
|
||
dayStartTime: "08:00",
|
||
dayEndTime: "22:00",
|
||
},
|
||
eventsData: [],
|
||
schedulesData: [],
|
||
isOpenForm: false,
|
||
WORKING_STATUS: "WORKS",
|
||
changeFormWasClosed: false,
|
||
//TODO: Вынести eventStatuses в config
|
||
eventStatuses: [
|
||
{
|
||
id: 0,
|
||
label: "Планируется прием",
|
||
value: "PLANNED",
|
||
color: "var(--default-white)",
|
||
},
|
||
{
|
||
id: 1,
|
||
label: "Отменил",
|
||
value: "CANCELED",
|
||
color: "var(--bg-event-grey-color)",
|
||
},
|
||
{
|
||
id: 2,
|
||
label: "Ожидается прием",
|
||
value: "EXPECTED",
|
||
color: "var(--bg-event-yellow-color)",
|
||
},
|
||
{
|
||
id: 3,
|
||
label: "Опаздывает",
|
||
value: "LATE",
|
||
color: "var(--bg-event-orange-color)",
|
||
},
|
||
{
|
||
id: 4,
|
||
label: "Идет прием",
|
||
value: "RECEPTION",
|
||
color: "var(--bg-event-blue-color)",
|
||
},
|
||
{
|
||
id: 5,
|
||
label: "Прием завершен",
|
||
value: "COMPLETED",
|
||
color: "var(--bg-event-green-color)",
|
||
},
|
||
{
|
||
id: 6,
|
||
label: "Не пришел",
|
||
value: "DID_NOT_COME",
|
||
color: "var(--bg-event-red-color)",
|
||
},
|
||
],
|
||
};
|
||
},
|
||
methods: {
|
||
switchPreviousDate() {
|
||
this.currentDate = this.currentDate.clone().subtract(1, "day");
|
||
},
|
||
switchNextDate() {
|
||
this.currentDate = this.currentDate.clone().add(1, "day");
|
||
},
|
||
changeCalendarLayout(option) {
|
||
this.calendarLayout = option;
|
||
},
|
||
saveEventsData(res) {
|
||
this.eventsData = res.results;
|
||
},
|
||
saveSchedulesData(res) {
|
||
if (res.results.length === 0) {
|
||
this.schedulesData = [];
|
||
return;
|
||
}
|
||
let filteredEmployees = res.results.filter(
|
||
(elem) => elem.status === this.WORKING_STATUS
|
||
);
|
||
if (filteredEmployees.length === 0) {
|
||
this.schedulesData = [];
|
||
return;
|
||
}
|
||
this.schedulesData = filteredEmployees;
|
||
},
|
||
fetchSchedulesData() {
|
||
fetchWrapper
|
||
.get(
|
||
`accounts/schedules/?date_after=${this.currentDate.format(
|
||
"YYYY-MM-DD"
|
||
)}&date_before=${this.currentDate.format("YYYY-MM-DD")}`
|
||
)
|
||
.then((res) => this.saveSchedulesData(res));
|
||
},
|
||
fetchEventsData() {
|
||
fetchWrapper
|
||
.get(
|
||
`registry/event/?limit=100&start=${this.currentDate.format(
|
||
"YYYY-MM-DD"
|
||
)}T${
|
||
this.timeInformation.dayStartTime
|
||
}:00Z&end=${this.currentDate.format("YYYY-MM-DD")}T${
|
||
this.timeInformation.dayEndTime
|
||
}:00Z`
|
||
)
|
||
.then((res) => this.saveEventsData(res));
|
||
},
|
||
changeWidth(value) {
|
||
this.sidebarWidth = value;
|
||
},
|
||
openFormCreateEvent() {
|
||
this.isOpenForm = true;
|
||
},
|
||
closeFormCreateEvent() {
|
||
this.isOpenForm = false;
|
||
this.fetchEventsData();
|
||
},
|
||
setChangeFormState() {
|
||
this.changeFormWasClosed = true;
|
||
},
|
||
resetChangeFormState() {
|
||
this.changeFormWasClosed = false;
|
||
},
|
||
writeEventData(eventData) {
|
||
this.selectedEvent = eventData;
|
||
this.openFormCreateEvent();
|
||
},
|
||
clearSelectedEvent() {
|
||
this.selectedEvent = {};
|
||
},
|
||
openModal(eventData) {
|
||
this.selectedEvent = eventData;
|
||
this.showModal = true;
|
||
},
|
||
changeShowModal() {
|
||
this.showModal = false;
|
||
},
|
||
},
|
||
watch: {
|
||
showModal: function () {
|
||
if (this.showModal === false) {
|
||
this.setChangeFormState();
|
||
this.clearSelectedEvent();
|
||
}
|
||
},
|
||
currentDate() {
|
||
this.fetchSchedulesData();
|
||
this.fetchEventsData();
|
||
},
|
||
},
|
||
mounted() {
|
||
this.fetchSchedulesData();
|
||
this.fetchEventsData();
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style lang="sass" scoped>
|
||
.calendar-container
|
||
width: calc(100vw - 80px)
|
||
|
||
.form-enter-from
|
||
opacity: 0
|
||
transform: translateY(300px)
|
||
pointer-events: none
|
||
|
||
.form-enter-active
|
||
transition: 0.5s ease
|
||
|
||
.form-leave-to
|
||
opacity: 0
|
||
transform: translateY(300px)
|
||
pointer-events: none
|
||
|
||
.form-leave-active
|
||
transition: 0.5s ease
|
||
|
||
.form-move
|
||
transition: 0.5s ease
|
||
</style>
|