Skip to content

Commit

Permalink
fix: fixed all use cases to working variant
Browse files Browse the repository at this point in the history
  • Loading branch information
Arthur410 committed Dec 19, 2024
1 parent 6bdb8aa commit 82c07cb
Show file tree
Hide file tree
Showing 11 changed files with 709 additions and 224 deletions.
35 changes: 32 additions & 3 deletions frontend/src/features/sidebar/ui/admin/ReportsSection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,13 @@
layout="total, sizes, prev, pager, next"
></el-pagination>

<div>
<el-button @click="exportAbonementsToJson" type="success" style="margin-top: 15px;">Экспортировать в JSON</el-button>
</div>
<Spacer></Spacer>
</el-container>


<!-- Вкладка статистики по занятиям -->
<el-container v-else-if="currentTab === 'trainings'" style="margin-top: 20px; gap: 15px;" direction="vertical">
<el-row style="gap: 10px;" type="flex" align="middle">
Expand Down Expand Up @@ -143,6 +147,11 @@
:page-sizes="[5,10,20,50]"
layout="total, sizes, prev, pager, next"
></el-pagination>

<!-- Кнопка экспорта JSON для тренингов -->
<div>
<el-button @click="exportTrainingsToJson" type="success" style="margin-top: 15px;">Экспортировать в JSON</el-button>
</div>
</el-container>
</div>
</template>
Expand Down Expand Up @@ -235,8 +244,8 @@ const fetchDataAbonements = () => {
return {
id: item.client.id,
clientName: item.client.name + ' ' + item.client.surname,
startDate: item.startDate ? item.startDate : 'Не указано',
endDate: item.endDate ? item.endDate : 'Не указано',
startDate: item.startDate ? dayjs(item.startDate).format('DD.MM.YYYY') : 'Не указано',
endDate: item.endDate ? dayjs(item.endDate).format('DD.MM.YYYY') : 'Не указано',
status: item.status
}
});
Expand Down Expand Up @@ -318,7 +327,7 @@ const fetchDataTrainings = () => {
axiosInstance.get('/admins/statistics/trainings', { params: requestParamsTrainings.value })
.then(res => {
const data = res.data;
totalTrainings.value = data.count;
totalTrainings.value = data.length;
trainingsData.value = data.map((d:any) => {
return {
...d,
Expand Down Expand Up @@ -361,6 +370,26 @@ const loadClients = () => {
});
};
// Функция экспорта данных абонементов в JSON
const exportAbonementsToJson = () => {
const dataStr = JSON.stringify(subscriptions.value, null, 2);
const blob = new Blob([dataStr], { type: 'application/json' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'abonements_data.json';
link.click();
};
// Функция экспорта данных по тренингам в JSON
const exportTrainingsToJson = () => {
const dataStr = JSON.stringify(trainingsData.value, null, 2);
const blob = new Blob([dataStr], { type: 'application/json' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'trainings_data.json';
link.click();
};
onMounted(() => {
loadClients();
const savedTab = localStorage.getItem('currentTab');
Expand Down
27 changes: 10 additions & 17 deletions frontend/src/features/sidebar/ui/admin/ServiceInfoSection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
<el-button @click="toggleFilters">
{{ isFilterOpened ? 'Закрыть фильтрацию и поиск' : 'Открыть фильтрацию и поиск' }}
</el-button>
<spacer></spacer>

<!-- Фильтры и сортировка -->
<el-row v-if="isFilterOpened" style="margin-bottom: 20px; gap: 15px;" type="flex" justify="start">
Expand Down Expand Up @@ -87,24 +86,18 @@
<el-button type="primary" @click="resetFilters">Сбросить</el-button>
</el-col>
</el-row>
<spacer></spacer>

<!-- Таблица с залами -->
<el-table
:data="displayedRooms"
highlight-current-row
style="width: 100%;cursor:pointer;"
@row-click="handleRowClick"
>
<el-table-column label="Название" prop="name" sortable/>
<el-table-column label="Емкость" prop="capacity" sortable/>
<el-table-column label="Адрес" prop="address" sortable/>
<el-table-column label="Рабочие дни" prop="workingDays" sortable/>
<el-table-column label="Часы открытия" prop="openingTime" sortable/>
<el-table-column label="Часы закрытия" prop="closingTime" sortable/>
<el-table-column label="Тренеры" prop="trainers" sortable/>
<el-table-column label="Секции" prop="sections" sortable/>
</el-table>
<el-card v-for="room of displayedRooms" style="cursor: pointer" @click="handleRowClick(room)">
<div><strong>Название:</strong> {{ room.name }}</div>
<div><strong>Емкость:</strong> {{ room.capacity }}</div>
<div><strong>Адрес:</strong> {{ room.address }}</div>
<div><strong>Рабочие дни:</strong> {{ room.workingDays }}</div>
<div><strong>Часы открытия:</strong> {{ room.openingTime }}</div>
<div><strong>Часы закрытия:</strong> {{ room.closingTime }}</div>
<div><strong>Тренеры:</strong> {{ room.trainers }}</div>
<div><strong>Секции:</strong> {{ room.sections }}</div>
</el-card>

<!-- Модальное окно для просмотра/редактирования зала -->
<el-dialog
Expand Down
165 changes: 64 additions & 101 deletions frontend/src/features/sidebar/ui/admin/UsersSection.vue
Original file line number Diff line number Diff line change
@@ -1,96 +1,6 @@
<template>
<div v-loading="isLoading" >
<div v-loading="isLoading">
<el-container v-if="!userInfoSectionClicked" direction="vertical" class="user-cards" style="gap: 15px;">

<!-- Кнопка для открытия/закрытия фильтров -->
<el-button @click="toggleFilters">
{{ isFilterOpened ? 'Закрыть фильтрацию и поиск' : 'Открыть фильтрацию и поиск' }}
</el-button>
<!-- Фильтрация и сортировка -->
<el-row v-if="isFilterOpened" style="margin-bottom: 20px; gap: 15px;" type="flex" justify="start">
<!-- Фильтр по имени -->
<el-col :span="6">
<el-input v-model="filters.name" placeholder="Фильтр по имени" clearable />
</el-col>

<!-- Фильтр по фамилии -->
<el-col :span="6">
<el-input v-model="filters.surname" placeholder="Фильтр по фамилии" clearable />
</el-col>

<!-- Фильтр по Email -->
<el-col :span="6">
<el-input v-model="filters.email" placeholder="Фильтр по Email" clearable />
</el-col>

<!-- Фильтр по телефону -->
<el-col :span="6">
<el-input v-model="filters.phoneNumber" placeholder="Фильтр по телефону" clearable />
</el-col>

<!-- Фильтр по ролям -->
<el-col :span="6">
<el-select v-model="filters.roles" placeholder="Фильтр по ролям" style="width: 100%;" multiple clearable>
<el-option label="Администратор" value="ROLE_ADMIN" />
<el-option label="Тренер" value="ROLE_TRAINER" />
<el-option label="Клиент" value="ROLE_USER" />
<!-- Добавьте другие роли по необходимости -->
</el-select>
</el-col>

<!-- Фильтр по полу -->
<el-col :span="6">
<el-select v-model="filters.gender" placeholder="Фильтр по полу" style="width: 100%;" clearable>
<el-option label="Мужчина" value="MALE" />
<el-option label="Женщина" value="FEMALE" />
<el-option label="Не указано" value="" />
</el-select>
</el-col>

<el-col>
<el-date-picker
v-model="filters.createdAt"
type="daterange"
range-separator="до"
start-placeholder="Начало"
end-placeholder="Конец"
format="DD.MM.YYYY"
clearable
/>
</el-col>

<!-- Фильтр по комментариям -->
<el-col :span="6">
<el-input v-model="filters.comment" placeholder="Фильтр по комментариям" clearable />
</el-col>

<!-- Сортировка по полям -->
<el-col :span="6">
<el-select v-model="sortBy" placeholder="Сортировать по" style="width: 100%;">
<el-option label="Имя" value="name" />
<el-option label="Фамилия" value="surname" />
<el-option label="Email" value="email" />
<el-option label="Телефон" value="phoneNumber" />
<el-option label="Роль" value="roles" />
<el-option label="Пол" value="gender" />
<el-option label="Комментарий" value="comment" />
</el-select>
</el-col>

<el-col :span="6">
<el-select v-model="sortOrder" placeholder="Порядок" style="width: 100%;">
<el-option label="По возрастанию" value="asc" />
<el-option label="По убыванию" value="desc" />
</el-select>
</el-col>

<!-- Кнопка сброса фильтров -->
<el-col :span="6">
<el-button type="primary" @click="resetFilters">Сбросить фильтры</el-button>
</el-col>
</el-row>
<spacer></spacer>

<!-- Карточки пользователей -->
<el-card v-for="user in filteredSortedUsers" :key="user.id" shadow="hover">
<el-container style="display: grid; grid-template-columns: 1fr auto">
Expand All @@ -113,7 +23,7 @@
</div>
<el-container direction="vertical" style="gap: 15px;">
<el-button type="primary" @click="handleInfoSectionCLick(user)">Подробнее</el-button>
<el-button type="danger">Удалить</el-button>
<el-button type="danger" @click="handleUserDelete(user)">Удалить</el-button>
</el-container>
</el-container>
</el-card>
Expand All @@ -127,10 +37,11 @@ import UserInfoSection from '@/features/sidebar/ui/admin/sections/UserInfoSectio
import Spacer from '@/shared/components/Spacer.vue';
import axiosInstance from '@/widgets/axios/index.ts';
import { onMounted, ref, computed } from 'vue';
import { ElNotification } from 'element-plus';
const isLoading = ref(true)
const isLoading = ref(true);
const userInfoSectionClicked = ref(false);
const clickedUser = ref();
const clickedUser = ref(null);
const users = ref([]);
const isFilterOpened = ref(false);
Expand Down Expand Up @@ -190,13 +101,13 @@ onMounted(() => {
users.value = res.data;
}).catch(error => {
console.error('Ошибка при загрузке пользователей:', error);
}).finally(() => {
isLoading.value = false;
});
isLoading.value = false;
});
// Фильтрация и сортировка
const filteredSortedUsers = computed<any>(() => {
const filteredSortedUsers = computed(() => {
let filtered = users.value;
// Фильтрация по каждому полю
Expand Down Expand Up @@ -298,8 +209,60 @@ const filteredSortedUsers = computed<any>(() => {
return filtered;
});
</script>
<style scoped lang="scss">
/* Можно добавить кастомные стили для фильтра и сортировки */
</style>
// Функция для удаления пользователя
const handleUserDelete = (user) => {
if (user.roles.includes('ROLE_USER')) {
// Для пользователей с ролью ROLE_USER проверяем статус абонемента
axiosInstance.get(`/clients/${user.id}/subscription`).then((res) => {
const subscription = res.data;
if (subscription.status === 'active') {
ElNotification({
title: 'Ошибка',
message: 'У этого пользователя есть активный абонемент. Удаление невозможно.',
type: 'error'
});
} else {
deleteUser(user);
}
}).catch((error) => {
ElNotification({
title: 'Ошибка',
message: error.response.data?.errors || 'Неизвестная ошибка',
type: 'error'
});
});
} else {
deleteUser(user);
}
};
// Функция для отправки запроса на удаление пользователя
const deleteUser = (user) => {
let deleteUrl = '';
if (user.roles.includes('ROLE_USER')) {
deleteUrl = `/clients/${user.id}`;
} else if (user.roles.includes('ROLE_TRAINER')) {
deleteUrl = `/trainers/${user.id}`;
} else if (user.roles.includes('ROLE_ADMIN')) {
deleteUrl = `/admins/${user.id}`;
}
axiosInstance.delete(deleteUrl).then(() => {
ElNotification({
title: 'Успех',
message: `Пользователь ${user.name} ${user.surname} успешно удалён.`,
type: 'success'
});
// Обновить список пользователей
users.value = users.value.filter(u => u.id !== user.id);
}).catch((error) => {
ElNotification({
title: 'Ошибка',
message: error.response.data?.errors || 'Неизвестная ошибка',
type: 'error'
});
});
};
</script>
Loading

0 comments on commit 82c07cb

Please sign in to comment.