Skip to content

Commit a91ce21

Browse files
committed
12 Jan 2023
1) Updated Bootstrap 2) Updated Material Icons 3) Updated PHP-JWT 4) Cosmetic updates 5) Added import class feature 6) Added Import sample CSV
1 parent 099f0bf commit a91ce21

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+421
-146
lines changed

CB-worker.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ self.addEventListener("install", evt => {
1313
"assets/ico-512.png",
1414
"assets/favicon.png",
1515
"assets/login.jpg",
16+
"assets/forgot.jpg",
1617
// (A3) COMMON INTERFACE
1718
"assets/PAGE-cb.js",
1819
"assets/CB-selector.css",
@@ -28,6 +29,7 @@ self.addEventListener("install", evt => {
2829
"assets/PAGE-login.js",
2930
"assets/A-class.js",
3031
"assets/A-class-attend.js",
32+
"assets/A-class-import.js",
3133
"assets/A-course.js",
3234
"assets/A-course-import.js",
3335
"assets/A-course-user.js",

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ I Was Here is a simple PHP Student Attendance Management System. This is not a "
55
## FEATURES
66
1) Users management.
77
2) Take attendance manually, or let students scan a QR code.
8-
3) Progressive web app.
8+
3) Installble progressive web app.
99
4) CSV reports.
1010
<br><br>
1111

1212
## SCREENSHOTS
1313
<p float="left">
14-
<img width="250" style="inline-block" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-1.png">
15-
<img width="250" style="inline-block" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-2.png">
16-
<img width="250" style="inline-block" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-3.png">
17-
<img width="250" style="inline-block" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-4.png">
18-
<img width="250" style="inline-block" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-5.png">
19-
<img width="250" style="inline-block" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-6.png">
14+
<img width="250" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-1a.png">
15+
<img width="250" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-2a.png">
16+
<img width="250" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-3a.png">
17+
<img width="250" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-4a.png">
18+
<img width="250" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-5a.png">
19+
<img width="250" src="https://github.com/code-boxx/I-Was-Here/blob/main/assets/iwh-6a.png">
2020
</p><br>
2121

2222
## REQUIREMENTS
@@ -54,4 +54,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5454
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5555
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
5656
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
57-
SOFTWARE.
57+
SOFTWARE.

assets/0d-dummy-classes.csv

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
ENG-123,2077-01-01 12:00,joe@doe.com,First class
2+
ENG-123,2077-01-08 13:00,joe@doe.com,Optional description
3+
ENG-123,2077-01-15 14:00,joe@doe.com,
4+
ENG-123,2077-02-23 15:00,joe@doe.com,
5+
ENG-123,2077-02-02 16:00,joe@doe.com,Last class

assets/A-class-import.js

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
var cimport = {
2+
// (A) LOAD "IMPORT CLASS" PAGE
3+
init : () => {
4+
cb.page(1);
5+
cb.load({
6+
page : "a/class/import",
7+
target : "cb-page-2"
8+
});
9+
return false;
10+
},
11+
12+
// (B) READ CSV FILE
13+
read : () => {
14+
// (B1) HTML ELEMENTS
15+
let hSelect = document.getElementById("class-import-select"),
16+
hFile = document.getElementById("class-import-file"),
17+
hTable = document.getElementById("class-import-table"),
18+
hList = document.getElementById("class-import-list");
19+
hSelect.classList.add("d-none");
20+
hTable.classList.remove("d-none");
21+
22+
// (B2) READ SELECTED FILE
23+
let reader = new FileReader(),
24+
vMail = new RegExp("[a-z0-9]+@[a-z]+\.[a-z]{2,3}"),
25+
vDate = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/,
26+
csv = hFile.files[0], row, col, err, valid = false;
27+
28+
reader.addEventListener("loadend", () => { try {
29+
// (B2-1) READ ROW-BY-ROW INTO HTML + CHECK VALID
30+
for (let r of CSV.parse(reader.result)) {
31+
row = document.createElement("tr");
32+
if (r.length != 4) {
33+
row.className = "table-danger fw-bold";
34+
row.innerHTML = `<td colspan="4">?</td><td>Invalid Row</td>`;
35+
} else {
36+
err = null;
37+
for (let i=0; i<4; i++) {
38+
col = document.createElement("td");
39+
col.innerHTML = r[i]==null?"":r[i];
40+
row.appendChild(col);
41+
}
42+
if (err==null && (r[0]=="" || r[0]==null)) { err = "Invalid Code"; }
43+
if (err==null && !vDate.test(r[1])) { err = "Invalid Date"; }
44+
if (err==null && !vMail.test(r[2])) { err = "Invalid Email"; }
45+
col = document.createElement("td");
46+
col.innerHTML = err==null ? "" : err;
47+
row.appendChild(col);
48+
if (err==null) {
49+
row.className = "valid";
50+
valid = true;
51+
} else { row.className = "table-danger fw-bold"; }
52+
}
53+
hList.appendChild(row);
54+
}
55+
56+
// (B2-2) START BUTTON
57+
if (valid) {
58+
row = document.createElement("tr");
59+
row.innerHTML = `<td colspan="5">
60+
<button id="class-import-go" class="btn btn-primary" onclick="cimport.go(1)">Start Import</button>
61+
</td>`;
62+
hList.appendChild(row);
63+
}
64+
} catch (err) {
65+
cb.modal("Error opening CSV file", err.message)
66+
console.error(err);
67+
}});
68+
reader.readAsText(csv);
69+
},
70+
71+
// (C) START IMPORT
72+
go : first => {
73+
// (C1) BLOCK SCREEN & DISABLE BUTTON ON INIT CALL
74+
if (first) {
75+
document.getElementById("class-import-go").disabled = true;
76+
cb.loading(true);
77+
}
78+
79+
// (C2) IMPORT ENTRY
80+
let row = document.querySelector("#class-import-list .valid");
81+
if (row!=null) {
82+
let col = row.querySelectorAll("td");
83+
cb.api({
84+
mod : "classes", req : "import",
85+
passmsg : false, loading : false, nofail : true,
86+
data : {
87+
code : col[0].innerHTML,
88+
date : col[1].innerHTML,
89+
email : col[2].innerHTML,
90+
desc : col[3].innerHTML
91+
},
92+
onpass : () => {
93+
row.classList.remove("valid");
94+
col[4].innerHTML = "OK";
95+
cimport.go();
96+
},
97+
onfail : msg => {
98+
row.className = "table-danger fw-bold";
99+
col[4].innerHTML = msg;
100+
cimport.go();
101+
}
102+
});
103+
}
104+
105+
// (C3) ALL DONE
106+
else {
107+
let btn = document.getElementById("class-import-go");
108+
btn.innerHTML = "Done - Go Back";
109+
btn.onclick = () => cb.page(0);
110+
btn.disabled = false;
111+
classes.list(true);
112+
cb.loading(false);
113+
}
114+
}
115+
};

assets/A-class.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ var classes = {
22
// (A) SHOW COURSE CLASSES PAGE
33
pg : 1, // current page
44
find : "", // current search
5-
list : () => {
6-
cb.page(0);
5+
list : silent => {
6+
if (silent!==true) { cb.page(0); }
77
cb.load({
88
page : "a/class/list",
99
target : "class-list",

assets/A-course-import.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ var cimport = {
3838
col.innerHTML = r[i]==null?"":r[i];
3939
row.appendChild(col);
4040
}
41-
if (err==null && r[0]=="") { err = "Invalid Code"; }
42-
if (err==null && r[1]=="") { err = "Invalid Name"; }
41+
if (err==null && (r[0]=="" || r[0]==null)) { err = "Invalid Code"; }
42+
if (err==null && (r[1]=="" || r[1]==null)) { err = "Invalid Name"; }
4343
if (err==null && !vDate.test(r[3])) { err = "Invalid Start"; }
4444
if (err==null && !vDate.test(r[4])) { err = "Invalid End"; }
4545
if (err==null) { if (new Date(r[4]) < new Date(r[3])) { err = "End Earlier Than Start"; }}

assets/HEAD-iwh.jpg

-16.2 KB
Loading

0 commit comments

Comments
 (0)