diff --git a/src/_/code/bridge/handlers.js b/src/_/code/bridge/handlers.js index 0f0eee9..ec31ebd 100644 --- a/src/_/code/bridge/handlers.js +++ b/src/_/code/bridge/handlers.js @@ -8,11 +8,11 @@ const handlers = { }, async editEvent(id, updatedEvent, networkId, userId) { - return await global.db.events.add(id, updatedEvent, networkId, userId); + return await global.db.events.edit(id, updatedEvent, networkId, userId); }, async deleteEvent(id, networkId, userId) { - return await global.db.events.add(id, networkId, userId); + return await global.db.events.delete(id, networkId, userId); }, async getEvent(id) { @@ -28,11 +28,11 @@ const handlers = { }, async editJob(id, updatedJob, networkId, userId) { - return await global.db.jobs.add(id, updatedJob, networkId, userId); + return await global.db.jobs.edit(id, updatedJob, networkId, userId); }, async deleteJob(id, networkId, userId) { - return await global.db.jobs.add(id, networkId, userId); + return await global.db.jobs.delete(id, networkId, userId); }, async getJob(id) { diff --git a/src/_/code/shared.css b/src/_/code/shared.css index 7e16cf5..cbc0fdd 100644 --- a/src/_/code/shared.css +++ b/src/_/code/shared.css @@ -27,6 +27,7 @@ --column-src: /_/icons/column2.svg; --nodes-src: /_/icons/nodes.svg; --forum-src: /_/icons/forum.svg; + --trash-src: /_/icons/trash.svg; --pin-src: /_/icons/pin.svg; --time-src: /_/icons/time.svg; @@ -56,6 +57,7 @@ --column-src: /_/icons/column2.svg; --nodes-src: /_/icons/nodes.svg; --forum-src: /_/icons/forum.svg; + --trash-src: /_/icons/trash.svg; --pin-src: /_/icons/pinlight.svg; --time-src: /_/icons/timelight.svg; diff --git a/src/apps/Events/EventCard.js b/src/apps/Events/EventCard.js index beddd00..abbf78c 100644 --- a/src/apps/Events/EventCard.js +++ b/src/apps/Events/EventCard.js @@ -1,4 +1,5 @@ import util from "../../util" +import server from "../../_/code/bridge/serverFunctions.js" class EventCard extends Shadow { constructor(event) { @@ -8,11 +9,23 @@ class EventCard extends Shadow { render() { VStack(() => { - h3(this.event.title) - .color("var(--brown)") - .fontSize(1.2, em) - .fontWeight("bold") - .marginVertical(0, em) + HStack(() => { + h3(this.event.title) + .color("var(--brown)") + .fontSize(1.2, em) + .fontWeight("bold") + .marginVertical(0, em) + + if (this.event.creator_id === global.profile.id) { + img(util.cssVariable("trash-src"), "1.5em") + .marginRight(0.5, em) + .onTap(() => { + this.deleteEvent(this.event) + }) + } + }) + .justifyContent("space-between") + .verticalAlign("center") HStack(() => { img(util.cssVariable("pin-src"), "1.3em") @@ -38,6 +51,13 @@ class EventCard extends Shadow { .gap(0.5, em) } + async deleteEvent(event) { + const result = await server.deleteEvent(event.id, event.network_id, global.profile.id) + if (result.data === null) { + console.log("Failed to delete event") + } + } + convertDate(rawDate) { const parsed = new Date(rawDate); diff --git a/src/apps/Events/Events.js b/src/apps/Events/Events.js index 9abdd36..62441e2 100644 --- a/src/apps/Events/Events.js +++ b/src/apps/Events/Events.js @@ -22,23 +22,9 @@ css(` `) 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; + this.events = global.currentNetwork.data.events; } render() { @@ -55,21 +41,24 @@ class Events extends Shadow { 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)" : "") + VStack(() => { + 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") } - } else { - h2("No Events") - .color("var(--brown)") - .fontWeight("bold") - .marginTop(7.5, em) - .marginBottom(0.5, em) - .textAlign("center") - } + }) + .overflowY("scroll") }) .boxSizing("border-box") .paddingVertical(1, em) @@ -79,8 +68,8 @@ class Events extends Shadow { async getEvents(networkId) { const fetchedEvents = await server.getEvents(networkId) - if (this.checkForUpdates(this.events, fetchedEvents)) { - this.events = fetchedEvents + if (this.checkForUpdates(this.events, fetchedEvents.data)) { + this.events = fetchedEvents.data this.rerender() } } diff --git a/src/apps/Jobs/JobCard.js b/src/apps/Jobs/JobCard.js index c94e2f1..6e4b1a8 100644 --- a/src/apps/Jobs/JobCard.js +++ b/src/apps/Jobs/JobCard.js @@ -1,4 +1,5 @@ import util from "../../util.js" +import server from "../../_/code/bridge/serverFunctions.js" class JobCard extends Shadow { constructor(job) { @@ -8,11 +9,23 @@ class JobCard extends Shadow { render() { VStack(() => { - h3(this.job.title) - .color("var(--brown)") - .fontSize(1.2, em) - .fontWeight("bold") - .marginVertical(0, em) + HStack(() => { + h3(this.job.title) + .color("var(--brown)") + .fontSize(1.2, em) + .fontWeight("bold") + .marginVertical(0, em) + + if (this.job.creator_id === global.profile.id) { + img(util.cssVariable("trash-src"), "1.5em") + .marginRight(0.5, em) + .onTap(() => { + this.deleteJob(this.job) + }) + } + }) + .justifyContent("space-between") + .verticalAlign("center") HStack(() => { img(util.cssVariable("pin-src"), "1.3em") @@ -34,6 +47,13 @@ class JobCard extends Shadow { .gap(0.5, em) .boxSizing("border-box") } + + async deleteJob(job) { + const result = await server.deleteJob(job.id, job.network_id, global.profile.id) + if (result.data === null) { + console.log("Failed to delete job") + } + } } register(JobCard) \ No newline at end of file diff --git a/src/apps/Jobs/Jobs.js b/src/apps/Jobs/Jobs.js index 3c03a46..dcfb9e8 100644 --- a/src/apps/Jobs/Jobs.js +++ b/src/apps/Jobs/Jobs.js @@ -24,20 +24,10 @@ css(` `) class Jobs extends Shadow { - jobs = [ - { - id: 1, - network_id: 2, - creator_id: 1, - title: "Austin Chapter Lead", - description: "This is the description", - salary: 50000.00, - company: "Hyperia", - location: "1234 location", - created: "2026-03-12 13:41:41.0722", - updated_at: "2026-03-12 13:41:41.0722" - } - ] + constructor() { + super() + this.jobs = global.currentNetwork.data.jobs; + } render() { VStack(() => { @@ -55,21 +45,24 @@ class Jobs extends Shadow { SearchBar() - if (this.jobs == "" || this.jobs == []) { - LoadingCircle() - } else if (this.jobs.length > 0) { - for (let i = 0; i < this.jobs.length; i++) { - JobCard(this.jobs[i]) - .borderTop(i == 0 ? "1px solid var(--divider)" : "") + VStack(() => { + if (this.jobs == "" || this.jobs == []) { + LoadingCircle() + } else if (this.jobs.length > 0) { + for (let i = 0; i < this.jobs.length; i++) { + JobCard(this.jobs[i]) + .borderTop(i == 0 ? "1px solid var(--divider)" : "") + } + } else { + h2("No Jobs") + .color("var(--brown)") + .fontWeight("bold") + .marginTop(7.5, em) + .marginBottom(0.5, em) + .textAlign("center") } - } else { - h2("No Jobs") - .color("var(--brown)") - .fontWeight("bold") - .marginTop(7.5, em) - .marginBottom(0.5, em) - .textAlign("center") - } + }) + .overflowY("scroll") }) .boxSizing("border-box") .paddingVertical(1, em) @@ -79,7 +72,7 @@ class Jobs extends Shadow { async getJobs(networkId) { const fetchedJobs = await server.getJobs(networkId) - if (this.checkForUpdates(this.jobs, fetchedJobs)) { + if (this.checkForUpdates(this.jobs, fetchedJobs.data)) { this.jobs = fetchedJobs this.rerender() } diff --git a/src/apps/People/People.js b/src/apps/People/People.js index c851133..92585b5 100644 --- a/src/apps/People/People.js +++ b/src/apps/People/People.js @@ -1,3 +1,5 @@ +import "./PeopleCard.js" + css(` people- { font-family: 'Arial'; @@ -41,30 +43,7 @@ class People extends Shadow { LoadingCircle() } else if (this.people.length > 0) { for (let i = 0; i < this.people.length; i++) { - HStack(() => { - HStack(() => { }) - .boxSizing("border-box") - .height(3.5, em) - .width(3.5, em) - .padding(0.5, em) - .border("1px solid var(--accent)") - .borderRadius(100, pct) - .background("black") - - VStack(() => { - h3(this.people[i].first_name + " " + this.people[i].last_name) - .color("var(--brown)") - .fontSize(1.2, em) - .fontWeight("bold") - .marginVertical(0, em) - p("Member since: " + " " + this.convertDate(this.people[i].created)) - }) - .verticalAlign("center") - .gap(0.5, em) - }) - .height(3.5, em) - .padding(0.75, em) - .gap(1, em) + PeopleCard(this.people[i]) } } else { h2("No Members") diff --git a/src/apps/People/PeopleCard.js b/src/apps/People/PeopleCard.js new file mode 100644 index 0000000..33950a4 --- /dev/null +++ b/src/apps/People/PeopleCard.js @@ -0,0 +1,58 @@ +class PeopleCard extends Shadow { + constructor(person) { + super() + this.person = person + } + + render() { + HStack(() => { + HStack(() => { }) + .boxSizing("border-box") + .height(3.5, em) + .width(3.5, em) + .padding(0.5, em) + .border("1px solid var(--accent)") + .borderRadius(100, pct) + .background("black") + + VStack(() => { + h3(this.person.first_name + " " + this.person.last_name) + .color("var(--brown)") + .fontSize(1.2, em) + .fontWeight("bold") + .marginVertical(0, em) + p("Member since: " + " " + this.convertDate(this.person.created)) + }) + .verticalAlign("center") + .gap(0.5, em) + }) + .height(3.5, em) + .padding(0.75, em) + .gap(1, em) + } + + 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 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}`; + } +} + +register(PeopleCard) \ No newline at end of file diff --git a/src/components/AppWindow.js b/src/components/AppWindow.js index 1278214..6366635 100644 --- a/src/components/AppWindow.js +++ b/src/components/AppWindow.js @@ -31,6 +31,7 @@ class AppWindow extends Shadow { } }) .height(100, pct) + .overflowY("hidden") .display("flex") .position("relative") .onNavigate(() => {