openproject-meeting 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGELOG.md +46 -0
  3. data/README.md +82 -0
  4. data/app/assets/images/meeting/agenda.png +0 -0
  5. data/app/assets/images/meeting/meeting.png +0 -0
  6. data/app/assets/images/meeting/minutes.png +0 -0
  7. data/app/assets/stylesheets/meeting/meeting.css.erb +39 -0
  8. data/app/controllers/meeting_agendas_controller.rb +33 -0
  9. data/app/controllers/meeting_contents_controller.rb +95 -0
  10. data/app/controllers/meeting_minutes_controller.rb +22 -0
  11. data/app/controllers/meetings_controller.rb +150 -0
  12. data/app/helpers/meeting_contents_helper.rb +68 -0
  13. data/app/helpers/meetings_helper.rb +16 -0
  14. data/app/mailers/meeting_mailer.rb +28 -0
  15. data/app/models/meeting.rb +163 -0
  16. data/app/models/meeting_agenda.rb +95 -0
  17. data/app/models/meeting_content.rb +67 -0
  18. data/app/models/meeting_minutes.rb +81 -0
  19. data/app/models/meeting_participant.rb +45 -0
  20. data/app/views/hooks/_activity_index_head.html.erb +13 -0
  21. data/app/views/meeting_contents/_form.html.erb +33 -0
  22. data/app/views/meeting_contents/_show.html.erb +40 -0
  23. data/app/views/meeting_contents/diff.html.erb +33 -0
  24. data/app/views/meeting_contents/history.html.erb +49 -0
  25. data/app/views/meeting_contents/show.html.erb +13 -0
  26. data/app/views/meeting_mailer/content_for_review.html.erb +23 -0
  27. data/app/views/meeting_mailer/content_for_review.text.erb +9 -0
  28. data/app/views/meetings/_form.html.erb +61 -0
  29. data/app/views/meetings/edit.html.erb +17 -0
  30. data/app/views/meetings/index.html.erb +51 -0
  31. data/app/views/meetings/new.html.erb +17 -0
  32. data/app/views/meetings/show.html.erb +48 -0
  33. data/app/views/shared/_meeting_header.html.erb +3 -0
  34. data/config/locales/de.yml +47 -0
  35. data/config/locales/en.yml +47 -0
  36. data/config/routes.rb +53 -0
  37. data/db/migrate/20110106210555_create_meetings.rb +29 -0
  38. data/db/migrate/20110106221214_create_meeting_contents.rb +29 -0
  39. data/db/migrate/20110106221946_create_meeting_content_versions.rb +20 -0
  40. data/db/migrate/20110108230721_create_meeting_participants.rb +30 -0
  41. data/db/migrate/20110224180804_add_lock_to_meeting_content.rb +24 -0
  42. data/db/migrate/20110819162852_create_initial_meeting_journals.rb +49 -0
  43. data/db/migrate/20111605171815_merge_meeting_content_versions_with_journals.rb +65 -0
  44. data/db/migrate/20130731151542_remove_meeting_role_id_from_meeting_participants.rb +20 -0
  45. data/lib/open_project/meeting.rb +16 -0
  46. data/lib/open_project/meeting/engine.rb +101 -0
  47. data/lib/open_project/meeting/hooks.rb +17 -0
  48. data/lib/open_project/meeting/patches/project_patch.rb +24 -0
  49. data/lib/open_project/meeting/version.rb +16 -0
  50. data/lib/openproject-meeting.rb +12 -0
  51. data/spec/controllers/meetings_controller_spec.rb +90 -0
  52. data/spec/factories/meeting_agenda_factory.rb +16 -0
  53. data/spec/factories/meeting_agenda_journal_factory.rb +18 -0
  54. data/spec/factories/meeting_factory.rb +18 -0
  55. data/spec/factories/meeting_minutes_factory.rb +16 -0
  56. data/spec/factories/meeting_minutes_journal_factory.rb +18 -0
  57. data/spec/factories/meeting_participant_factory.rb +17 -0
  58. data/spec/mailers/meeting_mailer_spec.rb +101 -0
  59. data/spec/models/meeting_agenda_journal_spec.rb +21 -0
  60. data/spec/models/meeting_agenda_spec.rb +52 -0
  61. data/spec/models/meeting_minutes_journal_spec.rb +21 -0
  62. data/spec/models/meeting_minutes_spec.rb +44 -0
  63. data/spec/models/meeting_spec.rb +168 -0
  64. data/spec/models/user_deletion_spec.rb +186 -0
  65. data/spec/spec_helper.rb +14 -0
  66. data/spec/support/plugin_spec_helper.rb +47 -0
  67. metadata +158 -0
@@ -0,0 +1,45 @@
1
+ #-- copyright
2
+ # OpenProject is a project management system.
3
+ #
4
+ # Copyright (C) 2012-2013 the OpenProject Team
5
+ #
6
+ # This program is free software; you can redistribute it and/or
7
+ # modify it under the terms of the GNU General Public License version 3.
8
+ #
9
+ # See doc/COPYRIGHT.rdoc for more details.
10
+ #++
11
+
12
+ class MeetingParticipant < ActiveRecord::Base
13
+
14
+ belongs_to :meeting
15
+ belongs_to :user
16
+
17
+ scope :invited, :conditions => {:invited => true}
18
+ scope :attended, :conditions => {:attended => true}
19
+
20
+ attr_accessible :email, :name, :invited, :attended, :user, :user_id, :meeting
21
+
22
+ User.before_destroy do |user|
23
+ MeetingParticipant.update_all ['user_id = ?', DeletedUser.first], ['user_id = ?', user.id]
24
+ end
25
+
26
+ def name
27
+ user.present? ? user.name : self.name
28
+ end
29
+
30
+ def mail
31
+ user.present? ? user.mail : self.mail
32
+ end
33
+
34
+ def <=>(participant)
35
+ self.to_s.downcase <=> participant.to_s.downcase
36
+ end
37
+
38
+ alias :to_s :name
39
+
40
+ def copy_attributes
41
+ #create a clean attribute set allowing to attach participants to different meetings
42
+ self.attributes.reject { |k,v| ['id','meeting_id','attended','created_at', 'updated_at'].include?(k)}
43
+ end
44
+ end
45
+
@@ -0,0 +1,13 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <%= stylesheet_link_tag 'meeting/meeting.css' %>
@@ -0,0 +1,33 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <%= form_for content, :url => {:controller => '/' + content_type.pluralize, :action => 'update', :meeting_id => content.meeting}, :html => {:id => "#{content_type}_form", :method => :put} do |f| %>
14
+ <%= error_messages_for content_type %>
15
+
16
+ <p><%= f.text_area :text, :cols => 100, :rows => 25, :class => 'wiki-edit', :accesskey => accesskey(:edit) %></p>
17
+ <%= f.hidden_field :lock_version %>
18
+ <p><label for="<%= content_type %>_comment"><%= Meeting.human_attribute_name(:comments) %></label><br /><%= f.text_field :comment, :size => 120 %></p>
19
+ <p><%= submit_tag l(:button_save) %>
20
+ <%= link_to_remote l(:label_preview),
21
+ {:url => {:controller => '/' + content_type.pluralize, :action => 'preview', :meeting_id => content.meeting},
22
+ :method => :post,
23
+ :update => "#{content_type}_preview",
24
+ :with => "'text=' + encodeURIComponent($('#{content_type}_text').value)",
25
+ :complete => "Element.scrollTo('#{content_type}_preview')"
26
+ }, :accesskey => accesskey(:preview) %> |
27
+ <%= link_to l(:button_cancel), "#", :onclick => "$$('.show-#{content_type}').invoke('show'); $$('.edit-#{content_type}').invoke('hide'); return false;" %></p>
28
+ <%= wikitoolbar_for "#{content_type}_text" %>
29
+ <% end %>
30
+
31
+ <div id="<%= content_type %>_preview" class="wiki"></div>
32
+
33
+ <%= render :partial => 'shared/meeting_header' %>
@@ -0,0 +1,40 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <%
14
+ tab ||= locals[:tab_contents] if defined? locals
15
+ content, content_type = tab[:content], tab[:content_type] if tab && tab.present?
16
+ -%>
17
+ <div class="meeting_content <%= content_type %>">
18
+ <div class="contextual">
19
+ <%=raw meeting_content_context_menu content, content_type %>
20
+ </div>
21
+ <h2><%=l :"label_#{content_type}" %></h2>
22
+
23
+ <% if can_edit_meeting_content?(content, content_type) -%>
24
+ <div id="edit-<%= content_type %>" class="edit-<%= content_type %>"<%= " style=\"display: none;\"" unless show_meeting_content_editor?(content, content_type)%>>
25
+ <%= render(:partial => "meeting_contents/form", :locals => {:content => content, :content_type => content_type}) %>
26
+ </div>
27
+ <% end -%>
28
+
29
+ <% if saved_meeting_content_text_present?(content) -%>
30
+ <div id="<%= content_type %>-text" class="wiki show-<%= content_type %>">
31
+ <%= textilizable(content.text) %>
32
+ </div>
33
+ <% else -%>
34
+ <p id="<%= content_type %>-text" class="nodata show-<%= content_type %>"><%= l(:label_no_data) %></p>
35
+ <% end -%>
36
+
37
+ <%= javascript_tag(show_meeting_content_editor?(content, content_type) ? "$$('.show-#{content_type}').invoke('hide');" : "$$('.edit-#{content_type}').invoke('hide');") %>
38
+ </div>
39
+
40
+ <%= render :partial => 'shared/meeting_header' %>
@@ -0,0 +1,33 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <div class="contextual">
14
+ <%= link_to_if_authorized(l(:label_history), {:controller => '/' + @content_type.pluralize, :action => 'history', :meeting_id => @meeting}, :class => 'icon icon-history') %>
15
+ </div>
16
+
17
+ <h2><%= l(:"label_#{@content_type}") %>: <%= link_to @meeting, @meeting %></h2>
18
+
19
+ <p>
20
+ <%= l(:label_version) %> <%= link_to @diff.content_from.version, send(:"#{@content_type}_version_path", @meeting, @diff.content_from.version) %>
21
+ <em>(<%= link_to_user(@diff.content_from.author) %>, <%= format_time(@diff.content_from.updated_at) %>)</em>
22
+ &#8594;
23
+ <%= l(:label_version) %> <%= link_to @diff.content_to.version, send(:"#{@content_type}_version_path", @meeting, @diff.content_to.version) %>/<%= @content.version %>
24
+ <em>(<%= link_to_user(@diff.content_to.author) %>, <%= format_time(@diff.content_to.updated_at) %>)</em>
25
+ </p>
26
+
27
+ <hr />
28
+
29
+ <div class="text-diff">
30
+ <%= simple_format_without_paragraph @diff.to_html %>
31
+ </div>
32
+
33
+ <%= render :partial => 'shared/meeting_header' %>
@@ -0,0 +1,49 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <h2><%= l(:"label_#{@content_type}") %>: <%= link_to @meeting, @meeting %></h2>
14
+
15
+ <h3><%= l(:label_history) %></h3>
16
+
17
+ <%= form_tag({:action => "diff"}, :method => :get) do %>
18
+ <table class="list">
19
+ <thead><tr>
20
+ <th>#</th>
21
+ <th></th>
22
+ <th></th>
23
+ <th><%= Meeting.human_attribute_name(:updated_on) %></th>
24
+ <th><%= Meeting.human_attribute_name(:author) %></th>
25
+ <th><%= Meeting.human_attribute_name(:comments) %></th>
26
+ </tr></thead>
27
+ <tbody>
28
+ <% show_diff = @content_versions.size > 1 %>
29
+ <% @content_versions.each_with_index do |content_version,index| %>
30
+ <tr class="<%= cycle("odd", "even") %>">
31
+ <td class="id">
32
+ <%= content_version.version == @content.version ?
33
+ link_to(content_version.version, tab_meeting_path(@meeting, :tab => @content_type.sub(/^meeting_/, ''))) :
34
+ link_to(content_version.version, send(:"#{@content_type}_version_path", @meeting, content_version.version)) %>
35
+ </td>
36
+ <td class="checkbox"><%= radio_button_tag('version_to', content_version.version, (index==0), :id => "checkbox-from-#{index}", :onclick => "$('checkbox-to-#{index+1}').checked=true;") if show_diff && (index < @content_versions.size-1) %></td>
37
+ <td class="checkbox"><%= radio_button_tag('version_from', content_version.version, (index==1), :id => "checkbox-to-#{index}") if show_diff && (index > 0) %></td>
38
+ <td align="center"><%= format_time(content_version.created_at) %></td>
39
+ <td><em><%= User.find content_version.user_id %></em></td>
40
+ <td><%=h content_version.notes %></td>
41
+ </tr>
42
+ <% end %>
43
+ </tbody>
44
+ </table>
45
+ <%= submit_tag l(:label_view_diff), :class => 'small' if show_diff %>
46
+ <%= pagination_links_full @content_versions %>
47
+ <% end %>
48
+
49
+ <%= render :partial => 'shared/meeting_header' %>
@@ -0,0 +1,13 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <%= render(:partial => "meeting_contents/show", :locals => {:content => @content, :content_type => @content_type, :title => "#{l(:"label_#{@content_type}")}: #{link_to @meeting, @meeting}"}) %>
@@ -0,0 +1,23 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <h1><%= link_to(@meeting.project.name, @project_url) %>: <%= link_to(@meeting.title, @meeting_url) %></h1>
14
+ <em><%= @meeting.author %></em>
15
+
16
+ <ul>
17
+ <li><%=t :label_meeting_date_time %>: <%= format_date @meeting.start_date %> <%= format_time @meeting.start_time, false %>-<%= format_time @meeting.end_time, false %> <%= Time.zone %></li>
18
+ <li><%=Meeting.human_attribute_name(:location) %>: <%= @meeting.location %></li>
19
+ <li><%=Meeting.human_attribute_name(:participants_invited) %>: <%= @meeting.participants.invited.sort.join("; ") %></li>
20
+ <li><%=Meeting.human_attribute_name(:participants_attended) %>: <%= @meeting.participants.attended.sort.join("; ") %></li>
21
+ </ul>
22
+
23
+ <p><%=raw t(:"text_review_#{@content_type}", :author => h(User.current), :link => link_to(@meeting.title, @meeting_url)) %></p>
@@ -0,0 +1,9 @@
1
+ <%= @meeting.project.name %>: <%= @meeting.title %> (<%= @meeting_url %>)
2
+ <%= @meeting.author %>
3
+
4
+ <%=t :label_meeting_date_time %>: <%= format_date @meeting.start_date %> <%= format_time @meeting.start_time, false %>-<%= format_time @meeting.end_time, false %> <%= Time.zone %>
5
+ <%= Meeting.human_attribute_name(:location) %>: <%= @meeting.location %>
6
+ <%= Meeting.human_attribute_name(:participants_invited) %>: <%= @meeting.participants.invited.sort.join("; ") %>
7
+ <%= Meeting.human_attribute_name(:participants_attended) %>: <%= @meeting.participants.attended.sort.join("; ") %>
8
+
9
+ <%=t(:"text_review_#{@content_type}", :author => User.current, :link => t(:"text_#{@content_type}_for_meeting", :meeting => @meeting.title) + " (#{@meeting_url})") %>
@@ -0,0 +1,61 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <%= error_messages_for 'meeting' %>
14
+
15
+ <div class="box tabular">
16
+ <p><%= f.text_field :title, :required => true, :size => 60, :class => "autofocus" %></p>
17
+ <p><%= f.text_field :location, :size => 60 %></p>
18
+ <p><%= f.text_field :start_date, :required => true, :size => 10 %><%= calendar_for('meeting_start_date') %> <%= time_select "meeting", "start_time", :ignore_date => true, :minute_step => 5 %> <%= Time.zone %></p>
19
+ <p><%= f.text_field :duration, :required => true, :size => 5 %><em>(<%=l :text_in_hours %>)</em>
20
+ <div><label><%=Meeting.human_attribute_name(:participants) %></label>
21
+ <table class="list">
22
+ <thead><tr>
23
+ <th><%=Meeting.human_attribute_name(:name) %></th>
24
+ <th><%=Meeting.human_attribute_name(:participants_invited) %></th>
25
+ <th><%=Meeting.human_attribute_name(:participants_attended) %></th>
26
+ </tr></thead>
27
+ <tbody>
28
+ <% @meeting.all_possible_participants.sort.each do |user| -%>
29
+ <%= hidden_field_tag "meeting[participants_attributes][][user_id]", user.id %>
30
+ <tr class="<%= cycle("odd", "even")%>">
31
+ <td><%=h user %></td>
32
+ <% if @meeting.participants.present? && participant = @meeting.participants.detect{|p| p.user_id == user.id} -%>
33
+ <%= hidden_field_tag "meeting[participants_attributes][][id]", participant.id %>
34
+ <td class="checkox" align="center">
35
+ <%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
36
+ <%= check_box_tag "meeting[participants_attributes][][invited]", 1, participant.invited?, :id => "checkbox_invited_#{user.id}" %>
37
+ </td>
38
+ <td class="checkox" align="center">
39
+ <%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %>
40
+ <%= check_box_tag "meeting[participants_attributes][][attended]", 1, participant.attended?, :id => "checkbox_attended_#{user.id}" %>
41
+ </td>
42
+ <% else -%>
43
+ <td class="checkox" align="center">
44
+ <%= label_tag "checkbox_invited_#{user.id}", user.name + " " + l(:description_invite), :class => "hidden-for-sighted" %>
45
+ <%= check_box_tag "meeting[participants_attributes][][invited]", value = "1", checked = false, :id => "checkbox_invited_#{user.id}" %>
46
+ </td>
47
+ <td class="checkox" align="center">
48
+ <%= label_tag "checkbox_attended_#{user.id}", user.name + " " + l(:description_attended), :class => "hidden-for-sighted" %>
49
+ <%= check_box_tag "meeting[participants_attributes][][attended]", value = "1", checked = false, :id => "checkbox_attended_#{user.id}" %>
50
+ </td>
51
+ <% end -%>
52
+ </tr>
53
+ <% end -%>
54
+ </tbody>
55
+ </table>
56
+ </div>
57
+ <%= hidden_field_tag "copied_from_meeting_id", params[:copied_from_meeting_id] if params[:copied_from_meeting_id].present? %>
58
+ <%= hidden_field_tag "copied_meeting_agenda_text", params[:copied_meeting_agenda_text] if params[:copied_meeting_agenda_text].present? %>
59
+ </div>
60
+
61
+ <%= render :partial => 'shared/meeting_header' %>
@@ -0,0 +1,17 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <h2><%= l(:label_meeting) %> #<%= @meeting.id %></h2>
14
+ <%= labelled_tabular_form_for @meeting, :url => {:controller => '/meetings', :action => 'update'}, :html => {:id => 'meeting-form', :method => :put} do |f| -%>
15
+ <%= render :partial => 'form', :locals => {:f => f} %>
16
+ <%= submit_tag l(:button_save) %> <%= link_to l(:button_cancel), :action => 'show', :id => @meeting %>
17
+ <% end if @project %>
@@ -0,0 +1,51 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <h2><%= l(:label_meeting_plural)%></h2>
14
+
15
+ <% if @meetings_by_start_year_month_date.empty? -%>
16
+ <p class="nodata"><%= l(:label_no_data) %></p>
17
+ <% else -%>
18
+ <div class="meetings meetings_by_month_year" id="activity">
19
+ <% @meetings_by_start_year_month_date.each do |year,meetings_by_start_month_date| -%>
20
+ <% meetings_by_start_month_date.each do |month,meetings_by_start_date| -%>
21
+ <h3 class="month_year"><%= "#{month_name(month)} #{year}" %></h3>
22
+ <div class="meetings_by_date">
23
+ <% meetings_by_start_date.each do |date,meetings| -%>
24
+ <h3 id="<%= date.strftime("%m-%d-%Y") %>" class="date"><%= format_activity_day(date) %></h3>
25
+ <dl class="meetings">
26
+ <% meetings.each do |meeting| -%>
27
+ <dt class="meeting" id="meeting-<%= meeting.id %>">
28
+ <%= avatar meeting.author, :size => "24" %>
29
+ <span class="time"><%= format_time meeting.start_time, false %>-<%= format_time meeting.end_time, false %></span>
30
+ <%= link_to h(meeting.title), :controller => '/meetings', :action => 'show', :id => meeting %>
31
+ </dt>
32
+ <dd class="meeting" id="meeting-<%= meeting.id %>">
33
+ <p><strong><%= Meeting.human_attribute_name(:location) %></strong>: <%=h meeting.location %></p>
34
+ <p><strong><%= Meeting.human_attribute_name(:participants_invited) %></strong> (<%= meeting.participants.select(&:invited).count %>): <%= format_participant_list meeting.participants.select(&:invited) %></p>
35
+ <p><strong><%= Meeting.human_attribute_name(:participants_attended) %></strong> (<%= meeting.participants.select(&:attended).count %>): <%= format_participant_list meeting.participants.select(&:attended) %></p>
36
+ </dd>
37
+ <% end -%>
38
+ </dl>
39
+ <% end -%>
40
+ </div>
41
+ <% end -%>
42
+ <% end -%>
43
+ </div>
44
+ <% end -%>
45
+
46
+ <p class="pagination">
47
+ <%= link_to_content_update(l(:label_today), params.merge(:page => @page_of_today, :anchor => Date.today.strftime("%m-%d-%Y"))) %>
48
+ <%= pagination_links_full @meetings, :container => false %>
49
+ </p>
50
+
51
+ <%= render :partial => 'shared/meeting_header' %>
@@ -0,0 +1,17 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <h2><%= l(:label_meeting_new) %></h2>
14
+ <%= labelled_tabular_form_for @meeting, :url => {:controller => '/meetings', :action => 'create', :project_id => @project}, :html => {:id => 'meeting-form'} do |f| -%>
15
+ <%= render :partial => 'form', :locals => {:f => f} %>
16
+ <%= submit_tag l(:button_create) %> <%= link_to l(:button_cancel), :action => 'index', :project_id => @project %>
17
+ <% end if @project %>
@@ -0,0 +1,48 @@
1
+ <%#-- copyright
2
+ OpenProject is a project management system.
3
+
4
+ Copyright (C) 2012-2013 the OpenProject Team
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License version 3.
8
+
9
+ See doc/COPYRIGHT.rdoc for more details.
10
+
11
+ ++#%>
12
+
13
+ <div class="contextual">
14
+ <%= watcher_link @meeting, User.current %>
15
+ <%= link_to_if_authorized(l(:button_edit), {:controller => '/meetings', :action => 'edit', :id => @meeting}, :class => 'icon icon-edit')%>
16
+ <%= link_to_if_authorized(l(:button_copy), {:controller => '/meetings', :action => 'copy', :id => @meeting}, :class => 'icon icon-copy')%>
17
+ <%= link_to_if_authorized(l(:button_delete), {:controller => '/meetings', :action => 'destroy', :id => @meeting}, :method => :delete, :confirm => l(:text_are_you_sure), :class => 'icon icon-del')%>
18
+ </div>
19
+
20
+ <h2><%= l(:label_meeting) %>: <%= link_to @meeting %></h2>
21
+
22
+ <div class="meeting details box">
23
+ <%= avatar(@meeting.author, :size => "64") %>
24
+ <p class="author"><%= authoring @meeting.created_at, @meeting.author %></p>
25
+ <div class="splitcontentleft">
26
+ <p><strong><%= Meeting.human_attribute_name(:start_time) %></strong>: <%= format_date @meeting.start_date %> <%= format_time @meeting.start_time, false %> - <%= format_time @meeting.end_time, false %> <%= Time.zone %></p>
27
+ </div>
28
+ <div class="splitcontentright">
29
+ <p><strong><%= Meeting.human_attribute_name(:location) %></strong>: <%=h @meeting.location %></p>
30
+ </div>
31
+ <div style="clear:both;"> </div>
32
+ <p><strong><%= Meeting.human_attribute_name(:participants_invited) %></strong>: <%= format_participant_list @meeting.participants.invited %></p>
33
+ <p><strong><%= Meeting.human_attribute_name(:participants_attended) %></strong>: <%= format_participant_list @meeting.participants.attended %></p>
34
+ </div>
35
+
36
+ <%= render_tabs [{:name => 'agenda', :action => :create_meeting_agendas, :partial => 'meeting_contents/show', :label => :label_meeting_agenda, :content => @meeting.agenda || @meeting.build_agenda, :content_type => "meeting_agenda"},
37
+ {:name => 'minutes', :action => :create_meeting_minutes, :partial => 'meeting_contents/show', :label => :label_meeting_minutes, :content => @meeting.minutes || @meeting.build_minutes, :content_type => "meeting_minutes"}] %>
38
+
39
+ <% if @meeting.journals.changing.present? %>
40
+ <div id="history">
41
+ <h3><%=l(:label_history)%></h3>
42
+ <% @meeting.journals.each do |journal| %>
43
+ <%= render_journal @meeting, journal %>
44
+ <% end %>
45
+ </div>
46
+ <% end %>
47
+
48
+ <%= render :partial => 'shared/meeting_header' %>