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
14 changes: 12 additions & 2 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -520,12 +520,12 @@ hr {
color: #ffffff;
}

.item-badge--social {
.item-badge--meal {
background-color: #FEF3C7;
color: #8A5A00;
}

.item-badge--logistics {
.item-badge--reception {
background-color: #EEF1F4;
color: #525C66;
}
Expand All @@ -545,6 +545,16 @@ hr {
color: #1E5A8A;
}

.item-badge--community {
background-color: #E6F4EC;
color: #1F6B45;
}

.item-badge--volunteer {
background-color: #FFEDD5;
color: #9A3412;
}

.item-badge--custom {
background-color: transparent;
color: #C41C1C;
Expand Down
5 changes: 4 additions & 1 deletion app/models/schedule_item.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ class ScheduleItem < ApplicationRecord
has_many :attendees, through: :plan_items, source: :user
has_many :embassy_bookings, dependent: :destroy

enum :kind, { talk: 0, lightning: 1, embassy: 2, activity: 3 }
enum :kind, {
talk: 0, lightning: 1, embassy: 2, activity: 3,
reception: 4, meal: 5, community: 6, volunteer: 7
}

validates :title, presence: true
validates :day, presence: true
Expand Down
10 changes: 5 additions & 5 deletions app/views/admin/dashboard/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@
<span class="action-card__badge">Soon</span>
</div>

<%= link_to admin_schedule_items_path, class: "action-card" do %>
<div class="action-card__title">Schedule</div>
<div class="action-card__description">Full CRUD over the conference agenda — all schedule items, by kind.</div>
<% end %>

<%= link_to admin_embassy_applications_path, class: "action-card" do %>
<div class="action-card__title">Embassy Applications</div>
<div class="action-card__description">Review adjudicated applications by serial. Print individual copies for the Attaché.</div>
Expand All @@ -53,11 +58,6 @@
<div class="action-card__description">Print N blank randomized applications for walk-ins and stragglers.</div>
<% end %>

<%= link_to admin_schedule_items_path, class: "action-card" do %>
<div class="action-card__title">Schedule Items</div>
<div class="action-card__description">Full CRUD over the conference agenda — talks, lightning, embassy, activities.</div>
<% end %>

<%= link_to "/admin/jobs", class: "action-card" do %>
<div class="action-card__title">Background Jobs</div>
<div class="action-card__description">Inspect background jobs and the Solid Queue dashboard.</div>
Expand Down
1 change: 1 addition & 0 deletions app/views/layouts/admin.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
Volunteers
<span class="nav-soon">Soon</span>
</span>
<%= link_to "Schedule", admin_schedule_items_path %>
<%= link_to "Embassy Applications", admin_embassy_applications_path %>
<span class="ml-auto flex items-center gap-4">
<%= link_to "User Dashboard", dashboard_path %>
Expand Down
28 changes: 18 additions & 10 deletions app/views/schedule/_session_item.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
"talk" => "Talk",
"lightning" => "Lightning",
"embassy" => "Embassy",
"activity" => "Activity"
"activity" => "Activity",
"reception" => "Reception",
"meal" => "Meal",
"community" => "Community",
"volunteer" => "Volunteer"
}[item.kind]
flexible_classes = item.flexible? ? "schedule-item--flexible" : ""

Expand All @@ -12,24 +16,28 @@

button_label =
if planned
if item.talk?
"✓ Added"
elsif item.embassy?
if item.embassy?
"✓ Booked"
else
elsif item.activity?
"✓ RSVP'd"
elsif item.volunteer?
"✓ Volunteering"
else
"✓ Added"
end
else
if item.talk?
"+ Add to plan"
elsif item.embassy?
if item.embassy?
"Schedule Appointment"
else
elsif item.activity?
"+ RSVP"
elsif item.volunteer?
"+ Volunteer"
else
"+ Add to plan"
end
end

rsvp_note = (!item.talk? && !item.embassy? && item.rsvp_count > 0) ? "#{item.rsvp_count} going" : nil
rsvp_note = (item.activity? && item.rsvp_count > 0) ? "#{item.rsvp_count} going" : nil
%>

<%= turbo_frame_tag dom_id(item) do %>
Expand Down
158 changes: 110 additions & 48 deletions config/schedule.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
---
# Blue Ridge Ruby 2025 conference schedule.
# Item kinds: talk, lightning, embassy, activity
# `flexible: true` renders the item with a dashed/TBD treatment (Saturday activities).
# Item kinds: talk, lightning, embassy, activity, reception, meal, community, volunteer
# `flexible: true` renders the item with a dashed/TBD treatment.
# Mirrors https://blueridgeruby.com/schedule — keep in sync if the public schedule changes.

:days:
- :anchor: wed
Expand All @@ -13,8 +14,9 @@
:time: "7:00 PM"
:sort_time: 1900
:title: "Pre-Conference Meetup"
:type: activity
:type: community
:location: "Wicked Weed Brew Pub"
:description: "We'll probably try to find a spot for all of us in the beer garden downstairs in the back."

- :anchor: thu
:date: "April 30"
Expand All @@ -24,25 +26,35 @@
- :id: thu-registration
:time: "8:00 AM"
:sort_time: 800
:title: "Registration & Coffee"
:type: embassy
:title: "Registration, Coffee, Light Snacks"
:type: reception
- :id: thu-welcome
:time: "9:00 AM"
:sort_time: 900
:title: "Welcome"
:type: embassy
:title: "Welcome, Day 1"
:type: reception
- :id: thu-talk-1
:time: "9:30 AM"
:sort_time: 930
:host: "John Athayde"
:title: "Learning from Permaculture: Sustainable Software Development"
:type: talk
- :id: thu-break-1
:time: "10:00 AM"
:sort_time: 1000
:title: "Break"
:type: reception
- :id: thu-talk-2
:time: "10:30 AM"
:sort_time: 1030
:host: "Joël Quenneville"
:title: "State is the First Decision You Never Made"
:type: talk
- :id: thu-break-2
:time: "11:00 AM"
:sort_time: 1100
:title: "Break"
:type: reception
- :id: thu-talk-3
:time: "11:30 AM"
:sort_time: 1130
Expand All @@ -53,29 +65,52 @@
:time: "12:00 PM"
:sort_time: 1200
:title: "Open Lunch"
:type: activity
:type: meal
:description: "(Coordinate on Slack)"
- :id: thu-mystery
:time: "2:00 PM"
:sort_time: 1400
:title: "Mystery Activity"
:type: activity
:title: "Mystery Activity 👀"
:type: community
- :id: thu-break-3
:time: "2:30 PM"
:sort_time: 1430
:title: "Break"
:type: reception
- :id: thu-talk-4
:time: "3:00 PM"
:sort_time: 1500
:host: "Annie Kiley"
:title: "How To Finish What You Start: Lessons From Actually Shipping a Big Refactor"
:type: talk
- :id: thu-break-4
:time: "3:30 PM"
:sort_time: 1530
:title: "Break"
:type: reception
- :id: thu-talk-5
:time: "4:00 PM"
:sort_time: 1600
:host: "Kevin Murphy"
:title: "InstiLLment of Successful Practices in an Agentic World"
:type: talk
- :id: thu-closing
:time: "4:30 PM"
:sort_time: 1630
:title: "Closing, Day 1"
:type: reception
- :id: thu-dinner
:time: "Evening"
:sort_time: 1800
:title: "Open Dinner & Roundtable"
:type: activity
:time: "5:00 PM"
:sort_time: 1700
:title: "Open Dinner"
:type: meal
:description: "(Coordinate on Slack)"
- :id: thu-roundtable
:time: "7:00 PM"
:sort_time: 1900
:title: "Roundtable Discussion"
:type: community
:location: "YMI Cultural Center"

- :anchor: fri
:date: "May 1"
Expand All @@ -85,82 +120,109 @@
- :id: fri-coffee
:time: "8:00 AM"
:sort_time: 800
:title: "Coffee"
:type: embassy
:title: "Coffee, Light Snacks"
:type: reception
- :id: fri-welcome
:time: "9:00 AM"
:sort_time: 900
:title: "Welcome, Day 2"
:type: reception
- :id: fri-talk-1
:time: "9:30 AM"
:sort_time: 930
:host: "Brooke Kuhlmann"
:title: "Terminus: A Hanami + htmx web application for e-ink devices"
:type: talk
- :id: fri-break-1
:time: "10:00 AM"
:sort_time: 1000
:title: "Break"
:type: reception
- :id: fri-talk-2
:time: "10:30 AM"
:sort_time: 1030
:host: "Rachael Wright-Munn"
:title: "Your First Open-Source Contribution"
:type: talk
- :id: fri-break-2
:time: "11:00 AM"
:sort_time: 1100
:title: "Break"
:type: reception
- :id: fri-talk-3
:time: "11:30 AM"
:sort_time: 1130
:host: "David Paluy"
:title: "LLM Telemetry as a First-Class Rails Concern"
:type: talk
- :id: fri-lunch
:time: "12:00 PM"
:sort_time: 1200
:title: "Open Lunch"
:type: meal
:description: "(Coordinate on Slack)"
- :id: fri-lightning
:time: "2:00 PM"
:sort_time: 1400
:title: "Lightning Talks"
:type: lightning
:description: "8–10 Total"
- :id: fri-break-3
:time: "3:00 PM"
:sort_time: 1500
:title: "Break"
:type: reception
- :id: fri-talk-4
:time: "3:30 PM"
:sort_time: 1530
:host: "Christine Seeman"
:title: "Optimize Your Mindset (Without Overclocking)"
:type: talk
- :id: fri-break-4
:time: "4:00 PM"
:sort_time: 1600
:title: "Break"
:type: reception
- :id: fri-talk-5
:time: "4:30 PM"
:sort_time: 1630
:host: "Thomas Cannon"
:title: "5 ways to invest in yourself for the long haul"
:type: talk
- :id: fri-closing
:time: "5:00 PM"
:sort_time: 1700
:title: "Closing, Day 2"
:type: reception
- :id: fri-dinner
:time: "5:30 PM"
:sort_time: 1730
:title: "Open Dinner"
:type: meal
:description: "(Coordinate on Slack)"
- :id: fri-afterparty
:time: "Evening"
:sort_time: 1900
:time: "8:00 PM"
:sort_time: 2000
:title: "Afterparty"
:type: activity
:type: community
:location: "Burial Beer Co. South Slope"

- :anchor: sat
:date: "May 2"
:label: "Saturday"
:subtitle: "Activities & Ruby Embassy"
:subtitle: "Hack Day & Ruby Embassy"
:items:
- :id: sat-morning
:time: "Morning"
- :id: sat-hackday
:time: "9:00 AM"
:sort_time: 900
:title: "Morning Activities"
:type: activity
:flexible: true
- :id: sat-embassy-am
:time: "Morning Block"
:sort_time: 1000
:title: "Ruby Embassy Appointments"
:type: embassy
:flexible: true
- :id: sat-afternoon
:time: "Afternoon"
:sort_time: 1300
:title: "Afternoon Activities"
:type: activity
:flexible: true
- :id: sat-embassy-pm
:time: "Afternoon Block"
:sort_time: 1400
:title: "Ruby Embassy Appointments"
:type: embassy
:flexible: true
- :id: sat-evening
:time: "Evening"
:sort_time: 1800
:title: "Evening Activities"
:title: "Hack Day"
:type: community
:location: "YMI Cultural Center"
:description: "Hack on projects, or just come and hang out! (Ends at 4:00 PM)"
- :id: sat-dinner
:time: "5:00 PM"
:sort_time: 1700
:title: "Informal Dinner"
:type: activity
:flexible: true
:location: "Asheville Pizza South Slope"
:description: "For those still in town, let's get dinner one last time!"
Loading
Loading