Compare commits
No commits in common. "main" and "pdf" have entirely different histories.
@ -1,2 +1 @@
|
|||||||
## Application for sheduling classes in UPML
|
# Application for sheduling classes in UPML
|
||||||
# Not finished: switched to [organization repository](https://github.com/SSH-KK/timetable-generator)
|
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
{
|
|
||||||
"days": [
|
|
||||||
{
|
|
||||||
"events": [
|
|
||||||
{
|
|
||||||
"lessons": [0, 1, 2, 3, 4, 5]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"lessons": [0, 1, 2, 3, 4, 5]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"date": 5467546
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"events": [
|
|
||||||
{
|
|
||||||
"lessons": [0, 1, 2, 3, 4, 5]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"date": 5467546
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"cards": [
|
|
||||||
{
|
|
||||||
"subject": 3,
|
|
||||||
"room": 505,
|
|
||||||
"teacher": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subjects": [
|
|
||||||
{
|
|
||||||
"title": "Math",
|
|
||||||
"teachers": ["Popov", "somebody"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -42,7 +42,6 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/pdfmake": "^0.1.16",
|
"@types/pdfmake": "^0.1.16",
|
||||||
"bootstrap-icons": "^1.2.1",
|
|
||||||
"pdfmake": "^0.1.68",
|
"pdfmake": "^0.1.68",
|
||||||
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 ",
|
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 ",
|
||||||
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 "
|
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 "
|
||||||
|
@ -1,128 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
|
||||||
<link rel="stylesheet" href="test_html.css">
|
|
||||||
<title>Document</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="wrapper">
|
|
||||||
<nav id="sidebar" class="active me-3">
|
|
||||||
<div class="sidebar-header">
|
|
||||||
<h3>Bootstrap Sidebar</h3>
|
|
||||||
</div>
|
|
||||||
<button type="button" id="sidebar-toggle" class="btn btn-secondary rounded-end">X</button>
|
|
||||||
</nav>
|
|
||||||
<div id="content" class="container mt-3">
|
|
||||||
<!-- <nav class="navbar navbar-expand-lg navbar-light bg-light">
|
|
||||||
<div class="container-fluid">
|
|
||||||
<button type="button" id="sidebarCollapse" class="btn btn-info">
|
|
||||||
<i class="fas fa-align-left"></i>
|
|
||||||
<span>Toggle Sidebar</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</nav> -->
|
|
||||||
<div class="row text-center">
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">11</div>
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">11</div>
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">11</div>
|
|
||||||
</div>
|
|
||||||
<div class="row text-center border-bottom border-3">
|
|
||||||
<div class="col-md-2 rounded-2 shadow-sm">91</div>
|
|
||||||
<div class="col-md-2 rounded-2 shadow-sm">91</div>
|
|
||||||
<div class="col-md-2 rounded-2 shadow-sm">91</div>
|
|
||||||
<div class="col-md-2 rounded-2 shadow-sm">91</div>
|
|
||||||
<div class="col-md-2 rounded-2 shadow-sm">91</div>
|
|
||||||
<div class="col-md-2 rounded-2 shadow-sm">91</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 text-center border-bottom border-start border-3">
|
|
||||||
<h6>Физика</h6>
|
|
||||||
<h6>505</h6>
|
|
||||||
<h6>Попов</h6>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 d-flex align-items-center justify-content-center text-center border-bottom border-end border-start border-3">
|
|
||||||
<div class="dropdown">
|
|
||||||
<button class="btn btn-sm btn-success dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
Выберите пару
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
|
||||||
<li><a class="dropdown-item" href="#">Action</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Another action</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Something else here</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-grid gap-2 my-2">
|
|
||||||
<button class="btn btn-outline-primary btn-sm" type="button">Новые Пары</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 text-center border-bottom border-3">
|
|
||||||
<h6>Физика</h6>
|
|
||||||
<h6>505</h6>
|
|
||||||
<h6>Попов</h6>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 d-flex align-items-center justify-content-center text-center border-bottom border-end border-start border-3">
|
|
||||||
<div class="dropdown">
|
|
||||||
<button class="btn btn-sm btn-success dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
Выберите пару
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
|
||||||
<li><a class="dropdown-item" href="#">Action</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Another action</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Something else here</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-grid gap-2 my-2">
|
|
||||||
<button class="btn btn-outline-primary btn-sm" type="button">Новые Пары</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 text-center border-bottom border-3">
|
|
||||||
<h6>Физика</h6>
|
|
||||||
<h6>505</h6>
|
|
||||||
<h6>Попов</h6>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 d-flex align-items-center justify-content-center text-center border-bottom border-end border-start border-3">
|
|
||||||
<div class="dropdown">
|
|
||||||
<button class="btn btn-sm btn-success dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
Выберите пару
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
|
||||||
<li><a class="dropdown-item" href="#">Action</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Another action</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#">Something else here</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-grid gap-2 my-2">
|
|
||||||
<button class="btn btn-outline-primary btn-sm" type="button">Новые Пары</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- <div class="col-md-4 rounded-2 shadow-sm">dfsfsfesfs</div>
|
|
||||||
<div class="col-md-4 rounded-2 shadow-sm">dfsfsfesfs</div> -->
|
|
||||||
</div>
|
|
||||||
<div class="d-grid gap-2 my-2">
|
|
||||||
<button class="btn btn-outline-primary btn-sm" type="button">Новый День</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script type="text/javascript">
|
|
||||||
document.querySelector('#sidebar-toggle').addEventListener('click', ()=>{
|
|
||||||
document.querySelector('#sidebar').classList.toggle('active')
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
|
|
||||||
</html>
|
|
93
src/hooks.ts
93
src/hooks.ts
@ -1,93 +0,0 @@
|
|||||||
import { useState } from "react";
|
|
||||||
import {
|
|
||||||
TimetableT,
|
|
||||||
UseTimetableHookFT,
|
|
||||||
CreateCardFT,
|
|
||||||
CreateSubjectFT,
|
|
||||||
CreateDayFT,
|
|
||||||
AddEventFT,
|
|
||||||
AddLessonFT,
|
|
||||||
DayT,
|
|
||||||
CardT,
|
|
||||||
SubjectT,
|
|
||||||
} from "./types/timetable";
|
|
||||||
import { initialEventLessonsGenrator } from "./utils/timetable";
|
|
||||||
|
|
||||||
export const useTimetable: UseTimetableHookFT = () => {
|
|
||||||
const [cardState, setCardState] = useState<CardT[]>([]);
|
|
||||||
const [dayState, setDayState] = useState<DayT[]>([]);
|
|
||||||
const [subjectState, setSubjectState] = useState<SubjectT[]>([]);
|
|
||||||
// const [startDateState, setStartDateState] = useState<number>(0)
|
|
||||||
|
|
||||||
const createSubject: CreateSubjectFT = (title, teachers) => {
|
|
||||||
setSubjectState(prev => [...prev, { title, teachers }]);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createCard: CreateCardFT = (subject, teacher, room) => {
|
|
||||||
setCardState(prev => [...prev, { subject, teacher, room }]);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createDay: CreateDayFT = date => {
|
|
||||||
setDayState(prev => [...prev, { date, events: [] }]);
|
|
||||||
};
|
|
||||||
|
|
||||||
const addEvent: AddEventFT = dayId => {
|
|
||||||
setDayState(days =>
|
|
||||||
days.map((day, i) =>
|
|
||||||
i == dayId
|
|
||||||
? {
|
|
||||||
...day,
|
|
||||||
events: [
|
|
||||||
...day.events,
|
|
||||||
{ lessons: initialEventLessonsGenrator() },
|
|
||||||
],
|
|
||||||
}
|
|
||||||
: day
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const addLesson: AddLessonFT = (
|
|
||||||
dayId,
|
|
||||||
eventId,
|
|
||||||
groupId,
|
|
||||||
isPair,
|
|
||||||
lessonId,
|
|
||||||
lessonNumber
|
|
||||||
) => {
|
|
||||||
setDayState(days =>
|
|
||||||
days.map((day, dayIndex) =>
|
|
||||||
dayIndex == dayId
|
|
||||||
? {
|
|
||||||
...day,
|
|
||||||
events: day.events.map((event, eventIndex) =>
|
|
||||||
eventIndex == eventId
|
|
||||||
? {
|
|
||||||
lessons: event.lessons.map((lesson, lessonIndex) =>
|
|
||||||
lessonIndex == groupId
|
|
||||||
? isPair
|
|
||||||
? [lessonId, lessonId]
|
|
||||||
: lesson.map((lessonElement, lessonElementIndex) =>
|
|
||||||
lessonElementIndex == lessonNumber
|
|
||||||
? lessonId
|
|
||||||
: lessonElement
|
|
||||||
)
|
|
||||||
: lesson
|
|
||||||
),
|
|
||||||
}
|
|
||||||
: event
|
|
||||||
),
|
|
||||||
}
|
|
||||||
: day
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
state: { cards: cardState, subjects: subjectState, days: dayState },
|
|
||||||
createCard,
|
|
||||||
createSubject,
|
|
||||||
createDay,
|
|
||||||
addLesson,
|
|
||||||
};
|
|
||||||
};
|
|
@ -1,7 +1,3 @@
|
|||||||
.title {
|
.title {
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
/*just test sunlime merge*/
|
|
||||||
body {
|
|
||||||
background-color: blue;
|
|
||||||
}
|
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
.wrapper {
|
|
||||||
display: flex;
|
|
||||||
width: 100%;
|
|
||||||
align-items: stretch;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar {
|
|
||||||
min-width: 18%;
|
|
||||||
max-width: 18%;
|
|
||||||
min-height: 100vh;
|
|
||||||
position: relative;
|
|
||||||
background-color: #adb5bd;
|
|
||||||
transition: all 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar {
|
|
||||||
margin-left: -18%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar.active {
|
|
||||||
margin-left: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar-toggle {
|
|
||||||
position: absolute;
|
|
||||||
border-radius: 0;
|
|
||||||
top: 0;
|
|
||||||
left: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
|
||||||
#sidebar {
|
|
||||||
margin-left: -250px;
|
|
||||||
}
|
|
||||||
#sidebar.active {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
export type TimetableT = {
|
|
||||||
days: DayT[];
|
|
||||||
cards: CardT[];
|
|
||||||
subjects: SubjectT[];
|
|
||||||
};
|
|
||||||
|
|
||||||
export type DayT = {
|
|
||||||
events: EventT[];
|
|
||||||
date: number; // epoch time
|
|
||||||
};
|
|
||||||
|
|
||||||
type EventT = {
|
|
||||||
lessons: number[][]; // IDs
|
|
||||||
};
|
|
||||||
|
|
||||||
export type CardT = {
|
|
||||||
subject: number; // ID
|
|
||||||
room: number; // Number
|
|
||||||
teacher: number; // ID in subject
|
|
||||||
};
|
|
||||||
|
|
||||||
export type SubjectT = {
|
|
||||||
title: string;
|
|
||||||
teachers: string[]; // teachers allowed for this subject
|
|
||||||
};
|
|
||||||
|
|
||||||
export type CreateSubjectFT = (title: string, teachers: string[]) => void;
|
|
||||||
|
|
||||||
export type CreateCardFT = (
|
|
||||||
subject: number,
|
|
||||||
teacher: number,
|
|
||||||
room: number
|
|
||||||
) => void;
|
|
||||||
|
|
||||||
export type CreateDayFT = (date: number) => void;
|
|
||||||
|
|
||||||
export type AddEventFT = (dayId: number) => void;
|
|
||||||
|
|
||||||
export type AddLessonFT = (
|
|
||||||
dayId: number,
|
|
||||||
eventId: number,
|
|
||||||
groupId: number,
|
|
||||||
isPair: boolean,
|
|
||||||
lessonId: number,
|
|
||||||
lessonNumber?: number
|
|
||||||
) => void;
|
|
||||||
|
|
||||||
export type UseTimetableHookFT = () => {
|
|
||||||
createSubject: CreateSubjectFT;
|
|
||||||
createCard: CreateCardFT;
|
|
||||||
createDay: CreateCardFT;
|
|
||||||
state: TimetableT;
|
|
||||||
};
|
|
@ -1,2 +0,0 @@
|
|||||||
export const initialEventLessonsGenrator = () =>
|
|
||||||
Array(6).map<number[]>(() => [0, 0]);
|
|
Loading…
x
Reference in New Issue
Block a user