WIP: add basic features

This commit is contained in:
kandrusyak
2023-01-31 15:22:31 +03:00
parent 5837f122f9
commit 622b155a86
6 changed files with 212 additions and 133 deletions

View File

@@ -8,6 +8,7 @@
color="primary",
dense,
padding="4px 22px",
@click="openForm"
)
q-icon(
name="app:icon-plus",
@@ -19,14 +20,11 @@
size="18px",
style="margin-left: 4px"
)
q-menu(
v-model="isOpenFormInternal",
)
base-client-form-create(
v-model="isOpenFormInternal",
:set-updated-clients="setUpdatedClients",
:write-created-client-id="writeCreatedClientId",
)
base-client-form-create(
v-model="isOpenFormInternal",
:set-updated-clients="setUpdatedClients",
:write-created-client-id="writeCreatedClientId",
)
q-btn.mr-8(
flat,
dense,

View File

@@ -1,99 +1,98 @@
<template lang="pug">
.wrapper-create.flex.flex-col.fixed.right-6.bottom-6.px-8.py-7.gap-y-8
.icon-cancel.close.absolute.top-5.right-5.cursor-pointer(@click="closeForm")
span.title.text-xl.font-bold Создание клиента
.flex.gap-x-4.h-fit
.flex.gap-x-3.w-full
q-btn(
color="secondary",
text-color="primary",
style="width: 40px; height: 40px",
rounded
no-caps
padding="0 16px"
)
q-icon(
v-if="image === defaultIcon"
name="app:icon-download",
base-modal(v-model="value", hide-overlay, title="Создание клиента", draggable )
.wrapper-create.gap-y-8.flex.flex-col.pt-8
.flex.gap-x-4.h-fit
.flex.gap-x-3.w-full
q-btn(
color="secondary",
text-color="primary",
style="width: 40px; height: 40px",
rounded
no-caps
padding="0 16px"
)
q-avatar(
v-else,
size="40px",
round
)
img(:src="image")
q-menu(
anchor="bottom middle",
self="top right",
v-model="showPopup"
)
.flex.flex-col.p-4.gap-y-3
.flex.items-center.gap-x-2.cursor-pointer(@click="changeOpenModal")
q-icon(
name="app:computer",
size="18px",
color="primary"
)
span.text-smm.title Загрузить с компьютера
.flex.items-center.gap-x-2.cursor-pointer
q-icon(
name="app:camera",
size="18px",
color="primary"
)
span.text-smm.title Сделать фото
base-modal(v-model="showModal", title="Загрузить изображение")
.flex.flex-col.items-center.justify-center(
:style="{padding: '153px 370px'}"
q-icon(
v-if="image === defaultIcon"
name="app:icon-download",
)
.avatar-wrapper.flex.relative
base-input(
circle,
type="file",
id="image-upload",
accept="image/*",
@change="(e) => previewImage(e)"
)
.avatar.flex.absolute.items-center.gap-x-6
img.avatar.object-cover(for="image-upload", :src="image", v-if="image")
q-btn(
round,
color="primary",
@click="closeAddImage",
icon="app:icon-ok"
q-avatar(
v-else,
size="40px",
round
)
img(:src="image")
q-menu(
anchor="bottom middle",
self="top right",
v-model="showPopup"
)
.flex.flex-col.p-4.gap-y-3
.flex.items-center.gap-x-2.cursor-pointer(@click="changeOpenModal")
q-icon(
name="app:computer",
size="18px",
color="primary"
)
base-input.w-full(v-model="infoClient.basic.full_name", placeholder="ФИО*", outlined)
.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="infoClient.basic",
:phone="infoClient.phone",
:email="infoClient.email",
:save-network-id="saveNetworkId",
:add-network="addNewNetwork",
:choose-option="chooseOptionNetworks",
:choose-priority="choosePriority",
:priority-list="priorityList",
:identity-document="infoClient.identity_document",
:addresses="infoClient.addresses",
:save-file="saveDocFile",
)
q-btn(
label="Создать клиента",
color="primary",
style="height: 40px; width: 180px",
no-caps,
padding="8px 24px",
@click="saveClient",
)
span.text-smm.title Загрузить с компьютера
.flex.items-center.gap-x-2.cursor-pointer
q-icon(
name="app:camera",
size="18px",
color="primary"
)
span.text-smm.title Сделать фото
base-modal(v-model="showModal", title="Загрузить изображение")
.flex.flex-col.items-center.justify-center(
:style="{padding: '153px 370px'}"
)
.avatar-wrapper.flex.relative
base-input(
circle,
type="file",
id="image-upload",
accept="image/*",
@change="(e) => previewImage(e)"
)
.avatar.flex.absolute.items-center.gap-x-6
img.avatar.object-cover(for="image-upload", :src="image", v-if="image")
q-btn(
round,
color="primary",
@click="closeAddImage",
icon="app:icon-ok"
)
base-input.w-full(v-model="infoClient.basic.full_name", placeholder="ФИО*", outlined)
.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="infoClient.basic",
:phone="infoClient.phone",
:email="infoClient.email",
:save-network-id="saveNetworkId",
:add-network="addNewNetwork",
:choose-option="chooseOptionNetworks",
:choose-priority="choosePriority",
:priority-list="priorityList",
:identity-document="infoClient.identity_document",
:addresses="infoClient.addresses",
:save-file="saveDocFile",
)
q-btn(
label="Создать клиента",
color="primary",
style="height: 40px; width: 180px",
no-caps,
padding="8px 24px",
@click="saveClient",
)
</template>
<script>
@@ -109,6 +108,7 @@ import addImageIcon from "@/assets/icons/photo.svg";
import TheNotificationProvider from "@/components/Notifications/TheNotificationProvider";
import { addNotification } from "@/components/Notifications/notificationContext";
import * as moment from "moment";
import { v_model } from "@/shared/mixins/v-model";
export default {
name: "BaseClientFormClient",
@@ -122,12 +122,11 @@ export default {
addImageIcon,
TheNotificationProvider,
},
emits: ["update:model-value"],
props: {
setUpdatedClients: Function,
writeCreatedClientId: Function,
modelValue: Boolean,
},
mixins: [v_model],
data() {
return {
networksSettings: column.find((el) => el.name === "networks"),
@@ -243,9 +242,6 @@ export default {
},
},
methods: {
closeForm() {
this.$emit("update:model-value", false);
},
previewImage(event) {
let picture = event.target.files;
let reader = new FileReader();
@@ -480,12 +476,7 @@ export default {
<style lang="sass" scoped>
.wrapper-create
z-index: 5
background-color: var(--default-white)
border-radius: 4px
width: 634px
min-height: 585px
box-shadow: var(--default-shadow)
width: 570px
.title
color: var(--font-dark-blue-color)

View File

@@ -1,30 +1,110 @@
<template lang="pug">
q-dialog(v-model="value")
.base-content
.base-header
q-dialog(
v-model="value"
@show="onShow",
@hide="onHide",
ref="dialog"
)
.base-content(ref="contentRef", :style="contentStyles")
q-resize-observer(@resize="onResize")
.base-header(draggable, :class="{'cursor-move': draggable}", ref="headerRef")
.header-title.text {{ title }}
.icon-cancel.text-sm(@click="value = false", v-if="!showIcon")
.icon-cancel.text-sm(@click="value = false", v-if="!showCloseIcon")
slot
</template>
<script>
import { v_model } from "@/shared/mixins/v-model";
export default {
name: "BaseModal",
mixins: [v_model],
emits: ["show", "hide"],
props: {
title: String,
modelValue: Boolean,
showIcon: Boolean,
showCloseIcon: Boolean,
draggable: Boolean,
hideOverlay: Boolean,
},
emits: ["update:modelValue"],
computed: {
value: {
get() {
return this.modelValue;
},
set(value) {
this.$emit("update:modelValue", value);
data() {
return {
contentStyles: {
top: 0,
left: 0,
},
};
},
methods: {
onShow() {
if (this.draggable) {
this.$refs.headerRef.addEventListener("mousedown", this.onGrab);
}
this.$emit("show");
},
onHide() {
if (this.draggable) {
document.removeEventListener("mousemove", this.onDrag);
document.removeEventListener("mouseup", this.onLetGo);
}
this.$emit("hide");
},
onDrag(e) {
const target = this.$refs.contentRef;
const originalStyles = window.getComputedStyle(target);
const { x, width, y, height } = target.getBoundingClientRect();
if (
x + e.movementX > 10 &&
x + e.movementX + width + 10 <= window.innerWidth
)
this.contentStyles.left =
parseInt(originalStyles.left) + e.movementX + "px";
if (
y + e.movementY > 10 &&
y + e.movementY + height + 10 <= window.innerHeight
)
this.contentStyles.top =
parseInt(originalStyles.top) + e.movementY + "px";
},
onLetGo() {
document.removeEventListener("mousemove", this.onDrag);
document.removeEventListener("mouseup", this.onLetGo);
},
onGrab() {
document.addEventListener("mousemove", this.onDrag);
document.addEventListener("mouseup", this.onLetGo);
},
onResize() {
const target = this.$refs.contentRef;
const originalStyles = window.getComputedStyle(target);
const { x, width, y, height } = target.getBoundingClientRect();
if (x < 10) {
const delta = 10 - x;
this.contentStyles.left = parseInt(originalStyles.left) + delta + "px";
}
if (y < 10) {
const delta = 10 - y;
this.contentStyles.top = parseInt(originalStyles.top) + delta + "px";
}
if (x + width + 10 > window.innerWidth) {
const delta = window.innerWidth - (x + width + 10);
this.contentStyles.left = parseInt(originalStyles.left) + delta + "px";
}
if (y + height + 10 > window.innerHeight) {
const delta = window.innerHeight - (y + height + 10);
this.contentStyles.top = parseInt(originalStyles.top) + delta + "px";
}
},
},
updated() {
const backdropEl = this.$refs.dialog?.contentEl?.previousSibling;
if (!backdropEl) return;
if (!this.hideOverlay) {
backdropEl.style.background = "rgba(37, 40, 80, 0.2)";
backdropEl.style.backdropFilter = "blur(4px)";
} else backdropEl.style.background = "rgba(0,0,0,0)";
console.log("123");
},
};
</script>
@@ -45,12 +125,14 @@ export default {
background-color: var(--default-white)
box-shadow: 4px 4px 8px rgba(9, 10, 21, 0.1), -4px -4px 8px rgba(9, 10, 21, 0.1)
border-radius: 4px
position: relative
.header-title
font-weight: 700
font-size: 20px
line-height: 23px
color: var(--font-dark-blue-color)
user-select: none
.base-header
display: flex
justify-content: space-between
@@ -62,10 +144,6 @@ export default {
color: var(--font-grey-color)
</style>
<style lang="sass">
.q-dialog__backdrop
background: rgba(37, 40, 80, 0.2) !important
backdrop-filter: blur(4px) !important
@media (min-width: 600px)
.q-dialog__inner--minimized > div
max-width: 100vh !important