Skip to content

Commit

Permalink
integrating the calendar widget with a real events model. Amazing how…
Browse files Browse the repository at this point in the history
… trivial this was.
  • Loading branch information
bokmann committed Apr 9, 2011
1 parent 6e617e9 commit e5d2156
Show file tree
Hide file tree
Showing 20 changed files with 428 additions and 286 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.bundle
db/*.sqlite3
db/schema.rb
log/*.log
tmp/
86 changes: 86 additions & 0 deletions app/controllers/events_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
class EventsController < ApplicationController
# GET /events
# GET /events.xml
def index
@events = Event.scoped
@events = @events.after(params['start']) if (params['start'])
@events = @events.before(params['end']) if (params['end'])

respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @events }
format.json { render :json => @events }
end
end

# GET /events/1
# GET /events/1.xml
def show
@event = Event.find(params[:id])

respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @event }
end
end

# GET /events/new
# GET /events/new.xml
def new
@event = Event.new

respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @event }
end
end

# GET /events/1/edit
def edit
@event = Event.find(params[:id])
end

# POST /events
# POST /events.xml
def create
@event = Event.new(params[:event])

respond_to do |format|
if @event.save
format.html { redirect_to(@event, :notice => 'Event was successfully created.') }
format.xml { render :xml => @event, :status => :created, :location => @event }
else
format.html { render :action => "new" }
format.xml { render :xml => @event.errors, :status => :unprocessable_entity }
end
end
end

# PUT /events/1
# PUT /events/1.xml
def update
@event = Event.find(params[:id])

respond_to do |format|
if @event.update_attributes(params[:event])
format.html { redirect_to(@event, :notice => 'Event was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @event.errors, :status => :unprocessable_entity }
end
end
end

# DELETE /events/1
# DELETE /events/1.xml
def destroy
@event = Event.find(params[:id])
@event.destroy

respond_to do |format|
format.html { redirect_to(events_url) }
format.xml { head :ok }
end
end
end
2 changes: 2 additions & 0 deletions app/helpers/events_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module EventsHelper
end
29 changes: 29 additions & 0 deletions app/models/event.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
class Event < ActiveRecord::Base

scope :in_range, lambda {|start_time, end_time| {:conditions => ["starts_at > ? and ends_at < ?", start_time, end_time] }}

scope :before, lambda {|end_time| {:conditions => ["ends_at < ?", Event.format_date(end_time)] }}
scope :after, lambda {|start_time| {:conditions => ["starts_at > ?", Event.format_date(start_time)] }}

# need to override the json view to return what full_calendar is expecting.
# http://arshaw.com/fullcalendar/docs/event_data/Event_Object/
def as_json(options = {})
{
:id => self.id,
:title => self.title,
:description => self.description || "",
:start => "#{self.starts_at.iso8601}",
:end => "#{self.ends_at.iso8601}",
:allDay => self.all_day,
:recurring => false,
:url => Rails.application.routes.url_helpers.event_path(id)
}

end


def self.format_date(date_time)
Time.at(date_time.to_i).to_formatted_s(:db)
end

end
2 changes: 2 additions & 0 deletions app/views/calendar/index.html.erb
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
<%= link_to "new event", new_event_path %>

<div id='calendar'></div>

37 changes: 37 additions & 0 deletions app/views/events/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<%= form_for(@event) do |f| %>
<% if @event.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@event.errors.count, "error") %> prohibited this event from being saved:</h2>

<ul>
<% @event.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :starts_at %><br />
<%= f.datetime_select :starts_at %>
</div>
<div class="field">
<%= f.label :ends_at %><br />
<%= f.datetime_select :ends_at %>
</div>
<div class="field">
<%= f.label :all_day %><br />
<%= f.check_box :all_day %>
</div>
<div class="field">
<%= f.label :description %><br />
<%= f.text_area :description %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
6 changes: 6 additions & 0 deletions app/views/events/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<h1>Editing event</h1>

<%= render 'form' %>
<%= link_to 'Show', @event %> |
<%= link_to 'Back', events_path %>
32 changes: 32 additions & 0 deletions app/views/events/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<h1>Listing events</h1>

<table>
<tr>
<th>Title</th>
<th>Starts at</th>
<th>Ends at</th>
<th>All day</th>
<th>Description</th>
<th></th>
<th></th>
<th></th>
</tr>

<% @events.each do |event| %>
<tr>
<td><%= event.title %></td>
<td><%= event.starts_at %></td>
<td><%= event.ends_at %></td>
<td><%= event.all_day %></td>
<td><%= event.description %></td>
<td><%= link_to 'Show', event %></td>
<td><%= link_to 'Edit', edit_event_path(event) %></td>
<td><%= link_to 'Destroy', event, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>

<br />
<%= link_to 'view calendar', calendar_index_path %>
<br/>
<%= link_to 'New Event', new_event_path %>
5 changes: 5 additions & 0 deletions app/views/events/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<h1>New event</h1>

<%= render 'form' %>
<%= link_to 'Back', events_path %>
30 changes: 30 additions & 0 deletions app/views/events/show.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<p id="notice"><%= notice %></p>

<p>
<b>Title:</b>
<%= @event.title %>
</p>

<p>
<b>Starts at:</b>
<%= @event.starts_at %>
</p>

<p>
<b>Ends at:</b>
<%= @event.ends_at %>
</p>

<p>
<b>All day:</b>
<%= @event.all_day %>
</p>

<p>
<b>Description:</b>
<%= @event.description %>
</p>


<%= link_to 'Edit', edit_event_path(@event) %> |
<%= link_to 'Back', events_path %>
4 changes: 4 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
Calendar::Application.routes.draw do
resources :events

get "calendar/index"

# The priority is based upon order of creation:
Expand Down Expand Up @@ -52,6 +54,8 @@
# just remember to delete public/index.html.
# root :to => "welcome#index"

root :to => "calendar#index"

# See how all your routes lay out with "rake routes"

# This is a legacy wild controller route that's not recommended for RESTful applications.
Expand Down
17 changes: 17 additions & 0 deletions db/migrate/20110409023947_create_events.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class CreateEvents < ActiveRecord::Migration
def self.up
create_table :events do |t|
t.string :title
t.datetime :starts_at
t.datetime :ends_at
t.boolean :all_day
t.text :description

t.timestamps
end
end

def self.down
drop_table :events
end
end
Loading

0 comments on commit e5d2156

Please sign in to comment.