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
start_date = params[:meeting].delete(:start_date)
start_time_4i = params[:meeting].delete(:"start_time(4i)")
start_time_5i = params[:meeting].delete(:"start_time(5i)")
start_time_hour = params[:meeting].delete(:"start_time_hour")
begin
timestring = "#{start_date} #{start_time_4i}:#{start_time_5i}"
timestring = "#{start_date} #{start_time_hour}"
time = Time.zone.parse(timestring)
params[:meeting][:start_time] = time
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?
end
def start_time_hour
start_time.present? ? start_time.strftime('%H:%M') : '00:00'
end
def start_month
start_time.month
end

@ -21,62 +21,93 @@ See doc/COPYRIGHT.md for more details.
<%= error_messages_for 'meeting' %>
<div class="box tabular">
<p><%= f.text_field :title, :required => true, :size => 60, :class => "autofocus" %></p>
<p><%= f.text_field :location, :size => 60 %></p>
<p>
<%= f.text_field :start_date, :required => true, :size => 10 %>
<%= calendar_for('meeting_start_date') %>
<span class="inline-label">
<%= accessible_time_select "meeting", "start_time", :ignore_date => true, :minute_step => 5 %>
<section class="form--section">
<div class="form--field">
<%= f.text_field :title, :required => true, :size => 60, :class => "autofocus" %>
</div>
<div class="form--field">
<%= 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>
</p>
<p>
<span class="inline-label">
<%= f.text_field :duration, :required => true, :size => 5 %>
</div>
</div>
<div class="form--field">
<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>
</p>
<div><label><%=Meeting.human_attribute_name(:participants) %></label>
<table class="list">
<thead><tr>
<th><%=Meeting.human_attribute_name(:name) %></th>
<th><%=Meeting.human_attribute_name(:participants_invited) %></th>
<th><%=Meeting.human_attribute_name(:participants_attended) %></th>
</tr></thead>
<tbody>
<% @meeting.all_changeable_participants.sort.each do |user| -%>
<%= hidden_field_tag "meeting[participants_attributes][][user_id]", user.id %>
<tr class="<%= cycle("odd", "even")%>">
<td><%=h user %></td>
<% if @meeting.participants.present? && participant = @meeting.participants.detect{|p| p.user_id == user.id} -%>
<%= hidden_field_tag "meeting[participants_attributes][][id]", participant.id %>
<td class="checkox" align="center">
<%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
<%= check_box_tag "meeting[participants_attributes][][invited]", 1, participant.invited?, :id => "checkbox_invited_#{user.id}" %>
</td>
<td class="checkox" align="center">
<%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %>
<%= check_box_tag "meeting[participants_attributes][][attended]", 1, participant.attended?, :id => "checkbox_attended_#{user.id}" %>
</td>
<% else -%>
<td class="checkox" align="center">
<%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
<%= check_box_tag "meeting[participants_attributes][][invited]", value = "1", checked = false, :id => "checkbox_invited_#{user.id}" %>
</td>
<td class="checkox" align="center">
<%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %>
<%= check_box_tag "meeting[participants_attributes][][attended]", value = "1", checked = false, :id => "checkbox_attended_#{user.id}" %>
</td>
</div>
</div>
<div class="form--field">
<label class="form--label"><%=Meeting.human_attribute_name(:participants) %></label>
<div class="form--field-container">
<table class="form--table">
<thead>
<tr class="form--table-header-row">
<th class="form--table-header-row-cell"><%= Meeting.human_attribute_name(:name) %></th>
<th class="form--table-header-row-cell"><%= Meeting.human_attribute_name(:participants_invited) %></th>
<th class="form--table-header-row-cell"><%= Meeting.human_attribute_name(:participants_attended) %></th>
</tr>
</thead>
<tbody>
<% @meeting.all_changeable_participants.sort.each do |user| -%>
<%= hidden_field_tag "meeting[participants_attributes][][user_id]", user.id %>
<tr class="form--table-row">
<td><%=h user %></td>
<% if @meeting.participants.present? && participant = @meeting.participants.detect{|p| p.user_id == user.id} -%>
<%= hidden_field_tag "meeting[participants_attributes][][id]", participant.id %>
<td class="form--table-checkbox-cell">
<%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
<%= styled_check_box_tag "meeting[participants_attributes][][invited]", 1, participant.invited?, :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]", 1, participant.attended?, :id => "checkbox_attended_#{user.id}" %>
</td>
<% else -%>
<td class="form--table-checkbox-cell">
<%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
<%= 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 -%>
</tr>
<% end -%>
</tbody>
</table>
</tbody>
</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_meeting_agenda_text", params[:copied_meeting_agenda_text] if params[:copied_meeting_agenda_text].present? %>
</div>
</section>
<%= 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 click on "New Meeting"
And I fill in the following:
| meeting_title | FSR Sitzung 123 |
| meeting_start_date | 2013-03-28 |
| meeting_duration | 1.5 |
And I select "13" from "meeting_start_time_4i"
And I select "30" from "meeting_start_time_5i"
| meeting_title | FSR Sitzung 123 |
| meeting_start_date | 2013-03-28 |
| meeting_start_time_hour | 13:30 |
| meeting_duration | 1.5 |
And I click on "Create"
Then I should see "Successful creation."
And I should see "FSR Sitzung 123"
@ -84,20 +83,6 @@ Feature: Create new meetings
| CET |
| 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
Given the role "user" may have the following rights:
| view_meetings |

Loading…
Cancel
Save