diff --git a/src/components/base/BaseSelect.vue b/src/components/base/BaseSelect.vue
index b7a5538..6abe91a 100644
--- a/src/components/base/BaseSelect.vue
+++ b/src/components/base/BaseSelect.vue
@@ -13,22 +13,42 @@
map-options,
:clearable="clearable",
dropdown-icon="app:down-arrow",
- :menu-offset="[0, 8]"
+ :menu-offset="[0, 8]",
+ :use-input="useInput",
+ :placeholder="useInput && placeholder ? placeholder : ''",
+ @filter="filterFn",
+ :popup-content-style="popupContentStyle"
)
template(v-slot:selected)
- span(v-if="!value?.icon", :class="{placeholder: placeholder}") {{ textSelect }}
+ span(v-if="!value?.icon", :class="placeholderColor") {{ textSelect }}
q-icon.selected-icon(
v-else,
:name="iconSelect",
size="24px"
)
- template(v-slot:option="scope")
+ template(v-slot:option="scope", v-if="!customOption")
q-item(v-bind="scope.itemProps", style="justify-content: center", v-if="value?.icon")
q-item-section(avatar, style="padding: 0px; min-width: 0px")
q-icon.icon(:name="scope.opt.icon", size="24px")
q-item.item.px-4.py-2(v-bind="scope.itemProps", style="justify-content: center", v-else)
q-item-section
q-item-label.text-dark.text-base.font-medium {{ scope.opt.label }}
+ template(v-slot:option="{itemProps, opt}", v-else)
+ slot(
+ name="customOption",
+ :props="itemProps",
+ :label="opt.label"
+ :avatar="opt.avatar",
+ :medcard="opt.medcard"
+ )
+ template(v-slot:prepend, v-if="iconLeft")
+ slot(name="iconLeft")
+ template(v-slot:append, v-if="iconRight")
+ slot(name="iconRight")
+ template(v-slot:before-options)
+ slot(name="beforeOptions")
+ template(v-slot:no-option)
+ slot(name="noOption")
diff --git a/src/pages/medcards/components/MedicalCardSearchHeader.vue b/src/pages/medcards/components/MedicalCardSearchHeader.vue
index 4293ff2..2ec8d57 100644
--- a/src/pages/medcards/components/MedicalCardSearchHeader.vue
+++ b/src/pages/medcards/components/MedicalCardSearchHeader.vue
@@ -1,17 +1,37 @@
.header-wrapper.flex.w-full.justify-between.p-4
.flex.items-center.justify-center.gap-x-2
- base-input.search(
- :width="438",
+ base-select.search(
+ width="438px",
size="M",
placeholder="Найти медкарту",
- iconLeft
+ icon-left,
+ hide-dropdown-icon,
+ use-input
+ :items="filteringMedcardsList",
+ custom-option,
+ :filter-fn="filterFn",
+ :popup-content-style="{height: filteringMedcardsList?.length > 3 ? '216px' : ''}"
)
template(v-slot: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="items",
+ :items="sortingOptions",
size="M",
placeholder="Сортировать по ...",
v-model="sortingType"
@@ -25,40 +45,48 @@
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";
export default {
name: "MedicalCardSearchHeader",
components: { BaseInput, BaseSelect, BaseButton },
data() {
return {
- items: [
- {
- label: "ФИО",
- id: "name",
- },
- {
- label: "приоритету",
- id: "priority",
- },
- {
- label: "дате рождения",
- id: "birthDate",
- },
- {
- label: "номеру медкарты",
- id: "medcardNumber",
- },
- {
- label: "проценту заполнения",
- id: "percent",
- },
- {
- label: "дате создания медкарты",
- id: "creationDate",
- },
- ],
+ filteringMedcardsList: null,
+ sortingOptions: sortingOptions,
sortingType: null,
};
},
+ 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;
+ },
+ },
+ mounted() {
+ this.initializeMedcardsList();
+ },
};
@@ -75,4 +103,17 @@ export default {
.plus :deep(path)
fill: var(--default-white)
+
+.grey-color
+ color: var(--font-grey-color)
+
+.item
+ border-bottom: 1px solid var(--gray-secondary)
+ &:last-child
+ border-bottom: none
+ &:hover
+ background-color: var(--gray-thirdly)
+
+span
+ cursor: default
diff --git a/src/pages/medcards/components/MedicalCardSearchList.vue b/src/pages/medcards/components/MedicalCardSearchList.vue
index 9c92505..5e0910b 100644
--- a/src/pages/medcards/components/MedicalCardSearchList.vue
+++ b/src/pages/medcards/components/MedicalCardSearchList.vue
@@ -18,138 +18,19 @@