diff --git a/api/src/routes/applications.js b/api/src/routes/applications.js
index 32530e9..bcfe1b7 100644
--- a/api/src/routes/applications.js
+++ b/api/src/routes/applications.js
@@ -1,8 +1,7 @@
const express = require('express');
const router = express.Router();
-// DB pool (same as used in api/index.js)
-const pool = require('../db');
+import pool from '../db';
// POST /application
router.post('/', async (req, res) => {
diff --git a/api/src/routes/auth.js b/api/src/routes/auth.js
index 9949ca5..b9b985a 100644
--- a/api/src/routes/auth.js
+++ b/api/src/routes/auth.js
@@ -6,7 +6,7 @@ dotenv.config();
const express = require('express');
const { param } = require('./applications');
const router = express.Router();
-const pool = require('../db')
+import pool from '../db';
const querystring = require('querystring');
diff --git a/api/src/routes/calendar.js b/api/src/routes/calendar.js
deleted file mode 100644
index 90ac380..0000000
--- a/api/src/routes/calendar.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const express = require('express');
-const r = express.Router();
-const ur = express.Router();
-const pool = require('../db');
-
-//insert a new latest rank for a user
-ur.post('/', async (req, res) => {3
- try {
- const change = req.body?.change;
- console.log(change);
- await insertMemberRank(change);
-
- res.sendStatus(201);
- } catch (err) {
- console.error('Insert failed:', err);
- res.status(500).json({ error: 'Failed to update ranks' });
- }
-});
-
-//get all ranks
-r.get('/', async (req, res) => {
- try {
- const ranks = await getAllRanks();
- console.log(ranks);
- res.json(ranks);
- } catch (err) {
- console.error(err);
- res.status(500).json({ error: 'Internal server error' });
- }
-});
-
-module.exports.ranks = r;
-module.exports.memberRanks = ur;
\ No newline at end of file
diff --git a/api/src/routes/calendar.ts b/api/src/routes/calendar.ts
new file mode 100644
index 0000000..2154eec
--- /dev/null
+++ b/api/src/routes/calendar.ts
@@ -0,0 +1,50 @@
+import { getEventAttendance, getEventDetails, getShortEventsInRange } from "../services/calendarService";
+
+const express = require('express');
+const r = express.Router();
+
+function addMonths(date: Date, months: number): Date {
+ const d = new Date(date)
+ d.setMonth(d.getMonth() + months)
+ return d
+}
+
+//get calendar events paged
+r.get('/', async (req, res) => {
+ const viewDate: Date = req.body.date;
+ //generate date range
+ const backDate: Date = addMonths(viewDate, -1);
+ const frontDate: Date = addMonths(viewDate, 2);
+
+ const events = getShortEventsInRange(backDate, frontDate);
+
+ res.status(200).json(events);
+});
+
+r.get('/upcoming', async (req, res) => {
+ res.sendStatus(501);
+})
+
+//get event details
+r.get('/:id', async (req, res) => {
+ try {
+ const eventID: number = req.params.id;
+
+ let details = getEventDetails(eventID);
+ let attendance = await getEventAttendance(eventID);
+
+ let out = { ...details, attendance }
+ console.log(out);
+ res.status(200).json(out);
+ } catch (err) {
+ console.error('Insert failed:', err);
+ res.status(500).json(err);
+ }
+})
+
+//post a new calendar event
+r.post('/', async (req, res) => {
+
+})
+
+module.exports.calendar = r;
\ No newline at end of file
diff --git a/api/src/routes/loa.js b/api/src/routes/loa.js
index ae0d21c..c14bf24 100644
--- a/api/src/routes/loa.js
+++ b/api/src/routes/loa.js
@@ -1,8 +1,7 @@
const express = require('express');
const router = express.Router();
-// DB pool (same as used in api/index.js)
-const pool = require('../db');
+import pool from '../db';
//post a new LOA
router.post("/", async (req, res) => {
diff --git a/api/src/routes/members.js b/api/src/routes/members.js
index f9077a9..c9b4113 100644
--- a/api/src/routes/members.js
+++ b/api/src/routes/members.js
@@ -1,8 +1,7 @@
const express = require('express');
const router = express.Router();
-// DB pool (same as used in api/index.js)
-const pool = require('../db');
+import pool from '../db';
//create a new user?
router.post('/', async (req, res) => {
diff --git a/api/src/routes/ranks.js b/api/src/routes/ranks.js
index d32b269..e69a73f 100644
--- a/api/src/routes/ranks.js
+++ b/api/src/routes/ranks.js
@@ -2,7 +2,6 @@ const express = require('express');
const r = express.Router();
const ur = express.Router();
const { getAllRanks, insertMemberRank } = require('../services/rankService')
-const pool = require('../db');
//insert a new latest rank for a user
ur.post('/', async (req, res) => {3
diff --git a/api/src/routes/roles.js b/api/src/routes/roles.js
index d82f240..666a754 100644
--- a/api/src/routes/roles.js
+++ b/api/src/routes/roles.js
@@ -2,7 +2,7 @@ const express = require('express');
const r = express.Router();
const ur = express.Router();
-const pool = require('../db');
+import pool from '../db';
//assign a member to a role
ur.post('/', async (req, res) => {
diff --git a/api/src/routes/statuses.js b/api/src/routes/statuses.js
index 5f2f71e..8e9d48e 100644
--- a/api/src/routes/statuses.js
+++ b/api/src/routes/statuses.js
@@ -2,7 +2,7 @@ const express = require('express');
const status = express.Router();
const memberStatus = express.Router();
-const pool = require('../db');
+import pool from '../db';
//insert a new latest rank for a user
memberStatus.post('/', async (req, res) => {
diff --git a/api/src/services/calendarService.ts b/api/src/services/calendarService.ts
index d8bf4d3..d110577 100644
--- a/api/src/services/calendarService.ts
+++ b/api/src/services/calendarService.ts
@@ -79,7 +79,7 @@ export async function cancelEvent(eventID: number) {
}
-export async function getEventsInRange(startDate: Date, endDate: Date) {
+export async function getShortEventsInRange(startDate: Date, endDate: Date) {
const sql = `
SELECT id, name, start, end, color
FROM calendar_events
@@ -89,6 +89,29 @@ export async function getEventsInRange(startDate: Date, endDate: Date) {
return await pool.query(sql, [startDate, endDate]);
}
+export async function getEventDetails(eventID: number) {
+ const sql = `
+ SELECT
+ e.id,
+ e.name,
+ e.start,
+ e.end,
+ e.location,
+ e.color,
+ e.description,
+ e.cancelled,
+ e.created_at,
+ e.updated_at,
+ m.id AS creator_id,
+ m.name AS creator_name
+ FROM calendar_events e
+ LEFT JOIN members m ON e.creator = m.id
+ WHERE e.id = ?
+ `;
+
+ return await pool.query(sql, [eventID])
+}
+
export async function getUpcomingEvents(date: Date, limit: number) {
const sql = `
SELECT id, name, start, end, color
@@ -111,4 +134,18 @@ export async function setAttendanceStatus(memberID: number, eventID: number, sta
await pool.query(sql, [memberID, eventID, status]);
return { success: true }
+}
+
+export async function getEventAttendance(eventID: number) {
+ const sql = `
+ SELECT
+ s.member_id,
+ s.status,
+ m.name AS member_name
+ FROM calendar_events_signups s
+ LEFT JOIN members m ON s.member_id = m.id
+ WHERE s.event_id = ?
+ `;
+
+ return await pool.query(sql, [eventID]);
}
\ No newline at end of file
diff --git a/api/src/services/rankService.js b/api/src/services/rankService.js
index d2fc5cf..6724760 100644
--- a/api/src/services/rankService.js
+++ b/api/src/services/rankService.js
@@ -1,4 +1,4 @@
-const pool = require('../db');
+import pool from "../db";
async function getAllRanks() {
const rows = await pool.query(
diff --git a/ui/src/pages/Calendar.vue b/ui/src/pages/Calendar.vue
index 58855e9..e7b6c11 100644
--- a/ui/src/pages/Calendar.vue
+++ b/ui/src/pages/Calendar.vue
@@ -26,6 +26,21 @@ function onDatesSet() {
selectedYear.value = d.getFullYear()
}
+function buildFullDate(month: number, year: number): Date {
+ return new Date(year, month, 1); //default to first of month
+}
+
+
+watch([selectedMonth, selectedYear], () => {
+ console.log('Selected date changed:', selectedMonth.value, selectedYear.value)
+
+
+})
+
+onMounted(() => {
+ // fetchEventsFor(selectedMonth.value, selectedYear.value)
+})
+
function goPrev() { api()?.prev() }
function goNext() { api()?.next() }
@@ -141,6 +156,7 @@ watch(panelOpen, async () => {
})
+
const startFmt = new Intl.DateTimeFormat(undefined, {
weekday: 'short', year: 'numeric', month: 'short', day: 'numeric',
hour: 'numeric', minute: '2-digit'
@@ -213,7 +229,8 @@ const ext = computed(() => activeEvent.value?.extendedProps ?? {})
aria-label="Next month" @click="goNext">
-