WIP Добвил обновление Основных данных в БД

This commit is contained in:
DwCay
2023-04-07 20:00:02 +03:00
parent b1e9a96164
commit efaf968738
5 changed files with 151 additions and 30 deletions

View File

@@ -1,5 +1,13 @@
<template lang="pug"> <template lang="pug">
medical-form-wrapper(title="Основные данные" :cancel="cancelEdit" :open-edit="openEdit" :save="saveChange") medical-form-wrapper(
title="Основные данные"
:is-check-change="isCheckChange"
:is-loading-data="isLoadingData"
:is-edit="isEdit"
:save="saveChange"
:cancel="cancelEdit"
:open-edit="openEdit"
)
.form-wrap.gap-24.w-full .form-wrap.gap-24.w-full
.data-section.flex.flex-col.gap-4(v-for="data in configData") .data-section.flex.flex-col.gap-4(v-for="data in configData")
.font-semibold.text-sm.whitespace-nowrap {{data.dataLabel}} .font-semibold.text-sm.whitespace-nowrap {{data.dataLabel}}
@@ -22,6 +30,7 @@
.select(v-else-if="field.type === 'select'") .select(v-else-if="field.type === 'select'")
base-select( base-select(
v-model="basic[data.dataKey][field.key]" v-model="basic[data.dataKey][field.key]"
@input="checkChangeInput"
:hide-dropdown-icon="!isEdit" :hide-dropdown-icon="!isEdit"
:disable="!isEdit" :disable="!isEdit"
:outlined="isEdit" :outlined="isEdit"
@@ -33,6 +42,7 @@
v-else v-else
:disabled="!isEdit" :disabled="!isEdit"
v-model="basic[data.dataKey][field.key]" v-model="basic[data.dataKey][field.key]"
@input="checkChangeInput"
:type="field.type" :type="field.type"
:width="300" :width="300"
:standout="!isEdit" :standout="!isEdit"
@@ -49,6 +59,9 @@ import BaseAvatar from "@/components/base/BaseAvatar.vue";
import BaseModal from "@/components/base/BaseModal.vue"; import BaseModal from "@/components/base/BaseModal.vue";
import BaseUploadPhoto from "@/components/base/BaseUploadPhoto.vue"; import BaseUploadPhoto from "@/components/base/BaseUploadPhoto.vue";
import MedicalFormWrapper from "@/pages/newMedicalCard/components/MedicalFormWrapper.vue"; import MedicalFormWrapper from "@/pages/newMedicalCard/components/MedicalFormWrapper.vue";
import { fetchWrapper } from "@/shared/fetchWrapper";
import { removeEmptyFields } from "@/shared/utils/changesObjects";
import moment from "moment";
import { import {
baseDataForm, baseDataForm,
genderOptions, genderOptions,
@@ -69,6 +82,8 @@ export default {
return { return {
showModal: false, showModal: false,
isEdit: false, isEdit: false,
isLoadingData: false,
isCheckChange: false,
genderOptions: genderOptions, genderOptions: genderOptions,
configData: baseDataForm, configData: baseDataForm,
}; };
@@ -77,12 +92,22 @@ export default {
...mapGetters({ ...mapGetters({
url: "getUrl", url: "getUrl",
avatar: "getAvatar", avatar: "getAvatar",
initDataBasic: "getBasicData",
}), }),
...mapState({ ...mapState({
basic: (state) => state.medical.basicData, basic: (state) => state.medical.basicData,
}), }),
}, },
methods: { methods: {
checkChangeInput() {
let initData = JSON.stringify(this.initDataBasic);
let changeData = JSON.stringify(this.basic);
if (initData !== changeData) {
this.isCheckChange = true;
} else {
this.isCheckChange = false;
}
},
confirmCahngeAvatar() { confirmCahngeAvatar() {
this.showModal = false; this.showModal = false;
}, },
@@ -90,8 +115,92 @@ export default {
this.$store.dispatch("returnInitData"); this.$store.dispatch("returnInitData");
this.isEdit = false; this.isEdit = false;
}, },
updateBasicData() {
let registration = this.basic.registrationAddress;
let residence = this.basic.residenceAddress;
let personal = this.basic.personalData;
const request = Object.keys(this.basic).map((key) => {
if (key === "personalData") {
let updatePersonal = {
full_name: `${personal.last_name} ${personal.first_name} ${personal.patronymic}`,
gender: personal.gender?.id,
birth_date:
personal.birth_date &&
moment(personal.birth_date).format("YYYY-MM-DD"),
};
if (
JSON.stringify(this.basic[key]) !==
JSON.stringify(this.initDataBasic[key])
) {
return fetchWrapper.post(
`general/person/${personal.id}/update/`,
updatePersonal
);
}
return Promise.resolve();
}
if (key === "registrationAddress") {
let initRegistration = Object.keys(
removeEmptyFields(this.initDataBasic[key])
);
if (Object.keys(removeEmptyFields(this.basic[key])).length) {
if (!initRegistration.length) {
return fetchWrapper.post(`general/address/create/`, {
person: personal.id,
registration_flg: true,
...removeEmptyFields(registration),
});
}
if (
JSON.stringify(this.basic[key]) !==
JSON.stringify(this.initDataBasic[key])
) {
return fetchWrapper.post(
`general/address/${registration.id}/update/`,
removeEmptyFields(registration)
);
}
return Promise.resolve();
}
return Promise.resolve();
}
if (key === "residenceAddress") {
let initResidence = Object.keys(
removeEmptyFields(this.initDataBasic[key])
);
if (Object.keys(removeEmptyFields(this.basic[key])).length) {
if (!initResidence.length) {
return fetchWrapper.post(`general/address/create/`, {
person: personal.id,
residence_flg: true,
...removeEmptyFields(residence),
});
}
if (
JSON.stringify(this.basic[key]) !==
JSON.stringify(this.initDataBasic[key])
) {
return fetchWrapper.post(
`general/address/${residence.id}/update/`,
removeEmptyFields(residence)
);
}
return Promise.resolve();
}
return Promise.resolve();
}
});
return request;
},
saveChange() { saveChange() {
this.isLoadingData = true;
let updateBasic = this.updateBasicData();
Promise.allSettled(updateBasic)
.then(() => this.$store.dispatch("getMedicalCardData"))
.then(() => {
this.isLoadingData = false;
this.isEdit = false; this.isEdit = false;
});
}, },
openEdit() { openEdit() {
this.isEdit = true; this.isEdit = true;

View File

@@ -6,11 +6,11 @@
.flex.flex-col.h-full.gap-25px.p-6 .flex.flex-col.h-full.gap-25px.p-6
.flex.w-fit.gap-11px.items-center .flex.w-fit.gap-11px.items-center
span.font-bold.text-base {{title}} span.font-bold.text-base {{title}}
q-icon.edit-button.text-lg.cursor-pointer(name="app:edit" v-if="!isEdit" @click="clickEditForm" size="20") q-icon.edit-button.text-lg.cursor-pointer(name="app:edit" v-if="!isEdit" @click="openEdit" size="20")
slot slot
.flex.h-fit.w-fit.gap-2(v-if="isEdit") .flex.h-fit.w-fit.gap-2(v-if="isEdit")
base-button.text-base.font-semibold(outlined :size="40" @click="cancelEdit") Отменить base-button.text-base.font-semibold(outlined :size="40" @click="cancel") Отменить
base-button.text-base.font-semibold(:size="40" @click="saveChangeForm") Сохранить изменения base-button.text-base.font-semibold(v-if="isCheckChange" :size="40" @click="save") Сохранить изменения
</template> </template>
<script> <script>
@@ -33,29 +33,17 @@ export default {
type: Function, type: Function,
default: () => {}, default: () => {},
}, },
isCheckChange: {
type: Boolean,
default: false,
}, },
data() { isLoadingData: {
return { type: Boolean,
isEdit: false, default: false,
isLoadingData: false,
};
}, },
methods: { isEdit: {
clickEditForm() { type: Boolean,
this.isEdit = true; default: false,
this.openEdit();
},
cancelEdit() {
this.isEdit = false;
this.cancel();
},
saveChangeForm() {
this.isLoadingData = true;
setTimeout(() => {
this.isLoadingData = false;
this.isEdit = false;
this.save();
}, 2000);
}, },
}, },
}; };

View File

@@ -1,7 +1,7 @@
export const baseDataForm = [ export const baseDataForm = [
{ {
dataLabel: "Личные данные", dataLabel: "Личные данные",
dataKey: "basicData", dataKey: "personalData",
fields: [ fields: [
{ {
key: "last_name", key: "last_name",

View File

@@ -0,0 +1,21 @@
export function removeEmptyFields(obj) {
let resultObj = {};
Object.keys(obj)
.filter(
(key) => obj[key] !== undefined && obj[key] !== null && obj[key] !== ""
)
.forEach((key) => {
resultObj[key] = obj[key];
});
return resultObj;
}
export function getObjectChangeField(objInit, objUpdate) {
const resultObj = {};
Object.keys(objUpdate).forEach((key) => {
if (objUpdate[key] !== objInit[key]) {
resultObj[key] = objUpdate[key];
}
});
return resultObj;
}

View File

@@ -4,7 +4,7 @@ import { genderOptions } from "@/pages/newMedicalCard/utils/configMedical";
const state = () => ({ const state = () => ({
medicalCard: {}, medicalCard: {},
basicData: { basicData: {
basicData: { personalData: {
last_name: null, last_name: null,
first_name: null, first_name: null,
patronymic: null, patronymic: null,
@@ -39,7 +39,7 @@ const getters = {
state?.medicalCard?.person?.address?.find((el) => el.residence_flg) || {}; state?.medicalCard?.person?.address?.find((el) => el.residence_flg) || {};
let person = state.medicalCard.person; let person = state.medicalCard.person;
return { return {
basicData: { personalData: {
last_name: person?.last_name, last_name: person?.last_name,
first_name: person?.first_name, first_name: person?.first_name,
patronymic: person?.patronymic, patronymic: person?.patronymic,
@@ -50,6 +50,7 @@ const getters = {
? new Date(person?.birth_date) ? new Date(person?.birth_date)
: new Date(), : new Date(),
photo: person?.photo ? rootState.getUrl + person?.photo : null, photo: person?.photo ? rootState.getUrl + person?.photo : null,
id: person?.id,
}, },
registrationAddress: { registrationAddress: {
region: registrationAddress?.region, region: registrationAddress?.region,
@@ -57,6 +58,7 @@ const getters = {
street: registrationAddress?.street, street: registrationAddress?.street,
house_number: registrationAddress?.house_number, house_number: registrationAddress?.house_number,
apartment_number: registrationAddress?.apartment_number, apartment_number: registrationAddress?.apartment_number,
id: registrationAddress?.id,
}, },
residenceAddress: { residenceAddress: {
region: residenceAddress?.region, region: residenceAddress?.region,
@@ -64,6 +66,7 @@ const getters = {
street: residenceAddress?.street, street: residenceAddress?.street,
house_number: residenceAddress?.house_number, house_number: residenceAddress?.house_number,
apartment_number: residenceAddress?.apartment_number, apartment_number: residenceAddress?.apartment_number,
id: residenceAddress?.id,
}, },
}; };
}, },