diff --git a/Resources/Views/Home/_drop-in-sessions.leaf b/Resources/Views/Home/_drop-in-sessions.leaf index e3ce2d7..88398e6 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): +

#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. +

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

#(session.title)

+

#(session.owner)

+
+
+ #endfor +
+
+ #endif + diff --git a/Resources/Views/Hub/home.leaf b/Resources/Views/Hub/home.leaf index 618dd23..7a19037 100644 --- a/Resources/Views/Hub/home.leaf +++ b/Resources/Views/Hub/home.leaf @@ -55,18 +55,18 @@ Merch Preferences #endif - - #if(count(dropInSessions) > 0 && !event.isPast): + + #if((regularDropInSessions || groupDropInSessions) && !event.isPast): Drop-In Sessions #endif - #if(count(groupSessions) > 0): + #if(count(groupDropInSessions) > 0): - Focus Groups + Group Drop-In Sessions #endif @@ -217,12 +217,12 @@
#endif - - #if(count(dropInSessions) > 0 && !event.isPast): + + #if((regularDropInSessions || groupDropInSessions) && !event.isPast):

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): -

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.

+

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 groupSessions): + #for(session in groupDropInSessions): #extend("Hub/_carousel") #endfor diff --git a/Sources/App/Context/HomeContext.swift b/Sources/App/Context/HomeContext.swift index d1998f9..40bee65 100644 --- a/Sources/App/Context/HomeContext.swift +++ b/Sources/App/Context/HomeContext.swift @@ -14,7 +14,8 @@ struct HomeContext: Content { var platinumSponsors: [Sponsor] = [] 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 510dedb..ae779cd 100644 --- a/Sources/App/Features/Home/HomeRouteController.swift +++ b/Sources/App/Features/Home/HomeRouteController.swift @@ -124,12 +124,16 @@ 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/Sources/App/Features/Ticket Hub/Controllers/TicketHubRouteController.swift b/Sources/App/Features/Ticket Hub/Controllers/TicketHubRouteController.swift index dfda274..ee3fc5a 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 diff --git a/seed.sql b/seed.sql index ffc7dd5..8315638 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);