Before dogovors

This commit is contained in:
Vova 2026-06-08 13:01:04 +03:00
parent 686f70f5a5
commit 1eab3c046e
3 changed files with 75 additions and 52 deletions

View File

@ -1,8 +1,8 @@
<template>
<div>
<h1>Сделка</h1>
<div><a href="#" @click.prevent="createDeal(17539)">Создать новую сделку</a></div>
<div><a href="#" @click.prevent="editDeal(17539, 46)">Открыть тестовую сделку</a></div>
<div><a href="#" @click.prevent="createDeal(1481170)">Создать новую сделку</a></div>
<div><a href="#" @click.prevent="editDeal(1481170, 46)">Открыть тестовую сделку</a></div>
</div>
<DynamicDialog />
</template>

View File

@ -343,6 +343,7 @@
dateFormat="dd.mm.yy"
:showIcon="true"
class="w-full"
:class="{ 'p-invalid': errors.deal_date }"
/>
<small v-if="errors.deal_date" class="p-error">{{ errorMessages.deal_date }}</small>
</div>
@ -403,7 +404,7 @@
<script setup>
import MyButton from "@/shared/UI/MyButton.vue";
import {computed, inject, onMounted, ref, watch} from "vue";
import {computed, inject, onMounted, ref, watch, nextTick } from "vue";
import {useLaravelApi} from '@/composables/useLaravelApi';
//import useDeal from '@/composables/useDeal';
import {useToast} from "primevue/usetoast";
@ -1160,11 +1161,31 @@ const removeInnerDoc = async (docId) => {
}
};
const scrollToFirstError = () => {
const firstErrorField = document.querySelector('.p-invalid');
if (firstErrorField) {
firstErrorField.scrollIntoView({
behavior: 'smooth',
block: 'center'
});
firstErrorField.classList.add('error-highlight');
setTimeout(() => {
firstErrorField.classList.remove('error-highlight');
}, 2000);
}
};
// Сохранение сделки
const saveDeal = async () => {
// Проверяем валидацию перед сохранением
if (!validateForm()) {
await nextTick();
scrollToFirstError();
toast.add({
severity: 'error',
summary: 'Ошибка',

View File

@ -1,7 +1,7 @@
<template>
<div class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 pr-4">
<div class="document-card p-4 rounded flex">
<div class="deal-document-thumbnail w-16 h-16 flex-shrink-0 rounded-lg overflow-hidden">
<div class="deal-document-thumbnail w-16 h-16 shrink-0 rounded-lg overflow-hidden">
<img v-if="isImage" :src="fileUrl" alt="Превью документа" class="w-full h-full object-cover" />
<img v-else
@ -12,7 +12,7 @@
</div>
<!-- Название документа -->
<div class="ml-4 flex flex-col justify-between flex-grow">
<div class="ml-4 flex flex-col justify-between grow">
<div class="font-bold text-gray-800">{{ doc.name || 'N/A' }}</div>
<div class="flex">
<img src="@/shared/assets/icons/doc.svg" alt="Договор" class="w-5 h-5">
@ -20,10 +20,10 @@
</div>
</div>
<!-- <button @click="confirmDelete" class="ml-auto mt-2 px-4 py-2 rounded">-->
<!--&lt;!&ndash; <img src="@/shared/assets/icons/trash.svg" alt="Удалить" class="w-6 h-6">&ndash;&gt;-->
<!-- <span class="simple-button delete" title="Удалить"><i class="jw-action-icon-delete"></i></span>-->
<!-- </button>-->
<button @click="confirmDelete" class="ml-auto mt-2 px-4 py-2 rounded">
<!-- <img src="@/shared/assets/icons/trash.svg" alt="Удалить" class="w-6 h-6">-->
<span class="simple-button delete" title="Удалить"><i class="jw-action-icon-delete"></i></span>
</button>
</div>
</div>
@ -34,6 +34,8 @@
// import { useToast } from 'primevue/usetoast';
import { computed } from "vue";
import defaultIconUrl from '@/shared/assets/images/deal/deal-doc-icon.png';
import {useConfirm} from "primevue/useconfirm";
import {useToast} from "primevue/usetoast";
const props = defineProps({
doc: {
@ -67,49 +69,49 @@ const fileExtension = computed(() => {
const getFileName = (fullPath) => {
return fullPath.split('/').pop();
}
//
//
// const emit = defineEmits(['remove']);
//
// const confirm = useConfirm();
// const toast = useToast();
//
// const confirmDelete = (event) => {
// confirm.require({
// target: event.currentTarget,
// message: `Удалить документ "${props.doc.name}"?`,
// header: 'Подтверждение удаления',
// acceptLabel: 'Удалить',
// rejectLabel: 'Отмена',
// acceptClass: 'p-button-danger',
// accept: async () => {
// try {
// emit('remove', props.doc.id);
// toast.add({
// severity: 'success',
// summary: 'Успешно',
// detail: 'Документ удален',
// life: 3000
// });
// } catch (error) {
// toast.add({
// severity: 'error',
// summary: 'Ошибка',
// detail: 'Не удалось удалить документ',
// life: 3000
// });
// }
// },
// reject: () => {
// toast.add({
// severity: 'info',
// summary: 'Отменено',
// detail: 'Удаление отменено',
// life: 2000
// });
// }
// });
// };
const emit = defineEmits(['remove']);
const confirm = useConfirm();
const toast = useToast();
const confirmDelete = (event) => {
confirm.require({
target: event.currentTarget,
message: `Удалить документ "${props.doc.name}"?`,
header: 'Подтверждение удаления',
acceptLabel: 'Удалить',
rejectLabel: 'Отмена',
acceptClass: 'p-button-danger',
accept: async () => {
try {
emit('remove', props.doc.id);
toast.add({
severity: 'success',
summary: 'Успешно',
detail: 'Документ удален',
life: 3000
});
} catch (error) {
toast.add({
severity: 'error',
summary: 'Ошибка',
detail: 'Не удалось удалить документ',
life: 3000
});
}
},
reject: () => {
toast.add({
severity: 'info',
summary: 'Отменено',
detail: 'Удаление отменено',
life: 2000
});
}
});
};
</script>
<style scoped>