modified: main_dc/yalarba/easySite/easySite/app/components/BookingModal.vue

modified:   main_dc/yalarba/easySite/easySite/app/components/ImageGallery.vue
	modified:   main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/edit.vue
	modified:   main_dc/yalarba/easySite/easySite/app/pages/objects/[id]/index.vue
	modified:   main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue
	modified:   main_dc/yalarba/easySite/easySite/nuxt.config.ts
fix fix fix
This commit is contained in:
2025-11-15 11:31:32 +05:00
parent e26624935c
commit 34859a804b
6 changed files with 40 additions and 32 deletions
@@ -18,14 +18,22 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
// Определяем тип объекта недвижимости
interface RentalObject {
title: string;
city?: string; // опционально, если может отсутствовать
address?: string; // опционально
// другие поля при необходимости
}
defineProps<{ defineProps<{
object: any object: RentalObject | null | undefined;
dates: any dates: unknown;
guests: string guests: string;
}>() }>()
defineEmits<{ defineEmits<{
close: [] close: [];
confirm: [bookingData: any] confirm: [bookingData: unknown];
}>() }>()
</script> </script>
@@ -15,6 +15,7 @@ const props = defineProps<{
initialIndex: number initialIndex: number
}>() }>()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const emit = defineEmits<{ const emit = defineEmits<{
close: [] close: []
}>() }>()
@@ -18,12 +18,16 @@
<!-- Загрузка --> <!-- Загрузка -->
<div v-if="loading" class="loading-state"> <div v-if="loading" class="loading-state">
<div class="loading-spinner"></div> <div class="loading-spinner"/>
<p class="loading-text">Загрузка данных объекта...</p> <p class="loading-text">Загрузка данных объекта...</p>
</div> </div>
<!-- Форма --> <!-- Форма -->
<ObjectForm v-else-if="object" :object="object" :loading="updating" @submit="handleSubmit" <ObjectForm
v-else-if="object"
:object="object"
:loading="updating"
@submit="handleSubmit"
@cancel="handleCancel" /> @cancel="handleCancel" />
<!-- Объект не найден --> <!-- Объект не найден -->
@@ -47,8 +51,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Header from '~/components/layout/Header.vue'
import Footer from '~/components/layout/Footer.vue'
interface ObjectData { interface ObjectData {
id: number id: number
@@ -56,10 +56,12 @@
<div class="main-image"> <div class="main-image">
<img :src="object?.images[0]" :alt="object?.title" class="gallery-image" @click="openGallery(0)" /> <img :src="object?.images[0]" :alt="object?.title" class="gallery-image" @click="openGallery(0)" />
</div> </div>
<div class="thumbnails" v-if="object?.images.length > 1"> <div v-if="object?.images && object.images.length > 1" class="thumbnails">
<div v-for="(image, index) in object?.images.slice(1, 5)" :key="index" class="thumbnail" <div
v-for="(image, index) in object.images.slice(1, 5)"
:key="index" class="thumbnail"
@click="openGallery(index + 1)"> @click="openGallery(index + 1)">
<img :src="image" :alt="`${object?.title} - фото ${index + 2}`" /> <img :src="image" :alt="`${object.title} - фото ${index + 2}`">
<div v-if="index === 3 && object.images.length > 5" class="more-images"> <div v-if="index === 3 && object.images.length > 5" class="more-images">
+{{ object.images.length - 5 }} +{{ object.images.length - 5 }}
</div> </div>
@@ -112,7 +114,7 @@
</section> </section>
<!-- Отзывы --> <!-- Отзывы -->
<section class="content-section" v-if="reviews.length > 0"> <section v-if="reviews.length > 0" class="content-section">
<div class="section-header"> <div class="section-header">
<h2 class="section-title">Отзывы</h2> <h2 class="section-title">Отзывы</h2>
<div class="reviews-summary"> <div class="reviews-summary">
@@ -172,8 +174,8 @@
<div class="form-group"> <div class="form-group">
<label class="form-label">Даты</label> <label class="form-label">Даты</label>
<div class="date-inputs"> <div class="date-inputs">
<input type="date" v-model="bookingDates.checkIn" class="form-input" placeholder="Заезд" /> <input v-model="bookingDates.checkIn" type="date" class="form-input" placeholder="Заезд">
<input type="date" v-model="bookingDates.checkOut" class="form-input" placeholder="Выезд" /> <input v-model="bookingDates.checkOut" type="date" class="form-input" placeholder="Выезд">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -185,8 +187,8 @@
<option value="4">4 гостя</option> <option value="4">4 гостя</option>
</select> </select>
</div> </div>
<button class="btn btn-primary btn-large" @click="showBookingModal = true" <button class="btn btn-primary btn-large" :disabled="!bookingDates.checkIn || !bookingDates.checkOut"
:disabled="!bookingDates.checkIn || !bookingDates.checkOut"> @click="showBookingModal = true">
Забронировать Забронировать
</button> </button>
</div> </div>
@@ -223,8 +225,8 @@
<span></span> <span></span>
Редактировать Редактировать
</NuxtLink> </NuxtLink>
<button @click="toggleObjectStatus" class="btn btn-outline btn-with-icon" <button class="btn btn-outline btn-with-icon" :class="{ 'btn-primary': !object?.isActive }"
:class="{ 'btn-primary': !object?.isActive }"> @click="toggleObjectStatus">
<span>{{ object?.isActive ? '⏸️' : '▶️' }}</span> <span>{{ object?.isActive ? '⏸️' : '▶️' }}</span>
{{ object?.isActive ? 'Деактивировать' : 'Активировать' }} {{ object?.isActive ? 'Деактивировать' : 'Активировать' }}
</button> </button>
@@ -411,7 +413,7 @@ const toggleObjectStatus = async () => {
// В реальном приложении здесь был бы API-запрос // В реальном приложении здесь был бы API-запрос
} }
const handleBooking = (bookingData: any) => { const handleBooking = (bookingData: unknown) => {
console.log('Booking confirmed:', bookingData) console.log('Booking confirmed:', bookingData)
showBookingModal.value = false showBookingModal.value = false
// Здесь обработка бронирования // Здесь обработка бронирования
@@ -237,7 +237,7 @@ const userInitials = computed(() => {
if (!auth.user.value?.full_name) return '??' if (!auth.user.value?.full_name) return '??'
const names = auth.user.value.full_name.split(' ') const names = auth.user.value.full_name.split(' ')
if (names.length >= 2) { if (names.length >= 2 && names[0] && names[1]) {
return `${names[0][0]}${names[1][0]}`.toUpperCase() return `${names[0][0]}${names[1][0]}`.toUpperCase()
} }
return auth.user.value.full_name.substring(0, 2).toUpperCase() return auth.user.value.full_name.substring(0, 2).toUpperCase()
@@ -16,6 +16,7 @@ export default defineNuxtConfig({
sitemap: { sitemap: {
// Базовые настройки // Базовые настройки
// @ts-expect-error becouse of this line siteUrl is note defined in linter
siteUrl: 'https://easysite102.ru', siteUrl: 'https://easysite102.ru',
gzip: true, gzip: true,
cacheMaxAgeSeconds: 3600, // Кэширование на 1 час cacheMaxAgeSeconds: 3600, // Кэширование на 1 час
@@ -78,14 +79,6 @@ export default defineNuxtConfig({
// Игнорируем внешние URL при пререндере // Игнорируем внешние URL при пререндере
crawlLinks: false crawlLinks: false
}, },
devProxy: {
'/api': {
target: 'https://easysite102.ru',
changeOrigin: true,
// Явно указываем перезапись пути
rewrite: (path) => path.replace(/^\/api/, '/api')
}
}
}, },
@@ -112,6 +105,8 @@ export default defineNuxtConfig({
ui: { ui: {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
preset: 'none', // Отключает предустановленные стили preset: 'none', // Отключает предустановленные стили
fonts: false // Отключает автоподключение шрифтов fonts: false // Отключает автоподключение шрифтов
}, },