Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
36 changes: 30 additions & 6 deletions Resources/Views/Home/_drop-in-sessions.leaf
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@
<div class="col-md-6">
<h2 class="h3 mb-sm-4">#if(event.year == 2023):<span class="badge bg-primary fs-sm align-middle me-2">NEW</span>#endif Drop-In Sessions</h2>
<p class="d-md-none d-xl-block pb-2 pb-md-3 mb-3">
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 <strong>and</strong> group sessions to maximize your learning experience.
</p>
#if(count(dropInSessions) > 0):
<div class="border rounded-3 mb-4 mb-lg-5">
#if(count(regularDropInSessions) > 0 || count(groupDropInSessions) > 0):
#if(count(regularDropInSessions) > 0):
<div class="border rounded-3 mb-4">
<div class="row row-cols-1 row-cols-sm-2 g-0">
#for(session in dropInSessions):
#for(session in regularDropInSessions):
<div class="col d-flex align-items-center #if(index == 0 || index == 1):border-bottom#endif #if(index == 0 || index == 2):border-end-sm#endif p-3">
<img src="#awsImage(session.ownerImageUrl)" width="48" alt="#(session.owner) avatar image" class="rounded-circle">
<div class="ps-2 ms-1">
Expand All @@ -27,6 +28,29 @@
#endfor
</div>
</div>
#endif

#if(count(groupDropInSessions) > 0):
<h3 class="h5 mb-3 mt-4">#if(event.year == 2025):<span class="badge bg-primary fs-sm align-middle me-2">NEW</span>#endif Group Drop-In Sessions</h3>
<p class="d-md-none d-xl-block pb-2 pb-md-3 mb-3">
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.
</p>
<div class="border rounded-3 mb-4 mb-lg-5">
<div class="row #if(count(groupDropInSessions) > 1):row-cols-1 row-cols-sm-2#endif g-0">
#for(session in groupDropInSessions):
<div class="col d-flex align-items-center #if(count(groupDropInSessions) > 1):#if(index == 0 || index == 1):border-bottom#endif #if(index == 0 || index == 2):border-end-sm#endif#endif p-3">
<img src="#awsImage(session.ownerImageUrl)" width="48" alt="#(session.owner) avatar image" class="rounded-circle">
<div class="ps-2 ms-1">
<h3 class="h6 mb-0">#(session.title)</h3>
<p class="fs-xs mb-0"><a href="#(session.ownerLink)" target="_blank">#(session.owner)</a></p>
</div>
</div>
#endfor
</div>
</div>
#endif

<div class="d-flex flex-column flex-sm-row">
<a href="/ticket#dropin" class="btn btn-primary mb-3 mb-sm-0 me-sm-3">Book Session</a>
</div>
Expand Down
31 changes: 16 additions & 15 deletions Resources/Views/Hub/home.leaf
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,18 @@
Merch Preferences
</a>
#endif
#if(count(dropInSessions) > 0 && !event.isPast):

#if((regularDropInSessions || groupDropInSessions) && !event.isPast):
<a href="#dropin" data-scroll data-scroll-offset="70" class="list-group-item list-group-item-action d-flex align-items-center">
<i class="bx bx-chat fs-xl opacity-60 me-2"></i>
Drop-In Sessions
</a>
#endif

#if(count(groupSessions) > 0):
#if(count(groupDropInSessions) > 0):
<a href="#focus" data-scroll data-scroll-offset="70" class="list-group-item list-group-item-action d-flex align-items-center">
<i class="bx bx-group fs-xl opacity-60 me-2"></i>
Focus Groups
Group Drop-In Sessions
</a>
#endif

Expand Down Expand Up @@ -217,12 +217,12 @@

<hr />
#endif
#if(count(dropInSessions) > 0 && !event.isPast):

#if((regularDropInSessions || groupDropInSessions) && !event.isPast):
<!-- Drop-In -->
<h2 id="dropin" class="h5 text-primary pt-1 pt-lg-3 mt-4">Drop-In Sessions</h2>
<p>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.</p>
<p>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?</p>
<p>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.</p>
<p>All drop-in sessions are included free with your ticket. You can book both a regular 1-on-1 session <strong>and</strong> a group session. Slots are limited and offered on a first-come, first-served basis, so secure your spots below!</p>

#if(prompt):
<div class="alert alert-secondary" role="alert">#(prompt)</div>
Expand Down Expand Up @@ -268,19 +268,20 @@
#endfor
</div>
#endif
#for(session in dropInSessions):

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

<hr class="mt-3" />
#endif

#if(count(groupSessions) > 0):
<h2 id="focus" class="h5 text-primary pt-1 pt-lg-3 mt-4">Focus Groups</h2>
<!-- TODO: add explanation of group sessions -->
#if(count(groupDropInSessions) > 0):
<h2 id="focus" class="h5 text-primary pt-1 pt-lg-3 mt-4">Group Drop-In</h2>
<p>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.</p>
<p>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.</p>

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

Expand Down
3 changes: 2 additions & 1 deletion Sources/App/Context/HomeContext.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion Sources/App/Features/Home/HomeRouteController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) }

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
34 changes: 22 additions & 12 deletions seed.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Loading