Files
astra-frontend/src/pages/newCalendar/components/CalendarOpenSidebar.vue

236 lines
6.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template lang="pug">
.flex.flex-col.gap-y-1
.form.flex.items-center.justify-end.py-4.pr-4.rounded-t
q-btn.rotate-180(
@click="openSidebar",
dense,
padding="8px",
style="color: var(--font-grey-color); background: var(--bg-light-grey)"
)
img(:src="arrow")
.form.flex.p-4
q-btn(
color="primary",
size="16px",
label="Создать запись",
no-caps,
icon="add",
:style="{width: '100%', height: '40px'}",
padding="0"
)
.flex.flex-col.gap-y-1
q-expansion-item.expansion.font-bold.text-xm(
v-for="(elem, index) in patientList",
expand-separator,
:label="elem.label",
@click="choiceForm(elem.choice, index)",
:class="{'patient': elem.label === 'Пациенты'}"
)
.select.flex.flex-col.font-medium.text-smm.px-4(
v-if="elem.label !== 'Пациенты'",
v-for="item in elem.data"
)
.status.flex.items-center.gap-x-1.px-2
img(:src="item.icon")
span {{item.name}}
.flex.flex-col.p-4.pb-0(:class="choiceState()", v-else)
.flex.h-8.w-full.items-center.justify-between
base-input(
v-model="foundPerson",
debounce="10",
@keyup.enter="searchPerson",
@input="searchPerson",
id="input",
placeholder="Найти пациента...",
outlined,
:width="160",
iconLeft,
fontSize="12px",
lineHeight="16px",
textColor="var(--font-grey-color)"
)
q-icon(name="app:icon-search", size="16px", style="color: var(--font-grey-color)")
q-btn.btn.ml-2(
@click="sortPerson(elem.data)",
icon="app:sort-number",
:style="{width: '32px', height: '32px'}",
padding="0"
)
.flex.items-center.justify-between.font-medium.text-smm.h-10.py-2.cursor-pointer(
@click="checkAll(elem.data)"
)
span Все
img(v-if="selectAll(elem.data)", :src="icon_ok")
.person-wrapper.flex.flex-col
.person.items-center.flex.justify-between.py-2.cursor-pointer(
v-for="(person, index) in choiceData(elem.data)",
@click="checkPerson(index, elem.data)"
)
.flex.items-center.gap-x-2
img.h-10.w-10.object-cover.rounded-full(:src="person.avatar")
.flex.flex-col.font-medium
.text-smm {{trimOwnerName(person.last_name, person.first_name, person.patronymic)}}
.text.text-xsx {{person.birthday}}
img.h-6.w-6(v-if="person.check", :src="icon_ok")
</template>
<script>
import arrow from "@/assets/icons/double_left_arrow.svg";
import icon_ok from "@/assets/icons/icon_ok.svg";
import BaseInput from "@/components/base/BaseInput.vue";
import { patientList } from "@/pages/newCalendar/utils/calendarConfig.js";
export default {
name: "CalendarOpenSidebar",
props: { openSidebar: Function },
components: { BaseInput },
data() {
return {
val: [],
arrow,
icon_ok,
foundPerson: "",
sortData: [],
patientList: patientList,
sort: false,
};
},
methods: {
choiceState() {
let num = 0;
this.patientList.forEach((e) => {
if (e.choice) num += 1;
});
return {
one: num === 1,
two: num === 2,
three: num === 3,
};
},
choiceForm(choice, idx) {
if (choice)
return (this.patientList.find((e) => e.id === idx).choice = false);
this.patientList.find((e) => e.id === idx).choice = true;
},
trimOwnerName(lastName, firstName, patronymic) {
let checkedFirstName = firstName !== null ? firstName[0] + "." : "";
let checkedPatronymic = patronymic !== null ? patronymic[0] + "." : "";
return `${lastName} ${checkedFirstName}${checkedPatronymic}`;
},
checkPerson(index, arr) {
arr.map((e) => {
if (e.id === index) e.check = !e.check;
});
},
selectAll(arr) {
return arr.find((e) => e.check) ? false : true;
},
checkAll(arr) {
arr.map((e) => (e.check = false));
},
searchPerson() {
this.sortData = this.patientList
.find((e) => e.label === "Пациенты")
.data.filter(
(e) =>
e.last_name.toLowerCase().substr(0, this.foundPerson.length) ===
this.foundPerson.toLowerCase()
);
},
choiceData(arr) {
return this.foundPerson ? this.sortData : arr;
},
sortPerson(arr) {
if (!this.sort) {
this.sort = true;
arr.sort((a, b) => (a.last_name > b.last_name ? 1 : -1));
} else {
this.sort = false;
arr.sort((a, b) => (b.last_name > a.last_name ? 1 : -1));
}
},
},
};
</script>
<style lang="sass" scoped>
.one
max-height: calc(100vh - 394px)
.two
max-height: calc(100vh - 498px)
.three
max-height: calc(100vh - 632px)
.form
background: var(--default-white)
width: 100%
height: 72px
.expansion
height: 54px
background: var(--default-white)
border-radius: 4px
color: var(--font-dark-blue-color)
.select
padding-bottom: 2px
&:last-child
padding-bottom: 16px
.status
border-radius: 4px
height: 28px
&:hover
background: var(--bg-light-grey)
cursor: pointer
.q-expansion-item
border-radius: 0
height: 100%
.q-expansion-item :deep(.q-separator)
display: none
.patient :deep(.q-expansion-item__content)
padding-bottom: 0px
.btn
background-color: var(--bg-light-grey)
color: var(--font-grey-color)
#input :deep(.q-field__control)
height: 32px
.q-field__prepend
height: 32px
.q-expansion-item :deep(.q-item__section--main ~ .q-item__section--side)
padding-left: 0px
.q-expansion-item :deep(.q-item__label)
line-height: 135% !important
.text
color: var(--font-grey-color)
.q-expansion-item :deep(.q-item)
height: 54px
.person-wrapper
overflow-y: auto
margin-right: -10px
&::-webkit-scrollbar
width: 4px
&::-webkit-scrollbar-track:vertical
margin-top: -26px
margin-bottom: 26px
.person
height: 56px
width: calc(100% - 10px)
border-bottom: 1px solid var(--bg-light-grey)
&:first-child
border-top: 1px solid var(--bg-light-grey)
</style>