Skip to content

Commit

Permalink
Merge pull request #20 from itsu-dev/create-timetable
Browse files Browse the repository at this point in the history
Create timetable
  • Loading branch information
itsu-dev authored Mar 21, 2022
2 parents 02bb770 + 53f7b41 commit 57f8af8
Show file tree
Hide file tree
Showing 18 changed files with 1,036 additions and 63 deletions.
6 changes: 3 additions & 3 deletions build/asset-manifest.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"files": {
"main.css": "/scs-migration-checker/static/css/main.dade9586.css",
"main.js": "/scs-migration-checker/static/js/main.fb1af705.js",
"main.js": "/scs-migration-checker/static/js/main.33ffe542.js",
"index.html": "/scs-migration-checker/index.html",
"main.dade9586.css.map": "/scs-migration-checker/static/css/main.dade9586.css.map",
"main.fb1af705.js.map": "/scs-migration-checker/static/js/main.fb1af705.js.map"
"main.33ffe542.js.map": "/scs-migration-checker/static/js/main.33ffe542.js.map"
},
"entrypoints": [
"static/css/main.dade9586.css",
"static/js/main.fb1af705.js"
"static/js/main.33ffe542.js"
]
}
2 changes: 1 addition & 1 deletion build/index.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!doctype html><html lang="ja"><head><meta charset="utf-8"/><title>ITF.scs 移行要件チェックツール</title><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans+JP"/><link rel="stylesheet" href="css/core.css"/><meta name="google-site-verification" content="qX9Nx5fsCuoBuFc2rnAZcqVvuLZoxwaBuSiQkk-snuA"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="筑波大学 総合学域群 移行要件チェックツール"/><meta name="keywords" content="筑波大学,総合学域群,移行,移行要件,scs,scs-migration-checker,KdB,kdb"/><meta name="author" content="ちゅるり"/><meta name="twitter:card" content="summary"/><meta name="twitter:creator" content="@chururi_"/><meta name="twitter:site" content="@chururi_"/><meta property="og:url" content="https://itsu-dev.github.io/scs-migration-checker/"/><meta property="og:title" content="筑波大学 総合学域群 移行要件チェックツール"/><meta property="og:description" content="筑波大学 総合学域群 移行要件チェックツール"/><script type="text/javascript">!function(n){if("/"===n.search[1]){var a=n.search.slice(1).split("&").map((function(n){return n.replace(/~and~/g,"&")})).join("?");window.history.replaceState(null,null,n.pathname.slice(0,-1)+a+n.hash)}}(window.location)</script><script defer="defer" src="/scs-migration-checker/static/js/main.fb1af705.js"></script><link href="/scs-migration-checker/static/css/main.dade9586.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
<!doctype html><html lang="ja"><head><meta charset="utf-8"/><title>ITF.scs 移行要件チェックツール</title><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans+JP"/><link rel="stylesheet" href="css/core.css"/><meta name="google-site-verification" content="qX9Nx5fsCuoBuFc2rnAZcqVvuLZoxwaBuSiQkk-snuA"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="筑波大学 総合学域群 移行要件チェックツール"/><meta name="keywords" content="筑波大学,総合学域群,移行,移行要件,scs,scs-migration-checker,KdB,kdb"/><meta name="author" content="ちゅるり"/><meta name="twitter:card" content="summary"/><meta name="twitter:creator" content="@chururi_"/><meta name="twitter:site" content="@chururi_"/><meta property="og:url" content="https://itsu-dev.github.io/scs-migration-checker/"/><meta property="og:title" content="筑波大学 総合学域群 移行要件チェックツール"/><meta property="og:description" content="筑波大学 総合学域群 移行要件チェックツール"/><script type="text/javascript">!function(n){if("/"===n.search[1]){var a=n.search.slice(1).split("&").map((function(n){return n.replace(/~and~/g,"&")})).join("?");window.history.replaceState(null,null,n.pathname.slice(0,-1)+a+n.hash)}}(window.location)</script><script defer="defer" src="/scs-migration-checker/static/js/main.33ffe542.js"></script><link href="/scs-migration-checker/static/css/main.dade9586.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
2 changes: 1 addition & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<link rel="stylesheet" href="css/core.css"/>

<meta name="google-site-verification" content="qX9Nx5fsCuoBuFc2rnAZcqVvuLZoxwaBuSiQkk-snuA"/>
<meta name="viewport" content="width=device-width, initial-scale=1" />

<meta name="theme-color" content="#000000" />
<meta name="description" content="筑波大学 総合学域群 移行要件チェックツール"/>
<meta name="keywords" content="筑波大学,総合学域群,移行,移行要件,scs,scs-migration-checker,KdB,kdb"/>
Expand Down
47 changes: 27 additions & 20 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import MigrationChecker from "./main/MigrationChecker";
import MigrationRequirements from "./requirements/MigrationRequirements";
import CreateTimetable from "./create/CreateTimetable";
import React from "react";
import MenuBar, {MenuItem} from "./MenuBar";

export type UserSubject = {
id: string,
Expand Down Expand Up @@ -95,18 +96,16 @@ const onLoadRuleDefinitionsFinished = (json: string) => {
console.log(`[Rule Definitions] Loaded - Version: ${ruleDefinitions.version} Last Updated At: ${ruleDefinitions.updatedAt}`)
}

export const getSeasonByName = (kdb: KdB, name: string): string | null => {
const filtered = Array.from(kdb.data.values()).filter((value) => value[0] === name)
return filtered ? `${filtered[0][1]} ${filtered[0][2]}` : null
}

export const getExcludedSeason = (ruleDefinitions: RuleDefinitions, subject: string): string | null => {
let result: string | null = null;
ruleDefinitions.exclusions.forEach((exclusion) => {
exclusion.subjects.forEach((sbj) => {
if (sbj === subject) return exclusion.season
if (result === null && sbj === subject) {
result = exclusion.season
}
})
})
return null
return result
}

const App: React.FC = () => {
Expand All @@ -124,6 +123,26 @@ const App: React.FC = () => {
window.location.href=`${process.env.PUBLIC_URL}/migrationRequirements`
}

const menuItems: MenuItem[] = [];

menuItems.push({
text: "移行要件チェックツール",
selectedCondition: (text: string) => { return window.location.href.endsWith("/"); },
onClick: index
});

menuItems.push({
text: "履修仮組みツール",
selectedCondition: (text: string) => { return window.location.href.endsWith("/createTimetable"); },
onClick: createTable
});

menuItems.push({
text: "移行要件一覧",
selectedCondition: (text: string) => { return window.location.href.endsWith("/migrationRequirements"); },
onClick: migrationRequirements
})

return (
<>
<div className={'header-base'}>
Expand All @@ -136,19 +155,7 @@ const App: React.FC = () => {
</div>

<div className={'table-box'}>
<div className="menu menu-bar">
<div className={`menu-item ${location === "/scs-migration-checker/" && "selected"}`} onClick={index}>
移行要件チェックツール
</div>
{/*
<div className={`menu-item ${location === "/scs-migration-checker/createTimetable" && "selected"}`} onClick={createTable}>
履修仮組みツール
</div>
*/}
<div className={`menu-item ${location === "/scs-migration-checker/migrationRequirements" && "selected"}`} onClick={migrationRequirements}>
移行要件一覧
</div>
</div>
<MenuBar menuItems={menuItems} />

<BrowserRouter basename={process.env.PUBLIC_URL}>
<Routes>
Expand Down
86 changes: 86 additions & 0 deletions src/KdBUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import {KdB, kdb} from "./App";

const seasons = ["春", "秋"];
const seasonModules = ["A", "B", "C"];
const weeks = ["月", "火", "水", "木", "金"];

export const searchKdBWithModule = (module: string, time: string): Array<Array<string>> => {
const result: Array<Array<string>> = [];
Array.from(kdb.data.values())
.filter(kdbData => {
return getSeasonsArray(kdbData).includes(module) && getTimesArray(kdbData)[0].includes(time);
})
.forEach(kdbData => {
/*
if (result.filter(data => data[0] === kdbData[0]).length == 0) {
result.push(kdbData);
}
*/
result.push(kdbData);
})
return result;
}

export const getSeasonsArray = (kdbData: Array<string>): Array<string> => {
// 開講時期をパース
let season = "";
const seasonsArray: string[] = []; // 結果

// 1文字ずつ調べる
for (let i = 0; i < kdbData[1].length; i++) {
const char = kdbData[1].charAt(i); // i文字目
// 春または秋だったら
if (seasons.includes(char)) {
season = char; // 保存しておく

// A, B, Cのいずれかだったら
} else if (seasonModules.includes(char)) {
seasonsArray.push(season + char); // 結果として保存(ex.春A)
}
}

return seasonsArray;
}

export const getTimesArray = (kdbData: Array<string>): [Array<string>, boolean] => {
let week = "";
let needConsul = false;
const timesArray: string[] = []; // 結果

// 生データ,で区切られているので,で区切る
kdbData[2].split(",").forEach((split) => {
// 応談じゃなかったら
if (split !== "応談") {
// 1文字ずつ調べる
for (let i = 0; i < split.length; i++) {
const char = split.charAt(i); // i文字目
// 月~金のいずれかだったら
if (weeks.includes(char)) {
week = char; // 保存しておく

// そうでなければ数字と判断する
} else {
timesArray.push(week + char) // 結果として保存(ex.月6)
}
}

// 応談だったらその旨をメッセージに記載
} else {
needConsul = true;
}
});
return [timesArray, needConsul]
}

export const getSeasonByName = (name: string): string | null => {
const filtered = Array.from(kdb.data.values()).filter((value) => value[0] === name)
return filtered ? `${filtered[0][1]} ${filtered[0][2]}` : null
}

export const isOnline = (kdbData: Array<string>): boolean => {
return kdbData[4].includes("オンライン") || kdbData[4].includes("オンデマンド");
}

export const needSubscribe = (kdbData: Array<string>): boolean => {
return kdbData[4].includes("事前登録対象");
}
23 changes: 23 additions & 0 deletions src/MenuBar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export type MenuItem = {
text: string,
selectedCondition: (text: string) => boolean,
onClick: () => void
}

export type MenuBarProps = {
menuItems: MenuItem[]
}

const MenuBar: React.FC<MenuBarProps> = (props: MenuBarProps) => {
return (
<div className={"menu menu-bar"}>
{props.menuItems.map((menuItem, index) =>
<div key={index} className={`menu-item ${menuItem.selectedCondition(menuItem.text) && "selected"}`} onClick={menuItem.onClick}>
{menuItem.text}
</div>
)}
</div>
)
}

export default MenuBar;
69 changes: 69 additions & 0 deletions src/create/CreateTimetable.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
th {
background-color: #00c0d4;
color: white;
font-weight: normal;
border-style: none;
}

td.time, th.time {
background-color: #00c0d4;
color: white;
font-weight: normal;
border-style: none;
width: 1.0em;
}

div.section {
margin-bottom: 1.0em;
}

.section p {
margin: 0 0 0.25em;
}

.contents-box h3 {
padding: 0;
margin: 0 0 0.25em;
background: transparent;
border: none;
font-weight: normal;
font-size: 1.2em;
}

.timetable-base {
display: flex;
width: 100%;
}

.timetable-box {
width: 70%;
margin-right: 0.5em;
}

.timetable-box table {
table-layout: fixed;
}

.contents-box {
width: 30%;
margin-left: 0.5em;
}

.departments-box {
max-height: 150px;
overflow-y: scroll;
}

.departments-box label {
margin-left: 1.0em;
cursor: pointer;
}

.department-checkbox {
display: block;
cursor: pointer;
}

.selected-departments-box {
margin-left: 1.0em;
}
Loading

0 comments on commit 57f8af8

Please sign in to comment.