Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
88270fdcfe | |||
|
7ad62907ec | ||
|
adaf786ddd | ||
d008eedce0 | |||
|
b5aa7a4ed6 | ||
|
c055659a87 | ||
|
55d3f4757e | ||
|
03dfa117b2 | ||
|
3d82a01683 | ||
27a0d3eac4 | |||
|
046408f81d | ||
|
1417158c14 |
@ -1 +1,2 @@
|
|||||||
# 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)
|
||||||
|
36
dataExample.json
Normal file
36
dataExample.json
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"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,6 +42,7 @@
|
|||||||
},
|
},
|
||||||
"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 "
|
||||||
|
128
src/HTML one.html
Normal file
128
src/HTML one.html
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
<!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
Normal file
93
src/hooks.ts
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
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,3 +1,7 @@
|
|||||||
.title {
|
.title {
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
/*just test sunlime merge*/
|
||||||
|
body {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
38
src/test_html.css
Normal file
38
src/test_html.css
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
.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;
|
||||||
|
}
|
||||||
|
}
|
53
src/types/timetable.ts
Normal file
53
src/types/timetable.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
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;
|
||||||
|
};
|
2
src/utils/timetable.ts
Normal file
2
src/utils/timetable.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export const initialEventLessonsGenrator = () =>
|
||||||
|
Array(6).map<number[]>(() => [0, 0]);
|
Loading…
x
Reference in New Issue
Block a user