Merge branch 'master' into UC-54

This commit is contained in:
frontgavrilin
2022-11-10 19:31:51 +03:00
committed by GitHub
20 changed files with 12842 additions and 80 deletions

12437
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -25,9 +25,19 @@
--font-obligatory-color: #ff0000 --font-obligatory-color: #ff0000
--bg-event-box-color: rgba(37, 40, 80, 0.1) --bg-event-box-color: rgba(37, 40, 80, 0.1)
--bg-event-green-color: #24d07d --bg-event-green-color: #24d07d
--bg-event-green-color-0: #cdf0e5
--bg-event-green-color-1: #92e8be
--bg-event-red-color: #e93131 --bg-event-red-color: #e93131
--bg-event-red-color-0: #f8c1c1
--bg-event-red-color-1: #f49898
--bg-event-yellow-color: #e5e931 --bg-event-yellow-color: #e5e931
--bg-event-yellow-color-0: #f8f9c2
--bg-event-yellow-color-1: #f2f498
--bg-event-blue-color: #3ba3ee --bg-event-blue-color: #3ba3ee
--bg-event-blue-color-0: #c5e4fa
--bg-event-blue-color-1: #93cdf6
--bg-event-default-hover-color: #d9e1f9
--border-event-default-color: #b3c3f3
--light-grey-bg-color: #f8f9fa --light-grey-bg-color: #f8f9fa
--btn-green-color: rgba(60, 217, 75, 1) --btn-green-color: rgba(60, 217, 75, 1)
--btn-light-green-color: rgba(60, 217, 75, 0.2) --btn-light-green-color: rgba(60, 217, 75, 0.2)

View File

@@ -1,9 +1,15 @@
<template lang="pug"> <template lang="pug">
.flex.flex-col.w-full.h-full.gap-y-2 .flex.flex-col.w-full.h-full.gap-y-2
the-header the-header(
:is-open-page-form="isOpenPageForm",
@is-open-header-form="changeHeaderFormState"
)
.flex.flex-auto .flex.flex-auto
the-sidebar the-sidebar
router-view router-view(
:is-open-header-form="isOpenHeaderForm",
@is-open-page-form="changePageFormState",
)
</template> </template>
<script> <script>
@@ -13,5 +19,19 @@ import TheSidebar from "@/components/TheSidebar";
export default { export default {
name: "LoggedInLayout", name: "LoggedInLayout",
components: { TheHeader, TheSidebar }, components: { TheHeader, TheSidebar },
data() {
return {
isOpenPageForm: false,
isOpenHeaderForm: false,
};
},
methods: {
changePageFormState(value) {
this.isOpenPageForm = value;
},
changeHeaderFormState(value) {
this.isOpenHeaderForm = value;
},
},
}; };
</script> </script>

View File

@@ -1,6 +1,6 @@
<template lang="pug"> <template lang="pug">
.header-wrapper.relative.flex.justify-center.box-border.py-2.pl-4_75px.pr-6 .header-wrapper.relative.flex.justify-center.box-border.py-2.pl-4_75px.pr-6
base-client-form-create.right-6(v-if="isOpenCreate", @blure="isOpenCreate=false", :close-form="closeFormCreate") base-client-form-create.right-0.top-16(v-if="isOpenCreate", @blure="isOpenCreate=false", :close-form="closeFormCreate")
.flex.items-center.box-border.cursor-pointer.mr-auto .flex.items-center.box-border.cursor-pointer.mr-auto
img.logo-img.mr-29_25px(src="@/assets/images/logo.svg", alt="Logo") img.logo-img.mr-29_25px(src="@/assets/images/logo.svg", alt="Logo")
header-inputs header-inputs
@@ -13,7 +13,7 @@
:size="40", :size="40",
right-icon="icon-person", right-icon="icon-person",
:icon-right-size="18", :icon-right-size="18",
@click="isOpenCreate=true" @click="changeFormState"
) )
button.header-buttons.flex.justify-center.items-center.mr-8.p-0(@click="logout") button.header-buttons.flex.justify-center.items-center.mr-8.p-0(@click="logout")
.icon-bell.text-xxl .icon-bell.text-xxl
@@ -34,6 +34,12 @@ import BaseClientFormCreate from "@/components/base/BaseClientFormCreate";
export default { export default {
name: "TheHeader", name: "TheHeader",
components: { HeaderInputs, BaseAvatar, BaseButton, BaseClientFormCreate }, components: { HeaderInputs, BaseAvatar, BaseButton, BaseClientFormCreate },
props: {
isOpenPageForm: {
type: Boolean,
default: false,
},
},
data() { data() {
return { return {
avatarSrc: img, avatarSrc: img,
@@ -47,11 +53,16 @@ export default {
methods: { methods: {
closeFormCreate() { closeFormCreate() {
this.isOpenCreate = false; this.isOpenCreate = false;
this.$emit("is-open-header-form", this.isOpenCreate);
}, },
logout() { logout() {
localStorage.clear(); localStorage.clear();
this.$router.push("/login"); this.$router.push("/login");
}, },
changeFormState() {
this.isOpenCreate = !this.isOpenPageForm;
this.$emit("is-open-header-form", this.isOpenCreate);
},
}, },
}; };
</script> </script>

View File

@@ -4,7 +4,7 @@
@width="changeWidth" @width="changeWidth"
:team-data="employeesData" :team-data="employeesData"
:open-form-create="openFormCreateEvent" :open-form-create="openFormCreateEvent"
:event-type="eventType" :event-types="eventTypes"
) )
calendar-schedule( calendar-schedule(
:owners-data="employeesData" :owners-data="employeesData"
@@ -15,6 +15,7 @@
:sidebar-width="sidebarWidth" :sidebar-width="sidebarWidth"
:close-form-create-event="closeFormCreateEvent" :close-form-create-event="closeFormCreateEvent"
:is-open-form="isOpenForm" :is-open-form="isOpenForm"
:event-types="eventTypes"
@previous-date="switchPreviousDate" @previous-date="switchPreviousDate"
@next-date="switchNextDate" @next-date="switchNextDate"
@selected-layout="changeCalendarLayout" @selected-layout="changeCalendarLayout"
@@ -36,6 +37,12 @@ export default {
CalendarSidebar, CalendarSidebar,
CalendarFormAddEvent, CalendarFormAddEvent,
}, },
props: {
isOpenHeaderForm: {
type: Boolean,
default: false,
},
},
data() { data() {
return { return {
sidebarWidth: "72px", sidebarWidth: "72px",
@@ -49,7 +56,7 @@ export default {
employeesData: [], employeesData: [],
isOpenForm: false, isOpenForm: false,
membersData: [], membersData: [],
eventType: [ eventTypes: [
{ id: 1, label: "Встреча", color: "var(--bg-event-green-color)" }, { id: 1, label: "Встреча", color: "var(--bg-event-green-color)" },
{ id: 2, label: "Планерка", color: "var(--bg-event-red-color)" }, { id: 2, label: "Планерка", color: "var(--bg-event-red-color)" },
{ id: 3, label: "Интервью", color: "var(--bg-event-yellow-color)" }, { id: 3, label: "Интервью", color: "var(--bg-event-yellow-color)" },
@@ -93,16 +100,21 @@ export default {
this.sidebarWidth = value; this.sidebarWidth = value;
}, },
openFormCreateEvent() { openFormCreateEvent() {
this.isOpenForm = true; this.isOpenForm = !this.isOpenHeaderForm;
this.$emit("is-open-page-form", this.isOpenForm);
}, },
closeFormCreateEvent() { closeFormCreateEvent() {
this.isOpenForm = false; this.isOpenForm = false;
this.$emit("is-open-page-form", this.isOpenForm);
}, },
}, },
mounted() { mounted() {
this.fetchPersonsData(); this.fetchPersonsData();
this.fetchEventsData(); this.fetchEventsData();
}, },
beforeUnmount() {
this.closeFormCreateEvent();
},
}; };
</script> </script>

View File

@@ -17,6 +17,7 @@
v-for="event in dayEvents" v-for="event in dayEvents"
:key="event.id" :key="event.id"
:ownerEvent="event" :ownerEvent="event"
:event-types="eventTypes"
:style="eventCardPosition(event.start, event.end)" :style="eventCardPosition(event.start, event.end)"
@selected-event="transmitEventData" @selected-event="transmitEventData"
) )
@@ -38,6 +39,7 @@ export default {
dayEvents: Array, dayEvents: Array,
dayEndTime: Number, dayEndTime: Number,
dayStartTime: Number, dayStartTime: Number,
eventTypes: Array,
}, },
data() { data() {
return { return {

View File

@@ -1,20 +1,52 @@
<template lang="pug"> <template lang="pug">
.wrapper.flex.px-2.my-1.items-start.cursor-pointer(:style="cardHeight", @click="transmitEventData") .wrapper.cursor-pointer.my-1.relative(
.header.flex.justify-between.items-center @click="transmitEventData",
.header-text :style="themeColors",
span.inline-block.align-middle.font-bold.text-base.mr-4 {{ eventTime }} :class="cardTheme"
span.inline-block.align-middle.font-medium.text-base {{ eventMember }} )
.card.flex.px-2(
:class="{'py-6px flex-col': longCard}",
:style="cardHeight"
)
.header.flex.justify-between.items-center(:class="{'items-start': longCard}")
.header-text
span.inline-block.align-middle.font-bold.text-base.mr-4 {{ eventTime }}
span.inline-block.align-middle.font-medium.text-base {{ eventMember }}
.details-count.flex.justify-center.items-center.text-xxs.font-medium(v-if="someDetailsShown") {{ `+${detailsCount}` }}
.body.flex.text-xxs.font-medium(v-if="longCard")
.col.mr-22px
ul
li.mt-2(v-for="elem in descriptionColumns.leftColumn" :key="elem") {{ elem }}
.col
ul
li.mt-2(v-for="elem in descriptionColumns.rightColumn" :key="elem") {{ elem }}
calendar-event-description-card.right-0(
v-if="isActive"
:style="descriptionCardPosition"
:owner-event="this.ownerEvent"
:event-types="this.eventTypes"
)
</template> </template>
<script> <script>
import CalendarEventDescriptionCard from "./CalendarEventDescriptionCard.vue";
export default { export default {
name: "CalendarEventCard", name: "CalendarEventCard",
components: { CalendarEventDescriptionCard },
props: { props: {
ownerEvent: Object, ownerEvent: Object,
eventTypes: {
type: Array,
default() {
return [];
},
},
}, },
data() { data() {
return { return {
pixelsPerHour: 62, pixelsPerHour: 62,
isActive: false,
someDetailsShown: true,
}; };
}, },
computed: { computed: {
@@ -53,6 +85,103 @@ export default {
height: `${this.calculateCardHeight - 8}px`, height: `${this.calculateCardHeight - 8}px`,
}; };
}, },
cardTheme() {
return {
"active-theme": this.isActive,
"default-theme": !this.isActive,
"long-card": this.longCard,
};
},
themeColors() {
switch (this.ownerEvent.kind) {
case this.eventTypes[0].label:
return {
"--bg-color": "var(--bg-event-green-color-0)",
"--bg-active": this.eventTypes[0].color,
"--bg-hover": "var(--bg-event-green-color-1)",
"--font-color": "var(--font-black-color)",
"--font-active-color": "var(--default-white)",
"--count-color": this.eventTypes[0].color,
};
case this.eventTypes[1].label:
return {
"--bg-color": "var(--bg-event-red-color-0)",
"--bg-active": this.eventTypes[1].color,
"--bg-hover": "var(--bg-event-red-color-1)",
"--font-color": "var(--font-black-color)",
"--font-active-color": "var(--default-white)",
"--count-color": this.eventTypes[1].color,
};
case this.eventTypes[2].label:
return {
"--bg-color": "var(--bg-event-yellow-color-0)",
"--bg-active": this.eventTypes[2].color,
"--bg-hover": "var(--bg-event-yellow-color-1)",
"--font-color": "var(--font-black-color)",
"--font-active-color": "var(--font-black-color)",
"--count-color": "var(--font-black-color)",
};
case this.eventTypes[3].label:
return {
"--bg-color": "var(--bg-event-blue-color-0)",
"--bg-active": this.eventTypes[3].color,
"--bg-hover": "var(--bg-event-blue-color-1)",
"--font-color": "var(--font-black-color)",
"--font-active-color": "var(--default-white)",
"--count-color": this.eventTypes[3].color,
};
default:
return {
"--bg-color": "var(--default-white)",
"--bg-active": "var(--btn-blue-color)",
"--bg-hover": "var(--bg-event-default-hover-color)",
"--font-color": "var(--font-black-color)",
"--font-active-color": "var(--default-white)",
"--border-color": "#b3c3f3",
"--border-active-color": "var(--btn-blue-color)",
"--count-color": "var(--btn-blue-color)",
};
}
},
description() {
return this.ownerEvent.description
? this.ownerEvent.description.split(", ")
: [];
},
descriptionColumns() {
let leftCol = [],
rightCol = [],
heightParts = parseInt((this.calculateCardHeight - 8) / 23);
if (this.ownerEvent.description && heightParts > 1) {
let n = heightParts;
for (let i = 0; i < n * 2 - 2; i++) {
if (!this.description[i]) break;
i % 2 === 0
? leftCol.push(this.description[i])
: rightCol.push(this.description[i]);
}
}
return {
leftColumn: leftCol,
rightColumn: rightCol,
};
},
longCard() {
return parseInt((this.calculateCardHeight - 8) / 23) > 1 ? true : false;
},
detailsCount() {
let columnsLength =
this.descriptionColumns.leftColumn.length +
this.descriptionColumns.rightColumn.length,
remainingDetails = this.description.length - columnsLength;
if (!remainingDetails) this.changeDetailsShown();
return remainingDetails;
},
descriptionCardPosition() {
return {
top: `calc(${this.cardHeight.height} + 8px)`,
};
},
}, },
methods: { methods: {
trimTime(time) { trimTime(time) {
@@ -62,22 +191,96 @@ export default {
return `${object.last_name} ${object.first_name} ${object.patronymic}`; return `${object.last_name} ${object.first_name} ${object.patronymic}`;
}, },
transmitEventData() { transmitEventData() {
this.changeTheme();
this.$emit("selected-event", this.ownerEvent); this.$emit("selected-event", this.ownerEvent);
}, },
changeTheme() {
this.isActive = !this.isActive;
},
changeDetailsShown() {
this.someDetailsShown = false;
},
}, },
}; };
</script> </script>
<style lang="sass" scoped> <style lang="sass" scoped>
.wrapper .wrapper
width: calc(100% - 8px)
height: 23px
border-radius: 4px
background-color: var(--bg-event-yellow-color)
color: var(--font-black-color)
position: absolute position: absolute
z-index: 3 z-index: 3
width: calc(100% - 8px)
height: 23px
.default-theme
.card
background-color: var(--bg-color)
border: 2px solid var(--border-color)
border-left: 4px solid var(--bg-active)
.header-text, .body
color: var(--font-color)
.details-count
background-color: var(--bg-active)
color: var(--font-active-color)
li:before
background-color: var(--font-color)
.active-theme
.card
background-color: var(--bg-active)
border: 2px solid var(--border-active-color)
border-left: 4px solid var(--bg-active)
.header-text, .body
color: var(--font-active-color)
.details-count
background-color: var(--default-white)
color: var(--count-color)
li:before
background-color: var(--font-active-color)
.card
border-radius: 4px
min-height: 23px
&:hover
background-color: var(--bg-hover)
border: 2px solid var(--border-color)
border-left: 4px solid var(--bg-active)
&:hover .header-text
color: var(--font-color)
&:hover .details-count
background-color: var(--bg-active)
color: var(--font-active-color)
&:hover .body
color: var(--font-color)
&:hover li:before
background-color: var(--font-color)
.header .header
width: 100% width: 100%
.details-count
width: 24px
height: 16px
border-radius: 16px
.col
max-width: calc(462px/2 - 22px)
ul
list-style-type: none
margin: 0
padding: 0
li
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
li:before
content: ''
display: inline-block
height: 8px
width: 8px
border-radius: 50%
background-color : var(--font-black-color)
margin-right: 4px
</style> </style>

View File

@@ -0,0 +1,27 @@
<template lang="pug">
.wrapper.px-4.pt-14px.pb-4.font-medium
</template>
<script>
export default {
name: "CalendarEventDescriptionCard",
props: {
ownerEvent: Object,
eventTypes: {
type: Array,
default() {
return [];
},
},
},
};
</script>
<style lang="sass" scoped>
.wrapper
width: 426px
background-color: var(--default-white)
border-radius: 4px
color: var(--font-black-color)
box-shadow: var(--default-shadow)
</style>

View File

@@ -1,5 +1,5 @@
<template lang="pug"> <template lang="pug">
.flex.flex-col.gap-y-6.pt-6.pb-7.px-8.event-form.absolute.right-2.bottom-14 .flex.flex-col.gap-y-6.pt-6.pb-7.px-8.event-form.absolute.right-0.bottom-14
.flex.justify-between .flex.justify-between
span.title.text-xl.font-bold {{!selectedEventData.id ? "Назначение события" : "Изменение события"}} span.title.text-xl.font-bold {{!selectedEventData.id ? "Назначение события" : "Изменение события"}}
.flex.pt-2 .flex.pt-2
@@ -114,6 +114,12 @@ export default {
return {}; return {};
}, },
}, },
eventTypes: {
type: Array,
default() {
return [];
},
},
}, },
data() { data() {
return { return {

View File

@@ -9,7 +9,8 @@
@next-date="nextDate" @next-date="nextDate"
@selected-layout="selectedLayout" @selected-layout="selectedLayout"
) )
.schedule-body .schedule-body(@scroll="changeScrollingState", ref="scheduleBody")
.hiding-container.fixed(v-if="isScrolling")
.column-wrapper.flex.ml-20(:style="columnWrapperWidth") .column-wrapper.flex.ml-20(:style="columnWrapperWidth")
calendar-column( calendar-column(
v-for="(owner, index) in filteredOwners" v-for="(owner, index) in filteredOwners"
@@ -19,6 +20,7 @@
:day-start-time="validateStartTime" :day-start-time="validateStartTime"
:day-end-time="validateEndTime" :day-end-time="validateEndTime"
:style="columnSize" :style="columnSize"
:event-types="eventTypes"
@selected-event="writeEventData" @selected-event="writeEventData"
) )
.flex.w-full.relative .flex.w-full.relative
@@ -48,6 +50,7 @@
:owners-data="ownersData" :owners-data="ownersData"
:members-data="membersData" :members-data="membersData"
:selected-event-data="selectedEvent" :selected-event-data="selectedEvent"
:event-types="eventTypes"
@clear-selected-event-data="clearSelectedEvent" @clear-selected-event-data="clearSelectedEvent"
@update-events="transmitUpdateEvents" @update-events="transmitUpdateEvents"
) )
@@ -103,6 +106,12 @@ export default {
}, },
closeFormCreateEvent: Function, closeFormCreateEvent: Function,
isOpenForm: Boolean, isOpenForm: Boolean,
eventTypes: {
type: Array,
default() {
return [];
},
},
}, },
data() { data() {
return { return {
@@ -115,6 +124,7 @@ export default {
columnHeaderHeight: 48, columnHeaderHeight: 48,
defaultColumnWidth: 470, defaultColumnWidth: 470,
selectedEvent: {}, selectedEvent: {},
isScrolling: false,
}; };
}, },
computed: { computed: {
@@ -315,6 +325,17 @@ export default {
transmitUpdateEvents() { transmitUpdateEvents() {
this.$emit("update-events"); this.$emit("update-events");
}, },
changeScrollingState(e) {
this.isScrolling = e.target.scrollTop !== 0;
},
showCuttentTime() {
this.$nextTick(() =>
this.$refs["scheduleBody"].scrollTo({
top: `${this.lineIndicatorLocation.top.slice(0, -2) - 240}`,
behavior: "smooth",
})
);
},
}, },
watch: { watch: {
currentTime() { currentTime() {
@@ -339,6 +360,7 @@ export default {
this.changeCurrentTime(); this.changeCurrentTime();
this.timeCoilInitialization(); this.timeCoilInitialization();
this.startTimer(); this.startTimer();
this.showCuttentTime();
} }
}, },
}, },
@@ -346,6 +368,7 @@ export default {
this.changeCurrentTime(); this.changeCurrentTime();
this.timeCoilInitialization(); this.timeCoilInitialization();
this.startTimer(); this.startTimer();
this.showCuttentTime();
}, },
beforeUnmount() { beforeUnmount() {
this.stopTimer(); this.stopTimer();
@@ -355,6 +378,7 @@ export default {
<style lang="sass" scoped> <style lang="sass" scoped>
.schedule .schedule
border-top-left-radius: 4px
position: relative position: relative
border-top-left-radius: 4px border-top-left-radius: 4px
background-color: var(--default-white) background-color: var(--default-white)
@@ -389,4 +413,20 @@ export default {
height: calc(100vh - 56px - 8px - 56px) height: calc(100vh - 56px - 8px - 56px)
overflow-y: auto overflow-y: auto
overflow-x: auto overflow-x: auto
&::-webkit-scrollbar
width: 8px
height: 8px
&::-webkit-scrollbar-track
background-color: var(--bg-ligth-blue-color)
border-radius: 4px
&::-webkit-scrollbar-thumb
border-radius: 4px
background-color: var(--btn-blue-color-2)
.hiding-container
width: 80px
height: 48px
top: calc(56px * 2 + 8px)
background-color: var(--default-white)
z-index: 6
</style> </style>

View File

@@ -19,7 +19,7 @@
@click="openFormCreate", @click="openFormCreate",
v-else v-else
) Создать событие ) Создать событие
calendar-sidebar-event(:is-open="isOpen", :event-type="eventType") calendar-sidebar-event(:is-open="isOpen", :event-type="eventTypes")
calendar-sidebar-teammate(:team-data="teamData", :is-open="isOpen") calendar-sidebar-teammate(:team-data="teamData", :is-open="isOpen")
.button-wrapper.flex.justify-center.mb-23px .button-wrapper.flex.justify-center.mb-23px
base-button( base-button(
@@ -34,8 +34,8 @@
<script> <script>
import BaseButton from "@/components/base/BaseButton"; import BaseButton from "@/components/base/BaseButton";
import CalendarSidebarEvent from "./cells/CalendarSidebarEvent.vue"; import CalendarSidebarEvent from "./CalendarSidebarEvent.vue";
import CalendarSidebarTeammate from "./cells/CalendarSidebarTeammate.vue"; import CalendarSidebarTeammate from "./CalendarSidebarTeammate.vue";
export default { export default {
name: "CalendarSidebar", name: "CalendarSidebar",
@@ -47,7 +47,7 @@ export default {
props: { props: {
teamData: Array, teamData: Array,
openFormCreate: Function, openFormCreate: Function,
eventType: Array, eventTypes: Array,
}, },
data() { data() {
return { return {

View File

@@ -1,5 +1,5 @@
<template lang="pug"> <template lang="pug">
clients-wrapper clients-wrapper(@is-open-client-add-form="transmitPageFormState")
</template> </template>
<script> <script>
@@ -7,5 +7,10 @@ import ClientsWrapper from "@/pages/clients/components/ClientsWrapper";
export default { export default {
name: "TheClients", name: "TheClients",
components: { ClientsWrapper }, components: { ClientsWrapper },
methods: {
transmitPageFormState(value) {
this.$emit("is-open-page-form", value);
},
},
}; };
</script> </script>

View File

@@ -1,35 +1,74 @@
<template lang="pug"> <template lang="pug">
.section-wrapper.flex.flex-col.h-fit.cursor-pointer(@dblclick="openInterfaceChange" :class="{click:isOpenChange}" :style="{ flexDirection:settings[section].rowFlex&&'row', width : settings[section].width + 'px', height : settings[section].height+'px'}") .section-wrapper.flex.flex-col.h-fit.cursor-pointer(
:style="{ flexDirection:settings[section].rowFlex&&'row', width : settings[section].width + 'px', height : settings[section].height+'px'}"
)
.section-header.flex.items-center.justify-between.pl-4.pr-3(:class="{small:settings[section].rowFlex}") .section-header.flex.items-center.justify-between.pl-4.pr-3(:class="{small:settings[section].rowFlex}")
span.text-sm.font-semibold.whitespace-nowrap {{settings[section].title}} span.text-sm.font-semibold.whitespace-nowrap {{settings[section].title}}
.flex.items-center.gap-x-8(v-if="isOpenChange") .flex.items-center.gap-x-8
base-button(v-if="isChange" @click="saveChange" :confirm="true" :rounded="true" :outlined="true" :size="20") base-button(
v-if="isChange",
@click="saveChange",
confirm,
rounded,
outlined,
:size="20"
)
.icon-ok.text-xsm(class="pt-[3px]") .icon-ok.text-xsm(class="pt-[3px]")
.edit.icon-edit.cursor-pointer.text-sm(v-if="!isChange" @click="changeClientData") .edit.icon-edit.cursor-pointer.text-sm(
v-if="!isChange",
@click="changeClientData"
)
.flex.relative .flex.relative
base-button(v-if="settings[section].addFile" @click="openAddingWrap" :rounded="true" :outlined="true" :added="true" :size="24") base-button(
v-if="settings[section].addFile",
@click="openAddingWrap",
:rounded="true",
:outlined="true",
:added="true",
:size="24"
)
.icon-plus(class="pt-[2px]") .icon-plus(class="pt-[2px]")
table-adding-new-doc(v-if="section === 'docs' && isOpenAddingWrap" :add-new-doc="addNewDoc" :save-docs="saveDocs" :new-docs="docData") table-adding-new-doc(
table-adding-new-additional(v-if="section === 'additional' && isOpenAddingWrap" :new-additional-data="additionalData" :add-new-additional="addDocAdditional" :save-additional="saveDocs" ) v-if="section === 'docs' && isOpenAddingWrap",
:add-new-doc="addNewDoc",
:save-docs="saveDocs",
:new-docs="docData"
)
table-adding-new-additional(
v-if="section === 'additional' && isOpenAddingWrap"
:new-additional-data="additionalData",
:add-new-additional="addDocAdditional",
:save-additional="saveDocs"
)
.section-body.w-full.flex.flex-col.px-4.pt-3.pb-4.gap-y-4 .section-body.w-full.flex.flex-col.px-4.pt-3.pb-4.gap-y-4
.flex.flex-col(v-for="(item, key) in sectionInfo" class="gap-y-1.5") .flex.flex-col(v-for="(item, key) in sectionInfo" class="gap-y-1.5")
span.title-section.font-semibold.text-xs(v-if="settings[section].options") {{settings[section].options[key]}} span.title-section.font-semibold.text-xs(v-if="settings[section].options") {{settings[section].options[key]}}
span.title-section.font-semibold.text-xs(v-if="item.header") {{item.header}} span.title-section.font-semibold.text-xs(v-if="item.header") {{item.header}}
client-detail-input.text-sm.text-sm.w-max-fit( client-detail-input.text-sm.text-sm.w-max-fit(
:sharp="settings[section].sharps[key]" v-if="section!=='docs' && isChange",
v-if="section!=='docs' && isChange" :style="{fontWeight:key === 'numba'&&600}",
:style="{fontWeight:key === 'numba'&&600}" v-model:value="sectionInfo[key]",
v-model:value="sectionInfo[key]"
:width="settings[section].width" :width="settings[section].width"
:sharp="settings[section].sharps[key]"
) )
.copy.icon-copy.cursor-pointer(v-if="item.copy" @click="() => copyValue(item)") .copy.icon-copy.cursor-pointer(
v-if="item.copy",
@click="() => copyValue(item)"
)
.flex(v-if="settings[section].options && !isChange") .flex(v-if="settings[section].options && !isChange")
span.text-sm.w-fit(:style="{fontWeight:key === 'numba'&&600}") {{item}} span.text-sm.w-fit(:style="{fontWeight:key === 'numba'&&600}") {{item}}
.copy.icon-copy.cursor-pointer.pl-4(v-if="key === 'numba'" @click="() => copyValue(item)") .copy.icon-copy.cursor-pointer.pl-4(
v-if="key === 'numba'",
@click="() => copyValue(item)"
)
.flex(v-if="item.name && !isChange") .flex(v-if="item.name && !isChange")
span.text-sm.w-fit {{item.title}} span.text-sm.w-fit {{item.title}}
.flex.items-center(v-if="item.title") .flex.items-center(v-if="item.title")
.icon-cancel.cancel.cursor-pointer.pr-3.text-xsm(v-if="isChange" :id="item.id" @click="(e) => deleteDoc(e)") .icon-cancel.cancel.cursor-pointer.pr-3.text-xsm(
v-if="isChange",
:id="item.id",
@click="(e) => deleteDoc(e)"
)
span.text-sm {{item.title}} span.text-sm {{item.title}}
</template> </template>
@@ -75,11 +114,10 @@ export default {
copyValue(text) { copyValue(text) {
navigator.clipboard.writeText(text); navigator.clipboard.writeText(text);
}, },
openInterfaceChange() {
this.isOpenChange = !this.isOpenChange;
},
changeClientData() { changeClientData() {
this.isChange = true; if (!this.isOpenAddingWrap) {
this.isChange = true;
}
}, },
saveChange() { saveChange() {
this.isOpenChange = false; this.isOpenChange = false;
@@ -91,7 +129,9 @@ export default {
} }
}, },
openAddingWrap() { openAddingWrap() {
this.isOpenAddingWrap = true; if (!this.isChange) {
this.isOpenAddingWrap = !this.isOpenAddingWrap;
}
}, },
addNewDoc(e) { addNewDoc(e) {
this.docData = [...this.docData, ...e.target.files]; this.docData = [...this.docData, ...e.target.files];

View File

@@ -43,9 +43,11 @@ export default {
methods: { methods: {
openFormCreateClient() { openFormCreateClient() {
this.isOpenFormCreate = true; this.isOpenFormCreate = true;
this.$emit("is-open-client-add-form", this.isOpenFormCreate);
}, },
closeFormCreateClient() { closeFormCreateClient() {
this.isOpenFormCreate = false; this.isOpenFormCreate = false;
this.$emit("is-open-client-add-form", this.isOpenFormCreate);
this.fetchDataClients(); this.fetchDataClients();
}, },
saveDataClients(data) { saveDataClients(data) {
@@ -79,6 +81,9 @@ export default {
mounted() { mounted() {
this.fetchDataClients(); this.fetchDataClients();
}, },
beforeUnmount() {
this.closeFormCreateClient();
},
}; };
</script> </script>

View File

@@ -1,6 +1,6 @@
<template lang="pug"> <template lang="pug">
.row-wrapper.flex.flex-col.w-full .row-wrapper.flex.flex-col.w-full
.row-body.flex.w-full.cursor-pointer(:id="id" @dblclick="(e) => openDetailInfo(e)") .row-body.flex.w-full.cursor-pointer(:id="id" @click="(e) => openDetailInfo(e)")
.check-box.flex.justify-center.items-center .check-box.flex.justify-center.items-center
clients-table-checkbox(:id="id" :check="check" :is-check="isCheck") clients-table-checkbox(:id="id" :check="check" :is-check="isCheck")
table-cell-body-name(:value="dataClient" :avatar="dataClient.avatar" :avatar-color="dataClient.color" :is-open-change="isOpenChange" :width="columnBody.find(el => el.name === 'fullName').width") table-cell-body-name(:value="dataClient" :avatar="dataClient.avatar" :avatar-color="dataClient.color" :is-open-change="isOpenChange" :width="columnBody.find(el => el.name === 'fullName').width")
@@ -192,7 +192,8 @@ export default {
.find((el) => el.name === "priority") .find((el) => el.name === "priority")
["settings"].find((el) => el.text === e.target.id).priority; ["settings"].find((el) => el.text === e.target.id).priority;
}, },
closeChangeData() { closeChangeData(e) {
e.stopPropagation();
this.isOpenChange = false; this.isOpenChange = false;
this.postUpdateClient(); this.postUpdateClient();
this.postContactsClient(); this.postContactsClient();
@@ -272,6 +273,7 @@ export default {
this.dataAttachments = [...this.dataDetail, ...data]; this.dataAttachments = [...this.dataDetail, ...data];
}, },
deleteDoc(e) { deleteDoc(e) {
e.stopPropagation();
this.dataAttachments = this.dataAttachments.filter( this.dataAttachments = this.dataAttachments.filter(
(el) => el.id !== e.target.id (el) => el.id !== e.target.id
); );

View File

@@ -1,6 +1,6 @@
<template lang="pug"> <template lang="pug">
.wrapper.flex.w-full.relative.mx-6 .wrapper.flex.w-full.relative.mx-6
clients-table(:open-form-create="openFormCreateClient") clients-table(@is-open-client-add-form="transmitPageFormState")
</template> </template>
<script> <script>
@@ -14,11 +14,8 @@ export default {
}; };
}, },
methods: { methods: {
openFormCreateClient() { transmitPageFormState(value) {
this.isOpenForm = true; this.$emit("is-open-client-add-form", value);
},
closeFormCreateClient() {
this.isOpenForm = false;
}, },
}, },
}; };

View File

@@ -11,7 +11,7 @@
span или перетащите их сюда span или перетащите их сюда
.flex.flex-col .flex.flex-col
span.name-doc.py-2.px-3(v-for="doc in newDocs") {{doc.name}} span.name-doc.py-2.px-3(v-for="doc in newDocs") {{doc.name}}
base-button(@click="saveDocs" :size="40") base-button(@click="" :size="40")
span.font-semibold Добавить span.font-semibold Добавить
</template> </template>

View File

@@ -37,6 +37,7 @@ module.exports = {
"14px": "14px", "14px": "14px",
"15px": "15px", "15px": "15px",
"19px": "19px", "19px": "19px",
"22px": "22px",
"23px": "23px", "23px": "23px",
"29_25px": "29.25px", "29_25px": "29.25px",
"45px": "45px", "45px": "45px",