diff --git a/app/controllers/admin/rooms_controller.rb b/app/controllers/admin/rooms_controller.rb
index 0acb9586..fcf707cb 100644
--- a/app/controllers/admin/rooms_controller.rb
+++ b/app/controllers/admin/rooms_controller.rb
@@ -1,26 +1,55 @@
module Admin
class RoomsController < Admin::BaseController
load_and_authorize_resource :conference, find_by: :short_title
- authorize_resource through: :conference
+ load_and_authorize_resource through: :conference
def index
authorize! :index, Room.new(conference_id: @conference.id)
end
- def show
- render :rooms_list
+ def edit; end
+
+ def new
+ @room = @conference.rooms.new
+ end
+
+ def create
+ @room = @conference.rooms.new(room_params)
+ if @room.save
+ redirect_to(admin_conference_rooms_path(conference_id: @conference.short_title),
+ notice: 'Room successfully created.')
+ else
+ flash[:error] = "Creating Room failed: #{@room.errors.full_messages.join('. ')}."
+ render :new
+ end
end
def update
- if @conference.update_attributes(params[:conference])
+ if @room.update_attributes(room_params)
redirect_to(admin_conference_rooms_path(
conference_id: @conference.short_title),
- notice: 'Rooms were successfully updated.')
+ notice: 'Room successfully updated.')
else
- redirect_to(admin_conference_rooms_path(
- conference_id: @conference.short_title),
- notice: 'Room update failed.')
+ flash[:error] = "Update Room failed: #{@room.errors.full_messages.join('. ')}."
+ render :edit
end
end
+
+ def destroy
+ if @room.destroy
+ redirect_to(admin_conference_rooms_path(conference_id: @conference.short_title),
+ notice: 'Room successfully deleted.')
+ else
+ redirect_to(admin_conference_rooms_path(conference_id: @conference.short_title),
+ error: 'Destroying room failed! ' \
+ "#{@room.errors.full_messages.join('. ')}.")
+ end
+ end
+
+ private
+
+ def room_params
+ params[:room]
+ end
end
end
diff --git a/app/models/room.rb b/app/models/room.rb
index 3244ff54..c4044a0a 100644
--- a/app/models/room.rb
+++ b/app/models/room.rb
@@ -6,13 +6,16 @@ class Room < ActiveRecord::Base
before_create :generate_guid
+ validates :name, presence: true
+
+ validates :size, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true
+
+ validates :size, presence: true, if: :public?
+
private
def generate_guid
guid = SecureRandom.urlsafe_base64
-# begin
-# guid = SecureRandom.urlsafe_base64
-# end while Person.where(:guid => guid).exists?
self.guid = guid
end
end
diff --git a/app/views/admin/rooms/_form.html.haml b/app/views/admin/rooms/_form.html.haml
new file mode 100644
index 00000000..48617d02
--- /dev/null
+++ b/app/views/admin/rooms/_form.html.haml
@@ -0,0 +1,4 @@
+= f.input :name
+= f.input :size, :input_html => {:size => 5}
+= f.input :public, :as => :boolean
+= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }
\ No newline at end of file
diff --git a/app/views/admin/rooms/_room_fields.html.erb b/app/views/admin/rooms/_room_fields.html.erb
deleted file mode 100644
index 203176e8..00000000
--- a/app/views/admin/rooms/_room_fields.html.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-
- <%= f.inputs do %>
- <%= f.input :name %>
- <%= f.input :size, :input_html => {:size => 5} %>
- <%= f.input :public, :as => :boolean %>
- <%= remove_association_link :room, f %>
- <% end %>
-
diff --git a/app/views/admin/rooms/edit.html.haml b/app/views/admin/rooms/edit.html.haml
new file mode 100644
index 00000000..eb5f9974
--- /dev/null
+++ b/app/views/admin/rooms/edit.html.haml
@@ -0,0 +1,8 @@
+%h1 Editing Room
+
+.row
+ .col-md-8
+ = semantic_form_for @room, url: admin_conference_room_path(conference_id: @conference.short_title, id: @room.id) do |f|
+ = render 'form', f: f
+
+= link_to 'Back', admin_conference_rooms_path
diff --git a/app/views/admin/rooms/index.html.haml b/app/views/admin/rooms/index.html.haml
index dfb23884..05d6b837 100644
--- a/app/views/admin/rooms/index.html.haml
+++ b/app/views/admin/rooms/index.html.haml
@@ -1,5 +1,32 @@
-.row
- .col-md-8
- = semantic_form_for(@conference, :url => admin_conference_room_path(@conference.short_title, @conference.rooms)) do |f|
- = dynamic_association :rooms, "Rooms", f
- = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
+%h1 Rooms
+
+- if @conference.rooms.any?
+ .row
+ .col-md-12
+ %table.table
+ %thead
+ %th #
+ %th Name
+ %th Size
+ %th Public
+ %th Edit
+ %th Delete
+ %tbody
+ - @conference.rooms.each_with_index do |room, index|
+ %tr
+ %td
+ = index + 1
+ %td
+ = room.name
+ %td
+ = room.size
+ %td
+ = room.public
+ %td
+ = link_to 'Edit', edit_admin_conference_room_path(@conference.short_title, room.id),
+ method: :get, class: 'btn btn-primary'
+ %td
+ = link_to 'Delete', admin_conference_room_path(@conference.short_title, room.id),
+ method: :delete, class: 'btn btn-danger', data: { confirm: "Do you really want to delete #{room.name}?" }
+
+= link_to 'New Room', new_admin_conference_room_path(@conference.short_title), class: 'btn btn-success'
diff --git a/app/views/admin/rooms/new.html.haml b/app/views/admin/rooms/new.html.haml
new file mode 100644
index 00000000..1b347c51
--- /dev/null
+++ b/app/views/admin/rooms/new.html.haml
@@ -0,0 +1,7 @@
+%h1 New Room
+.row
+ .col-md-8
+ = semantic_form_for @room, url: admin_conference_rooms_path(conference_id: @conference.short_title) do |f|
+ = render 'form', f: f
+
+= link_to 'Back', admin_conference_rooms_path
diff --git a/config/routes.rb b/config/routes.rb
index ffa81a3e..94fbfe45 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -44,7 +44,7 @@ Osem::Application.routes.draw do
resources :difficulty_levels, only: [:show, :update, :index]
- resources :rooms, only: [:show, :update, :index]
+ resources :rooms, except: [:show]
resources :tracks, only: [:show, :update, :index]
diff --git a/db/migrate/20141109172204_set_room_public_default_to_false.rb b/db/migrate/20141109172204_set_room_public_default_to_false.rb
new file mode 100644
index 00000000..ae215bab
--- /dev/null
+++ b/db/migrate/20141109172204_set_room_public_default_to_false.rb
@@ -0,0 +1,5 @@
+class SetRoomPublicDefaultToFalse < ActiveRecord::Migration
+ def change
+ change_column :rooms, :public, :boolean, default: false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index be775cc5..4cf7d7b4 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20141106141750) do
+ActiveRecord::Schema.define(version: 20141109172204) do
create_table "ahoy_events", force: true do |t|
t.uuid "visit_id"
@@ -369,11 +369,11 @@ ActiveRecord::Schema.define(version: 20141106141750) do
add_index "roles_users", ["user_id", "role_id"], name: "index_roles_users_on_user_id_and_role_id"
create_table "rooms", force: true do |t|
- t.string "guid", null: false
+ t.string "guid", null: false
t.integer "conference_id"
- t.string "name", null: false
+ t.string "name", null: false
t.integer "size"
- t.boolean "public", default: true
+ t.boolean "public", default: false
end
create_table "social_events", force: true do |t|
diff --git a/spec/features/rooms_spec.rb b/spec/features/rooms_spec.rb
index 23911004..322db098 100644
--- a/spec/features/rooms_spec.rb
+++ b/spec/features/rooms_spec.rb
@@ -6,39 +6,47 @@ feature Room do
let!(:organizer) { create(:user, role_ids: [organizer_role.id]) }
shared_examples 'rooms' do
- scenario 'adds and updates rooms', feature: true, js: true do
-
+ scenario 'adds a room', feature: true, js: true do
sign_in organizer
visit admin_conference_rooms_path(
conference_id: conference.short_title)
+ expect(page.has_content?('Room Name')).to be false
+ expect(page.has_content?('100')).to be false
+
# Add room
- click_link 'Add room'
- expect(page.all('div.nested-fields').count == 1).to be true
+ click_link 'New Room'
- page.
- find('div.nested-fields:nth-of-type(1) div:nth-of-type(1) input').
- set('Example room')
+ fill_in 'room_name', with: 'Room Name'
+ fill_in 'room_size', with: '100'
- page.
- find('div.nested-fields:nth-of-type(1) div:nth-of-type(2) input').
- set('100')
-
- click_button 'Update Conference'
+ click_button 'Create Room'
# Validations
- expect(flash).to eq('Rooms were successfully updated.')
- expect(find('div.nested-fields:nth-of-type(1) div:nth-of-type(1) input').
- value).to eq('Example room')
- expect(find('div.nested-fields:nth-of-type(1) div:nth-of-type(2) input').
- value).to eq('100')
+ expect(flash).to eq('Room successfully created.')
- # Remove room
- click_link 'Remove room'
- expect(page.all('div.nested-fields').count == 0).to be true
- click_button 'Update Conference'
- expect(flash).to eq('Rooms were successfully updated.')
- expect(page.all('div.nested-fields').count == 0).to be true
+ expect(page.has_content?('Room Name')).to be true
+ expect(page.has_content?('100')).to be true
+ end
+
+ scenario 'updates a room', feature: true, js: true do
+ room = create(:room, conference_id: conference.id)
+ sign_in organizer
+ visit edit_admin_conference_room_path(
+ conference_id: conference.short_title, id: room.id)
+
+ fill_in 'room_name', with: 'Room Name'
+ fill_in 'room_size', with: '100'
+
+ click_button 'Update Room'
+
+ # Validations
+ expect(flash).to eq('Room successfully updated.')
+ expect(page.has_content?('Room Name')).to be true
+ expect(page.has_content?('100')).to be true
+ room.reload
+ expect(room.name).to eq('Room Name')
+ expect(room.size).to eq(100)
end
end