Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
ad4c88b
created the page for blogs when they are being viewed, created mock p…
Dkim04 Sep 16, 2025
df842a0
fix: resolve error when adding or removing events
danielkim04 Sep 20, 2025
1fbe4c6
fix: resolve compile error in PastEventsGrid.tsx
danielkim04 Sep 20, 2025
c5cd938
feat: integrate Payload for upcoming events
danielkim04 Sep 20, 2025
552d69a
refactor: use shared EventType and adapter for Payload data
danielkim04 Sep 20, 2025
28bbf28
refactor: move event API calls to page level and unify EventType usage
danielkim04 Sep 20, 2025
979bf27
cleanup: remove unused modals from page.tsx (events)
danielkim04 Sep 20, 2025
c0a9980
feat: started doing frontend for events tab on home page
axyc13 Sep 20, 2025
2f8f323
Merge branch 'dev' into HT-97/events-integration
danielkim04 Sep 21, 2025
93763f6
feat: add configurable limit param to getUpcomingEvents and getPastEv…
danielkim04 Sep 22, 2025
d1d91e4
feat: implemented the event section according to figma
axyc13 Sep 28, 2025
599c347
feat: added reatcivity to components
axyc13 Sep 28, 2025
c347e19
feat: created second blog page design and linked it to payload
jack-h1234 Sep 29, 2025
c4497c0
style: shifted leaf icon position slightly for blog page
jack-h1234 Sep 29, 2025
a23d95c
implemented blog system with listing, individual posts, and CMS integ…
Dkim04 Sep 30, 2025
eab9ece
feat: s3 bucket added for image/media upload
itsatulbox Oct 1, 2025
f949a5a
fix: dont upload to local storage
itsatulbox Oct 3, 2025
573d439
Merge pull request #110 from UoaWDCC/s3bucket-integration
danielkim04 Oct 3, 2025
e79997c
Merge branch 'dev' of https://github.com/UoaWDCC/hidtreas into HT-99/…
jack-h1234 Oct 3, 2025
0f719c4
Merge pull request #105 from UoaWDCC/HT-97/events-integration
itsatulbox Oct 3, 2025
52c8cf3
Merge pull request #109 from UoaWDCC/HT-99/publish-new-blog-page
jack-h12 Oct 4, 2025
e7d8541
Merge branch 'dev' of https://github.com/UoaWDCC/hidtreas into HT-99/…
jack-h1234 Oct 4, 2025
53c5ae2
feat:created the member collection for payload
nathandalpatan Oct 5, 2025
7ff90c9
feat: created fetch function and render frontpage
nathandalpatan Oct 5, 2025
26f75cb
created a new file tpage1.tsx to hold the template i created for the …
Dkim04 Oct 6, 2025
12a603e
Merge branch 'dev' into HT-77/implement-blogs-main-page
Dkim04 Oct 6, 2025
414180b
feat: created a subscribers and event-subscribers collection
InZaneManInAZuite Oct 6, 2025
21e0666
feat: can now create new subscribers from frontend
InZaneManInAZuite Oct 6, 2025
cca681a
feat: updated indication of fields not inputted error for signup modal
InZaneManInAZuite Oct 6, 2025
b92ba0f
feat: modal shows thank you after successful signup
InZaneManInAZuite Oct 6, 2025
6859422
In case its just because email is not unique, still show successful
InZaneManInAZuite Oct 6, 2025
10ab803
merged new features
axyc13 Oct 6, 2025
ff1ebed
feat: updated events carousel to take in payload data
axyc13 Oct 6, 2025
216a85b
fix: responsivity with whitespaces
axyc13 Oct 6, 2025
d45640b
fix: fixed the rendering for the images and ordered members by date ASC
nathandalpatan Oct 7, 2025
fc661b6
deleted imports that wasn't used
nathandalpatan Oct 7, 2025
332e1af
fix: clean up duplicate import and nexted Link issue
danielkim04 Oct 8, 2025
7e2de27
fix: resolve nested Link hydration error in BlogCard.tsx
danielkim04 Oct 8, 2025
e9e9d2d
feat: add blog template field to Blogs collection
danielkim04 Oct 8, 2025
93c89e8
feat: load templates dynamically from base page
danielkim04 Oct 8, 2025
5929b95
feat: make Template2 work with images from payload
danielkim04 Oct 8, 2025
7e728a7
refactor: centralise field validation at API layer for blogs
danielkim04 Oct 8, 2025
a35fd9a
chore: add TODOs for Template2
danielkim04 Oct 8, 2025
71dac2f
fix: moved Member interface to types folder and exported it to MeetTh…
nathandalpatan Oct 8, 2025
6219957
refactor: changed interface to type
itsatulbox Oct 8, 2025
f9bc365
Merge pull request #118 from UoaWDCC/dynamic-meet-the-team
nathandalpatan Oct 8, 2025
cd54456
Merge pull request #108 from UoaWDCC/HT-98/events-integration-and-hom…
axyc13 Oct 8, 2025
b8aed31
Added T-Blog #5
bryyj-y Oct 8, 2025
00caad9
Merge pull request #119 from UoaWDCC/HT-113/payload-blog-template-config
danielkim04 Oct 8, 2025
b7c8590
Delete package-lock.json
bryyj-y Oct 8, 2025
f113a84
style: changed P-blog layout 2 to have non overlapping title text
jack-h1234 Oct 10, 2025
aeb5400
style: changed kiwi bird positioning on previous events cards
jack-h1234 Oct 10, 2025
1d59906
feat: implemented desktop version of new past events popup modal
jack-h1234 Oct 11, 2025
2e9e7b6
feat: implemented mobile design as well
jack-h1234 Oct 11, 2025
190a85a
feat: made event-subscribers work properly
InZaneManInAZuite Oct 11, 2025
ce40686
feat: the event sign up modal now creates a instance of event subscri…
InZaneManInAZuite Oct 11, 2025
c1cde7c
feat: modified how errors are displayed in event sign up modal
InZaneManInAZuite Oct 11, 2025
95fa9a2
feat: now says thank you when sign up to event is successful
InZaneManInAZuite Oct 11, 2025
de26421
style: enlarged active image in past events modal and added finger cu…
jack-h1234 Oct 12, 2025
9728db2
fix: images weren't centering properly for the past events popup moda…
jack-h1234 Oct 12, 2025
17c16eb
fix: fixed an error on mobile where sometimes the wrong event showed …
jack-h1234 Oct 12, 2025
e6a381a
added comments
jack-h1234 Oct 12, 2025
270a9ce
feat: implemented the search bar filter
axyc13 Oct 12, 2025
f00cffa
Resolve merge conflict: Remove demo blog page
jack-h1234 Oct 12, 2025
a14b2ae
fix: fixed merge conflicts
jack-h1234 Oct 12, 2025
0786a83
Merge pull request #121 from UoaWDCC/HT-91/event-signup-and-popup
InZaneManInAZuite Oct 14, 2025
5ceaf66
Merge dev to branch
InZaneManInAZuite Oct 14, 2025
ba7a3b2
feat/made past events year filter functional
rubyckm Oct 14, 2025
db251ae
fix: fixed automatically made payload-types.ts file
InZaneManInAZuite Oct 14, 2025
febc3c4
Add Template3 blog layout with alternating image-text sections
Dkim04 Oct 14, 2025
ca58d57
Update payload types to include template3
Dkim04 Oct 14, 2025
362ffdb
Merge pull request #123 from UoaWDCC/HT-116/blog-search-filter
axyc13 Oct 14, 2025
bfed6d2
fix: fixed all the issues specified
jack-h1234 Oct 14, 2025
63bb1b8
fix: fixed the event sign up modal sizing issue
jack-h1234 Oct 15, 2025
ab32739
Merge branch 'dev' of https://github.com/UoaWDCC/hidtreas into HT/fix…
jack-h1234 Oct 15, 2025
f834bf1
feat: in payload, events now can have multiple images, and also a gal…
jack-h1234 Oct 15, 2025
953d6f2
feat: added image collections for both home and about pages
nathandalpatan Oct 15, 2025
ff8d59d
fix: past events pop up modal now shows images for that specific even…
jack-h1234 Oct 15, 2025
d399a72
feat: added api function for images and also added options for image …
nathandalpatan Oct 16, 2025
e2cabc5
feat: made the images dynamic
nathandalpatan Oct 17, 2025
1e3805e
style: removed border for upcoming events in homepage
jack-h1234 Oct 17, 2025
4e3315e
fix: fixed the clunkiness of the past events pop up modal scrolling bar
jack-h1234 Oct 17, 2025
198b020
fix: fixed clunkiness of the past events pop up modal scroll bar in m…
jack-h1234 Oct 17, 2025
2ca3ffd
Merge branch 'refs/heads/dev' into HT-114/new-blog-page
danielkim04 Oct 18, 2025
f58c115
fix: past events modal scroll bar is actually smooth now
jack-h1234 Oct 18, 2025
6a63a03
feat: changed placeholder image for events page into the run event image
jack-h1234 Oct 18, 2025
61f02fa
refactor: convert demo blog page into Template3.tsx
danielkim04 Oct 18, 2025
75c39f2
Merge pull request #117 from UoaWDCC/HT-91/member-signup-and-popup
itsatulbox Oct 18, 2025
5a6efa6
refactor: centralise template logic
danielkim04 Oct 18, 2025
bbe1434
refactor: create generic Paginated<T> and clean up duplicated paginat…
danielkim04 Oct 18, 2025
d7461c2
chore: rename Template3 to Template4
danielkim04 Oct 18, 2025
ba26232
Merge branch 'HT-114/new-blog-page' into HT-114/creating-new-blog-tem…
danielkim04 Oct 18, 2025
ee9f2fe
feat: integrate Template4.tsx into blog template system
danielkim04 Oct 18, 2025
1c096b4
chore: restore yarn.lock from dev
danielkim04 Oct 18, 2025
0812881
feat: added see more/see less button for long descriptions in upcomin…
jack-h1234 Oct 18, 2025
94a323d
feat: added animations to the events page
jack-h1234 Oct 18, 2025
f0ba44d
fix: fixed animation issues with blue koru
jack-h1234 Oct 18, 2025
a4c324c
Resolve merge conflicts in SignUpModal, EventsSignUpModal, and Recent…
jack-h1234 Oct 18, 2025
4187abb
style: made the sign up here buttons closer to the description in upc…
jack-h1234 Oct 18, 2025
45d1e20
Merge pull request #127 from UoaWDCC/HT-115/working-events-year-filter
itsatulbox Oct 18, 2025
07d7e99
Merge pull request #125 from UoaWDCC/HT-114/creating-new-blog-template
itsatulbox Oct 18, 2025
c942751
Resolve merge conflicts in PastEventsSection and YearFilter components
jack-h1234 Oct 18, 2025
496698c
feat: added animations to upcoming events in homepage and fixed merge…
jack-h1234 Oct 18, 2025
8f0f513
style: removed imported images that are being use
nathandalpatan Oct 18, 2025
3266074
Merge pull request #128 from UoaWDCC/HT/events-page-fixes
jack-h12 Oct 18, 2025
d51f509
resolved merge conflict
nathandalpatan Oct 18, 2025
b845a99
merge conflict resolved
nathandalpatan Oct 18, 2025
4988ba2
Merge pull request #129 from UoaWDCC/dynamic-images-home-about-pages
nathandalpatan Oct 18, 2025
dc34526
Merge branch 'main' into dev
itsatulbox Oct 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,17 @@
"start": "cross-env NODE_OPTIONS=--no-deprecation next start"
},
"dependencies": {
"@payloadcms/db-mongodb": "latest",
"@payloadcms/next": "latest",
"@payloadcms/payload-cloud": "latest",
"@payloadcms/richtext-lexical": "latest",
"@payloadcms/db-mongodb": "3.57.0",
"@payloadcms/next": "3.57.0",
"@payloadcms/payload-cloud": "3.57.0",
"@payloadcms/richtext-lexical": "3.57.0",
"@payloadcms/storage-s3": "3.57.0",
"@tabler/icons-react": "^3.31.0",
"@tailwindcss/postcss": "^4.1.4",
"cross-env": "^7.0.3",
"graphql": "^16.8.1",
"next": "15.2.3",
"payload": "latest",
"payload": "3.57.0",
"react": "19.0.0",
"react-dom": "19.0.0",
"sharp": "0.32.6",
Expand Down
1,852 changes: 1,193 additions & 659 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

14 changes: 11 additions & 3 deletions src/app/(frontend)/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,23 @@ import Hero from '@/components/about/Hero'
import Descriptions from '@/components/about/Descriptions'
import MeetTheWDCCTeam from '@/components/about/MeetTheWDCCTeam'
import QuotesSection from '@/components/about/QuotesSection'
import { getAboutPageImages } from '@/lib/payload/images'

export default async function AboutPage() {
const [heroImage, descriptionImage1, descriptionImage2, quoteImage] = await Promise.all([
getAboutPageImages('hero'),
getAboutPageImages('description-1'),
getAboutPageImages('description-2'),
getAboutPageImages('quote'),
])

return (
<div className="home">
<Header />
<Hero />
<Descriptions />
<Hero heroImage={heroImage} />
<Descriptions descriptionImage1={descriptionImage1} descriptionImage2={descriptionImage2} />
<MeetTheTeam />
<QuotesSection />
<QuotesSection quoteImage={quoteImage} />
<MeetTheWDCCTeam />
<Footer />
</div>
Expand Down
26 changes: 26 additions & 0 deletions src/app/(frontend)/blogs/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import React from 'react'
import Header from '@/components/common/Header'
import Footer from '@/components/common/Footer'
import { notFound } from 'next/navigation'
import { getBlogBySlug } from '@/lib/payload/blogs'
import { BLOG_TEMPLATES } from '@/lib/blog-templates'

export default async function BlogPage({
params,
}: {
params: Promise<{ slug: string }>
}) {
const { slug } = await params
const blog = await getBlogBySlug(slug)
if (!blog) return notFound()

const Template = BLOG_TEMPLATES[blog.template]

return (
<>
<Header />
<Template blog={blog} />
<Footer />
</>
)
}
32 changes: 9 additions & 23 deletions src/app/(frontend)/blogs/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,36 @@ import React from 'react'
import Header from '@/components/common/Header'
import Footer from '@/components/common/Footer'
import BlogCard from '@/components/blogs/BlogCard'
import placeholderImage from '@/assets/groupPic.png'
import {getBlogs} from "@/lib/payload/blogs";
import {Blog} from "@/payload-types";
import Search from '@/components/blogs/Search'
import { getBlogs } from '@/lib/payload/blogs'
import type { BlogType } from '@/types/blog'

// This page is erroring.
// force-dynamic is a temporary patch to prevent this page from being statically generated and failing the deployment build
// Please remove when it's fixed
export const dynamic = 'force-dynamic'

export default async function BlogsPage() {
const data = await getBlogs({ page: 1, limit: 10 });

const { docs: blogs } = await getBlogs({ page: 1, limit: 10 })

return (
<div className={'blogs'}>
<div className="blogs">
<Header />

{/* Hero Section */}
<div className="px-[2.5rem] lg:px-[7rem] pt-16 pb-8 text-center">
<h1 className="text-4xl sm:text-5xl md:text-6xl lg:text-6xl font-extrabold leading-tight tracking-wide ">
<h1 className="text-4xl sm:text-5xl md:text-6xl lg:text-6xl font-extrabold leading-tight tracking-wide">
BLOGS
</h1>
<p className="text-sm sm:text-base md:text-lg lg:text-xl font-normal ">
<p className="text-sm sm:text-base md:text-lg lg:text-xl font-normal">
A collection of insights, reflections, and voices from our community.
</p>
</div>

{/* Search Bar */}
<Search />
{/* Search Bar Filter + Blog Grid */}
<Search blogs={blogs} />

{/* Blog Grid */}
<div className="px-[2.5rem] lg:px-[7rem] mb-16 flex-1">
<div className=" grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-[3rem] ">
{data.docs.map((blog: Blog) => (
// TODO: Change placeholderImage to blog.ImageUrl once all images come from CMS
<BlogCard
key={blog.id}
title={blog.title}
description={blog.description ?? ''}
imageUrl={typeof blog.image === 'object' && blog.image?.url ? blog.image.url : placeholderImage}
/>
))}
</div>
</div>
<Footer />
</div>
)
Expand Down
20 changes: 6 additions & 14 deletions src/app/(frontend)/events/page.tsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,23 @@
'use client'

import { useState } from 'react'
import Header from '@/components/common/Header'
import Footer from '@/components/common/Footer'
import Hero from '@/components/events/Hero'
import EventsSignUpModal from '@/components/events/EventsSignUpModal'
import RecentEvents from '@/components/events/RecentEvents'
import PastEventsSection from '@/components/events/PastEventsSection'
import PastEventsPopUpModal from '@/components/events/PastEventsPopUpModal'
import {getPastEvents, getUpcomingEvents} from "@/lib/payload/events";

export default function EventsPage() {
const [signOpen, setSignOpen] = useState(false)
export default async function EventsPage() {
const upcoming = await getUpcomingEvents(5)
const past = await getPastEvents()

return (
<div className="home">
<Header />
<Hero />
<RecentEvents />
<PastEventsSection />
<RecentEvents initialEvents={upcoming}/>
<PastEventsSection initialEvents={past}/>
<Footer />
<EventsSignUpModal signOpen={signOpen} setSignOpen={setSignOpen} />
<PastEventsPopUpModal
signOpen={signOpen}
setSignOpen={setSignOpen}
events={[]}
initialIdx={0}
/>
</div>
)
}
62 changes: 52 additions & 10 deletions src/app/(frontend)/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -186,45 +186,75 @@
}
}

@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}

@keyframes wiggle {
0%, 100% {
transform: rotate(0deg);
}
25% {
transform: rotate(-3deg);
}
75% {
transform: rotate(3deg);
}
}

@keyframes glow {
0%, 100% {
box-shadow: 0 0 5px rgba(19, 56, 78, 0.3);
}
50% {
box-shadow: 0 0 20px rgba(19, 56, 78, 0.6), 0 0 30px rgba(19, 56, 78, 0.4);
}
}

/* Animation Utility Classes */
.animate-slide-in-left {
animation: slideInFromLeft 0.8s ease-out forwards;
animation: slideInFromLeft 0.5s ease-out forwards;
}

.animate-slide-in-right {
animation: slideInFromRight 0.8s ease-out forwards;
animation: slideInFromRight 0.5s ease-out forwards;
}

.animate-slide-in-bottom {
animation: slideInFromBottom 0.8s ease-out forwards;
animation: slideInFromBottom 0.5s ease-out forwards;
}

.animate-slide-in-top {
animation: slideInFromTop 0.8s ease-out forwards;
animation: slideInFromTop 0.5s ease-out forwards;
}

.animate-fade-in {
animation: fadeIn 1s ease-out forwards;
animation: fadeIn 0.6s ease-out forwards;
}

.animate-bob {
animation: bobUpDown 4s ease-in-out infinite;
animation: bobUpDown 3s ease-in-out infinite;
}

.animate-float {
animation: float 6s ease-in-out infinite;
animation: float 4s ease-in-out infinite;
}

.animate-scale-in {
animation: scaleIn 0.6s ease-out forwards;
animation: scaleIn 0.4s ease-out forwards;
}

.animate-gentle-rotate {
animation: gentleRotate 8s ease-in-out infinite;
animation: gentleRotate 6s ease-in-out infinite;
}

.animate-breathe {
animation: breathe 5s ease-in-out infinite;
animation: breathe 3s ease-in-out infinite;
}

.animate-shimmer {
Expand All @@ -233,6 +263,18 @@
animation: shimmer 2s infinite;
}

.animate-pulse {
animation: pulse 2s ease-in-out infinite;
}

.animate-wiggle {
animation: wiggle 1s ease-in-out infinite;
}

.animate-glow {
animation: glow 3s ease-in-out infinite;
}

/* Staggered animations for multiple elements */
.animate-stagger-1 { animation-delay: 0.1s; }
.animate-stagger-2 { animation-delay: 0.2s; }
Expand Down
18 changes: 15 additions & 3 deletions src/app/(frontend)/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,26 @@ import Footer from '@/components/common/Footer'
import HeroSection from '@/components/home/HeroSection'
import WhatWeDo from '@/components/home/WhatWeDo'
import WhoWeAre from '@/components/home/WhoWeAre'
import Events from '@/components/home/Events'
import { getPastEvents, getUpcomingEvents } from '@/lib/payload/events'
import { getHomePageImages } from '@/lib/payload/images'

export default async function HomePage() {
const upcoming = await getUpcomingEvents(5)
const past = await getPastEvents()

const [heroImage, whatWeDoImage, whoWeAreImage] = await Promise.all([
getHomePageImages('hero'),
getHomePageImages('what-we-do'),
getHomePageImages('who-we-are'),
])
return (
<div className="home">
<Header />
<HeroSection />
<WhoWeAre />
<WhatWeDo />
<HeroSection heroImage={heroImage} />
<WhoWeAre whoWeAreImage={whoWeAreImage} />
<WhatWeDo whatWeDoImage={whatWeDoImage} />
<Events initialEvents={upcoming} />
<Footer />
</div>
)
Expand Down
4 changes: 3 additions & 1 deletion src/app/(payload)/admin/importMap.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 0 additions & 6 deletions src/app/api/events/route.ts

This file was deleted.

6 changes: 0 additions & 6 deletions src/app/api/upcoming-events/route.ts

This file was deleted.

5 changes: 5 additions & 0 deletions src/assets/groupedLeaves.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
Binary file added src/assets/hidtreas-run-img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 47 additions & 0 deletions src/collections/AboutPageImages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { isEditorOrAdmin } from '@/access/UserAccess'
import type { CollectionConfig } from 'payload'

export const AboutPageImages: CollectionConfig = {
slug: 'about-page-images',
admin: {
useAsTitle: 'title',
},
access: {
read: () => true,
create: isEditorOrAdmin,
update: isEditorOrAdmin,
delete: isEditorOrAdmin,
},
fields: [
{
name: 'title',
type: 'text',
required: true,
},
{
name: 'image',
type: 'upload',
relationTo: 'media',
required: true,
},
{
name: 'placement',
type: 'select',
options: [
{ label: 'Hero Section', value: 'hero' },
{ label: 'Decription Image 1 (Top Right)', value: 'description-1' },
{ label: 'Description Image 2 (Bottom Left)', value: 'description-2' },
{ label: 'Quote Section', value: 'quote' },
],
required: true,
admin: {
description: 'Where should this image appear on the about page?',
},
},
{
name: 'alt',
type: 'text',
required: true,
},
],
}
Loading