Compare commits
33 Commits
10-editing
...
create_cli
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eba11136e1 | ||
|
|
71c6ba7a74 | ||
|
|
1ee0e8f0e8 | ||
|
|
85b68c726b | ||
|
|
11d7f0af42 | ||
|
|
b7c45e80c3 | ||
|
|
4915cf2506 | ||
|
|
dc65af6c83 | ||
|
|
66efe5bc95 | ||
|
|
e7b9cce5a2 | ||
|
|
15e31ebcd7 | ||
|
|
d1c5dc5683 | ||
|
|
cb41a00ae1 | ||
|
|
4987a3ae09 | ||
|
|
817f881159 | ||
|
|
332fff778a | ||
|
|
564b250b66 | ||
|
|
e9810c91cf | ||
|
|
1f47f9abe6 | ||
|
|
bc5c694657 | ||
|
|
6337aa80dd | ||
|
|
fbb89646ea | ||
|
|
65918134ec | ||
|
|
e3ad1396b6 | ||
|
|
15cb788fcc | ||
|
|
b7af4b15ca | ||
|
|
37f5520796 | ||
|
|
715fc9824e | ||
|
|
8691790a53 | ||
|
|
f459620040 | ||
|
|
dcbbf20916 | ||
|
|
7f655dcdc9 | ||
|
|
c866662384 |
@@ -2,3 +2,16 @@ include:
|
|||||||
- project: 'astra/microservice-ci'
|
- project: 'astra/microservice-ci'
|
||||||
ref: main
|
ref: main
|
||||||
file: '/templates/microservice.yaml'
|
file: '/templates/microservice.yaml'
|
||||||
|
|
||||||
|
#e2e-dev:
|
||||||
|
# image: node:18.10.0
|
||||||
|
# stage: deploy
|
||||||
|
# dependencies:
|
||||||
|
# - deploy-dev
|
||||||
|
# only:
|
||||||
|
# - master
|
||||||
|
# services:
|
||||||
|
# - selenium/standalone-chrome
|
||||||
|
# script:
|
||||||
|
# - npm ci
|
||||||
|
# - npm run test:e2e --host=selenium__standalone-chrome --baseUrl=https://astra-dev.dopcore.com
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:16-alpine AS builder
|
FROM docker.io/node:16-alpine AS builder
|
||||||
|
|
||||||
WORKDIR /front
|
WORKDIR /front
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ COPY . .
|
|||||||
RUN npm ci
|
RUN npm ci
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
FROM nginx:1.21.6-alpine as runner
|
FROM docker.io/nginx:1.21.6-alpine as runner
|
||||||
|
|
||||||
COPY ./deploy/nginx.conf /etc/nginx/nginx.conf
|
COPY ./deploy/nginx.conf /etc/nginx/nginx.conf
|
||||||
COPY --from=builder /front/dist /var/www/html
|
COPY --from=builder /front/dist /var/www/html
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ .Values.app.fullName }}
|
name: {{ .Values.app.fullName }}
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- port: {{ .Values.app.server.port }}
|
- port: {{ .Values.app.server.port }}
|
||||||
|
|||||||
8842
package-lock.json
generated
8842
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve",
|
"serve": "vue-cli-service serve",
|
||||||
"build": "vue-cli-service build",
|
"build": "vue-cli-service build",
|
||||||
"lint": "vue-cli-service lint"
|
"lint": "vue-cli-service lint",
|
||||||
|
"test:e2e": "wdio run ./wdio.conf.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dop/astra-ui": "^0.2.5",
|
"@dop/astra-ui": "^0.2.5",
|
||||||
@@ -24,6 +25,10 @@
|
|||||||
"@vue/cli-plugin-eslint": "~5.0.0",
|
"@vue/cli-plugin-eslint": "~5.0.0",
|
||||||
"@vue/cli-plugin-vuex": "^5.0.8",
|
"@vue/cli-plugin-vuex": "^5.0.8",
|
||||||
"@vue/cli-service": "~5.0.0",
|
"@vue/cli-service": "~5.0.0",
|
||||||
|
"@wdio/cli": "^8.16.3",
|
||||||
|
"@wdio/jasmine-framework": "^8.16.3",
|
||||||
|
"@wdio/local-runner": "^8.16.3",
|
||||||
|
"@wdio/spec-reporter": "^8.16.3",
|
||||||
"@webdiscus/pug-loader": "^2.9.4",
|
"@webdiscus/pug-loader": "^2.9.4",
|
||||||
"eslint": "^8.25.0",
|
"eslint": "^8.25.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
import TheHeader from "@/components/TheHeader";
|
import TheHeader from "@/components/TheHeader";
|
||||||
import TheSidebar from "@/components/TheSidebar";
|
import TheSidebar from "@/components/TheSidebar";
|
||||||
import TheNotificationProvider from "@/components/Notifications/TheNotificationProvider";
|
import TheNotificationProvider from "@/components/Notifications/TheNotificationProvider";
|
||||||
|
import { mapState } from "vuex";
|
||||||
export default {
|
export default {
|
||||||
name: "LoggedInLayout",
|
name: "LoggedInLayout",
|
||||||
components: { TheNotificationProvider, TheHeader, TheSidebar },
|
components: { TheNotificationProvider, TheHeader, TheSidebar },
|
||||||
@@ -33,10 +33,14 @@ export default {
|
|||||||
return {
|
return {
|
||||||
isOpenForm: false,
|
isOpenForm: false,
|
||||||
updatedClients: false,
|
updatedClients: false,
|
||||||
url: "https://astra-dev.dopcore.com/api/store/",
|
|
||||||
createdClientId: "",
|
createdClientId: "",
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
url: (state) => state.imgUrl,
|
||||||
|
}),
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
openForm() {
|
openForm() {
|
||||||
this.isOpenForm = true;
|
this.isOpenForm = true;
|
||||||
|
|||||||
183
src/components/PatientCreationForm.vue
Normal file
183
src/components/PatientCreationForm.vue
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
<template lang="pug">
|
||||||
|
.flex.flex-col.pt-6.gap-y-4(:style="{maxWidth: '682px'}")
|
||||||
|
base-input-full-name(v-model="patientData" )
|
||||||
|
.flex.flex-col.flex-auto.l.gap-y-8
|
||||||
|
.flex
|
||||||
|
button.title-info.px-6.py-2.cursor-pointer.w-full.text-sm(
|
||||||
|
v-for="form in forms",
|
||||||
|
@click="selectForm(form.component)",
|
||||||
|
:class="{active: form.component === currentForm}",
|
||||||
|
:key="form.id",
|
||||||
|
:id="form.id",
|
||||||
|
:disabled="form.disabled"
|
||||||
|
) {{form.title}}
|
||||||
|
component(
|
||||||
|
v-bind:is="currentForm",
|
||||||
|
v-model="patientData"
|
||||||
|
)
|
||||||
|
.footer.flex.gap-2
|
||||||
|
base-button(type="secondary", label="Отменить", width="126px", @click="$emit('close')")
|
||||||
|
base-button(width="168px", label="Создать", @click="createPatient")
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { v_model } from "@/shared/mixins/v-model";
|
||||||
|
import FormCreateBasicInfo from "@/pages/clients/components/FormCreateBasicInfo.vue";
|
||||||
|
import FormCreateIdentityDocuments from "@/pages/clients/components/FormCreateIdentityDocuments.vue";
|
||||||
|
import FormCreateAddresses from "@/pages/clients/components/FormCreateAddresses.vue";
|
||||||
|
import FormCreateAttachments from "@/pages/clients/components/FormCreateAttachments.vue";
|
||||||
|
import BaseInputFullName from "@/components/base/BaseInputFullName.vue";
|
||||||
|
import HeaderRecordForm from "../pages/newCalendar/components/HeaderRecordForm.vue";
|
||||||
|
import BaseCalendar from "@/components/base/Calendar/BaseCalendar.vue";
|
||||||
|
import BaseButton from "@/components/base/BaseButton.vue";
|
||||||
|
import BaseModal from "@/components/base/BaseModal.vue";
|
||||||
|
import ServicesModal from "../pages/newCalendar/components/ServicesModal.vue";
|
||||||
|
import { fetchWrapper } from "@/shared/fetchWrapper";
|
||||||
|
|
||||||
|
const forms = [
|
||||||
|
{
|
||||||
|
title: "Основное",
|
||||||
|
id: "basic",
|
||||||
|
component: "form-create-basic-info",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "ДУЛ",
|
||||||
|
id: "doc",
|
||||||
|
component: "form-create-identity-documents",
|
||||||
|
disabled: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Адрес",
|
||||||
|
id: "address",
|
||||||
|
component: "form-create-addresses",
|
||||||
|
disabled: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Дополнительное",
|
||||||
|
id: "additional",
|
||||||
|
component: "form-create-attachments",
|
||||||
|
disabled: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "PatientCreationForm",
|
||||||
|
components: {
|
||||||
|
FormCreateBasicInfo,
|
||||||
|
FormCreateIdentityDocuments,
|
||||||
|
FormCreateAddresses,
|
||||||
|
FormCreateAttachments,
|
||||||
|
BaseInputFullName,
|
||||||
|
BaseCalendar,
|
||||||
|
HeaderRecordForm,
|
||||||
|
BaseButton,
|
||||||
|
BaseModal,
|
||||||
|
ServicesModal,
|
||||||
|
},
|
||||||
|
emits: ["close"],
|
||||||
|
mixins: [v_model],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
patientData: {
|
||||||
|
full_name: "",
|
||||||
|
phone: "",
|
||||||
|
birth_date: "",
|
||||||
|
},
|
||||||
|
currentForm: "form-create-basic-info",
|
||||||
|
forms,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
nameObject() {
|
||||||
|
const nameArr = this.patientData?.full_name?.split(" ");
|
||||||
|
return {
|
||||||
|
last_name: nameArr?.[0] || "",
|
||||||
|
first_name: nameArr?.[1] || "",
|
||||||
|
patronymic: nameArr?.[2] || "",
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async createPatient() {
|
||||||
|
const body = {
|
||||||
|
...this.nameObject,
|
||||||
|
};
|
||||||
|
if (this.patientData.phone) {
|
||||||
|
body.contacts = [
|
||||||
|
{
|
||||||
|
category: "PHONE",
|
||||||
|
value: this.patientData.phone,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
if (this.patientData.birth_date)
|
||||||
|
body.birth_date = this.patientData.birth_date;
|
||||||
|
const data = await fetchWrapper.post("persons/", body);
|
||||||
|
this.$emit("close", data);
|
||||||
|
},
|
||||||
|
handleChangePatientData(val) {
|
||||||
|
this.patientData = { ...this.patientData, ...val };
|
||||||
|
},
|
||||||
|
selectForm(componentName) {
|
||||||
|
this.currentForm = this.forms.find(
|
||||||
|
(elem) => elem.component === componentName
|
||||||
|
)?.component;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass" scoped>
|
||||||
|
.dark-blue
|
||||||
|
color: var(--font-dark-blue-color)
|
||||||
|
min-width: 50px
|
||||||
|
|
||||||
|
.text
|
||||||
|
color: var(--font-grey-color)
|
||||||
|
width: 76px
|
||||||
|
|
||||||
|
.change
|
||||||
|
background: var(--bg-light-grey)
|
||||||
|
color: var(--font-grey-color)
|
||||||
|
|
||||||
|
.services
|
||||||
|
background: var(--bg-light-grey)
|
||||||
|
color: var(--font-grey-color)
|
||||||
|
width: 560px
|
||||||
|
|
||||||
|
.service
|
||||||
|
display: -webkit-box
|
||||||
|
overflow: hidden
|
||||||
|
|
||||||
|
.gradient
|
||||||
|
width: 10%
|
||||||
|
height: 28px
|
||||||
|
right: 0
|
||||||
|
|
||||||
|
.other
|
||||||
|
width: 46px
|
||||||
|
background: var(--bg-light-grey)
|
||||||
|
|
||||||
|
.price
|
||||||
|
background: var(--bg-light-grey)
|
||||||
|
width: 82px
|
||||||
|
color: var(--font-grey-color)
|
||||||
|
|
||||||
|
.title-info
|
||||||
|
color: var(--font-grey-color)
|
||||||
|
border-bottom: 1.5px solid var(--font-grey-color)
|
||||||
|
&:hover
|
||||||
|
color: var(--btn-blue-color)
|
||||||
|
border-bottom: 1.5px solid var(--btn-blue-color)
|
||||||
|
&.active
|
||||||
|
color: var(--btn-blue-color)
|
||||||
|
border-bottom: 1.5px solid var(--btn-blue-color)
|
||||||
|
|
||||||
|
.footer
|
||||||
|
border-top: 1px solid var(--border-light-grey-color)
|
||||||
|
margin: 40px -32px 0px
|
||||||
|
padding: 16px 32px 0px 32px
|
||||||
|
|
||||||
|
.icon :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
|
</style>
|
||||||
@@ -70,17 +70,9 @@ export default {
|
|||||||
return this.pageSettings.find((el) => el.id === "settings");
|
return this.pageSettings.find((el) => el.id === "settings");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
|
||||||
let href = window.location.href.slice(22);
|
|
||||||
this.pageSettings.forEach((el, index) => {
|
|
||||||
el.path === href.substr(href.lastIndexOf("#"))
|
|
||||||
? (this.pageSettings[index].active = true)
|
|
||||||
: (this.pageSettings[index].active = false);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
watch: {
|
watch: {
|
||||||
"$route.path"() {
|
"$route.path"(value) {
|
||||||
if (this.$router.currentRoute._value.fullPath === "/calendar") {
|
if (value === "/calendar") {
|
||||||
this.currentPageBorder = true;
|
this.currentPageBorder = true;
|
||||||
this.pageSettings.forEach((el) =>
|
this.pageSettings.forEach((el) =>
|
||||||
el.path === "#/calendar" ? (el.active = true) : (el.active = false)
|
el.path === "#/calendar" ? (el.active = true) : (el.active = false)
|
||||||
@@ -88,6 +80,13 @@ export default {
|
|||||||
} else this.currentPageBorder = false;
|
} else this.currentPageBorder = false;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
this.pageSettings.forEach((el, index) => {
|
||||||
|
el.path === "#" + this.$route.path
|
||||||
|
? (this.pageSettings[index].active = true)
|
||||||
|
: (this.pageSettings[index].active = false);
|
||||||
|
});
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
iconLeft
|
iconLeft
|
||||||
)
|
)
|
||||||
template(v-slot:iconLeft)
|
template(v-slot:iconLeft)
|
||||||
q-icon(name="app:icon-search", size="20px", style="color: var(--font-grey-color)")
|
q-icon.icon(name="app:search", size="20px", style="color: var(--font-grey-color)")
|
||||||
.field.flex.flex-col.overflow-y-scroll(:class="{'filed-category': findSelected(selected?.id)}")
|
.field.flex.flex-col.overflow-y-scroll(:class="{'filed-category': findSelected(selected?.id)}")
|
||||||
.flex.items-center(v-for="benefit in benefitData", :key="benefit.id")
|
.flex.items-center(v-for="benefit in benefitData", :key="benefit.id")
|
||||||
q-item(tag="label", :style="{alignItems: benefit.name.length > 28 ? 'start' : 'center'}")
|
q-item(tag="label", :style="{alignItems: benefit.name.length > 28 ? 'start' : 'center'}")
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
@click="saveCategories(selected)"
|
@click="saveCategories(selected)"
|
||||||
)
|
)
|
||||||
.right-side.flex.px-10.font-bold.relative
|
.right-side.flex.px-10.font-bold.relative
|
||||||
q-icon(name="app:icon-cancel").text-sm.absolute.top-4.right-4.cursor-pointer(@click="closeModalCategories")
|
q-icon(name="app:cancel").text-sm.absolute.top-4.right-4.cursor-pointer(@click="closeModalCategories")
|
||||||
.flex.gap-y-6.flex-col.w-full(v-if="selected?.id && selected?.name !== 'Без льготы'")
|
.flex.gap-y-6.flex-col.w-full(v-if="selected?.id && selected?.name !== 'Без льготы'")
|
||||||
.right-header.flex
|
.right-header.flex
|
||||||
span.text-6xl {{selected?.name}}
|
span.text-6xl {{selected?.name}}
|
||||||
@@ -185,6 +185,9 @@ export default {
|
|||||||
.grey-color
|
.grey-color
|
||||||
color: var(--font-grey-color)
|
color: var(--font-grey-color)
|
||||||
|
|
||||||
|
.icon :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
|
|
||||||
.q-item
|
.q-item
|
||||||
padding: 0
|
padding: 0
|
||||||
min-height: 40px
|
min-height: 40px
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ export default {
|
|||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
type: {
|
type: {
|
||||||
|
type: String,
|
||||||
default: "text",
|
default: "text",
|
||||||
},
|
},
|
||||||
accept: {
|
accept: {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
:readonly="readonly",
|
:readonly="readonly",
|
||||||
:disable="disabled",
|
:disable="disabled",
|
||||||
mask="##.##.####",
|
mask="##.##.####",
|
||||||
:rules="[checkInput]",
|
:rules="[(val) => rule ? rule(val) : defaultRule(val)]",
|
||||||
:lazy-rules="lazyRule",
|
:lazy-rules="lazyRule",
|
||||||
:item-aligned="itemAligned",
|
:item-aligned="itemAligned",
|
||||||
no-error-icon,
|
no-error-icon,
|
||||||
@@ -60,7 +60,8 @@ export default {
|
|||||||
width: Number,
|
width: Number,
|
||||||
lazyRule: [Boolean, String],
|
lazyRule: [Boolean, String],
|
||||||
itemAligned: Boolean,
|
itemAligned: Boolean,
|
||||||
modelValue: Date,
|
rule: Function,
|
||||||
|
modelValue: String,
|
||||||
placeholder: String,
|
placeholder: String,
|
||||||
disabled: Boolean,
|
disabled: Boolean,
|
||||||
label: String,
|
label: String,
|
||||||
@@ -79,27 +80,15 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
value: {
|
value: {
|
||||||
get() {
|
get() {
|
||||||
if (
|
this.changeInternalDate(
|
||||||
moment(this.modelValue).isValid() &&
|
moment(this.checkFormat(this.modelValue)).isValid()
|
||||||
typeof this.modelValue === "object"
|
? moment(this.modelValue)
|
||||||
) {
|
|
||||||
this.changeInternalDate(moment(this.modelValue));
|
|
||||||
return moment(this.modelValue).format("DD.MM.YYYY");
|
|
||||||
}
|
|
||||||
if (moment(this.convertFormat(this.modelValue)).isValid()) {
|
|
||||||
this.changeInternalDate(moment(this.modelValue));
|
|
||||||
return this.modelValue;
|
|
||||||
}
|
|
||||||
this.changeInternalDate(null);
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
set(value) {
|
|
||||||
this.$emit(
|
|
||||||
"update:modelValue",
|
|
||||||
moment(this.convertFormat(value)).isValid()
|
|
||||||
? new Date(moment(this.convertFormat(value)))
|
|
||||||
: null
|
: null
|
||||||
);
|
);
|
||||||
|
return this.convertISOFormat(this.modelValue);
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
this.$emit("update:modelValue", this.convertRUFormat(value));
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
sizeVariable() {
|
sizeVariable() {
|
||||||
@@ -148,13 +137,22 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
convertFormat(date) {
|
convertISOFormat(date) {
|
||||||
return date && date?.length === 10
|
return date?.split("-")?.reverse()?.join(".");
|
||||||
? date.split(".").reverse().join("-")
|
|
||||||
: null;
|
|
||||||
},
|
},
|
||||||
checkInput(val) {
|
convertRUFormat(date) {
|
||||||
return moment(this.convertFormat(val)).isValid();
|
return date?.split(".")?.reverse()?.join("-");
|
||||||
|
},
|
||||||
|
checkFormat(date) {
|
||||||
|
return date && date?.length === 10 ? date : null;
|
||||||
|
},
|
||||||
|
defaultRule(val) {
|
||||||
|
return (
|
||||||
|
!val ||
|
||||||
|
moment(
|
||||||
|
this.checkFormat(val) ? this.convertRUFormat(val) : null
|
||||||
|
).isValid()
|
||||||
|
);
|
||||||
},
|
},
|
||||||
closeCalendar() {
|
closeCalendar() {
|
||||||
this.calendarVisibility = false;
|
this.calendarVisibility = false;
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
padding="2px 0 0 0"
|
padding="2px 0 0 0"
|
||||||
)
|
)
|
||||||
q-icon(name="app:ok", size="20px")
|
q-icon(name="app:ok", size="20px")
|
||||||
base-input.w-full(v-model="infoClient.basic.full_name", placeholder="ФИО пациента*", size="M")
|
base-input.w-full(v-model="value.full_name", placeholder="ФИО пациента*", size="M")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -49,11 +49,12 @@ import BaseModal from "./BaseModal.vue";
|
|||||||
import addImageIcon from "@/assets/icons/photo.svg";
|
import addImageIcon from "@/assets/icons/photo.svg";
|
||||||
import BaseButton from "@/components/base/BaseButton.vue";
|
import BaseButton from "@/components/base/BaseButton.vue";
|
||||||
import BaseInput from "@/components/base/BaseInput.vue";
|
import BaseInput from "@/components/base/BaseInput.vue";
|
||||||
|
import { v_model } from "@/shared/mixins/v-model";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "BaseInputFullName",
|
name: "BaseInputFullName",
|
||||||
components: { BaseModal, BaseInput, BaseButton },
|
components: { BaseModal, BaseInput, BaseButton },
|
||||||
props: { infoClient: Object },
|
mixins: [v_model],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
defaultIcon: addImageIcon,
|
defaultIcon: addImageIcon,
|
||||||
|
|||||||
@@ -15,9 +15,8 @@
|
|||||||
:popup-content-style="{height: candidates?.length > 3 ? '216px' : ''}"
|
:popup-content-style="{height: candidates?.length > 3 ? '216px' : ''}"
|
||||||
v-model="value"
|
v-model="value"
|
||||||
ref="selectRef"
|
ref="selectRef"
|
||||||
|
@blur="pasteFullName"
|
||||||
)
|
)
|
||||||
//template(#selected)
|
|
||||||
// .text-dark.text-sm.font-medium(v-if="person") {{ person.last_name + ' ' + person.first_name + ' ' + person.patronymic }}
|
|
||||||
template(v-slot:iconLeft)
|
template(v-slot:iconLeft)
|
||||||
q-icon.search-icon(name="app:search", size="20px")
|
q-icon.search-icon(name="app:search", size="20px")
|
||||||
template(v-slot:customOption="{props, data}")
|
template(v-slot:customOption="{props, data}")
|
||||||
@@ -48,7 +47,7 @@ export default {
|
|||||||
BaseSelect,
|
BaseSelect,
|
||||||
},
|
},
|
||||||
mixins: [v_model],
|
mixins: [v_model],
|
||||||
emits: ["createPerson"],
|
emits: ["create-person"],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
fullName: "",
|
fullName: "",
|
||||||
@@ -60,6 +59,7 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
pickedFullName() {
|
pickedFullName() {
|
||||||
|
if (!this.value.first_name) return "";
|
||||||
return (
|
return (
|
||||||
this.value.last_name +
|
this.value.last_name +
|
||||||
" " +
|
" " +
|
||||||
@@ -70,13 +70,14 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
pickedFullName(val) {
|
pickedFullName() {
|
||||||
this.$refs?.selectRef?.updateInputValue(val, true);
|
this.pasteFullName();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
createPerson() {
|
createPerson() {
|
||||||
this.$emit("createPerson");
|
this.$refs?.selectRef?.hidePopup();
|
||||||
|
this.$emit("create-person");
|
||||||
},
|
},
|
||||||
filterFn(val, update) {
|
filterFn(val, update) {
|
||||||
fetchWrapper.get(`persons/?full_name=${val}`).then((result) => {
|
fetchWrapper.get(`persons/?full_name=${val}`).then((result) => {
|
||||||
@@ -87,8 +88,10 @@ export default {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
test(slotProps) {
|
pasteFullName() {
|
||||||
console.log(slotProps);
|
this.$nextTick(() => {
|
||||||
|
this.$refs?.selectRef?.updateInputValue(this.pickedFullName, true);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,8 +20,9 @@
|
|||||||
:placeholder="useInput && placeholder ? placeholder : ''",
|
:placeholder="useInput && placeholder ? placeholder : ''",
|
||||||
@filter="filterFn",
|
@filter="filterFn",
|
||||||
:popup-content-style="popupContentStyle"
|
:popup-content-style="popupContentStyle"
|
||||||
|
@blur="$emit('blur')"
|
||||||
)
|
)
|
||||||
template(v-slot:selected)
|
template(#selected)
|
||||||
slot(name="selected")
|
slot(name="selected")
|
||||||
template(v-slot:option="scope", v-if="!customOption")
|
template(v-slot:option="scope", v-if="!customOption")
|
||||||
q-item(v-bind="scope.itemProps", style="justify-content: center", v-if="value?.icon")
|
q-item(v-bind="scope.itemProps", style="justify-content: center", v-if="value?.icon")
|
||||||
@@ -79,7 +80,7 @@ export default {
|
|||||||
filterFn: Function,
|
filterFn: Function,
|
||||||
popupContentStyle: Object,
|
popupContentStyle: Object,
|
||||||
},
|
},
|
||||||
emits: ["update:modelValue"],
|
emits: ["update:modelValue", "blur"],
|
||||||
computed: {
|
computed: {
|
||||||
value: {
|
value: {
|
||||||
get() {
|
get() {
|
||||||
@@ -163,6 +164,9 @@ export default {
|
|||||||
updateInputValue(value, noFilter) {
|
updateInputValue(value, noFilter) {
|
||||||
this.$refs?.selectRef?.updateInputValue(value, noFilter);
|
this.$refs?.selectRef?.updateInputValue(value, noFilter);
|
||||||
},
|
},
|
||||||
|
hidePopup() {
|
||||||
|
this.$refs?.selectRef?.hidePopup();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
round,
|
round,
|
||||||
padding="2px 0 0 0"
|
padding="2px 0 0 0"
|
||||||
)
|
)
|
||||||
q-icon(name="app:ok", size="20px")
|
q-icon.icon(name="app:ok", size="40px")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -118,4 +118,7 @@ export default {
|
|||||||
min-height: 400px
|
min-height: 400px
|
||||||
height: 100%
|
height: 100%
|
||||||
border-radius: 50%
|
border-radius: 50%
|
||||||
|
|
||||||
|
.icon :deep(path)
|
||||||
|
fill: var(--default-white)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template lang="pug">
|
<template lang="pug">
|
||||||
.wrapper-addresses.h-full
|
.wrapper-form.h-full
|
||||||
.flex.flex-col.gap-y-6
|
.flex.flex-col.gap-y-6
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.full_address",
|
v-model="form.full_address",
|
||||||
placeholder="Введите адрес целиком",
|
placeholder="Введите адрес целиком",
|
||||||
label="Полный адрес",
|
label="Полный адрес",
|
||||||
size="M"
|
size="M"
|
||||||
@@ -12,42 +12,42 @@
|
|||||||
span.text-sm.separator.px-2 или
|
span.text-sm.separator.px-2 или
|
||||||
.grid.grid-cols-2.gap-y-6.gap-x-4
|
.grid.grid-cols-2.gap-y-6.gap-x-4
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.city",
|
v-model="form.city",
|
||||||
label="Город",
|
label="Город",
|
||||||
placeholder="Введите город",
|
placeholder="Введите город",
|
||||||
disabled,
|
disabled,
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.region",
|
v-model="form.region",
|
||||||
label="Область",
|
label="Область",
|
||||||
placeholder="Введите область",
|
placeholder="Введите область",
|
||||||
disabled,
|
disabled,
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.street",
|
v-model="form.street",
|
||||||
label="Улица",
|
label="Улица",
|
||||||
placeholder="Введите улицу",
|
placeholder="Введите улицу",
|
||||||
disabled,
|
disabled,
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.house",
|
v-model="form.house",
|
||||||
label="Дом",
|
label="Дом",
|
||||||
placeholder="Номер дома",
|
placeholder="Номер дома",
|
||||||
disabled,
|
disabled,
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.flat",
|
v-model="form.flat",
|
||||||
label="Квартира",
|
label="Квартира",
|
||||||
placeholder="Номер квартиры",
|
placeholder="Номер квартиры",
|
||||||
disabled,
|
disabled,
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="addresses.zip_code",
|
v-model="form.zip_code",
|
||||||
label="Индекс",
|
label="Индекс",
|
||||||
mask="######",
|
mask="######",
|
||||||
placeholder="000000",
|
placeholder="000000",
|
||||||
@@ -63,17 +63,32 @@ import BaseInput from "@/components/base/BaseInput.vue";
|
|||||||
export default {
|
export default {
|
||||||
name: "FormCreateAddresses",
|
name: "FormCreateAddresses",
|
||||||
components: { BaseInput, BaseCustomSelect },
|
components: { BaseInput, BaseCustomSelect },
|
||||||
props: {
|
emits: ["change"],
|
||||||
addresses: Object,
|
data() {
|
||||||
saveClient: Function,
|
return {
|
||||||
saveFile: Function,
|
form: {
|
||||||
|
full_address: "",
|
||||||
|
city: "",
|
||||||
|
region: "",
|
||||||
|
street: "",
|
||||||
|
house: "",
|
||||||
|
flat: "",
|
||||||
|
zip_code: "",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
form(val) {
|
||||||
|
this.$emit("change", val);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass" scoped>
|
<style lang="sass" scoped>
|
||||||
.wrapper-addresses
|
.wrapper-form
|
||||||
height: 380px
|
height: 380px
|
||||||
|
width: 570px
|
||||||
overflow-y: auto
|
overflow-y: auto
|
||||||
&::-webkit-scrollbar
|
&::-webkit-scrollbar
|
||||||
width: 4px
|
width: 4px
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
.wrapper.flex.flex-col.flex-auto.h-full.gap-y-8.justify-between
|
.wrapper.flex.flex-col.flex-auto.h-full.gap-y-8.justify-between
|
||||||
.place.flex.flex-col.justify-center.items-center.py-3
|
.place.flex.flex-col.justify-center.items-center.py-3
|
||||||
.upload.text-center.text-sm.flex.w-fit
|
.upload.text-center.text-sm.flex.w-fit
|
||||||
input.hidden(@change="(e) => addAttachment(e)" type="file" id="file-upload")
|
input.hidden(@change="() => {}" type="file" id="file-upload")
|
||||||
span Загрузите элемент
|
span Загрузите элемент
|
||||||
label.label.cursor-pointer(for="file-upload") с компьютера
|
label.label.cursor-pointer(for="file-upload") с компьютера
|
||||||
span или перетащите их сюда
|
span или перетащите их сюда
|
||||||
@@ -11,9 +11,6 @@
|
|||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: "FormCreateAttachments",
|
name: "FormCreateAttachments",
|
||||||
props: {
|
|
||||||
addAttachment: Function,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,46 +1,21 @@
|
|||||||
<template lang="pug">
|
<template lang="pug">
|
||||||
.wrapper-info.h-full
|
.wrapper-info
|
||||||
.grid.grid-cols-2.gap-x-4.gap-y-6
|
.grid.grid-cols-2.gap-x-4.gap-y-6
|
||||||
base-select(
|
|
||||||
:items="priorityList",
|
|
||||||
placeholder="Приоритет клиента",
|
|
||||||
v-model="basicInfo.priority",
|
|
||||||
label="Приоритет",
|
|
||||||
size="M"
|
|
||||||
)
|
|
||||||
base-input-date(
|
base-input-date(
|
||||||
v-model="basicInfo.birth_date",
|
v-model="value.birth_date",
|
||||||
size="M",
|
size="M",
|
||||||
important,
|
important,
|
||||||
label="Дата рождения",
|
label="Дата рождения",
|
||||||
placeholder="Дата рождения"
|
placeholder="Дата рождения"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="phone.username",
|
v-model="value.phone",
|
||||||
placeholder="+7 (915) 644–92–23",
|
placeholder="+7 (915) 644–92–23",
|
||||||
mask="+7 (###) ###-##-##",
|
mask="+7 (###) ###-##-##",
|
||||||
label="Номер телефона",
|
label="Номер телефона",
|
||||||
size="M",
|
size="M",
|
||||||
important
|
important
|
||||||
)
|
)
|
||||||
base-input(
|
|
||||||
v-model="email.username",
|
|
||||||
placeholder="user@yandex.ru",
|
|
||||||
label="Email",
|
|
||||||
important,
|
|
||||||
size="M",
|
|
||||||
)
|
|
||||||
.flex.flex-col.col-start-1.col-end-3.w-100(class="gap-y-1.5")
|
|
||||||
span.text-sm.font-semibold.opacity-40.input-info Ссылки на соцсети
|
|
||||||
.flex(class="gap-x-1.5" v-for="network in basicInfo.contacts" :key="network.kind.id")
|
|
||||||
base-adding-network(
|
|
||||||
:items="networksList",
|
|
||||||
:network="network",
|
|
||||||
)
|
|
||||||
span.add-network.cursor-pointer(
|
|
||||||
v-show="networksList.length !== 0",
|
|
||||||
@click="addNetwork"
|
|
||||||
) Добавить соцсеть
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -48,6 +23,7 @@ import BaseAddingNetwork from "@/components/base/BaseAddingNetwork";
|
|||||||
import BaseSelect from "@/components/base/BaseSelect";
|
import BaseSelect from "@/components/base/BaseSelect";
|
||||||
import BaseInput from "@/components/base/BaseInput.vue";
|
import BaseInput from "@/components/base/BaseInput.vue";
|
||||||
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
||||||
|
import { v_model } from "@/shared/mixins/v-model";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "FormCreateBasicInfo",
|
name: "FormCreateBasicInfo",
|
||||||
@@ -57,22 +33,12 @@ export default {
|
|||||||
BaseSelect,
|
BaseSelect,
|
||||||
BaseInputDate,
|
BaseInputDate,
|
||||||
},
|
},
|
||||||
props: {
|
mixins: [v_model],
|
||||||
priorityList: Array,
|
|
||||||
phone: Object,
|
|
||||||
email: Object,
|
|
||||||
basicInfo: Object,
|
|
||||||
saveClient: Function,
|
|
||||||
addNetwork: Function,
|
|
||||||
networksList: Array,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="sass" scoped>
|
<style lang="sass" scoped>
|
||||||
.wrapper-info
|
.wrapper-info
|
||||||
max-height: 336px
|
|
||||||
min-height: 272px
|
|
||||||
overflow-y: auto
|
overflow-y: auto
|
||||||
&::-webkit-scrollbar
|
&::-webkit-scrollbar
|
||||||
width: 4px
|
width: 4px
|
||||||
|
|||||||
@@ -4,27 +4,27 @@
|
|||||||
span.title-info.text-base.font-bold Паспортные данные
|
span.title-info.text-base.font-bold Паспортные данные
|
||||||
.grid.grid-cols-2.gap-x-4.gap-y-6
|
.grid.grid-cols-2.gap-x-4.gap-y-6
|
||||||
base-input(
|
base-input(
|
||||||
v-model="identityDocument.pass.series_number",
|
v-model="form.series_number",
|
||||||
mask="#### ######",
|
mask="#### ######",
|
||||||
placeholder="0000 000000",
|
placeholder="0000 000000",
|
||||||
label="Серия и номер",
|
label="Серия и номер",
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="identityDocument.pass.issued_by_org",
|
v-model="form.issued_by_org",
|
||||||
placeholder="Точно как в паспорте",
|
placeholder="Точно как в паспорте",
|
||||||
label="Кем выдан",
|
label="Кем выдан",
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="identityDocument.pass.issued_by_org_code",
|
v-model="form.issued_by_org_code",
|
||||||
mask="###-###",
|
mask="###-###",
|
||||||
placeholder="000–000",
|
placeholder="000–000",
|
||||||
label="Код подразделения",
|
label="Код подразделения",
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input-date(
|
base-input-date(
|
||||||
v-model="identityDocument.pass.issued_by_date",
|
v-model="form.issued_by_date",
|
||||||
placeholder="Дата",
|
placeholder="Дата",
|
||||||
label="Дата выдачи",
|
label="Дата выдачи",
|
||||||
size="M"
|
size="M"
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
span.title-info.text-base.font-bold СНИЛС и ИНН
|
span.title-info.text-base.font-bold СНИЛС и ИНН
|
||||||
.grid.grid-cols-2.gap-x-4.gap-y-6
|
.grid.grid-cols-2.gap-x-4.gap-y-6
|
||||||
base-input(
|
base-input(
|
||||||
v-model="identityDocument.snils.number",
|
v-model="form.snils",
|
||||||
mask="###-###-### ##",
|
mask="###-###-### ##",
|
||||||
placeholder="000–000–000 00",
|
placeholder="000–000–000 00",
|
||||||
label="Номер СНИЛС",
|
label="Номер СНИЛС",
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="identityDocument.inn.number",
|
v-model="form.inn",
|
||||||
placeholder="000000000000",
|
placeholder="000000000000",
|
||||||
mask="############",
|
mask="############",
|
||||||
label="Номер ИНН",
|
label="Номер ИНН",
|
||||||
@@ -57,9 +57,23 @@ import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
|||||||
export default {
|
export default {
|
||||||
name: "FormCreateIdentityDocuments",
|
name: "FormCreateIdentityDocuments",
|
||||||
components: { BaseInput, BaseInputDate },
|
components: { BaseInput, BaseInputDate },
|
||||||
props: {
|
emits: ["change"],
|
||||||
identityDocument: Object,
|
data() {
|
||||||
saveClient: Function,
|
return {
|
||||||
|
form: {
|
||||||
|
series_number: "",
|
||||||
|
issued_by_org: "",
|
||||||
|
issued_by_org_code: "",
|
||||||
|
issued_by_date: "",
|
||||||
|
snils: "",
|
||||||
|
inn: "",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
form(val) {
|
||||||
|
this.$emit("change", val);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -10,9 +10,11 @@
|
|||||||
)
|
)
|
||||||
template(#iconLeft)
|
template(#iconLeft)
|
||||||
q-icon.search-icon(name="app:search", size="20px")
|
q-icon.search-icon(name="app:search", size="20px")
|
||||||
base-button(width="216px", @click="openCreateMedcardPage")
|
base-button(width="216px", @click="showCreateModal = true")
|
||||||
q-icon.plus.mr-2(name="app:plus", size="24px")
|
q-icon.plus.mr-2(name="app:plus", size="24px")
|
||||||
span Создать медкарту
|
span Создать медкарту
|
||||||
|
base-modal(v-model="showCreateModal", title="Создать медицинскую карту", modal-padding)
|
||||||
|
patient-creation-form(@close="handleClosePatientForm")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -21,19 +23,37 @@ import BaseSelect from "@/components/base/BaseSelect.vue";
|
|||||||
import BaseButton from "@/components/base/BaseButton.vue";
|
import BaseButton from "@/components/base/BaseButton.vue";
|
||||||
|
|
||||||
import debounce from "lodash/debounce";
|
import debounce from "lodash/debounce";
|
||||||
|
import BaseModal from "@/components/base/BaseModal.vue";
|
||||||
|
import PatientCreationForm from "@/components/PatientCreationForm.vue";
|
||||||
|
import { mapActions } from "vuex";
|
||||||
export default {
|
export default {
|
||||||
name: "MedicalCardSearchHeader",
|
name: "MedicalCardSearchHeader",
|
||||||
components: { BaseInput, BaseSelect, BaseButton },
|
components: {
|
||||||
|
PatientCreationForm,
|
||||||
|
BaseModal,
|
||||||
|
BaseInput,
|
||||||
|
BaseSelect,
|
||||||
|
BaseButton,
|
||||||
|
},
|
||||||
emits: ["search"],
|
emits: ["search"],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
filterString: "",
|
filterString: "",
|
||||||
|
showCreateModal: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
openCreateMedcardPage() {
|
handleClosePatientForm(val) {
|
||||||
alert("Создать медкарту с ФИО: " + this.filterString);
|
this.showCreateModal = false;
|
||||||
|
if (!val) return;
|
||||||
|
this.getMedicalCardData({
|
||||||
|
personId: val.id,
|
||||||
|
successCallback: (id) => this.$router.push("medical-card/" + id),
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
...mapActions({
|
||||||
|
getMedicalCardData: "getMedicalCardDataByPersonId",
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
filterString: debounce(function (value) {
|
filterString: debounce(function (value) {
|
||||||
|
|||||||
@@ -5,23 +5,23 @@
|
|||||||
)
|
)
|
||||||
q-avatar(size="36px")
|
q-avatar(size="36px")
|
||||||
img(:src="avatar")
|
img(:src="avatar")
|
||||||
span.font-semibold.text-dark {{fullName}}
|
span.font-semibold.text-dark {{patientName}}
|
||||||
.field(:style="headerStyle(headerConfig[1])")
|
.field(:style="headerStyle(headerConfig[1])")
|
||||||
span.text-dark {{ formatDate(person?.birth_date) }} г.
|
span.text-dark {{ convertDate(medcardInfo?.person?.birth_date) }} г.
|
||||||
.field.gap-x-2(:style="headerStyle(headerConfig[2])")
|
.field.gap-x-2(:style="headerStyle(headerConfig[2])")
|
||||||
.rounded-full.h-2.w-2(:style="{background: patientPriority?.color}")
|
.rounded-full.h-2.w-2(:style="{background: patientPriority?.color}")
|
||||||
span(:style="{color: patientPriority?.color}") {{ patientPriority?.text }}
|
span(:style="{color: patientPriority?.color}") {{ patientPriority?.text }}
|
||||||
.field(:style="headerStyle(headerConfig[3])")
|
.field(:style="headerStyle(headerConfig[3])")
|
||||||
.medcard-number.rounded.h-7.py-1.pl-3.pr-2.flex.items-center.justify-between.w-full.cursor-pointer(
|
.medcard-number.rounded.h-7.py-1.pl-3.pr-2.flex.items-center.justify-between.w-full.cursor-pointer(
|
||||||
@click="copyMedicalCardNumber"
|
@click="copyValue(medcardInfo?.number)"
|
||||||
)
|
)
|
||||||
span.text-dark.cursor-pointer {{ medcardInfo?.number }}
|
span.text-dark.cursor-pointer {{ medcardInfo?.number }}
|
||||||
q-icon.copy(size="18px", name="app:copy")
|
q-icon.copy(size="18px", name="app:copy")
|
||||||
.field(:style="headerStyle(headerConfig[4])")
|
.field(:style="headerStyle(headerConfig[4])")
|
||||||
span.text-dark {{ formatDate(medcardInfo?.created_at) }} г.
|
span.text-dark {{ convertDate(medcardInfo?.created_at) }} г.
|
||||||
.field.gap-x-3(:style="headerStyle(headerConfig[5])")
|
.field.gap-x-3(:style="headerStyle(headerConfig[5])")
|
||||||
.track.h-2.flex-1.rounded
|
.track.h-2.flex-1.rounded
|
||||||
.thumb.h-full.rounded(:style="fillingThumbStyle")
|
.thumb.h-full.rounded(:style="thumbStyle")
|
||||||
span.grey-color {{ medcardInfo?.filling_percentage || 0 }}%
|
span.grey-color {{ medcardInfo?.filling_percentage || 0 }}%
|
||||||
.field(:style="{...headerStyle(headerConfig[6])}")
|
.field(:style="{...headerStyle(headerConfig[6])}")
|
||||||
q-icon.medcard.cursor-pointer(name="app:medcard", size="20px", @click="openMedicalCard")
|
q-icon.medcard.cursor-pointer(name="app:medcard", size="20px", @click="openMedicalCard")
|
||||||
@@ -51,18 +51,15 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
fullName() {
|
patientName() {
|
||||||
return `${this.person?.last_name} ${this.person?.first_name} ${this.person?.patronymic}`;
|
return `${this.medcardInfo?.person?.last_name} ${this.medcardInfo?.person?.first_name} ${this.medcardInfo?.person?.patronymic}`;
|
||||||
},
|
|
||||||
person() {
|
|
||||||
return this.medcardInfo?.person;
|
|
||||||
},
|
},
|
||||||
patientPriority() {
|
patientPriority() {
|
||||||
return priorityList?.find(
|
return priorityList?.find(
|
||||||
({ priority }) => (this.medcardInfo.priority || null) === priority
|
({ priority }) => (this.medcardInfo.priority || null) === priority
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
fillingThumbStyle() {
|
thumbStyle() {
|
||||||
let percentage = this.medcardInfo?.filling_percentage || 0;
|
let percentage = this.medcardInfo?.filling_percentage || 0;
|
||||||
return {
|
return {
|
||||||
width: `calc(${percentage}%)`,
|
width: `calc(${percentage}%)`,
|
||||||
@@ -80,13 +77,16 @@ export default {
|
|||||||
getMedicalCardData: "getMedicalCardDataByPersonId",
|
getMedicalCardData: "getMedicalCardDataByPersonId",
|
||||||
}),
|
}),
|
||||||
openMedicalCard() {
|
openMedicalCard() {
|
||||||
this.$router.push("medical-card/" + this.medcardInfo.id);
|
this.getMedicalCardData({
|
||||||
|
personId: this.medcardInfo.person_id,
|
||||||
|
successCallback: (id) => this.$router.push("medical-card/" + id),
|
||||||
|
});
|
||||||
},
|
},
|
||||||
formatDate(date) {
|
convertDate(date) {
|
||||||
return moment(date)?.format("DD MMMM YYYY");
|
return moment(date)?.format("DD MMMM YYYY");
|
||||||
},
|
},
|
||||||
copyMedicalCardNumber() {
|
copyValue(text) {
|
||||||
navigator.clipboard.writeText(this.medcardInfo.number);
|
navigator.clipboard.writeText(text);
|
||||||
addNotification(
|
addNotification(
|
||||||
new Date().getTime(),
|
new Date().getTime(),
|
||||||
"",
|
"",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
calendar-sidebar(v-if="!isOpen", :open-sidebar="openSidebar", :create-form="createForm")
|
calendar-sidebar(v-if="!isOpen", :open-sidebar="openSidebar", :create-form="createForm")
|
||||||
calendar-open-sidebar(v-else, :open-sidebar="openSidebar", :create-form="createForm")
|
calendar-open-sidebar(v-else, :open-sidebar="openSidebar", :create-form="createForm")
|
||||||
calendar-wrapper.ml-2(:open-sidebar="isOpen")
|
calendar-wrapper.ml-2(:open-sidebar="isOpen")
|
||||||
base-modal(v-model="isShowForm", title="Создание записи <Переделка>", modal-padding)
|
base-modal(v-model="isShowForm", title="Создание записи", modal-padding)
|
||||||
create-event-form(:close-form="closeForm")
|
create-event-form(:close-form="closeForm")
|
||||||
base-modal(v-model="previewVisibility", :hideHeader="true", :modalPadding="true")
|
base-modal(v-model="previewVisibility", :hideHeader="true", :modalPadding="true")
|
||||||
calendar-record-preview(v-model:preview-visibility="previewVisibility")
|
calendar-record-preview(v-model:preview-visibility="previewVisibility")
|
||||||
@@ -39,6 +39,7 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
...mapState({
|
...mapState({
|
||||||
selectedRecordId: (state) => state.calendar.selectedRecordId,
|
selectedRecordId: (state) => state.calendar.selectedRecordId,
|
||||||
|
selectedDates: (state) => state.calendar.selectedDates,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -53,7 +54,12 @@ export default {
|
|||||||
},
|
},
|
||||||
...mapActions({
|
...mapActions({
|
||||||
changeSelectedRecordId: "changeSelectedRecordId",
|
changeSelectedRecordId: "changeSelectedRecordId",
|
||||||
|
changeSelectedDates: "changeSelectedDates",
|
||||||
|
getEvents: "getEvents",
|
||||||
}),
|
}),
|
||||||
|
convertDate(date) {
|
||||||
|
return moment(date?.split(".")?.reverse()?.join("-"));
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
selectedRecordId(value) {
|
selectedRecordId(value) {
|
||||||
@@ -62,6 +68,59 @@ export default {
|
|||||||
previewVisibility(value) {
|
previewVisibility(value) {
|
||||||
if (!value) this.changeSelectedRecordId(null);
|
if (!value) this.changeSelectedRecordId(null);
|
||||||
},
|
},
|
||||||
|
"$route.query": {
|
||||||
|
immediate: true,
|
||||||
|
deep: true,
|
||||||
|
handler(value) {
|
||||||
|
if (this.$route.path === "/calendar") {
|
||||||
|
if (!value?.start || !value?.end) {
|
||||||
|
this.changeSelectedDates({
|
||||||
|
from: moment().clone().startOf("week"),
|
||||||
|
to: moment().clone().endOf("week"),
|
||||||
|
});
|
||||||
|
this.$router.replace({
|
||||||
|
query: {
|
||||||
|
start: this.selectedDates?.from?.format("DD.MM.YYYY"),
|
||||||
|
end: this.selectedDates?.to?.format("DD.MM.YYYY"),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else if (
|
||||||
|
value?.start !== this.selectedDates?.from?.format("DD.MM.YYYY") ||
|
||||||
|
value?.end !== this.selectedDates?.to?.format("DD.MM.YYYY")
|
||||||
|
)
|
||||||
|
this.changeSelectedDates({
|
||||||
|
from: this.convertDate(value?.start),
|
||||||
|
to: this.convertDate(value?.end),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
selectedDates: {
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
handler(newVal, oldVal) {
|
||||||
|
if (
|
||||||
|
!newVal?.from?.isSame(oldVal?.from) ||
|
||||||
|
!newVal?.to?.isSame(oldVal?.to)
|
||||||
|
) {
|
||||||
|
this.getEvents();
|
||||||
|
if (
|
||||||
|
this.$route.query?.start !== newVal?.from?.format("DD.MM.YYYY") &&
|
||||||
|
this.$route.query?.end !== newVal?.to?.format("DD.MM.YYYY")
|
||||||
|
) {
|
||||||
|
this.$router.replace({
|
||||||
|
query: {
|
||||||
|
start: newVal?.from?.format("DD.MM.YYYY"),
|
||||||
|
end: newVal?.to?.format("DD.MM.YYYY"),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
this.$route.query = {};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -22,10 +22,10 @@
|
|||||||
)
|
)
|
||||||
base-input.search(
|
base-input.search(
|
||||||
size="M"
|
size="M"
|
||||||
:width="350",
|
:width="386",
|
||||||
v-model="currentWeek",
|
v-model="currentWeek",
|
||||||
)
|
)
|
||||||
.h-5.w-5.flex.items-center.justify-center
|
.h-5.w-5.flex.items-center.justify-center.ml-3
|
||||||
q-icon.calendar-icon.text.cursor-pointer(
|
q-icon.calendar-icon.text.cursor-pointer(
|
||||||
:name="calendarVisibility ? 'app:cancel-mini' : 'app:calendar'",
|
:name="calendarVisibility ? 'app:cancel-mini' : 'app:calendar'",
|
||||||
size="20px",
|
size="20px",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
transition-show="scale",
|
transition-show="scale",
|
||||||
transition-hide="scale"
|
transition-hide="scale"
|
||||||
self="top middle",
|
self="top middle",
|
||||||
:offset="[140, 8]"
|
:offset="[160, 8]"
|
||||||
)
|
)
|
||||||
base-calendar(
|
base-calendar(
|
||||||
v-model="dates",
|
v-model="dates",
|
||||||
@@ -54,19 +54,22 @@
|
|||||||
dense,
|
dense,
|
||||||
@click="nextWeek"
|
@click="nextWeek"
|
||||||
)
|
)
|
||||||
.h-10.p-1.flex.items-center.justify-between.bg-secondary.rounded.text-grey-color.ml-52
|
.h-10.p-1.flex.items-center.justify-between.bg-secondary.rounded.text-grey-color.ml-52.border
|
||||||
q-btn-toggle(
|
q-btn-toggle(
|
||||||
v-model="value",
|
v-model="value",
|
||||||
:options="displayTypesList",
|
:options="displayTypesList",
|
||||||
no-caps,
|
no-caps,
|
||||||
toggle-color="light-blue-4",
|
|
||||||
padding="0px"
|
padding="0px"
|
||||||
)
|
)
|
||||||
template(v-slot:one)
|
template(v-slot:one)
|
||||||
.w-12.h-8.flex.items-center.justify-center
|
.w-12.h-8.flex.items-center.justify-center.rounded(
|
||||||
|
:class="{'active-toggle': value === 'expanded'}"
|
||||||
|
)
|
||||||
date-switcher-svg(name-svg="expanded", :active="value === 'expanded'")
|
date-switcher-svg(name-svg="expanded", :active="value === 'expanded'")
|
||||||
template(v-slot:two)
|
template(v-slot:two)
|
||||||
.w-12.h-8.flex.items-center.justify-center
|
.w-12.h-8.flex.items-center.justify-center.rounded(
|
||||||
|
:class="{'active-toggle': value === 'collapsed'}"
|
||||||
|
)
|
||||||
date-switcher-svg(name-svg="compressed", :active="value === 'collapsed'")
|
date-switcher-svg(name-svg="compressed", :active="value === 'collapsed'")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -103,7 +106,7 @@ export default {
|
|||||||
currentWeek() {
|
currentWeek() {
|
||||||
return `${this.dates?.from?.format(
|
return `${this.dates?.from?.format(
|
||||||
"D MMMM YYYY"
|
"D MMMM YYYY"
|
||||||
)} - ${this.dates?.to?.format("D MMMM YYYY")}`;
|
)} — ${this.dates?.to?.format("D MMMM YYYY")}`;
|
||||||
},
|
},
|
||||||
...mapState({
|
...mapState({
|
||||||
selectedDates: (state) => state.calendar.selectedDates,
|
selectedDates: (state) => state.calendar.selectedDates,
|
||||||
@@ -111,15 +114,18 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
previousWeek() {
|
previousWeek() {
|
||||||
this.dates.from = this.dates.from.clone().subtract(1, "week");
|
const diff = this.dates?.to?.diff(this.dates?.from, "days") + 1;
|
||||||
this.dates.to = this.dates.to.clone().subtract(1, "week");
|
this.dates.from = this.dates.from.clone().subtract(diff, "day");
|
||||||
|
this.dates.to = this.dates.to.clone().subtract(diff, "day");
|
||||||
},
|
},
|
||||||
nextWeek() {
|
nextWeek() {
|
||||||
this.dates.from = this.dates.from.clone().add(1, "week");
|
const diff = this.dates?.to?.diff(this.dates?.from, "days") + 1;
|
||||||
this.dates.to = this.dates.to.clone().add(1, "week");
|
this.dates.from = this.dates.from.clone().add(diff, "day");
|
||||||
|
this.dates.to = this.dates.to.clone().add(diff, "day");
|
||||||
},
|
},
|
||||||
...mapActions({
|
...mapActions({
|
||||||
changeSelectedDates: "changeSelectedDates",
|
changeSelectedDates: "changeSelectedDates",
|
||||||
|
getEvents: "getEvents",
|
||||||
}),
|
}),
|
||||||
saveDatesChange() {
|
saveDatesChange() {
|
||||||
this.calendarVisibility = false;
|
this.calendarVisibility = false;
|
||||||
@@ -142,9 +148,17 @@ export default {
|
|||||||
this.changeSelectedDates(val);
|
this.changeSelectedDates(val);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
selectedDates: {
|
||||||
mounted() {
|
deep: true,
|
||||||
this.initializeDates();
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
if (
|
||||||
|
!val?.from.isSame(this.dates?.from) ||
|
||||||
|
!val?.to.isSame(this.dates?.to)
|
||||||
|
)
|
||||||
|
this.initializeDates();
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@@ -188,6 +202,12 @@ export default {
|
|||||||
|
|
||||||
.calendar-icon :deep(path)
|
.calendar-icon :deep(path)
|
||||||
fill: var(--font-dark-blue-color)
|
fill: var(--font-dark-blue-color)
|
||||||
|
|
||||||
|
.active-toggle
|
||||||
|
background: var(--btn-blue-color)
|
||||||
|
|
||||||
|
.border-toggle
|
||||||
|
border: 1px solid var(--gray-secondary)
|
||||||
</style>
|
</style>
|
||||||
<style lang="sass">
|
<style lang="sass">
|
||||||
.q-field--outlined.q-field--readonly .q-field__control:before
|
.q-field--outlined.q-field--readonly .q-field__control:before
|
||||||
|
|||||||
@@ -15,14 +15,17 @@
|
|||||||
size="20px",
|
size="20px",
|
||||||
@click.stop="changeTimeDisplay(true)"
|
@click.stop="changeTimeDisplay(true)"
|
||||||
)
|
)
|
||||||
.color-black.pl-4.flex-1.font-semibold.py-6px.relative(
|
.color-black.pl-4.flex-1.font-semibold.py-6px.relative.cursor-default(
|
||||||
:class="{'pl-6px collapsed-name': expandedTime}"
|
:class="{'pl-6px collapsed-name': expandedTime}"
|
||||||
) {{trimPatientName(record?.person?.last_name, record?.person?.first_name, record?.person?.patronymic)}}
|
) {{trimPatientName(record?.person?.last_name, record?.person?.first_name, record?.person?.patronymic)}}
|
||||||
.gradient.absolute.w-5.h-full.right-0(v-if="expandedTime")
|
.gradient.absolute.w-5.h-full.right-0(v-if="expandedTime")
|
||||||
.info-block.justify-center
|
.info-block.justify-center(v-if="expandedType")
|
||||||
img.w-5.h-5(:src="recordingStatus?.icon")
|
q-icon(
|
||||||
.last-item.info-block.justify-center(v-if="expandedType")
|
:name="record?.person?.has_medical_card ? 'app:medcard-green' : 'app:medcard'",
|
||||||
img.w-5.h-5(:src="medicalСardStatus?.icon")
|
size="20px",
|
||||||
|
)
|
||||||
|
.last-item.info-block.justify-center
|
||||||
|
.recording-status(:class="recordingStatus?.class")
|
||||||
.body.background-grey.flex.flex-col.justify-between.pl-4.pr-2.color-grey(
|
.body.background-grey.flex.flex-col.justify-between.pl-4.pr-2.color-grey(
|
||||||
:style="bodyHeight",
|
:style="bodyHeight",
|
||||||
:class="bodyPadding"
|
:class="bodyPadding"
|
||||||
@@ -33,8 +36,8 @@
|
|||||||
:key="contact.value",
|
:key="contact.value",
|
||||||
)
|
)
|
||||||
q-icon.network-icon(:name="contact.icon", size="16px")
|
q-icon.network-icon(:name="contact.icon", size="16px")
|
||||||
.text-xxs {{ contact.value }}
|
.text-xxs.cursor-default {{ contact.value }}
|
||||||
.h-6.w-6.color-black.background-dark-grey.text-xxs.rounded.flex.items-center.justify-center(
|
.h-6.w-6.color-black.background-dark-grey.text-xxs.rounded.flex.items-center.justify-center.cursor-default(
|
||||||
v-if="collapsedDisplayCondition"
|
v-if="collapsedDisplayCondition"
|
||||||
) +1
|
) +1
|
||||||
</template>
|
</template>
|
||||||
@@ -61,15 +64,27 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
contacts() {
|
contacts() {
|
||||||
let contactList = this.record?.person?.contacts
|
let contactList = [];
|
||||||
?.filter(
|
this.record?.person?.contacts?.find((elem) => {
|
||||||
(elem) => elem.category === "PHONE" || elem.category === "EMAIL"
|
if (elem.category === "PHONE") {
|
||||||
)
|
contactList.push({
|
||||||
?.map((elem) => ({
|
kind: elem?.category,
|
||||||
kind: elem.category,
|
icon: networks?.find((item) => item.id === elem.category)?.icon,
|
||||||
icon: networks.find((item) => item.id === elem.category)?.icon,
|
value: elem?.value,
|
||||||
value: elem.value,
|
});
|
||||||
}));
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.record?.person?.contacts?.find((elem) => {
|
||||||
|
if (elem.category === "EMAIL") {
|
||||||
|
contactList.push({
|
||||||
|
kind: elem?.category,
|
||||||
|
icon: networks?.find((item) => item.id === elem.category)?.icon,
|
||||||
|
value: elem?.value,
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
if (this.collapsedDisplayCondition) {
|
if (this.collapsedDisplayCondition) {
|
||||||
contactList.length = 1;
|
contactList.length = 1;
|
||||||
return contactList;
|
return contactList;
|
||||||
@@ -80,14 +95,10 @@ export default {
|
|||||||
return !this.bodyClass?.["flex-col"] && !this.expandedType;
|
return !this.bodyClass?.["flex-col"] && !this.expandedType;
|
||||||
},
|
},
|
||||||
recordingStatus() {
|
recordingStatus() {
|
||||||
return statuses[0].data.find(
|
const status = statuses?.[0]?.data?.find(
|
||||||
(elem) => elem.value === this.record?.status
|
(elem) => elem.value === this.record?.status
|
||||||
);
|
);
|
||||||
},
|
return status || statuses?.[0]?.data?.[0];
|
||||||
medicalСardStatus() {
|
|
||||||
return statuses[1].data.find(
|
|
||||||
(elem) => elem.value === this.record?.medicalCard?.status
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
startTime() {
|
startTime() {
|
||||||
return moment.parseZone(this.record?.start);
|
return moment.parseZone(this.record?.start);
|
||||||
@@ -205,4 +216,18 @@ export default {
|
|||||||
fill: var(--font-dark-blue-color)
|
fill: var(--font-dark-blue-color)
|
||||||
.time-icon :deep(path)
|
.time-icon :deep(path)
|
||||||
fill: var(--font-grey-color)
|
fill: var(--font-grey-color)
|
||||||
|
.recording-status
|
||||||
|
border-radius: 9999px
|
||||||
|
width: 17px
|
||||||
|
height: 17px
|
||||||
|
.not-accepted
|
||||||
|
border: 1.2px solid var(--font-grey-color)
|
||||||
|
.accepted
|
||||||
|
background-color: var(--system-color-green)
|
||||||
|
.rejected
|
||||||
|
background-color: var(--system-color-red)
|
||||||
|
.reception
|
||||||
|
background-color: var(--btn-blue-color)
|
||||||
|
span
|
||||||
|
cursor: default
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -239,7 +239,6 @@ export default {
|
|||||||
this.changeCurrentTime();
|
this.changeCurrentTime();
|
||||||
this.timeCoilInitialization();
|
this.timeCoilInitialization();
|
||||||
this.startTimer();
|
this.startTimer();
|
||||||
this.getEvents();
|
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
this.stopTimer();
|
this.stopTimer();
|
||||||
|
|||||||
@@ -6,11 +6,12 @@
|
|||||||
:choice-status="choiceStatus"
|
:choice-status="choiceStatus"
|
||||||
v-model="time"
|
v-model="time"
|
||||||
)
|
)
|
||||||
base-input-with-search(v-model="patient", @createPerson="createPerson")
|
base-input-with-search(v-model="patient", @create-person="createPerson")
|
||||||
.flex.flex-col.flex-auto.l.gap-y-8
|
.flex.flex-col.flex-auto.l.gap-y-8
|
||||||
.wrapper-info.h-full
|
.wrapper-info.h-full
|
||||||
.grid.grid-cols-2.gap-x-4.gap-y-6
|
.grid.grid-cols-2.gap-x-4.gap-y-6
|
||||||
base-input(
|
base-input(
|
||||||
|
:disabled="!!patient.id"
|
||||||
v-model="phone",
|
v-model="phone",
|
||||||
placeholder="+7 (915) 644–92–23",
|
placeholder="+7 (915) 644–92–23",
|
||||||
mask="+7 (###) ###-##-##",
|
mask="+7 (###) ###-##-##",
|
||||||
@@ -19,6 +20,7 @@
|
|||||||
important
|
important
|
||||||
)
|
)
|
||||||
base-input-date(
|
base-input-date(
|
||||||
|
:disabled="!!patient.id"
|
||||||
v-model="birth_date",
|
v-model="birth_date",
|
||||||
size="M",
|
size="M",
|
||||||
important,
|
important,
|
||||||
@@ -26,9 +28,11 @@
|
|||||||
placeholder="Дата рождения"
|
placeholder="Дата рождения"
|
||||||
)
|
)
|
||||||
|
|
||||||
.footer.flex.gap-2
|
.footer.flex.gap-2
|
||||||
base-button(type="secondary", label="Отменить", width="126px", @click="closeForm")
|
base-button(type="secondary", label="Отменить", width="126px", @click="closeForm")
|
||||||
base-button(width="168px", label="Создать запись", @click="createEvent")
|
base-button(width="168px", label="Создать запись", @click="createEvent")
|
||||||
|
base-modal(v-model="showCreateModal", title="Создать пациента", modal-padding)
|
||||||
|
patient-creation-form(@close="handleClosePatientForm")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -41,6 +45,8 @@ import BaseInput from "@/components/base/BaseInput.vue";
|
|||||||
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
||||||
import { fetchWrapper } from "@/shared/fetchWrapper";
|
import { fetchWrapper } from "@/shared/fetchWrapper";
|
||||||
import { mapActions } from "vuex";
|
import { mapActions } from "vuex";
|
||||||
|
import PatientCreationForm from "@/components/PatientCreationForm.vue";
|
||||||
|
import BaseModal from "@/components/base/BaseModal.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "CreateEventForm",
|
name: "CreateEventForm",
|
||||||
@@ -51,29 +57,42 @@ export default {
|
|||||||
BaseInputWithSearch,
|
BaseInputWithSearch,
|
||||||
BaseInput,
|
BaseInput,
|
||||||
BaseInputDate,
|
BaseInputDate,
|
||||||
|
PatientCreationForm,
|
||||||
|
BaseModal,
|
||||||
},
|
},
|
||||||
props: { isShowForm: Boolean, closeForm: Function },
|
props: { isShowForm: Boolean, closeForm: Function },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
patient: {},
|
patient: {},
|
||||||
phone: "",
|
phone: "",
|
||||||
birth_date: {},
|
birth_date: "",
|
||||||
time: {},
|
time: {},
|
||||||
patientData: patientData,
|
patientData: patientData,
|
||||||
currentStatus: patientData.statuses.find((e) => e.name === "Не принят"),
|
currentStatus: patientData.statuses.find((e) => e.name === "Не принят"),
|
||||||
|
showCreateModal: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
primaryNumber() {
|
||||||
|
return this.patient?.contacts?.find((e) => e.category === "PHONE")?.value;
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions({
|
...mapActions({
|
||||||
getEvents: "getEvents",
|
getEvents: "getEvents",
|
||||||
}),
|
}),
|
||||||
createPerson() {
|
createPerson() {
|
||||||
alert("crea");
|
this.showCreateModal = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
choiceStatus(e) {
|
choiceStatus(e) {
|
||||||
this.currentStatus = e;
|
this.currentStatus = e;
|
||||||
},
|
},
|
||||||
|
handleClosePatientForm(val) {
|
||||||
|
this.showCreateModal = false;
|
||||||
|
if (!val) return;
|
||||||
|
this.patient = val;
|
||||||
|
},
|
||||||
async createEvent() {
|
async createEvent() {
|
||||||
const event = await fetchWrapper.post("events", {
|
const event = await fetchWrapper.post("events", {
|
||||||
start: this.time.start.toISOString(),
|
start: this.time.start.toISOString(),
|
||||||
@@ -90,6 +109,16 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
|
watch: {
|
||||||
|
patient(val) {
|
||||||
|
if (val.birth_date) {
|
||||||
|
this.birth_date = val.birth_date;
|
||||||
|
}
|
||||||
|
if (this.primaryNumber) {
|
||||||
|
this.phone = this.primaryNumber;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,264 +0,0 @@
|
|||||||
<template lang="pug">
|
|
||||||
.flex.flex-col.pt-6.gap-y-4(:style="{maxWidth: '682px'}")
|
|
||||||
header-record-form(
|
|
||||||
:current-status="currentStatus",
|
|
||||||
:statuses="patientData.statuses",
|
|
||||||
:choice-status="choiceStatus"
|
|
||||||
)
|
|
||||||
.flex.items-center.gap-x-3.text-smm
|
|
||||||
.text.font-semibold Жалобы:
|
|
||||||
.flex.gap-x-1
|
|
||||||
.services.flex.items-center.px-4.font-medium.text-smm.gap-x-1.h-9.rounded-md(
|
|
||||||
:class="{'other-serivices': services.length}"
|
|
||||||
)
|
|
||||||
.service.flex.gap-x-1.items-center.rounded.relative(
|
|
||||||
:style="{ width: otherColor ? '415px' : 'full'}"
|
|
||||||
)
|
|
||||||
span(v-if="!services.length") Выберите услуги
|
|
||||||
.dark-blue.flex.px-4.items-center.rounded.h-7(
|
|
||||||
id="service",
|
|
||||||
v-else,
|
|
||||||
v-for="service in services",
|
|
||||||
:style="{background: service.color}"
|
|
||||||
) {{service.title}}
|
|
||||||
.gradient.flex.absolute(
|
|
||||||
:style="{background: `linear-gradient(270deg, ${otherColor} 0%, rgba(247, 217, 255, 0) 100%)`}"
|
|
||||||
)
|
|
||||||
.other.flex.h-7.items-center.justify-center.rounded(v-if="otherColor") {{`+${otherServices.length}`}}
|
|
||||||
.price.flex.items-center.items-center.justify-center.rounded-md(v-if="services.length") {{sumService}}
|
|
||||||
q-btn.change.flex.w-7.h-9.rounded-md(@click="isShowServices = true", dense, padding="4px 4px")
|
|
||||||
q-icon.icon(name="app:folder", size="20px")
|
|
||||||
base-modal(v-model="isShowServices", title="Услуги", modal-padding)
|
|
||||||
services-modal(:close-services="closeServices", :save-services="saveServices")
|
|
||||||
base-input-full-name(:info-client="patientData")
|
|
||||||
.flex.flex-col.flex-auto.l.gap-y-8
|
|
||||||
.flex
|
|
||||||
button.title-info.px-6.py-2.cursor-pointer.w-full.text-sm(
|
|
||||||
v-for="form in forms",
|
|
||||||
@click="selectForm(form.component)",
|
|
||||||
:class="{active: form.component === currentForm}",
|
|
||||||
:key="form.id",
|
|
||||||
:id="form.id"
|
|
||||||
) {{form.title}}
|
|
||||||
component(
|
|
||||||
v-bind:is="currentForm",
|
|
||||||
:basic-info="patientData.basic",
|
|
||||||
:phone="patientData.phone",
|
|
||||||
:email="patientData.email",
|
|
||||||
:add-network="addNewNetwork",
|
|
||||||
:priority-list="patientData.priorityList",
|
|
||||||
:identity-document="patientData.identity_document",
|
|
||||||
:addresses="patientData.addresses",
|
|
||||||
:save-file="saveDocFile",
|
|
||||||
:networks-list="getNetworksList",
|
|
||||||
)
|
|
||||||
.footer.flex.gap-2
|
|
||||||
base-button(type="secondary", label="Отменить", width="126px", @click="closeForm")
|
|
||||||
base-button(width="168px", label="Создать запись", @click="closeForm", disabled)
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import folder from "@/assets/icons/folder.svg";
|
|
||||||
import { column } from "@/pages/clients/utils/tableConfig";
|
|
||||||
import { v_model } from "@/shared/mixins/v-model";
|
|
||||||
import FormCreateBasicInfo from "@/pages/clients/components/FormCreateBasicInfo";
|
|
||||||
import FormCreateIdentityDocuments from "@/pages/clients/components/FormCreateIdentityDocuments";
|
|
||||||
import FormCreateAddresses from "@/pages/clients/components/FormCreateAddresses";
|
|
||||||
import FormCreateAttachments from "@/pages/clients/components/FormCreateAttachments.vue";
|
|
||||||
import BaseInputFullName from "@/components/base/BaseInputFullName.vue";
|
|
||||||
import { patientData } from "@/pages/newCalendar/utils/calendarConfig.js";
|
|
||||||
import HeaderRecordForm from "./HeaderRecordForm.vue";
|
|
||||||
import BaseCalendar from "@/components/base/Calendar/BaseCalendar.vue";
|
|
||||||
import BaseButton from "@/components/base/BaseButton.vue";
|
|
||||||
import BaseModal from "@/components/base/BaseModal.vue";
|
|
||||||
import ServicesModal from "./ServicesModal.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "RecordCreationForm",
|
|
||||||
components: {
|
|
||||||
FormCreateBasicInfo,
|
|
||||||
FormCreateIdentityDocuments,
|
|
||||||
FormCreateAddresses,
|
|
||||||
FormCreateAttachments,
|
|
||||||
BaseInputFullName,
|
|
||||||
BaseCalendar,
|
|
||||||
HeaderRecordForm,
|
|
||||||
BaseButton,
|
|
||||||
BaseModal,
|
|
||||||
ServicesModal,
|
|
||||||
},
|
|
||||||
props: { isShowForm: Boolean, closeForm: Function },
|
|
||||||
mixins: [v_model],
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
folder,
|
|
||||||
isPhoto: false,
|
|
||||||
patientData: patientData,
|
|
||||||
currentStatus: patientData.statuses.find((e) => e.name === "Не принят"),
|
|
||||||
services: [
|
|
||||||
{ id: 0, title: "Чистка зубов", price: 500, color: "#D8E3FF" },
|
|
||||||
{ id: 1, title: "Осмотр", price: 1300, color: "#FFF0CA" },
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
title: "Лечение среднего кариеса",
|
|
||||||
price: 500,
|
|
||||||
color: "#F7D9FF",
|
|
||||||
},
|
|
||||||
{ id: 3, title: "Осмотр зубов", price: 1300, color: "#FFF0CA" },
|
|
||||||
],
|
|
||||||
forms: [
|
|
||||||
{
|
|
||||||
title: "Основное",
|
|
||||||
id: "basic",
|
|
||||||
component: "form-create-basic-info",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "ДУЛ",
|
|
||||||
id: "doc",
|
|
||||||
component: "form-create-identity-documents",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Адрес",
|
|
||||||
id: "address",
|
|
||||||
component: "form-create-addresses",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Дополнительное",
|
|
||||||
id: "additional",
|
|
||||||
component: "form-create-attachments",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
currentForm: "form-create-basic-info",
|
|
||||||
networksSettings: column.find((el) => el.name === "networks")?.settings,
|
|
||||||
otherColor: null,
|
|
||||||
otherServices: [],
|
|
||||||
isShowServices: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
getNetworksList() {
|
|
||||||
let contacts = [];
|
|
||||||
this.patientData.basic.contacts.forEach((elem) =>
|
|
||||||
contacts.push(elem.kind.id)
|
|
||||||
);
|
|
||||||
let filteredNetworks = this.networksSettings.filter(
|
|
||||||
({ id }) => !contacts.includes(id)
|
|
||||||
);
|
|
||||||
return filteredNetworks;
|
|
||||||
},
|
|
||||||
sumService() {
|
|
||||||
let sum = this.services.reduce((acc, el) => acc + el.price, 0) + " ₽";
|
|
||||||
return sum.length >= 5
|
|
||||||
? sum.replace(/(\d{1,3}(?=(?:\d\d\d)+(?!\d)))/g, "$1" + " ")
|
|
||||||
: sum;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
changePhoto() {
|
|
||||||
this.isPhoto = true;
|
|
||||||
},
|
|
||||||
selectForm(componentName) {
|
|
||||||
this.currentForm = this.forms.find(
|
|
||||||
(elem) => elem.component === componentName
|
|
||||||
)?.component;
|
|
||||||
},
|
|
||||||
saveDocFile(e) {
|
|
||||||
this.patientData.doc = e.target.files;
|
|
||||||
},
|
|
||||||
addNewNetwork() {
|
|
||||||
const newNetwork = this.getNetworksList;
|
|
||||||
if (newNetwork[0])
|
|
||||||
this.patientData.basic.contacts.push({
|
|
||||||
kind: {
|
|
||||||
id: newNetwork[0].id,
|
|
||||||
icon: newNetwork[0].icon,
|
|
||||||
},
|
|
||||||
username: "",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
choiceStatus(e) {
|
|
||||||
this.currentStatus = e;
|
|
||||||
},
|
|
||||||
addShadow() {
|
|
||||||
let defaultWidth = 415;
|
|
||||||
const target = document.querySelectorAll("#service");
|
|
||||||
target.forEach((e) => {
|
|
||||||
defaultWidth = defaultWidth - e.offsetWidth;
|
|
||||||
if (defaultWidth <= 10) return this.otherServices.push(e);
|
|
||||||
});
|
|
||||||
this.otherColor = this.otherServices[0]?.style.background;
|
|
||||||
},
|
|
||||||
closeServices() {
|
|
||||||
this.isShowServices = false;
|
|
||||||
},
|
|
||||||
saveServices(selectedServices) {
|
|
||||||
this.isShowServices = false;
|
|
||||||
selectedServices.forEach((e) => this.services.push(e));
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.addShadow();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="sass" scoped>
|
|
||||||
.dark-blue
|
|
||||||
color: var(--font-dark-blue-color)
|
|
||||||
min-width: 50px
|
|
||||||
|
|
||||||
.text
|
|
||||||
color: var(--font-grey-color)
|
|
||||||
width: 76px
|
|
||||||
|
|
||||||
.change
|
|
||||||
background: var(--bg-light-grey)
|
|
||||||
color: var(--font-grey-color)
|
|
||||||
|
|
||||||
.services
|
|
||||||
background: var(--bg-light-grey)
|
|
||||||
color: var(--font-grey-color)
|
|
||||||
width: 560px
|
|
||||||
|
|
||||||
.service
|
|
||||||
display: -webkit-box
|
|
||||||
overflow: hidden
|
|
||||||
|
|
||||||
.gradient
|
|
||||||
width: 10%
|
|
||||||
height: 28px
|
|
||||||
right: 0
|
|
||||||
|
|
||||||
.other-serivices
|
|
||||||
width: 474px
|
|
||||||
padding: 4px
|
|
||||||
border: 1px solid var(--border-light-grey-color)
|
|
||||||
background: var(--default-white)
|
|
||||||
|
|
||||||
.other
|
|
||||||
width: 46px
|
|
||||||
background: var(--bg-light-grey)
|
|
||||||
|
|
||||||
.price
|
|
||||||
background: var(--bg-light-grey)
|
|
||||||
width: 82px
|
|
||||||
color: var(--font-grey-color)
|
|
||||||
|
|
||||||
.title-info
|
|
||||||
color: var(--font-grey-color)
|
|
||||||
border-bottom: 1.5px solid var(--font-grey-color)
|
|
||||||
&:hover
|
|
||||||
color: var(--btn-blue-color)
|
|
||||||
border-bottom: 1.5px solid var(--btn-blue-color)
|
|
||||||
&.active
|
|
||||||
color: var(--btn-blue-color)
|
|
||||||
border-bottom: 1.5px solid var(--btn-blue-color)
|
|
||||||
|
|
||||||
.footer
|
|
||||||
border-top: 1px solid var(--border-light-grey-color)
|
|
||||||
margin: 40px -32px 0px
|
|
||||||
padding: 16px 32px 0px 32px
|
|
||||||
|
|
||||||
.icon :deep(path)
|
|
||||||
fill: var(--font-grey-color)
|
|
||||||
</style>
|
|
||||||
@@ -48,10 +48,29 @@ export const statuses = [
|
|||||||
label: "Не принят",
|
label: "Не принят",
|
||||||
icon: not_accepted,
|
icon: not_accepted,
|
||||||
value: "not_accepted",
|
value: "not_accepted",
|
||||||
|
class: "not-accepted",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
label: "Принят",
|
||||||
|
icon: accepted,
|
||||||
|
value: "accepted",
|
||||||
|
class: "accepted",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
label: "Отказ",
|
||||||
|
icon: rejected,
|
||||||
|
value: "rejected",
|
||||||
|
class: "rejected",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
label: "На приеме",
|
||||||
|
icon: reception,
|
||||||
|
value: "reception",
|
||||||
|
class: "reception",
|
||||||
},
|
},
|
||||||
{ id: 1, label: "Принят", icon: accepted, value: "accepted" },
|
|
||||||
{ id: 2, label: "Отказ", icon: rejected, value: "rejected" },
|
|
||||||
{ id: 3, label: "На приеме", icon: reception, value: "reception" },
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
padding="0",
|
padding="0",
|
||||||
@click="(e) => addNewAllergy(e)"
|
@click="(e) => addNewAllergy(e)"
|
||||||
)
|
)
|
||||||
q-icon(name="app:icon-plus", size="12px", left)
|
q-icon.icon(name="app:plus", size="24px", left)
|
||||||
span Добавить
|
span Добавить
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -158,7 +158,9 @@ export default {
|
|||||||
.label-field
|
.label-field
|
||||||
color: var(--font-grey-color)
|
color: var(--font-grey-color)
|
||||||
.on-left
|
.on-left
|
||||||
margin-right: 10px
|
margin-right: 4px
|
||||||
.q-btn :deep(.q-ripple)
|
.q-btn :deep(.q-ripple)
|
||||||
display: none
|
display: none
|
||||||
|
.icon :deep(path)
|
||||||
|
fill: var(--btn-blue-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ export default {
|
|||||||
basic: (state) => state.medical.basicData,
|
basic: (state) => state.medical.basicData,
|
||||||
isNew: (state) => state.medical.medicalCard.type === "new",
|
isNew: (state) => state.medical.medicalCard.type === "new",
|
||||||
medicalCard: (state) => state.medical.medicalCard,
|
medicalCard: (state) => state.medical.medicalCard,
|
||||||
|
addresses: (state) => state.medical.medicalCard.person.addresses,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -133,21 +134,21 @@ export default {
|
|||||||
}
|
}
|
||||||
Object.keys(this.basic).map((key) => {
|
Object.keys(this.basic).map((key) => {
|
||||||
if (key === "registrationAddress")
|
if (key === "registrationAddress")
|
||||||
this.getRequestChangeData(
|
this.postAdresses(
|
||||||
this.basic.registrationAddress,
|
this.basic.registrationAddress,
|
||||||
this.initDataBasic[key],
|
this.initDataBasic[key],
|
||||||
"Адрес регистрации"
|
"REGISTRATION_ADDRESS"
|
||||||
);
|
);
|
||||||
if (key === "residenceAddress")
|
if (key === "residenceAddress")
|
||||||
this.getRequestChangeData(
|
this.postAdresses(
|
||||||
this.basic.residenceAddress,
|
this.basic.residenceAddress,
|
||||||
this.initDataBasic[key],
|
this.initDataBasic[key],
|
||||||
"Адрес проживания"
|
"CURRENT_ADDRESS"
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
this.isEdit = false;
|
this.isEdit = false;
|
||||||
},
|
},
|
||||||
getRequestChangeData(updateData, initData, key) {
|
postAdresses(updateData, initData, key) {
|
||||||
let isInitDataEmpty = [...Object.keys(removeEmptyFields(initData))]
|
let isInitDataEmpty = [...Object.keys(removeEmptyFields(initData))]
|
||||||
.length;
|
.length;
|
||||||
if (Object.keys(removeEmptyFields(updateData)).length) {
|
if (Object.keys(removeEmptyFields(updateData)).length) {
|
||||||
@@ -159,7 +160,7 @@ export default {
|
|||||||
});
|
});
|
||||||
if (JSON.stringify(updateData) !== JSON.stringify(initData))
|
if (JSON.stringify(updateData) !== JSON.stringify(initData))
|
||||||
return this.updateAddress({
|
return this.updateAddress({
|
||||||
id: this.basic.personalData.id,
|
id: this.addresses.find(({ category }) => category === key).id,
|
||||||
address: updateData,
|
address: updateData,
|
||||||
category: key,
|
category: key,
|
||||||
});
|
});
|
||||||
@@ -181,22 +182,10 @@ export default {
|
|||||||
const form = this.$refs.formBasicData;
|
const form = this.$refs.formBasicData;
|
||||||
form.validate().then((validate) => {
|
form.validate().then((validate) => {
|
||||||
if (validate) {
|
if (validate) {
|
||||||
let person = this.basic.personalData;
|
this.updateBasicData();
|
||||||
this.$store.dispatch("setMedicalCardData", {
|
this.isLoadingData = false;
|
||||||
...this.medicalCard,
|
this.isEdit = false;
|
||||||
person: {
|
this.isCheckChange = false;
|
||||||
...this.medicalCard.person,
|
|
||||||
...person,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
//let updateBasic = this.updateBasicData();
|
|
||||||
// Promise.allSettled(updateBasic)
|
|
||||||
// .then(() => this.$store.dispatch("getMedicalCardData"))
|
|
||||||
// .then(() => {
|
|
||||||
// this.isLoadingData = false;
|
|
||||||
// this.isEdit = false;
|
|
||||||
// this.isCheckChange = false;
|
|
||||||
// });
|
|
||||||
} else {
|
} else {
|
||||||
getFieldsNameUnvalidated(form).forEach((errorKey) => {
|
getFieldsNameUnvalidated(form).forEach((errorKey) => {
|
||||||
addNotification(
|
addNotification(
|
||||||
|
|||||||
@@ -20,12 +20,12 @@
|
|||||||
@click="() => copyLinkNetwork(data.value)"
|
@click="() => copyLinkNetwork(data.value)"
|
||||||
style="background-color: var(--bg-light-grey)"
|
style="background-color: var(--bg-light-grey)"
|
||||||
)
|
)
|
||||||
q-icon.icon(:name="mapNetworks[data.kind].icon" :class="{old: data.id, new: data.filled}")
|
q-icon.icon(:name="mapNetworks[data.category].icon" :class="{old: data.id, new: data.filled}")
|
||||||
span.text-sm.font-medium {{ mapNetworks[data.kind].title || data.value }}
|
span.text-sm.font-medium {{ mapNetworks[data.category].title || data.value }}
|
||||||
.flex.gap-10px(v-else v-click-outside="() => checkNetworksField(index)" :key="key+index")
|
.flex.gap-10px(v-else v-click-outside="() => checkNetworksField(index)" :key="key+index")
|
||||||
base-select-networks(
|
base-select-networks(
|
||||||
:list-data="Object.values(mapNetworks)"
|
:list-data="Object.values(mapNetworks)"
|
||||||
:option-data="data.kind"
|
:option-data="data.category"
|
||||||
:choose-option="(e) => chooseNetwork(e, index)"
|
:choose-option="(e) => chooseNetwork(e, index)"
|
||||||
:style-border="true"
|
:style-border="true"
|
||||||
:size-input="50"
|
:size-input="50"
|
||||||
@@ -74,9 +74,9 @@ import {
|
|||||||
getFieldsNameUnvalidated,
|
getFieldsNameUnvalidated,
|
||||||
} from "@/shared/utils/changesObjects";
|
} 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";
|
||||||
import BaseInput from "@/components/base/BaseInput.vue";
|
import BaseInput from "@/components/base/BaseInput.vue";
|
||||||
|
import { mapActions } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ContactsForm",
|
name: "ContactsForm",
|
||||||
@@ -106,13 +106,14 @@ export default {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
...mapActions({
|
||||||
|
createContact: "postCreateContact",
|
||||||
|
updateContact: "postUpdateContact",
|
||||||
|
delContacts: "deleteContact",
|
||||||
|
}),
|
||||||
checkNetworksField(index) {
|
checkNetworksField(index) {
|
||||||
if (
|
if (this.contacts.networks[index].category)
|
||||||
this.contacts.networks[index].kind &&
|
|
||||||
this.contacts.networks[index].username
|
|
||||||
) {
|
|
||||||
this.contacts.networks[index].filled = true;
|
this.contacts.networks[index].filled = true;
|
||||||
}
|
|
||||||
},
|
},
|
||||||
openEdit() {
|
openEdit() {
|
||||||
this.isEdit = true;
|
this.isEdit = true;
|
||||||
@@ -123,35 +124,46 @@ export default {
|
|||||||
this.isCheckChange = false;
|
this.isCheckChange = false;
|
||||||
},
|
},
|
||||||
updateContacts() {
|
updateContacts() {
|
||||||
|
this.isLoadingData = true;
|
||||||
const allNewContacts = [
|
const allNewContacts = [
|
||||||
...this.contacts.phones,
|
...this.contacts.phones,
|
||||||
...this.contacts.emails,
|
...this.contacts.emails,
|
||||||
...this.contacts.networks,
|
...this.contacts.networks,
|
||||||
];
|
];
|
||||||
const notEmptyContacts = allNewContacts.filter(
|
const notEmptyContacts = allNewContacts.filter((el) => el.category);
|
||||||
(el) => el.kind && el.username
|
return this.changeContacts(this.initAllContacts, notEmptyContacts);
|
||||||
);
|
},
|
||||||
return getRequestArrayData(
|
changeContacts(initData, notEmptyContacts) {
|
||||||
this.initAllContacts,
|
const deleteRequests = initData
|
||||||
notEmptyContacts,
|
.filter((el) => !notEmptyContacts.find((data) => data.id === el.id))
|
||||||
"person",
|
.map((el) => this.delContacts({ id: el.id }));
|
||||||
this.personId,
|
const requests = notEmptyContacts.map((el) => {
|
||||||
"general",
|
const requestObj = {
|
||||||
"contact"
|
category: el.category,
|
||||||
);
|
value: el.value,
|
||||||
|
};
|
||||||
|
delete requestObj.id;
|
||||||
|
if (!el?.id)
|
||||||
|
return this.createContact({ obj: requestObj, id: this.personId });
|
||||||
|
if (
|
||||||
|
el?.id &&
|
||||||
|
checkChangeData(
|
||||||
|
initData.find((obj) => obj.id === el.id),
|
||||||
|
el
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return this.updateContact({ obj: requestObj, id: el.id });
|
||||||
|
});
|
||||||
|
return requests.concat(deleteRequests);
|
||||||
},
|
},
|
||||||
saveChange() {
|
saveChange() {
|
||||||
const form = this.$refs.formContacts;
|
const form = this.$refs.formContacts;
|
||||||
form.validate().then((validate) => {
|
form.validate().then((validate) => {
|
||||||
if (validate) {
|
if (validate) {
|
||||||
this.isLoadingData = true;
|
this.updateContacts();
|
||||||
Promise.allSettled(this.updateContacts())
|
this.isLoadingData = false;
|
||||||
.then(() => this.$store.dispatch("getMedicalCardData"))
|
this.isEdit = false;
|
||||||
.then(() => {
|
this.isCheckChange = false;
|
||||||
this.isLoadingData = false;
|
|
||||||
this.isEdit = false;
|
|
||||||
this.isCheckChange = false;
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
getFieldsNameUnvalidated(form).forEach((errorKey) => {
|
getFieldsNameUnvalidated(form).forEach((errorKey) => {
|
||||||
addNotification(
|
addNotification(
|
||||||
@@ -172,27 +184,25 @@ export default {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
chooseNetwork(e, index) {
|
chooseNetwork(e, index) {
|
||||||
this.contacts.networks[index].kind = e.currentTarget.id;
|
this.contacts.networks[index].category = e.currentTarget.id;
|
||||||
},
|
},
|
||||||
addNewContact(e, key) {
|
addNewContact(e, key) {
|
||||||
if (e.pointerType) {
|
if (e.pointerType) {
|
||||||
if (key === "networks") {
|
if (key === "networks") {
|
||||||
this.contacts[key].push({
|
this.contacts[key].push({
|
||||||
filled: false,
|
filled: false,
|
||||||
kind: this.configData[key]?.kind,
|
category: this.configData[key]?.category,
|
||||||
username: null,
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.contacts[key].push({
|
this.contacts[key].push({
|
||||||
kind: this.configData[key]?.kind,
|
category: this.configData[key]?.category,
|
||||||
username: null,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.checkChangeInput();
|
this.checkChangeInput();
|
||||||
},
|
},
|
||||||
deleteContact(key, index) {
|
deleteContact(key, index) {
|
||||||
this.contacts[key].splice(index, 1);
|
this.contacts[key]?.splice(index, 1);
|
||||||
this.checkChangeInput();
|
this.checkChangeInput();
|
||||||
},
|
},
|
||||||
copyLinkNetwork(value) {
|
copyLinkNetwork(value) {
|
||||||
|
|||||||
@@ -19,19 +19,20 @@
|
|||||||
q-avatar(
|
q-avatar(
|
||||||
rounded,
|
rounded,
|
||||||
size="40px",
|
size="40px",
|
||||||
v-if="docData[data.dataKey][field.key]?.photo"
|
v-if="docData[data.dataKey]?.attachments?.photo"
|
||||||
)
|
)
|
||||||
img.h-10.w-10.object-cover(
|
img.h-10.w-10.object-cover(
|
||||||
:src="docData[data.dataKey][field.key]?.photo",
|
:src="docData[data.dataKey]?.attachments?.photo",
|
||||||
:alt="docData[data.dataKey][field.label]"
|
:alt="docData[data.dataKey][field.label]"
|
||||||
)
|
)
|
||||||
q-badge.delete(
|
q-badge.delete(
|
||||||
floating,
|
floating,
|
||||||
v-if="isEdit",
|
v-if="isEdit",
|
||||||
rounded,
|
rounded,
|
||||||
@click="removeImage(data?.dataKey, field?.key)"
|
@click="removeImage(data?.dataKey, field?.key)",
|
||||||
|
:style="{padding: 0}"
|
||||||
)
|
)
|
||||||
q-icon(name="app:icon-cancel", size="8px")
|
q-icon.cancel-icon(name="app:cancel-mini", size="16px")
|
||||||
.replace-photo.font-medium.text-base.cursor-pointer(
|
.replace-photo.font-medium.text-base.cursor-pointer(
|
||||||
v-if="isEdit",
|
v-if="isEdit",
|
||||||
@click="openModal(data.dataKey)",
|
@click="openModal(data.dataKey)",
|
||||||
@@ -44,46 +45,30 @@
|
|||||||
base-input-date(
|
base-input-date(
|
||||||
v-if="field.type === 'date'",
|
v-if="field.type === 'date'",
|
||||||
v-model="docData[data.dataKey][field.key]",
|
v-model="docData[data.dataKey][field.key]",
|
||||||
:name="field.key",
|
:name="data.dataKey + ':' + field.key",
|
||||||
@update:model-value="checkChangeDocData",
|
@update:model-value="checkChangeDocData",
|
||||||
:readonly="!isEdit",
|
:readonly="!isEdit",
|
||||||
:width="302",
|
:width="302",
|
||||||
:mask="field?.inputMask",
|
:mask="field?.inputMask",
|
||||||
:rule="[(val) => !personDataField.includes(field.key) ? checkPassportFields(val, field.rules) : field.rules(val)]",
|
:rule="(val) => !personDataField.includes(data.dataKey + ':' + field.key) ? checkPassportFields(val, field.rules) : field.rules(val)",
|
||||||
:autogrow="field.key === 'issued_by_org'",
|
size="M",
|
||||||
size="M"
|
|
||||||
)
|
)
|
||||||
base-input(
|
base-input(
|
||||||
v-if="field.type === 'text' && field.key !== 'issued_by_org'",
|
v-if="field.type === 'text'",
|
||||||
v-model="docData[data.dataKey][field.key]",
|
v-model="docData[data.dataKey][field.key]",
|
||||||
:name="field.key",
|
:name="data.dataKey + ':' + field.key",
|
||||||
@update:model-value="checkChangeDocData",
|
@update:model-value="checkChangeDocData",
|
||||||
:readonly="!isEdit",
|
:readonly="!isEdit",
|
||||||
:type="field.type",
|
:type="field.type",
|
||||||
:width="302",
|
:width="302",
|
||||||
:mask="field?.inputMask",
|
:mask="field?.inputMask",
|
||||||
:rule="[(val) => !personDataField.includes(field.key) ? checkPassportFields(val, field.rules) : field.rules(val)]",
|
:rule="[(val) => !personDataField.includes(data.dataKey + ':' + field.key) ? checkPassportFields(val, field.rules) : field.rules(val, initialDocData?.[data.dataKey]?.id)]",
|
||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
.icon-copy.my-auto.text-lg.label-field.cursor-pointer(
|
.icon-copy.my-auto.text-lg.label-field.cursor-pointer(
|
||||||
v-if="checkCopiedFields(field.key) && !!docData[data.dataKey][field.key]",
|
v-if="checkCopiedFields(field.key) && !!docData[data.dataKey][field.key]",
|
||||||
@click="copyValue(docData[data.dataKey][field.key])"
|
@click="copyValue(docData[data.dataKey][field.key])"
|
||||||
)
|
)
|
||||||
base-textarea(
|
|
||||||
v-if="field.type === 'text' && field.key === 'issued_by_org'",
|
|
||||||
v-model="docData[data.dataKey][field.key]",
|
|
||||||
:name="field.key",
|
|
||||||
@update:model-value="checkChangeDocData",
|
|
||||||
:readonly="!isEdit",
|
|
||||||
:type="field.type",
|
|
||||||
:width="302",
|
|
||||||
:mask="field?.inputMask",
|
|
||||||
:rule="[(val) => !personDataField.includes(field.key) ? checkPassportFields(val, field.rules) : field.rules(val)]",
|
|
||||||
autogrow,
|
|
||||||
size="auto",
|
|
||||||
height="57px"
|
|
||||||
padding="10px 16px"
|
|
||||||
)
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -101,7 +86,7 @@ import TheNotificationProvider from "@/components/Notifications/TheNotificationP
|
|||||||
import { addNotification } from "@/components/Notifications/notificationContext";
|
import { addNotification } from "@/components/Notifications/notificationContext";
|
||||||
import BaseInput from "@/components/base/BaseInput.vue";
|
import BaseInput from "@/components/base/BaseInput.vue";
|
||||||
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
||||||
import BaseTextarea from "@/components/base/BaseTextarea.vue.vue";
|
import { mapActions } from "vuex";
|
||||||
export default {
|
export default {
|
||||||
name: "DocumentsForm",
|
name: "DocumentsForm",
|
||||||
components: {
|
components: {
|
||||||
@@ -112,7 +97,6 @@ export default {
|
|||||||
BaseUploadPhoto,
|
BaseUploadPhoto,
|
||||||
TheNotificationProvider,
|
TheNotificationProvider,
|
||||||
BaseInputDate,
|
BaseInputDate,
|
||||||
BaseTextarea,
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -121,7 +105,6 @@ export default {
|
|||||||
docData: null,
|
docData: null,
|
||||||
isCheckChange: false,
|
isCheckChange: false,
|
||||||
isLoadingData: true,
|
isLoadingData: true,
|
||||||
approvedPassportData: false,
|
|
||||||
copiedFields: [
|
copiedFields: [
|
||||||
"series",
|
"series",
|
||||||
"number",
|
"number",
|
||||||
@@ -130,34 +113,42 @@ export default {
|
|||||||
],
|
],
|
||||||
initializationData: {
|
initializationData: {
|
||||||
passport: {
|
passport: {
|
||||||
|
category: "passport",
|
||||||
id: null,
|
id: null,
|
||||||
series: null,
|
series: null,
|
||||||
number: null,
|
number: null,
|
||||||
issued_by_org: null,
|
issued_by: null,
|
||||||
issued_by_org_code: null,
|
issued_by_org_code: null,
|
||||||
issued_by_date: null,
|
issued_at: null,
|
||||||
photo: null,
|
attachments: null,
|
||||||
},
|
},
|
||||||
insurance_number: {
|
insurance_number: {
|
||||||
insurance_number: null,
|
id: null,
|
||||||
photo_insurance_number: null,
|
category: "insurance_number",
|
||||||
|
number: null,
|
||||||
|
attachments: null,
|
||||||
},
|
},
|
||||||
tax_identification_number: {
|
tax_identification_number: {
|
||||||
tax_identification_number: null,
|
id: null,
|
||||||
photo_tax_identification_number: null,
|
category: "tax_identification_number",
|
||||||
|
number: null,
|
||||||
|
attachments: null,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
personDataField: ["insurance_number", "tax_identification_number"],
|
personDataField: [
|
||||||
|
"insurance_number:number",
|
||||||
|
"tax_identification_number:number",
|
||||||
|
],
|
||||||
showModal: false,
|
showModal: false,
|
||||||
photoId: "",
|
photoId: "",
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
initialDocData() {
|
initialDocData() {
|
||||||
return this.$store.state.medical?.documents;
|
return this.$store.state.medical.documents;
|
||||||
},
|
},
|
||||||
passportFields() {
|
passportFields() {
|
||||||
let excludedFields = ["photo", "id"];
|
let excludedFields = ["attachments", "id", "category"];
|
||||||
return Object.keys(this.docData.passport).filter(
|
return Object.keys(this.docData.passport).filter(
|
||||||
(key) => !excludedFields.includes(key)
|
(key) => !excludedFields.includes(key)
|
||||||
);
|
);
|
||||||
@@ -173,15 +164,13 @@ export default {
|
|||||||
.getValidationComponents()
|
.getValidationComponents()
|
||||||
.filter((elem) => !this.personDataField.includes(elem.name))
|
.filter((elem) => !this.personDataField.includes(elem.name))
|
||||||
.forEach((elem) => elem.resetValidation());
|
.forEach((elem) => elem.resetValidation());
|
||||||
this.approvedPassportData = true;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
this.approvedPassportData = false;
|
|
||||||
return defaultRule(val);
|
return defaultRule(val);
|
||||||
},
|
},
|
||||||
removeImage(docKey, field) {
|
removeImage(docKey, field) {
|
||||||
this.docData[docKey][field] = {};
|
this.docData[docKey][field] = {};
|
||||||
this.isCheckChange = true;
|
this.checkChangeDocData();
|
||||||
},
|
},
|
||||||
copyValue(text) {
|
copyValue(text) {
|
||||||
navigator.clipboard.writeText(text);
|
navigator.clipboard.writeText(text);
|
||||||
@@ -190,9 +179,7 @@ export default {
|
|||||||
return !this.isEdit && this.copiedFields.some((elem) => elem === key);
|
return !this.isEdit && this.copiedFields.some((elem) => elem === key);
|
||||||
},
|
},
|
||||||
cancelEdit() {
|
cancelEdit() {
|
||||||
this.docData = JSON.parse(JSON.stringify(this.initialDocData));
|
this.docData = this.destruct(this.initialDocData);
|
||||||
this.docData.passport.issued_by_date =
|
|
||||||
this.initialDocData?.passport?.issued_by_date;
|
|
||||||
this.isEdit = false;
|
this.isEdit = false;
|
||||||
this.isCheckChange = false;
|
this.isCheckChange = false;
|
||||||
this.$refs.documentForm.resetValidation();
|
this.$refs.documentForm.resetValidation();
|
||||||
@@ -201,7 +188,10 @@ export default {
|
|||||||
this.isEdit = true;
|
this.isEdit = true;
|
||||||
},
|
},
|
||||||
checkChangeDocData() {
|
checkChangeDocData() {
|
||||||
this.isCheckChange = checkChangeData(this.initialDocData, this.docData);
|
this.isCheckChange = checkChangeData(
|
||||||
|
this.destruct(this.initialDocData),
|
||||||
|
this.docData
|
||||||
|
);
|
||||||
},
|
},
|
||||||
openModal(id) {
|
openModal(id) {
|
||||||
this.photoId = id;
|
this.photoId = id;
|
||||||
@@ -217,95 +207,48 @@ export default {
|
|||||||
if (!validate) {
|
if (!validate) {
|
||||||
getFieldsNameUnvalidated(form).forEach((elem) => {
|
getFieldsNameUnvalidated(form).forEach((elem) => {
|
||||||
let error = {};
|
let error = {};
|
||||||
this.configData.forEach(({ fields }) => {
|
this.configData.forEach(({ dataKey, fields }) => {
|
||||||
let findedElem = fields.find((el) => el.key === elem);
|
let findedElem = fields.find(
|
||||||
|
(el) => dataKey + ":" + el.key === elem
|
||||||
|
);
|
||||||
if (findedElem) error = findedElem?.errorMessage;
|
if (findedElem) error = findedElem?.errorMessage;
|
||||||
});
|
});
|
||||||
this.addErrorNotification(error?.title, error?.message);
|
this.addErrorNotification(error?.title, error?.message);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
let passportFormData = new FormData();
|
|
||||||
let documentsFormData = new FormData();
|
|
||||||
form.getValidationComponents().forEach((elem) => {
|
|
||||||
if (!this.personDataField.includes(elem.name)) {
|
|
||||||
if (elem.name === "issued_by_date") {
|
|
||||||
passportFormData.append(
|
|
||||||
elem.name,
|
|
||||||
this.convertFormat(elem.modelValue) ?? ""
|
|
||||||
);
|
|
||||||
} else passportFormData.append(elem.name, elem.modelValue ?? "");
|
|
||||||
} else documentsFormData.append(elem.name, elem.modelValue ?? "");
|
|
||||||
});
|
|
||||||
this.checkChangePhoto("passport", "photo", passportFormData);
|
|
||||||
this.checkChangePhoto(
|
|
||||||
"insurance_number",
|
|
||||||
"photo_insurance_number",
|
|
||||||
documentsFormData
|
|
||||||
);
|
|
||||||
this.checkChangePhoto(
|
|
||||||
"tax_identification_number",
|
|
||||||
"photo_tax_identification_number",
|
|
||||||
documentsFormData
|
|
||||||
);
|
|
||||||
let request = [];
|
let request = [];
|
||||||
if (!this.approvedPassportData) {
|
Object.keys(this.docData).forEach((elem) => {
|
||||||
if (!this.initialDocData.passport?.id) {
|
this.checkChangePhoto(elem, "attachments");
|
||||||
passportFormData.append("kind", "PASSPORT");
|
let newData = JSON.parse(JSON.stringify(this.docData[elem]));
|
||||||
passportFormData.append(
|
newData.attachments = {};
|
||||||
"person",
|
if (!checkChangeData(this.initialDocData?.[elem], newData)) return;
|
||||||
this.$store.state.medical?.basicData?.personalData?.id
|
delete newData.id;
|
||||||
);
|
if (newData?.issued_by_org_code) {
|
||||||
request.push(
|
console.log(
|
||||||
this.sendData(
|
"passport issued_by_org_code",
|
||||||
"general/identity_document/create/",
|
newData.issued_by_org_code
|
||||||
passportFormData
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
delete newData.issued_by_org_code;
|
||||||
|
}
|
||||||
|
delete newData.attachments;
|
||||||
|
Object.keys(this.docData[elem])?.forEach((key) => {
|
||||||
|
if (!this.docData[elem]?.[key]) delete newData?.[key];
|
||||||
|
});
|
||||||
|
if (!this.initialDocData?.[elem]?.id) {
|
||||||
|
newData.person_id =
|
||||||
|
this.$store.state.medical?.basicData?.personalData?.id;
|
||||||
|
request.push(this.createData("documents/", newData));
|
||||||
} else {
|
} else {
|
||||||
if (this.checkPhotoDeletion("passport", "photo"))
|
|
||||||
request.push(
|
|
||||||
this.deletePhoto(
|
|
||||||
`general/identity_document/${this.initialDocData.passport?.id}/delete_photo/`
|
|
||||||
)
|
|
||||||
);
|
|
||||||
request.push(
|
request.push(
|
||||||
this.sendData(
|
this.updateData(
|
||||||
`general/identity_document/${this.initialDocData.passport?.id}/update/`,
|
`documents/${this.initialDocData?.[elem]?.id}`,
|
||||||
passportFormData
|
newData
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
if (
|
|
||||||
this.checkPhotoDeletion(
|
|
||||||
"insurance_number",
|
|
||||||
"photo_insurance_number"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
request.push(
|
|
||||||
this.deletePhoto(
|
|
||||||
`general/person/${this.$store.state.medical?.basicData?.personalData?.id}/delete_photo_insurance_number/`
|
|
||||||
)
|
|
||||||
);
|
|
||||||
if (
|
|
||||||
this.checkPhotoDeletion(
|
|
||||||
"tax_identification_number",
|
|
||||||
"photo_tax_identification_number"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
request.push(
|
|
||||||
this.deletePhoto(
|
|
||||||
`general/person/${this.$store.state.medical?.basicData?.personalData?.id}/delete_photo_tax_identification_number/`
|
|
||||||
)
|
|
||||||
);
|
|
||||||
request.push(
|
|
||||||
this.sendData(
|
|
||||||
`general/person/${this.$store.state.medical?.basicData?.personalData?.id}/update/`,
|
|
||||||
documentsFormData
|
|
||||||
)
|
|
||||||
);
|
|
||||||
Promise.allSettled(request).then(() => {
|
Promise.allSettled(request).then(() => {
|
||||||
this.$store.dispatch("getMedicalCardData");
|
this.getMedicalDataById(this.$route.params.id);
|
||||||
this.isEdit = false;
|
this.isEdit = false;
|
||||||
this.isCheckChange = false;
|
this.isCheckChange = false;
|
||||||
this.$refs.form?.resetValidation();
|
this.$refs.form?.resetValidation();
|
||||||
@@ -313,18 +256,19 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
checkChangePhoto(updatedObjId, field, formData) {
|
checkChangePhoto(updatedObjId, field) {
|
||||||
if (this.docData[updatedObjId][field]?.file)
|
if (this.docData[updatedObjId][field]?.file)
|
||||||
formData.append(field, this.docData[updatedObjId][field]?.file[0]);
|
console.log(
|
||||||
|
updatedObjId,
|
||||||
|
field,
|
||||||
|
this.docData[updatedObjId][field]?.file[0]
|
||||||
|
);
|
||||||
},
|
},
|
||||||
checkPhotoDeletion(updatedObjId, field) {
|
async createData(url, body) {
|
||||||
return (
|
return await fetchWrapper.post(url, body);
|
||||||
!Object.keys(this.docData[updatedObjId][field]).length &&
|
|
||||||
this.initialDocData[updatedObjId][field]?.photo
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
async sendData(url, body) {
|
async updateData(url, body) {
|
||||||
return await fetchWrapper.post(url, body, "formData");
|
return await fetchWrapper.patch(url, body);
|
||||||
},
|
},
|
||||||
async deletePhoto(url) {
|
async deletePhoto(url) {
|
||||||
return await fetchWrapper.del(url);
|
return await fetchWrapper.del(url);
|
||||||
@@ -333,7 +277,19 @@ export default {
|
|||||||
addNotification(title + message, title, message, "error", 5000);
|
addNotification(title + message, title, message, "error", 5000);
|
||||||
},
|
},
|
||||||
convertFormat(date) {
|
convertFormat(date) {
|
||||||
return date ? date.split(".").reverse().join("-") : null;
|
return date ? date.split(".").reverse().join("-") : "";
|
||||||
|
},
|
||||||
|
...mapActions({
|
||||||
|
getMedicalDataById: "getMedicalDataById",
|
||||||
|
}),
|
||||||
|
destruct(data) {
|
||||||
|
const { passport, insurance_number, tax_identification_number } =
|
||||||
|
JSON.parse(JSON.stringify(data));
|
||||||
|
return {
|
||||||
|
passport: passport,
|
||||||
|
insurance_number: insurance_number,
|
||||||
|
tax_identification_number: tax_identification_number,
|
||||||
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -341,11 +297,8 @@ export default {
|
|||||||
deep: true,
|
deep: true,
|
||||||
immediate: true,
|
immediate: true,
|
||||||
handler(value) {
|
handler(value) {
|
||||||
if (Object.keys(value).length) {
|
if (Object.keys(value).length) this.docData = this.destruct(value);
|
||||||
this.docData = JSON.parse(JSON.stringify(this.initialDocData));
|
else this.docData = this.initializationData;
|
||||||
this.docData.passport.issued_by_date =
|
|
||||||
this.initialDocData?.passport?.issued_by_date;
|
|
||||||
} else this.docData = this.initializationData;
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -370,9 +323,13 @@ export default {
|
|||||||
min-width: 302px
|
min-width: 302px
|
||||||
.icon-copy .cursor
|
.icon-copy .cursor
|
||||||
cursor: pointer !important
|
cursor: pointer !important
|
||||||
|
.icon-cancel :deep(path)
|
||||||
|
fill: var(--default-white)
|
||||||
.q-badge
|
.q-badge
|
||||||
padding: 4px
|
padding: 4px
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
.delete
|
.delete
|
||||||
background-color: var(--btn-red-color)
|
background-color: var(--btn-red-color)
|
||||||
|
.cancel-icon :deep(path)
|
||||||
|
fill: white
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
:save="saveChange",
|
:save="saveChange",
|
||||||
:cancel="cancelEdit"
|
:cancel="cancelEdit"
|
||||||
)
|
)
|
||||||
.form-wrap.gap-24.w-full
|
q-form.form-wrap.gap-24.w-full(ref="insuranceForm", :no-error-focus="true")
|
||||||
.flex.flex-col.gap-4(v-for="insurance in insuranceConfig", :key="insurance.insuranceKey")
|
.flex.flex-col.gap-4(v-for="insurance in insuranceConfig", :key="insurance.insuranceKey")
|
||||||
.font-semibold.text-sm.whitespace-nowrap {{insurance.insuranceLabel}}
|
.font-semibold.text-sm.whitespace-nowrap {{insurance.insuranceLabel}}
|
||||||
.flex.w-full.justify-between.items-center.gap-4(
|
.flex.w-full.justify-between.items-center.gap-4(
|
||||||
@@ -17,23 +17,27 @@
|
|||||||
:style="{marginTop: field.label === 'Документы' ? '20px' : null}"
|
:style="{marginTop: field.label === 'Документы' ? '20px' : null}"
|
||||||
)
|
)
|
||||||
.label-field.font-sm.text-sm.whitespace-nowrap {{`${field.label} :`}}
|
.label-field.font-sm.text-sm.whitespace-nowrap {{`${field.label} :`}}
|
||||||
.avatar-field.flex.gap-3.items-center.h-10.w-10(v-if="field.type === 'avatar'")
|
.flex.gap-3.items-center.h-10.w-10(
|
||||||
.flex.w-10.h-10.relative(v-if="basic[insurance.insuranceKey][field.key]?.photo")
|
v-if="field.type === 'photo'",
|
||||||
|
:style="{'min-width': field.label === 'Документы' ? '324px' : '302px'}"
|
||||||
|
)
|
||||||
|
.flex.w-10.h-10.relative(v-if="insuranceData[insurance.insuranceKey]?.attachments?.photo")
|
||||||
img.rounded.avatar.object-cover(
|
img.rounded.avatar.object-cover(
|
||||||
:src="basic[insurance.insuranceKey][field.key].photo",
|
:src="insuranceData[insurance.insuranceKey]?.attachments?.photo",
|
||||||
alt="AV"
|
alt="AV"
|
||||||
)
|
)
|
||||||
q-badge.delete(
|
q-badge.delete(
|
||||||
floating,
|
floating,
|
||||||
v-if="isEdit",
|
v-if="isEdit",
|
||||||
@click="removeImage(insurance?.insuranceKey, field?.key)",
|
@click="removeImage(insurance?.insuranceKey, field?.key)",
|
||||||
rounded
|
rounded,
|
||||||
|
:style="{padding: 0}"
|
||||||
)
|
)
|
||||||
q-icon(name="app:icon-cancel", size="8px")
|
q-icon.cancel-icon(name="app:cancel-mini", size="16px")
|
||||||
.replace-photo.font-medium.text-base.cursor-pointer(
|
.replace-photo.font-medium.text-base.cursor-pointer(
|
||||||
v-if="isEdit",
|
v-if="isEdit",
|
||||||
@click="changeModal(insurance.insuranceKey)"
|
@click="changeModal(insurance.insuranceKey)"
|
||||||
) {{ basic[insurance.insuranceKey][field.key]?.photo ? "Заменить фото" : "Добавить фото" }}
|
) {{ insuranceData[insurance.insuranceKey]?.attachments?.photo ? "Заменить фото" : "Добавить фото" }}
|
||||||
base-modal(
|
base-modal(
|
||||||
v-if="insurance.insuranceKey === photoId"
|
v-if="insurance.insuranceKey === photoId"
|
||||||
v-model="showModal",
|
v-model="showModal",
|
||||||
@@ -41,18 +45,18 @@
|
|||||||
)
|
)
|
||||||
base-upload-photo(
|
base-upload-photo(
|
||||||
:key="insurance.insuranceKey"
|
:key="insurance.insuranceKey"
|
||||||
v-model="basic[photoId][field.key]"
|
v-model="insuranceData[photoId][field.key]"
|
||||||
:confirm-upload="confirmChangePhoto"
|
:confirm-upload="confirmChangePhoto"
|
||||||
)
|
)
|
||||||
.flex.h-10.relative(
|
.category.flex.h-10.relative.gap-x-2(v-else-if="field.type === 'select'")
|
||||||
v-else-if="field.type === 'select'",
|
.category-select.flex.items-center.change.px-4.rounded {{selectCategory(basic[insurance.insuranceKey][field.key])}}
|
||||||
@click="openModalCategories"
|
q-btn.change.flex.w-7.h-9.rounded-md(
|
||||||
)
|
v-if="isEdit",
|
||||||
q-field.items-center.categories(
|
@click="openModalCategories",
|
||||||
:style="{cursor: isEdit ? 'pointer' : 'default'}",
|
dense,
|
||||||
:readonly="!isEdit",
|
padding="8px"
|
||||||
outlined
|
)
|
||||||
) {{selectCategory(basic[insurance.insuranceKey][field.key])}}
|
q-icon.icon(name="app:folder", size="24px")
|
||||||
base-modal(
|
base-modal(
|
||||||
default-padding,
|
default-padding,
|
||||||
hide-header,
|
hide-header,
|
||||||
@@ -77,33 +81,36 @@
|
|||||||
) {{"\xa0" + basic?.benefit[insurance?.discount] + "%"}}
|
) {{"\xa0" + basic?.benefit[insurance?.discount] + "%"}}
|
||||||
.input-container.flex.flex-col.relative(v-else)
|
.input-container.flex.flex-col.relative(v-else)
|
||||||
base-input(
|
base-input(
|
||||||
v-model="basic[insurance.insuranceKey][field.key]",
|
v-model="insuranceData[insurance.insuranceKey][field.key]",
|
||||||
@update:model-value="checkChangeInput",
|
@update:model-value="checkChangeInput",
|
||||||
:mask="field?.inputMask",
|
|
||||||
:readonly="!isEdit",
|
:readonly="!isEdit",
|
||||||
:type="field.type",
|
size="M",
|
||||||
size="M"
|
:name="insurance.insuranceKey + ':' + field.key",
|
||||||
|
:rule="[(val) => checkFields(val, insurance.insuranceKey, field.rules)]"
|
||||||
)
|
)
|
||||||
q-icon.my-auto.text-lg.label-field.cursor-pointer(
|
q-icon.my-auto.text-lg.label-field.cursor-pointer.copy(
|
||||||
size="18px",
|
size="18px",
|
||||||
name="app:icon-copy",
|
name="app:copy",
|
||||||
v-if="checkCopiedFields(field.key, basic[insurance.insuranceKey])",
|
v-if="checkCopiedFields(field.key, insuranceData[insurance.insuranceKey])",
|
||||||
@click="copyValue(basic[insurance.insuranceKey][field.key])"
|
@click="copyValue(insuranceData[insurance.insuranceKey][field.key])"
|
||||||
)
|
)
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { baseInsuranceForm } from "@/pages/newMedicalCard/utils/medicalConfig";
|
import { baseInsuranceForm } from "@/pages/newMedicalCard/utils/medicalConfig";
|
||||||
import { mapGetters, mapState } from "vuex";
|
import { mapActions, mapGetters, mapState } from "vuex";
|
||||||
import MedicalFormWrapper from "@/pages/newMedicalCard/components/MedicalFormWrapper.vue";
|
import MedicalFormWrapper from "@/pages/newMedicalCard/components/MedicalFormWrapper.vue";
|
||||||
import BaseAvatar from "@/components/base/BaseAvatar.vue";
|
import BaseAvatar from "@/components/base/BaseAvatar.vue";
|
||||||
import { fetchWrapper } from "@/shared/fetchWrapper";
|
import { fetchWrapper } from "@/shared/fetchWrapper";
|
||||||
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 BaseCategorySelection from "@/components/base/BaseCategorySelection.vue";
|
import BaseCategorySelection from "@/components/base/BaseCategorySelection.vue";
|
||||||
import { checkChangeData } from "@/shared/utils/changesObjects";
|
|
||||||
import { addNotification } from "@/components/Notifications/notificationContext";
|
import { addNotification } from "@/components/Notifications/notificationContext";
|
||||||
import BaseInput from "@/components/base/BaseInput.vue";
|
import BaseInput from "@/components/base/BaseInput.vue";
|
||||||
|
import {
|
||||||
|
checkChangeData,
|
||||||
|
getFieldsNameUnvalidated,
|
||||||
|
} from "@/shared/utils/changesObjects.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "InsuranceForm",
|
name: "InsuranceForm",
|
||||||
@@ -125,28 +132,70 @@ export default {
|
|||||||
showModalCategories: false,
|
showModalCategories: false,
|
||||||
photoId: "",
|
photoId: "",
|
||||||
copiedFields: ["series", "number"],
|
copiedFields: ["series", "number"],
|
||||||
|
insuranceData: {},
|
||||||
|
initializationData: {
|
||||||
|
OMS: {
|
||||||
|
category: "OMS",
|
||||||
|
id: null,
|
||||||
|
series: null,
|
||||||
|
number: null,
|
||||||
|
issued_by: null,
|
||||||
|
issued_at: "",
|
||||||
|
attachments: null,
|
||||||
|
},
|
||||||
|
DMS: {
|
||||||
|
category: "OMS",
|
||||||
|
id: null,
|
||||||
|
series: null,
|
||||||
|
number: null,
|
||||||
|
issued_by: null,
|
||||||
|
issued_at: "",
|
||||||
|
attachments: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
url: "getUrl",
|
url: "getUrl",
|
||||||
avatar: "getAvatar",
|
|
||||||
initDataBasic: "getBasicData",
|
|
||||||
}),
|
}),
|
||||||
...mapState({
|
...mapState({
|
||||||
basic: (state) => state.medical.basicData,
|
basic: (state) => state.medical?.basicData,
|
||||||
benefitData: (state) => state.medical.benefitData,
|
benefitData: (state) => state.medical?.benefitData,
|
||||||
}),
|
}),
|
||||||
|
initialDocData() {
|
||||||
|
return this.$store.state.medical.documents;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
checkFields(val, insuranceKey, defaultRule) {
|
||||||
|
const filteredFields = ["series", "number"];
|
||||||
|
if (
|
||||||
|
filteredFields?.every(
|
||||||
|
(elem) => !this.insuranceData?.[insuranceKey]?.[elem]
|
||||||
|
) &&
|
||||||
|
!this.initialDocData?.[insuranceKey]?.id
|
||||||
|
) {
|
||||||
|
this.$refs.insuranceForm
|
||||||
|
.getValidationComponents()
|
||||||
|
.filter(
|
||||||
|
(elem) =>
|
||||||
|
elem.name === `${insuranceKey}:series` ||
|
||||||
|
elem.name === `${insuranceKey}:number`
|
||||||
|
)
|
||||||
|
.forEach((elem) => elem.resetValidation());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return defaultRule(val);
|
||||||
|
},
|
||||||
filterDataBenefit(text) {
|
filterDataBenefit(text) {
|
||||||
if (text.length > 1)
|
if (text.length > 1)
|
||||||
return this.$store.dispatch("getBenefitDataSearch", text);
|
return this.$store.dispatch("getBenefitDataSearch", text);
|
||||||
this.$store.dispatch("getBenefitData", text);
|
this.$store.dispatch("getBenefitData", text);
|
||||||
},
|
},
|
||||||
removeImage(docKey, field) {
|
removeImage(docKey, field) {
|
||||||
this.basic[docKey][field] = {};
|
this.insuranceData[docKey][field] = {};
|
||||||
this.isCheckChange = true;
|
this.checkChangeInput();
|
||||||
},
|
},
|
||||||
checkCopiedFields(key, item) {
|
checkCopiedFields(key, item) {
|
||||||
return (
|
return (
|
||||||
@@ -170,6 +219,7 @@ export default {
|
|||||||
this.isCheckChange = true;
|
this.isCheckChange = true;
|
||||||
},
|
},
|
||||||
changeModal(id) {
|
changeModal(id) {
|
||||||
|
if (id === "benefit") return;
|
||||||
this.photoId = id;
|
this.photoId = id;
|
||||||
this.showModal = true;
|
this.showModal = true;
|
||||||
},
|
},
|
||||||
@@ -177,191 +227,101 @@ export default {
|
|||||||
this.showModalCategories = false;
|
this.showModalCategories = false;
|
||||||
},
|
},
|
||||||
openModalCategories() {
|
openModalCategories() {
|
||||||
if (this.isEdit) this.showModalCategories = true;
|
//if (this.isEdit) this.showModalCategories = true;
|
||||||
},
|
},
|
||||||
checkChangeInput() {
|
checkChangeInput() {
|
||||||
this.isCheckChange =
|
this.isCheckChange = checkChangeData(
|
||||||
JSON.stringify(this.initDataBasic) !== JSON.stringify(this.basic)
|
this.destruct(this.initialDocData),
|
||||||
? true
|
this.insuranceData
|
||||||
: false;
|
);
|
||||||
},
|
},
|
||||||
confirmChangePhoto() {
|
confirmChangePhoto() {
|
||||||
this.showModal = false;
|
this.showModal = false;
|
||||||
this.isCheckChange = true;
|
this.isCheckChange = true;
|
||||||
},
|
},
|
||||||
|
saveChange() {
|
||||||
updateBasicData() {
|
const form = this.$refs.insuranceForm;
|
||||||
let insuranceDMS = this.basic.insuranceDMS;
|
form.validate().then((validate) => {
|
||||||
let insuranceOMS = this.basic.insuranceOMS;
|
if (!validate) {
|
||||||
let personal = this.basic.personalData;
|
getFieldsNameUnvalidated(form).forEach((elem) => {
|
||||||
let benefit = this.basic.benefit;
|
let error = {};
|
||||||
|
this.insuranceConfig.forEach(({ insuranceKey, fields }) => {
|
||||||
const insuranceFormDataDMS = new FormData();
|
let findedElem = fields.find(
|
||||||
const insuranceFormDataOMS = new FormData();
|
(el) => insuranceKey + ":" + el.key === elem
|
||||||
const benefitFormData = new FormData();
|
);
|
||||||
|
if (findedElem) error = findedElem?.errorMessage;
|
||||||
if (insuranceDMS.series && insuranceDMS.number) {
|
});
|
||||||
for (let key in insuranceDMS) {
|
this.addErrorNotification(error?.title, error?.message);
|
||||||
if (insuranceDMS[key] && key !== "photo" && key !== "id")
|
|
||||||
insuranceFormDataDMS.append(key, insuranceDMS[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
insuranceDMS.photo.file &&
|
|
||||||
insuranceDMS.photo.photo !== this.initDataBasic.insuranceDMS.photo.photo
|
|
||||||
)
|
|
||||||
insuranceFormDataDMS.append("photo", insuranceDMS.photo.file[0]);
|
|
||||||
|
|
||||||
if (insuranceOMS.series && insuranceOMS.number) {
|
|
||||||
for (let key in insuranceOMS) {
|
|
||||||
if (insuranceOMS[key] && key !== "photo" && key !== "id")
|
|
||||||
insuranceFormDataOMS.append(key, insuranceOMS[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
insuranceOMS.photo.file &&
|
|
||||||
insuranceOMS.photo.photo !== this.initDataBasic.insuranceOMS.photo.photo
|
|
||||||
)
|
|
||||||
insuranceFormDataOMS.append("photo", insuranceOMS.photo.file[0]);
|
|
||||||
|
|
||||||
const request = Object.keys(this.basic).map((key) => {
|
|
||||||
if (
|
|
||||||
key === "insuranceDMS" &&
|
|
||||||
!insuranceDMS?.id &&
|
|
||||||
insuranceDMS.series &&
|
|
||||||
insuranceDMS.number
|
|
||||||
) {
|
|
||||||
insuranceFormDataDMS.append("title", "DMS");
|
|
||||||
insuranceFormDataDMS.append("person", personal.id);
|
|
||||||
return this.sendData(
|
|
||||||
`general/insurance_policy/create/`,
|
|
||||||
insuranceFormDataDMS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
key === "insuranceOMS" &&
|
|
||||||
!insuranceOMS?.id &&
|
|
||||||
insuranceOMS.series &&
|
|
||||||
insuranceOMS.number
|
|
||||||
) {
|
|
||||||
insuranceFormDataOMS.append("title", "OMS");
|
|
||||||
insuranceFormDataOMS.append("person", personal.id);
|
|
||||||
return this.sendData(
|
|
||||||
`general/insurance_policy/create/`,
|
|
||||||
insuranceFormDataOMS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
checkChangeData(this.initDataBasic.insuranceDMS, insuranceDMS) &&
|
|
||||||
key === "insuranceDMS" &&
|
|
||||||
insuranceDMS.id
|
|
||||||
) {
|
|
||||||
this.checkedPhoto(
|
|
||||||
insuranceDMS.photo,
|
|
||||||
insuranceDMS.id,
|
|
||||||
"insurance_policy",
|
|
||||||
"delete_photo"
|
|
||||||
);
|
|
||||||
insuranceFormDataDMS.append("title", "DMS");
|
|
||||||
return this.sendData(
|
|
||||||
`general/insurance_policy/${insuranceDMS.id}/update/`,
|
|
||||||
insuranceFormDataDMS
|
|
||||||
);
|
|
||||||
} else if (
|
|
||||||
insuranceDMS.id &&
|
|
||||||
(!insuranceDMS.series || !insuranceDMS.number)
|
|
||||||
) {
|
|
||||||
this.addErrorNotification(
|
|
||||||
"Ошибка заполнения формы ДМС",
|
|
||||||
"Пожалуйста заполните все поля"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
checkChangeData(this.initDataBasic.insuranceOMS, insuranceOMS) &&
|
|
||||||
key === "insuranceOMS" &&
|
|
||||||
insuranceOMS.id
|
|
||||||
) {
|
|
||||||
this.checkedPhoto(
|
|
||||||
insuranceOMS.photo,
|
|
||||||
insuranceOMS.id,
|
|
||||||
"insurance_policy",
|
|
||||||
"delete_photo"
|
|
||||||
);
|
|
||||||
insuranceFormDataOMS.append("title", "OMS");
|
|
||||||
return this.sendData(
|
|
||||||
`general/insurance_policy/${insuranceOMS.id}/update/`,
|
|
||||||
insuranceFormDataOMS
|
|
||||||
);
|
|
||||||
} else if (
|
|
||||||
insuranceOMS.id &&
|
|
||||||
(!insuranceOMS.series || !insuranceOMS.number)
|
|
||||||
) {
|
|
||||||
this.addErrorNotification(
|
|
||||||
"Ошибка заполнения формы ОМС",
|
|
||||||
"Пожалуйста заполните все поля"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
checkChangeData(this.initDataBasic.benefit, benefit) &&
|
|
||||||
key === "benefit"
|
|
||||||
) {
|
|
||||||
this.checkedPhoto(
|
|
||||||
benefit.photo,
|
|
||||||
personal.id,
|
|
||||||
"person",
|
|
||||||
"delete_photo_benefit"
|
|
||||||
);
|
|
||||||
fetchWrapper.post(`general/person/${personal.id}/update/`, {
|
|
||||||
benefit: benefit.id,
|
|
||||||
});
|
});
|
||||||
if (
|
} else {
|
||||||
benefit.photo.file &&
|
let request = [];
|
||||||
benefit.photo.photo !== this.initDataBasic.benefit.photo.photo
|
Object.keys(this.insuranceData).forEach((elem) => {
|
||||||
) {
|
this.checkChangePhoto(elem, "attachments");
|
||||||
benefitFormData.append("photo_benefit", benefit.photo.file[0]);
|
let newData = JSON.parse(JSON.stringify(this.insuranceData[elem]));
|
||||||
return this.sendData(
|
newData.attachments = {};
|
||||||
`general/person/${personal.id}/update/`,
|
if (!checkChangeData(this.initialDocData?.[elem], newData)) return;
|
||||||
benefitFormData
|
delete newData.id;
|
||||||
);
|
delete newData.attachments;
|
||||||
}
|
Object.keys(this.insuranceData[elem])?.forEach((key) => {
|
||||||
|
if (!this.insuranceData?.[elem]?.[key]) delete newData?.[key];
|
||||||
|
});
|
||||||
|
if (!this.initialDocData?.[elem]?.id) {
|
||||||
|
newData.person_id =
|
||||||
|
this.$store.state.medical?.basicData?.personalData?.id;
|
||||||
|
request.push(this.createData("documents/", newData));
|
||||||
|
} else
|
||||||
|
request.push(
|
||||||
|
this.updateData(
|
||||||
|
`documents/${this.initialDocData?.[elem]?.id}`,
|
||||||
|
newData
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
if (request.length)
|
||||||
|
Promise.allSettled(request).then(() => {
|
||||||
|
this.getMedicalDataById(this.$route.params.id);
|
||||||
|
this.isEdit = false;
|
||||||
|
this.isCheckChange = false;
|
||||||
|
this.$refs.form?.resetValidation();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return request;
|
|
||||||
},
|
},
|
||||||
checkedPhoto(photo, id, key, title) {
|
checkChangePhoto(updatedObjId, field) {
|
||||||
if (!photo?.photo) {
|
if (this.insuranceData[updatedObjId][field]?.file)
|
||||||
return this.delPhoto(`general/${key}/${id}/${title}/`);
|
console.log(
|
||||||
}
|
updatedObjId,
|
||||||
|
field,
|
||||||
|
this.insuranceData[updatedObjId][field]?.file[0]
|
||||||
|
);
|
||||||
},
|
},
|
||||||
addErrorNotification(title, message) {
|
addErrorNotification(title, message) {
|
||||||
addNotification(title + message, title, message, "error", 5000);
|
addNotification(title + message, title, message, "error", 5000);
|
||||||
},
|
},
|
||||||
|
async createData(url, body) {
|
||||||
async sendData(url, body) {
|
return await fetchWrapper.post(url, body);
|
||||||
return await fetchWrapper.post(url, body, "formData");
|
|
||||||
},
|
},
|
||||||
async delPhoto(url) {
|
async updateData(url, body) {
|
||||||
return await fetchWrapper.del(url);
|
return await fetchWrapper.patch(url, body);
|
||||||
},
|
},
|
||||||
cancelEdit() {
|
cancelEdit() {
|
||||||
this.$store.dispatch("returnInitData");
|
this.insuranceData = this.destruct(this.initialDocData);
|
||||||
this.isEdit = false;
|
this.isEdit = false;
|
||||||
this.isCheckChange = false;
|
this.isCheckChange = false;
|
||||||
},
|
},
|
||||||
openEdit() {
|
openEdit() {
|
||||||
this.isEdit = true;
|
this.isEdit = true;
|
||||||
},
|
},
|
||||||
saveChange() {
|
destruct(data) {
|
||||||
this.isLoadingData = true;
|
const { OMS, DMS } = JSON.parse(JSON.stringify(data));
|
||||||
let updateBasic = this.updateBasicData();
|
return {
|
||||||
Promise.allSettled(updateBasic)
|
OMS: OMS,
|
||||||
.then(() => this.$store.dispatch("getMedicalCardData"))
|
DMS: DMS,
|
||||||
.then(() => {
|
};
|
||||||
this.isLoadingData = false;
|
|
||||||
this.isEdit = false;
|
|
||||||
this.isCheckChange = false;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
...mapActions({
|
||||||
|
getMedicalDataById: "getMedicalDataById",
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
showModalCategories: {
|
showModalCategories: {
|
||||||
@@ -370,6 +330,15 @@ export default {
|
|||||||
if (newVal) this.$store.dispatch("getBenefitData");
|
if (newVal) this.$store.dispatch("getBenefitData");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
initialDocData: {
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
handler(newVal) {
|
||||||
|
if (Object.keys(newVal).length) {
|
||||||
|
this.insuranceData = this.destruct(newVal);
|
||||||
|
} else this.insuranceData = this.initializationData;
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@@ -382,9 +351,6 @@ export default {
|
|||||||
background: rgba(0, 0, 0, 0.05)
|
background: rgba(0, 0, 0, 0.05)
|
||||||
color: var(--font-dark-blue-color)
|
color: var(--font-dark-blue-color)
|
||||||
|
|
||||||
.avatar-field
|
|
||||||
min-width: 302px
|
|
||||||
|
|
||||||
.avatar
|
.avatar
|
||||||
height: 100%
|
height: 100%
|
||||||
|
|
||||||
@@ -415,27 +381,25 @@ export default {
|
|||||||
.delete
|
.delete
|
||||||
background-color: var(--btn-red-color)
|
background-color: var(--btn-red-color)
|
||||||
|
|
||||||
|
.category
|
||||||
|
width: 324px
|
||||||
|
|
||||||
.categories :deep(.q-field__control)
|
.category-select
|
||||||
height: 40px
|
min-width: 276px
|
||||||
color: var(--font-dark-blue-color)
|
|
||||||
padding: 0 16px
|
|
||||||
background: var(--bg-light-grey) !important
|
|
||||||
&:before
|
|
||||||
border: none !important
|
|
||||||
transition: none
|
|
||||||
&:after
|
|
||||||
border: none !important
|
|
||||||
transition: none
|
|
||||||
transform: none !important
|
|
||||||
|
|
||||||
.categories :deep(.q-field__native)
|
.icon :deep(path)
|
||||||
font-weight: 500
|
fill: var(--font-grey-color)
|
||||||
font-size: 16px
|
|
||||||
line-height: normal
|
.icon-cancel :deep(path)
|
||||||
color: var(--font-dark-blue-color)
|
fill: var(--default-white)
|
||||||
padding: 8px 0
|
|
||||||
background: var(--bg-light-grey) !important
|
.copy :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
|
|
||||||
|
.change
|
||||||
|
background: var(--bg-light-grey)
|
||||||
|
color: var(--font-grey-color)
|
||||||
|
border: 1px solid var(--gray-secondary)
|
||||||
|
|
||||||
.q-field--outlined.q-field--readonly :deep(.q-field__control)
|
.q-field--outlined.q-field--readonly :deep(.q-field__control)
|
||||||
background: var(--bg-light-grey) !important
|
background: var(--bg-light-grey) !important
|
||||||
@@ -447,4 +411,7 @@ export default {
|
|||||||
|
|
||||||
.q-field--outlined.q-field--readonly :deep(.q-field__native)
|
.q-field--outlined.q-field--readonly :deep(.q-field__native)
|
||||||
cursor: default
|
cursor: default
|
||||||
|
|
||||||
|
.cancel-icon :deep(path)
|
||||||
|
fill: white
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -22,8 +22,8 @@
|
|||||||
@click="() => copyLinkNetwork(network.username)"
|
@click="() => copyLinkNetwork(network.username)"
|
||||||
style="background-color: var(--bg-light-grey)"
|
style="background-color: var(--bg-light-grey)"
|
||||||
)
|
)
|
||||||
q-icon.icon(:name="mapNetworks[network.kind].icon" :class="{old: network.id, new: !network.id}")
|
q-icon.icon(:name="mapNetworks[network.category].icon" :class="{old: network.id, new: !network.id}")
|
||||||
span.text-smm.font-medium {{ mapNetworks[network.kind].title || network.username }}
|
span.text-smm.font-medium {{ mapNetworks[network.category].title || network.username }}
|
||||||
.flex.relative
|
.flex.relative
|
||||||
q-btn(
|
q-btn(
|
||||||
v-if="isEdit"
|
v-if="isEdit"
|
||||||
@@ -129,7 +129,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
newNetwork: {
|
newNetwork: {
|
||||||
kind: mapNetworks["TELEGRAM"],
|
category: mapNetworks["TELEGRAM"],
|
||||||
username: "",
|
username: "",
|
||||||
},
|
},
|
||||||
isEdit: false,
|
isEdit: false,
|
||||||
@@ -169,13 +169,13 @@ export default {
|
|||||||
saveNetwork() {
|
saveNetwork() {
|
||||||
if (this.newNetwork.username) {
|
if (this.newNetwork.username) {
|
||||||
this.confidants[this.index].networks.push({
|
this.confidants[this.index].networks.push({
|
||||||
kind: this.newNetwork.kind.id,
|
category: this.newNetwork.category.id,
|
||||||
username: this.newNetwork.username,
|
username: this.newNetwork.username,
|
||||||
});
|
});
|
||||||
this.isOpenPopupAdding = false;
|
this.isOpenPopupAdding = false;
|
||||||
this.isCheckChange = true;
|
this.isCheckChange = true;
|
||||||
this.newNetwork = {
|
this.newNetwork = {
|
||||||
kind: mapNetworks["TELEGRAM"],
|
category: mapNetworks["TELEGRAM"],
|
||||||
username: "",
|
username: "",
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -27,19 +27,19 @@
|
|||||||
icon-left
|
icon-left
|
||||||
)
|
)
|
||||||
template(v-slot:iconLeft)
|
template(v-slot:iconLeft)
|
||||||
q-icon(name="app:search", size="20px", style="color: var(--font-grey-color)")
|
q-icon.icon-grey(name="app:search", size="20px" )
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn(
|
||||||
icon="filter_alt",
|
:style="{width: '40px', height: '40px'}",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
|
q-icon.icon-grey(name="app:filter", size="24px")
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn(
|
||||||
icon="app:sort-number",
|
:style="{width: '40px', height: '40px'}",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
|
q-icon.icon-grey(name="app:sort-number", size="24px")
|
||||||
.field.flex.flex-col.overflow-y-scroll.gap-y-1(v-if="data.results.diseases")
|
.field.flex.flex-col.overflow-y-scroll.gap-y-1(v-if="data.results.diseases")
|
||||||
.letter.flex.items-center.font-bold.text-base Некоторые инфекционные и паразитарные болезни
|
.letter.flex.items-center.font-bold.text-base Некоторые инфекционные и паразитарные болезни
|
||||||
.checkbox.flex.gap-x-2.items-center(v-for="disease in data.results.diseases")
|
.checkbox.flex.gap-x-2.items-center(v-for="disease in data.results.diseases")
|
||||||
@@ -171,4 +171,7 @@ export default {
|
|||||||
|
|
||||||
.search :deep(.q-field__prepend)
|
.search :deep(.q-field__prepend)
|
||||||
padding-right: 6px
|
padding-right: 6px
|
||||||
|
|
||||||
|
.icon-grey :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -42,19 +42,19 @@
|
|||||||
size="M",
|
size="M",
|
||||||
)
|
)
|
||||||
template(v-slot:iconLeft)
|
template(v-slot:iconLeft)
|
||||||
q-icon(name="app:search", size="20px", style="color: var(--font-grey-color)")
|
q-icon.icon-grey(name="app:search", size="20px" )
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn(
|
||||||
icon="filter_alt",
|
:style="{width: '40px', height: '40px'}",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
|
q-icon.icon-grey(name="app:filter", size="24px")
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn(
|
||||||
icon="app:sort-number",
|
:style="{width: '40px', height: '40px'}",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
|
q-icon.icon-grey(name="app:sort-number", size="24px")
|
||||||
.field.flex.flex-col.overflow-y-scroll
|
.field.flex.flex-col.overflow-y-scroll
|
||||||
.checkbox.flex.flex-col(v-for="complaint in textSorting(data.results.tags)")
|
.checkbox.flex.flex-col(v-for="complaint in textSorting(data.results.tags)")
|
||||||
.letter.flex.items-center.font-bold.justify-center {{ complaint.sym }}
|
.letter.flex.items-center.font-bold.justify-center {{ complaint.sym }}
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
width="40px",
|
width="40px",
|
||||||
@click="showModal = true",
|
@click="showModal = true",
|
||||||
)
|
)
|
||||||
q-icon(name="app:plus", size="16px")
|
q-icon.icon-white(name="app:plus", size="24px")
|
||||||
base-modal(v-model="showModal", title="Создание тега", modal-padding)
|
base-modal(v-model="showModal", title="Создание тега", modal-padding)
|
||||||
tag-creation-form(:close-modal="closeModal", :create-tag="createTag")
|
tag-creation-form(:close-modal="closeModal", :create-tag="createTag")
|
||||||
.flex.gap-x-20.w-full(v-if="change || fillInspection")
|
.flex.gap-x-20.w-full(v-if="change || fillInspection")
|
||||||
@@ -365,4 +365,10 @@ export default {
|
|||||||
&::placeholder
|
&::placeholder
|
||||||
color: var(--font-grey-color)
|
color: var(--font-grey-color)
|
||||||
opacity: 1
|
opacity: 1
|
||||||
|
|
||||||
|
.icon-grey :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
|
|
||||||
|
.icon-white :deep(path)
|
||||||
|
fill: var(--default-white)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -25,19 +25,19 @@
|
|||||||
size="M"
|
size="M"
|
||||||
)
|
)
|
||||||
template(v-slot:iconLeft)
|
template(v-slot:iconLeft)
|
||||||
q-icon(name="app:search", size="20px", style="color: var(--font-grey-color)")
|
q-icon.icon-grey(name="app:search", size="20px" )
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn(
|
||||||
icon="filter_alt",
|
:style="{width: '40px', height: '40px'}",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
|
q-icon.icon-grey(name="app:filter", size="24px")
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn(
|
||||||
icon="app:sort-number",
|
:style="{width: '40px', height: '40px'}",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
|
q-icon.icon-grey(name="app:sort-number", size="24px")
|
||||||
.field.flex.flex-col.overflow-y-scroll(v-if="data.results.tags")
|
.field.flex.flex-col.overflow-y-scroll(v-if="data.results.tags")
|
||||||
.checkbox.flex.flex-col(v-for="complaint in textSorting(data.results.tags)")
|
.checkbox.flex.flex-col(v-for="complaint in textSorting(data.results.tags)")
|
||||||
.letter.flex.items-center.font-bold.justify-center {{ complaint.sym }}
|
.letter.flex.items-center.font-bold.justify-center {{ complaint.sym }}
|
||||||
@@ -54,12 +54,12 @@
|
|||||||
width="40px",
|
width="40px",
|
||||||
@click="showModal = true",
|
@click="showModal = true",
|
||||||
)
|
)
|
||||||
q-icon(name="app:plus", size="16px")
|
q-icon.icon-white(name="app:plus", size="24px")
|
||||||
base-modal(v-model="showModal", title="Создание тега", modal-padding)
|
base-modal(v-model="showModal", title="Создание тега", modal-padding)
|
||||||
tag-creation-form(:close-modal="closeModal", :create-tag="createTag")
|
tag-creation-form(:close-modal="closeModal", :create-tag="createTag")
|
||||||
.flex(v-if="data.title === 'Осмотр полости рта' && (fillInspection || change)", :style="{color: 'var(--btn-blue-color)'}")
|
.flex(v-if="data.title === 'Осмотр полости рта' && (fillInspection || change)", :style="{color: 'var(--btn-blue-color)'}")
|
||||||
q-btn(no-caps, flat, padding="2px 4px")
|
q-btn(no-caps, flat, padding="2px 4px")
|
||||||
q-icon(left, name="app:plus", size="12px")
|
q-icon.icon-blue(left, name="app:plus", size="24px")
|
||||||
span.font-medium Добавить описание зуба
|
span.font-medium Добавить описание зуба
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -175,6 +175,8 @@ export default {
|
|||||||
cursor: pointer
|
cursor: pointer
|
||||||
border-radius: 4px
|
border-radius: 4px
|
||||||
background: var(--bg-light-grey)
|
background: var(--bg-light-grey)
|
||||||
|
&:hover
|
||||||
|
background: var(--border-light-grey-color)
|
||||||
|
|
||||||
.field
|
.field
|
||||||
margin-right: -10px
|
margin-right: -10px
|
||||||
@@ -214,7 +216,7 @@ export default {
|
|||||||
.q-btn :deep(.q-ripple)
|
.q-btn :deep(.q-ripple)
|
||||||
display: none
|
display: none
|
||||||
.on-left
|
.on-left
|
||||||
margin-right: 8px
|
margin-right: 4px
|
||||||
|
|
||||||
.input :deep(.q-field__native)
|
.input :deep(.q-field__native)
|
||||||
font-weight: 500
|
font-weight: 500
|
||||||
@@ -228,4 +230,13 @@ export default {
|
|||||||
|
|
||||||
.search :deep(.q-field__prepend)
|
.search :deep(.q-field__prepend)
|
||||||
padding-right: 6px
|
padding-right: 6px
|
||||||
|
|
||||||
|
.icon-grey :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
|
|
||||||
|
.icon-white :deep(path)
|
||||||
|
fill: var(--default-white)
|
||||||
|
|
||||||
|
.icon-blue :deep(path)
|
||||||
|
fill: var(--btn-blue-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -17,17 +17,16 @@
|
|||||||
fit,
|
fit,
|
||||||
anchor="bottom left",
|
anchor="bottom left",
|
||||||
self="top left"
|
self="top left"
|
||||||
)
|
)
|
||||||
|
.tag.item.flex.py-2.px-4.items-center.cursor-pointer.w-full.gap-x-2(
|
||||||
|
@click="addCategory"
|
||||||
|
)
|
||||||
|
span Добавить категорию
|
||||||
.menu-wrapper.flex.flex-col.h-40.overflow-y-auto
|
.menu-wrapper.flex.flex-col.h-40.overflow-y-auto
|
||||||
.options.flex(v-for="item in options")
|
.options.flex(v-for="item in options")
|
||||||
.item.flex.py-2.px-4.items-center.cursor-pointer(
|
.item.flex.py-2.px-4.items-center.cursor-pointer(
|
||||||
@click="selected(item.label)"
|
@click="selected(item.label)"
|
||||||
) {{item.label}}
|
) {{item.label}}
|
||||||
.tag.item.flex.py-2.px-4.items-center.cursor-pointer.w-full.gap-x-2(
|
|
||||||
@click="addCategory"
|
|
||||||
)
|
|
||||||
q-icon(name="app:icon-plus", size="10px",)
|
|
||||||
span Добавить категорию
|
|
||||||
.flex.flex-col(class="gap-x-1.5")
|
.flex.flex-col(class="gap-x-1.5")
|
||||||
base-input(
|
base-input(
|
||||||
v-model="model.tag",
|
v-model="model.tag",
|
||||||
|
|||||||
@@ -36,16 +36,16 @@
|
|||||||
.toogle.flex.flex-toogle.h-10.p-1.rounded.absolute
|
.toogle.flex.flex-toogle.h-10.p-1.rounded.absolute
|
||||||
q-btn.w-12.h-full.rounded(
|
q-btn.w-12.h-full.rounded(
|
||||||
size="12px",
|
size="12px",
|
||||||
:style="{'backgroundColor': !isShowSecondView ? 'var(--bg-aqua-blue)' : 'var(--bg-light-grey)'}",
|
:style="{'backgroundColor': !isShowSecondView ? 'var(--btn-blue-color)' : 'var(--bg-light-grey)'}",
|
||||||
@click="()=>{ isShowSecondView=false }",
|
@click="()=>{ isShowSecondView=false }",
|
||||||
)
|
)
|
||||||
img(:src="teeth")
|
q-icon.tooth(:class="{'tooth-active': !isShowSecondView}", name="app:tooth-outline", size="24px")
|
||||||
q-btn.w-12.h-full.rounded(
|
q-btn.w-12.h-full.rounded(
|
||||||
size="12px",
|
size="12px",
|
||||||
:style="{'backgroundColor': isShowSecondView ? 'var(--bg-aqua-blue)' : 'var(--bg-light-grey)'}",
|
:style="{'backgroundColor': isShowSecondView ? 'var(--btn-blue-color)' : 'var(--bg-light-grey)'}",
|
||||||
@click="()=>{isShowSecondView=true }",
|
@click="()=>{isShowSecondView=true }",
|
||||||
)
|
)
|
||||||
img(:src="teeth_2")
|
q-icon.tooth(:class="{'tooth-active': isShowSecondView}", name="app:tooth", size="22px")
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -119,4 +119,10 @@ export default {
|
|||||||
background-color: var(--bg-light-grey)
|
background-color: var(--bg-light-grey)
|
||||||
top: 16px
|
top: 16px
|
||||||
right: 24px
|
right: 24px
|
||||||
|
|
||||||
|
.tooth :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
|
|
||||||
|
.tooth-active :deep(path)
|
||||||
|
fill: var(--default-white)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -17,17 +17,17 @@
|
|||||||
)
|
)
|
||||||
.flex.flex-col.gap-y-6px
|
.flex.flex-col.gap-y-6px
|
||||||
span.color-grey.line-height.text-sm.font-semibold Врач
|
span.color-grey.line-height.text-sm.font-semibold Врач
|
||||||
.flex.gap-x-2
|
.flex.gap-x-2.items-center
|
||||||
base-avatar(:size="40")
|
base-avatar(:size="40")
|
||||||
img.object-cover.h-full(
|
img.object-cover.h-full(
|
||||||
v-if="userData?.photo",
|
v-if="userData?.avatar",
|
||||||
:src="userData?.photo",
|
:src="url + userData?.avatar",
|
||||||
alt="avatar"
|
alt="avatar"
|
||||||
)
|
)
|
||||||
span.text-sm.color-blue(v-else) {{ avatar }}
|
span.text-sm.text-dark(v-else) {{ avatar }}
|
||||||
.flex.flex-col
|
.flex.flex-col
|
||||||
span.text-sm.color-blue.line-height.mb-2px {{ employeeName }}
|
span.text-sm.text-dark.line-height.mb-2px.font-medium {{ employeeName }}
|
||||||
span.color-grey.line-height.text-sm {{ userData?.job_title ? userData?.job_title : "Терапевт" }}
|
span.color-grey.line-height.text-xsx.font-medium {{ userData?.job_title ? userData?.job_title : "Терапевт" }}
|
||||||
.flex.gap-2.mt-8
|
.flex.gap-2.mt-8
|
||||||
base-button(
|
base-button(
|
||||||
type="secondary",
|
type="secondary",
|
||||||
@@ -47,7 +47,7 @@ import BaseAvatar from "@/components/base/BaseAvatar.vue";
|
|||||||
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
import BaseInputDate from "@/components/base/BaseInputDate.vue";
|
||||||
import BaseInputTime from "@/components/base/BaseInputTime.vue";
|
import BaseInputTime from "@/components/base/BaseInputTime.vue";
|
||||||
import * as moment from "moment/moment";
|
import * as moment from "moment/moment";
|
||||||
import { mapGetters, mapActions } from "vuex";
|
import { mapGetters, mapActions, mapState } from "vuex";
|
||||||
import BaseButton from "@/components/base/BaseButton.vue";
|
import BaseButton from "@/components/base/BaseButton.vue";
|
||||||
export default {
|
export default {
|
||||||
name: "MedicalProtocolCreateModal",
|
name: "MedicalProtocolCreateModal",
|
||||||
@@ -64,12 +64,15 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
protocolData: {
|
protocolData: {
|
||||||
date: null,
|
date: "",
|
||||||
startTime: null,
|
startTime: null,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
url: (state) => state.imgUrl,
|
||||||
|
}),
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
userData: "getUserData",
|
userData: "getUserData",
|
||||||
}),
|
}),
|
||||||
@@ -93,19 +96,27 @@ export default {
|
|||||||
...mapActions({
|
...mapActions({
|
||||||
createProtocol: "createProtocol",
|
createProtocol: "createProtocol",
|
||||||
}),
|
}),
|
||||||
|
checkFormat(date) {
|
||||||
|
return date && date?.length === 10 ? date : null;
|
||||||
|
},
|
||||||
saveProtocol() {
|
saveProtocol() {
|
||||||
if (
|
if (
|
||||||
!Object.keys(this.protocolData).every((key) => this.protocolData[key])
|
!Object.keys(this.protocolData).every((key) => this.protocolData[key])
|
||||||
) {
|
)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
let time = this.protocolData.startTime.split(":");
|
let time = this.protocolData.startTime.split(":");
|
||||||
let start = moment(this.protocolData.date).hour(time[0]).minute(time[1]);
|
let start = moment(this.checkFormat(this.protocolData.date))
|
||||||
|
?.hour(time[0])
|
||||||
|
?.minute(time[1]);
|
||||||
let createdProtocol = {
|
let createdProtocol = {
|
||||||
start: start.isValid() ? start.format() : null,
|
start: start.isValid() ? start.format() : null,
|
||||||
end: start.isValid() ? start.add(30, "m").format() : null,
|
end: start.isValid() ? start.add(30, "m").format() : null,
|
||||||
status: null,
|
|
||||||
};
|
};
|
||||||
|
if (
|
||||||
|
Object.keys(createdProtocol)?.some((elem) => !createdProtocol?.[elem])
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
createdProtocol.status = null;
|
||||||
this.createProtocol(createdProtocol);
|
this.createProtocol(createdProtocol);
|
||||||
this.changeShownCreateModal(false);
|
this.changeShownCreateModal(false);
|
||||||
this.createInspection();
|
this.createInspection();
|
||||||
|
|||||||
@@ -9,14 +9,14 @@
|
|||||||
.flex.font-bold.text-6xl {{elem.label}}
|
.flex.font-bold.text-6xl {{elem.label}}
|
||||||
.flex.gap-x-4
|
.flex.gap-x-4
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn.btn(
|
||||||
icon="print",
|
icon="app:printer",
|
||||||
size="20px",
|
size="20px",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
||||||
padding="0"
|
padding="0"
|
||||||
)
|
)
|
||||||
.button
|
.button
|
||||||
q-btn(
|
q-btn.btn(
|
||||||
icon="app:basket",
|
icon="app:basket",
|
||||||
size="20px",
|
size="20px",
|
||||||
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
:style="{width: '40px', height: '40px', color: 'var(--font-grey-color)'}",
|
||||||
@@ -204,4 +204,7 @@ export default {
|
|||||||
cursor: pointer
|
cursor: pointer
|
||||||
border-radius: 4px
|
border-radius: 4px
|
||||||
background: var(--bg-light-grey)
|
background: var(--bg-light-grey)
|
||||||
|
|
||||||
|
.btn :deep(path)
|
||||||
|
fill: var(--font-grey-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
@click="changeShownCreateModal(true)",
|
@click="changeShownCreateModal(true)",
|
||||||
v-if="createInspection"
|
v-if="createInspection"
|
||||||
)
|
)
|
||||||
q-icon(name="app:plus", size="18px")
|
q-icon.plus-icon(name="app:big-plus", size="24px")
|
||||||
.p-4.rounded.background.list.flex.flex-col.gap-y-6
|
.p-4.rounded.background.list.flex.flex-col.gap-y-6
|
||||||
.flex
|
.flex
|
||||||
base-select(
|
base-select(
|
||||||
@@ -157,4 +157,6 @@ export default {
|
|||||||
color: var(--default-white)
|
color: var(--default-white)
|
||||||
.color-grey
|
.color-grey
|
||||||
color: var(--font-grey-color)
|
color: var(--font-grey-color)
|
||||||
|
.plus-icon :deep(path)
|
||||||
|
fill: white
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template lang="pug">
|
<template lang="pug">
|
||||||
.base-info-wrapper.w-full.flex.gap-x-2.flex-1
|
.base-info-wrapper.w-full.flex.gap-x-2.flex-1.font-medium.text-m
|
||||||
medical-sidebar(v-model="currentMenuItem")
|
medical-sidebar(v-model="currentMenuItem")
|
||||||
component(
|
component(
|
||||||
v-if="currentMenuItem",
|
v-if="currentMenuItem",
|
||||||
@@ -49,4 +49,5 @@ export default {
|
|||||||
.base-info-wrapper
|
.base-info-wrapper
|
||||||
height: 80.4%
|
height: 80.4%
|
||||||
max-height: calc(100% - 190px - 8px)
|
max-height: calc(100% - 190px - 8px)
|
||||||
|
color: var(--font-dark-blue-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
padding="0",
|
padding="0",
|
||||||
@click="addNewConfidant"
|
@click="addNewConfidant"
|
||||||
)
|
)
|
||||||
q-icon(name="app:icon-plus", size="12px", left)
|
q-icon.icon(name="app:plus", size="24px", left)
|
||||||
span Добавить контакт
|
span Добавить контакт
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -46,7 +46,9 @@ export default {
|
|||||||
&::-webkit-scrollbar
|
&::-webkit-scrollbar
|
||||||
width: 0
|
width: 0
|
||||||
.on-left
|
.on-left
|
||||||
margin-right: 10px
|
margin-right: 4px
|
||||||
.q-btn :deep(.q-ripple)
|
.q-btn :deep(.q-ripple)
|
||||||
display: none
|
display: none
|
||||||
|
.icon :deep(path)
|
||||||
|
fill: var(--btn-blue-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
name="app:edit",
|
name="app:edit",
|
||||||
v-if="!isEdit && !noEditBtn",
|
v-if="!isEdit && !noEditBtn",
|
||||||
@click="openEdit",
|
@click="openEdit",
|
||||||
size="20"
|
size="20px"
|
||||||
)
|
)
|
||||||
.flex.w-full.gap-11px.items-center.justify-between(v-else)
|
.flex.w-full.gap-11px.items-center.justify-between(v-else)
|
||||||
span.font-bold.text-base.whitespace-nowrap {{title}}
|
span.font-bold.text-base.whitespace-nowrap {{title}}
|
||||||
@@ -30,13 +30,13 @@
|
|||||||
:style="{color: 'var(--btn-blue-color)'}"
|
:style="{color: 'var(--btn-blue-color)'}"
|
||||||
)
|
)
|
||||||
base-button(type="secondary", width="142px")
|
base-button(type="secondary", width="142px")
|
||||||
img.mr-2(:src="layers")
|
q-icon.sample.mr-2(name="app:sample", size="20px")
|
||||||
span.text-smm.font-medium Шаблоны
|
span.text-smm.font-medium Шаблоны
|
||||||
.flex.w-fit.gap-10px.items-center.delete-button.cursor-pointer(
|
.flex.w-fit.gap-10px.items-center.delete-button.cursor-pointer(
|
||||||
v-if="!isEdit && titleDelete && deleteItem",
|
v-if="!isEdit && titleDelete && deleteItem",
|
||||||
@click="deleteItem"
|
@click="deleteItem"
|
||||||
)
|
)
|
||||||
q-icon(name="app:basket" size="20")
|
q-icon(name="app:basket" size="20px")
|
||||||
span.text-smm.font-medium {{ titleDelete }}
|
span.text-smm.font-medium {{ titleDelete }}
|
||||||
slot
|
slot
|
||||||
.flex.h-fit.w-fit.gap-2(v-if="isEdit && buttonsPresence")
|
.flex.h-fit.w-fit.gap-2(v-if="isEdit && buttonsPresence")
|
||||||
@@ -134,4 +134,6 @@ export default {
|
|||||||
transition: 0.3s ease
|
transition: 0.3s ease
|
||||||
.medical-form-move
|
.medical-form-move
|
||||||
transition: 0.3s ease
|
transition: 0.3s ease
|
||||||
|
.sample :deep(path)
|
||||||
|
fill: var(--btn-blue-color)
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template lang="pug">
|
<template lang="pug">
|
||||||
.patient-info.pt-4.pr-6.flex.flex-col.justify-between.rounded
|
.patient-info.pt-4.pr-6.flex.flex-col.justify-between.rounded.font-medium.text-m
|
||||||
.ml-6.flex.justify-between
|
.ml-6.flex.justify-between
|
||||||
q-breadcrumbs
|
q-breadcrumbs
|
||||||
template(v-slot:separator)
|
template(v-slot:separator)
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
color="grey",
|
color="grey",
|
||||||
)
|
)
|
||||||
q-breadcrumbs-el(:label="routes[routingHistory.state.back]")
|
q-breadcrumbs-el(:label="routes[routingHistory.state.back]")
|
||||||
q-breadcrumbs-el(:label="`${routes[routingHistory.state.current]} #${medicalCardData?.number}`")
|
q-breadcrumbs-el(:label="`Медкарта #${medicalCardData?.number}`")
|
||||||
q-btn(
|
q-btn(
|
||||||
flat,
|
flat,
|
||||||
text-color="grey",
|
text-color="grey",
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
:style="{color: 'var(--font-dark-blue-color)', 'line-height': '135%'}",
|
:style="{color: 'var(--font-dark-blue-color)', 'line-height': '135%'}",
|
||||||
) {{patientName}}
|
) {{patientName}}
|
||||||
q-chip(
|
q-chip(
|
||||||
|
v-if="priority?.text",
|
||||||
square,
|
square,
|
||||||
text-color="white",
|
text-color="white",
|
||||||
:style="{height: '20px', background: priority?.color, padding: '2px 8px'}",
|
:style="{height: '20px', background: priority?.color, padding: '2px 8px'}",
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ export const baseDataForm = [
|
|||||||
key: "photo",
|
key: "photo",
|
||||||
label: "Фото",
|
label: "Фото",
|
||||||
type: "avatar",
|
type: "avatar",
|
||||||
|
disabled: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -60,22 +61,28 @@ export const baseDataForm = [
|
|||||||
key: "region",
|
key: "region",
|
||||||
label: "Регион",
|
label: "Регион",
|
||||||
type: "text",
|
type: "text",
|
||||||
|
rules: [(val) => ruleNotValue(val)],
|
||||||
|
error: "Поле 'Регион' должны быть заполнены",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "city",
|
key: "city",
|
||||||
label: "Город",
|
label: "Город",
|
||||||
type: "text",
|
type: "text",
|
||||||
|
rules: [(val) => ruleNotValue(val)],
|
||||||
|
error: "Поле 'Город' должны быть заполнены",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "street",
|
key: "street",
|
||||||
label: "Улица",
|
label: "Улица",
|
||||||
type: "text",
|
type: "text",
|
||||||
|
rules: [(val) => ruleNotValue(val)],
|
||||||
|
error: "Поле 'Улица' должны быть заполнены",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "house",
|
key: "house",
|
||||||
label: "Дом",
|
label: "Дом",
|
||||||
type: "text",
|
type: "text",
|
||||||
rules: [(val) => !/^[\W0]/.test(val)],
|
rules: [(val) => ruleNotValue(val)],
|
||||||
error:
|
error:
|
||||||
"Номер дома должен начинатся не с нуля и только с цифробуквенного символа",
|
"Номер дома должен начинатся не с нуля и только с цифробуквенного символа",
|
||||||
},
|
},
|
||||||
@@ -145,32 +152,32 @@ export const mapNetworks = {
|
|||||||
VK: {
|
VK: {
|
||||||
id: "VK",
|
id: "VK",
|
||||||
title: "VK",
|
title: "VK",
|
||||||
icon: "app:icon-vk",
|
icon: "app:vk",
|
||||||
network: "VK",
|
network: "VK",
|
||||||
},
|
},
|
||||||
TELEGRAM: {
|
TELEGRAM: {
|
||||||
id: "TELEGRAM",
|
id: "TELEGRAM",
|
||||||
title: "Telegram",
|
title: "Telegram",
|
||||||
icon: "app:icon-tg",
|
icon: "app:tg",
|
||||||
network: "TELEGRAM",
|
network: "TELEGRAM",
|
||||||
},
|
},
|
||||||
GMAIL: {
|
GMAIL: {
|
||||||
id: "GMAIL",
|
id: "GMAIL",
|
||||||
title: "Gmail",
|
title: "Gmail",
|
||||||
icon: "app:icon-google",
|
icon: "app:google",
|
||||||
network: "GMAIL",
|
network: "GMAIL",
|
||||||
},
|
},
|
||||||
SLACK: {
|
SLACK: {
|
||||||
id: "SLACK",
|
id: "SLACK",
|
||||||
title: "Slack",
|
title: "Slack",
|
||||||
icon: "app:icon-slack",
|
icon: "app:slack",
|
||||||
network: "SLACK",
|
network: "SLACK",
|
||||||
markerLink: "slack",
|
markerLink: "slack",
|
||||||
},
|
},
|
||||||
DISCORD: {
|
DISCORD: {
|
||||||
id: "DISCORD",
|
id: "DISCORD",
|
||||||
title: "Discord",
|
title: "Discord",
|
||||||
icon: "app:icon-discord",
|
icon: "app:discord",
|
||||||
network: "DISCORD",
|
network: "DISCORD",
|
||||||
},
|
},
|
||||||
VIBER: {
|
VIBER: {
|
||||||
@@ -193,7 +200,7 @@ export const contactsDataForm = {
|
|||||||
fieldName: "Телефон",
|
fieldName: "Телефон",
|
||||||
error:
|
error:
|
||||||
"Не корректно введен номер телефона. Номер телефона должен состоять из 10 цифр (без учета +7)",
|
"Не корректно введен номер телефона. Номер телефона должен состоять из 10 цифр (без учета +7)",
|
||||||
kind: "PHONE",
|
category: "PHONE",
|
||||||
rules: [(val) => ruleLengthValue(val, 18)],
|
rules: [(val) => ruleLengthValue(val, 18)],
|
||||||
inputMask: "+7 (###) ###-##-##",
|
inputMask: "+7 (###) ###-##-##",
|
||||||
},
|
},
|
||||||
@@ -203,14 +210,14 @@ export const contactsDataForm = {
|
|||||||
error:
|
error:
|
||||||
"Не корректно введен адрес почты. Почта должна содержать локальное имя, знак @ и имя домена",
|
"Не корректно введен адрес почты. Почта должна содержать локальное имя, знак @ и имя домена",
|
||||||
rules: [(val) => ruleEmailValue(val)],
|
rules: [(val) => ruleEmailValue(val)],
|
||||||
kind: "EMAIL",
|
category: "EMAIL",
|
||||||
},
|
},
|
||||||
networks: {
|
networks: {
|
||||||
title: "Социальные сети",
|
title: "Социальные сети",
|
||||||
fieldName: "Соцсеть",
|
fieldName: "Соцсеть",
|
||||||
error: "Отсутсвует ссылка соцсети",
|
error: "Отсутсвует ссылка соцсети",
|
||||||
rules: [(val) => ruleNotValue(val)],
|
rules: [(val) => ruleNotValue(val)],
|
||||||
kind: "TELEGRAM",
|
category: "TELEGRAM",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -372,47 +379,63 @@ export const baseInfoMenu = [
|
|||||||
export const baseInsuranceForm = [
|
export const baseInsuranceForm = [
|
||||||
{
|
{
|
||||||
insuranceLabel: "ОМС",
|
insuranceLabel: "ОМС",
|
||||||
insuranceKey: "insuranceOMS",
|
insuranceKey: "OMS",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
key: "series",
|
key: "series",
|
||||||
label: "Серия",
|
label: "Серия",
|
||||||
type: "text",
|
type: "text",
|
||||||
inputMask: "####",
|
rules: (val) => ruleNotValue(val),
|
||||||
|
errorMessage: {
|
||||||
|
title: "Ошибка валидации",
|
||||||
|
message: "Серия полиса ОМС не заполнена",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "number",
|
key: "number",
|
||||||
label: "Номер",
|
label: "Номер",
|
||||||
type: "text",
|
type: "text",
|
||||||
inputMask: "####-####-####",
|
rules: (val) => ruleNotValue(val),
|
||||||
|
errorMessage: {
|
||||||
|
title: "Ошибка валидации",
|
||||||
|
message: "Номер полиса ОМС не заполнен",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "photo",
|
key: "attachments",
|
||||||
label: "Фото ОМС",
|
label: "Фото ОМС",
|
||||||
type: "avatar",
|
type: "photo",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
insuranceLabel: "ДМС",
|
insuranceLabel: "ДМС",
|
||||||
insuranceKey: "insuranceDMS",
|
insuranceKey: "DMS",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
key: "series",
|
key: "series",
|
||||||
label: "Серия",
|
label: "Серия",
|
||||||
type: "text",
|
type: "text",
|
||||||
inputMask: "####",
|
rules: (val) => ruleNotValue(val),
|
||||||
|
errorMessage: {
|
||||||
|
title: "Ошибка валидации",
|
||||||
|
message: "Серия полиса ДМС не заполнена",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "number",
|
key: "number",
|
||||||
label: "Номер",
|
label: "Номер",
|
||||||
type: "text",
|
type: "text",
|
||||||
inputMask: "####-####-####",
|
rules: (val) => ruleNotValue(val),
|
||||||
|
errorMessage: {
|
||||||
|
title: "Ошибка валидации",
|
||||||
|
message: "Номер полиса ДМС не заполнен",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "photo",
|
key: "attachments",
|
||||||
label: "Фото ДМС",
|
label: "Фото ДМС",
|
||||||
type: "avatar",
|
type: "photo",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -429,7 +452,7 @@ export const baseInsuranceForm = [
|
|||||||
{
|
{
|
||||||
key: "photo",
|
key: "photo",
|
||||||
label: "Документы",
|
label: "Документы",
|
||||||
type: "avatar",
|
type: "photo",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -468,7 +491,7 @@ export const documentForm = [
|
|||||||
rules: (val) => ruleLengthValue(val, 6),
|
rules: (val) => ruleLengthValue(val, 6),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "issued_by_org",
|
key: "issued_by",
|
||||||
label: "Кем выдан",
|
label: "Кем выдан",
|
||||||
type: "text",
|
type: "text",
|
||||||
errorMessage: {
|
errorMessage: {
|
||||||
@@ -489,7 +512,7 @@ export const documentForm = [
|
|||||||
rules: (val) => ruleLengthValue(val, 7),
|
rules: (val) => ruleLengthValue(val, 7),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "issued_by_date",
|
key: "issued_at",
|
||||||
label: "Дата выдачи",
|
label: "Дата выдачи",
|
||||||
type: "date",
|
type: "date",
|
||||||
rules: (val) => ruleDateValue(val),
|
rules: (val) => ruleDateValue(val),
|
||||||
@@ -499,7 +522,7 @@ export const documentForm = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "photo",
|
key: "attachments",
|
||||||
label: "Фото паспорта",
|
label: "Фото паспорта",
|
||||||
type: "photo",
|
type: "photo",
|
||||||
},
|
},
|
||||||
@@ -510,7 +533,7 @@ export const documentForm = [
|
|||||||
dataKey: "insurance_number",
|
dataKey: "insurance_number",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
key: "insurance_number",
|
key: "number",
|
||||||
label: "Номер СНИЛС",
|
label: "Номер СНИЛС",
|
||||||
type: "text",
|
type: "text",
|
||||||
inputMask: "###-###-### ##",
|
inputMask: "###-###-### ##",
|
||||||
@@ -518,10 +541,10 @@ export const documentForm = [
|
|||||||
title: "Ошибка валидации",
|
title: "Ошибка валидации",
|
||||||
message: "СНИЛС содержит менее 11 цифр",
|
message: "СНИЛС содержит менее 11 цифр",
|
||||||
},
|
},
|
||||||
rules: (val) => ruleOptionalFields(val, 14),
|
rules: (val, id) => ruleOptionalFields(val, 14, id),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "photo_insurance_number",
|
key: "attachments",
|
||||||
label: "Фото СНИЛС",
|
label: "Фото СНИЛС",
|
||||||
type: "photo",
|
type: "photo",
|
||||||
},
|
},
|
||||||
@@ -532,7 +555,7 @@ export const documentForm = [
|
|||||||
dataKey: "tax_identification_number",
|
dataKey: "tax_identification_number",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
key: "tax_identification_number",
|
key: "number",
|
||||||
label: "Номер ИНН",
|
label: "Номер ИНН",
|
||||||
type: "text",
|
type: "text",
|
||||||
inputMask: "############",
|
inputMask: "############",
|
||||||
@@ -540,10 +563,10 @@ export const documentForm = [
|
|||||||
title: "Ошибка валидации",
|
title: "Ошибка валидации",
|
||||||
message: "ИНН содержит менее 12 цифр",
|
message: "ИНН содержит менее 12 цифр",
|
||||||
},
|
},
|
||||||
rules: (val) => ruleOptionalFields(val, 12),
|
rules: (val, id) => ruleOptionalFields(val, 12, id),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "photo_tax_identification_number",
|
key: "attachments",
|
||||||
label: "Фото ИНН",
|
label: "Фото ИНН",
|
||||||
type: "photo",
|
type: "photo",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
|
const getOrigin = () =>
|
||||||
|
process.env.NODE_ENV === "development"
|
||||||
|
? "https://astra-dev.dopcore.com"
|
||||||
|
: window.origin;
|
||||||
|
|
||||||
function prepareUrl(url) {
|
function prepareUrl(url) {
|
||||||
if (url.startsWith("http")) return url;
|
if (url.startsWith("http")) return url;
|
||||||
return `https://astra-dev.dopcore.com/api/${url}`;
|
return `${getOrigin()}/api/${url}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleRequest(method, url, headers, attempts, body, type) {
|
function handleRequest(method, url, headers, attempts, body, type) {
|
||||||
@@ -45,7 +50,7 @@ function request(method, url, headers = {}, body, type = "") {
|
|||||||
requestOptions.body = JSON.stringify(body);
|
requestOptions.body = JSON.stringify(body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (method === "POST" || method === "PUT") {
|
if (method === "POST" || method === "PUT" || method === "PATCH") {
|
||||||
if (type && type === "formData") {
|
if (type && type === "formData") {
|
||||||
requestOptions = {
|
requestOptions = {
|
||||||
method: method,
|
method: method,
|
||||||
@@ -83,6 +88,10 @@ function post(url, body, type, headers, attempts = 3) {
|
|||||||
return handleRequest("POST", url, headers, attempts, body, type);
|
return handleRequest("POST", url, headers, attempts, body, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function patch(url, body, type, headers, attempts = 3) {
|
||||||
|
return handleRequest("PATCH", url, headers, attempts, body, type);
|
||||||
|
}
|
||||||
|
|
||||||
function put(url, headers, body, attempts = 3) {
|
function put(url, headers, body, attempts = 3) {
|
||||||
return handleRequest("PUT", url, headers, attempts, null, body);
|
return handleRequest("PUT", url, headers, attempts, null, body);
|
||||||
}
|
}
|
||||||
@@ -92,4 +101,5 @@ export const fetchWrapper = {
|
|||||||
del,
|
del,
|
||||||
post,
|
post,
|
||||||
put,
|
put,
|
||||||
|
patch,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,10 +20,6 @@ export function getObjectChangeField(objInit, objUpdate) {
|
|||||||
return resultObj;
|
return resultObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkTypeofObject(obj) {
|
|
||||||
return typeof obj === "object" && obj !== "null";
|
|
||||||
}
|
|
||||||
|
|
||||||
export function checkChangeData(dataInit, dataChange) {
|
export function checkChangeData(dataInit, dataChange) {
|
||||||
return JSON.stringify(dataInit) !== JSON.stringify(dataChange);
|
return JSON.stringify(dataInit) !== JSON.stringify(dataChange);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import * as moment from "moment/moment";
|
import * as moment from "moment/moment";
|
||||||
|
|
||||||
export function ruleNotValue(val, text) {
|
export function ruleNotValue(val, text) {
|
||||||
return !!val || text || false;
|
return !!val || text || false;
|
||||||
}
|
}
|
||||||
@@ -7,8 +8,8 @@ export function ruleLengthValue(val, minLength, text) {
|
|||||||
return (val && val.length === minLength) || text || false;
|
return (val && val.length === minLength) || text || false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ruleOptionalFields(val, minLength, text) {
|
export function ruleOptionalFields(val, minLength, id, text) {
|
||||||
return !val || val.length === minLength || text || false;
|
return (!val && !id) || val.length === minLength || text || false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ruleEmailValue(val, text) {
|
export function ruleEmailValue(val, text) {
|
||||||
@@ -21,12 +22,16 @@ export function ruleMaxLength(val, maxLength, text) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function ruleDateValue(val, text) {
|
export function ruleDateValue(val, text) {
|
||||||
|
let date = moment(
|
||||||
|
val && val?.length === 10 ? val.split(".").reverse().join("-") : null
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
(val && !moment(val).isAfter(moment().format("YYYY-MM-DD"))) ||
|
(date.isValid() && !date.isAfter(moment().format("YYYY-MM-DD"))) ||
|
||||||
text ||
|
text ||
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ruleNumberInput(val, max, min, text) {
|
export function ruleNumberInput(val, max, min, text) {
|
||||||
return (val <= max && val >= min) || text || false;
|
return (val <= max && val >= min) || text || false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +1,5 @@
|
|||||||
import { fetchWrapper } from "../fetchWrapper";
|
import { fetchWrapper } from "../fetchWrapper";
|
||||||
import { removeEmptyFields, checkChangeData } from "./changesObjects";
|
import { checkChangeData } from "./changesObjects";
|
||||||
|
|
||||||
export function getRequestChangeData(
|
|
||||||
createData,
|
|
||||||
updateData,
|
|
||||||
initData,
|
|
||||||
key,
|
|
||||||
id
|
|
||||||
) {
|
|
||||||
let isInitDataEmpty = [...Object.keys(removeEmptyFields(initData))].length;
|
|
||||||
if (Object.keys(removeEmptyFields(updateData)).length) {
|
|
||||||
if (!isInitDataEmpty) {
|
|
||||||
return fetchWrapper.post(
|
|
||||||
`general/${key}/create/`,
|
|
||||||
removeEmptyFields(createData)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (JSON.stringify(updateData) !== JSON.stringify(initData)) {
|
|
||||||
return fetchWrapper.post(
|
|
||||||
`general/${key}/${id}/update/`,
|
|
||||||
removeEmptyFields(updateData)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getRequestArrayData(
|
export function getRequestArrayData(
|
||||||
initData,
|
initData,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import calendar from "./modules/calendar";
|
|||||||
export default createStore({
|
export default createStore({
|
||||||
state: {
|
state: {
|
||||||
url: "https://astra-dev.dopcore.com",
|
url: "https://astra-dev.dopcore.com",
|
||||||
|
imgUrl: "https://astra-dev.dopcore.com/api/store/",
|
||||||
routingHistory: window.history,
|
routingHistory: window.history,
|
||||||
userData: {},
|
userData: {},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ const actions = {
|
|||||||
commit("setSelectedRecordId", id);
|
commit("setSelectedRecordId", id);
|
||||||
},
|
},
|
||||||
getEvents({ commit, state }) {
|
getEvents({ commit, state }) {
|
||||||
const start = state.selectedDates.from.toISOString();
|
const start = state.selectedDates.from.format("YYYY-MM-DDTHH:mm:ss");
|
||||||
const end = state.selectedDates.to.toISOString();
|
const end = state.selectedDates.to.format("YYYY-MM-DDTHH:mm:ss");
|
||||||
fetchWrapper.get(`events?start=${start}&end=${end}`).then((data) => {
|
fetchWrapper.get(`events?start=${start}&end=${end}`).then((data) => {
|
||||||
if (Array.isArray(data)) {
|
if (Array.isArray(data)) {
|
||||||
commit("setEvents", data);
|
commit("setEvents", data);
|
||||||
|
|||||||
@@ -34,20 +34,6 @@ const state = () => ({
|
|||||||
house: null,
|
house: null,
|
||||||
flat: null,
|
flat: null,
|
||||||
},
|
},
|
||||||
insuranceDMS: {
|
|
||||||
series: null,
|
|
||||||
number: null,
|
|
||||||
photo: null,
|
|
||||||
id: null,
|
|
||||||
organization: null,
|
|
||||||
},
|
|
||||||
insuranceOMS: {
|
|
||||||
series: null,
|
|
||||||
number: null,
|
|
||||||
photo: null,
|
|
||||||
id: null,
|
|
||||||
organization: null,
|
|
||||||
},
|
|
||||||
benefit: {
|
benefit: {
|
||||||
id: null,
|
id: null,
|
||||||
discount: null,
|
discount: null,
|
||||||
@@ -134,13 +120,14 @@ const state = () => ({
|
|||||||
const getters = {
|
const getters = {
|
||||||
getBasicData(state, rootState) {
|
getBasicData(state, rootState) {
|
||||||
let registrationAddress =
|
let registrationAddress =
|
||||||
state.medicalCard?.person?.address?.find((el) => el.registration_flg) ||
|
state.medicalCard?.person?.addresses?.find(
|
||||||
{};
|
(el) => el.category === "REGISTRATION_ADDRESS"
|
||||||
|
) || {};
|
||||||
let residenceAddress =
|
let residenceAddress =
|
||||||
state?.medicalCard?.person?.address?.find((el) => el.residence_flg) || {};
|
state?.medicalCard?.person?.addresses?.find(
|
||||||
|
(el) => el.category === "CURRENT_ADDRESS"
|
||||||
|
) || {};
|
||||||
let person = state.medicalCard.person;
|
let person = state.medicalCard.person;
|
||||||
let OMS = person?.insurance_policy?.find((e) => e.title === "OMS");
|
|
||||||
let DMS = person?.insurance_policy?.find((e) => e.title === "DMS");
|
|
||||||
return {
|
return {
|
||||||
personalData: {
|
personalData: {
|
||||||
last_name: person?.last_name || "",
|
last_name: person?.last_name || "",
|
||||||
@@ -150,7 +137,7 @@ const getters = {
|
|||||||
(person?.gender &&
|
(person?.gender &&
|
||||||
genderOptions.find((el) => el.id === person?.gender)) ||
|
genderOptions.find((el) => el.id === person?.gender)) ||
|
||||||
"",
|
"",
|
||||||
birth_date: person?.birth_date ? new Date(person?.birth_date) : "",
|
birth_date: person?.birth_date || "",
|
||||||
photo: person?.photo
|
photo: person?.photo
|
||||||
? {
|
? {
|
||||||
photo: rootState.getUrl + person.photo,
|
photo: rootState.getUrl + person.photo,
|
||||||
@@ -173,30 +160,6 @@ const getters = {
|
|||||||
house: residenceAddress?.house || "",
|
house: residenceAddress?.house || "",
|
||||||
flat: residenceAddress?.flat || "",
|
flat: residenceAddress?.flat || "",
|
||||||
},
|
},
|
||||||
insuranceDMS: {
|
|
||||||
series: DMS?.series,
|
|
||||||
number: DMS?.number,
|
|
||||||
photo: DMS?.photo
|
|
||||||
? {
|
|
||||||
photo: rootState.getUrl + DMS?.photo,
|
|
||||||
file: null,
|
|
||||||
}
|
|
||||||
: {},
|
|
||||||
id: DMS?.id,
|
|
||||||
organization: DMS?.organization,
|
|
||||||
},
|
|
||||||
insuranceOMS: {
|
|
||||||
series: OMS?.series,
|
|
||||||
number: OMS?.number,
|
|
||||||
photo: OMS?.photo
|
|
||||||
? {
|
|
||||||
photo: rootState.getUrl + OMS?.photo,
|
|
||||||
file: null,
|
|
||||||
}
|
|
||||||
: {},
|
|
||||||
id: OMS?.id,
|
|
||||||
organization: OMS?.organization,
|
|
||||||
},
|
|
||||||
benefit: {
|
benefit: {
|
||||||
name: person?.benefit?.name,
|
name: person?.benefit?.name,
|
||||||
id: person?.benefit?.id,
|
id: person?.benefit?.id,
|
||||||
@@ -211,53 +174,44 @@ const getters = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
getDocumentsData(state, rootState) {
|
getDocumentsData(state, rootState) {
|
||||||
let person = state.medicalCard?.person;
|
const fields = [
|
||||||
const passport = person?.identity_document?.find(
|
"passport",
|
||||||
(el) => el.kind === "PASSPORT"
|
"insurance_number",
|
||||||
);
|
"tax_identification_number",
|
||||||
return {
|
"OMS",
|
||||||
passport: {
|
"DMS",
|
||||||
id: passport?.id ?? "",
|
];
|
||||||
series: passport?.series ?? "",
|
let result = {};
|
||||||
number: passport?.number ?? "",
|
fields.forEach((elem) => {
|
||||||
issued_by_org: passport?.issued_by_org ?? "",
|
const document = state.medicalCard?.person?.documents?.find(
|
||||||
issued_by_org_code: passport?.issued_by_org_code ?? "",
|
({ category }) => category === elem
|
||||||
issued_by_date: passport?.issued_by_date
|
);
|
||||||
? new Date(passport?.issued_by_date)
|
const isPassport = elem === "passport";
|
||||||
: null,
|
const isPolicy = elem === "OMS" || elem === "DMS";
|
||||||
photo: passport?.photo
|
result[elem] = {
|
||||||
|
category: elem,
|
||||||
|
id: document?.id || "",
|
||||||
|
series: document?.series || (isPolicy || isPassport ? "" : "000"),
|
||||||
|
number: document?.number || "",
|
||||||
|
issued_by: document?.issued_by || (isPassport ? "" : "000"),
|
||||||
|
issued_by_org_code:
|
||||||
|
document?.issued_by_org_code || (isPassport ? "000-000" : ""),
|
||||||
|
issued_at: document?.issued_at || "",
|
||||||
|
attachments: document?.attachments?.length
|
||||||
? {
|
? {
|
||||||
photo: rootState.getUrl + passport.photo,
|
photo: rootState.getUrl + document?.attachments?.[0],
|
||||||
file: null,
|
file: null,
|
||||||
}
|
}
|
||||||
: {},
|
: {},
|
||||||
},
|
};
|
||||||
insurance_number: {
|
});
|
||||||
insurance_number: person?.insurance_number ?? "",
|
return result;
|
||||||
photo_insurance_number: person?.photo_insurance_number
|
|
||||||
? {
|
|
||||||
photo: rootState.getUrl + person.photo_insurance_number,
|
|
||||||
file: null,
|
|
||||||
}
|
|
||||||
: {},
|
|
||||||
},
|
|
||||||
tax_identification_number: {
|
|
||||||
tax_identification_number: person?.tax_identification_number ?? "",
|
|
||||||
photo_tax_identification_number: person?.photo_tax_identification_number
|
|
||||||
? {
|
|
||||||
photo: rootState.getUrl + person?.photo_tax_identification_number,
|
|
||||||
file: null,
|
|
||||||
}
|
|
||||||
: {},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
},
|
||||||
getContactsData(state) {
|
getContactsData(state) {
|
||||||
let phones =
|
let phones =
|
||||||
state.medicalCard?.person?.contacts
|
state.medicalCard?.person?.contacts
|
||||||
?.filter((el) => el.category === "PHONE")
|
?.filter((el) => el.category === "PHONE")
|
||||||
?.map((el) => {
|
?.map((el) => {
|
||||||
el.value = el.value.length > 10 ? el.value.slice(1) : el.value;
|
|
||||||
return { ...el };
|
return { ...el };
|
||||||
}) || [];
|
}) || [];
|
||||||
let emails =
|
let emails =
|
||||||
@@ -435,11 +389,23 @@ const actions = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
postUpdateAddress(context, { id, address, category }) {
|
postUpdateAddress(context, { id, address, category }) {
|
||||||
fetchWrapper.post(`address/${id}`, {
|
fetchWrapper.patch(`address/${id}`, {
|
||||||
...address,
|
...address,
|
||||||
category: category,
|
category: category,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
postCreateContact(context, { obj, id }) {
|
||||||
|
fetchWrapper.post("contacts", {
|
||||||
|
person_id: id,
|
||||||
|
...obj,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
postUpdateContact(context, { obj, id }) {
|
||||||
|
fetchWrapper.patch(`contacts/${id}`, obj);
|
||||||
|
},
|
||||||
|
deleteContact(context, { id }) {
|
||||||
|
fetchWrapper.del(`contacts/${id}`);
|
||||||
|
},
|
||||||
deleteItemData({ commit }, props) {
|
deleteItemData({ commit }, props) {
|
||||||
commit("setDataWithouDeleted", props);
|
commit("setDataWithouDeleted", props);
|
||||||
},
|
},
|
||||||
@@ -459,17 +425,26 @@ const actions = {
|
|||||||
commit("setBenefitData", res.results);
|
commit("setBenefitData", res.results);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
createMedicalCard(ctx, id) {
|
createMedicalCard(ctx, { personId, successCallback }) {
|
||||||
fetchWrapper.post("medical_cards", {
|
fetchWrapper
|
||||||
person_id: id,
|
.post("medical_cards", {
|
||||||
number: String(Math.floor(1 + Math.random() * (100000000 + 1 - 1))),
|
person_id: personId,
|
||||||
});
|
number: String(Math.floor(1 + Math.random() * (100000000 + 1 - 1))),
|
||||||
return this.getMedicalCardDataByPersonId(ctx, id);
|
})
|
||||||
|
.then(() => {
|
||||||
|
this.dispatch("getMedicalCardDataByPersonId", {
|
||||||
|
personId,
|
||||||
|
successCallback,
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
getMedicalCardDataByPersonId({ commit }, { personId, successCallback }) {
|
getMedicalCardDataByPersonId({ commit }, { personId, successCallback }) {
|
||||||
fetchWrapper.get(`medical_cards/person/${personId}`).then((data) => {
|
fetchWrapper.get(`medical_cards/person/${personId}`).then((data) => {
|
||||||
if (!data) {
|
if (!data || data?.detail) {
|
||||||
return this.createMedicalCard({ commit }, personId);
|
return this.dispatch("createMedicalCard", {
|
||||||
|
personId,
|
||||||
|
successCallback,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
commit("setMedicalCard", data);
|
commit("setMedicalCard", data);
|
||||||
commit("setBasicData");
|
commit("setBasicData");
|
||||||
|
|||||||
25
test/specs/test.e2e.js
Normal file
25
test/specs/test.e2e.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const { expect } = require("@wdio/globals");
|
||||||
|
|
||||||
|
describe("Smoke test", function () {
|
||||||
|
it("should display login page", async function () {
|
||||||
|
await browser.url("/");
|
||||||
|
|
||||||
|
await $("#app").waitForDisplayed();
|
||||||
|
expect(await browser.getUrl()).toMatch("/#/login");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should auth to system", async function () {
|
||||||
|
await browser.url("/");
|
||||||
|
|
||||||
|
await $("#app").waitForDisplayed();
|
||||||
|
|
||||||
|
await $("input[type=text]").setValue("admin");
|
||||||
|
await $("input[type=password]").setValue("123");
|
||||||
|
|
||||||
|
await $("button[type=button]").click();
|
||||||
|
|
||||||
|
await $("img[alt=Logo]").waitForDisplayed();
|
||||||
|
|
||||||
|
expect(await browser.getUrl()).toMatch("/#/calendar");
|
||||||
|
});
|
||||||
|
});
|
||||||
288
wdio.conf.js
Normal file
288
wdio.conf.js
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
exports.config = {
|
||||||
|
//
|
||||||
|
// ====================
|
||||||
|
// Runner Configuration
|
||||||
|
// ====================
|
||||||
|
// WebdriverIO supports running e2e tests as well as unit and component tests.
|
||||||
|
runner: "local",
|
||||||
|
//
|
||||||
|
// ==================
|
||||||
|
// Specify Test Files
|
||||||
|
// ==================
|
||||||
|
// Define which test specs should run. The pattern is relative to the directory
|
||||||
|
// of the configuration file being run.
|
||||||
|
//
|
||||||
|
// The specs are defined as an array of spec files (optionally using wildcards
|
||||||
|
// that will be expanded). The test for each spec file will be run in a separate
|
||||||
|
// worker process. In order to have a group of spec files run in the same worker
|
||||||
|
// process simply enclose them in an array within the specs array.
|
||||||
|
//
|
||||||
|
// If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
|
||||||
|
// then the current working directory is where your `package.json` resides, so `wdio`
|
||||||
|
// will be called from there.
|
||||||
|
//
|
||||||
|
specs: ["./test/specs/**/*.js"],
|
||||||
|
// Patterns to exclude.
|
||||||
|
exclude: [
|
||||||
|
// 'path/to/excluded/files'
|
||||||
|
],
|
||||||
|
//
|
||||||
|
// ============
|
||||||
|
// Capabilities
|
||||||
|
// ============
|
||||||
|
// Define your capabilities here. WebdriverIO can run multiple capabilities at the same
|
||||||
|
// time. Depending on the number of capabilities, WebdriverIO launches several test
|
||||||
|
// sessions. Within your capabilities you can overwrite the spec and exclude options in
|
||||||
|
// order to group specific specs to a specific capability.
|
||||||
|
//
|
||||||
|
// First, you can define how many instances should be started at the same time. Let's
|
||||||
|
// say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
|
||||||
|
// set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
|
||||||
|
// files and you set maxInstances to 10, all spec files will get tested at the same time
|
||||||
|
// and 30 processes will get spawned. The property handles how many capabilities
|
||||||
|
// from the same test should run tests.
|
||||||
|
//
|
||||||
|
maxInstances: 10,
|
||||||
|
//
|
||||||
|
// If you have trouble getting all important capabilities together, check out the
|
||||||
|
// Sauce Labs platform configurator - a great tool to configure your capabilities:
|
||||||
|
// https://saucelabs.com/platform/platform-configurator
|
||||||
|
//
|
||||||
|
capabilities: [
|
||||||
|
{
|
||||||
|
browserName: "chrome",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
//
|
||||||
|
// ===================
|
||||||
|
// Test Configurations
|
||||||
|
// ===================
|
||||||
|
// Define all options that are relevant for the WebdriverIO instance here
|
||||||
|
//
|
||||||
|
// Level of logging verbosity: trace | debug | info | warn | error | silent
|
||||||
|
logLevel: "info",
|
||||||
|
//
|
||||||
|
// Set specific log levels per logger
|
||||||
|
// loggers:
|
||||||
|
// - webdriver, webdriverio
|
||||||
|
// - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
|
||||||
|
// - @wdio/mocha-framework, @wdio/jasmine-framework
|
||||||
|
// - @wdio/local-runner
|
||||||
|
// - @wdio/sumologic-reporter
|
||||||
|
// - @wdio/cli, @wdio/config, @wdio/utils
|
||||||
|
// Level of logging verbosity: trace | debug | info | warn | error | silent
|
||||||
|
// logLevels: {
|
||||||
|
// webdriver: 'info',
|
||||||
|
// '@wdio/appium-service': 'info'
|
||||||
|
// },
|
||||||
|
//
|
||||||
|
// If you only want to run your tests until a specific amount of tests have failed use
|
||||||
|
// bail (default is 0 - don't bail, run all tests).
|
||||||
|
bail: 0,
|
||||||
|
//
|
||||||
|
// Set a base URL in order to shorten url command calls. If your `url` parameter starts
|
||||||
|
// with `/`, the base url gets prepended, not including the path portion of your baseUrl.
|
||||||
|
// If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
|
||||||
|
// gets prepended directly.
|
||||||
|
baseUrl: "http://localhost:8080",
|
||||||
|
//
|
||||||
|
// Default timeout for all waitFor* commands.
|
||||||
|
waitforTimeout: 10000,
|
||||||
|
//
|
||||||
|
// Default timeout in milliseconds for request
|
||||||
|
// if browser driver or grid doesn't send response
|
||||||
|
connectionRetryTimeout: 120000,
|
||||||
|
//
|
||||||
|
// Default request retries count
|
||||||
|
connectionRetryCount: 3,
|
||||||
|
//
|
||||||
|
// Test runner services
|
||||||
|
// Services take over a specific job you don't want to take care of. They enhance
|
||||||
|
// your test setup with almost no effort. Unlike plugins, they don't add new
|
||||||
|
// commands. Instead, they hook themselves up into the test process.
|
||||||
|
// services: [],
|
||||||
|
//
|
||||||
|
// Framework you want to run your specs with.
|
||||||
|
// The following are supported: Mocha, Jasmine, and Cucumber
|
||||||
|
// see also: https://webdriver.io/docs/frameworks
|
||||||
|
//
|
||||||
|
// Make sure you have the wdio adapter package for the specific framework installed
|
||||||
|
// before running any tests.
|
||||||
|
framework: "jasmine",
|
||||||
|
//
|
||||||
|
// The number of times to retry the entire specfile when it fails as a whole
|
||||||
|
// specFileRetries: 1,
|
||||||
|
//
|
||||||
|
// Delay in seconds between the spec file retry attempts
|
||||||
|
// specFileRetriesDelay: 0,
|
||||||
|
//
|
||||||
|
// Whether or not retried spec files should be retried immediately or deferred to the end of the queue
|
||||||
|
// specFileRetriesDeferred: false,
|
||||||
|
//
|
||||||
|
// Test reporter for stdout.
|
||||||
|
// The only one supported by default is 'dot'
|
||||||
|
// see also: https://webdriver.io/docs/dot-reporter
|
||||||
|
reporters: ["spec"],
|
||||||
|
|
||||||
|
//
|
||||||
|
// Options to be passed to Jasmine.
|
||||||
|
jasmineOpts: {
|
||||||
|
// Jasmine default timeout
|
||||||
|
defaultTimeoutInterval: 60000,
|
||||||
|
//
|
||||||
|
// The Jasmine framework allows interception of each assertion in order to log the state of the application
|
||||||
|
// or website depending on the result. For example, it is pretty handy to take a screenshot every time
|
||||||
|
// an assertion fails.
|
||||||
|
expectationResultHandler: function (passed, assertion) {
|
||||||
|
// do something
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// =====
|
||||||
|
// Hooks
|
||||||
|
// =====
|
||||||
|
// WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
|
||||||
|
// it and to build services around it. You can either apply a single function or an array of
|
||||||
|
// methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
|
||||||
|
// resolved to continue.
|
||||||
|
/**
|
||||||
|
* Gets executed once before all workers get launched.
|
||||||
|
* @param {object} config wdio configuration object
|
||||||
|
* @param {Array.<Object>} capabilities list of capabilities details
|
||||||
|
*/
|
||||||
|
// onPrepare: function (config, capabilities) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed before a worker process is spawned and can be used to initialise specific service
|
||||||
|
* for that worker as well as modify runtime environments in an async fashion.
|
||||||
|
* @param {string} cid capability id (e.g 0-0)
|
||||||
|
* @param {object} caps object containing capabilities for session that will be spawn in the worker
|
||||||
|
* @param {object} specs specs to be run in the worker process
|
||||||
|
* @param {object} args object that will be merged with the main configuration once worker is initialized
|
||||||
|
* @param {object} execArgv list of string arguments passed to the worker process
|
||||||
|
*/
|
||||||
|
// onWorkerStart: function (cid, caps, specs, args, execArgv) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed just after a worker process has exited.
|
||||||
|
* @param {string} cid capability id (e.g 0-0)
|
||||||
|
* @param {number} exitCode 0 - success, 1 - fail
|
||||||
|
* @param {object} specs specs to be run in the worker process
|
||||||
|
* @param {number} retries number of retries used
|
||||||
|
*/
|
||||||
|
// onWorkerEnd: function (cid, exitCode, specs, retries) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed just before initialising the webdriver session and test framework. It allows you
|
||||||
|
* to manipulate configurations depending on the capability or spec.
|
||||||
|
* @param {object} config wdio configuration object
|
||||||
|
* @param {Array.<Object>} capabilities list of capabilities details
|
||||||
|
* @param {Array.<String>} specs List of spec file paths that are to be run
|
||||||
|
* @param {string} cid worker id (e.g. 0-0)
|
||||||
|
*/
|
||||||
|
// beforeSession: function (config, capabilities, specs, cid) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed before test execution begins. At this point you can access to all global
|
||||||
|
* variables like `browser`. It is the perfect place to define custom commands.
|
||||||
|
* @param {Array.<Object>} capabilities list of capabilities details
|
||||||
|
* @param {Array.<String>} specs List of spec file paths that are to be run
|
||||||
|
* @param {object} browser instance of created browser/device session
|
||||||
|
*/
|
||||||
|
// before: function (capabilities, specs) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Runs before a WebdriverIO command gets executed.
|
||||||
|
* @param {string} commandName hook command name
|
||||||
|
* @param {Array} args arguments that command would receive
|
||||||
|
*/
|
||||||
|
// beforeCommand: function (commandName, args) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Hook that gets executed before the suite starts
|
||||||
|
* @param {object} suite suite details
|
||||||
|
*/
|
||||||
|
// beforeSuite: function (suite) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Function to be executed before a test (in Mocha/Jasmine) starts.
|
||||||
|
*/
|
||||||
|
// beforeTest: function (test, context) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
|
||||||
|
* beforeEach in Mocha)
|
||||||
|
*/
|
||||||
|
// beforeHook: function (test, context) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
|
||||||
|
* afterEach in Mocha)
|
||||||
|
*/
|
||||||
|
// afterHook: function (test, context, { error, result, duration, passed, retries }) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Function to be executed after a test (in Mocha/Jasmine only)
|
||||||
|
* @param {object} test test object
|
||||||
|
* @param {object} context scope object the test was executed with
|
||||||
|
* @param {Error} result.error error object in case the test fails, otherwise `undefined`
|
||||||
|
* @param {*} result.result return object of test function
|
||||||
|
* @param {number} result.duration duration of test
|
||||||
|
* @param {boolean} result.passed true if test has passed, otherwise false
|
||||||
|
* @param {object} result.retries information about spec related retries, e.g. `{ attempts: 0, limit: 0 }`
|
||||||
|
*/
|
||||||
|
// afterTest: function(test, context, { error, result, duration, passed, retries }) {
|
||||||
|
// },
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook that gets executed after the suite has ended
|
||||||
|
* @param {object} suite suite details
|
||||||
|
*/
|
||||||
|
// afterSuite: function (suite) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Runs after a WebdriverIO command gets executed
|
||||||
|
* @param {string} commandName hook command name
|
||||||
|
* @param {Array} args arguments that command would receive
|
||||||
|
* @param {number} result 0 - command success, 1 - command error
|
||||||
|
* @param {object} error error object if any
|
||||||
|
*/
|
||||||
|
// afterCommand: function (commandName, args, result, error) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed after all tests are done. You still have access to all global variables from
|
||||||
|
* the test.
|
||||||
|
* @param {number} result 0 - test pass, 1 - test fail
|
||||||
|
* @param {Array.<Object>} capabilities list of capabilities details
|
||||||
|
* @param {Array.<String>} specs List of spec file paths that ran
|
||||||
|
*/
|
||||||
|
// after: function (result, capabilities, specs) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed right after terminating the webdriver session.
|
||||||
|
* @param {object} config wdio configuration object
|
||||||
|
* @param {Array.<Object>} capabilities list of capabilities details
|
||||||
|
* @param {Array.<String>} specs List of spec file paths that ran
|
||||||
|
*/
|
||||||
|
// afterSession: function (config, capabilities, specs) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed after all workers got shut down and the process is about to exit. An error
|
||||||
|
* thrown in the onComplete hook will result in the test run failing.
|
||||||
|
* @param {object} exitCode 0 - success, 1 - fail
|
||||||
|
* @param {object} config wdio configuration object
|
||||||
|
* @param {Array.<Object>} capabilities list of capabilities details
|
||||||
|
* @param {<Object>} results object containing test results
|
||||||
|
*/
|
||||||
|
// onComplete: function(exitCode, config, capabilities, results) {
|
||||||
|
// },
|
||||||
|
/**
|
||||||
|
* Gets executed when a refresh happens.
|
||||||
|
* @param {string} oldSessionId session ID of the old session
|
||||||
|
* @param {string} newSessionId session ID of the new session
|
||||||
|
*/
|
||||||
|
// onReload: function(oldSessionId, newSessionId) {
|
||||||
|
// }
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user