.
This commit is contained in:
@@ -1,42 +1,16 @@
|
||||
<template lang="pug">
|
||||
.header-wrapper.flex.w-full.justify-between.p-4
|
||||
.flex.items-center.justify-center.gap-x-2
|
||||
base-select.search(
|
||||
width="438px",
|
||||
base-input.search(
|
||||
:width="438",
|
||||
size="M",
|
||||
placeholder="Найти медкарту",
|
||||
placeholder="Введите ФИО или номер телефона",
|
||||
icon-left,
|
||||
hide-dropdown-icon,
|
||||
use-input
|
||||
:items="filteringMedcardsList",
|
||||
custom-option,
|
||||
:filter-fn="filterFn",
|
||||
:popup-content-style="{height: filteringMedcardsList?.length > 3 ? '216px' : ''}"
|
||||
v-model="filterString"
|
||||
)
|
||||
template(v-slot:iconLeft)
|
||||
template(#iconLeft)
|
||||
q-icon.search-icon(name="app:search", size="20px")
|
||||
template(v-slot:customOption="slotProps")
|
||||
.w-full.item.px-4.py-2.flex.gap-x-3.cursor-pointer(
|
||||
v-bind="slotProps.props"
|
||||
)
|
||||
q-avatar(size="40px")
|
||||
img(:src="slotProps.avatar")
|
||||
.flex.flex-col.gap-y-1
|
||||
.text-dark.text-sm.font-medium {{ slotProps.label }}
|
||||
.text-xsx.grey-color Медкарта {{ `#${slotProps.medcard?.split(" ")?.join("")}` }}
|
||||
template(v-slot:beforeOptions)
|
||||
.h-10.w-full.px-4.pt-3.pb-2.flex.items-center
|
||||
span.text-sm.grey-color {{ filteringMedcardsList.length }} результатов
|
||||
template(v-slot:noOption)
|
||||
.w-full.px-4.py-3.flex.items-center.text-sm.grey-color.font-medium Результатов по запросу не найдено
|
||||
base-select(
|
||||
width="280px",
|
||||
:items="sortingOptions",
|
||||
size="M",
|
||||
placeholder="Сортировать по ...",
|
||||
v-model="sortingType"
|
||||
)
|
||||
base-button(width="216px")
|
||||
base-button(width="216px", @click="openCreateMedcardPage")
|
||||
q-icon.plus.mr-2(name="app:plus", size="24px")
|
||||
span Создать медкарту
|
||||
</template>
|
||||
@@ -45,47 +19,26 @@
|
||||
import BaseInput from "@/components/base/BaseInput.vue";
|
||||
import BaseSelect from "@/components/base/BaseSelect.vue";
|
||||
import BaseButton from "@/components/base/BaseButton.vue";
|
||||
import {
|
||||
medcardsList,
|
||||
sortingOptions,
|
||||
} from "@/pages/medcards/utils/medcardsConfig.js";
|
||||
|
||||
import debounce from "lodash/debounce";
|
||||
export default {
|
||||
name: "MedicalCardSearchHeader",
|
||||
components: { BaseInput, BaseSelect, BaseButton },
|
||||
emits: ["search"],
|
||||
data() {
|
||||
return {
|
||||
filteringMedcardsList: null,
|
||||
sortingOptions: sortingOptions,
|
||||
sortingType: null,
|
||||
filterString: "",
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
serializedMedcardsList() {
|
||||
return medcardsList.map((elem) => ({
|
||||
label: `${elem?.last_name} ${elem?.first_name} ${elem?.patronymic}`,
|
||||
id: elem?.id,
|
||||
avatar: elem?.avatar,
|
||||
medcard: elem?.medcard,
|
||||
}));
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
filterFn(val, update) {
|
||||
update(() => {
|
||||
this.filteringMedcardsList = this.serializedMedcardsList?.filter(
|
||||
(elem) => {
|
||||
let reg = new RegExp(`^${val}`, "ig");
|
||||
if (reg.test(elem.label)) return elem;
|
||||
}
|
||||
);
|
||||
});
|
||||
},
|
||||
initializeMedcardsList() {
|
||||
this.filteringMedcardsList = this.serializedMedcardsList;
|
||||
openCreateMedcardPage() {
|
||||
alert("Создать медкарту с ФИО: " + this.filterString);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.initializeMedcardsList();
|
||||
watch: {
|
||||
filterString: debounce((value) => {
|
||||
this.$emit("search", value);
|
||||
}, 300),
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user