NCNU_Course/js/components/main.vue
snsd0805 a9e6330cce
Merge pull request #19 from vincentinttsh/fix_delete
Course Detail & use course number to delete
2021-01-24 21:48:52 +08:00

367 lines
14 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': "",
'is_print': false,
}
},
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]
})
// Collapse Navbar
var navbarCollapse = function () {
if ($("#mainNav").offset().top > 100) {
$("#mainNav").addClass("navbar-shrink");
} else {
$("#mainNav").removeClass("navbar-shrink");
}
};
// Collapse now if page is not at top
navbarCollapse();
// Collapse the navbar when page is scrolled
$(window).scroll(navbarCollapse);
},
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 })
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,
'number': course.number,
'class': course.class
})
}
},
'removeCourse': function (course) {
console.log("remove " + course.name)
for (var i = this.selectCourses.length - 1; i >= 0; i--) {
if (this.selectCourses[i].number === course.number && this.selectCourses[i].class === course.class) {
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)
}
}
},
'generatePic': function () {
var main = this
const doPrint = new Promise((resolve, reject) => {
main.is_print = true;
resolve();
});
doPrint
.then(() =>{
html2canvas(document.getElementById('course-table-div')).then(function (canvas) {
var a = document.createElement('a');
a.href = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream");
a.download = '課表.jpg';
a.click();
});
})
.then(() => {
main.is_print = false;
})
},
'share': function () {
if (this.user != "")
$('#share').modal('show');
else
this.login()
},
},
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.name}}</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 class="row">
<div class="col-4">
<div v-if="token!=''"><button class="btn btn-danger" @click="saveCourseTable()">儲存</button></div>
<div v-if="token==''"><button class="btn btn-danger" @click="saveCourseTable()">儲存(登入FB)</button></div>
</div>
<div class="col-4">
<div><button class="btn btn-success" @click="generatePic()">下載圖檔</button></div>
</div>
<div class="col-4">
<div><button class="btn btn-primary" @click="share()">分享課表</button></div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-3">
<div class="row mx-auto mb-2">
<choose-department
v-bind:departments="departments"
v-bind:selected="selectDepartment"
v-on:selectok="select"
v-on:foundedok="founded"
>
</choose-department>
</div>
<br>
<div class="row mx-auto mb-2">
<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>
</div>
<div class="col-lg-9 table-responsive " >
<course-table
id="course-table-div"
v-bind:selectCourses="selectCourses"
v-bind:select_c="selectCourses"
v-bind:is_print="is_print"
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">
<ul>
<li>已經更新為 1092 新課表(包含通識課分類)</li>
<li>使用 Facebook API 儲存課表</li>
<li>新增「下載圖檔」功能</li>
<li>新增「分享課表」功能</li>
</ul>
2021 01/23 更新
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">我知道了</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="share" 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">
請複製以下網址給你的朋友,跟他分享你的課表<br><br>
https://snsd0805.com/NCNU_Course/#/share/{{user.id}}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">我知道了</button>
</div>
</div>
</div>
</div>
</div>
</div>
`
}