Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fa3fc44526 | |||
| 352fd58fb5 | |||
| f043d77e5e | |||
| 9e88f3efe1 | |||
| cadd328958 | |||
| 8c4759d497 | |||
| ac8f488ab4 | |||
| df639a360c | |||
| 24328508c0 | |||
| ebd4849703 | |||
| 80d72bb5c0 | |||
| 204e7dc04a | |||
| cef0b31dba | |||
| 22ba3acab0 | |||
| 88bdcd8cf8 | |||
| 8559a93b9c | |||
| f8db85dca3 | |||
| b4bd24d884 | |||
| f6d30a750a | |||
| 988d6f5463 | |||
| 608132ad6c | |||
| 6cffb745a7 | |||
| 82212cf10c | |||
| 08b665a1fa | |||
| 500e13ef9d | |||
| b95220ba1a |
@@ -55,7 +55,7 @@ export default class App extends Vue
|
|||||||
public courses: Course[] = [];
|
public courses: Course[] = [];
|
||||||
|
|
||||||
// Currently selected tab
|
// Currently selected tab
|
||||||
public selectedTab: string = "overall";
|
public selectedTab: string = 'overall';
|
||||||
|
|
||||||
// Are the course assignments loaded from the server.
|
// Are the course assignments loaded from the server.
|
||||||
public assignmentsReady: boolean = false;
|
public assignmentsReady: boolean = false;
|
||||||
@@ -185,4 +185,16 @@ export default class App extends Vue
|
|||||||
// Update selected tab
|
// Update selected tab
|
||||||
this.selectedTab = tab;
|
this.selectedTab = tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign out
|
||||||
|
*/
|
||||||
|
public signOut()
|
||||||
|
{
|
||||||
|
// Clear all cookies
|
||||||
|
this.$cookies.keys().forEach(key => this.$cookies.remove(key));
|
||||||
|
|
||||||
|
// Refresh
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<login v-if="showLogin" v-on:login:token="onLogin" :http="http"></login>
|
<login v-if="showLogin" v-on:login:token="onLogin" :http="http"></login>
|
||||||
<navigation :courses="courses" v-on:navigation:select="onNavigate"></navigation>
|
<navigation :courses="courses"
|
||||||
|
v-on:sign-out="signOut()"
|
||||||
|
v-on:navigation:select="onNavigate">
|
||||||
|
</navigation>
|
||||||
|
|
||||||
<div id="app-content">
|
<div id="app-content">
|
||||||
<overall :courses="courses" v-if="selectedTab === 'overall' && assignmentsReady"></overall>
|
<overall :courses="courses" v-if="selectedTab === 'overall' && assignmentsReady"></overall>
|
||||||
|
|||||||
@@ -27,4 +27,13 @@ export default class Navigation extends Vue
|
|||||||
// Call custom event
|
// Call custom event
|
||||||
this.$emit('navigation:select', this.activeIndex);
|
this.$emit('navigation:select', this.activeIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is called when the sign out button is clicked.
|
||||||
|
*/
|
||||||
|
public signOut()
|
||||||
|
{
|
||||||
|
// Call custom event
|
||||||
|
this.$emit('sign-out');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
:key="course.name">{{course.name}}</el-menu-item>
|
:key="course.name">{{course.name}}</el-menu-item>
|
||||||
</el-submenu>
|
</el-submenu>
|
||||||
|
|
||||||
|
<el-button @click="signOut" id="sign-out-button" type="text">Sign Out</el-button>
|
||||||
</el-menu>
|
</el-menu>
|
||||||
<div class="line"></div>
|
<div class="line"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+1
-1
@@ -14,5 +14,5 @@ export default class Constants
|
|||||||
'| |. , |---|,---.,---.| , .,---,,---.,---.\n' +
|
'| |. , |---|,---.,---.| , .,---,,---.,---.\n' +
|
||||||
' \\ / >< | || |,---|| | | .-\' |---\'| \n' +
|
' \\ / >< | || |,---|| | | .-\' |---\'| \n' +
|
||||||
' `\' \' ` ` \'` \'`---^`---\'`---|\'---\'`---\'` \n' +
|
' `\' \' ` ` \'` \'`---^`---\'`---|\'---\'`---\'` \n' +
|
||||||
' v1.1.0 `---\' '
|
' v0.1.1.0 `---\' '
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,15 @@ export default class GraphOverall extends Vue
|
|||||||
{
|
{
|
||||||
@Prop({required: true}) chart: any;
|
@Prop({required: true}) chart: any;
|
||||||
|
|
||||||
public chartData =
|
private settings =
|
||||||
{
|
{
|
||||||
columns: ['日期', '访问用户', '下单用户', '下单率'],
|
series:
|
||||||
rows: [
|
{
|
||||||
{ '日期': '1/1', '访问用户': 1393, '下单用户': 1093, '下单率': 0.32 },
|
smooth: false
|
||||||
{ '日期': '1/2', '访问用户': 3530, '下单用户': 3230, '下单率': 0.26 },
|
},
|
||||||
{ '日期': '1/3', '访问用户': 2923, '下单用户': 2623, '下单率': 0.76 },
|
yAxis:
|
||||||
{ '日期': '1/4', '访问用户': 1723, '下单用户': 1423, '下单率': 0.49 },
|
{
|
||||||
{ '日期': '1/5', '访问用户': 3792, '下单用户': 3492, '下单率': 0.323 },
|
min: 70
|
||||||
{ '日期': '1/6', '访问用户': 4593, '下单用户': 4293, '下单率': 0.78 }
|
}
|
||||||
]
|
}
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="graph-overall">
|
<div id="graph-overall">
|
||||||
<ve-line :data="chart" :extend="{series: {smooth: false}}"></ve-line>
|
<p>Your average score graph all time:</p>
|
||||||
|
<ve-line :data="chart" :extend="settings"></ve-line>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -8,30 +8,28 @@ import {GPAUtils} from '@/utils/gpa-utils';
|
|||||||
})
|
})
|
||||||
export default class Overall extends Vue
|
export default class Overall extends Vue
|
||||||
{
|
{
|
||||||
@Prop({required: true}) courses: any;
|
// @ts-ignore
|
||||||
|
@Prop({required: true}) courses: Course[];
|
||||||
|
|
||||||
get convertCharts()
|
get convertCharts()
|
||||||
{
|
{
|
||||||
// Null case
|
// Null case
|
||||||
if (this.courses == null) return [];
|
if (this.courses == null) return [];
|
||||||
|
|
||||||
|
// Filter it
|
||||||
|
let courses: Course[] = this.filterCourses();
|
||||||
|
|
||||||
// Compute the column names
|
// Compute the column names
|
||||||
let columns = ['date'];
|
let columns = ['date'];
|
||||||
this.courses.forEach((course: Course) =>
|
courses.forEach(course =>
|
||||||
{
|
{
|
||||||
// Ignore non-important courses
|
|
||||||
if (course.status != 'active') return;
|
|
||||||
|
|
||||||
columns.push(course.name);
|
columns.push(course.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Find the min date
|
// Find the min date
|
||||||
let minDate: Date = new Date();
|
let minDate: Date = new Date();
|
||||||
this.courses.forEach((course: Course) =>
|
courses.forEach(course =>
|
||||||
{
|
{
|
||||||
// Ignore non-important courses
|
|
||||||
if (course.status != 'active') return;
|
|
||||||
|
|
||||||
if (course.assignments.length == 0) return;
|
if (course.assignments.length == 0) return;
|
||||||
let date = new Date(course.assignments[course.assignments.length - 1].date);
|
let date = new Date(course.assignments[course.assignments.length - 1].date);
|
||||||
if (date < minDate) minDate = date;
|
if (date < minDate) minDate = date;
|
||||||
@@ -49,11 +47,8 @@ export default class Overall extends Vue
|
|||||||
let courseScores: {[index: string]: any} = {};
|
let courseScores: {[index: string]: any} = {};
|
||||||
let courseMaxScores: {[index: string]: any} = {};
|
let courseMaxScores: {[index: string]: any} = {};
|
||||||
let courseIndexes: {[index: string]: any} = {};
|
let courseIndexes: {[index: string]: any} = {};
|
||||||
this.courses.forEach((course: Course) =>
|
courses.forEach(course =>
|
||||||
{
|
{
|
||||||
// Ignore non-important courses
|
|
||||||
if (course.status != 'active') return;
|
|
||||||
|
|
||||||
courseScores[course.name] = 0;
|
courseScores[course.name] = 0;
|
||||||
courseMaxScores[course.name] = 0;
|
courseMaxScores[course.name] = 0;
|
||||||
courseIndexes[course.name] = course.assignments.length - 1;
|
courseIndexes[course.name] = course.assignments.length - 1;
|
||||||
@@ -67,18 +62,18 @@ export default class Overall extends Vue
|
|||||||
let row: {[index: string]:any} = {'date': date.toLocaleDateString('en-US')};
|
let row: {[index: string]:any} = {'date': date.toLocaleDateString('en-US')};
|
||||||
|
|
||||||
// Loop through courses
|
// Loop through courses
|
||||||
this.courses.forEach((course: Course) =>
|
courses.forEach(course =>
|
||||||
{
|
{
|
||||||
// Ignore non-important courses
|
|
||||||
if (course.status != 'active') return;
|
|
||||||
|
|
||||||
// Reversed loop through the assignments
|
// Reversed loop through the assignments
|
||||||
for (let r = courseIndexes[course.name]; r >= 0; r--)
|
for (let r = courseIndexes[course.name]; r >= 0; r--)
|
||||||
{
|
{
|
||||||
let assignment = course.assignments[r];
|
let assignment = course.assignments[r];
|
||||||
let assignmentDate = new Date(assignment.date);
|
|
||||||
|
// If assignment should be displayed
|
||||||
|
if (assignment.complete != 'Complete') continue;
|
||||||
|
|
||||||
// Date is being looked at
|
// Date is being looked at
|
||||||
|
let assignmentDate = new Date(assignment.date);
|
||||||
if (assignmentDate.getTime() == date.getTime())
|
if (assignmentDate.getTime() == date.getTime())
|
||||||
{
|
{
|
||||||
// Record scores
|
// Record scores
|
||||||
@@ -110,6 +105,36 @@ export default class Overall extends Vue
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a list of courses that are graphed
|
||||||
|
*/
|
||||||
|
private filterCourses(): Course[]
|
||||||
|
{
|
||||||
|
// Define result
|
||||||
|
let result: Course[] = [];
|
||||||
|
|
||||||
|
// Filter through courses
|
||||||
|
this.courses.forEach(course =>
|
||||||
|
{
|
||||||
|
// Skip future or past courses
|
||||||
|
if (course.status != 'active') return;
|
||||||
|
|
||||||
|
// Skip courses without levels
|
||||||
|
if (course.level == 'None') return;
|
||||||
|
|
||||||
|
// Skip courses without assignments
|
||||||
|
if (course.assignments.length == 0) return;
|
||||||
|
|
||||||
|
// Add it to the list
|
||||||
|
result.push(course);
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is called to get gpa as a string.
|
||||||
|
*/
|
||||||
public getGPA()
|
public getGPA()
|
||||||
{
|
{
|
||||||
let gpa = GPAUtils.getGPA(this.courses);
|
let gpa = GPAUtils.getGPA(this.courses);
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="20">
|
<el-col :span="20">
|
||||||
<el-card style="margin-right: 20px">
|
<el-card style="margin-right: 20px">
|
||||||
<p>Your average score graph all time:</p>
|
|
||||||
<graph-overall :chart="convertCharts"></graph-overall>
|
<graph-overall :chart="convertCharts"></graph-overall>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export class GPAUtils
|
|||||||
// Remove all courses that does not have a grade
|
// Remove all courses that does not have a grade
|
||||||
coursesOriginal.forEach(course =>
|
coursesOriginal.forEach(course =>
|
||||||
{
|
{
|
||||||
if (course.numericGrade == null)
|
if (course.numericGrade == null || course.numericGrade == 0)
|
||||||
{
|
{
|
||||||
accurate = false;
|
accurate = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default class JsonUtils
|
|||||||
type: assignment.assignment_type,
|
type: assignment.assignment_type,
|
||||||
description: assignment.assignment_description,
|
description: assignment.assignment_description,
|
||||||
date: assignment._date,
|
date: assignment._date,
|
||||||
complete: assignment.complete_status,
|
complete: assignment.completion_status,
|
||||||
include: assignment.include_in_calculated_grade == 1,
|
include: assignment.include_in_calculated_grade == 1,
|
||||||
display: assignment.display_grade == 1,
|
display: assignment.display_grade == 1,
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user