From f274a62be92b4924c2f7784a0c02581bd8b9d8fe Mon Sep 17 00:00:00 2001 From: primakov Date: Sun, 23 Mar 2025 09:09:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20=D1=82=D0=B5=D0=BC=D1=8B=20=D0=B8=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0=20Attend?= =?UTF-8?q?ance.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D0=B2=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=20AttendanceTable=20=D1=81?= =?UTF-8?q?=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=D0=BC=D0=B8=20=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D0=B0=D1=82=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/attendance/attendance.tsx | 7 -- .../attendance/components/AttendanceTable.tsx | 93 ++++++++++++++++++- 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/src/pages/attendance/attendance.tsx b/src/pages/attendance/attendance.tsx index 2af95c1..521d54b 100644 --- a/src/pages/attendance/attendance.tsx +++ b/src/pages/attendance/attendance.tsx @@ -36,13 +36,6 @@ export const Attendance = () => { - : } - onClick={toggleColorMode} - variant="ghost" - size="lg" - /> diff --git a/src/pages/attendance/components/AttendanceTable.tsx b/src/pages/attendance/components/AttendanceTable.tsx index 955bc65..26524fe 100644 --- a/src/pages/attendance/components/AttendanceTable.tsx +++ b/src/pages/attendance/components/AttendanceTable.tsx @@ -8,8 +8,12 @@ import { Td, Box, useColorMode, - useTheme + useTheme, + Button, + useToast, + Flex } from '@chakra-ui/react' +import { CopyIcon } from '@chakra-ui/icons' import dayjs from 'dayjs' import { ShortText } from './ShortText' import { AttendanceData } from '../hooks' @@ -21,6 +25,7 @@ interface AttendanceTableProps { export const AttendanceTable: React.FC = ({ data }) => { const { colorMode } = useColorMode() const theme = useTheme() + const toast = useToast() const getPresentColor = () => { return colorMode === 'dark' ? 'green.600' : 'green.100' @@ -30,6 +35,81 @@ export const AttendanceTable: React.FC = ({ data }) => { return colorMode === 'dark' ? 'red.800' : 'red.100' } + // Функция для копирования данных таблицы без сокращений + const copyTableData = () => { + if (!data.attendance?.length) return + + // Строим заголовок таблицы + let tableContent = [] + + // Добавляем заголовки с именами преподавателей + let headerRow = [] + data.teachers?.forEach(teacher => { + headerRow.push(teacher.value) + }) + + // Добавляем столбцы даты и названия занятия + headerRow.push('Дата', 'Название занятия') + + // Добавляем студентов + data.students.forEach(student => { + headerRow.push(student.name || student.value || 'Имя не определено') + }) + + // Добавляем заголовок в таблицу + tableContent.push(headerRow.join('\t')) + + // Формируем данные для каждой строки + data.attendance.forEach(lesson => { + let row = [] + + // Добавляем данные о присутствии преподавателей + data.teachers?.forEach(teacher => { + const wasThere = Boolean(lesson.teachers) && + lesson.teachers.findIndex(u => u.sub === teacher.sub) !== -1 + row.push(wasThere ? '+' : '-') + }) + + // Добавляем дату + row.push(dayjs(lesson.date).format('DD.MM.YYYY')) + + // Добавляем полное название занятия (без сокращений) + row.push(lesson.name) + + // Добавляем данные о присутствии студентов + data.students.forEach(student => { + const wasThere = lesson.students.findIndex(u => u.sub === student.sub) !== -1 + row.push(wasThere ? '+' : '-') + }) + + // Добавляем строку в таблицу + tableContent.push(row.join('\t')) + }) + + // Копируем в буфер обмена + const finalContent = tableContent.join('\n') + navigator.clipboard.writeText(finalContent) + .then(() => { + toast({ + title: 'Скопировано в буфер обмена', + description: 'Таблица успешно скопирована без сокращений', + status: 'success', + duration: 3000, + isClosable: true, + }) + }) + .catch(err => { + toast({ + title: 'Ошибка копирования', + description: 'Не удалось скопировать таблицу', + status: 'error', + duration: 3000, + isClosable: true, + }) + console.error('Ошибка копирования', err) + }) + } + if (!data.attendance?.length || !data.students?.length) { return Нет данных для отображения } @@ -41,6 +121,17 @@ export const AttendanceTable: React.FC = ({ data }) => { borderRadius="lg" bg={colorMode === 'dark' ? 'gray.700' : 'white'} > + + +