From bcbd8ae4a205421d01fb9f8ed756268e02373d0a Mon Sep 17 00:00:00 2001 From: adamrushy Date: Thu, 18 Sep 2025 10:24:03 +0100 Subject: [PATCH 1/3] Highlight Group Drop-In Sessions on the website --- Resources/Views/Home/_drop-in-sessions.leaf | 36 +++++++++++++++---- Sources/App/Context/HomeContext.swift | 2 ++ .../Features/Home/HomeRouteController.swift | 5 +++ seed.sql | 34 +++++++++++------- 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/Resources/Views/Home/_drop-in-sessions.leaf b/Resources/Views/Home/_drop-in-sessions.leaf index e3ce2d78..e518faa2 100644 --- a/Resources/Views/Home/_drop-in-sessions.leaf +++ b/Resources/Views/Home/_drop-in-sessions.leaf @@ -9,14 +9,15 @@

#if(event.year == 2023):NEW#endif Drop-In Sessions

- Included for free with every ticket, drop-in sessions give you an - exclusive 1 on 1 feedback session with one of our industry experts. - Choose from one of this year's hosts covering a wide range of topics. + Included for free with every ticket, drop-in sessions give you exclusive + 1-on-1 feedback sessions with our industry experts. You can book both + individual and group sessions to maximize your learning experience.

- #if(count(dropInSessions) > 0): -
+ #if(count(regularDropInSessions) > 0 || count(groupDropInSessions) > 0): + #if(count(regularDropInSessions) > 0): +
- #for(session in dropInSessions): + #for(session in regularDropInSessions):
#(session.owner) avatar image
@@ -27,6 +28,29 @@ #endfor
+ #endif + + #if(count(groupDropInSessions) > 0): +

Group Drop-In Sessions

+

+ Join small group sessions for hands-on learning and in-depth exploration of specific topics. + Learn alongside other attendees with direct guidance from industry experts. +

+
+
+ #for(session in groupDropInSessions): +
+ #(session.owner) avatar image +
+

#(session.title)

+

#(session.owner)

+
+
+ #endfor +
+
+ #endif + diff --git a/Sources/App/Context/HomeContext.swift b/Sources/App/Context/HomeContext.swift index d1998f9f..41408e32 100644 --- a/Sources/App/Context/HomeContext.swift +++ b/Sources/App/Context/HomeContext.swift @@ -15,6 +15,8 @@ struct HomeContext: Content { var silverSponsors: [Sponsor] = [] var goldSponsors: [Sponsor] = [] var dropInSessions: [DropInSession] = [] + var regularDropInSessions: [DropInSession] = [] + var groupDropInSessions: [DropInSession] = [] var schedule: [ScheduleDay] = [] var phase: PhaseContext? = nil var event: EventContext? = nil diff --git a/Sources/App/Features/Home/HomeRouteController.swift b/Sources/App/Features/Home/HomeRouteController.swift index 510dedba..9845f96e 100644 --- a/Sources/App/Features/Home/HomeRouteController.swift +++ b/Sources/App/Features/Home/HomeRouteController.swift @@ -124,12 +124,17 @@ struct HomeRouteController: RouteCollection { $0.date < $1.date }) + let regularDropInSessions = dropInSessions.filter { $0.maxTicketsPerSlot == 1 } + let groupDropInSessions = dropInSessions.filter { $0.maxTicketsPerSlot > 1 } + return HomeContext( speakers: speakers, platinumSponsors: platinumSponsors, silverSponsors: silverSponsors, goldSponsors: goldSponsors, dropInSessions: dropInSessions, + regularDropInSessions: regularDropInSessions, + groupDropInSessions: groupDropInSessions, schedule: phase.showSchedule ? schedule : [], phase: PhaseContext(phase: phase, event: event), event: eventContext diff --git a/seed.sql b/seed.sql index ffc7dd57..8315638c 100644 --- a/seed.sql +++ b/seed.sql @@ -159,27 +159,37 @@ INSERT INTO "locations" ("id", "name", "url", "lat", "lon", "category_id") VALUE ('09a8ddac-7dca-4f99-80ba-66750571cbf9', '200 Degrees', 'http://www.200degs.com/leeds-bond-street', 53.79760107211073, -1.5459528678505592, 'dd19c880-1723-4af2-8005-b4ceffcbd6e2'); TRUNCATE TABLE "dropin_sessions" CASCADE; -INSERT INTO "dropin_sessions" ("id", "title", "description", "owner", "owner_image_url", "owner_link", "event_id") VALUES -('175fd73b-28a7-4f94-a4c0-e62478140f2f', 'App Accessibility Review', 'todo', 'Daniel Devesa Derksen-Staats', 'O87Gvgjg_400x400.jpeg', 'https://twitter.com/dadederk', 'a6b202de-6135-4e71-bdb0-290ecff798a8'), +INSERT INTO "dropin_sessions" ("id", "title", "description", "owner", "owner_image_url", "owner_link", "event_id", "max_tickets", "exclusivity_key", "is_public", "company", "company_image_url", "company_link") VALUES +('175fd73b-28a7-4f94-a4c0-e62478140f2f', 'App Accessibility Review', 'todo', 'Daniel Devesa Derksen-Staats', 'O87Gvgjg_400x400.jpeg', 'https://twitter.com/dadederk', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 1, 'A', true, NULL, NULL, NULL), ('7077ef86-9212-46a6-97e4-bda99822a0a9', 'App Store Optimization Review', 'We are excited to have Ariel from AppFigures available to provide a full App Store Optimization review of your app. -You will be allocated a timeslot throughout the day of the conference, and you can sit down, ask questions and get the opinion of an ASO expert.', 'Ariel from Appfigures', 'y4oh0Nb__400x400.jpeg', 'https://twitter.com/arielmichaeli', 'a6b202de-6135-4e71-bdb0-290ecff798a8'), +You will be allocated a timeslot throughout the day of the conference, and you can sit down, ask questions and get the opinion of an ASO expert.', 'Ariel from Appfigures', 'y4oh0Nb__400x400.jpeg', 'https://twitter.com/arielmichaeli', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 1, 'A', true, NULL, NULL, NULL), ('813dee8f-89cb-4480-8e04-f28ad36554d6', 'App Design Review', 'We are excited to have Hidde van der Ploeg available to provide a design review of your iOS application. -You will be allocated a timeslot throughout the day of the conference, and you can sit down, ask questions and get the opinion of a design expert.', 'Hidde van der Ploeg', 'Zpow22F5_400x400.jpeg', 'https://twitter.com/hiddevdploeg', 'a6b202de-6135-4e71-bdb0-290ecff798a8'), +You will be allocated a timeslot throughout the day of the conference, and you can sit down, ask questions and get the opinion of a design expert.', 'Hidde van der Ploeg', 'Zpow22F5_400x400.jpeg', 'https://twitter.com/hiddevdploeg', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 1, 'A', true, NULL, NULL, NULL), ('b544d903-795c-42aa-97d7-e2af44a505c4', 'Indie Developer App Review', 'Do you have an Indie App you would like to get **FREE** advice about? Jordi Bruin will be onsite, ready to answer your questions about your app and help you with anything that you might be struggling with, code or otherwise. Jordi Bruin is a world-class Indie app developer and was recently nominated for an Apple Design Award. Slots will be limited and on a first-come, first-serve basis. By opting for this in your ticket, you''ll be provided with a set day and time for meeting Jordi Bruin in a 1-1 meeting. -**Please note;** you must only opt for this if your app is built by you independently and isn''t a company application.', 'Jordi Bruin', 'Tp9T2p2C_400x400.jpeg', 'https://twitter.com/jordibruin', 'a6b202de-6135-4e71-bdb0-290ecff798a8'); +**Please note;** you must only opt for this if your app is built by you independently and isn''t a company application.', 'Jordi Bruin', 'Tp9T2p2C_400x400.jpeg', 'https://twitter.com/jordibruin', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 1, 'A', true, NULL, NULL, NULL), +('c544d903-795c-42aa-97d7-e2af44a505c5', 'SwiftUI Workshop', 'Join our expert-led workshop on advanced SwiftUI techniques. Perfect for small groups who want to dive deep into SwiftUI patterns and best practices.', 'Paul Hudson', 'paul_hudson.jpeg', 'https://twitter.com/twostraws', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 5, 'B', true, 'Hacking with Swift', 'hws_logo.png', 'https://hackingwithswift.com'), +('d644e903-895c-52aa-98d7-e3af44a515c6', 'Core Data Masterclass', 'A group session focused on mastering Core Data. Learn advanced techniques, debugging strategies, and performance optimization in a collaborative environment.', 'Donny Wals', 'donnywals.jpeg', 'https://twitter.com/donnywals', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 4, 'B', true, NULL, NULL, NULL), +('e744f903-995c-62aa-a8d7-f3af44a525c7', 'Testing Strategies Roundtable', 'Join fellow developers in a roundtable discussion about testing strategies for iOS apps. Share experiences and learn from others in this collaborative session.', 'John Sundell', 'john_sundell.jpeg', 'https://twitter.com/johnsundell', 'a6b202de-6135-4e71-bdb0-290ecff798a8', 6, 'C', true, 'Swift by Sundell', 'sbs_logo.png', 'https://swiftbysundell.com'); TRUNCATE TABLE "dropin_session_slots" CASCADE; -INSERT INTO "dropin_session_slots" ("id", "session_id", "date", "ticket", "ticket_owner") VALUES -('6400c626-1b90-4a03-81cc-76d5bb494d87', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 14:00:00+01', NULL, NULL), -('8740803d-a4f0-4d6b-b15c-4c7c29e7f75d', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-19 13:00:00+01', NULL, NULL), -('bf5d89aa-8ae9-4c06-b79f-56a36c8d3eb9', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 17:15:00+01', NULL, NULL), -('c1bb2aed-cef1-452d-8503-db13596cbc37', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 16:45:00+01', 'reserved', 'Adam Rush'), -('dc146ae5-607b-4e07-8c3d-7db0a10c20d6', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 16:30:00+01', 'ti_test_p05Ch95xJS5AStInfa8whFA', 'James Sherlock'), -('f9bc67a4-10e9-4dac-8ede-561f0d9826d3', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 17:00:00+01', NULL, NULL); +INSERT INTO "dropin_session_slots" ("id", "session_id", "date", "ticket", "ticket_owner", "duration") VALUES +-- Regular 1-on-1 sessions +('6400c626-1b90-4a03-81cc-76d5bb494d87', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 14:00:00+01', '{}', '{}', 30), +('8740803d-a4f0-4d6b-b15c-4c7c29e7f75d', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-19 13:00:00+01', '{}', '{}', 30), +('bf5d89aa-8ae9-4c06-b79f-56a36c8d3eb9', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 17:15:00+01', '{}', '{}', 30), +('c1bb2aed-cef1-452d-8503-db13596cbc37', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 16:45:00+01', '{"reserved"}', '{"Adam Rush"}', 30), +('dc146ae5-607b-4e07-8c3d-7db0a10c20d6', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 16:30:00+01', '{"ti_test_p05Ch95xJS5AStInfa8whFA"}', '{"James Sherlock"}', 30), +('f9bc67a4-10e9-4dac-8ede-561f0d9826d3', '175fd73b-28a7-4f94-a4c0-e62478140f2f', '2023-10-18 17:00:00+01', '{}', '{}', 30), +-- Group sessions +('a400c626-1b90-4a03-81cc-76d5bb494d88', 'c544d903-795c-42aa-97d7-e2af44a505c5', '2023-10-18 14:00:00+01', '{"ticket1", "ticket2"}', '{"John Doe", "Jane Smith"}', 60), +('b400c626-1b90-4a03-81cc-76d5bb494d89', 'c544d903-795c-42aa-97d7-e2af44a505c5', '2023-10-18 15:30:00+01', '{}', '{}', 60), +('c400c626-1b90-4a03-81cc-76d5bb494d90', 'd644e903-895c-52aa-98d7-e3af44a515c6', '2023-10-18 14:30:00+01', '{"ticket3"}', '{"Bob Wilson"}', 45), +('d400c626-1b90-4a03-81cc-76d5bb494d91', 'd644e903-895c-52aa-98d7-e3af44a515c6', '2023-10-18 16:00:00+01', '{}', '{}', 45), +('e400c626-1b90-4a03-81cc-76d5bb494d92', 'e744f903-995c-62aa-a8d7-f3af44a525c7', '2023-10-18 15:00:00+01', '{"ticket4", "ticket5", "ticket6"}', '{"Alice Green", "Tom Brown", "Sarah White"}', 90); From 579df88016ed9f4beb763ba58fe9050ff4a30f39 Mon Sep 17 00:00:00 2001 From: adamrushy Date: Thu, 18 Sep 2025 11:10:34 +0100 Subject: [PATCH 2/3] Tidy --- Resources/Views/Home/_drop-in-sessions.leaf | 4 +-- Resources/Views/Hub/home.leaf | 27 ++++++++++--------- Sources/App/Context/HomeContext.swift | 1 - .../Features/Home/HomeRouteController.swift | 1 - .../TicketHubRouteController.swift | 14 +++++----- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Resources/Views/Home/_drop-in-sessions.leaf b/Resources/Views/Home/_drop-in-sessions.leaf index e518faa2..88398e61 100644 --- a/Resources/Views/Home/_drop-in-sessions.leaf +++ b/Resources/Views/Home/_drop-in-sessions.leaf @@ -11,7 +11,7 @@

Included for free with every ticket, drop-in sessions give you exclusive 1-on-1 feedback sessions with our industry experts. You can book both - individual and group sessions to maximize your learning experience. + individual and group sessions to maximize your learning experience.

#if(count(regularDropInSessions) > 0 || count(groupDropInSessions) > 0): #if(count(regularDropInSessions) > 0): @@ -31,7 +31,7 @@ #endif #if(count(groupDropInSessions) > 0): -

Group Drop-In Sessions

+

#if(event.year == 2025):NEW#endif Group Drop-In Sessions

Join small group sessions for hands-on learning and in-depth exploration of specific topics. Learn alongside other attendees with direct guidance from industry experts. diff --git a/Resources/Views/Hub/home.leaf b/Resources/Views/Hub/home.leaf index 618dd230..2ea8e464 100644 --- a/Resources/Views/Hub/home.leaf +++ b/Resources/Views/Hub/home.leaf @@ -55,15 +55,15 @@ Merch Preferences #endif - - #if(count(dropInSessions) > 0 && !event.isPast): + + #if(regularDropInSessions || groupDropInSessions): Drop-In Sessions #endif - #if(count(groupSessions) > 0): + #if(groupDropInSessions): Focus Groups @@ -217,12 +217,12 @@


#endif - - #if(count(dropInSessions) > 0 && !event.isPast): + + #if(regularDropInSessions || groupDropInSessions):

Drop-In Sessions

-

Drop-In sessions enable you to have a one-to-one conversation with one of our fantastic hosts below. Each session covers a unique subject, such as your apps, career, or anything else you want to discuss.

-

Drop-In sessions are free, and one session is included in your ticket cost. However, slots are limited and offered on a first-come, first-served basis, so why not book a slot below?

+

Drop-In sessions give you exclusive access to industry experts through both individual and group sessions. Each session covers unique subjects like your apps, career advice, or technical deep-dives.

+

All drop-in sessions are included free with your ticket. You can book both a regular 1-on-1 session and a group session. Slots are limited and offered on a first-come, first-served basis, so secure your spots below!

#if(prompt): @@ -268,19 +268,20 @@ #endfor
#endif - - #for(session in dropInSessions): + + #for(session in regularDropInSessions): #extend("Hub/_carousel") #endfor - +
#endif - #if(count(groupSessions) > 0): + #if(groupDropInSessions):

Focus Groups

- +

Join small group sessions for hands-on learning and in-depth exploration of specific topics. These interactive sessions allow you to learn alongside other attendees with direct guidance from industry experts.

+

Focus groups are perfect for collaborative learning and networking. You can book a focus group session in addition to your individual drop-in session.

- #for(session in groupSessions): + #for(session in groupDropInSessions): #extend("Hub/_carousel") #endfor diff --git a/Sources/App/Context/HomeContext.swift b/Sources/App/Context/HomeContext.swift index 41408e32..40bee650 100644 --- a/Sources/App/Context/HomeContext.swift +++ b/Sources/App/Context/HomeContext.swift @@ -14,7 +14,6 @@ struct HomeContext: Content { var platinumSponsors: [Sponsor] = [] var silverSponsors: [Sponsor] = [] var goldSponsors: [Sponsor] = [] - var dropInSessions: [DropInSession] = [] var regularDropInSessions: [DropInSession] = [] var groupDropInSessions: [DropInSession] = [] var schedule: [ScheduleDay] = [] diff --git a/Sources/App/Features/Home/HomeRouteController.swift b/Sources/App/Features/Home/HomeRouteController.swift index 9845f96e..ae779cd2 100644 --- a/Sources/App/Features/Home/HomeRouteController.swift +++ b/Sources/App/Features/Home/HomeRouteController.swift @@ -132,7 +132,6 @@ struct HomeRouteController: RouteCollection { platinumSponsors: platinumSponsors, silverSponsors: silverSponsors, goldSponsors: goldSponsors, - dropInSessions: dropInSessions, regularDropInSessions: regularDropInSessions, groupDropInSessions: groupDropInSessions, schedule: phase.showSchedule ? schedule : [], diff --git a/Sources/App/Features/Ticket Hub/Controllers/TicketHubRouteController.swift b/Sources/App/Features/Ticket Hub/Controllers/TicketHubRouteController.swift index dfda2749..ee3fc5a9 100644 --- a/Sources/App/Features/Ticket Hub/Controllers/TicketHubRouteController.swift +++ b/Sources/App/Features/Ticket Hub/Controllers/TicketHubRouteController.swift @@ -32,8 +32,10 @@ struct TicketHubRouteController: RouteCollection { .all() .filter { $0.isPublic } - let dropInSessions = sessions.filter { $0.maxTicketsPerSlot == 1 }.map { convertDropInSessionToViewModel($0, slug: ticket.slug) } - let groupSessions = sessions.filter { $0.maxTicketsPerSlot > 1 }.map { convertDropInSessionToViewModel($0, slug: ticket.slug) } + + let regularDropInSessions = sessions.filter { $0.maxTicketsPerSlot == 1 }.map { convertDropInSessionToViewModel($0, slug: ticket.slug) } + let groupDropInSessions = sessions.filter { $0.maxTicketsPerSlot > 1 }.map { convertDropInSessionToViewModel($0, slug: ticket.slug) } + let userSessions = sessions.filter { $0.maxTicketsPerSlot > 0 && $0.slots.contains(where: { $0.ticket.contains(ticket.slug) }) } .map { convertDropInSessionToViewModel($0, slug: ticket.slug) } @@ -70,8 +72,8 @@ struct TicketHubRouteController: RouteCollection { ), videos: videos, userSessions: userSessions, - dropInSessions: dropInSessions, - groupSessions: groupSessions, + regularDropInSessions: regularDropInSessions, + groupDropInSessions: groupDropInSessions, refund: .init( active: Date() < refundDeadline, days: refundDays, @@ -310,8 +312,8 @@ struct TicketHubContext: Content { let ticket: Ticket let videos: [VideoPresentation] let userSessions: [Session] - let dropInSessions: [Session] - let groupSessions: [Session] + let regularDropInSessions: [Session] + let groupDropInSessions: [Session] let refund: Refund let hasValidTicket: Bool let canViewDropInSessionParticipants: Bool From fb026df510e341c9f778461e2c87bd4d03058c96 Mon Sep 17 00:00:00 2001 From: adamrushy Date: Thu, 18 Sep 2025 11:44:50 +0100 Subject: [PATCH 3/3] Tidy --- Resources/Views/Hub/home.leaf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Views/Hub/home.leaf b/Resources/Views/Hub/home.leaf index 2ea8e464..7a19037f 100644 --- a/Resources/Views/Hub/home.leaf +++ b/Resources/Views/Hub/home.leaf @@ -56,17 +56,17 @@
#endif - #if(regularDropInSessions || groupDropInSessions): + #if((regularDropInSessions || groupDropInSessions) && !event.isPast): Drop-In Sessions #endif - #if(groupDropInSessions): + #if(count(groupDropInSessions) > 0): - Focus Groups + Group Drop-In Sessions #endif @@ -218,7 +218,7 @@
#endif - #if(regularDropInSessions || groupDropInSessions): + #if((regularDropInSessions || groupDropInSessions) && !event.isPast):

Drop-In Sessions

Drop-In sessions give you exclusive access to industry experts through both individual and group sessions. Each session covers unique subjects like your apps, career advice, or technical deep-dives.

@@ -276,10 +276,10 @@
#endif - #if(groupDropInSessions): -

Focus Groups

+ #if(count(groupDropInSessions) > 0): +

Group Drop-In

Join small group sessions for hands-on learning and in-depth exploration of specific topics. These interactive sessions allow you to learn alongside other attendees with direct guidance from industry experts.

-

Focus groups are perfect for collaborative learning and networking. You can book a focus group session in addition to your individual drop-in session.

+

Group Drop-In sessions are perfect for collaborative learning and networking. You can book a group drop-in session in addition to your individual drop-in session.

#for(session in groupDropInSessions): #extend("Hub/_carousel")