Compare commits
No commits in common. "main" and "pdf" have entirely different histories.
@ -1,2 +1 @@
|
||||
## Application for sheduling classes in UPML
|
||||
# Not finished: switched to [organization repository](https://github.com/SSH-KK/timetable-generator)
|
||||
# Application for sheduling classes in UPML
|
||||
|
@ -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": {
|
||||
"@types/pdfmake": "^0.1.16",
|
||||
"bootstrap-icons": "^1.2.1",
|
||||
"pdfmake": "^0.1.68",
|
||||
"react": "^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 {
|
||||
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