Skip to content
Open
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
1 change: 1 addition & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,7 @@ GEM
PLATFORMS
aarch64-linux
arm64-darwin-20
arm64-darwin-23
arm64-darwin-25
x86_64-darwin-24
x86_64-linux
Expand Down
56 changes: 38 additions & 18 deletions app/controllers/events_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,20 @@
class EventsController < ApplicationController
before_action :is_logged_in?, only: %i[student coach]

RECENT_EVENTS_DISPLAY_LIMIT = 40

def index
redirect_to upcoming_events_path
end

def upcoming
fresh_when(latest_model_updated, etag: latest_model_updated)

events = [Workshop.past.includes(:chapter,
:sponsors).joins(:chapter).merge(Chapter.active).limit(RECENT_EVENTS_DISPLAY_LIMIT)]
events << Meeting.past.includes(:venue).limit(RECENT_EVENTS_DISPLAY_LIMIT)
events << Event.past.includes(:venue, :sponsors, :sponsorships).limit(RECENT_EVENTS_DISPLAY_LIMIT)
events = events.compact.flatten.sort_by(&:date_and_time).reverse.first(RECENT_EVENTS_DISPLAY_LIMIT)
events_hash_grouped_by_date = events.group_by(&:date)
@past_events = events_hash_grouped_by_date.map.each_with_object({}) do |(key, value), hash|
hash[key] = EventPresenter.decorate_collection(value)
end
@events, @pagy = fetch_upcoming_events
end

events = [Workshop.includes(:chapter, :sponsors).upcoming.joins(:chapter).merge(Chapter.active)]
events << Meeting.upcoming.all
events << Event.upcoming.includes(:venue, :sponsors, :sponsorships).all
events = events.compact.flatten.sort_by(&:date_and_time).group_by(&:date)
@events = events.map.each_with_object({}) do |(key, value), hash|
hash[key] = EventPresenter.decorate_collection(value)
end
def past
fresh_when(latest_model_updated, etag: latest_model_updated)

@past_events, @pagy = fetch_past_events
end

def show
Expand Down Expand Up @@ -78,4 +70,32 @@ def find_invitation_and_redirect_to_event(role)
def set_event
@event = Event.find_by(slug: params[:event_id])
end

def fetch_upcoming_events
events = [Workshop.includes(:chapter, :sponsors).upcoming.joins(:chapter).merge(Chapter.active)]
events << Meeting.upcoming.all
events << Event.upcoming.includes(:venue, :sponsors, :sponsorships).all

sorted = events.compact.flatten.sort_by(&:date_and_time)
pagy, paginated = pagy(sorted, items: 20)

grouped = paginated.group_by(&:date)
decorated = grouped.transform_values { |items| EventPresenter.decorate_collection(items) }

[decorated, pagy]
end

def fetch_past_events
events = [Workshop.past.includes(:chapter, :sponsors).joins(:chapter).merge(Chapter.active)]
events << Meeting.past.all
events << Event.past.includes(:venue, :sponsors, :sponsorships).all

sorted = events.compact.flatten.sort_by(&:date_and_time).reverse
pagy, paginated = pagy(sorted, items: 20)

grouped = paginated.group_by(&:date)
decorated = grouped.transform_values { |items| EventPresenter.decorate_collection(items) }

[decorated, pagy]
end
end
2 changes: 1 addition & 1 deletion app/views/dashboard/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
= render workshops

- if @has_more_events
= link_to 'Explore all events →', events_path, class: 'btn btn-outline-primary mt-3'
= link_to 'Explore all events →', upcoming_events_path, class: 'btn btn-outline-primary mt-3'

.col-lg-4.pl-lg-5
%h3
Expand Down
15 changes: 0 additions & 15 deletions app/views/events/index.html.haml

This file was deleted.

13 changes: 13 additions & 0 deletions app/views/events/past.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
- title 'Past Events'

.container{'data-test': 'past-events'}
.row
.col
- if @past_events.any?
%h3.mb-4 Past Events

= render partial: 'events', locals: { grouped_events: @past_events }

- if @pagy
.container.mt-4
= render partial: 'shared/pagination', locals: { pagy: @pagy, model: 'event' }
13 changes: 13 additions & 0 deletions app/views/events/upcoming.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
- title t('events.title')

.container{'data-test': 'upcoming-events'}
.row
.col
- if @events.any?
%h3.mb-4 Upcoming Events

= render partial: 'events', locals: { grouped_events: @events }

- if @pagy
.container.mt-4
= render partial: 'shared/pagination', locals: { pagy: @pagy, model: 'event' }
2 changes: 1 addition & 1 deletion app/views/layouts/_footer.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
%li= link_to t("navigation.codebar_stories"), "https://medium.com/codebar-stories"
%li= link_to t("navigation.coaches"), coaches_path
%li= link_to t("navigation.sponsors"), sponsors_path
%li= link_to t("navigation.events"), events_path
%li= link_to t("navigation.events"), upcoming_events_path
%li= link_to t("navigation.jobs"), "https://jobs.codebar.io/"
%li.active= link_to t("navigation.donate"), new_donation_path
%li= link_to "Buy us a coffee", "https://buymeacoffee.com/codebarhq", target: '_blank', rel: 'noopener noreferrer'
Expand Down
3 changes: 2 additions & 1 deletion app/views/layouts/_navigation.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
= link_to '#', {'role': 'button', 'aria-expanded': 'false', 'data-bs-toggle': 'dropdown', class: 'nav-link border-0 dropdown-toggle', id: 'navbarDropdownMenuLinkEvents'} do
Events
%ul.dropdown-menu{'aria-labelledby': 'navbarDropdownMenuLinkEvents'}
%li= link_to 'Events', events_path, class: 'dropdown-item'
%li= link_to 'Upcoming Events', upcoming_events_path, class: 'dropdown-item'
%li= link_to 'Past Events', past_events_path, class: 'dropdown-item'
%li= link_to 'codebar Festival', 'http://festival.codebar.io/', class: 'dropdown-item'
%li= link_to 'uncodebar', 'https://uncodebar.com', class: 'dropdown-item'
%li.nav-item.dropdown
Expand Down
6 changes: 5 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

get 'unsubscribe/:token' => 'members#unsubscribe', as: :unsubscribe

resources :invitation, only: [:show, :update] do
resources :invitation, only: %i[show update] do
member do
post 'accept'
get 'accept'
Expand All @@ -50,6 +50,10 @@
end

resources :events, only: %i[index show] do
collection do
get :upcoming
get :past
end
post 'rsvp'
get 'student', as: :student_rsvp
get 'coach', as: :coach_rsvp
Expand Down
56 changes: 30 additions & 26 deletions spec/features/listing_events_spec.rb
Original file line number Diff line number Diff line change
@@ -1,40 +1,44 @@
RSpec.feature 'event listing', type: :feature do
describe 'I can see the names and titles of events' do
let!(:upcoming_workshop) { Fabricate(:workshop) }
describe 'I can see upcoming events' do
let!(:chapter) { Fabricate(:chapter, active: true) }
let!(:upcoming_workshop) { Fabricate(:workshop, chapter: chapter) }
let!(:event) { Fabricate(:event) }
let!(:past_event) { Fabricate(:event, date_and_time: Time.zone.now - 2.weeks) }
let!(:past_workshop) { Fabricate(:workshop, date_and_time: Time.zone.now - 1.week) }

before do
visit events_path
scenario 'displays upcoming events page' do
visit upcoming_events_path
expect(page).to have_content 'Upcoming Events'
expect(page).to have_content event.name
end
end

describe 'I can see past events' do
let!(:chapter) { Fabricate(:chapter, active: true) }
let!(:past_event) { Fabricate(:event, date_and_time: Time.zone.now - 2.weeks) }
let!(:past_workshop) { Fabricate(:workshop, date_and_time: Time.zone.now - 1.week, chapter: chapter) }

scenario 'i can view a list with upcoming events' do
within('*[data-test=upcoming-events]') do
expect(page).to have_content 'Workshop'
expect(page).to have_content event.name
end
scenario 'displays past events page' do
visit past_events_path
expect(page).to have_content 'Past Events'
expect(page).to have_content past_event.name
end
end

scenario 'i can view a list with past events' do
within('*[data-test=past-events]') do
expect(page).to have_content 'Workshop'
expect(page).to have_content past_event.name
end
describe 'root /events redirects to /events/upcoming' do
scenario 'redirects to upcoming events' do
visit events_path
expect(page).to have_content 'Upcoming Events'
expect(page).to have_current_path '/events/upcoming', ignore_query: true
end
end

context 'when there are more than the specified number of past events' do
scenario 'I can only as many events allowed by the display limits' do
Fabricate.times(2, :event, date_and_time: 2.weeks.ago)
stub_const('EventsController::RECENT_EVENTS_DISPLAY_LIMIT', 2)
Fabricate(:workshop, date_and_time: 3.weeks.ago)
context 'pagination' do
scenario 'past events paginates at 20 per page' do
chapter = Fabricate(:chapter, active: true)
Fabricate.times(22, :event, date_and_time: 2.weeks.ago)
Fabricate(:workshop, date_and_time: 3.weeks.ago, chapter: chapter)

visit events_path
within('*[data-test=past-events]') do
expect(page).to have_selector('*[data-test=event]', count: 2)
expect(page).not_to have_content 'Workshop'
end
visit past_events_path
expect(page).to have_selector('.card', count: 20)
end
end
end
Loading