-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtablectrl.js
More file actions
203 lines (179 loc) · 7.34 KB
/
Copy pathtablectrl.js
File metadata and controls
203 lines (179 loc) · 7.34 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
const fs = require('fs');
parser = new DOMParser();
//Main function
window.onload = function() {
openXMLFile(function(contents){
//loadXML("schedule1.xml", function(contents){
createTimeTable(contents);
createStudentList(contents);
});
};
//Date formatter
function formatDate(text){
let spIndex = text.indexOf(" ");
let day = text.substring(0, spIndex);
let rest = text.substring(spIndex+1);
return [day, rest];
}
function getChildIndexOf(child){
return [].indexOf.call(child.parentNode.children, child);
}
function createTimeTable(file){
let table = document.getElementById("time_table");
let tableHead = document.createElement('thead');
let tableBody = document.createElement('tbody');
//Get time table xml data
let xml = file.getElementsByTagName("time_table")[0];
//Get table specifications
let daysNL = xml.getElementsByTagName("day");
let width = daysNL.length + 2; // 2 for period and time on left
let height = daysNL[0].getElementsByTagName("time").length + 2; // 2 for date and day on top
for(let row = 0;row < height;row++){
//Create new row object
let table_row = document.createElement("tr");
for (let col = 0;col < width;col++){
//Determine if element should be table head or table data
let cell = document.createElement( (row < 2) ? 'th' : 'td' );
//Setup first row
if(row === 0){
if(col < 2) // Spacing
cell.appendChild(document.createTextNode(""));
else // Day #
cell.appendChild(document.createTextNode("Day " + (col - 1)))
}
//Setup second row
else if(row === 1){
switch(col){
case 0:
cell.appendChild(document.createTextNode("Period"));
break;
case 1:
cell.appendChild(document.createTextNode("Time"));
break;
default:
//Get date info from node list of days in XML
let dateInfo = formatDate(daysNL[col - 2].getAttribute("date"));
cell.appendChild(document.createTextNode(dateInfo[0]));
cell.appendChild(document.createElement("br"));
cell.appendChild(document.createTextNode(dateInfo[1]));
break;
}
}
//All other cells
else{
let times = daysNL[0].getElementsByTagName("time");
let index = row - 2;
switch(col){
//Period
case 0:
//Check time element's index within parent node
if (getChildIndexOf(times[index]) === 0) {
let parentPeriod = times[index].parentNode;
//Get period label from parent
let label = parentPeriod.getAttribute("label");
cell.appendChild(document.createTextNode(label));
//Check if rowSpan is needed in period nodes
let tlength = parentPeriod.getElementsByTagName("time").length;
if(tlength > 1)
cell.rowSpan = tlength;
}
//Filling if rowSpan exists
else {
//cell.appendChild(document.createTextNode("yep"));
cell.setAttribute("class", "filler");
}
break;
//Time
case 1:
//Get lesson time label
let label = times[index].getAttribute("ptime");
cell.appendChild(document.createTextNode(label));
break;
//Student info
default:
//Check tag
let tag = times[index].firstElementChild.tagName;
if (tag === "name"){
//Add names
let live_times = daysNL[col - 2].getElementsByTagName("time");
let names = live_times[index].getElementsByTagName("name");
for(let i = 0;i < names.length;i++){
cell.appendChild(document.createTextNode(names[i].innerHTML));
if(i < names.length - 1)
cell.appendChild(document.createElement("br"));
}
}
else if(tag === "cover"){
if(col === 2){
let coverTag = times[index].firstElementChild.innerHTML;
cell.appendChild(document.createTextNode(coverTag));
cell.colSpan = daysNL.length;
cell.setAttribute("class", "cover");
}
else
cell.setAttribute("class", "filler");
}
break;
}
}
//Finalize row
table_row.appendChild(cell);
}
//Add rows to head and body
if(row < 2)
tableHead.appendChild(table_row);
else
tableBody.appendChild(table_row);
}
table.appendChild(tableHead);
table.appendChild(tableBody);
}
function createStudentList(file){
let table = document.getElementById("stu_list");
let body = document.createElement('tbody');
//Get time table xml data
let xml = file.getElementsByTagName("student_list")[0];
let grades = xml.getElementsByTagName("grade");
for(let gi = 0; gi < grades.length; gi++){
let students = grades[gi].getElementsByTagName("student");
//Add grade header
let ghRow = document.createElement("tr");
let ghInner = document.createElement("th");
let label = grades[gi].getAttribute("year") + "th Grade";
ghInner.appendChild(document.createTextNode(label));
ghRow.appendChild(ghInner);
body.appendChild(ghRow);
for(let si = 0; si < students.length; si++){
//Create table elements
let sRow = document.createElement("tr");
let data = document.createElement("td");
//Get student name
let stu_name = students[si].getElementsByTagName("name")[0].innerHTML;
//Add elements to table
data.appendChild(document.createTextNode(stu_name));
sRow.appendChild(data);
body.appendChild(sRow);
}
}
table.appendChild(body);
}
//-----File Utility-----
const {dialog} = require('electron').remote;
function loadXML(file_name, callback){
fs.readFile(file_name, function(err,data){
let value = parser.parseFromString(data.toString(), "text/xml");
callback(value);
});
}
function openXMLFile(callback){
dialog.showOpenDialog((files) => {
if (files === undefined){
console.log("No file selected!");
return;
}
fs.readFile(files[0], function(err,data){
let value = parser.parseFromString(data.toString(), "text/xml");
callback(value);
});
});
}