Merge pull request #62 from finnlabs/feature/18329-foundation-apps-framework-forms-refactor

18329 Forms refactor based on Foundation for Apps
pull/6827/head
Alex Coles 10 years ago
commit 9f68794cec
  1. 5
      app/controllers/meetings_controller.rb
  2. 44
      app/helpers/message_accessibility_helper.rb
  3. 4
      app/models/meeting.rb
  4. 133
      app/views/meetings/_form.html.erb
  5. 23
      features/meetings_new.feature

@ -141,10 +141,9 @@ class MeetingsController < ApplicationController
def convert_params def convert_params
start_date = params[:meeting].delete(:start_date) start_date = params[:meeting].delete(:start_date)
start_time_4i = params[:meeting].delete(:"start_time(4i)") start_time_hour = params[:meeting].delete(:"start_time_hour")
start_time_5i = params[:meeting].delete(:"start_time(5i)")
begin begin
timestring = "#{start_date} #{start_time_4i}:#{start_time_5i}" timestring = "#{start_date} #{start_time_hour}"
time = Time.zone.parse(timestring) time = Time.zone.parse(timestring)
params[:meeting][:start_time] = time params[:meeting][:start_time] = time
rescue ArgumentError rescue ArgumentError

@ -1,44 +0,0 @@
#-- encoding: UTF-8
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2014 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
module MessageAccessibilityHelper
def accessible_time_select(object_name, method, options = {}, html_options = {})
labels = ''
select = time_select(object_name, method, options, html_options)
select_ids = select.scan(/<select id="(?<select_id>\w+)"/)
ids_with_label = select_ids.zip([:label_meeting_hour, :label_meeting_minute])
ids_with_label.each do |iwl|
labels += content_tag(:label, l(iwl[1]), for: iwl[0], class: 'hidden-for-sighted')
end
(labels + select).html_safe
end
end

@ -73,6 +73,10 @@ class Meeting < ActiveRecord::Base
start_time.to_date if start_time.present? start_time.to_date if start_time.present?
end end
def start_time_hour
start_time.present? ? start_time.strftime('%H:%M') : '00:00'
end
def start_month def start_month
start_time.month start_time.month
end end

@ -21,62 +21,93 @@ See doc/COPYRIGHT.md for more details.
<%= error_messages_for 'meeting' %> <%= error_messages_for 'meeting' %>
<div class="box tabular"> <section class="form--section">
<p><%= f.text_field :title, :required => true, :size => 60, :class => "autofocus" %></p>
<p><%= f.text_field :location, :size => 60 %></p> <div class="form--field">
<p> <%= f.text_field :title, :required => true, :size => 60, :class => "autofocus" %>
<%= f.text_field :start_date, :required => true, :size => 10 %> </div>
<%= calendar_for('meeting_start_date') %>
<span class="inline-label"> <div class="form--field">
<%= accessible_time_select "meeting", "start_time", :ignore_date => true, :minute_step => 5 %> <%= f.text_field :location, :size => 60 %>
</div>
<div class="form--field">
<label class="form--label"><%= Meeting.human_attribute_name(:start_date) %></label>
<div class="form--field-container">
<%= f.text_field :start_date,
required: true,
size: 10,
no_label: true %>
<%= f.text_field :start_time_hour,
required: true,
type: 'time',
no_label: true,
step: 5.minutes %>
<%= calendar_for('meeting_start_date') %>
<span class="form-label"><%= Time.zone %></span> <span class="form-label"><%= Time.zone %></span>
</span> </div>
</p> </div>
<p>
<span class="inline-label"> <div class="form--field">
<%= f.text_field :duration, :required => true, :size => 5 %> <label class="form--label"><%= Meeting.human_attribute_name(:duration) %></label>
<div class="form--field-container">
<%= f.number_field :duration,
required: true,
size: 5,
no_label: true,
min: 0.00,
step: 0.25,
max: 168 %>
<span class="form-label"><%=l :text_in_hours %></span> <span class="form-label"><%=l :text_in_hours %></span>
</span> </div>
</p> </div>
<div><label><%=Meeting.human_attribute_name(:participants) %></label>
<table class="list"> <div class="form--field">
<thead><tr> <label class="form--label"><%=Meeting.human_attribute_name(:participants) %></label>
<th><%=Meeting.human_attribute_name(:name) %></th> <div class="form--field-container">
<th><%=Meeting.human_attribute_name(:participants_invited) %></th> <table class="form--table">
<th><%=Meeting.human_attribute_name(:participants_attended) %></th> <thead>
</tr></thead> <tr class="form--table-header-row">
<tbody> <th class="form--table-header-row-cell"><%= Meeting.human_attribute_name(:name) %></th>
<% @meeting.all_changeable_participants.sort.each do |user| -%> <th class="form--table-header-row-cell"><%= Meeting.human_attribute_name(:participants_invited) %></th>
<%= hidden_field_tag "meeting[participants_attributes][][user_id]", user.id %> <th class="form--table-header-row-cell"><%= Meeting.human_attribute_name(:participants_attended) %></th>
<tr class="<%= cycle("odd", "even")%>"> </tr>
<td><%=h user %></td> </thead>
<% if @meeting.participants.present? && participant = @meeting.participants.detect{|p| p.user_id == user.id} -%> <tbody>
<%= hidden_field_tag "meeting[participants_attributes][][id]", participant.id %> <% @meeting.all_changeable_participants.sort.each do |user| -%>
<td class="checkox" align="center"> <%= hidden_field_tag "meeting[participants_attributes][][user_id]", user.id %>
<%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %> <tr class="form--table-row">
<%= check_box_tag "meeting[participants_attributes][][invited]", 1, participant.invited?, :id => "checkbox_invited_#{user.id}" %> <td><%=h user %></td>
</td> <% if @meeting.participants.present? && participant = @meeting.participants.detect{|p| p.user_id == user.id} -%>
<td class="checkox" align="center"> <%= hidden_field_tag "meeting[participants_attributes][][id]", participant.id %>
<%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %> <td class="form--table-checkbox-cell">
<%= check_box_tag "meeting[participants_attributes][][attended]", 1, participant.attended?, :id => "checkbox_attended_#{user.id}" %> <%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
</td> <%= styled_check_box_tag "meeting[participants_attributes][][invited]", 1, participant.invited?, :id => "checkbox_invited_#{user.id}" %>
<% else -%> </td>
<td class="checkox" align="center"> <td class="form--table-checkbox-cell">
<%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %> <%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %>
<%= check_box_tag "meeting[participants_attributes][][invited]", value = "1", checked = false, :id => "checkbox_invited_#{user.id}" %> <%= styled_check_box_tag "meeting[participants_attributes][][attended]", 1, participant.attended?, :id => "checkbox_attended_#{user.id}" %>
</td> </td>
<td class="checkox" align="center"> <% else -%>
<%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %> <td class="form--table-checkbox-cell">
<%= check_box_tag "meeting[participants_attributes][][attended]", value = "1", checked = false, :id => "checkbox_attended_#{user.id}" %> <%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
</td> <%= styled_check_box_tag "meeting[participants_attributes][][invited]", value = "1", checked = false, :id => "checkbox_invited_#{user.id}" %>
</td>
<td class="form--table-checkbox-cell">
<%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %>
<%= styled_check_box_tag "meeting[participants_attributes][][attended]", value = "1", checked = false, :id => "checkbox_attended_#{user.id}" %>
</td>
<% end -%>
</tr>
<% end -%> <% end -%>
</tr> </tbody>
<% end -%> </table>
</tbody> </div>
</table>
</div> </div>
<%= hidden_field_tag "copied_from_meeting_id", params[:copied_from_meeting_id] if params[:copied_from_meeting_id].present? %> <%= hidden_field_tag "copied_from_meeting_id", params[:copied_from_meeting_id] if params[:copied_from_meeting_id].present? %>
<%= hidden_field_tag "copied_meeting_agenda_text", params[:copied_meeting_agenda_text] if params[:copied_meeting_agenda_text].present? %> <%= hidden_field_tag "copied_meeting_agenda_text", params[:copied_meeting_agenda_text] if params[:copied_meeting_agenda_text].present? %>
</div> </section>
<%= render :partial => 'shared/meeting_header' %> <%= render :partial => 'shared/meeting_header' %>

@ -67,11 +67,10 @@ Feature: Create new meetings
And I go to the Meetings page for the project called "dingens" And I go to the Meetings page for the project called "dingens"
And I click on "New Meeting" And I click on "New Meeting"
And I fill in the following: And I fill in the following:
| meeting_title | FSR Sitzung 123 | | meeting_title | FSR Sitzung 123 |
| meeting_start_date | 2013-03-28 | | meeting_start_date | 2013-03-28 |
| meeting_duration | 1.5 | | meeting_start_time_hour | 13:30 |
And I select "13" from "meeting_start_time_4i" | meeting_duration | 1.5 |
And I select "30" from "meeting_start_time_5i"
And I click on "Create" And I click on "Create"
Then I should see "Successful creation." Then I should see "Successful creation."
And I should see "FSR Sitzung 123" And I should see "FSR Sitzung 123"
@ -84,20 +83,6 @@ Feature: Create new meetings
| CET | | CET |
| CEST | | CEST |
@javascript
Scenario: The start-time should be selectable in 5-minute increments
Given the role "user" may have the following rights:
| view_meetings |
| create_meetings |
When I am already logged in as "alice"
And I go to the Meetings page for the project called "dingens"
And I click on "New Meeting"
Then I should see "New Meeting"
And I should not see "01" within "#meeting_start_time_5i"
And I should not see "14" within "#meeting_start_time_5i"
And I should see "00" within "#meeting_start_time_5i"
And I should see "05" within "#meeting_start_time_5i"
Scenario: Visit the new meeting page to make sure the author is selected as invited Scenario: Visit the new meeting page to make sure the author is selected as invited
Given the role "user" may have the following rights: Given the role "user" may have the following rights:
| view_meetings | | view_meetings |

Loading…
Cancel
Save