openproject-meeting 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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' %>