From 0ecb85787ef63a73c8359ec8e2e0ba30dca6af1c Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 2 Feb 2025 16:32:12 +0000
Subject: [PATCH] Site Update. [skip ci]
---
README.html | 2 +-
README.page-vue-render.js | 2 +-
activities-dashboard.html | 2 +-
activities-dashboard.page-vue-render.js | 2 +-
cs3282-index.html | 2 +-
cs3282-index.page-vue-render.js | 2 +-
index.html | 2 +-
index.page-vue-render.js | 4 ++--
instructions.html | 2 +-
instructions.page-vue-render.js | 2 +-
siteData.json | 4 +++-
students/AgentHagu/info.html | 2 +-
students/AgentHagu/info.page-vue-render.js | 2 +-
students/AgentHagu/knowledge.html | 2 +-
students/AgentHagu/knowledge.page-vue-render.js | 2 +-
students/AgentHagu/progress.html | 2 +-
students/AgentHagu/progress.page-vue-render.js | 2 +-
students/Airiinnn/info.html | 2 +-
students/Airiinnn/info.page-vue-render.js | 2 +-
students/Airiinnn/knowledge.html | 2 +-
students/Airiinnn/knowledge.page-vue-render.js | 2 +-
students/Airiinnn/progress.html | 2 +-
students/Airiinnn/progress.page-vue-render.js | 2 +-
students/Arif-Khalid/info.html | 2 +-
students/Arif-Khalid/info.page-vue-render.js | 2 +-
students/Arif-Khalid/knowledge.html | 2 +-
students/Arif-Khalid/knowledge.page-vue-render.js | 2 +-
students/Arif-Khalid/observations.html | 2 +-
students/Arif-Khalid/observations.page-vue-render.js | 2 +-
students/Arif-Khalid/progress.html | 2 +-
students/Arif-Khalid/progress.page-vue-render.js | 2 +-
students/BunnyHoppp/info.html | 2 +-
students/BunnyHoppp/info.page-vue-render.js | 2 +-
students/BunnyHoppp/knowledge.html | 2 +-
students/BunnyHoppp/knowledge.page-vue-render.js | 2 +-
students/BunnyHoppp/progress.html | 2 +-
students/BunnyHoppp/progress.page-vue-render.js | 2 +-
students/CYX22222003/info.html | 2 +-
students/CYX22222003/info.page-vue-render.js | 2 +-
students/CYX22222003/knowledge.html | 2 +-
students/CYX22222003/knowledge.page-vue-render.js | 2 +-
students/CYX22222003/progress.html | 2 +-
students/CYX22222003/progress.page-vue-render.js | 2 +-
students/DhiraPT/info.html | 2 +-
students/DhiraPT/info.page-vue-render.js | 2 +-
students/DhiraPT/knowledge.html | 2 +-
students/DhiraPT/knowledge.page-vue-render.js | 2 +-
students/DhiraPT/progress.html | 2 +-
students/DhiraPT/progress.page-vue-render.js | 2 +-
students/Echomo-Xinyu/info.html | 2 +-
students/Echomo-Xinyu/info.page-vue-render.js | 2 +-
students/Echomo-Xinyu/knowledge.html | 2 +-
students/Echomo-Xinyu/knowledge.page-vue-render.js | 2 +-
students/Echomo-Xinyu/observations.html | 2 +-
students/Echomo-Xinyu/observations.page-vue-render.js | 2 +-
students/Echomo-Xinyu/progress.html | 2 +-
students/Echomo-Xinyu/progress.page-vue-render.js | 2 +-
students/Eclipse-Dominator/info.html | 2 +-
students/Eclipse-Dominator/info.page-vue-render.js | 2 +-
students/Eclipse-Dominator/knowledge.html | 2 +-
students/Eclipse-Dominator/knowledge.page-vue-render.js | 2 +-
students/Eclipse-Dominator/observations.html | 2 +-
students/Eclipse-Dominator/observations.page-vue-render.js | 2 +-
students/Eclipse-Dominator/progress.html | 2 +-
students/Eclipse-Dominator/progress.page-vue-render.js | 2 +-
students/HollaG/info.html | 2 +-
students/HollaG/info.page-vue-render.js | 2 +-
students/HollaG/knowledge.html | 2 +-
students/HollaG/knowledge.page-vue-render.js | 2 +-
students/HollaG/progress.html | 2 +-
students/HollaG/progress.page-vue-render.js | 2 +-
students/IanCheah/info.html | 2 +-
students/IanCheah/info.page-vue-render.js | 2 +-
students/IanCheah/knowledge.html | 2 +-
students/IanCheah/knowledge.page-vue-render.js | 2 +-
students/IanCheah/progress.html | 2 +-
students/IanCheah/progress.page-vue-render.js | 2 +-
students/Incogdino/info.html | 2 +-
students/Incogdino/info.page-vue-render.js | 2 +-
students/Incogdino/knowledge.html | 2 +-
students/Incogdino/knowledge.page-vue-render.js | 2 +-
students/Incogdino/progress.html | 2 +-
students/Incogdino/progress.page-vue-render.js | 2 +-
students/InfinityTwo/info.html | 2 +-
students/InfinityTwo/info.page-vue-render.js | 2 +-
students/InfinityTwo/knowledge.html | 2 +-
students/InfinityTwo/knowledge.page-vue-render.js | 2 +-
students/InfinityTwo/progress.html | 2 +-
students/InfinityTwo/progress.page-vue-render.js | 2 +-
students/Izn432/info.html | 2 +-
students/Izn432/info.page-vue-render.js | 2 +-
students/Izn432/knowledge.html | 2 +-
students/Izn432/knowledge.page-vue-render.js | 2 +-
students/Izn432/progress.html | 2 +-
students/Izn432/progress.page-vue-render.js | 2 +-
students/JoanneHing/info.html | 2 +-
students/JoanneHing/info.page-vue-render.js | 2 +-
students/JoanneHing/knowledge.html | 2 +-
students/JoanneHing/knowledge.page-vue-render.js | 2 +-
students/JoanneHing/progress.html | 2 +-
students/JoanneHing/progress.page-vue-render.js | 2 +-
students/NorbertLoh/info.html | 2 +-
students/NorbertLoh/info.page-vue-render.js | 2 +-
students/NorbertLoh/knowledge.html | 2 +-
students/NorbertLoh/knowledge.page-vue-render.js | 2 +-
students/NorbertLoh/progress.html | 2 +-
students/NorbertLoh/progress.page-vue-render.js | 2 +-
students/domoberzin/info.html | 2 +-
students/domoberzin/info.page-vue-render.js | 2 +-
students/domoberzin/knowledge.html | 2 +-
students/domoberzin/knowledge.page-vue-render.js | 2 +-
students/domoberzin/observations.html | 2 +-
students/domoberzin/observations.page-vue-render.js | 2 +-
students/domoberzin/progress.html | 2 +-
students/domoberzin/progress.page-vue-render.js | 2 +-
students/gerteck/info.html | 2 +-
students/gerteck/info.page-vue-render.js | 2 +-
students/gerteck/knowledge.html | 2 +-
students/gerteck/knowledge.page-vue-render.js | 2 +-
students/gerteck/progress.html | 2 +-
students/gerteck/progress.page-vue-render.js | 2 +-
students/jasonqiu212/info.html | 2 +-
students/jasonqiu212/info.page-vue-render.js | 2 +-
students/jasonqiu212/knowledge.html | 2 +-
students/jasonqiu212/knowledge.page-vue-render.js | 2 +-
students/jasonqiu212/observations.html | 2 +-
students/jasonqiu212/observations.page-vue-render.js | 2 +-
students/jasonqiu212/progress.html | 2 +-
students/jasonqiu212/progress.page-vue-render.js | 2 +-
students/joeng03/info.html | 2 +-
students/joeng03/info.page-vue-render.js | 2 +-
students/joeng03/knowledge.html | 2 +-
students/joeng03/knowledge.page-vue-render.js | 2 +-
students/joeng03/progress.html | 2 +-
students/joeng03/progress.page-vue-render.js | 2 +-
students/jonasongg/info.html | 2 +-
students/jonasongg/info.page-vue-render.js | 2 +-
students/jonasongg/knowledge.html | 2 +-
students/jonasongg/knowledge.page-vue-render.js | 2 +-
students/jonasongg/observations.html | 2 +-
students/jonasongg/observations.page-vue-render.js | 2 +-
students/jonasongg/progress.html | 2 +-
students/jonasongg/progress.page-vue-render.js | 2 +-
students/knowledge.html | 4 ++--
students/knowledge.page-vue-render.js | 4 ++--
students/lhw-1/info.html | 2 +-
students/lhw-1/info.page-vue-render.js | 2 +-
students/lhw-1/knowledge.html | 2 +-
students/lhw-1/knowledge.page-vue-render.js | 2 +-
students/lhw-1/observations.html | 2 +-
students/lhw-1/observations.page-vue-render.js | 2 +-
students/lhw-1/progress.html | 2 +-
students/lhw-1/progress.page-vue-render.js | 2 +-
students/lyuanww/info.html | 2 +-
students/lyuanww/info.page-vue-render.js | 2 +-
students/lyuanww/knowledge.html | 2 +-
students/lyuanww/knowledge.page-vue-render.js | 4 ++--
students/lyuanww/progress.html | 2 +-
students/lyuanww/progress.page-vue-render.js | 4 ++--
students/mingyang143/info.html | 2 +-
students/mingyang143/info.page-vue-render.js | 2 +-
students/mingyang143/knowledge.html | 2 +-
students/mingyang143/knowledge.page-vue-render.js | 2 +-
students/mingyang143/progress.html | 2 +-
students/mingyang143/progress.page-vue-render.js | 2 +-
students/nknguyenhc/info.html | 2 +-
students/nknguyenhc/info.page-vue-render.js | 2 +-
students/nknguyenhc/knowledge.html | 2 +-
students/nknguyenhc/knowledge.page-vue-render.js | 2 +-
students/nknguyenhc/observations.html | 2 +-
students/nknguyenhc/observations.page-vue-render.js | 2 +-
students/nknguyenhc/progress.html | 2 +-
students/nknguyenhc/progress.page-vue-render.js | 2 +-
students/observations.html | 2 +-
students/observations.page-vue-render.js | 2 +-
students/peasantbird/info.html | 2 +-
students/peasantbird/info.page-vue-render.js | 2 +-
students/peasantbird/knowledge.html | 2 +-
students/peasantbird/knowledge.page-vue-render.js | 2 +-
students/peasantbird/progress.html | 2 +-
students/peasantbird/progress.page-vue-render.js | 2 +-
students/sample/info.html | 2 +-
students/sample/info.page-vue-render.js | 2 +-
students/sample/knowledge.html | 2 +-
students/sample/knowledge.page-vue-render.js | 2 +-
students/sample/observations.html | 2 +-
students/sample/observations.page-vue-render.js | 2 +-
students/sample/progress.html | 2 +-
students/sample/progress.page-vue-render.js | 2 +-
students/sample/resume.html | 2 +-
students/sample/resume.page-vue-render.js | 2 +-
students/sikai00/info.html | 2 +-
students/sikai00/info.page-vue-render.js | 2 +-
students/sikai00/knowledge.html | 2 +-
students/sikai00/knowledge.page-vue-render.js | 2 +-
students/sikai00/observations.html | 2 +-
students/sikai00/observations.page-vue-render.js | 2 +-
students/sikai00/progress.html | 2 +-
students/sikai00/progress.page-vue-render.js | 2 +-
students/sopa301/info.html | 2 +-
students/sopa301/info.page-vue-render.js | 2 +-
students/sopa301/knowledge.html | 2 +-
students/sopa301/knowledge.page-vue-render.js | 2 +-
students/sopa301/observations.html | 2 +-
students/sopa301/observations.page-vue-render.js | 2 +-
students/sopa301/progress.html | 2 +-
students/sopa301/progress.page-vue-render.js | 2 +-
students/talksSchedule.html | 2 +-
students/talksSchedule.page-vue-render.js | 2 +-
students/worksheet.html | 2 +-
students/worksheet.page-vue-render.js | 2 +-
students/wx-03/info.html | 2 +-
students/wx-03/info.page-vue-render.js | 2 +-
students/wx-03/knowledge.html | 2 +-
students/wx-03/knowledge.page-vue-render.js | 2 +-
students/wx-03/progress.html | 2 +-
students/wx-03/progress.page-vue-render.js | 2 +-
students/xenosf/info.html | 2 +-
students/xenosf/info.page-vue-render.js | 2 +-
students/xenosf/knowledge.html | 2 +-
students/xenosf/knowledge.page-vue-render.js | 2 +-
students/xenosf/observations.html | 2 +-
students/xenosf/observations.page-vue-render.js | 2 +-
students/xenosf/progress.html | 2 +-
students/xenosf/progress.page-vue-render.js | 2 +-
students/yuanxi1/info.html | 2 +-
students/yuanxi1/info.page-vue-render.js | 2 +-
students/yuanxi1/knowledge.html | 2 +-
students/yuanxi1/knowledge.page-vue-render.js | 2 +-
students/yuanxi1/observations.html | 2 +-
students/yuanxi1/observations.page-vue-render.js | 2 +-
students/yuanxi1/progress.html | 2 +-
students/yuanxi1/progress.page-vue-render.js | 2 +-
students/yucongkoo/info.html | 2 +-
students/yucongkoo/info.page-vue-render.js | 2 +-
students/yucongkoo/knowledge.html | 2 +-
students/yucongkoo/knowledge.page-vue-render.js | 2 +-
students/yucongkoo/progress.html | 2 +-
students/yucongkoo/progress.page-vue-render.js | 2 +-
students/yyccbb/info.html | 2 +-
students/yyccbb/info.page-vue-render.js | 2 +-
students/yyccbb/knowledge.html | 2 +-
students/yyccbb/knowledge.page-vue-render.js | 2 +-
students/yyccbb/progress.html | 2 +-
students/yyccbb/progress.page-vue-render.js | 2 +-
245 files changed, 252 insertions(+), 250 deletions(-)
diff --git a/README.html b/README.html
index 62ddd57e..9ef7f422 100644
--- a/README.html
+++ b/README.html
@@ -12,7 +12,7 @@
const baseUrl = '/2025'
-
+
diff --git a/README.page-vue-render.js b/README.page-vue-render.js
index 7e701ae5..ee0558ce 100644
--- a/README.page-vue-render.js
+++ b/README.page-vue-render.js
@@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"fixed":""}
with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"cs3281-and-amp-2-student-data-website"}},[_v("CS3281&2 student data website"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs3281-and-amp-2-student-data-website","onclick":"event.stopPropagation()"}})])])}
},function anonymous(
) {
-with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 8:39:13 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
+with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 16:31:02 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
}];
\ No newline at end of file
diff --git a/activities-dashboard.html b/activities-dashboard.html
index 628ea493..c09a7001 100644
--- a/activities-dashboard.html
+++ b/activities-dashboard.html
@@ -14,7 +14,7 @@
+Furthermore, the stats (i.e., posts counts) are not directly comparable between devs, as they are influenced by the type of work/project. This page will be updated once in a while, in 1-2 week intervals. [This page was last updated on 2024-05-07 @22:54]
CS3281
CS3282
diff --git a/activities-dashboard.page-vue-render.js b/activities-dashboard.page-vue-render.js
index 5df2708a..f7a6ebea 100644
--- a/activities-dashboard.page-vue-render.js
+++ b/activities-dashboard.page-vue-render.js
@@ -20,6 +20,6 @@ with(this){return _c('h1',{attrs:{"id":"cs3281"}},[_v("CS3281"),_c('a',{staticCl
with(this){return _c('h1',{attrs:{"id":"cs3282"}},[_v("CS3282"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs3282","onclick":"event.stopPropagation()"}})])}
},function anonymous(
) {
-with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 8:39:13 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
+with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 16:31:02 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
}];
\ No newline at end of file
diff --git a/cs3282-index.html b/cs3282-index.html
index a19e9307..420597a2 100644
--- a/cs3282-index.html
+++ b/cs3282-index.html
@@ -12,7 +12,7 @@
const baseUrl = '/2025'
-
+
diff --git a/cs3282-index.page-vue-render.js b/cs3282-index.page-vue-render.js
index 04c4af18..bdb14b86 100644
--- a/cs3282-index.page-vue-render.js
+++ b/cs3282-index.page-vue-render.js
@@ -44,6 +44,6 @@ with(this){return _c('h1',{attrs:{"id":"reposense"}},[_v("RepoSense"),_c('a',{st
with(this){return _c('h1',{attrs:{"id":"teammates"}},[_v("TEAMMATES"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teammates","onclick":"event.stopPropagation()"}})])}
},function anonymous(
) {
-with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 8:39:13 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
+with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 16:31:02 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
}];
\ No newline at end of file
diff --git a/index.html b/index.html
index f08fa896..1b68b08a 100644
--- a/index.html
+++ b/index.html
@@ -12,7 +12,7 @@
const baseUrl = '/2025'
-
+
diff --git a/index.page-vue-render.js b/index.page-vue-render.js
index 85956261..3e48e18a 100644
--- a/index.page-vue-render.js
+++ b/index.page-vue-render.js
@@ -1,7 +1,7 @@
var pageVueRenderFn = function anonymous(
) {
-with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"fixed":""}},[_c('navbar',{attrs:{"placement":"top","type":"primary"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/2025/index.html","title":"Home"}},[_v("CS3281&2-2025/Students")])]},proxy:true},{key:"right",fn:function(){return [_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"https://github.com/nus-cs3281/2025"}},[_c('span',[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})])])])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link",scopedSlots:_u([{key:"header",fn:function(){return [_v("CS3281")]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/index.html"}},[_v("Students")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/students/knowledge.html"}},[_v("Knowledge")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs3281.github.io/2025-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByAuthors&breakdown=false"}},[_v("Code Dashboard")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/activities-dashboard.html"}},[_v("Activities Dashboard")])])]),_v(" "),_c('dropdown',{staticClass:"nav-link",scopedSlots:_u([{key:"header",fn:function(){return [_v("CS3282")]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/cs3282-index.html"}},[_v("Students")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/students/talksSchedule.html"}},[_v("Lightning Talks")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/activities-dashboard.html"}},[_v("Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/2025/instructions.html"}},[_v("Instructions")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs3281.github.io/website/"}},[_v("CS3281&2 Website "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-share-alt",attrs:{"aria-hidden":"true"}})])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_m(0),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_m(7),_v(" "),_m(8),_v(" "),_m(9),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"isaac-ng-jun-jie"}},[_v("ISAAC NG JUN JIE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#isaac-ng-jun-jie","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/Izn432/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/IzN432"}},[_v("https://www.github.com/IzN432")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1302"}},[_v("Update to use more typescript types #1302")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1303"}},[_v("Fix formats in the comments #1303")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1302"}},[_v("Solve Github Actions failing for macos-setup-and-tests #394")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Contributed to issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/398"}},[_v("Remove all button doesn't work #398")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"angular"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Angular components are split into three parts, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.ts")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.css")])]),_v(" "),_c('h4',{attrs:{"id":"component-ts"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.ts")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#component-ts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs"}},[_c('span',[_v("@Component({\n")]),_c('span',[_v(" selector: 'app-auth',\n")]),_c('span',[_v(" templateUrl: './auth.component.html',\n")]),_c('span',[_v(" styleUrls: ['./auth.component.css']\n")]),_c('span',[_v("})\n")])])]),_c('p',[_v("This segment is found at the top of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.ts")]),_v(" files.")]),_v(" "),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("selector")]),_v(" indicates the keyword that will be used in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_v(" files to identify this component. For example, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(" ")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("templateUrl")]),_v(" indicates the filepath to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_v(" file.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("styleUrls")]),_v(" indicates the filepath(s) to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.css")]),_v(" file(s).")])]),_v(" "),_c('h4',{attrs:{"id":"component-html"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#component-html","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This is the template file. Template files use mostly HTML syntax, with a bit of angular specific syntax included. This includes the structural directives such as *ngIf, *ngFor, etc. The "),_c('a',{attrs:{"href":"https://v17.angular.io/guide/architecture-components"}},[_v("documentation")]),_v(" is quite sufficient for understanding the angular syntax.")]),_v(" "),_c('h4',{attrs:{"id":"component-css"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.css")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#component-css","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This is a stylesheet, using normal css. There is a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("::ng-deep")]),_v(" selector available, which promotes a component style to global style.")]),_v(" "),_c('h3',{attrs:{"id":"arcsecond"}},[_v("Arcsecond"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#arcsecond","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Arcsecond is a string parsing library for javascript. An example arcsecond parser is as follows:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs"}},[_c('span',[_v("export const TutorModerationTodoParser = coroutine(function* () {\n")]),_c('span',[_v(" yield str(TODO_HEADER);\n")]),_c('span',[_v(" yield whitespace;\n")]),_c('span',[_v("\n")]),_c('span',[_v(" const tutorResponses = yield many1(ModerationSectionParser);\n")]),_c('span',[_v("\n")]),_c('span',[_v(" const result: TutorModerationTodoParseResult = {\n")]),_c('span',[_v(" disputesToResolve: tutorResponses\n")]),_c('span',[_v(" };\n")]),_c('span',[_v(" return result;\n")]),_c('span',[_v("});\n")])])]),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("str(TODO_HEADER)")]),_v(" matches the starting of the string with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("TODO_HEADER")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("whitespace")]),_v(" matches the next part of the string with one or more whitespaces.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("many1(ModerationSectionParser)")]),_v(" applies the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ModerationSectionParser")]),_v(" one or more times.")])]),_v(" "),_c('h3',{attrs:{"id":"graphql"}},[_v("GraphQL"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#graphql","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("GraphQL is a architecture for building APIs like REST. Unlike REST where the server defines the structure of the response, in GraphQL, the client and request the exact data they need.")]),_v(" "),_c('h3',{attrs:{"id":"node-14-x-support-on-macos"}},[_v("Node 14.x support on macos"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#node-14-x-support-on-macos","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Apple laptops changed to using ARM64 architecture back in 2020. This meant that Node versions released before then were not directly supported by the ARM64 architecture. This caused issues with the github actions. There is a workaround for this by running "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("arch -x86_64")]),_v(" and manually installing node instead of using the setup-node Github action, but the simpler solution was to upgrade the test to use Node version 16.x.")]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"koo-yu-cong"}},[_v("KOO YU CONG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#koo-yu-cong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/yucongkoo/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/yucongkoo"}},[_v("https://www.github.com/yucongkoo")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Merged PR : "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1291"}},[_v("Fix formatting style of issue-table component")])])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Submitted and Researched Issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues/1292"}},[_v("Playwright Github workflow failing #1292")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1298"}},[_v("Downgrade ubuntu version in playwright.yml #1298")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Participated in Issue Investigation : "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues/1304#issuecomment-2609636737"}},[_v("Workflow failing due to updated nested dependencies #1304")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"nvm-node-version-manager"}},[_v("NVM (Node Version Manager)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#nvm-node-version-manager","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Issue faced: CATcher uses node v16.x while WATcher uses node v14.x, it is hard to switch between node versions quickly when working on both projects")]),_v(" "),_c('p',[_v("Tool used: Used nvm to easily manage and switch between different node versions locally")]),_v(" "),_c('h3',{attrs:{"id":"angular-2"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"components-and-modules"}},[_v("Components and Modules"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#components-and-modules","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("A typical component in Angular consists of 3 files:")]),_v(" "),_c('ul',[_c('li',[_v("A html file that defines the layout of the component")]),_v(" "),_c('li',[_v("A css file that provides styling to the UI")]),_v(" "),_c('li',[_v("A typescript file that controls the logic and behaviour of the application, typically handles the data of the application too")])]),_v(" "),_c('p',[_v("Each component can have a module file where we can state the components/modules that this component is dependent on (i.e. the imports array) and the components that is provided by this module (i.e. the declarations array). This helps increasing the modularity and scalability of the whole application.")]),_v(" "),_c('p',[_v("As a developer coming from React, here are some clear differences I have observed:")]),_v(" "),_c('ul',[_c('li',[_v("There is no concept of states in Angular and the data passing is 2-ways, when the user updates from the UI, the value is automatically updated in the component and vice versa, whereas in React we would have to use states and explicitly update the states via setState or similar functions.")]),_v(" "),_c('li',[_v("Instead of defining the layout of componenet and logic in the same file, Angular split them into 2 seperate files (i.e. the html and typescript file), personally I felt that this split helps enforce the MVC architecture more strictly, but also imposes more restrictions when it comes to components that have tightly coupled logic")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"loh-ze-qing-norbert"}},[_v("LOH ZE QING, NORBERT"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#loh-ze-qing-norbert","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/NorbertLoh/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/NorbertLoh"}},[_v("https://github.com/NorbertLoh")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1295"}},[_v("Add white-space style to markdown code block css #1295")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues/1299"}},[_v("Invalid tester response example #1299")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/399"}},[_v("Remove magic strings for filters #399")])])]),_v(" "),_c('tr',[_c('td',[_v("4")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/pull/400"}},[_v("Remove magic strings #400")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"ngx-markdown"}},[_v("ngx-markdown"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ngx-markdown","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("I learned about the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngx-markdown")]),_v(" library while I was working on a fix to preserve whitespace when converting Markdown to HTML. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngx-markdown")]),_v(" combines multiple different language parsers and renders them in one library. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngx-markdown")]),_v(" supports Marked, Prism.js, Emoji-Toolkit, KaTeX, Mermaid, and Clipboard.js. I learned about configuring the options for the Markdown HTML element.")]),_v(" "),_c('h3',{attrs:{"id":"marked"}},[_v("Marked"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#marked","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Marked is the main parser we use for our comment editor in creating/editing issues and responses. I learned that any text that we write in Markdown syntax is converted into HTML elements using Marked. I found out that we can actually override how Marked generates the HTML elements, and we can add more attributes like classes, styles, and even modify the text before rendering it.")]),_v(" "),_c('h3',{attrs:{"id":"nvm-windows"}},[_v("nvm-windows"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#nvm-windows","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("WATcher requires node 14 in order to "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("npm install")]),_v(" some of its dependencies. However, instead of having to install and reinstall a different node version between different projects, I can use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("nvm-windows")]),_v(" to install multiple node versions and switch between them. However, the latest version of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("nvm-windows")]),_v(" has some issues if youwant to install node 14. After some debugging, I found out that "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("nvm-windows v1.1.11")]),_v(" can install node 14 with no issues.")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"soh-zheng-yang-marcus"}},[_v("SOH ZHENG YANG, MARCUS"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#soh-zheng-yang-marcus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/HollaG/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/hollag"}},[_v("https://www.github.com/hollag")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Submitted PR "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/pull/391"}},[_v("#391")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Contributed to issue "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/363"}},[_v("#363")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Created issue "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/396"}},[_v("#396")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Created issue "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/401"}},[_v("#401")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"angular-3"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Angular is the main tool used in both CATcher and WATcher. It is based on TypeScript.")]),_v(" "),_c('p',[_v("Angular is a component-based framework.\nEach component is generated with:")]),_v(" "),_c('ol',[_c('li',[_v("*.component.ts")]),_v(" "),_c('li',[_v("*.component.html")]),_v(" "),_c('li',[_v("*.component.css")])]),_v(" "),_c('p',[_v("Component state is maintained in the .ts file. These state variables can be bound to HTML elements through use of curly braces {{}}.")]),_v(" "),_c('p',[_v("Angular offers directives such as ngIf, ngFor that allow us to \"use\" JS in the HTML files.")]),_v(" "),_c('p',[_v("Services are used for processing, for tasks that don't involve what the user sees. This is different from the .component file, which directly handles things the users see.\nServices are kept in a separate directory /services/*.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"tng-wen-xi"}},[_v("TNG WEN XI"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tng-wen-xi","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/wx-03/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/wx-03"}},[_v("https://www.github.com/wx-03")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/395"}},[_v("'View current page on GitHub' button uses an invalid filter #395")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/pull/392"}},[_v("Show issues and PRs without milestones in 'Contributions' preset view #392")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/397"}},[_v("Invalid repo gets saved to suggestions #397")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/398"}},[_v("Remove all button doesn't work #398")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"angular-4"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("CATcher and WATcher are both built using the Angular framework, which is a single-page web appliation framework. Angular comes with a CLI tool to accelerate development.")]),_v(" "),_c('h4',{attrs:{"id":"components"}},[_v("Components"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#components","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Components are the fundamental building blocks of Angular applications.")]),_v(" "),_c('li',[_v("Generating a component will create a TypeScript file, a HTML file, a CSS file, and a test file.")]),_v(" "),_c('li',[_v("The TypeScript class defines the interaction of the HTML template and the rendered DOM structure, while the style sheet describes its appearance.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Component")]),_v(" decorator in the .ts file identifies the class immediately below it as a component class, and specifies its metadata. It associates a template with the component by referencing the .html file (or with inline code).")]),_v(" "),_c('li',[_v("Template syntax\n"),_c('ul',[_c('li',[_v("A template contains regular html as well as Angular template syntax, which alters the HTML based on the application's logic and the state of application and DOM data.")]),_v(" "),_c('li',[_v("Templates can use:\n"),_c('ul',[_c('li',[_v("Data binding")]),_v(" "),_c('li',[_v("Pipes")]),_v(" "),_c('li',[_v("Directives")])])])])])])])])],1)],1),_v(" "),_m(10),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"adrian-leonardo-liang"}},[_v("ADRIAN LEONARDO LIANG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adrian-leonardo-liang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/AgentHagu/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/AgentHagu"}},[_v("https://github.com/AgentHagu")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"markbind-2"}},[_v("MarkBind"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2584"}},[_v("Add optional absolute char indexing for highlighting #2584")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Responded to contributor queries: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2584"}},[_v("#2584")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"markbind-highlighter-component"}},[_v("MarkBind Highlighter Component"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-highlighter-component","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Learned the underlying workings of MarkBind's Highlighter component and how it parses highlighter rules in order to determine the characters or lines to highlight. Learned how to implement an enhancement to the existing feature and add relevant tests and documentation.")]),_v(" "),_c('h3',{attrs:{"id":"typescript"}},[_v("TypeScript"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#typescript","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("TypeScript is a programming language that builds upon JavaScript by adding static typing, enabling developers to catch errors at compile time and write more maintainable code as compared to JavaScript.")]),_v(" "),_c('h4',{attrs:{"id":"resources"}},[_v("Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('a',{attrs:{"href":"https://www.typescriptlang.org/docs/handbook/intro.html"}},[_v("TypeScript Handbook")]),_v(" - Official documentation for TypeScript")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"chan-ger-teck"}},[_v("CHAN GER TECK"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chan-ger-teck","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/gerteck/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/gerteck"}},[_v("https://www.github.com/gerteck")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"summary"}},[_v("Summary"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#summary","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Over the semester, I will be working on MarkBind.")]),_v(" "),_c('p',[_v("The work will build on previous work done, recorded "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1PjA6jfa7G_ZNjc8zSWi1hVSMmhbrGUY95k0ytyDCo-Y/edit?usp=sharing"}},[_v("here")])]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2568"}},[_v("Add Pagefind Plugin #2568")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Reviewed PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2584"}},[_v("#2584")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology"}},[_v("Tool/Technology"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h2',{attrs:{"id":"internal-tools-technology"}},[_v("Internal Tools/Technology"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#internal-tools-technology","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"markbind-s-search-utility"}},[_v("Markbind's Search Utility"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-s-search-utility","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"how-native-markbind-search-works"}},[_v("How Native MarkBind Search works"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how-native-markbind-search-works","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Collection of Title and headings in generation:")])]),_v(" "),_c('ul',[_c('li',[_v("We trace the website generation in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Site/index.ts")]),_v(".")]),_v(" "),_c('li',[_v("When building source files, during the page generation process, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Page.collectHeadingsAndKeywords")]),_v(" records headings and keywords inside rendered page into this.headings and this.keywords respectively.")]),_v(" "),_c('li',[_v("When writing site data, the title, headings, keywords are collected into pages object.")])]),_v(" "),_c('p',[_c('strong',[_v("Page Generation and Vue Initialization")])]),_v(" "),_c('ul',[_c('li',[_v("In "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("core-web/src/index.js")]),_v(", the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("setupWithSearch()")]),_v(" updates the SearchData by collecting the pages from the site data.\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("setupWithSearch()")]),_v(" is added as a script in the file template "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("page.njk")]),_v(" used to render the HTML structure of Markbind pages.")]),_v(" "),_c('li',[_v("This file template is used during the page generation process.")])])]),_v(" "),_c('li',[_v("Note also that "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("VueCommonAppFactory.js")]),_v(" provides a factory function (appFactory) to set up the common data and methods for Vue application shared between server-side and client-side, and provides the common data properties and methods.\n"),_c('ul',[_c('li',[_v("In particular, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchData[]")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchCallback()")]),_v(", which are relevant in the following portion.")]),_v(" "),_c('li',[_v("When using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("")]),_v(", this is where to use MarkBind's search functionality, we set the appropriate values: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(" ")])])])])]),_v(" "),_c('p',[_c('strong',[_v("Vue Components: Searchbar/SearchbarPageItem.vue")]),_v(" "),_c('strong',[_v("Searchbar.vue")])]),_v(" "),_c('ul',[_c('li',[_v("The searchbar uses the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchData[]")]),_v(" in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("data")]),_v(", filters and ranks the data based on keyword matches and populates the dropdown with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchbarPageItems")]),_v(".")]),_v(" "),_c('li',[_v("It calls the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("on-hit")]),_v(" function (which "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchCallback")]),_v(" is passed into) when a search result is selected.")]),_v(" "),_c('li',[_v("Presentation wise, each search result is represented by a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchbar-pageitem")]),_v(" vue component.")])]),_v(" "),_c('p',[_c('strong',[_v("SearchbarPageItem.vue")])]),_v(" "),_c('ul',[_c('li',[_v("Presents the component conditionally based on whether item is a heading or a page title.")])]),_v(" "),_c('h4',{attrs:{"id":"how-the-new-markbind-pagefind-plugin-works"}},[_v("How the new Markbind PageFind Plugin Works"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how-the-new-markbind-pagefind-plugin-works","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("About "),_c('a',{attrs:{"href":"https://pagefind.app/"}},[_v("PageFind")]),_v(": A fully static search library that aims to perform well on large sites, while using as little of users bandwidth\nas possible, and without hosting any infrastructure.")]),_v(" "),_c('p',[_c('strong',[_v("Documentation:")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://pagefind.app/docs/node-api/"}},[_v("PageFind NodeJS Indexing API")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/CloudCannon/pagefind/blob/production-docs/pagefind_web_js/types/index.d.ts"}},[_v("The types returned by Pagefind’s JavaScript search API")])])]),_v(" "),_c('h4',{attrs:{"id":"integration-of-pagefind-into-markbind"}},[_c('strong',[_v("Integration of Pagefind into MarkBind")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#integration-of-pagefind-into-markbind","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("It runs after the website framework, and only requires the folder containing the built static files of the website. A short explanation of how it works would be:")]),_v(" "),_c('ul',[_c('li',[_v("PageFind indexes the static files\n"),_c('ul',[_c('li',[_v("If pagefind is included as a plugin, we indexSites with PageFind, which writes the index files _site/pagefind")])])]),_v(" "),_c('li',[_v("Plugin exposes a pagefind JS API for searching\n"),_c('ul',[_c('li',[_v("Alternatively, use pagefind default UI for searching. This is done by processes containers with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("id=\"pagefind-search-input\"")]),_v(", and initialing a default PageFindUI instance on it, not unlike how algolia search works.")])])]),_v(" "),_c('li',[_v("This JS API is used by a custom Vue component searchbar.")])]),_v(" "),_c('h2',{attrs:{"id":"external-tools-technology"}},[_v("External Tools/Technology"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#external-tools-technology","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"research-on-other-ssgs"}},[_v("Research on Other SSGs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#research-on-other-ssgs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("While working on Markbind, I thought that it would definitely be essential to survey other Static Site Generators and the competition faced by MarkBind.")]),_v(" "),_c('p',[_v("Researching other SSGs available (many of which are open source as well) has allowed me to gain a broader picture of the roadmap of MarkBind.")]),_v(" "),_c('p',[_v("For example, Jekyll is simple and beginner-friendly, often paired with GitHub Pages for easy deployment. It has a large theme ecosystem for rapid site creation. Hugo has exceptional build speeds even for large sites. Other SSGs offer multiple rendering modes (SSG, SSR, CSR) on a per page basis, support react etc. Considering that the community for all these other SSGs are much larger and they have much more resources and manpower to devote, I thought about how MarkBind could learn from these other SSGs.")]),_v(" "),_c('h4',{attrs:{"id":"insights-that-could-be-applied-to-markbind"}},[_v("Insights that could be applied to MarkBind"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#insights-that-could-be-applied-to-markbind","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Overall, some insights that can be applied to MarkBind would be to:")]),_v(" "),_c('ul',[_c('li',[_v("Focus on Content-Heavy Instructional Websites\n"),_c('ul',[_c('li',[_v("Double down on features tailored for educational, project documentation, and course websites.")]),_v(" "),_c('li',[_v("Highlight built-in components like popovers, tabs, and collapsible panels as unique differentiators.")])])]),_v(" "),_c('li',[_v("Emphasize \"Out-of-the-Box\" Functionality\n"),_c('ul',[_c('li',[_v("Simplify onboarding and documentation for new users.")]),_v(" "),_c('li',[_v("Provide all essential features for documentation by default (e.g., diagrams, code snippets, multi-level navigation).")]),_v(" "),_c('li',[_v("Position MarkBind as a solution that minimizes configuration while maximizing flexibility.")]),_v(" "),_c('li',[_v("Provide beginner-friendly guides and videos for quick adoption.")])])]),_v(" "),_c('li',[_v("Develop Pre-Built Templates\n"),_c('ul',[_c('li',[_v("Create specialized templates for use cases like course sites, research documentation, or user guides.")]),_v(" "),_c('li',[_v("Create ready-made themes/templates focused on education and documentation.")]),_v(" "),_c('li',[_v("Allow users to deploy quickly with minimal setup.")])])])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"cheah-gee-nung-ian"}},[_v("CHEAH GEE NUNG, IAN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cheah-gee-nung-ian","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/IanCheah/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/IanCheah"}},[_v("https://www.github.com/IanCheah")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Progress so far")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Working on PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2468"}},[_v("Allow users to define the height/width in percentages for Pic and Annotate")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-2"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h1',{attrs:{"id":"specific-to-vue"}},[_v("Specific to Vue"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#specific-to-vue","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"1-components-of-vue"}},[_v("1. Components of Vue"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-components-of-vue","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("A Vue component typically consists of three main sections.")]),_v(" "),_c('ul',[_c('li',[_v("Template: this defines the HTML structure")]),_v(" "),_c('li',[_v("Script: Contains the logic and data for the component")]),_v(" "),_c('li',[_v("Style: Defines the CSS specific to the component")])]),_v(" "),_c('h3',{attrs:{"id":"2-using-computed-properties-in-vue-js"}},[_v("2. Using Computed Properties in Vue.js"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-using-computed-properties-in-vue-js","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("When doing experimental changes, I thought of letting users specify things like font size, font type, etc. Upon looking up the other components and stackoverflow, this is what I found")]),_v(" "),_c('ul',[_c('li',[_v("In a basic Vue component, we can define a computed property by plaing it in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("computed")]),_v(" option. These\nproperties are automatically updates when the underlying data changes.")])]),_v(" "),_c('h1',{attrs:{"id":"others"}},[_v("Others"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#others","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"1-adding-hyperlinks-in-html-and-markdown"}},[_v("1. Adding Hyperlinks in HTML and Markdown"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-adding-hyperlinks-in-html-and-markdown","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("When writing in Markdown, hyperlinks are created using a specific syntax, but behind the scenes, this Markdown code is converted into HTML.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("In Markdown, we use syntax like "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("[Java Docs](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)")]),_v(" to create a hyperlink. When the Markdown is converted to HTML, it generates an anchor tag in the form of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Java Docs")]),_v(". This would open the link in the same tab, as no additional attributes are specified.")])]),_v(" "),_c('li',[_c('p',[_v("In contrast, when we write HTML durectly, we can specify additional attributes, such as "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("target=\"_blank\"")]),_v(", to control how the link behaves. Using the same example, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("User Guide: Templates")]),_v(" will ensure that the link opens in a new tab.")])])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"javier-tan-meng-wee"}},[_v("JAVIER TAN MENG WEE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#javier-tan-meng-wee","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/Incogdino/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/Incogdino"}},[_v("https://github.com/Incogdino")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("Markbind")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"markbind-3"}},[_v("MarkBind"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("0")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2580"}},[_v("Update copy plugin #2580")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2586"}},[_v("Fix broken annotation label #2586")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Reviewed issue: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2559"}},[_v("Boxes: give a way to omit the icon #2559")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Reviewing issue: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2587"}},[_v("Inconsistent behavior with mcq questions allowing multiple correct answers #2587")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Reviewing issue: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2588"}},[_v("Better feedback when hovering labels #2588")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"vue-components"}},[_v("Vue components"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#vue-components","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Properties are being passed to vue components as props. These properties specifies the different configurations of the html templates.")]),_v(" "),_c('li',[_v("Content passed by the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("slots")]),_v(" API are considered to be owned by the parent component that passes them in and so styles do not apply to them. To apply styles to these components, target the surrounding container and then the style using a CSS selector such as "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".someClass > *")])])]),_v(" "),_c('h4',{attrs:{"id":"testing"}},[_v("Testing:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Vue component test utilities library: "),_c('a',{attrs:{"href":"https://v1.test-utils.vuejs.org/api/wrapper/#properties"}},[_v("Wrapper")])]),_v(" "),_c('p',[_v("According to my current understanding:")]),_v(" "),_c('ul',[_c('li',[_v("Testing is done by first creating a wrapper with the component to be tested.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("$nextTick()")]),_v(" function of the vm of the wrapper is then called which waits for the next DOM update flush.")]),_v(" "),_c('li',[_v("The generated HTML is then compared with the snapshot that is generated.")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"yu-chenbo"}},[_v("YU CHENBO"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#yu-chenbo","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/yyccbb/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/yyccbb"}},[_v("https://www.github.com/yyccbb")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-3"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-2"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_m(11),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"alexander-liswandy"}},[_v("ALEXANDER LISWANDY"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#alexander-liswandy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/Airiinnn/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/Airiinnn"}},[_v("https://www.github.com/Airiinnn")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense"}},[_v("RepoSense")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-4"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-3"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"chen-yixun"}},[_v("CHEN YIXUN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chen-yixun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/CYX22222003/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/CYX22222003"}},[_v("https://www.github.com/CYX22222003")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/RepoSense"}},[_v("RepoSense")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2267"}},[_v("Hints containing outdated classes in the developer guide #2267")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Contributed to issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2262"}},[_v("Old dashboards failing due to com.google.gson.JsonIOException #2262")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Created PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2270"}},[_v("Update Gson builder type adapter adding method")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"gradle"}},[_v("Gradle"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#gradle","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("The Gradle build typically include three phases: initialization, configuration and execution.")]),_v(" "),_c('p',[_v("There are four fundamental components in Gradle: Projects, build scripts, tasks and plugin.")]),_v(" "),_c('p',[_v("A project typically corresponds to a software component that needs to be built, like a library or an application. It might represent a library JAR, a web application, or a distribution ZIP assembled from the JARs produced by other projects. There is a one-to-one relationship between projects and build scripts.")]),_v(" "),_c('p',[_v("The build script configures the project based on certain rules. It can add plugins to the build process, load dependencies and set up and configure tasks, i.e. individual unit of work that the build process will perform. Plugins can introduce new tasks, object and conventions to abstract duplicating configuration block, increasing the modularity and reusability fo the buld script.")]),_v(" "),_c('p',[_v("Resources:")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://tomgregory.com/gradle/gradle-tutorial-for-complete-beginners"}},[_v("https://tomgregory.com/gradle/gradle-tutorial-for-complete-beginners")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://docs.gradle.org/current/userguide/userguide.html"}},[_v("https://docs.gradle.org/current/userguide/userguide.html")])])]),_v(" "),_c('h3',{attrs:{"id":"vue-framework"}},[_v("Vue framework"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#vue-framework","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"java-gson-library"}},[_v("Java Gson library"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#java-gson-library","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"advanced-git-commands"}},[_v("Advanced git commands"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#advanced-git-commands","onclick":"event.stopPropagation()"}})])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"hing-yen-xing"}},[_v("HING YEN XING"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#hing-yen-xing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/JoanneHing/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/JoanneHing"}},[_v("https://github.com/JoanneHing")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense"}},[_v("Reposense")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Discovered with the team regarding the issue of failing of the application due to incompaible Java version (Java17)")])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Investigated in the issue of the failing CI due to deprecated macOS-12")])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Created PR : "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2260"}},[_v("[#2259] Upgrade GitHub Actions macOS runners to 13, 14 and 15")])])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Created PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2261"}},[_v("[#2252] Add ubuntu-24.04 to CI runners")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Solved the issue of failing Cypress Frontend test due to missing dependencies: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2260#issuecomment-2614490638"}},[_v("Updated the apt indexes")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Solved issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2259"}},[_v("Upgrade GitHub Actions macOS runners to 13 and 14 (and possibly 15) #2259")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Solved issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2252"}},[_v("Add ubuntu-24.04 to CI runners and bump publish-RepoSense runner #2252")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"github-actions"}},[_v("gitHub Actions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#github-actions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_v("I updated the gitHub Action because we noticed that the CI is failing because of deprecated macOS-12, I also updated the ubuntu version to ubuntu-24.04. Through this I learned how to update gitHub action runners to different version for macOS, ubuntu and window. Resource referred from "),_c('a',{attrs:{"href":"https://stackoverflow.com/questions/77781713/using-github-strategy-matrix-to-select-a-runner"}},[_v("stackoverflow")]),_v(". I found that how the gitHub runner is updated using the gitHub strategy matrix.")]),_v(" "),_c('li',[_v("I faced some problem while updating the gitHub Action runner as the Cypress Frontend test was failing because of the environment couldn't be set up properly as some of the dependencies were missing. Fortunately my mentor gave some guidance and I managed to solve the problem at last. Resource reffered from "),_c('a',{attrs:{"href":"https://github.com/cypress-io/cypress-documentation/issues/5816"}},[_v("cypress-documentation issue")]),_v(" provided by my mentor, Si Kai. I also tried installing "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("apt")]),_v(" package as a job for the Cypress Frontend test and it works, but the former solution is more elegant and concise. Resource referred from "),_c('a',{attrs:{"href":"https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/customizing-github-hosted-runners#installing-software-on-ubuntu-runners"}},[_v("GitHub Docs")]),_v(".")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"ng-yin-joe"}},[_v("NG YIN JOE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ng-yin-joe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/joeng03/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/joeng03"}},[_v("https://www.github.com/joeng03")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense"}},[_v("RepoSense")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-5"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-5","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-4"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"wong-li-yuan"}},[_v("WONG LI YUAN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#wong-li-yuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/lyuanww/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/lyuanww"}},[_v("https://github.com/lyuanww")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense"}},[_v("RepoSense")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2265"}},[_v("Outdated suggested solution in developer guide #2265")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2268"}},[_v("Fix outdated suggested solution docs #2268")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"the-distinctions-between-git-and-github-in-reposense"}},[_v("The distinctions between Git and GitHub in RepoSense"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#the-distinctions-between-git-and-github-in-reposense","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("While doing my user experiments on RepoSense, I noticed that the GitHub IDs of contributors were not displayed correctly in the generated contribution dashboards with only the \"--repos\" flag without the config files. This led me to investigate how RepoSense handles GitHub-specific information and how it differs from Git. Since Git logs only contain commit metadata such as author names and emails, RepoSense is unable to capture GitHub-specific information like GitHub IDs. This is because Git and GitHub, while related, are fundamentally different: Git is a version control system that tracks code changes locally, whereas GitHub is a platform built on top of Git that provides additional features like user profiles and collaboration tools. As a result, the current implementation of RepoSense cannot directly link contributions to GitHub profiles without the config files.")])])])],1)],1),_v(" "),_m(12),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"dhiraputta-pathama-tengara"}},[_v("DHIRAPUTTA PATHAMA TENGARA"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dhiraputta-pathama-tengara","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/DhiraPT/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/DhiraPT"}},[_v("https://www.github.com/DhiraPT")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates"}},[_v("TEAMMATES")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/issues/13199"}},[_v("Duplicate Feedback Sessions Appear on Student Page #13199")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-6"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-6","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-5"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-5","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"li-mingyang"}},[_v("LI MINGYANG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#li-mingyang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/mingyang143/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/mingyang143"}},[_v("https://github.com/mingyang143")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES"}},[_v("TEAMMATES")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13200"}},[_v("[#12048] Migrate tests for DeleteAccountActionTest #13200")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13206"}},[_v("[#12048] Migrate tests #13206")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-angular-and-dark-mode-implementation-for-the-frontend"}},[_v("Tool/Technology 1: "),_c('strong',[_v("Angular and Dark Mode Implementation for the frontend")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-angular-and-dark-mode-implementation-for-the-frontend","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"aspects-learned"}},[_v("Aspects Learned"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learned","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('p',[_c('strong',[_v("Angular Component Communication:")])]),_v(" "),_c('ul',[_c('li',[_v("Understanding how child components communicate with parent components using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Output")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("EventEmitter")]),_v(".")]),_v(" "),_c('li',[_v("Applying event binding in parent templates to listen for changes emitted by child components.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Conditional Class Application:")])]),_v(" "),_c('ul',[_c('li',[_v("Dynamically applying CSS classes to elements using Angular’s "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngClass")]),_v(" directive.")]),_v(" "),_c('li',[_v("Dynamically applying CSS classes to elements using Angular’s "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("[class]")]),_v(" binding syntax.")]),_v(" "),_c('li',[_v("Managing theme switching logic in the parent component.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Event Binding:")])]),_v(" "),_c('ul',[_c('li',[_v("Utilizing Angular’s "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("(event)")]),_v(" binding syntax to handle user interactions.")]),_v(" "),_c('li',[_v("For example: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("(change)=\"handleChange($event)\"")]),_v(" to trigger functions when events like "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("change")]),_v(" occur, passing the event object as an argument.")])])])]),_v(" "),_c('h4',{attrs:{"id":"resources-used-and-summary"}},[_v("Resources Used and Summary"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources-used-and-summary","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://angular.io/"}},[_v("Angular Official Documentation")]),_v(":")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://angular.io/guide/component-interaction"}},[_v("Components and Templates")]),_v(": Learned how to use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Output")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("EventEmitter")]),_v(" to enable child-to-parent communication.")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://angular.io/api/common/NgClass"}},[_v("NgClass Directive")]),_v(": Understood how to conditionally apply CSS classes dynamically based on variables.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://www.udemy.com/course/the-complete-guide-to-angular-2/"}},[_v("Udemy Course: \"Angular - The Complete Guide\" by Maximilian Schwarzmüller")]),_v(":")])]),_v(" "),_c('ul',[_c('li',[_v("This course, although I have yet to complete it provided a basic understanding of Angular, including component communication and dynamic class management, which were instrumental in implementing the dark mode feature.")])])])]),_v(" "),_c('h3',{attrs:{"id":"final-thoughts"}},[_v("Final Thoughts"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#final-thoughts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("By combining these resources, I was able to implement a basic dark mode feature that functions effectively but still requires refinement. One key area for improvement is ensuring the dark mode state persists when navigating between routes. Currently, when the route changes (e.g., from "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("localhost:4200/web/")]),_v(" to another route), the boolean variable controlling the dynamic CSS class allocation using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngClass")]),_v(" resets to its default light mode, even if dark mode was active prior to the route change.")]),_v(" "),_c('p',[_v("I suspect this behavior occurs because the page component is re-rendered during navigation, causing the component's state (including the boolean variable) to be re-initialized. To address this, I plan to research and implement a solution to persist the dark mode state. A promising approach might involve using a shared Angular service to store and manage the state globally, ensuring it remains consistent across routes. While I am not yet an expert in Angular, I am confident that further exploration and practice will help me refine this feature.")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"poh-jun-kang"}},[_v("POH JUN KANG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#poh-jun-kang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/InfinityTwo/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/InfinityTwo"}},[_v("https://www.github.com/InfinityTwo")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES"}},[_v("TEAMMATES")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13201"}},[_v("[#12048] Migrate tests for DeleteNotificationActionTest #13201")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13202"}},[_v("Add a show all/collapse all button for students on their submission page #13202")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13203"}},[_v("[#13202] Show/Collapse All button in the student form submission #13203")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13209"}},[_v("[#12048] Migrate tests for CreateNotificationActionTest #13209")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13210"}},[_v("[#12048] Migrate tests for GetNotificationActionTest #13201")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"angular-and-frontend"}},[_v("Angular and Frontend"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-and-frontend","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"aspects-learnt"}},[_v("Aspects Learnt"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learnt","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h5',{attrs:{"id":"components-2"}},[_v("Components"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#components-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Coming from a React background, it was interesting to understand how Angular components work and how it talks to each other. A lot of the features are built in with their custom names like "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngFor")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("(click)")]),_v(" as compared to using JSX. It was very modular in nature which made the learning easier as I can focus on one component without having to break the rest or needing to learn the codebase of more than the surrounding components.")]),_v(" "),_c('h5',{attrs:{"id":"observables"}},[_v("Observables"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#observables","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Angular uses a lot more of observables, emittors and listeners which is based on services to communicate between components. It was very different from React Redux and parent-child that I know of. This was what I had to make use of for one of my first "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13203"}},[_v("PRs #13203")]),_v(" to deal with dynamic child components listening to a hide/show all button.")]),_v(" "),_c('h3',{attrs:{"id":"resources-used"}},[_v("Resources Used"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources-used","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://www.youtube.com/watch?v=3dHNOWTI7H8"}},[_v("Angular Crash Course by Traversy Media")])]),_v(": A crash course for learning how Angular works for developers with some frontend experience. It covers the basics of Angular, including components, services, and routing.")]),_v(" "),_c('h2',{attrs:{"id":"testing-and-mockito"}},[_v("Testing and Mockito"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-and-mockito","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"aspects-learnt-2"}},[_v("Aspects Learnt"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learnt-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h5',{attrs:{"id":"mocking-functions"}},[_v("Mocking functions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#mocking-functions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("The use of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("when()")]),_v(" was rather cool for me coming from JUnit and CS2103T. I did not expect to be able to mock functions and their return values. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("when()")]),_v(" overrides a function call when that provided function is called, and returns the values given with chain functions. It allows me to perform unit tests much more easily as we do not need to worry about the implementation of the method being complete.")]),_v(" "),_c('h3',{attrs:{"id":"resources-used-2"}},[_v("Resources Used"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources-used-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html"}},[_v("Mockito Documentation")])]),_v(": Official documentation for Mockito")]),_v(" "),_c('h2',{attrs:{"id":"docker"}},[_v("Docker"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#docker","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"aspects-learnt-3"}},[_v("Aspects Learnt"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learnt-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h5',{attrs:{"id":"containerised-applications"}},[_v("Containerised Applications"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#containerised-applications","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This was my first time using Docker and it made development much easier by containing our backend in its own sandbox environment. It keeps the application standardised by running on one type of environment and ensures smooth development by not worrying about multiple types of environment to cater and develop for during production.\n...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"teng-wei-loon"}},[_v("TENG WEI LOON"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teng-wei-loon","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/BunnyHoppp/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/BunnyHoppp"}},[_v("https://www.github.com/BunnyHoppp")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates"}},[_v("TEAMMATES")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-7"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-7","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-6"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-6","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"wong-xing-hui-bertrand"}},[_v("WONG XING HUI BERTRAND"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#wong-xing-hui-bertrand","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/peasantbird/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/peasantbird"}},[_v("https://www.github.com/peasantbird")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates"}},[_v("TEAMMATES")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-8"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-8","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-7"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-7","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1)]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs3281-2025-batch"}},[_v("CS3281 - 2025 Batch‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#catcher"}},[_v("CATcher‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#isaac-ng-jun-jie"}},[_v("ISAAC NG JUN JIE‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#koo-yu-cong"}},[_v("KOO YU CONG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#loh-ze-qing-norbert"}},[_v("LOH ZE QING, NORBERT‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#soh-zheng-yang-marcus"}},[_v("SOH ZHENG YANG, MARCUS‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tng-wen-xi"}},[_v("TNG WEN XI‎")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#markbind"}},[_v("MarkBind‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#adrian-leonardo-liang"}},[_v("ADRIAN LEONARDO LIANG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#chan-ger-teck"}},[_v("CHAN GER TECK‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cheah-gee-nung-ian"}},[_v("CHEAH GEE NUNG, IAN‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#javier-tan-meng-wee"}},[_v("JAVIER TAN MENG WEE‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#yu-chenbo"}},[_v("YU CHENBO‎")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#reposense"}},[_v("RepoSense‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#alexander-liswandy"}},[_v("ALEXANDER LISWANDY‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#chen-yixun"}},[_v("CHEN YIXUN‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#hing-yen-xing"}},[_v("HING YEN XING‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#ng-yin-joe"}},[_v("NG YIN JOE‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#wong-li-yuan"}},[_v("WONG LI YUAN‎")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#teammates"}},[_v("TEAMMATES‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#dhiraputta-pathama-tengara"}},[_v("DHIRAPUTTA PATHAMA TENGARA‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#li-mingyang"}},[_v("LI MINGYANG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#poh-jun-kang"}},[_v("POH JUN KANG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#teng-wei-loon"}},[_v("TENG WEI LOON‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#wong-xing-hui-bertrand"}},[_v("WONG XING HUI BERTRAND‎")])])])],1)])],1),_v(" "),_m(13)])}
+with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"fixed":""}},[_c('navbar',{attrs:{"placement":"top","type":"primary"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/2025/index.html","title":"Home"}},[_v("CS3281&2-2025/Students")])]},proxy:true},{key:"right",fn:function(){return [_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"https://github.com/nus-cs3281/2025"}},[_c('span',[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})])])])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link",scopedSlots:_u([{key:"header",fn:function(){return [_v("CS3281")]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/index.html"}},[_v("Students")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/students/knowledge.html"}},[_v("Knowledge")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs3281.github.io/2025-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByAuthors&breakdown=false"}},[_v("Code Dashboard")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/activities-dashboard.html"}},[_v("Activities Dashboard")])])]),_v(" "),_c('dropdown',{staticClass:"nav-link",scopedSlots:_u([{key:"header",fn:function(){return [_v("CS3282")]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/cs3282-index.html"}},[_v("Students")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/students/talksSchedule.html"}},[_v("Lightning Talks")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/2025/activities-dashboard.html"}},[_v("Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/2025/instructions.html"}},[_v("Instructions")])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs3281.github.io/website/"}},[_v("CS3281&2 Website "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-share-alt",attrs:{"aria-hidden":"true"}})])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_m(0),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_m(7),_v(" "),_m(8),_v(" "),_m(9),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"isaac-ng-jun-jie"}},[_v("ISAAC NG JUN JIE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#isaac-ng-jun-jie","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/Izn432/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/IzN432"}},[_v("https://www.github.com/IzN432")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1302"}},[_v("Update to use more typescript types #1302")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1303"}},[_v("Fix formats in the comments #1303")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1302"}},[_v("Solve Github Actions failing for macos-setup-and-tests #394")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Contributed to issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/398"}},[_v("Remove all button doesn't work #398")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"angular"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Angular components are split into three parts, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.ts")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.css")])]),_v(" "),_c('h4',{attrs:{"id":"component-ts"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.ts")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#component-ts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs"}},[_c('span',[_v("@Component({\n")]),_c('span',[_v(" selector: 'app-auth',\n")]),_c('span',[_v(" templateUrl: './auth.component.html',\n")]),_c('span',[_v(" styleUrls: ['./auth.component.css']\n")]),_c('span',[_v("})\n")])])]),_c('p',[_v("This segment is found at the top of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.ts")]),_v(" files.")]),_v(" "),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("selector")]),_v(" indicates the keyword that will be used in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_v(" files to identify this component. For example, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(" ")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("templateUrl")]),_v(" indicates the filepath to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_v(" file.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("styleUrls")]),_v(" indicates the filepath(s) to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.css")]),_v(" file(s).")])]),_v(" "),_c('h4',{attrs:{"id":"component-html"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.html")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#component-html","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This is the template file. Template files use mostly HTML syntax, with a bit of angular specific syntax included. This includes the structural directives such as *ngIf, *ngFor, etc. The "),_c('a',{attrs:{"href":"https://v17.angular.io/guide/architecture-components"}},[_v("documentation")]),_v(" is quite sufficient for understanding the angular syntax.")]),_v(" "),_c('h4',{attrs:{"id":"component-css"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("*.component.css")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#component-css","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This is a stylesheet, using normal css. There is a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("::ng-deep")]),_v(" selector available, which promotes a component style to global style.")]),_v(" "),_c('h3',{attrs:{"id":"arcsecond"}},[_v("Arcsecond"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#arcsecond","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Arcsecond is a string parsing library for javascript. An example arcsecond parser is as follows:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs"}},[_c('span',[_v("export const TutorModerationTodoParser = coroutine(function* () {\n")]),_c('span',[_v(" yield str(TODO_HEADER);\n")]),_c('span',[_v(" yield whitespace;\n")]),_c('span',[_v("\n")]),_c('span',[_v(" const tutorResponses = yield many1(ModerationSectionParser);\n")]),_c('span',[_v("\n")]),_c('span',[_v(" const result: TutorModerationTodoParseResult = {\n")]),_c('span',[_v(" disputesToResolve: tutorResponses\n")]),_c('span',[_v(" };\n")]),_c('span',[_v(" return result;\n")]),_c('span',[_v("});\n")])])]),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("str(TODO_HEADER)")]),_v(" matches the starting of the string with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("TODO_HEADER")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("whitespace")]),_v(" matches the next part of the string with one or more whitespaces.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("many1(ModerationSectionParser)")]),_v(" applies the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ModerationSectionParser")]),_v(" one or more times.")])]),_v(" "),_c('h3',{attrs:{"id":"graphql"}},[_v("GraphQL"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#graphql","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("GraphQL is a architecture for building APIs like REST. Unlike REST where the server defines the structure of the response, in GraphQL, the client and request the exact data they need.")]),_v(" "),_c('h3',{attrs:{"id":"node-14-x-support-on-macos"}},[_v("Node 14.x support on macos"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#node-14-x-support-on-macos","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Apple laptops changed to using ARM64 architecture back in 2020. This meant that Node versions released before then were not directly supported by the ARM64 architecture. This caused issues with the github actions. There is a workaround for this by running "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("arch -x86_64")]),_v(" and manually installing node instead of using the setup-node Github action, but the simpler solution was to upgrade the test to use Node version 16.x.")]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"koo-yu-cong"}},[_v("KOO YU CONG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#koo-yu-cong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/yucongkoo/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/yucongkoo"}},[_v("https://www.github.com/yucongkoo")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Merged PR : "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1291"}},[_v("Fix formatting style of issue-table component")])])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Submitted and Researched Issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues/1292"}},[_v("Playwright Github workflow failing #1292")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1298"}},[_v("Downgrade ubuntu version in playwright.yml #1298")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Participated in Issue Investigation : "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues/1304#issuecomment-2609636737"}},[_v("Workflow failing due to updated nested dependencies #1304")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"nvm-node-version-manager"}},[_v("NVM (Node Version Manager)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#nvm-node-version-manager","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Issue faced: CATcher uses node v16.x while WATcher uses node v14.x, it is hard to switch between node versions quickly when working on both projects")]),_v(" "),_c('p',[_v("Tool used: Used nvm to easily manage and switch between different node versions locally")]),_v(" "),_c('h3',{attrs:{"id":"angular-2"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"components-and-modules"}},[_v("Components and Modules"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#components-and-modules","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("A typical component in Angular consists of 3 files:")]),_v(" "),_c('ul',[_c('li',[_v("A html file that defines the layout of the component")]),_v(" "),_c('li',[_v("A css file that provides styling to the UI")]),_v(" "),_c('li',[_v("A typescript file that controls the logic and behaviour of the application, typically handles the data of the application too")])]),_v(" "),_c('p',[_v("Each component can have a module file where we can state the components/modules that this component is dependent on (i.e. the imports array) and the components that is provided by this module (i.e. the declarations array). This helps increasing the modularity and scalability of the whole application.")]),_v(" "),_c('p',[_v("As a developer coming from React, here are some clear differences I have observed:")]),_v(" "),_c('ul',[_c('li',[_v("There is no concept of states in Angular and the data passing is 2-ways, when the user updates from the UI, the value is automatically updated in the component and vice versa, whereas in React we would have to use states and explicitly update the states via setState or similar functions.")]),_v(" "),_c('li',[_v("Instead of defining the layout of componenet and logic in the same file, Angular split them into 2 seperate files (i.e. the html and typescript file), personally I felt that this split helps enforce the MVC architecture more strictly, but also imposes more restrictions when it comes to components that have tightly coupled logic")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"loh-ze-qing-norbert"}},[_v("LOH ZE QING, NORBERT"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#loh-ze-qing-norbert","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/NorbertLoh/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/NorbertLoh"}},[_v("https://github.com/NorbertLoh")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/pull/1295"}},[_v("Add white-space style to markdown code block css #1295")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues/1299"}},[_v("Invalid tester response example #1299")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/399"}},[_v("Remove magic strings for filters #399")])])]),_v(" "),_c('tr',[_c('td',[_v("4")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/pull/400"}},[_v("Remove magic strings #400")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"ngx-markdown"}},[_v("ngx-markdown"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ngx-markdown","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("I learned about the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngx-markdown")]),_v(" library while I was working on a fix to preserve whitespace when converting Markdown to HTML. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngx-markdown")]),_v(" combines multiple different language parsers and renders them in one library. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngx-markdown")]),_v(" supports Marked, Prism.js, Emoji-Toolkit, KaTeX, Mermaid, and Clipboard.js. I learned about configuring the options for the Markdown HTML element.")]),_v(" "),_c('h3',{attrs:{"id":"marked"}},[_v("Marked"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#marked","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Marked is the main parser we use for our comment editor in creating/editing issues and responses. I learned that any text that we write in Markdown syntax is converted into HTML elements using Marked. I found out that we can actually override how Marked generates the HTML elements, and we can add more attributes like classes, styles, and even modify the text before rendering it.")]),_v(" "),_c('h3',{attrs:{"id":"nvm-windows"}},[_v("nvm-windows"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#nvm-windows","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("WATcher requires node 14 in order to "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("npm install")]),_v(" some of its dependencies. However, instead of having to install and reinstall a different node version between different projects, I can use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("nvm-windows")]),_v(" to install multiple node versions and switch between them. However, the latest version of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("nvm-windows")]),_v(" has some issues if youwant to install node 14. After some debugging, I found out that "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("nvm-windows v1.1.11")]),_v(" can install node 14 with no issues.")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"soh-zheng-yang-marcus"}},[_v("SOH ZHENG YANG, MARCUS"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#soh-zheng-yang-marcus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/HollaG/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/hollag"}},[_v("https://www.github.com/hollag")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Submitted PR "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/pull/391"}},[_v("#391")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Contributed to issue "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/363"}},[_v("#363")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Created issue "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/396"}},[_v("#396")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Created issue "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/401"}},[_v("#401")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"angular-3"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Angular is the main tool used in both CATcher and WATcher. It is based on TypeScript.")]),_v(" "),_c('p',[_v("Angular is a component-based framework.\nEach component is generated with:")]),_v(" "),_c('ol',[_c('li',[_v("*.component.ts")]),_v(" "),_c('li',[_v("*.component.html")]),_v(" "),_c('li',[_v("*.component.css")])]),_v(" "),_c('p',[_v("Component state is maintained in the .ts file. These state variables can be bound to HTML elements through use of curly braces {{}}.")]),_v(" "),_c('p',[_v("Angular offers directives such as ngIf, ngFor that allow us to \"use\" JS in the HTML files.")]),_v(" "),_c('p',[_v("Services are used for processing, for tasks that don't involve what the user sees. This is different from the .component file, which directly handles things the users see.\nServices are kept in a separate directory /services/*.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"tng-wen-xi"}},[_v("TNG WEN XI"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tng-wen-xi","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/wx-03/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/wx-03"}},[_v("https://www.github.com/wx-03")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher"}},[_v("CATcher")]),_v(", "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher"}},[_v("WATcher")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/395"}},[_v("'View current page on GitHub' button uses an invalid filter #395")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Merged PR: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/pull/392"}},[_v("Show issues and PRs without milestones in 'Contributions' preset view #392")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/397"}},[_v("Invalid repo gets saved to suggestions #397")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/WATcher/issues/398"}},[_v("Remove all button doesn't work #398")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"angular-4"}},[_v("Angular"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("CATcher and WATcher are both built using the Angular framework, which is a single-page web appliation framework. Angular comes with a CLI tool to accelerate development.")]),_v(" "),_c('h4',{attrs:{"id":"components"}},[_v("Components"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#components","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Components are the fundamental building blocks of Angular applications.")]),_v(" "),_c('li',[_v("Generating a component will create a TypeScript file, a HTML file, a CSS file, and a test file.")]),_v(" "),_c('li',[_v("The TypeScript class defines the interaction of the HTML template and the rendered DOM structure, while the style sheet describes its appearance.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Component")]),_v(" decorator in the .ts file identifies the class immediately below it as a component class, and specifies its metadata. It associates a template with the component by referencing the .html file (or with inline code).")]),_v(" "),_c('li',[_v("Template syntax\n"),_c('ul',[_c('li',[_v("A template contains regular html as well as Angular template syntax, which alters the HTML based on the application's logic and the state of application and DOM data.")]),_v(" "),_c('li',[_v("Templates can use:\n"),_c('ul',[_c('li',[_v("Data binding")]),_v(" "),_c('li',[_v("Pipes")]),_v(" "),_c('li',[_v("Directives")])])])])])])])])],1)],1),_v(" "),_m(10),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"adrian-leonardo-liang"}},[_v("ADRIAN LEONARDO LIANG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adrian-leonardo-liang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/AgentHagu/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/AgentHagu"}},[_v("https://github.com/AgentHagu")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"markbind-2"}},[_v("MarkBind"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2584"}},[_v("Add optional absolute char indexing for highlighting #2584")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Responded to contributor queries: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2584"}},[_v("#2584")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"markbind-highlighter-component"}},[_v("MarkBind Highlighter Component"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-highlighter-component","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Learned the underlying workings of MarkBind's Highlighter component and how it parses highlighter rules in order to determine the characters or lines to highlight. Learned how to implement an enhancement to the existing feature and add relevant tests and documentation.")]),_v(" "),_c('h3',{attrs:{"id":"typescript"}},[_v("TypeScript"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#typescript","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("TypeScript is a programming language that builds upon JavaScript by adding static typing, enabling developers to catch errors at compile time and write more maintainable code as compared to JavaScript.")]),_v(" "),_c('h4',{attrs:{"id":"resources"}},[_v("Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('a',{attrs:{"href":"https://www.typescriptlang.org/docs/handbook/intro.html"}},[_v("TypeScript Handbook")]),_v(" - Official documentation for TypeScript")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"chan-ger-teck"}},[_v("CHAN GER TECK"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chan-ger-teck","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/gerteck/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/gerteck"}},[_v("https://www.github.com/gerteck")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"summary"}},[_v("Summary"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#summary","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Over the semester, I will be working on MarkBind.")]),_v(" "),_c('p',[_v("The work will build on previous work done, recorded "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1PjA6jfa7G_ZNjc8zSWi1hVSMmhbrGUY95k0ytyDCo-Y/edit?usp=sharing"}},[_v("here")])]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2568"}},[_v("Add Pagefind Plugin #2568")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Reviewed PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2584"}},[_v("#2584")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology"}},[_v("Tool/Technology"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h2',{attrs:{"id":"internal-tools-technology"}},[_v("Internal Tools/Technology"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#internal-tools-technology","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"markbind-s-search-utility"}},[_v("Markbind's Search Utility"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-s-search-utility","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"how-native-markbind-search-works"}},[_v("How Native MarkBind Search works"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how-native-markbind-search-works","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Collection of Title and headings in generation:")])]),_v(" "),_c('ul',[_c('li',[_v("We trace the website generation in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Site/index.ts")]),_v(".")]),_v(" "),_c('li',[_v("When building source files, during the page generation process, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Page.collectHeadingsAndKeywords")]),_v(" records headings and keywords inside rendered page into this.headings and this.keywords respectively.")]),_v(" "),_c('li',[_v("When writing site data, the title, headings, keywords are collected into pages object.")])]),_v(" "),_c('p',[_c('strong',[_v("Page Generation and Vue Initialization")])]),_v(" "),_c('ul',[_c('li',[_v("In "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("core-web/src/index.js")]),_v(", the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("setupWithSearch()")]),_v(" updates the SearchData by collecting the pages from the site data.\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("setupWithSearch()")]),_v(" is added as a script in the file template "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("page.njk")]),_v(" used to render the HTML structure of Markbind pages.")]),_v(" "),_c('li',[_v("This file template is used during the page generation process.")])])]),_v(" "),_c('li',[_v("Note also that "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("VueCommonAppFactory.js")]),_v(" provides a factory function (appFactory) to set up the common data and methods for Vue application shared between server-side and client-side, and provides the common data properties and methods.\n"),_c('ul',[_c('li',[_v("In particular, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchData[]")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchCallback()")]),_v(", which are relevant in the following portion.")]),_v(" "),_c('li',[_v("When using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("")]),_v(", this is where to use MarkBind's search functionality, we set the appropriate values: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(" ")])])])])]),_v(" "),_c('p',[_c('strong',[_v("Vue Components: Searchbar/SearchbarPageItem.vue")]),_v(" "),_c('strong',[_v("Searchbar.vue")])]),_v(" "),_c('ul',[_c('li',[_v("The searchbar uses the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchData[]")]),_v(" in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("data")]),_v(", filters and ranks the data based on keyword matches and populates the dropdown with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchbarPageItems")]),_v(".")]),_v(" "),_c('li',[_v("It calls the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("on-hit")]),_v(" function (which "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchCallback")]),_v(" is passed into) when a search result is selected.")]),_v(" "),_c('li',[_v("Presentation wise, each search result is represented by a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("searchbar-pageitem")]),_v(" vue component.")])]),_v(" "),_c('p',[_c('strong',[_v("SearchbarPageItem.vue")])]),_v(" "),_c('ul',[_c('li',[_v("Presents the component conditionally based on whether item is a heading or a page title.")])]),_v(" "),_c('h4',{attrs:{"id":"how-the-new-markbind-pagefind-plugin-works"}},[_v("How the new Markbind PageFind Plugin Works"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how-the-new-markbind-pagefind-plugin-works","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("About "),_c('a',{attrs:{"href":"https://pagefind.app/"}},[_v("PageFind")]),_v(": A fully static search library that aims to perform well on large sites, while using as little of users bandwidth\nas possible, and without hosting any infrastructure.")]),_v(" "),_c('p',[_c('strong',[_v("Documentation:")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://pagefind.app/docs/node-api/"}},[_v("PageFind NodeJS Indexing API")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/CloudCannon/pagefind/blob/production-docs/pagefind_web_js/types/index.d.ts"}},[_v("The types returned by Pagefind’s JavaScript search API")])])]),_v(" "),_c('h4',{attrs:{"id":"integration-of-pagefind-into-markbind"}},[_c('strong',[_v("Integration of Pagefind into MarkBind")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#integration-of-pagefind-into-markbind","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("It runs after the website framework, and only requires the folder containing the built static files of the website. A short explanation of how it works would be:")]),_v(" "),_c('ul',[_c('li',[_v("PageFind indexes the static files\n"),_c('ul',[_c('li',[_v("If pagefind is included as a plugin, we indexSites with PageFind, which writes the index files _site/pagefind")])])]),_v(" "),_c('li',[_v("Plugin exposes a pagefind JS API for searching\n"),_c('ul',[_c('li',[_v("Alternatively, use pagefind default UI for searching. This is done by processes containers with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("id=\"pagefind-search-input\"")]),_v(", and initialing a default PageFindUI instance on it, not unlike how algolia search works.")])])]),_v(" "),_c('li',[_v("This JS API is used by a custom Vue component searchbar.")])]),_v(" "),_c('h2',{attrs:{"id":"external-tools-technology"}},[_v("External Tools/Technology"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#external-tools-technology","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"research-on-other-ssgs"}},[_v("Research on Other SSGs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#research-on-other-ssgs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("While working on Markbind, I thought that it would definitely be essential to survey other Static Site Generators and the competition faced by MarkBind.")]),_v(" "),_c('p',[_v("Researching other SSGs available (many of which are open source as well) has allowed me to gain a broader picture of the roadmap of MarkBind.")]),_v(" "),_c('p',[_v("For example, Jekyll is simple and beginner-friendly, often paired with GitHub Pages for easy deployment. It has a large theme ecosystem for rapid site creation. Hugo has exceptional build speeds even for large sites. Other SSGs offer multiple rendering modes (SSG, SSR, CSR) on a per page basis, support react etc. Considering that the community for all these other SSGs are much larger and they have much more resources and manpower to devote, I thought about how MarkBind could learn from these other SSGs.")]),_v(" "),_c('h4',{attrs:{"id":"insights-that-could-be-applied-to-markbind"}},[_v("Insights that could be applied to MarkBind"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#insights-that-could-be-applied-to-markbind","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Overall, some insights that can be applied to MarkBind would be to:")]),_v(" "),_c('ul',[_c('li',[_v("Focus on Content-Heavy Instructional Websites\n"),_c('ul',[_c('li',[_v("Double down on features tailored for educational, project documentation, and course websites.")]),_v(" "),_c('li',[_v("Highlight built-in components like popovers, tabs, and collapsible panels as unique differentiators.")])])]),_v(" "),_c('li',[_v("Emphasize \"Out-of-the-Box\" Functionality\n"),_c('ul',[_c('li',[_v("Simplify onboarding and documentation for new users.")]),_v(" "),_c('li',[_v("Provide all essential features for documentation by default (e.g., diagrams, code snippets, multi-level navigation).")]),_v(" "),_c('li',[_v("Position MarkBind as a solution that minimizes configuration while maximizing flexibility.")]),_v(" "),_c('li',[_v("Provide beginner-friendly guides and videos for quick adoption.")])])]),_v(" "),_c('li',[_v("Develop Pre-Built Templates\n"),_c('ul',[_c('li',[_v("Create specialized templates for use cases like course sites, research documentation, or user guides.")]),_v(" "),_c('li',[_v("Create ready-made themes/templates focused on education and documentation.")]),_v(" "),_c('li',[_v("Allow users to deploy quickly with minimal setup.")])])])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"cheah-gee-nung-ian"}},[_v("CHEAH GEE NUNG, IAN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cheah-gee-nung-ian","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/IanCheah/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/IanCheah"}},[_v("https://www.github.com/IanCheah")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Progress so far")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Working on PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2468"}},[_v("Allow users to define the height/width in percentages for Pic and Annotate")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-2"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h1',{attrs:{"id":"specific-to-vue"}},[_v("Specific to Vue"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#specific-to-vue","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"1-components-of-vue"}},[_v("1. Components of Vue"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-components-of-vue","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("A Vue component typically consists of three main sections.")]),_v(" "),_c('ul',[_c('li',[_v("Template: this defines the HTML structure")]),_v(" "),_c('li',[_v("Script: Contains the logic and data for the component")]),_v(" "),_c('li',[_v("Style: Defines the CSS specific to the component")])]),_v(" "),_c('h3',{attrs:{"id":"2-using-computed-properties-in-vue-js"}},[_v("2. Using Computed Properties in Vue.js"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-using-computed-properties-in-vue-js","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("When doing experimental changes, I thought of letting users specify things like font size, font type, etc. Upon looking up the other components and stackoverflow, this is what I found")]),_v(" "),_c('ul',[_c('li',[_v("In a basic Vue component, we can define a computed property by plaing it in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("computed")]),_v(" option. These\nproperties are automatically updates when the underlying data changes.")])]),_v(" "),_c('h1',{attrs:{"id":"others"}},[_v("Others"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#others","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"1-adding-hyperlinks-in-html-and-markdown"}},[_v("1. Adding Hyperlinks in HTML and Markdown"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-adding-hyperlinks-in-html-and-markdown","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("When writing in Markdown, hyperlinks are created using a specific syntax, but behind the scenes, this Markdown code is converted into HTML.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("In Markdown, we use syntax like "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("[Java Docs](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)")]),_v(" to create a hyperlink. When the Markdown is converted to HTML, it generates an anchor tag in the form of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Java Docs")]),_v(". This would open the link in the same tab, as no additional attributes are specified.")])]),_v(" "),_c('li',[_c('p',[_v("In contrast, when we write HTML durectly, we can specify additional attributes, such as "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("target=\"_blank\"")]),_v(", to control how the link behaves. Using the same example, "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("User Guide: Templates")]),_v(" will ensure that the link opens in a new tab.")])])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"javier-tan-meng-wee"}},[_v("JAVIER TAN MENG WEE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#javier-tan-meng-wee","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/Incogdino/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/Incogdino"}},[_v("https://github.com/Incogdino")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("Markbind")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"markbind-3"}},[_v("MarkBind"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markbind-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("0")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2580"}},[_v("Update copy plugin #2580")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Authored PR: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/pull/2586"}},[_v("Fix broken annotation label #2586")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Reviewed issue: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2559"}},[_v("Boxes: give a way to omit the icon #2559")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Reviewing issue: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2587"}},[_v("Inconsistent behavior with mcq questions allowing multiple correct answers #2587")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Reviewing issue: "),_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind/issues/2588"}},[_v("Better feedback when hovering labels #2588")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"vue-components"}},[_v("Vue components"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#vue-components","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Properties are being passed to vue components as props. These properties specifies the different configurations of the html templates.")]),_v(" "),_c('li',[_v("Content passed by the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("slots")]),_v(" API are considered to be owned by the parent component that passes them in and so styles do not apply to them. To apply styles to these components, target the surrounding container and then the style using a CSS selector such as "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".someClass > *")])])]),_v(" "),_c('h4',{attrs:{"id":"testing"}},[_v("Testing:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Vue component test utilities library: "),_c('a',{attrs:{"href":"https://v1.test-utils.vuejs.org/api/wrapper/#properties"}},[_v("Wrapper")])]),_v(" "),_c('p',[_v("According to my current understanding:")]),_v(" "),_c('ul',[_c('li',[_v("Testing is done by first creating a wrapper with the component to be tested.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("$nextTick()")]),_v(" function of the vm of the wrapper is then called which waits for the next DOM update flush.")]),_v(" "),_c('li',[_v("The generated HTML is then compared with the snapshot that is generated.")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"yu-chenbo"}},[_v("YU CHENBO"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#yu-chenbo","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/yyccbb/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/yyccbb"}},[_v("https://www.github.com/yyccbb")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/MarkBind/markbind"}},[_v("MarkBind")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-3"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-2"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_m(11),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"alexander-liswandy"}},[_v("ALEXANDER LISWANDY"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#alexander-liswandy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/Airiinnn/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/Airiinnn"}},[_v("https://www.github.com/Airiinnn")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense"}},[_v("RepoSense")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-4"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-3"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"chen-yixun"}},[_v("CHEN YIXUN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chen-yixun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/CYX22222003/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/CYX22222003"}},[_v("https://www.github.com/CYX22222003")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/RepoSense"}},[_v("RepoSense")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2267"}},[_v("Hints containing outdated classes in the developer guide #2267")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Contributed to issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2262"}},[_v("Old dashboards failing due to com.google.gson.JsonIOException #2262")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Created PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2270"}},[_v("Update Gson builder type adapter adding method")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"gradle"}},[_v("Gradle"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#gradle","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("The Gradle build typically include three phases: initialization, configuration and execution.")]),_v(" "),_c('p',[_v("There are four fundamental components in Gradle: Projects, build scripts, tasks and plugin.")]),_v(" "),_c('p',[_v("A project typically corresponds to a software component that needs to be built, like a library or an application. It might represent a library JAR, a web application, or a distribution ZIP assembled from the JARs produced by other projects. There is a one-to-one relationship between projects and build scripts.")]),_v(" "),_c('p',[_v("The build script configures the project based on certain rules. It can add plugins to the build process, load dependencies and set up and configure tasks, i.e. individual unit of work that the build process will perform. Plugins can introduce new tasks, object and conventions to abstract duplicating configuration block, increasing the modularity and reusability fo the buld script.")]),_v(" "),_c('p',[_v("Resources:")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://tomgregory.com/gradle/gradle-tutorial-for-complete-beginners"}},[_v("https://tomgregory.com/gradle/gradle-tutorial-for-complete-beginners")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://docs.gradle.org/current/userguide/userguide.html"}},[_v("https://docs.gradle.org/current/userguide/userguide.html")])])]),_v(" "),_c('h3',{attrs:{"id":"vue-framework"}},[_v("Vue framework"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#vue-framework","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"java-gson-library"}},[_v("Java Gson library"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#java-gson-library","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"advanced-git-commands"}},[_v("Advanced git commands"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#advanced-git-commands","onclick":"event.stopPropagation()"}})])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"hing-yen-xing"}},[_v("HING YEN XING"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#hing-yen-xing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/JoanneHing/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/JoanneHing"}},[_v("https://github.com/JoanneHing")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense"}},[_v("Reposense")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Discovered with the team regarding the issue of failing of the application due to incompaible Java version (Java17)")])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Investigated in the issue of the failing CI due to deprecated macOS-12")])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Created PR : "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2260"}},[_v("[#2259] Upgrade GitHub Actions macOS runners to 13, 14 and 15")])])]),_v(" "),_c('tr',[_c('td',[_v("1")]),_v(" "),_c('td',[_v("Created PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2261"}},[_v("[#2252] Add ubuntu-24.04 to CI runners")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Solved the issue of failing Cypress Frontend test due to missing dependencies: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2260#issuecomment-2614490638"}},[_v("Updated the apt indexes")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Solved issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2259"}},[_v("Upgrade GitHub Actions macOS runners to 13 and 14 (and possibly 15) #2259")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Solved issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2252"}},[_v("Add ubuntu-24.04 to CI runners and bump publish-RepoSense runner #2252")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"github-actions"}},[_v("gitHub Actions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#github-actions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_v("I updated the gitHub Action because we noticed that the CI is failing because of deprecated macOS-12, I also updated the ubuntu version to ubuntu-24.04. Through this I learned how to update gitHub action runners to different version for macOS, ubuntu and window. Resource referred from "),_c('a',{attrs:{"href":"https://stackoverflow.com/questions/77781713/using-github-strategy-matrix-to-select-a-runner"}},[_v("stackoverflow")]),_v(". I found that how the gitHub runner is updated using the gitHub strategy matrix.")]),_v(" "),_c('li',[_v("I faced some problem while updating the gitHub Action runner as the Cypress Frontend test was failing because of the environment couldn't be set up properly as some of the dependencies were missing. Fortunately my mentor gave some guidance and I managed to solve the problem at last. Resource reffered from "),_c('a',{attrs:{"href":"https://github.com/cypress-io/cypress-documentation/issues/5816"}},[_v("cypress-documentation issue")]),_v(" provided by my mentor, Si Kai. I also tried installing "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("apt")]),_v(" package as a job for the Cypress Frontend test and it works, but the former solution is more elegant and concise. Resource referred from "),_c('a',{attrs:{"href":"https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/customizing-github-hosted-runners#installing-software-on-ubuntu-runners"}},[_v("GitHub Docs")]),_v(".")])])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"ng-yin-joe"}},[_v("NG YIN JOE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ng-yin-joe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/joeng03/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/joeng03"}},[_v("https://www.github.com/joeng03")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense"}},[_v("RepoSense")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-5"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-5","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-4"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"wong-li-yuan"}},[_v("WONG LI YUAN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#wong-li-yuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/lyuanww/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/lyuanww"}},[_v("https://github.com/lyuanww")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense"}},[_v("RepoSense")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2265"}},[_v("Outdated suggested solution in developer guide #2265")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2268"}},[_v("Fix outdated suggested solution docs #2268")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Investigated Issue: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues/2213"}},[_v("The hr element in title.md and blurbs.md is not appearing in the generated report #2213")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Submitted PR: "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/2279"}},[_v("Fix hr element not appearing in report #2279")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"the-distinctions-between-git-and-github-in-reposense"}},[_v("The distinctions between Git and GitHub in RepoSense"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#the-distinctions-between-git-and-github-in-reposense","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("While doing my user experiments on RepoSense, I noticed that the GitHub IDs of contributors were not displayed correctly in the generated contribution dashboards with only the \"--repos\" flag without the config files. This led me to investigate how RepoSense handles GitHub-specific information and how it differs from Git. Since Git logs only contain commit metadata such as author names and emails, RepoSense is unable to capture GitHub-specific information like GitHub IDs. This is because Git and GitHub, while related, are fundamentally different: Git is a version control system that tracks code changes locally, whereas GitHub is a platform built on top of Git that provides additional features like user profiles and collaboration tools. As a result, the current implementation of RepoSense cannot directly link contributions to GitHub profiles without the config files.")]),_v(" "),_c('h3',{attrs:{"id":"normalize-css"}},[_v("Normalize.css"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#normalize-css","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("While researching an issue about "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("
")]),_v(" elements in the Markdown files not appearing in the Reposense report, I discovered about the functionality of normalize.css, which provides default styling for this element along with many others. This CSS normalization ensures consistent rendering across different browsers by correcting bugs and browser inconsistencies for more predictable website styling.")])])])],1)],1),_v(" "),_m(12),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"dhiraputta-pathama-tengara"}},[_v("DHIRAPUTTA PATHAMA TENGARA"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dhiraputta-pathama-tengara","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/DhiraPT/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/DhiraPT"}},[_v("https://www.github.com/DhiraPT")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates"}},[_v("TEAMMATES")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("Achievements")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/issues/13199"}},[_v("Duplicate Feedback Sessions Appear on Student Page #13199")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-6"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-6","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-5"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-5","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"li-mingyang"}},[_v("LI MINGYANG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#li-mingyang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/mingyang143/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/mingyang143"}},[_v("https://github.com/mingyang143")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES"}},[_v("TEAMMATES")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("Project2")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13200"}},[_v("[#12048] Migrate tests for DeleteAccountActionTest #13200")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13206"}},[_v("[#12048] Migrate tests #13206")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-angular-and-dark-mode-implementation-for-the-frontend"}},[_v("Tool/Technology 1: "),_c('strong',[_v("Angular and Dark Mode Implementation for the frontend")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-angular-and-dark-mode-implementation-for-the-frontend","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h4',{attrs:{"id":"aspects-learned"}},[_v("Aspects Learned"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learned","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('p',[_c('strong',[_v("Angular Component Communication:")])]),_v(" "),_c('ul',[_c('li',[_v("Understanding how child components communicate with parent components using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Output")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("EventEmitter")]),_v(".")]),_v(" "),_c('li',[_v("Applying event binding in parent templates to listen for changes emitted by child components.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Conditional Class Application:")])]),_v(" "),_c('ul',[_c('li',[_v("Dynamically applying CSS classes to elements using Angular’s "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngClass")]),_v(" directive.")]),_v(" "),_c('li',[_v("Dynamically applying CSS classes to elements using Angular’s "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("[class]")]),_v(" binding syntax.")]),_v(" "),_c('li',[_v("Managing theme switching logic in the parent component.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Event Binding:")])]),_v(" "),_c('ul',[_c('li',[_v("Utilizing Angular’s "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("(event)")]),_v(" binding syntax to handle user interactions.")]),_v(" "),_c('li',[_v("For example: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("(change)=\"handleChange($event)\"")]),_v(" to trigger functions when events like "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("change")]),_v(" occur, passing the event object as an argument.")])])])]),_v(" "),_c('h4',{attrs:{"id":"resources-used-and-summary"}},[_v("Resources Used and Summary"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources-used-and-summary","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://angular.io/"}},[_v("Angular Official Documentation")]),_v(":")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://angular.io/guide/component-interaction"}},[_v("Components and Templates")]),_v(": Learned how to use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Output")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("EventEmitter")]),_v(" to enable child-to-parent communication.")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://angular.io/api/common/NgClass"}},[_v("NgClass Directive")]),_v(": Understood how to conditionally apply CSS classes dynamically based on variables.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://www.udemy.com/course/the-complete-guide-to-angular-2/"}},[_v("Udemy Course: \"Angular - The Complete Guide\" by Maximilian Schwarzmüller")]),_v(":")])]),_v(" "),_c('ul',[_c('li',[_v("This course, although I have yet to complete it provided a basic understanding of Angular, including component communication and dynamic class management, which were instrumental in implementing the dark mode feature.")])])])]),_v(" "),_c('h3',{attrs:{"id":"final-thoughts"}},[_v("Final Thoughts"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#final-thoughts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("By combining these resources, I was able to implement a basic dark mode feature that functions effectively but still requires refinement. One key area for improvement is ensuring the dark mode state persists when navigating between routes. Currently, when the route changes (e.g., from "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("localhost:4200/web/")]),_v(" to another route), the boolean variable controlling the dynamic CSS class allocation using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngClass")]),_v(" resets to its default light mode, even if dark mode was active prior to the route change.")]),_v(" "),_c('p',[_v("I suspect this behavior occurs because the page component is re-rendered during navigation, causing the component's state (including the boolean variable) to be re-initialized. To address this, I plan to research and implement a solution to persist the dark mode state. A promising approach might involve using a shared Angular service to store and manage the state globally, ensuring it remains consistent across routes. While I am not yet an expert in Angular, I am confident that further exploration and practice will help me refine this feature.")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"poh-jun-kang"}},[_v("POH JUN KANG"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#poh-jun-kang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/InfinityTwo/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/InfinityTwo"}},[_v("https://www.github.com/InfinityTwo")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES"}},[_v("TEAMMATES")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Week")]),_v(" "),_c('th',[_v("PR")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13201"}},[_v("[#12048] Migrate tests for DeleteNotificationActionTest #13201")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Submitted Issue: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13202"}},[_v("Add a show all/collapse all button for students on their submission page #13202")])])]),_v(" "),_c('tr',[_c('td',[_v("2")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13203"}},[_v("[#13202] Show/Collapse All button in the student form submission #13203")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13209"}},[_v("[#12048] Migrate tests for CreateNotificationActionTest #13209")])])]),_v(" "),_c('tr',[_c('td',[_v("3")]),_v(" "),_c('td',[_v("Opened PR: "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13210"}},[_v("[#12048] Migrate tests for GetNotificationActionTest #13201")])])])])])])])]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"angular-and-frontend"}},[_v("Angular and Frontend"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#angular-and-frontend","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"aspects-learnt"}},[_v("Aspects Learnt"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learnt","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h5',{attrs:{"id":"components-2"}},[_v("Components"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#components-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Coming from a React background, it was interesting to understand how Angular components work and how it talks to each other. A lot of the features are built in with their custom names like "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ngFor")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("(click)")]),_v(" as compared to using JSX. It was very modular in nature which made the learning easier as I can focus on one component without having to break the rest or needing to learn the codebase of more than the surrounding components.")]),_v(" "),_c('h5',{attrs:{"id":"observables"}},[_v("Observables"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#observables","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Angular uses a lot more of observables, emittors and listeners which is based on services to communicate between components. It was very different from React Redux and parent-child that I know of. This was what I had to make use of for one of my first "),_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates/pull/13203"}},[_v("PRs #13203")]),_v(" to deal with dynamic child components listening to a hide/show all button.")]),_v(" "),_c('h3',{attrs:{"id":"resources-used"}},[_v("Resources Used"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources-used","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://www.youtube.com/watch?v=3dHNOWTI7H8"}},[_v("Angular Crash Course by Traversy Media")])]),_v(": A crash course for learning how Angular works for developers with some frontend experience. It covers the basics of Angular, including components, services, and routing.")]),_v(" "),_c('h2',{attrs:{"id":"testing-and-mockito"}},[_v("Testing and Mockito"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-and-mockito","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"aspects-learnt-2"}},[_v("Aspects Learnt"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learnt-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h5',{attrs:{"id":"mocking-functions"}},[_v("Mocking functions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#mocking-functions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("The use of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("when()")]),_v(" was rather cool for me coming from JUnit and CS2103T. I did not expect to be able to mock functions and their return values. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("when()")]),_v(" overrides a function call when that provided function is called, and returns the values given with chain functions. It allows me to perform unit tests much more easily as we do not need to worry about the implementation of the method being complete.")]),_v(" "),_c('h3',{attrs:{"id":"resources-used-2"}},[_v("Resources Used"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources-used-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html"}},[_v("Mockito Documentation")])]),_v(": Official documentation for Mockito")]),_v(" "),_c('h2',{attrs:{"id":"docker"}},[_v("Docker"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#docker","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"aspects-learnt-3"}},[_v("Aspects Learnt"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aspects-learnt-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h5',{attrs:{"id":"containerised-applications"}},[_v("Containerised Applications"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#containerised-applications","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This was my first time using Docker and it made development much easier by containing our backend in its own sandbox environment. It keeps the application standardised by running on one type of environment and ensures smooth development by not worrying about multiple types of environment to cater and develop for during production.\n...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"teng-wei-loon"}},[_v("TENG WEI LOON"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teng-wei-loon","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/BunnyHoppp/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/BunnyHoppp"}},[_v("https://www.github.com/BunnyHoppp")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates"}},[_v("TEAMMATES")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-7"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-7","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-6"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-6","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1),_v(" "),_c('div',[_c('box',[_c('h2',{attrs:{"id":"wong-xing-hui-bertrand"}},[_v("WONG XING HUI BERTRAND"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#wong-xing-hui-bertrand","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col"},[_c('img',{attrs:{"src":"/2025/students/peasantbird/photo.png","width":"100"}}),_c('br')]),_v(" "),_c('div',{staticClass:"col"},[_c('p',[_c('strong',[_v("GitHub:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://www.github.com/peasantbird"}},[_v("https://www.github.com/peasantbird")])]),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("Projects:")]),_v(" "),_c('span',[_c('a',{attrs:{"href":"https://github.com/TEAMMATES/teammates"}},[_v("TEAMMATES")])])])])])]),_v(" "),_c('p'),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Progress")])])]},proxy:true}])},[_v(" "),_c('div')]),_v(" "),_c('panel',{attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Knowledge gained")])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"tool-technology-1-8"}},[_v("Tool/Technology 1"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-1-8","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("List the aspects you learned, and the resources you used to learn them, and a brief summary of each resource.")]),_v(" "),_c('h3',{attrs:{"id":"tool-technology-2-7"}},[_v("Tool/Technology 2"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-technology-2-7","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("...")])])])],1)],1)]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs3281-2025-batch"}},[_v("CS3281 - 2025 Batch‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#catcher"}},[_v("CATcher‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#isaac-ng-jun-jie"}},[_v("ISAAC NG JUN JIE‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#koo-yu-cong"}},[_v("KOO YU CONG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#loh-ze-qing-norbert"}},[_v("LOH ZE QING, NORBERT‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#soh-zheng-yang-marcus"}},[_v("SOH ZHENG YANG, MARCUS‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tng-wen-xi"}},[_v("TNG WEN XI‎")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#markbind"}},[_v("MarkBind‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#adrian-leonardo-liang"}},[_v("ADRIAN LEONARDO LIANG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#chan-ger-teck"}},[_v("CHAN GER TECK‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cheah-gee-nung-ian"}},[_v("CHEAH GEE NUNG, IAN‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#javier-tan-meng-wee"}},[_v("JAVIER TAN MENG WEE‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#yu-chenbo"}},[_v("YU CHENBO‎")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#reposense"}},[_v("RepoSense‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#alexander-liswandy"}},[_v("ALEXANDER LISWANDY‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#chen-yixun"}},[_v("CHEN YIXUN‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#hing-yen-xing"}},[_v("HING YEN XING‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#ng-yin-joe"}},[_v("NG YIN JOE‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#wong-li-yuan"}},[_v("WONG LI YUAN‎")])]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#teammates"}},[_v("TEAMMATES‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#dhiraputta-pathama-tengara"}},[_v("DHIRAPUTTA PATHAMA TENGARA‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#li-mingyang"}},[_v("LI MINGYANG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#poh-jun-kang"}},[_v("POH JUN KANG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#teng-wei-loon"}},[_v("TENG WEI LOON‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#wong-xing-hui-bertrand"}},[_v("WONG XING HUI BERTRAND‎")])])])],1)])],1),_v(" "),_m(13)])}
};
var pageVueStaticRenderFns = [function anonymous(
) {
@@ -44,6 +44,6 @@ with(this){return _c('h1',{attrs:{"id":"reposense"}},[_v("RepoSense"),_c('a',{st
with(this){return _c('h1',{attrs:{"id":"teammates"}},[_v("TEAMMATES"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teammates","onclick":"event.stopPropagation()"}})])}
},function anonymous(
) {
-with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 8:39:13 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
+with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('p',[_v("["),_c('strong',[_v("This site was generated using "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"25"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")])]),_v(" on Sun, 2 Feb 2025, 16:31:02 UTC]"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('small',[_c('small',[_v("favicon.ico of this site was made by "),_c('a',{attrs:{"href":"https://www.flaticon.com/authors/smashicons","title":"Smashicons"}},[_v("Smashicons")]),_v(" from "),_c('a',{attrs:{"href":"https://www.flaticon.com/","title":"Flaticon"}},[_v("www.flaticon.com")]),_v(" is licensed by "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by/3.0/","title":"Creative Commons BY 3.0","target":"_blank"}},[_v("CC 3.0 BY")])])])])])])])}
}];
\ No newline at end of file
diff --git a/instructions.html b/instructions.html
index 74c8b05f..de851fd2 100644
--- a/instructions.html
+++ b/instructions.html
@@ -19,7 +19,7 @@
| 2 | Submitted Issue: [Issue name #223]() |
| 2 | Authored PR (put on hold by request): [PR name 3 #365]() |
| 2 | Responded to contributor queries: [#1234](), [#4567]() |
-
Notes:
- The page is for CS3281&2 work only (i.e., contributions to our own internal projects or work under the CS3282 'External Project' component)
- PR-related contributions: Report only when a PR is merged (or it's finalized in some other way e.g., abandoned)
- Past PRs can be claimed in future weeks, but not the other way around.
- Report each significant achievement in a separate row. You may aggregate multiple minor achievements in to a single row.
[CS3281] Updating the Knowledge Gained Page
Update the knowledge.md
page in your folder with the knowledge of tools/technologies you gained by doing the project.
[CS3282] Updating the Observations Page
Update the observations.md
page in your folder with relevant observations from your work under the 'External Project' component.
+
Notes:
- The page is for CS3281&2 work only (i.e., contributions to our own internal projects or work under the CS3282 'External Project' component)
- PR-related contributions: Report only when a PR is merged (or it's finalized in some other way e.g., abandoned)
- Past PRs can be claimed in future weeks, but not the other way around.
- Report each significant achievement in a separate row. You may aggregate multiple minor achievements in to a single row.
[CS3281] Updating the Knowledge Gained Page
Update the knowledge.md
page in your folder with the knowledge of tools/technologies you gained by doing the project.
[CS3282] Updating the Observations Page
Update the observations.md
page in your folder with relevant observations from your work under the 'External Project' component.
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+Services are kept in a separate directory /services/*. ...
-
+
-
+
+properties are automatically updates when the underlying data changes. Others
1. Adding Hyperlinks in HTML and Markdown
When writing in Markdown, hyperlinks are created using a specific syntax, but behind the scenes, this Markdown code is converted into HTML.
In Markdown, we use syntax like [Java Docs](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)
to create a hyperlink. When the Markdown is converted to HTML, it generates an anchor tag in the form of <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html">Java Docs</a>
. This would open the link in the same tab, as no additional attributes are specified.
In contrast, when we write HTML durectly, we can specify additional attributes, such as target="_blank"
, to control how the link behaves. Using the same example, <a href="https://markbind.org/userGuide/templates.html" target="_blank">User Guide: Templates</a>
will ensure that the link opens in a new tab.
-
+
-
+
-
+
-
+
-
+
+...
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+- Data binding
- Pipes
- Directives
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+