Update hideSensitiveContent.ts

hides more info
This commit is contained in:
2026-03-18 01:56:42 +10:30
parent 45b558373b
commit 098c79bc99
+118 -13
View File
@@ -1,6 +1,8 @@
interface ElementConfig { interface ElementConfig {
selector: string; selector: string;
action: (element: Element) => void; action: (element: Element) => void;
/** When true, element is not added to processedElements so the action runs every time (e.g. overwriting container content) */
alwaysRun?: boolean;
} }
interface ContentConfig { interface ContentConfig {
@@ -77,6 +79,18 @@ const contentConfig: ContentConfig = {
element.textContent = getRandomElement(mockData.assessmentTitles); element.textContent = getRandomElement(mockData.assessmentTitles);
}, },
}, },
assessmentTitleInTooltip: {
selector: ".assessmenttooltip .tooltiptext p",
action: (element) => {
element.textContent = getRandomElement(mockData.assessmentTitles);
},
},
assessmentTitleInDetail: {
selector: "[class*='AssessmentItem__title___'], .assessment-title",
action: (element) => {
element.textContent = getRandomElement(mockData.assessmentTitles);
},
},
assessmentSubject: { assessmentSubject: {
selector: ".upcoming-assessment .upcoming-details h5", selector: ".upcoming-assessment .upcoming-details h5",
action: (element) => { action: (element) => {
@@ -92,7 +106,8 @@ const contentConfig: ContentConfig = {
noticeContent: { noticeContent: {
selector: ".notice .contents", selector: ".notice .contents",
action: (element) => { action: (element) => {
element.textContent = "Content has been redacted for privacy."; element.textContent =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}, },
}, },
upcomingCheckboxes: { upcomingCheckboxes: {
@@ -135,7 +150,7 @@ const contentConfig: ContentConfig = {
selector: selector:
'[class*="MessageList__recipients___"] [class*="MessageList__value___"]', '[class*="MessageList__recipients___"] [class*="MessageList__value___"]',
action: (element) => { action: (element) => {
element.textContent = "Recipient(s) Redacted"; element.textContent = getRandomElement(mockData.messages.recipients);
}, },
}, },
@@ -175,16 +190,15 @@ const contentConfig: ContentConfig = {
documentNames: { documentNames: {
selector: ".document td.title", selector: ".document td.title",
action: (element) => { action: (element) => {
element.textContent = "Document Name Redacted"; element.textContent = getRandomElement(mockData.documentTitles);
}, },
}, },
forumTopics: { forumTopics: {
selector: "#menu .sub ul li:not([data-colour]):not(.hasChildren) label", selector: "#menu .sub ul li:not([data-colour]):not(.hasChildren) label",
action: (element) => { action: (element) => {
// Only redact if not in assessments section
const assessmentsSection = element.closest('[data-key="assessments"]'); const assessmentsSection = element.closest('[data-key="assessments"]');
if (!assessmentsSection) { if (!assessmentsSection) {
element.textContent = "Forum Topic Redacted"; element.textContent = getRandomElement(mockData.forumTopics);
} }
}, },
}, },
@@ -210,25 +224,27 @@ const contentConfig: ContentConfig = {
courseNames: { courseNames: {
selector: "#menu .sub ul li[data-colour] label", selector: "#menu .sub ul li[data-colour] label",
action: (element) => { action: (element) => {
element.textContent = "Course Name Redacted"; element.textContent = getRandomElement(mockData.subjects);
}, },
}, },
yearGroups: { yearGroups: {
selector: "#menu .sub > ul > li > label", selector: "#menu .sub > ul > li > label",
action: (element) => { action: (element) => {
element.textContent = "Year Group Redacted"; const yearGroup = Math.floor(Math.random() * 5) + 8;
element.textContent = `Year ${yearGroup}`;
}, },
}, },
newsArticleTitle: { newsArticleTitle: {
selector: ".ArticleText a", selector: ".ArticleText a",
action: (element) => { action: (element) => {
element.textContent = "News Article Title Redacted"; element.textContent = getRandomElement(mockData.notices);
}, },
}, },
newsArticleContent: { newsArticleContent: {
selector: ".ArticleText p", selector: ".ArticleText p",
action: (element) => { action: (element) => {
element.textContent = "News Article Content Redacted"; element.textContent =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}, },
}, },
userHouse: { userHouse: {
@@ -237,6 +253,45 @@ const contentConfig: ContentConfig = {
element.textContent = "House"; element.textContent = "House";
}, },
}, },
// Timetable page: replace class names, teachers, rooms with fake data
timetableEntryTitle: {
selector: ".timetablepage .entry .title",
action: (element) => {
element.textContent = getRandomElement(mockData.subjects);
},
},
timetableEntryTeacher: {
selector: ".timetablepage .entry .teacher, .timetablepage .quickbar .meta .teacher",
action: (element) => {
element.textContent = getRandomElement(mockData.teachers);
},
},
timetableEntryRoom: {
selector: ".timetablepage .entry .room, .timetablepage .quickbar .meta .room",
action: (element) => {
element.textContent = getRandomElement(mockData.classrooms);
},
},
quickbarTitle: {
selector: ".timetablepage .quickbar .title",
action: (element) => {
element.textContent = getRandomElement(mockData.subjects);
},
},
// Home page: replace entire day with mock schedule (care + 7 lessons 8:553:15)
homeDayContainer: {
selector: "#day-container",
alwaysRun: true,
action: (element) => {
const container = element as HTMLElement;
if (!container.closest(".timetable-container")) return; // only on home
const schedule = getMockDaySchedule();
container.innerHTML = schedule;
container.classList.remove("loading");
},
},
}; };
const mockData = { const mockData = {
@@ -367,7 +422,26 @@ const mockData = {
"Field Trip", "Field Trip",
"Cultural Festival", "Cultural Festival",
], ],
documentTitles: [
"Course Outline",
"Assignment Brief",
"Study Guide",
"Reference Material",
"Worksheet",
"Reading List",
"Project Guidelines",
],
forumTopics: [
"General Discussion",
"Homework Help",
"Resource Share",
"Class Updates",
"Study Group",
"Q&A",
"Announcements",
],
messages: { messages: {
recipients: ["Students", "Class", "Year Group", "Parents", "Guardians"],
subjects: [ subjects: [
"Mid-year Exams", "Mid-year Exams",
"Science project due soon", "Science project due soon",
@@ -573,6 +647,35 @@ Register through the PE department or see your house captains for more informati
] ]
}; };
/** Mock day schedule for home timetable: care 8:308:55, then 7 lessons 8:553:15 (45m each), 20m recess, lunch. */
function getMockDaySchedule(): string {
const blocks: { title: string; teacher: string; room: string; from: string; until: string }[] = [
{ title: "Care Group", teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "8:30am", until: "8:55am" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "8:55am", until: "9:40am" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "9:40am", until: "10:25am" },
{ title: "Recess", teacher: "—", room: "—", from: "10:25am", until: "10:45am" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "10:45am", until: "11:30am" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "11:30am", until: "12:15pm" },
{ title: "Lunch", teacher: "—", room: "—", from: "12:15pm", until: "1:00pm" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "1:00pm", until: "1:45pm" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "1:45pm", until: "2:30pm" },
{ title: getRandomElement(mockData.subjects), teacher: getRandomElement(mockData.teachers), room: getRandomElement(mockData.classrooms), from: "2:30pm", until: "3:15pm" },
];
const colours = ["#8e8e8e", "#4FBBFE", "#59F675", "#fa915d", "#9c27b0", "#2196f3", "#4caf50", "#ff9800", "#e91e63", "#673ab7"];
return blocks
.map(
(b, i) =>
`<div class="day" style="--item-colour: ${colours[i % colours.length]};">
<h2>${b.title}</h2>
<h3>${b.teacher}</h3>
<h3>${b.room}</h3>
<h4>${b.from} ${b.until}</h4>
<h5> </h5>
</div>`,
)
.join("");
}
export function getMockNotices() { export function getMockNotices() {
return { return {
payload: mockData.noticesData payload: mockData.noticesData
@@ -654,13 +757,15 @@ export function getMockAssessmentsData() {
const debouncedProcessElements = debounce(processNewElements, 1); const debouncedProcessElements = debounce(processNewElements, 1);
function processNewElements() { function processNewElements() {
Object.entries(contentConfig).forEach(([_, { selector, action }]) => { Object.entries(contentConfig).forEach(([_, config]) => {
const { selector, action, alwaysRun } = config;
const elements = document.querySelectorAll(selector); const elements = document.querySelectorAll(selector);
elements.forEach((element: Element) => { elements.forEach((element: Element) => {
// Only process elements that haven't been processed before if (alwaysRun || !processedElements.has(element)) {
if (!processedElements.has(element)) {
action(element); action(element);
processedElements.add(element); if (!alwaysRun) {
processedElements.add(element);
}
} }
}); });
}); });