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