WIP Добавил обновление Контактов

This commit is contained in:
DwCay
2023-04-19 18:11:05 +03:00
parent 5baefcc1f8
commit a2898f4b4f
6 changed files with 120 additions and 50 deletions

View File

@@ -9,8 +9,8 @@
:open-edit="openEdit" :open-edit="openEdit"
) )
.flex.flex-col.gap-19px.w-full .flex.flex-col.gap-19px.w-full
.flex.flex-col.gap-4 .flex.flex-col.gap-4.w-full
.flex.gap-4.items-center(v-for="(allergy, index) in allergies") .flex.gap-4.items-center.w-full.justify-between(v-for="(allergy, index) in allergies")
.label-field.font-sm.text-sm.whitespace-nowrap {{ `Аллерген ${index+1}:` }} .label-field.font-sm.text-sm.whitespace-nowrap {{ `Аллерген ${index+1}:` }}
.flex.gap-2.w-full.items-center .flex.gap-2.w-full.items-center
base-input( base-input(
@@ -51,6 +51,7 @@ import BaseButton from "@/components/base/BaseButton.vue";
import BaseInput from "@/components/base/BaseInput.vue"; import BaseInput from "@/components/base/BaseInput.vue";
import { checkChangeData } from "@/shared/utils/changesObjects"; import { checkChangeData } from "@/shared/utils/changesObjects";
import { mapState, mapGetters } from "vuex"; import { mapState, mapGetters } from "vuex";
import { getRequestArrayData } from "@/shared/utils/wrapperRequestChangeData";
export default { export default {
name: "AllergiesForm", name: "AllergiesForm",
@@ -65,15 +66,35 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
allergies: (state) => state.medical.allergies, allergies: (state) => state.medical.allergies,
personId: (state) => state.medical.medicalCard.person.id,
}), }),
...mapGetters({ ...mapGetters({
initAllergies: "getAllergiesData", initAllergies: "getAllergiesData",
}), }),
}, },
methods: { methods: {
updateAllergies() {
const notEmptyAllergies = this.allergies.filter(
(el) => el.name && el.title
);
return getRequestArrayData(
this.initAllergies,
notEmptyAllergies,
"person",
this.personId,
"general",
"allergic"
);
},
saveChange() { saveChange() {
this.isEdit = false; this.isLoadingData = true;
this.isCheckChange = false; Promise.allSettled(this.updateAllergies())
.then(() => this.$store.dispatch("getMedicalCardData"))
.then(() => {
this.isLoadingData = false;
this.isEdit = false;
this.isCheckChange = false;
});
}, },
cancelEdit() { cancelEdit() {
this.$store.dispatch("returnInitData"); this.$store.dispatch("returnInitData");

View File

@@ -8,7 +8,7 @@
:cancel="cancelEdit" :cancel="cancelEdit"
:open-edit="openEdit" :open-edit="openEdit"
) )
.form-wrap.gap-24.w-full q-form.form-wrap.gap-24.w-full(ref="formContacts")
.flex.flex-col.gap-4(v-for="(contact, key) in contacts") .flex.flex-col.gap-4(v-for="(contact, key) in contacts")
.font-semibold.text-sm.whitespace-nowrap {{configData[key].title}} .font-semibold.text-sm.whitespace-nowrap {{configData[key].title}}
.flex.w-full.justify-between.items-center.gap-4(v-for="(data, index) in contact") .flex.w-full.justify-between.items-center.gap-4(v-for="(data, index) in contact")
@@ -44,6 +44,7 @@
:disabled="!isEdit" :disabled="!isEdit"
v-model="data.username" v-model="data.username"
:mask="configData[key].inputMask" :mask="configData[key].inputMask"
:rule="configData[key].rules"
@update:model-value="checkChangeInput" @update:model-value="checkChangeInput"
type="text" type="text"
:standout="!isEdit" :standout="!isEdit"
@@ -72,6 +73,7 @@ import BaseSelectNetworks from "@/components/base/BaseSelectNetworks.vue";
import { mapNetworks } from "@/pages/newMedicalCard/utils/medicalConfig"; import { mapNetworks } from "@/pages/newMedicalCard/utils/medicalConfig";
import { checkChangeData } from "@/shared/utils/changesObjects"; import { checkChangeData } from "@/shared/utils/changesObjects";
import { contactsDataForm } from "@/pages/newMedicalCard/utils/medicalConfig"; import { contactsDataForm } from "@/pages/newMedicalCard/utils/medicalConfig";
import { getRequestArrayData } from "@/shared/utils/wrapperRequestChangeData";
import { mapState, mapGetters } from "vuex"; import { mapState, mapGetters } from "vuex";
export default { export default {
@@ -92,6 +94,8 @@ export default {
}), }),
...mapState({ ...mapState({
contacts: (state) => state.medical.contactsData, contacts: (state) => state.medical.contactsData,
personId: (state) => state.medical.medicalCard.person.id,
initAllContacts: (state) => state.medical.medicalCard.person.contacts,
}), }),
}, },
methods: { methods: {
@@ -111,11 +115,37 @@ export default {
this.isEdit = false; this.isEdit = false;
this.isCheckChange = false; this.isCheckChange = false;
}, },
updateContacts() {
const allNewContacts = [
...this.contacts.phones,
...this.contacts.emails,
...this.contacts.networks,
];
const notEmptyContacts = allNewContacts.filter(
(el) => el.kind && el.username
);
return getRequestArrayData(
this.initAllContacts,
notEmptyContacts,
"person",
this.personId,
"general",
"contact"
);
},
saveChange() { saveChange() {
this.isLoadingData = true; const form = this.$refs.formContacts;
this.$store.dispatch("updateContactsData").then(() => { form.validate().then((validate) => {
this.isEdit = false; if (validate) {
this.isLoadingData = false; this.isLoadingData = true;
Promise.allSettled(this.updateContacts())
.then(() => this.$store.dispatch("getMedicalCardData"))
.then(() => {
this.isLoadingData = false;
this.isEdit = false;
this.isCheckChange = false;
});
}
}); });
}, },
checkChangeInput() { checkChangeInput() {

View File

@@ -1,3 +1,5 @@
import { ruleLengthValue, ruleEmailValue } from "@/shared/utils/rulesInputs";
export const baseDataForm = [ export const baseDataForm = [
{ {
dataLabel: "Личные данные", dataLabel: "Личные данные",
@@ -147,11 +149,13 @@ export const contactsDataForm = {
title: "Телефон", title: "Телефон",
fieldName: "Телефон", fieldName: "Телефон",
kind: "PHONE", kind: "PHONE",
rules: [(val) => ruleLengthValue(val, 18)],
inputMask: "+7 (###) ###-##-##", inputMask: "+7 (###) ###-##-##",
}, },
emails: { emails: {
title: "Почта", title: "Почта",
fieldName: "Email", fieldName: "Email",
rules: [(val) => ruleEmailValue(val)],
kind: "EMAIL", kind: "EMAIL",
}, },
networks: { networks: {

View File

@@ -0,0 +1,19 @@
export function ruleNotValue(val, text) {
return val || text || false;
}
export function ruleLengthValue(val, minLength, text) {
return (val && val.length === minLength) || text || false;
}
export function ruleEmailValue(val, text) {
return (
(val &&
val.length < 100 &&
val.includes("@") &&
val.match(/@(?=\S+)/) &&
val.match(/(?<=\S+)@/)) ||
text ||
false
);
}

View File

@@ -1,5 +1,5 @@
import { fetchWrapper } from "../fetchWrapper"; import { fetchWrapper } from "../fetchWrapper";
import { removeEmptyFields } from "./changesObjects"; import { removeEmptyFields, checkChangeData } from "./changesObjects";
export function getRequestChangeData( export function getRequestChangeData(
createData, createData,
@@ -26,3 +26,39 @@ export function getRequestChangeData(
} }
return Promise.resolve(); return Promise.resolve();
} }
export function getRequestArrayData(
initData,
updateData,
updateName,
idUpdateName,
api,
key
) {
const deleteRequests = initData
.filter((el) => !updateData.find((data) => data.id === el.id))
.map((el) => fetchWrapper.del(`${api}/${key}/${el.id}/delete/`));
const requests = updateData.map((el) => {
const requestObj = {
[updateName]: idUpdateName,
...el,
};
delete requestObj.id;
if (!el?.id) {
return fetchWrapper.post(`${api}/${key}/create/`, { ...requestObj });
}
if (
el?.id &&
checkChangeData(
initData.find((obj) => obj.id === el.id),
el
)
) {
return fetchWrapper.post(`${api}/${key}/${el.id}/update/`, {
...requestObj,
});
}
return Promise.resolve();
});
return requests.concat(deleteRequests);
}

View File

@@ -239,46 +239,6 @@ const actions = {
localStorage.removeItem("medicalId"); localStorage.removeItem("medicalId");
}); });
}, },
updateContactsData({ commit, state }) {
const personId = state.medicalCard.person.id;
const initContacts = state.medicalCard.person.contacts;
const allNewContacts = [
...state.contactsData.phones,
...state.contactsData.emails,
...state.contactsData.networks,
];
let requestDelete = initContacts
.filter((el) => !allNewContacts.find((newNet) => newNet.id === el.id))
.map((el) => fetchWrapper.del(`general/contact/${el.id}/delete/`));
const request = allNewContacts
.map((contact) => {
let initNetwork = initContacts.find((el) => el.id === contact.id);
if (!contact.id && contact.username && contact.kind) {
return fetchWrapper.post(`general/contact/create/`, {
person: personId,
username: contact.username,
kind: contact.kind,
});
}
if (
contact.id &&
contact.username &&
contact.username !== initNetwork.username
) {
return fetchWrapper.post(`general/contact/${contact.id}/update/`, {
person: personId,
username: contact.username,
kind: contact.kind,
});
}
return Promise.resolve();
})
.concat(requestDelete);
return Promise.allSettled(request).then(() =>
actions.getMedicalCardData({ commit })
);
},
}; };
const mutations = { const mutations = {