Merge pull request #82 from dderbentsov/add_window_create_event

Добавил окно создания события
This commit is contained in:
frontgavrilin
2022-10-28 19:03:13 +03:00
committed by GitHub
3 changed files with 76 additions and 59 deletions

View File

@@ -1,6 +1,8 @@
<template lang="pug"> <template lang="pug">
.calendar-container.flex .calendar-container.flex
calendar-sidebar(@width="changeWidth" :team-data="teamData") calendar-sidebar(@width="changeWidth"
:team-data="teamData"
:open-form-create="openFormCreateEvent")
calendar-schedule( calendar-schedule(
:current-date="currentDate" :current-date="currentDate"
:time-information="timeInformation" :time-information="timeInformation"
@@ -10,15 +12,21 @@
@next-date="switchNextDate" @next-date="switchNextDate"
@selected-layout="changeCalendarLayout" @selected-layout="changeCalendarLayout"
) )
calendar-form-add-event(v-if="isOpenForm" :close-form="closeFormCreateEvent")
</template> </template>
<script> <script>
import * as moment from "moment/moment"; import * as moment from "moment/moment";
import CalendarSchedule from "./components/CalendarSchedule.vue"; import CalendarSchedule from "./components/CalendarSchedule.vue";
import CalendarSidebar from "./components/CalendarSidebar.vue"; import CalendarSidebar from "./components/CalendarSidebar.vue";
import CalendarFormAddEvent from "./components/CalendarFormAddEvent.vue";
export default { export default {
name: "TheCalendar", name: "TheCalendar",
components: { CalendarSchedule, CalendarSidebar }, components: {
CalendarSchedule,
CalendarSidebar,
CalendarFormAddEvent,
},
data() { data() {
return { return {
sidebarWidth: "72px", sidebarWidth: "72px",
@@ -30,6 +38,7 @@ export default {
}, },
eventsData: [], eventsData: [],
teamData: [], teamData: [],
isOpenForm: false,
}; };
}, },
methods: { methods: {
@@ -59,6 +68,13 @@ export default {
changeWidth(value) { changeWidth(value) {
this.sidebarWidth = value; this.sidebarWidth = value;
}, },
openFormCreateEvent() {
this.isOpenForm = true;
},
closeFormCreateEvent() {
this.isOpenForm = false;
},
}, },
mounted() { mounted() {
this.fetchEventsData(); this.fetchEventsData();

View File

@@ -1,17 +1,14 @@
<template lang="pug"> <template lang="pug">
.flex.flex-col.gap-y-6.pt-5.pb-6.px-8.event-form(v-if="formOpen" ) .flex.flex-col.gap-y-6.pt-6.pb-7.px-8.event-form.absolute.right-2.bottom-14
.flex.flex-col.gap-y-2 .flex.flex-col.gap-y-2
.flex.justify-between.pt-2 .flex.justify-between.pt-2
span.not-italic.text-xs.opacity-40.leading-3 Ответственный span.not-italic.text-xs.opacity-40.leading-3 Ответственный
.icon-cancel.close-icon.text-xs.cursor-pointer(@click="closeEventForm") .icon-cancel.close-icon.text-xs.cursor-pointer(@click="closeForm")
base-select( base-select.ba-sel(
id="responsible"
width="205px" width="205px"
:option-data="eventData.responsible" :option-data="eventData.responsible"
:list-data="listResponsible" :list-data="listResponsible"
:choose-option="chooseOption" :choose-option="chooseOptionResponsible"
:is-open="selectResponsibleOpen"
:select-open="openSelectResponsible"
) )
.flex.flex-col.gap-y-2 .flex.flex-col.gap-y-2
span.not-italic.text-xs.opacity-40.leading-3 Основная информация span.not-italic.text-xs.opacity-40.leading-3 Основная информация
@@ -19,61 +16,71 @@
.icon-time.text-xl.icon .icon-time.text-xl.icon
.flex.gap-x-2.items-center .flex.gap-x-2.items-center
.form-item.flex.gap-x-2.px-4.py-2.items-center .form-item.flex.gap-x-2.px-4.py-2.items-center
input.item-input.no-italic.text-base.cursor-pointer(v-model="eventData.timeEvent.firstTime" type="time" min="08:00" max="18:00") input.item-input.no-italic.text-base.cursor-text(v-model="eventData.timeEvent.firstTime" type="time" min="08:00" max="18:00")
span span
.form-item.flex.gap-x-2.px-4.py-2.items-center .form-item.flex.gap-x-2.px-4.py-2.items-center
input.item-input.no-italic.text-base.cursor-pointer(v-model="eventData.timeEvent.secondTime" type="time" min="08:00" max="18:00") input.item-input.no-italic.text-base.cursor-text(v-model="eventData.timeEvent.secondTime" type="time" min="08:00" max="18:00")
.flex.gap-x-4.items-center .flex.gap-x-4.items-center
.icon-person.text-xl.icon .icon-person.text-xl.icon
.form-item.cursor-pointer.flex.gap-x-2.px-4.py-2.items-center .form-item.cursor-pointer.flex.gap-x-2.px-4.py-2.items-center
input.item-input.cursor-pointer.no-italic.text-base(v-model="eventData.eventClient" type="text" placeholder="ФИО клиента") input.item-input.cursor-text.no-italic.text-base(v-model="eventData.eventClient" type="text" placeholder="ФИО клиента")
.flex.flex-col.gap-y-2(class='additional-information') //- .flex.flex-col.gap-y-2(class='additional-information')
.flex.gap-x-4.items-center //- .flex.gap-x-4.items-center
span.not-italic.text-xs.opacity-40.leading-3 Дополнительная информация //- span.not-italic.text-xs.opacity-40.leading-3 Дополнительная информация
button-plus(id="addInfo" @click="(e)=>addFriendInfo(e)") //- button-plus(id="addInfo" @click="(e)=>addFriendInfo(e)")
.flex.gap-x-4.items-center(v-for="(info, index) in listFriendInfo" :key="index") //- base-button(
span.ml-1 {{info}} left-icon="icon-plus"
.form-item.cursor-pointer.flex.gap-x-2.px-4.py-2.items-center rounded secondary
input.item-input.cursor-pointer.no-italic.text-base(v-model="eventData.friendInfo[info]" type="text" placeholder="Что-то важное") :size="24"
:icon-left-size="10"
id="addInfo"
@click="(e)=>addFriendInfo(e)")
//- .flex.gap-x-4.items-center(v-for="(info, index) in listFriendInfo" :key="index")
//- span.ml-1 {{info}}
//- .form-item.cursor-pointer.flex.gap-x-2.px-4.py-2.items-center
//- input.item-input.cursor-pointer.no-italic.text-base(v-model="eventData.friendInfo[info]" type="text" placeholder="Что-то важное")
.flex.flex-col.gap-y-2 .flex.flex-col.gap-y-2
span.not-italic.text-xs.opacity-40.leading-3 Вид события span.not-italic.text-xs.opacity-40.leading-3 Вид события
base-select( base-select(
id="kind"
width="118px" width="118px"
:option-data="eventData.kindEvent" :option-data="eventData.kindEvent"
:list-data="kindEvents" :list-data="kindEvents"
:choose-option="chooseOption" :choose-option="chooseOptionTypeEvent"
:is-open="selectKindEventOpen"
:select-open="openSelectKindEvent"
) )
.flex.flex-col.gap-y-2 .flex.flex-col.gap-y-2
.flex.gap-x-4.items-center .flex.gap-x-4.items-center
span.not-italic.text-xs.opacity-40.leading-3 Контакты span.not-italic.text-xs.opacity-40.leading-3 Контакты
button-plus(id="addContact" @click="(e)=>addFriendInfo(e)") base-button(
left-icon="icon-plus"
rounded secondary
:size="24"
:icon-left-size="10"
id="addContact"
@click="(e)=>addFriendInfo(e)")
.flex.gap-x-4.items-center(v-for="(contact, index) in listContacts" :key="index") .flex.gap-x-4.items-center(v-for="(contact, index) in listContacts" :key="index")
.icon-mail.text-xl.icon .icon-mail.text-xl.icon
.form-item.cursor-pointer.flex.gap-x-2.px-4.py-2.items-center .form-item.cursor-pointer.flex.gap-x-2.px-4.py-2.items-center
input.item-input.cursor-pointer.no-italic.text-base(v-model="eventData.contacts[contact]" type="text" placeholder="E-mail") input.item-input.cursor-text.no-italic.text-base(v-model="eventData.contacts[contact]" type="text" placeholder="E-mail")
add-event-button(@click="createEvent") base-button.styled-button.not-italic.text-base.font-semibold(
:size="40"
@click="closeForm"
) Создать событие
</template> </template>
<script> <script>
import BaseSelect from "@/components/base/BaseSelect"; import BaseSelect from "@/components/base/BaseSelect";
import AddEventButton from "@/components/base/buttons/BaseCreateButton"; import BaseButton from "@/components/base/BaseButton";
import ButtonPlus from "@/components/base/buttons/BaseButtonPlus";
export default { export default {
name: "FormChangeEvent", name: "FormChangeEvent",
components: { AddEventButton, ButtonPlus, BaseSelect }, components: { BaseSelect, BaseButton },
props: { props: {
closeForm: Function,
listResponsible: { listResponsible: {
default: ["Захарова А.О.", "Коломойцев И.К.", "Ситников А.Г."], default: ["Захарова А.О.", "Коломойцев И.К.", "Ситников А.Г."],
}, },
}, },
data() { data() {
return { return {
formOpen: true,
selectResponsibleOpen: false,
selectKindEventOpen: false,
listFriendInfo: [1], listFriendInfo: [1],
listContacts: [1], listContacts: [1],
kindEvents: ["Встреча", "Планерка", "Интервью", "Важная работа"], kindEvents: ["Встреча", "Планерка", "Интервью", "Важная работа"],
@@ -84,15 +91,18 @@ export default {
firstTime: "11:00", firstTime: "11:00",
secondTime: "12:30", secondTime: "12:30",
}, },
friendInfo: {}, // friendInfo: {},
kindEvent: "Вид события", kindEvent: "Вид события",
contacts: {}, contacts: {},
}, },
}; };
}, },
methods: { methods: {
createEvent() { chooseOptionResponsible(e) {
this.formOpen = !this.formOpen; this.eventData.responsible = e.target.id;
},
chooseOptionTypeEvent(e) {
this.eventData.kindEvent = e.target.id;
}, },
addFriendInfo(e) { addFriendInfo(e) {
if (e.currentTarget.id === "addInfo") { if (e.currentTarget.id === "addInfo") {
@@ -106,34 +116,20 @@ export default {
); );
} }
}, },
closeEventForm() {
this.formOpen = !this.formOpen;
},
openSelectResponsible() {
this.selectResponsibleOpen = !this.selectResponsibleOpen;
},
openSelectKindEvent() {
this.selectKindEventOpen = !this.selectKindEventOpen;
},
chooseOption(event) {
if (event.currentTarget.id === "responsible") {
this.eventData.responsible = this.listResponsible[event.target.id];
}
if (event.currentTarget.id === "kind") {
this.eventData.kindEvent = this.kindEvents[event.target.id];
}
},
}, },
}; };
</script> </script>
<style lang="sass" scoped> <style lang="sass" scoped>
.ba-sel
color: red
.event-form .event-form
height: fit-content height: fit-content
min-width: 448px min-width: 448px
background-color: var(--default-white) background-color: var(--default-white)
box-shadow: -4px -4px 16px rgba(9, 10, 21, 0.25), 4px 4px 16px rgba(9, 10, 21, 0.25) box-shadow: -4px -4px 16px rgba(9, 10, 21, 0.25), 4px 4px 16px rgba(9, 10, 21, 0.25)
border-radius: 4px border-radius: 4px
z-index: 5
.form-item .form-item
border-radius: 4px border-radius: 4px
@@ -161,4 +157,6 @@ export default {
color: var(--font-dark-blue-color) color: var(--font-dark-blue-color)
&:hover &:hover
color: var(--btn-blue-color) color: var(--btn-blue-color)
.styled-button
width: 183px
</style> </style>

View File

@@ -2,7 +2,7 @@
.sidebar.flex.flex-col.bg-white(:class="openSidebar") .sidebar.flex.flex-col.bg-white(:class="openSidebar")
.sidebar-wrapper.h-full.my-13px.flex.flex-col.justify-between(:style="sidebarWidth") .sidebar-wrapper.h-full.my-13px.flex.flex-col.justify-between(:style="sidebarWidth")
.sidebar-content.items-center.flex.flex-col.gap-y-8.px-4.py-19px(v-if="!isOpen") .sidebar-content.items-center.flex.flex-col.gap-y-8.px-4.py-19px(v-if="!isOpen")
base-button(left-icon="icon-plus", rounded, :size="40", :icon-left-size="10" ) base-button(left-icon="icon-plus", rounded, :size="40", :icon-left-size="10" @click="openFormCreate" )
.flex.flex-col.items-center(v-if="!isOpen") .flex.flex-col.items-center(v-if="!isOpen")
base-button(left-icon="icon-plus", rounded, :size="24", :icon-left-size="10", secondary ) base-button(left-icon="icon-plus", rounded, :size="24", :icon-left-size="10", secondary )
.flex.flex-col.gap-y-2.items-center.mt-4 .flex.flex-col.gap-y-2.items-center.mt-4
@@ -11,11 +11,10 @@
.flex.flex-col.items-center.gap-y-2.justify-center .flex.flex-col.items-center.gap-y-2.justify-center
base-button.mb-2(left-icon="icon-plus", rounded, :size="24", :icon-left-size="10", secondary ) base-button.mb-2(left-icon="icon-plus", rounded, :size="24", :icon-left-size="10", secondary )
.team-card(v-for="teammate in teamData" :key="teammate.id") .team-card(v-for="teammate in teamData" :key="teammate.id")
img.avatar-wrapper(:src="avatar" alt="Team member") BaseAvatar(:size="32")
img(:src="avatar" alt="Team member")
.sidebar-content.items-center.flex.flex-col.gap-y-8.px-4.py-19px(v-else) .sidebar-content.items-center.flex.flex-col.gap-y-8.px-4.py-19px(v-else)
.create-event.flex.items-center.justify-center base-button(right-icon="icon-plus", split, :size="40", :icon-right-size="10", @click="openFormCreate" ) Создать событие
base-button(right-icon="icon-plus", split, :size="40", :icon-right-size="10" ) Создать событие
.flex.items-center.flex-col.gap-y-4 .flex.items-center.flex-col.gap-y-4
.events-wrapper.flex.items-center.justify-between .events-wrapper.flex.items-center.justify-between
.flex {{ "Виды событий" }} .flex {{ "Виды событий" }}
@@ -36,7 +35,8 @@
v-for="teammate in teamData" v-for="teammate in teamData"
:key="teammate.id") :key="teammate.id")
.flex.items-center .flex.items-center
img.avatar-wrapper(:src="avatar" alt="Team member") BaseAvatar(:size="32")
img(:src="avatar" alt="Team member")
.flex.ml-2.not-italic.font-medium.text-xxs {{ changeName(teammate.last_name, teammate.first_name, teammate.patronymic) }} .flex.ml-2.not-italic.font-medium.text-xxs {{ changeName(teammate.last_name, teammate.first_name, teammate.patronymic) }}
span.icon-change-place.cursor-pointer.w-5.flex.items-center.justify-center.w-6.h-6 span.icon-change-place.cursor-pointer.w-5.flex.items-center.justify-center.w-6.h-6
.button-wrapper.flex.justify-center.mb-23px .button-wrapper.flex.justify-center.mb-23px
@@ -49,6 +49,7 @@ import BaseOpenButton from "../../../components/base/buttons/BaseOpenButton.vue"
import BaseCreateButton from "../../../components/base/buttons/BaseCreateButton.vue"; import BaseCreateButton from "../../../components/base/buttons/BaseCreateButton.vue";
import img from "../../../assets/images/team-member.svg"; import img from "../../../assets/images/team-member.svg";
import BaseButton from "@/components/base/BaseButton"; import BaseButton from "@/components/base/BaseButton";
import BaseAvatar from "@/components/base/BaseAvatar";
export default { export default {
name: "CalendarSidebar", name: "CalendarSidebar",
@@ -57,9 +58,11 @@ export default {
BaseButtonPlus, BaseButtonPlus,
BaseOpenButton, BaseOpenButton,
BaseCreateButton, BaseCreateButton,
BaseAvatar,
}, },
props: { props: {
teamData: Array, teamData: Array,
openFormCreate: Function,
}, },
data() { data() {
return { return {