feat(notices): add animations to notices

This commit is contained in:
SethBurkart123
2024-12-02 12:17:39 +11:00
parent 4bf5420140
commit a999e4384b
3 changed files with 49 additions and 26 deletions
+30 -24
View File
@@ -688,6 +688,9 @@ function SortMessagePageItems(messagesParentElement: any) {
} }
async function LoadPageElements(): Promise<void> { async function LoadPageElements(): Promise<void> {
await AddBetterSEQTAElements();
const sublink: string | undefined = window.location.href.split('/')[4];
eventManager.register('messagesAdded', { eventManager.register('messagesAdded', {
elementType: 'div', elementType: 'div',
className: 'messages', className: 'messages',
@@ -718,6 +721,11 @@ async function LoadPageElements(): Promise<void> {
className: 'timetablepage', className: 'timetablepage',
}, handleTimetable); }, handleTimetable);
eventManager.register('noticesAdded', {
elementType: 'div',
className: 'notice',
}, handleNotices);
if (settingsState.assessmentsAverage) { if (settingsState.assessmentsAverage) {
eventManager.register('assessmentsAdded', { eventManager.register('assessmentsAdded', {
elementType: 'div', elementType: 'div',
@@ -725,13 +733,31 @@ async function LoadPageElements(): Promise<void> {
}, handleAssessments); }, handleAssessments);
} }
await AddBetterSEQTAElements();
const sublink: string | undefined = window.location.href.split('/')[4];
await handleSublink(sublink); await handleSublink(sublink);
} }
async function handleNotices(node: Element): Promise<void> {
if (!(node instanceof HTMLElement)) return;
if (!settingsState.animations) return;
node.style.opacity = '0';
// get index of node in relation to parent
const index = Array.from(node.parentElement!.children).indexOf(node);
animate(
node,
{ opacity: [0, 1], y: [50, 0], scale: [0.99, 1] },
{
delay: 0.1 * index,
type: 'spring',
stiffness: 250,
damping: 20
}
);
}
async function handleSublink(sublink: string | undefined): Promise<void> { async function handleSublink(sublink: string | undefined): Promise<void> {
switch (sublink) { switch (sublink) {
case 'news': case 'news':
@@ -753,26 +779,6 @@ async function handleSublink(sublink: string | undefined): Promise<void> {
if (settingsState.onoff) loadHomePage() if (settingsState.onoff) loadHomePage()
finishLoad(); finishLoad();
break; break;
case 'timetable':
handleTimetable()
await handleDefault()
break;
case 'documents':
handleDocuments(document.querySelector('.documents')!)
await handleDefault()
break;
case 'reports':
handleReports(document.querySelector('.reports')!)
await handleDefault()
break;
case 'messages':
handleMessages(document.querySelector('.messages')!)
await handleDefault()
break;
case 'dashboard':
handleDashboard(document.querySelector('.dashboard')!)
await handleDefault()
break;
default: default:
await handleDefault() await handleDefault()
+1 -1
View File
@@ -1111,9 +1111,9 @@ div > ol:has(.uiFileHandlerWrapper) {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: var(--background-primary); background: var(--background-primary);
transition: 200ms;
box-shadow: inset 0px 5px 20px 1px rgba(0, 0, 0, 0.3); box-shadow: inset 0px 5px 20px 1px rgba(0, 0, 0, 0.3);
padding-bottom: 25px; padding-bottom: 25px;
transition: none;
color: var(--text-primary); color: var(--text-primary);
} }
.dummynotice { .dummynotice {
+17
View File
@@ -46,10 +46,27 @@ class EventManager {
} }
const unregister = () => this.unregisterById(event, id); const unregister = () => this.unregisterById(event, id);
this.listeners.get(event)!.push({ id, options, callback, unregister }); this.listeners.get(event)!.push({ id, options, callback, unregister });
this.scanExistingElements(options, callback);
this.startObserving(options.parentElement); this.startObserving(options.parentElement);
return { unregister }; return { unregister };
} }
private async scanExistingElements(options: EventListenerOptions, callback: (element: Element) => void): Promise<void> {
const root = options.parentElement || document.documentElement;
const elements = Array.from(root.getElementsByTagName('*'));
elements.unshift(root);
for (let i = 0; i < elements.length; i += this.chunkSize) {
const chunk = elements.slice(i, i + this.chunkSize);
const filteredChunk = chunk.filter(element => this.matchesOptions(element, options));
for (const element of filteredChunk) {
callback(element);
}
}
}
public unregister(event: string): void { public unregister(event: string): void {
if (this.listeners.has(event)) { if (this.listeners.has(event)) {
this.listeners.delete(event); this.listeners.delete(event);