diff --git a/src/components/base/BaseEditModeSwitcher.vue b/src/components/base/BaseEditModeSwitcher.vue
new file mode 100644
index 0000000..e18788a
--- /dev/null
+++ b/src/components/base/BaseEditModeSwitcher.vue
@@ -0,0 +1,55 @@
+
+.flex
+ template(v-if="value")
+ q-btn(
+ @click="toggleEditMode",
+ :style="{backgroundColor: 'var(--bg-light-grey)', color: 'blue'}",
+ padding="10px",
+ )
+ q-icon(
+ name="edit",
+ size="20px",
+ )
+ template(v-else)
+ q-btn.mr-2(
+ @click="save",
+ :style="{backgroundColor: 'var(--bg-light-grey)', color: 'blue'}",
+ padding="10px",
+ )
+ q-icon(
+ name="check",
+ size="20px",
+ )
+ q-btn(
+ @click="cancel",
+ :style="{backgroundColor: 'var(--bg-light-grey)', color: 'blue'}",
+ padding="10px",
+ )
+ q-icon(
+ name="cancel",
+ size="20px",
+ )
+
+
+
diff --git a/src/components/base/BaseFieldList.vue b/src/components/base/BaseFieldList.vue
new file mode 100644
index 0000000..efde7e5
--- /dev/null
+++ b/src/components/base/BaseFieldList.vue
@@ -0,0 +1,58 @@
+
+.XXX.p-2
+ template(v-if="!editMode")
+ template(v-if="value.length")
+ template(v-for="elem in value", :key="elem.id")
+ .text-m.pb-1 {{ elem.label }}
+ .font-medium.text-xl.pb-3 {{ elem.value }}
+ .flex.flex-col.justify-evenly.items-center.content-center(v-else, style="height:100px")
+ q-icon(
+ name="help_outline",
+ size="40px",
+ class="icon",
+ id="empty"
+ )
+ .text {{ emptyMessage }}
+ template(v-else)
+ template(v-for="elem in value", :key="elem.id")
+ .text-m.pb-1 {{ elem.label }}
+ base-input.pb-3(
+ v-model="elem.value",
+ size="M",
+ )
+ .flex.justify-center
+ q-btn-dropdown(label="Добавить", icon="add", outline, color="blue-6")
+ q-list(v-for="option in options", :key="option")
+ q-item(clickable, v-close-popup, @click="addOption(option)")
+ q-item-label {{ option }}
+
+
+
+
+
+
diff --git a/src/pages/medcards/components/MedicalCardSearchRow.vue b/src/pages/medcards/components/MedicalCardSearchRow.vue
index bed820c..5d11203 100644
--- a/src/pages/medcards/components/MedicalCardSearchRow.vue
+++ b/src/pages/medcards/components/MedicalCardSearchRow.vue
@@ -53,9 +53,14 @@ export default {
...mapActions({
getMedicalCardData: "getMedicalCardDataByPersonId",
createMedicalCard: "createMedicalCard",
+ getPerson: "GET_PERSON",
}),
openMedicalCard() {
- this.$router.push("medical-card/" + this.person["medical_card_id"]);
+ this.getPerson(this.person.id)
+ .then(() =>
+ this.$router.push("medical-card/" + this.person["medical_card_id"])
+ )
+ .catch((error) => alert(error));
},
createMedCard() {
this.createMedicalCard({
diff --git a/src/pages/newMedicalCard/TheMedicalCard.vue b/src/pages/newMedicalCard/TheMedicalCard.vue
index 46e5996..a056696 100644
--- a/src/pages/newMedicalCard/TheMedicalCard.vue
+++ b/src/pages/newMedicalCard/TheMedicalCard.vue
@@ -1,10 +1,11 @@
.w-full.fit.row.no-wrap.justify-evenly
.col-grow.pr-2
- medical-card-patient-form
- medical-base-info.mt-2
+ medical-card-patient-form(:edit-mode="editMode", :need-save="needSave")
+ medical-card-tabs(v-model="currentMenuItem")
+ medical-card-general-info(:edit-mode="editMode").mt-2
.h-full
- the-right-menu
+ the-right-menu(v-model:edit-mode="editMode")
-
diff --git a/src/pages/newMedicalCard/components/MedicalCardPatientForm.vue b/src/pages/newMedicalCard/components/MedicalCardPatientForm.vue
index 93258d7..c60b3f6 100644
--- a/src/pages/newMedicalCard/components/MedicalCardPatientForm.vue
+++ b/src/pages/newMedicalCard/components/MedicalCardPatientForm.vue
@@ -13,7 +13,8 @@
q-breadcrumbs-el(:label="`Медкарта #${medicalCardData?.number}`")
.mr-4.flex
- .text {{ patient?.marks }}
+ special-marks(:marks="patient?.marks", :edit-mode="editMode")
+
.ml-6.flex.gap-x-4.col-grow.items-center
q-avatar(size="80px", :style="{'background-color': 'var(--border-light-grey-color)', color: 'var(--font-dark-blue-color)'}")
@@ -32,28 +33,28 @@
.flex-col(v-else)
.flex.gap-x-2
base-input(
- v-model="patient.lastName"
+ v-model="patientEdit.lastName"
size="S",
label="Фамилия"
)
base-input(
- v-model="patient.firstName"
+ v-model="patientEdit.firstName"
size="S",
label="Имя"
)
base-input(
- v-model="patient.patronymic"
+ v-model="patientEdit.patronymic"
size="S",
label="Отчество"
)
.flex.gap-x-2
base-input(
- v-model="patient.birthDate"
+ v-model="patientEdit.birthDate"
size="S",
label="Дата рождения"
)
base-input(
- v-model="patient.gender"
+ v-model="patientEdit.gender"
size="S",
label="Пол"
)
@@ -62,6 +63,7 @@
diff --git a/src/pages/newMedicalCard/components/MedicalSidebar.vue b/src/pages/newMedicalCard/components/_MedicalSidebar.vue
similarity index 100%
rename from src/pages/newMedicalCard/components/MedicalSidebar.vue
rename to src/pages/newMedicalCard/components/_MedicalSidebar.vue
diff --git a/src/pages/newMedicalCard/components/BasicDataForms/BasicDataForm.vue b/src/pages/newMedicalCard/tabs/general/BasicDataForm.vue
similarity index 91%
rename from src/pages/newMedicalCard/components/BasicDataForms/BasicDataForm.vue
rename to src/pages/newMedicalCard/tabs/general/BasicDataForm.vue
index 2da1907..dcfc370 100644
--- a/src/pages/newMedicalCard/components/BasicDataForms/BasicDataForm.vue
+++ b/src/pages/newMedicalCard/tabs/general/BasicDataForm.vue
@@ -15,13 +15,7 @@
.flex.w-full.items-center.gap-4(v-for="field in data.fields")
.label-field.font-sm.text-sm.whitespace-nowrap {{`${field.label} :`}}
.flex.gap-3.items-center.h-10(v-if="field.type === 'avatar'")
- base-avatar(:size="40")
- img.avatar.object-cover(
- v-if="basic[data.dataKey][field.key]?.photo"
- :src="basic[data.dataKey][field.key].photo"
- alt="AV"
- )
- span(v-else) {{ avatar }}
+
.replace-photo.font-medium.text-base.cursor-pointer(v-if="isEdit" @click="showModal = true") Заменить фото
base-modal(v-model="showModal" title="Загрузить изображение")
base-upload-photo(
@@ -64,7 +58,7 @@
+
+
diff --git a/src/pages/newMedicalCard/tabs/general/GeneralInfo.vue b/src/pages/newMedicalCard/tabs/general/GeneralInfo.vue
new file mode 100644
index 0000000..1c475f0
--- /dev/null
+++ b/src/pages/newMedicalCard/tabs/general/GeneralInfo.vue
@@ -0,0 +1,63 @@
+
+.bg-white.p-4.rounded.fit.row.wrap.justify-start.items-start.content-start
+ .col-3
+ base-field-list.mt-2(
+ :editMode="editMode",
+ :options="contactInfo.options",
+ :emptyMessage="contactInfo.emptyMessage",
+ v-model="contacts"
+ )
+ .col-5
+ base-field-list.mt-2(
+ :editMode="editMode",
+ :options="addressInfo.options",
+ :emptyMessage="addressInfo.emptyMessage",
+ v-model="addresses"
+ )
+
+
+
diff --git a/src/pages/newMedicalCard/components/BasicDataForms/InsuranceForm.vue b/src/pages/newMedicalCard/tabs/general/InsuranceForm.vue
similarity index 100%
rename from src/pages/newMedicalCard/components/BasicDataForms/InsuranceForm.vue
rename to src/pages/newMedicalCard/tabs/general/InsuranceForm.vue
diff --git a/src/pages/newMedicalCard/tabs/general/MedicalCardGeneralInfo.vue b/src/pages/newMedicalCard/tabs/general/MedicalCardGeneralInfo.vue
new file mode 100644
index 0000000..5759b90
--- /dev/null
+++ b/src/pages/newMedicalCard/tabs/general/MedicalCardGeneralInfo.vue
@@ -0,0 +1,41 @@
+
+ .flex.flex-col.gap-y-2.wrapper.h-full.w-full
+ general-info(:edit-mode="editMode")
+ //- basic-data-form
+ //- contacts-form
+ //- documents-form
+ //- insurance-form
+
+
+
+
diff --git a/src/pages/newMedicalCard/tabs/general/generalInfoData.js b/src/pages/newMedicalCard/tabs/general/generalInfoData.js
new file mode 100644
index 0000000..73afa8a
--- /dev/null
+++ b/src/pages/newMedicalCard/tabs/general/generalInfoData.js
@@ -0,0 +1,9 @@
+export const contactInformation = {
+ options: ["Email", "Telegram", "Телефон"],
+ emptyMessage: "Отсутствует контактная информация",
+};
+
+export const addressInformation = {
+ options: ["Адрес регистрации", "Адрес проживания", "Адрес дополнительный"],
+ emptyMessage: "Отсутствует адрес",
+};
diff --git a/src/pages/newMedicalCard/utils/medicalConfig.js b/src/pages/newMedicalCard/utils/medicalConfig.js
index a1fc286..8249925 100644
--- a/src/pages/newMedicalCard/utils/medicalConfig.js
+++ b/src/pages/newMedicalCard/utils/medicalConfig.js
@@ -10,49 +10,46 @@ import pdfIcon from "@/assets/icons/pdf.svg";
import wordIcon from "@/assets/icons/word.svg";
import exelIcon from "@/assets/icons/exel.svg";
-export const baseDataForm = [
- {
- dataLabel: "Личные данные",
- dataKey: "personalData",
- fields: [
- {
- key: "last_name",
- label: "Фамилия",
- type: "text",
- disabled: true,
- },
- {
- key: "first_name",
- label: "Имя",
- type: "text",
- disabled: true,
- },
- {
- key: "patronymic",
- label: "Отчество",
- type: "text",
- disabled: true,
- },
- {
- key: "gender",
- label: "Пол",
- type: "select",
- disabled: true,
- },
- {
- key: "birth_date",
- label: "Дата рождения",
- type: "date",
- disabled: true,
- },
- {
- key: "photo",
- label: "Фото",
- type: "avatar",
- disabled: true,
- },
- ],
+export const specialMarksIconsConfig = {
+ hard: {
+ icon: "thumb_down_alt",
+ color: "amber-2",
+ bgColor: "#8d6e63",
+ description: "Конфликтный",
},
+ debt: {
+ icon: "paid",
+ color: "yellow",
+ bgColor: "green",
+ description: "Долг",
+ },
+ allergic: {
+ icon: "bolt",
+ color: "red",
+ bgColor: "orange",
+ description: "Аллергик",
+ },
+ infected: {
+ icon: "sick",
+ color: "light-green-9",
+ bgColor: "#afb42b",
+ description: "Опасное заболевание",
+ },
+ ban: {
+ icon: "dangerous",
+ color: "grey-6",
+ bgColor: "black",
+ description: "Не записывать",
+ },
+ unknown: {
+ icon: "help",
+ color: "grey-6",
+ bgColor: "#bdbdbd",
+ description: "Неопознанная метка",
+ },
+};
+
+export const baseDataForm = [
{
dataLabel: "Адрес регистрации",
dataKey: "registrationAddress",
diff --git a/src/store/index.js b/src/store/index.js
index b0ecdf5..9b04165 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1,6 +1,7 @@
import { createStore } from "vuex";
import medical from "./modules/medicalCard";
import calendar from "./modules/calendar";
+import person from "./modules/person";
export default createStore({
state: {
@@ -13,6 +14,7 @@ export default createStore({
modules: {
medical,
calendar,
+ person,
},
getters: {
getUrl(state) {
diff --git a/src/store/modules/medicalCard.js b/src/store/modules/medicalCard.js
index 177a547..7fa2119 100644
--- a/src/store/modules/medicalCard.js
+++ b/src/store/modules/medicalCard.js
@@ -12,7 +12,7 @@ const state = () => ({
networks: [],
},
basicData: {
- personalData: {
+ patient: {
last_name: null,
first_name: null,
patronymic: null,
@@ -129,7 +129,7 @@ const getters = {
) || {};
let person = state.medicalCard.person;
return {
- personalData: {
+ patient: {
last_name: person?.last_name || "",
first_name: person?.first_name || "",
patronymic: person?.patronymic || "",
diff --git a/src/store/modules/person.js b/src/store/modules/person.js
new file mode 100644
index 0000000..c2ff23c
--- /dev/null
+++ b/src/store/modules/person.js
@@ -0,0 +1,74 @@
+import { fetchWrapper } from "@/shared/fetchWrapper";
+
+const state = () => ({
+ firstName: "",
+ lastName: "",
+ patronymic: "",
+ birthDate: "",
+ gender: "",
+ marks: [],
+ addresses: [
+ {
+ category: "fact",
+ full_address: "г.Рязань, ул. Новикова-Прибоя, д.43/1, кв.2",
+ },
+ {
+ category: "registration",
+ full_address: "г.Санкт-Себастьянг, ул. Шоссе Энтузиастов, д.243, кв.4",
+ },
+ ],
+ contacts: [
+ { category: "email", value: "dol@yandex.ru" },
+ { category: "phone", value: "+79586541252" },
+ ],
+});
+
+const getters = {
+ PERSON(state) {
+ return {
+ firstName: state.firstName,
+ lastName: state.lastName,
+ patronymic: state.patronymic,
+ birthDate: state.birthDate,
+ gender: state.gender,
+ marks: ["hard", "rich", "allergic", "infected", "ban"],
+ };
+ },
+ ADDRESSES(state) {
+ return state.addresses;
+ },
+ CONTACTS(state) {
+ return state.contacts;
+ },
+};
+
+const actions = {
+ GET_PERSON({ commit }, id) {
+ fetchWrapper
+ .get(`persons/${id}`)
+ .then((res) => {
+ commit("SET_PERSON", res);
+ })
+ .catch((e) => alert(e));
+ },
+ UPDATE_PERSON(context, { obj, id }) {
+ fetchWrapper.patch(`persons/${id}`, obj);
+ },
+};
+
+const mutations = {
+ SET_PERSON(state, payload) {
+ state.firstName = payload.first_name;
+ state.lastName = payload.last_name;
+ state.patronymic = payload.patronymic;
+ state.birthDate = payload.birth_date;
+ state.gender = payload.gender;
+ },
+};
+
+export default {
+ state,
+ getters,
+ actions,
+ mutations,
+};