-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
122 lines (108 loc) · 3.81 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
(() => {
const UNGRADED = -1;
const GRADES = {
'A+': 4,
A: 3.7,
'B+': 3.3,
B: 3,
'C+': 2.7,
C: 2.4,
'D+': 2.2,
D: 2,
F: 0,
None: UNGRADED
};
const LOCAL_STORAGE_HTML = 'html';
const CREDIT_HOURS = [0, 1, 2, 3];
// Pre-populate from localStorage
const htmlArea = document.getElementById('html-area');
htmlArea.innerHTML = localStorage.getItem(LOCAL_STORAGE_HTML) || '';
const calculateAndDisplayGPA = (courses) => {
// Calculate GPA
const gradedCourses = courses.filter((course) => course.selectGrade.value != UNGRADED);
const points = gradedCourses.reduce(
(prev, course) => prev + parseFloat(course.selectGrade.value) * parseFloat(course.selectHours.value),
0
);
const hours = gradedCourses.reduce((prev, course) => prev + parseFloat(course.selectHours.value), 0);
const gpa = points / hours;
console.log({ points, hours, gpa });
// Display GPA
const gpaParagraph = document.getElementById('gpa');
gpaParagraph.innerHTML = `GPA: ${gpa.toFixed(2)}`;
};
document.getElementById('show-courses').addEventListener('click', () => {
// Get HTML rows
const dummy = document.createElement('div');
const html = htmlArea.value;
dummy.innerHTML = html;
const tableRows = dummy.querySelectorAll('table.table.table-striped.col-md-12 tr');
if (tableRows.length === 0) {
alert('Invalid html');
return;
}
// Create courses array from html rows
const courses = [];
for (const row of tableRows) {
// Create select
const data = row.getElementsByTagName('td');
if (data.length === 0) continue;
const grade = data[6].querySelector('p').innerHTML;
const selectGrade = document.createElement('select');
// Create select options
let graded = false;
for (const gradeLetter in GRADES) {
const option = document.createElement('option');
option.innerHTML = gradeLetter;
option.value = GRADES[gradeLetter];
if (gradeLetter === grade || (gradeLetter === 'None' && !graded)) {
console.log({ grade });
option.selected = true;
graded = true;
}
selectGrade.append(option);
}
// Create select for credit hours
const hours = parseInt(data[3].querySelector('p').innerHTML);
const selectHours = document.createElement('select');
CREDIT_HOURS.forEach(hour => {
const option = document.createElement('option');
option.innerHTML = hour;
option.value = hour;
if (hour === hours) {
option.selected = true;
}
selectHours.append(option);
});
// Make GPA update on changing select value
selectGrade.addEventListener('change', () => calculateAndDisplayGPA(courses));
selectHours.addEventListener('change', () => calculateAndDisplayGPA(courses));
courses.push({
name: data[1].innerHTML,
selectGrade,
selectHours
});
}
if (courses.length === 0) {
alert("You don't have courses");
return;
}
// Set the HTML for the courses using the courses array
const coursesDiv = document.getElementById('courses');
coursesDiv.innerHTML = '';
courses.forEach((course) => {
const parentDiv = document.createElement('div');
parentDiv.classList.add('course');
const selectorDiv = document.createElement('div');
const courseNameDiv = document.createElement('div');
courseNameDiv.innerHTML = course.name;
selectorDiv.appendChild(course.selectGrade);
selectorDiv.appendChild(course.selectHours);
parentDiv.appendChild(courseNameDiv);
parentDiv.appendChild(selectorDiv);
coursesDiv.appendChild(parentDiv);
});
calculateAndDisplayGPA(courses);
localStorage.setItem(LOCAL_STORAGE_HTML, html);
});
})();