NCNU_Course/js/components/main.vue

290 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var mainWindow = {
data: function(){
return {
'courses': [],
'selectCourses': [],
'departments': [],
'selectDepartment': '',
'foundName': "",
"user": "",
'token': ""
}
},
created() {
var main = this
window.fbAsyncInit = function() {
FB.init({
appId : '',
cookie : true,
xfbml : true,
version : 'v9.0'
});
FB.AppEvents.logPageView();
main.getCourseTable()
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
},
mounted() {
var main = this
axios
.get("./output.json")
.then(response => (main.courses = response.data))
.then(function(){
for(var course of main.courses){
// console.log(course.name)
if(main.departments.indexOf(course.department)==-1){
main.departments.push(course.department)
}
}
})
.then(function(){
main.departments.sort()
main.selectDepartment = main.departments[15]
})
},
methods: {
'login': function(){
var main = this
FB.login(function(){
main.getCourseTable()
})
},
'logout': function(){
var main = this
FB.logout(function(response) {
main.user = ""
main.token = ""
});
},
'getCourseTable': function(){
var main = this
FB.getLoginStatus(function(response) {
main.statusChangeCallback(response);
});
},
'statusChangeCallback': function(response){
if(response.status == "connected"){
this.token = response.authResponse.accessToken
var main = this
FB.api('/me', function(response){main.user = response.name})
fetch('https://api.snsd0805.com/courseTable?token='+this.token)
.then(function(response){
return response.json()
}).then(function(jsonData){
console.log(jsonData)
main.selectCourses = JSON.parse(jsonData['data'])
})
.catch(function(err){
alert("錯誤: "+err)
})
}
},
'saveCourseTable': function(){
var main = this
if(this.token!=""){
fetch('https://api.snsd0805.com/courseTable',{
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
'token': main.token,
'data': main.selectCourses
})
})
.then(function(response){
return response.json()
})
.then(function(response){
if(response.status=="saved"){
alert("已儲存")
}else{
alert("錯誤")
}
})
.catch(function(err){
alert("錯誤: "+err)
})
}else{
this.login()
}
},
'getTime': function(timeString){
ans = []
number = ""
for(var i of timeString){
if(i>="0" && i<="9"){
number = i
}else if(i>="a" && i<="z"){
ans.push(number+i)
}
else{
ans.push(timeString)
break
}
}
return ans
},
'select': function(department){
this.selectDepartment = department
},
'founded': function(courseName){
this.foundName = courseName
},
'addCourse': function(course){
var time = this.getTime(course.time)
for(var t of time){
this.selectCourses.push({
'time': t,
'name': course.name,
'temp': false
})
}
},
'removeCourse': function(course){
console.log("remove "+course)
for(var i=this.selectCourses.length-1;i>=0;i--){
if(this.selectCourses[i].name == course){
this.selectCourses.splice(i, 1)
}
}
},
'saveTemp': function(course){
if(course==null){
}else{
this.tempCourse = []
var time = this.getTime(course.time)
for(var t of time){
this.selectCourses.push({
'time': t,
'name': course.name,
'temp': true
})
}
}
},
'deleteTemp': function(course){
for(var i=this.selectCourses.length-1;i>=0;i--){
if(this.selectCourses[i].name == course.name && this.selectCourses[i].temp == true){
this.selectCourses.splice(i, 1)
}
}
},
},
components: {
'course-table': courseTable,
'choose-department': chooseDepartment,
'course-anslist': coursesList
},
template: `
<div>
<!-- Navigation-->
<nav class="navbar navbar-expand-lg bg-secondary text-uppercase fixed-top" id="mainNav">
<div class="container">
<a class="navbar-brand js-scroll-trigger" href="#page-top">暨大排課表</a>
<button class="navbar-toggler navbar-toggler-right text-uppercase font-weight-bold bg-primary text-white rounded" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
Menu
<i class="fas fa-bars"></i>
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto">
<li class="nav-item mx-0 mx-lg-1"><a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="https://github.com/snsd0805/NCNU_Course">Github</a></li>
<li v-if="token==''" class="nav-item mx-0 mx-lg-1"><a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href='#' v-on:click="login()">Facebook登入</a></li>
<li v-if="token!=''" class="nav-item mx-0 mx-lg-1"><a class="nav-link py-3 px-0 px-lg-3 rounded js-scroll-trigger" href="#" v-on:click="logout()">登出Facebook—{{user}}</a></li>
</ul>
</div>
</div>
</nav>
<br><br>
<section class="page-section portfolio" id="portfolio">
<div class="container" id='table'>
<!-- Portfolio Section Heading-->
<h2 class="page-section-heading text-center text-uppercase text-secondary mb-0">課表</h2>
<!-- Icon Divider-->
<div class="divider-custom">
<div class="divider-custom-line"></div>
<div class="divider-custom-icon"><i class="fas fa-star"></i></div>
<div class="divider-custom-line"></div>
</div>
<div class="divider-custom">
<div v-if="token!=''"><button class="btn btn-info" @click="saveCourseTable()">儲存</button></div>
<div v-if="token==''"><button class="btn btn-info" @click="saveCourseTable()">儲存(必須登入Facebook帳號)</button></div>
</div>
<div class="row">
<div class="col-lg-3">
<div class="row">
<choose-department
v-bind:departments="departments"
v-bind:selected="selectDepartment"
v-on:selectok="select"
v-on:foundedok="founded"
>
</choose-department><br>
</div><br><br>
<div class="row">
<course-anslist
v-bind:courses="courses"
v-bind:selected_d="selectDepartment"
v-bind:selected_c="selectCourses"
v-bind:find_name="foundName"
v-on:add-course="addCourse"
v-on:show-temp="saveTemp"
v-on:delete-temp="deleteTemp"
>
</course-anslist>
</div><br><br>
</div>
<div class="col-lg-9 table-responsive " >
<course-table
v-bind:selectCourses="selectCourses"
v-bind:select_c="selectCourses"
v-bind:is_shared="false"
v-on:remove-course="removeCourse"
></course-table>
</div>
</div>
<!-- Portfolio Grid Items-->
</div>
</section>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">資訊公告</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
已經更新為 1092 新課表<br>
但因學校未更新通識課資料,因此還沒有「通識課程分類」<br><br>
2021 01/14 更新
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">我知道了</button>
</div>
</div>
</div>
</div>
</div>
</div>
`
}