- Copied bridge folder from frm.so - All handlers in handlers.js added from frm.so - Modified Events and Jobs pages' default events/jobs to model data structure from SQL/server - Set up getJobs(), checkForUpdates() on both Events/Jobs to fetch new items and update when needed
142 lines
4.1 KiB
JavaScript
142 lines
4.1 KiB
JavaScript
import "../../components/LoadingCircle.js"
|
|
import "./EventCard.js"
|
|
import server from "../../_/code/bridge/serverFunctions.js"
|
|
import "../../components/SearchBar.js"
|
|
|
|
css(`
|
|
events- {
|
|
font-family: 'Arial';
|
|
}
|
|
|
|
events- h1 {
|
|
font-family: 'Bona';
|
|
}
|
|
|
|
events- p {
|
|
color: var(--accent);
|
|
}
|
|
|
|
events- p b {
|
|
color: var(--darkbrown);
|
|
}
|
|
`)
|
|
|
|
class Events extends Shadow {
|
|
events = [
|
|
{
|
|
id: 1,
|
|
network_id: 2,
|
|
creator_id: 1,
|
|
title: "Austin Chapter Lead",
|
|
description: "This is the descriptio lets try a longer one agaiin just to see what it would look like? mayeb even longer bc that was pretty short now that i see it. maybe 2 sentences if possible or more.",
|
|
location: "1234 location",
|
|
time_start: "2026-01-13 13:41:41.0722",
|
|
created: "2026-01-13 12:00:00.0000",
|
|
updated_at: "2026-01-13 13:41:41.0722"
|
|
}
|
|
]
|
|
|
|
constructor() {
|
|
super()
|
|
// this.events = global.currentNetwork.data.events;
|
|
}
|
|
|
|
render() {
|
|
VStack(() => {
|
|
h1("Events")
|
|
.color("var(--quillred)")
|
|
.textAlign("center")
|
|
.marginBottom(0.25, em)
|
|
h3(global.currentNetwork.name)
|
|
.color("var(--quillred)")
|
|
.textAlign("center")
|
|
.margin(0)
|
|
.fontFamily("Bona")
|
|
|
|
SearchBar()
|
|
|
|
if (this.events == "" || this.events == []) {
|
|
LoadingCircle()
|
|
} else if (this.events.length > 0) {
|
|
for (let i = 0; i < this.events.length; i++) {
|
|
EventCard(this.events[i])
|
|
.borderTop(i == 0 ? "1px solid var(--divider)" : "")
|
|
}
|
|
} else {
|
|
h2("No Events")
|
|
.color("var(--brown)")
|
|
.fontWeight("bold")
|
|
.marginTop(7.5, em)
|
|
.marginBottom(0.5, em)
|
|
.textAlign("center")
|
|
}
|
|
})
|
|
.boxSizing("border-box")
|
|
.paddingVertical(1, em)
|
|
.height(100, pct)
|
|
.width(100, pct)
|
|
}
|
|
|
|
async getEvents(networkId) {
|
|
const fetchedEvents = await server.getEvents(networkId)
|
|
if (this.checkForUpdates(this.events, fetchedEvents)) {
|
|
this.events = fetchedEvents
|
|
this.rerender()
|
|
}
|
|
}
|
|
|
|
connectedCallback() {
|
|
this.getEvents(global.currentNetwork.id)
|
|
}
|
|
|
|
checkForUpdates(currentEvents, fetchedEvents) {
|
|
if (currentEvents.length !== fetchedEvents.length) return true;
|
|
|
|
const currentMap = new Map(currentEvents.map(event => [event.id, event]));
|
|
|
|
for (const fetchedEvent of fetchedEvents) {
|
|
const currentEvent = currentMap.get(fetchedEvent.id);
|
|
|
|
// new event added
|
|
if (!currentEvent) return true;
|
|
|
|
// existing event changed
|
|
if (currentEvent.updated_at !== fetchedEvent.updated_at) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
convertDate(rawDate) {
|
|
const parsed = new Date(rawDate);
|
|
|
|
if (isNaN(parsed.getTime())) return rawDate;
|
|
|
|
const month = parsed.toLocaleString("en-US", { month: "long", timeZone: "UTC" });
|
|
const day = parsed.getUTCDate();
|
|
const year = parsed.getUTCFullYear();
|
|
|
|
const hours24 = parsed.getUTCHours();
|
|
const minutes = parsed.getUTCMinutes();
|
|
|
|
const hours12 = hours24 % 12 || 12;
|
|
const ampm = hours24 >= 12 ? "PM" : "AM";
|
|
const paddedMinutes = String(minutes).padStart(2, "0");
|
|
|
|
const ordinal = (n) => {
|
|
const mod100 = n % 100;
|
|
if (mod100 >= 11 && mod100 <= 13) return `${n}th`;
|
|
switch (n % 10) {
|
|
case 1: return `${n}st`;
|
|
case 2: return `${n}nd`;
|
|
case 3: return `${n}rd`;
|
|
default: return `${n}th`;
|
|
}
|
|
};
|
|
|
|
return `${month} ${ordinal(day)}, ${year} at ${hours12}:${paddedMinutes} ${ampm}`;
|
|
}
|
|
}
|
|
|
|
register(Events) |