Compare commits

...

59 Commits

Author SHA1 Message Date
Hykilpikonna c97a202bd5 [U] Release v0.4.6.1087 2019-11-11 22:42:42 -05:00
Hykilpikonna b11332953c [F] Fix dark theme logo displaying issue 2019-11-11 22:41:26 -05:00
Hykilpikonna d5f8649b80 [S] Adjust logo font weight 2019-11-11 22:32:01 -05:00
Hykilpikonna fab173afa3 [S] Adjust logo font size 2019-11-11 22:31:48 -05:00
Hykilpikonna 41fbf70428 [S] Create a gradient for logo 2019-11-11 22:30:41 -05:00
Hykilpikonna 1df427b4b4 [S] Add right margin to icon 2019-11-11 22:15:22 -05:00
Hykilpikonna 96a0d3bef6 [S] Remove old logo style 2019-11-11 22:15:13 -05:00
Hykilpikonna 2d917d7858 [S] Limit logo height 2019-11-11 22:15:03 -05:00
Hykilpikonna 2e851e5541 [S] Add logo in nav bar 2019-11-11 22:14:44 -05:00
Hykilpikonna b5ff93bf58 [+] Import Favicon into index.html 2019-11-11 22:09:02 -05:00
Hykilpikonna a10350756f [+] Generate 32px favicon 2019-11-11 22:08:43 -05:00
Hykilpikonna 133765131c [O] Limit logo image width 2019-11-11 21:57:18 -05:00
Hykilpikonna 723a72c1ab [+] Copy logo to assets 2019-11-11 21:53:48 -05:00
Hykilpikonna 6567aeda7d [+] Export logo as png 2019-11-11 21:53:00 -05:00
Hykilpikonna 2182ff8e74 [M] Move vue logo to icon making dir 2019-11-11 21:52:41 -05:00
Hykilpikonna 25865fb372 [+] Remake logo again 2019-11-11 21:52:21 -05:00
Hykilpikonna 81ffeb8d85 [+] Remake logo 2019-11-11 21:51:40 -05:00
Hykilpikonna 19203f3629 [+] Support email login 2019-11-10 17:14:43 -05:00
Hykilpikonna 82ad8f026b [O] Optimize field types 2019-11-10 17:14:33 -05:00
Hykilpikonna 38629a9e34 [O] Specify username format 2019-11-10 17:10:38 -05:00
Hykilpikonna 4499232544 [S] Remove card paddings 2019-11-10 16:39:33 -05:00
Hykilpikonna 960f30295c [S] Specify background color is transparent 2019-11-10 16:39:21 -05:00
Hykilpikonna 415373559c [S] Darken colors 2019-11-10 16:38:17 -05:00
Hykilpikonna a7d22e1620 [S] Add drop shadow to tooltip 2019-11-10 14:27:59 -05:00
Hykilpikonna f88ef7284f [-] Disable dark mode by default 2019-11-10 14:22:18 -05:00
Hykilpikonna 380023668f [S] Apply dark background to course page too 2019-11-10 14:21:41 -05:00
Hykilpikonna fb90900045 [S] Make graph white 2019-11-10 14:15:08 -05:00
Hykilpikonna ab511a706a [S] Compact css entries 2019-11-10 14:14:14 -05:00
Hykilpikonna 407a2889d1 [S] Use css variables 2019-11-10 14:13:38 -05:00
Hykilpikonna 840775314a [S] Fix prev-course and next-course shadow 2019-11-10 14:06:40 -05:00
Hykilpikonna 85c1d93608 [S] Apply darker background to #app-content too 2019-11-10 14:05:23 -05:00
Hykilpikonna 8825886c5c [S] Emphesize course name 2019-11-10 14:04:25 -05:00
Hykilpikonna e924c00f0d [S] Lighten expansion color 2019-11-10 14:00:32 -05:00
Hykilpikonna 03826d108d [S] Add layer effect to course card expansion 2019-11-10 13:59:38 -05:00
Hykilpikonna 1e04b4ad70 [S] Apply light text to buttons too 2019-11-10 13:59:13 -05:00
Hykilpikonna 3ac37d980c [S] Emphesize percent entry box 2019-11-10 13:54:21 -05:00
Hykilpikonna da8cec72b4 [S] Emphesize max entry box 2019-11-10 13:54:10 -05:00
Hykilpikonna 903345b86a [S] Comment overall css 2019-11-10 13:51:24 -05:00
Hykilpikonna 9ed297431d [S] Apply dark background to entry box 2019-11-10 13:50:56 -05:00
Hykilpikonna e763a1ac88 [S] Adjust backtop box shadow 2019-11-10 13:47:50 -05:00
Hykilpikonna 5b3bdc2f1f [S] Apply light text to span too 2019-11-10 13:46:10 -05:00
Hykilpikonna 65b4a68f7e [S] Remove el-card border 2019-11-10 13:44:08 -05:00
Hykilpikonna 7ff885e28b [S] Make overall background darker 2019-11-10 13:44:01 -05:00
Hykilpikonna b936f8a0ca [S] Default use light background for foreground 2019-11-10 13:40:37 -05:00
Hykilpikonna 93a01aeb5d [S] Fix padding under main frame 2019-11-10 13:35:48 -05:00
Hykilpikonna 0326c0bf14 [S] Use gray color with dark background 2019-11-10 13:34:51 -05:00
Hykilpikonna cb91a20844 [S] Apply dark background to all div 2019-11-10 13:34:39 -05:00
Hykilpikonna 9fdb7461ba [S] Create dark css 2019-11-10 13:28:47 -05:00
Hykilpikonna 15b51020fc [O] Make cards clickable 2019-11-10 13:22:26 -05:00
Hykilpikonna 2938621b73 [O] Scroll to top on page change 2019-11-10 13:22:15 -05:00
Hykilpikonna 624158f3d4 [O] Show prev-course and next-course above others 2019-11-10 13:22:02 -05:00
Hykilpikonna 602a8b9c46 [+] Add back-to-top button 2019-11-10 13:21:35 -05:00
Hykilpikonna 62338358d1 [S] Add radial color gradient to the scatter plot points 2019-11-10 13:12:22 -05:00
Hykilpikonna 9bc69a81af [+] Show label on the top 2019-11-10 13:11:51 -05:00
Hykilpikonna c93b1e4eec [+] Resize scatter plot circles according to their weight 2019-11-10 13:09:18 -05:00
Hykilpikonna d30728e2e9 [+] Add assignmentCount to AssignmentType interface 2019-11-10 13:08:22 -05:00
Hykilpikonna 7d86b7a2b9 [+] Import chroma-js instead 2019-11-10 13:02:18 -05:00
Hykilpikonna bb31e18ad5 [+] Add chroma-js dependency 2019-11-10 12:37:52 -05:00
Hykilpikonna 73dc5f6a51 [O] Optimize course-scatter with course.assignmentTypes 2019-11-10 12:05:53 -05:00
26 changed files with 243 additions and 82 deletions
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

+60 -2
View File
@@ -947,6 +947,11 @@
} }
} }
}, },
"@types/chroma-js": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-1.4.3.tgz",
"integrity": "sha512-m33zg9cRLtuaUSzlbMrr7iLIKNzrD4+M6Unt5+9mCu4BhR5NwnRjVKblINCwzcBXooukIgld8DtEncP8qpvbNg=="
},
"@types/events": { "@types/events": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz", "resolved": "https://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz",
@@ -2510,6 +2515,14 @@
"integrity": "sha1-oY8eCyacimpdPIbrKYvrFMPde/Y=", "integrity": "sha1-oY8eCyacimpdPIbrKYvrFMPde/Y=",
"dev": true "dev": true
}, },
"chroma-js": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.1.0.tgz",
"integrity": "sha512-uiRdh4ZZy+UTPSrAdp8hqEdVb1EllLtTHOt5TMaOjJUvi+O54/83Fc5K2ld1P+TJX+dw5B+8/sCgzI6eaur/lg==",
"requires": {
"cross-env": "^6.0.3"
}
},
"chrome-trace-event": { "chrome-trace-event": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz",
@@ -3113,6 +3126,52 @@
"sha.js": "^2.4.8" "sha.js": "^2.4.8"
} }
}, },
"cross-env": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz",
"integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==",
"requires": {
"cross-spawn": "^7.0.0"
},
"dependencies": {
"cross-spawn": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
"integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
"path-key": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
"integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg=="
},
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
},
"which": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
"integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
"requires": {
"isexe": "^2.0.0"
}
}
}
},
"cross-spawn": { "cross-spawn": {
"version": "6.0.5", "version": "6.0.5",
"resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcross-spawn%2Fdownload%2Fcross-spawn-6.0.5.tgz", "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcross-spawn%2Fdownload%2Fcross-spawn-6.0.5.tgz",
@@ -6266,8 +6325,7 @@
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
"dev": true
}, },
"isobject": { "isobject": {
"version": "3.0.1", "version": "3.0.1",
+2
View File
@@ -8,6 +8,8 @@
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint"
}, },
"dependencies": { "dependencies": {
"@types/chroma-js": "^1.4.3",
"chroma-js": "^2.1.0",
"core-js": "^2.6.5", "core-js": "^2.6.5",
"echarts": "^4.2.1", "echarts": "^4.2.1",
"element-ui": "^2.11.1", "element-ui": "^2.11.1",
+1 -1
View File
@@ -6,7 +6,7 @@
<!--meta name="viewport" content="width=device-width,initial-scale=1.0"--> <!--meta name="viewport" content="width=device-width,initial-scale=1.0"-->
<meta name="viewport" content="width=1024"> <meta name="viewport" content="width=1024">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>logo@32px.png">
<title>Veracross Analyzer</title> <title>Veracross Analyzer</title>
</head> </head>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 60 KiB

+54 -1
View File
@@ -5,7 +5,7 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
text-align: center; text-align: center;
color: #2c3e50; color: #2c3e50;
margin-bottom: 100px; padding-bottom: 100px;
} }
#app-content #app-content
@@ -28,6 +28,59 @@
--font: 'Avenir', Helvetica, Arial, sans-serif; --font: 'Avenir', Helvetica, Arial, sans-serif;
} }
.dark
{
--dark-layer-1: #383838;
--dark-layer-2: #525252;
--dark-layer-3: #6c6c6c;
--dark-foreground: #e9e9e9;
background: var(--dark-layer-1) !important;
div, ul
{
background: var(--dark-layer-2) !important;
color: var(--dark-foreground) !important;
}
span, button
{
color: var(--dark-foreground) !important;
}
.el-card
{
border: none !important;
}
// Overall
#overall, #overall-course, .overall-span, #app-content
{
background: var(--dark-layer-1) !important;
}
// Course card
.entry-box, .none .unread-number {background: #a1a1a1 !important}
.entry-box.max {background-color: #949494 !important}
.entry-box.percent {background-color: #a7a490 !important}
.course-name {color: #cffff6 !important}
.course-card-content.expand, .assignment-entry, .unread-row,
.unread-row .el-col, #assignment-type-head, .course-page-graph.el-col
{
background-color: var(--dark-layer-3) !important;
}
.overall-span.el-col, .course-page-graph.el-col
{
div, span
{
background: #f9f9f9 !important;
color: var(--dark-layer-1) !important;
}
}
}
// ############## // ##############
// # Global CSS # // # Global CSS #
// ############## // ##############
+7
View File
@@ -5,6 +5,13 @@
} }
// Logo image
#login-logo-image
{
width: 80%;
margin-bottom: -15px;
}
// Parent overlay // Parent overlay
.login-overlay .login-overlay
{ {
+6 -3
View File
@@ -11,11 +11,11 @@ import VersionUtils from '@/logic/utils/version-utils';
}) })
export default class Login extends Vue export default class Login extends Vue
{ {
public username: any = ''; public username: string = '';
public password: any = ''; public password: string = '';
public loading: boolean = false; public loading: boolean = false;
public error: String = ''; public error: string = '';
/** /**
* This is called when the instance is created. * This is called when the instance is created.
@@ -68,6 +68,9 @@ export default class Login extends Vue
// Make login button loading // Make login button loading
this.loading = true; this.loading = true;
// Format it
this.username = this.username.toLowerCase().replace(/ /g, '').replace(/@.*/g, '');
// Fetch request // Fetch request
App.http.post('/login', {username: this.username, password: this.password}) App.http.post('/login', {username: this.username, password: this.password})
.then(response => .then(response =>
+3 -3
View File
@@ -2,18 +2,18 @@
<div id="login" class="login-overlay"> <div id="login" class="login-overlay">
<div class="login-vertical-center"> <div class="login-vertical-center">
<div class="login-panel"> <div class="login-panel">
<img alt="Vue logo" src="../../assets/logo.png"> <img id="login-logo-image" alt="logo" src="../../assets/logo.png">
<h1>Veracross Analyzer</h1> <h1>Veracross Analyzer</h1>
<form id="login-form"> <form id="login-form">
<el-input v-model="username" <el-input v-model="username"
placeholder="School Username" placeholder="SJP Username (Eg. flast21)"
:class="{'input-error': error !== ''}" :class="{'input-error': error !== ''}"
@keyup.enter.native="onEnter"> @keyup.enter.native="onEnter">
</el-input> </el-input>
<el-input v-model="password" <el-input v-model="password"
placeholder="Veracross Password" placeholder="SJP Password"
show-password="" show-password=""
:class="{'input-error': error !== ''}" :class="{'input-error': error !== ''}"
@keyup.enter.native="onEnter"> @keyup.enter.native="onEnter">
+33 -12
View File
@@ -48,24 +48,41 @@
height: 60px; height: 60px;
// Center text // Center text
display: inline-flex;
align-items: center; align-items: center;
// Margins // Margins
margin-left: 20px; margin-left: 20px;
margin-right: 8px; margin-right: 8px;
// Font
font: bold 16px arial;
display: inline-flex;
// Shadow effect
-webkit-background-clip: text;
background-color: #b1b1b1;
color: transparent;
text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.85);
// Make it non-clickable // Make it non-clickable
pointer-events: none; pointer-events: none;
#nav-logo
{
height: 70%;
margin-right: 10px;
}
#nav-logo-text
{
// Color
color: #6bbeff !important;
background: linear-gradient(90deg,
rgba(90,177,239,1) 0%,
rgba(25,212,174,1) 100%) !important;
// Font
font-weight: 500;
font-size: 18px;
}
#nav-logo-text.logo-text
{
// Override the background
-webkit-text-fill-color: transparent !important;
-webkit-background-clip: text !important;
}
} }
#next-course #next-course
@@ -76,7 +93,7 @@
bottom: 0; bottom: 0;
left: 25%; left: 25%;
padding-top: 2px; padding-top: 2px;
box-shadow: 0 -2px 9px 0 #ecebeb; box-shadow: 0 -2px 9px 0 #00000029;
} }
footer footer
@@ -85,6 +102,8 @@ footer
left: 0; left: 0;
bottom: 0; bottom: 0;
width: 100%; width: 100%;
z-index: 1000;
} }
#prev-course #prev-course
@@ -95,7 +114,9 @@ footer
top: 61px; top: 61px;
left: 25%; left: 25%;
padding-bottom: 2px; padding-bottom: 2px;
box-shadow: 0 2px 9px 0 #ecebeb; box-shadow: 0 2px 9px 0 #00000029;
z-index: 1001;
} }
.nav-course-operations .nav-course-operations
+3
View File
@@ -106,6 +106,9 @@ export default class Navigation extends Vue
// Update title // Update title
document.title = 'Veracross Analyzer - ' + this.getTitle(newIndex); document.title = 'Veracross Analyzer - ' + this.getTitle(newIndex);
// Scroll to top
window.scrollTo(0, 0);
} }
/** /**
+5 -1
View File
@@ -4,7 +4,8 @@
:default-active="activeIndex" @select="onSelect"> :default-active="activeIndex" @select="onSelect">
<div id="nav-title"> <div id="nav-title">
Veracross Analyzer <img id="nav-logo" alt="logo" src="../../assets/logo.png">
<span id="nav-logo-text" class="logo-text">Veracross Analyzer</span>
</div> </div>
<el-menu-item index="overall">Overall</el-menu-item> <el-menu-item index="overall">Overall</el-menu-item>
@@ -44,6 +45,9 @@
NEXT COURSE NEXT COURSE
</div> </div>
</footer> </footer>
<!-- Back to top -->
<el-backtop style="box-shadow: rgba(0, 0, 0, 0.23) 0 3px 11px 0;"></el-backtop>
</div> </div>
</template> </template>
+1 -1
View File
@@ -7,7 +7,7 @@ export default class Constants
public static API_URL: string = 'https://va.hydev.org/api'; public static API_URL: string = 'https://va.hydev.org/api';
/** Current version */ /** Current version */
public static VERSION: string = '0.4.3.1006'; public static VERSION: string = '0.4.6.1087';
/** Minimum version that still supports the same cookies */ /** Minimum version that still supports the same cookies */
public static MIN_SUPPORTED_VERSION: string = '0.3.4.561'; public static MIN_SUPPORTED_VERSION: string = '0.3.4.561';
+3 -1
View File
@@ -36,6 +36,7 @@ export interface AssignmentType
scoreMax: number scoreMax: number
score: number score: number
percent: number percent: number
assignmentCount: number
} }
export default class Course export default class Course
@@ -257,7 +258,8 @@ export default class Course
// Return // Return
return {name: type, id: typeAssignments[0].typeId, weight: +(weight * 100).toFixed(2), return {name: type, id: typeAssignments[0].typeId, weight: +(weight * 100).toFixed(2),
scoreMax: scoreMax, score: score, percent: +(score / scoreMax * 100).toFixed(2)} scoreMax: scoreMax, score: score, percent: +(score / scoreMax * 100).toFixed(2),
assignmentCount: typeAssignments.length}
}) })
} }
+9
View File
@@ -15,6 +15,7 @@ export default class GraphUtils
return { return {
// Color // Color
color: Constants.THEME.colors, color: Constants.THEME.colors,
backgroundColor: 'transparent',
// Title // Title
title: title:
@@ -87,4 +88,12 @@ export default class GraphUtils
padding: [3, 5] padding: [3, 5]
} }
} }
/**
* CSS shadow string (extraCssText) for tooltip
*/
static tooltipCssShadow()
{
return {extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);'}
}
} }
+3 -7
View File
@@ -4,25 +4,21 @@
<div class="course-card-content expand"> <div class="course-card-content expand">
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24" class="course-page-graph">
<el-card class="large overall-line-card vertical-center"> <el-card class="large overall-line-card vertical-center">
<course-scatter :course="course"></course-scatter> <course-scatter :course="course"></course-scatter>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="0">
</el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12" class="course-page-graph">
<el-card class="large overall-line-card vertical-center type-graph" <el-card class="large overall-line-card vertical-center type-graph"
body-style="padding: 0"> body-style="padding: 0">
<TypeRadar :course="course"></TypeRadar> <TypeRadar :course="course"></TypeRadar>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12" class="course-page-graph">
<el-card class="large overall-line-card vertical-center type-graph" <el-card class="large overall-line-card vertical-center type-graph"
body-style="padding: 0"> body-style="padding: 0">
<TypePie :course="course"></TypePie> <TypePie :course="course"></TypePie>
@@ -4,6 +4,7 @@ import {FormatUtils} from '@/logic/utils/format-utils';
import moment from 'moment'; import moment from 'moment';
import Course, {Assignment} from '@/logic/course'; import Course, {Assignment} from '@/logic/course';
import GraphUtils from '@/logic/utils/graph-utils'; import GraphUtils from '@/logic/utils/graph-utils';
import chroma from 'chroma-js';
@Component({ @Component({
}) })
@@ -61,6 +62,8 @@ export default class CourseScatter extends Vue
// Tooltip // Tooltip
tooltip: tooltip:
{ {
...GraphUtils.tooltipCssShadow(),
trigger: 'axis', trigger: 'axis',
axisPointer: axisPointer:
{ {
@@ -68,7 +71,7 @@ export default class CourseScatter extends Vue
}, },
formatter: (ps: any[]) => moment(ps[0].data[0]).format('MMM DD, YYYY') + '<br>' + ps.map(p => formatter: (ps: any[]) => moment(ps[0].data[0]).format('MMM DD, YYYY') + '<br>' + ps.map(p =>
`${GraphUtils.DOT.replace('{color}', p.color)} `${GraphUtils.DOT.replace('{color}', p.color)}
${FormatUtils.limit(p.data[2], 22)}: ${p.data[1]}%<br>`).join('') ${FormatUtils.limit(p.data[2].description, 22)}: ${p.data[1]}%<br>`).join('')
}, },
// Legend // Legend
@@ -95,28 +98,47 @@ export default class CourseScatter extends Vue
*/ */
private series() private series()
{ {
// Scatter data point style
let itemStyle =
{
normal:
{
opacity: 0.8,
shadowBlur: 10,
shadowOffsetX: 0,
shadowOffsetY: 0,
shadowColor: 'rgba(0, 0, 0, 0.2)'
}
};
// Create scatter plots // Create scatter plots
let map = this.mapAssignments(); let series: any[] = this.course.assignmentTypes.map((type, i) =>
let series: any[] = Array.from(map, ([type, assignments]) =>
{ {
return { return {
type: 'scatter', type: 'scatter',
name: type, name: type.name,
data: CourseScatter.assignmentsData(assignments), data: CourseScatter.assignmentsData(this.course.assignments.filter(a => a.typeId == type.id)),
itemStyle: itemStyle symbolSize: (data: any) => Math.max(Math.sqrt(type.weight * data[2].scoreMax / type.scoreMax) * 12, 12),
label:
{
emphasis:
{
show: true,
formatter: (p: any) => p.data[2].description,
position: 'top'
}
},
itemStyle:
{
normal:
{
opacity: 0.7,
shadowBlur: 10,
shadowOffsetX: 0,
shadowOffsetY: 0,
shadowColor: 'rgba(0, 0, 0, 0.2)',
color:
{
type: 'radial',
x: 0.4,
y: 0.3,
colorStops:
[
{offset: 0, color: chroma(Constants.THEME.colors[i]).set('hsl.l', 0.9).css()},
{offset: 1, color: Constants.THEME.colors[i]}
]
}
}
}
} }
}); });
@@ -131,27 +153,6 @@ export default class CourseScatter extends Vue
return series; return series;
} }
/**
* Map assignments to {assignmentType, [assignment]} format.
*/
private mapAssignments(): Map<string, Assignment[]>
{
// Define map
let map = new Map();
// Move data to map
this.course.assignments.forEach(a =>
{
// Null case, create empty array
if (!map.has(a.type)) map.set(a.type, []);
// Put data
map.get(a.type).push(a);
});
return map;
}
/** /**
* Convert assignments to series data * Convert assignments to series data
* *
@@ -160,6 +161,6 @@ export default class CourseScatter extends Vue
private static assignmentsData(assignments: Assignment[]) private static assignmentsData(assignments: Assignment[])
{ {
return assignments.filter(a => a.complete == 'Complete') return assignments.filter(a => a.complete == 'Complete')
.map(a => [a.time, (a.score / a.scoreMax * 100).toFixed(2), a.description]); .map(a => [a.time, (a.score / a.scoreMax * 100).toFixed(2), a]);
} }
} }
+1 -1
View File
@@ -31,7 +31,7 @@ export default class TypePie extends Vue
...GraphUtils.getBaseSettings('Assignment Type Weight', ...GraphUtils.getBaseSettings('Assignment Type Weight',
'How much each type of assignment affect your average'), 'How much each type of assignment affect your average'),
tooltip: {}, tooltip: GraphUtils.tooltipCssShadow(),
// Data // Data
series: series:
+1 -1
View File
@@ -66,7 +66,7 @@ export default class TypeRadar extends Vue
center: ['50%', '55%'] center: ['50%', '55%']
}, },
tooltip: {}, tooltip: GraphUtils.tooltipCssShadow(),
// Data // Data
series: series:
@@ -1,5 +1,5 @@
<template> <template>
<div id="course-head" class="course-card-content main vertical-center"> <div id="course-head" class="course-card-content main vertical-center" @click="redirect">
<el-row> <el-row>
<el-col :span="12" class="course-col-name"> <el-col :span="12" class="course-col-name">
<div v-if="clickable" class="course-name clickable" @click="redirect">{{course.name}}</div> <div v-if="clickable" class="course-name clickable" @click="redirect">{{course.name}}</div>
@@ -44,6 +44,8 @@ export default class OverallLine extends Vue
// Tooltip // Tooltip
tooltip: tooltip:
{ {
... GraphUtils.tooltipCssShadow(),
trigger: 'axis' trigger: 'axis'
}, },
+6 -6
View File
@@ -1,8 +1,8 @@
<template> <template>
<div id="overall"> <div id="overall">
<el-row v-if="getGPA().gpa !== -1"> <el-row v-if="getGPA().gpa !== -1">
<el-col :span="4"> <el-col :span="4" class="overall-span">
<el-card class="large gpa-card vertical-center"> <el-card class="large gpa-card vertical-center" body-style="padding: 0">
<div style="padding: 14px;"> <div style="padding: 14px;">
<span class="gpa header">GPA:</span> <span class="gpa header">GPA:</span>
<span class="gpa text">{{getGPA().gpa}}</span> <span class="gpa text">{{getGPA().gpa}}</span>
@@ -13,13 +13,13 @@
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14" class="overall-span">
<el-card class="large overall-line-card vertical-center"> <el-card class="large overall-line-card vertical-center" body-style="padding: 0 10px">
<overall-line :courses="courses"></overall-line> <overall-line :courses="courses"></overall-line>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" class="overall-span">
<el-card class="large overall-bar-card vertical-center"> <el-card class="large overall-bar-card vertical-center" body-style="padding: 0 10px">
<overall-bar :courses="courses"></overall-bar> <overall-bar :courses="courses"></overall-bar>
</el-card> </el-card>
</el-col> </el-col>