decidim-meetings 0.11.2 → 0.12.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/admin/decidim_meetings_manifest.js +2 -0
  3. data/app/assets/javascripts/decidim/meetings/admin/agendas.js.es6 +158 -0
  4. data/app/assets/javascripts/decidim/meetings/admin/meetings_form.js.es6 +19 -0
  5. data/app/cells/decidim/meetings/join_meeting_button/registration_confirm.erb +15 -0
  6. data/app/cells/decidim/meetings/join_meeting_button/show.erb +27 -0
  7. data/app/cells/decidim/meetings/join_meeting_button_cell.rb +37 -0
  8. data/app/cells/decidim/meetings/meeting_cell.rb +2 -13
  9. data/app/cells/decidim/meetings/meeting_list_item_cell.rb +8 -0
  10. data/app/cells/decidim/meetings/meeting_m/address.erb +14 -0
  11. data/app/cells/decidim/meetings/meeting_m/data.erb +2 -0
  12. data/app/cells/decidim/meetings/meeting_m/date.erb +8 -0
  13. data/app/cells/decidim/meetings/meeting_m/footer.erb +9 -0
  14. data/app/cells/decidim/meetings/meeting_m/multiple_dates.erb +17 -0
  15. data/app/cells/decidim/meetings/meeting_m/single_date.erb +9 -0
  16. data/app/cells/decidim/meetings/meeting_m/tags.erb +1 -0
  17. data/app/cells/decidim/meetings/meeting_m_cell.rb +37 -4
  18. data/app/commands/decidim/meetings/admin/copy_meeting.rb +3 -0
  19. data/app/commands/decidim/meetings/admin/create_agenda.rb +93 -0
  20. data/app/commands/decidim/meetings/admin/create_meeting.rb +3 -0
  21. data/app/commands/decidim/meetings/admin/create_minutes.rb +55 -0
  22. data/app/commands/decidim/meetings/admin/update_agenda.rb +90 -0
  23. data/app/commands/decidim/meetings/admin/update_meeting.rb +4 -1
  24. data/app/commands/decidim/meetings/admin/update_minutes.rb +62 -0
  25. data/app/controllers/decidim/meetings/admin/agenda_controller.rb +75 -0
  26. data/app/controllers/decidim/meetings/admin/attachments_controller.rb +1 -1
  27. data/app/controllers/decidim/meetings/admin/invites_controller.rb +4 -0
  28. data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +4 -0
  29. data/app/controllers/decidim/meetings/admin/meeting_copies_controller.rb +4 -0
  30. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +10 -0
  31. data/app/controllers/decidim/meetings/admin/minutes_controller.rb +69 -0
  32. data/app/controllers/decidim/meetings/admin/registrations_controller.rb +6 -0
  33. data/app/controllers/decidim/meetings/meetings_controller.rb +7 -1
  34. data/app/controllers/decidim/meetings/registrations_controller.rb +12 -6
  35. data/app/forms/decidim/meetings/admin/meeting_agenda_form.rb +54 -0
  36. data/app/forms/decidim/meetings/admin/meeting_agenda_items_form.rb +33 -0
  37. data/app/forms/decidim/meetings/admin/meeting_copy_form.rb +8 -0
  38. data/app/forms/decidim/meetings/admin/meeting_form.rb +8 -0
  39. data/app/forms/decidim/meetings/admin/meeting_registration_invite_form.rb +2 -1
  40. data/app/forms/decidim/meetings/admin/minutes_form.rb +20 -0
  41. data/app/helpers/decidim/meetings/admin/application_helper.rb +13 -0
  42. data/{lib/decidim/meetings/view_model.rb → app/helpers/decidim/meetings/meeting_cells_helper.rb} +7 -1
  43. data/app/helpers/decidim/meetings/meetings_helper.rb +67 -0
  44. data/app/models/decidim/meetings/agenda.rb +19 -0
  45. data/app/models/decidim/meetings/agenda_item.rb +35 -0
  46. data/app/models/decidim/meetings/meeting.rb +52 -3
  47. data/app/models/decidim/meetings/minutes.rb +19 -0
  48. data/app/permissions/decidim/meetings/admin/permissions.rb +69 -0
  49. data/app/permissions/decidim/meetings/permissions.rb +41 -0
  50. data/app/presenters/decidim/meetings/admin_log/meeting_presenter.rb +4 -1
  51. data/app/presenters/decidim/meetings/admin_log/minutes_presenter.rb +42 -0
  52. data/app/presenters/decidim/meetings/admin_log/value_types/organizer_presenter.rb +69 -0
  53. data/app/types/decidim/meetings/meeting_type.rb +4 -4
  54. data/app/views/decidim/meetings/admin/agenda/_agenda_item.html.erb +50 -0
  55. data/app/views/decidim/meetings/admin/agenda/_agenda_item_child.html.erb +26 -0
  56. data/app/views/decidim/meetings/admin/agenda/_agenda_item_fields.html.erb +19 -0
  57. data/app/views/decidim/meetings/admin/agenda/_form.html.erb +66 -0
  58. data/app/views/decidim/meetings/admin/agenda/edit.html.erb +7 -0
  59. data/app/views/decidim/meetings/admin/agenda/new.html.erb +8 -0
  60. data/app/views/decidim/meetings/admin/agenda/show.html.erb +0 -0
  61. data/app/views/decidim/meetings/admin/meeting_copies/_form.html.erb +15 -1
  62. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +15 -0
  63. data/app/views/decidim/meetings/admin/meetings/index.html.erb +9 -7
  64. data/app/views/decidim/meetings/admin/minutes/_form.html.erb +23 -0
  65. data/app/views/decidim/meetings/admin/minutes/edit.html.erb +7 -0
  66. data/app/views/decidim/meetings/admin/minutes/new.html.erb +7 -0
  67. data/app/views/decidim/meetings/admin/registrations/_form.html.erb +11 -9
  68. data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +0 -1
  69. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +31 -0
  70. data/app/views/decidim/meetings/meetings/_meeting_minutes.html.erb +48 -0
  71. data/app/views/decidim/meetings/meetings/_meetings.html.erb +1 -1
  72. data/app/views/decidim/meetings/meetings/show.html.erb +23 -12
  73. data/app/views/decidim/participatory_spaces/_meeting.html.erb +1 -1
  74. data/app/views/decidim/participatory_spaces/_upcoming_meeting_for_card.html.erb +6 -0
  75. data/config/locales/ca.yml +106 -4
  76. data/config/locales/en.yml +106 -4
  77. data/config/locales/es.yml +106 -4
  78. data/config/locales/eu.yml +106 -4
  79. data/config/locales/fi.yml +106 -4
  80. data/config/locales/fr.yml +106 -4
  81. data/config/locales/gl.yml +106 -4
  82. data/config/locales/it.yml +106 -4
  83. data/config/locales/nl.yml +106 -4
  84. data/config/locales/pl.yml +112 -4
  85. data/config/locales/pt-BR.yml +106 -4
  86. data/config/locales/pt.yml +106 -4
  87. data/config/locales/ru.yml +97 -4
  88. data/config/locales/sv.yml +106 -4
  89. data/config/locales/uk.yml +112 -4
  90. data/db/migrate/20180403145218_add_meeting_types.rb +8 -0
  91. data/db/migrate/20180404075312_add_organizer_to_meetings.rb +7 -0
  92. data/db/migrate/20180406080619_create_meetings_minutes.rb +15 -0
  93. data/db/migrate/20180419131924_create_decidim_agendas.rb +13 -0
  94. data/db/migrate/20180419132104_create_decidim_agenda_items.rb +16 -0
  95. data/db/migrate/20180516102301_index_meetings_as_searchable_resources.rb +24 -0
  96. data/lib/decidim/meetings/admin_engine.rb +2 -0
  97. data/lib/decidim/meetings/component.rb +3 -2
  98. data/lib/decidim/meetings/engine.rb +16 -6
  99. data/lib/decidim/meetings/test/factories.rb +44 -0
  100. data/lib/decidim/meetings/version.rb +1 -1
  101. metadata +63 -21
  102. data/app/cells/decidim/meetings/meeting_m/header.erb +0 -5
  103. data/app/cells/decidim/meetings/meeting_m/show.erb +0 -21
  104. data/app/models/decidim/meetings/abilities/current_user_ability.rb +0 -43
  105. data/app/views/decidim/meetings/meetings/_registration_confirm.html.erb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67f58ebb0991c3bfd60730942696df7eea675439fbde8a7197c7c470190a7f40
4
- data.tar.gz: 3d6a27096b35c96665ee53d53c9773391a30c13a87576e551ce90bcdbba7fb51
3
+ metadata.gz: ba1d143141173018ffc39b1c91fc371339fc2d65e40127c3578a1b5d32f8a0a3
4
+ data.tar.gz: 2b0020c3c8cf0d12b8ab02f1e5919e5d3ee723be8f03536baae7e5fc02f121a4
5
5
  SHA512:
6
- metadata.gz: a3eef6ff97b71be244bd174b1794bc7cd1ccb0f4a2219b597f57358d197c1bb97e5c4abcd6f9e9291ebd40836915c1ee940ccd9dcbd5199b136394bf0c22dc8e
7
- data.tar.gz: c4e907b0687775be95799613837582bc16c6cddb0298dd95a6a16b1c655ff04cca4b74b6569d28a96f93cbc846ceca18bfd7353ddd23e542fc355fc4a22f5414
6
+ metadata.gz: bdfc43c0090c3c23543027eb1a113a75f87a40cc64dc17f8181727114aec8e64c36146e7d26fea5e411b19e3d39c9a26c63c853683cc9977af45785f893f09d1
7
+ data.tar.gz: edb9298e91ef4c5c89faa78c04368fc86f27dd3d336948bca0213ad147f1d44f96a302e71cfdae2704f297e6a717a929ff0e8db542adc3c26f2353b6ae6dab51
@@ -1,2 +1,4 @@
1
1
  //= link decidim/meetings/admin/meetings_form.js
2
2
  //= link decidim/meetings/admin/registrations_form.js
3
+ //= link decidim/meetings/admin/meetings_form.js
4
+ //= link decidim/meetings/admin/agendas.js
@@ -0,0 +1,158 @@
1
+ ((exports) => {
2
+ const { AutoLabelByPositionComponent, AutoButtonsByPositionComponent, createDynamicFields, createSortList } = exports.DecidimAdmin;
3
+ const { createQuillEditor } = exports.Decidim;
4
+
5
+ const wrapperSelector = ".meeting-agenda-items";
6
+ const fieldSelector = ".meeting-agenda-item";
7
+ const childsWrapperSelector = ".meeting-agenda-item-childs";
8
+ const childFieldSelector = ".meeting-agenda-item-child";
9
+
10
+ const autoLabelByPosition = new AutoLabelByPositionComponent({
11
+ listSelector: ".meeting-agenda-item:not(.hidden)",
12
+ labelSelector: ".card-title span:first",
13
+ onPositionComputed: (el, idx) => {
14
+ $(el).find("input[name$=\\[position\\]]").val(idx);
15
+ }
16
+ });
17
+
18
+ const autoButtonsByPosition = new AutoButtonsByPositionComponent({
19
+ listSelector: ".meeting-agenda-item:not(.hidden)",
20
+ hideOnFirstSelector: ".move-up-agenda-item",
21
+ hideOnLastSelector: ".move-down-agenda-item"
22
+ });
23
+
24
+ const createSortableList = () => {
25
+ createSortList(".meeting-agenda-items-list:not(.published)", {
26
+ handle: ".agenda-item-divider",
27
+ placeholder: '<div style="border-style: dashed; border-color: #000"></div>',
28
+ forcePlaceholderSize: true,
29
+ onSortUpdate: () => { autoLabelByPosition.run() }
30
+ });
31
+ };
32
+
33
+ const createSortableListChild = () => {
34
+ createSortList(".meeting-agenda-item-childs-list:not(.published)", {
35
+ handle: ".agenda-item-child-divider",
36
+ placeholder: '<div style="border-style: dashed; border-color: #000"></div>',
37
+ forcePlaceholderSize: true,
38
+ onSortUpdate: () => { autoLabelByPosition.run() }
39
+ });
40
+ };
41
+
42
+ const autoLabelByPositionChild = new AutoLabelByPositionComponent({
43
+ listSelector: ".meeting-agenda-item-child:not(.hidden)",
44
+ labelSelector: ".card-title span:first",
45
+ onPositionComputed: (el, idx) => {
46
+ $(el).find("input[name$=\\[position\\]]").val(idx);
47
+ }
48
+ });
49
+
50
+ const autoButtonsByPositionChild = new AutoButtonsByPositionComponent({
51
+ listSelector: ".meeting-agenda-item-child:not(.hidden)",
52
+ hideOnFirstSelector: ".move-up-agenda-item-child",
53
+ hideOnLastSelector: ".move-down-agenda-item-child"
54
+ });
55
+
56
+ const createDynamicFieldsForAgendaItemChilds = (fieldId) => {
57
+ return createDynamicFields({
58
+ placeholderId: "meeting-agenda-item-child-id",
59
+ wrapperSelector: `#${fieldId} ${childsWrapperSelector}`,
60
+ containerSelector: ".meeting-agenda-item-childs-list",
61
+ fieldSelector: childFieldSelector,
62
+ addFieldButtonSelector: ".add-agenda-item-child",
63
+ removeFieldButtonSelector: ".remove-agenda-item-child",
64
+ moveUpFieldButtonSelector: ".move-up-agenda-item-child",
65
+ moveDownFieldButtonSelector: ".move-down-agenda-item-child",
66
+
67
+ onAddField: ($field) => {
68
+ createSortableListChild();
69
+
70
+ $field.find(".editor-container").each((idx, el) => {
71
+ createQuillEditor(el);
72
+ });
73
+
74
+ autoLabelByPositionChild.run();
75
+ autoButtonsByPositionChild.run();
76
+ },
77
+ onRemoveField: () => {
78
+ autoLabelByPositionChild.run();
79
+ autoButtonsByPositionChild.run();
80
+ },
81
+ onMoveUpField: () => {
82
+ autoLabelByPositionChild.run();
83
+ autoButtonsByPositionChild.run();
84
+ },
85
+ onMoveDownField: () => {
86
+ autoLabelByPositionChild.run();
87
+ autoButtonsByPositionChild.run();
88
+ }
89
+ });
90
+ };
91
+
92
+ const dynamicFieldsForAgendaItemChilds = {};
93
+
94
+ const setupInitialAgendaItemChildAttributes = ($target) => {
95
+ const fieldId = $target.attr("id");
96
+
97
+ dynamicFieldsForAgendaItemChilds[fieldId] = createDynamicFieldsForAgendaItemChilds(fieldId);
98
+
99
+ }
100
+
101
+ const hideDeletedAgendaItem = ($target) => {
102
+ const inputDeleted = $target.find("input[name$=\\[deleted\\]]").val();
103
+
104
+ if (inputDeleted === "true") {
105
+ $target.addClass("hidden");
106
+ $target.hide();
107
+ }
108
+ };
109
+
110
+ createDynamicFields({
111
+ placeholderId: "meeting-agenda-item-id",
112
+ wrapperSelector: wrapperSelector,
113
+ containerSelector: ".meeting-agenda-items-list",
114
+ fieldSelector: fieldSelector,
115
+ addFieldButtonSelector: ".add-agenda-item",
116
+ removeFieldButtonSelector: ".remove-agenda-item",
117
+ moveUpFieldButtonSelector: ".move-up-agenda-item",
118
+ moveDownFieldButtonSelector: ".move-down-agenda-item",
119
+ onAddField: ($field) => {
120
+ // createDynamicFieldsForAgendaItemChilds($field);
121
+ setupInitialAgendaItemChildAttributes($field);
122
+ createSortableList();
123
+
124
+ $field.find(".editor-container").each((idx, el) => {
125
+ createQuillEditor(el);
126
+ });
127
+
128
+ autoLabelByPosition.run();
129
+ autoButtonsByPosition.run();
130
+ },
131
+ onRemoveField: () => {
132
+ autoLabelByPosition.run();
133
+ autoButtonsByPosition.run();
134
+ },
135
+ onMoveUpField: () => {
136
+ autoLabelByPosition.run();
137
+ autoButtonsByPosition.run();
138
+ },
139
+ onMoveDownField: () => {
140
+ autoLabelByPosition.run();
141
+ autoButtonsByPosition.run();
142
+ }
143
+ });
144
+
145
+ createSortableList();
146
+
147
+ $(fieldSelector).each((idx, el) => {
148
+ const $target = $(el);
149
+
150
+ hideDeletedAgendaItem($target);
151
+ setupInitialAgendaItemChildAttributes($target);
152
+ });
153
+
154
+ autoLabelByPosition.run();
155
+ autoButtonsByPosition.run();
156
+ autoLabelByPositionChild.run();
157
+ autoButtonsByPositionChild.run();
158
+ })(window);
@@ -75,4 +75,23 @@
75
75
 
76
76
  autoLabelByPosition.run();
77
77
  autoButtonsByPosition.run();
78
+
79
+ const $form = $(".edit_meeting, .new_meeting, .copy_meetings");
80
+
81
+ if ($form.length > 0) {
82
+ const $privateMeeting = $form.find("#private_meeting");
83
+ const $transparent = $form.find("#transparent");
84
+
85
+ const toggleDisabledHiddenFields = () => {
86
+ const enabledPrivateSpace = $privateMeeting.find("input[type='checkbox']").prop("checked");
87
+ $transparent.find("input[type='checkbox']").attr("disabled", "disabled");
88
+
89
+ if (enabledPrivateSpace) {
90
+ $transparent.find("input[type='checkbox']").attr("disabled", !enabledPrivateSpace);
91
+ }
92
+ };
93
+
94
+ $privateMeeting.on("change", toggleDisabledHiddenFields);
95
+ toggleDisabledHiddenFields();
96
+ }
78
97
  })(window);
@@ -0,0 +1,15 @@
1
+ <div class="reveal" data-reveal id="meeting-registration-confirm-<%= model.id %>">
2
+ <div class="row">
3
+ <div class="columns medium-10 medium-offset-1 help-text">
4
+ <%= decidim_sanitize translated_attribute(model.registration_terms) %>
5
+ </div>
6
+ </div>
7
+ <div class="row">
8
+ <div class="columns medium-8 medium-offset-2">
9
+ <%= button_to t("confirm", scope: "decidim.meetings.meetings.registration_confirm"), meeting_registration_path(model), class: "button expanded", data: { disable: true } %>
10
+ </div>
11
+ </div>
12
+ <div class="text-center">
13
+ <button class="link" data-close><%= t("cancel", scope: "decidim.meetings.meetings.registration_confirm") %></button>
14
+ </div>
15
+ </div>
@@ -0,0 +1,27 @@
1
+ <% if model.can_be_joined_by?(current_user) %>
2
+ <% if model.has_registration_for? current_user %>
3
+ <%= action_authorized_button_to(
4
+ :join,
5
+ meeting_registration_path(model),
6
+ method: :delete,
7
+ class: "#{button_classes} secondary light",
8
+ data: { disable: true }
9
+ ) do %>
10
+ <%= icon("check", class: "icon--small") %>
11
+ <%= t("going", scope: "decidim.meetings.meetings.show") %>
12
+ <% end %>
13
+ <% else %>
14
+ <%= render :registration_confirm %>
15
+ <%= action_authorized_button_to(
16
+ :join,
17
+ i18n_join_text,
18
+ "",
19
+ class: button_classes,
20
+ disabled: !model.has_available_slots?,
21
+ data: { open: current_user.present? ? "meeting-registration-confirm-#{model.id}" : "loginModal" }
22
+ ) %>
23
+ <% end %>
24
+ <% if shows_remaining_slots? %>
25
+ <span><%= t("remaining_slots", scope: "decidim.meetings.meetings.show", count: model.remaining_slots) %></span>
26
+ <% end %>
27
+ <% end %>
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ # This cell renders the button to join a meeting.
6
+ class JoinMeetingButtonCell < Decidim::ViewModel
7
+ include MeetingCellsHelper
8
+ include Decidim::SanitizeHelper
9
+
10
+ def show
11
+ render
12
+ end
13
+
14
+ private
15
+
16
+ delegate :current_user, :current_component, to: :controller, prefix: false
17
+
18
+ def button_classes
19
+ return "button expanded button--sc" if big_button?
20
+ "button card__button button--sc small"
21
+ end
22
+
23
+ def big_button?
24
+ options[:big_button]
25
+ end
26
+
27
+ def shows_remaining_slots?
28
+ options[:show_remaining_slots] && model.available_slots.positive?
29
+ end
30
+
31
+ def i18n_join_text
32
+ return I18n.t("join", scope: "decidim.meetings.meetings.show") if model.has_available_slots?
33
+ I18n.t("no_slots_available", scope: "decidim.meetings.meetings.show")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -5,7 +5,8 @@ module Decidim
5
5
  # This cell renders the meeting card for an instance of a Meeting
6
6
  # the default size is the Medium Card (:m)
7
7
  # also available the List Item Card (:list_item)
8
- class MeetingCell < Decidim::Meetings::ViewModel
8
+ class MeetingCell < Decidim::ViewModel
9
+ include MeetingCellsHelper
9
10
  include Cell::ViewModel::Partial
10
11
 
11
12
  def show
@@ -14,14 +15,6 @@ module Decidim
14
15
 
15
16
  private
16
17
 
17
- def title
18
- translated_attribute model.title
19
- end
20
-
21
- def description
22
- decidim_sanitize meeting_description(model)
23
- end
24
-
25
18
  def card_size
26
19
  case @options[:size]
27
20
  when :list_item
@@ -35,10 +28,6 @@ module Decidim
35
28
  icon "meetings", remove_icon_class: true, width: 40, height: 70
36
29
  end
37
30
 
38
- def resource_path
39
- resource_locator(model).path
40
- end
41
-
42
31
  def current_component
43
32
  model.component
44
33
  end
@@ -13,6 +13,14 @@ module Decidim
13
13
 
14
14
  private
15
15
 
16
+ def resource_path
17
+ resource_locator(model).path
18
+ end
19
+
20
+ def title
21
+ translated_attribute model.title
22
+ end
23
+
16
24
  def resource_date_time
17
25
  str = l model.start_time, format: :decidim_day_of_year
18
26
  str += " - "
@@ -0,0 +1,14 @@
1
+ <div class="card__icondata">
2
+ <ul class="card-data">
3
+ <li class="card-data__item">
4
+ <%= resource_icon %>
5
+ </li>
6
+ <li class="card-data__item">
7
+ <div class="text-left">
8
+ <div class="card__icondata--address">
9
+ <%= render partial: "decidim/shared/address_details.html", locals: { geolocalizable: model } %>
10
+ </div>
11
+ </div>
12
+ </li>
13
+ </ul>
14
+ </div>
@@ -0,0 +1,2 @@
1
+ <%= render :date %>
2
+ <%= render :address %>
@@ -0,0 +1,8 @@
1
+ <div class="card__icondata">
2
+ <ul class="card-data">
3
+ <li class="card-data__item">
4
+ <%= icon "datetime", class: "icon--big" %>
5
+ </li>
6
+ <%= meeting_date %>
7
+ </ul>
8
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="card__footer">
2
+ <div class="card__support">
3
+ <% if can_join? %>
4
+ <%= cell "decidim/meetings/join_meeting_button", model %>
5
+ <% else %>
6
+ <%= link_to t("view", scope: "decidim.meetings.meetings.show"), resource_path, class: "card__button button secondary button--sc small light" %>
7
+ <% end %>
8
+ </div>
9
+ </div>
@@ -0,0 +1,17 @@
1
+ <li class="card-data__item">
2
+ <div class="card-data__item--multiple">
3
+ <div>
4
+ <strong>
5
+ <%= l start_date, format: :decidim_with_month_name %>
6
+ </strong>
7
+ <%= formatted_start_time %>
8
+ </div>
9
+ <%= icon "arrow-thin-right", class: "icon--big muted" %>
10
+ <div>
11
+ <strong>
12
+ <%= l end_date, format: :decidim_with_month_name %>
13
+ </strong>
14
+ <%= formatted_end_time %>
15
+ </div>
16
+ </div>
17
+ </li>
@@ -0,0 +1,9 @@
1
+ <li class="card-data__item">
2
+ <div>
3
+ <strong>
4
+ <%= l start_date, format: :decidim_with_month_name %>
5
+ </strong>
6
+ &nbsp;·&nbsp;
7
+ <%= formatted_start_time %> - <%= formatted_end_time %>
8
+ </div>
9
+ </li>
@@ -0,0 +1 @@
1
+ <%= render partial: "decidim/shared/tags.html", locals: { resource: model, tags_class_extra: "tags--meeting" } %>
@@ -4,13 +4,46 @@ module Decidim
4
4
  module Meetings
5
5
  # This cell renders the Medium (:m) meeting card
6
6
  # for an given instance of a Meeting
7
- class MeetingMCell < Decidim::Meetings::MeetingCell
8
- def show
7
+ class MeetingMCell < Decidim::CardMCell
8
+ include MeetingCellsHelper
9
+
10
+ def date
9
11
  render
10
12
  end
11
13
 
12
- def header
13
- render
14
+ private
15
+
16
+ def resource_icon
17
+ icon "meetings", class: "icon--big"
18
+ end
19
+
20
+ def spans_multiple_dates?
21
+ start_date != end_date
22
+ end
23
+
24
+ def meeting_date
25
+ return render(:multiple_dates) if spans_multiple_dates?
26
+ render(:single_date)
27
+ end
28
+
29
+ def formatted_start_time
30
+ model.start_time.strftime("%H:%M")
31
+ end
32
+
33
+ def formatted_end_time
34
+ model.end_time.strftime("%H:%M")
35
+ end
36
+
37
+ def start_date
38
+ model.start_time.to_date
39
+ end
40
+
41
+ def end_date
42
+ model.end_time.to_date
43
+ end
44
+
45
+ def can_join?
46
+ model.can_be_joined_by?(current_user)
14
47
  end
15
48
  end
16
49
  end