decidim-meetings 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/decidim_meetings_manifest.js +2 -0
  3. data/app/assets/javascripts/decidim/meetings/map.js.es6.erb +92 -0
  4. data/app/assets/stylesheets/decidim/meetings/map.css +1 -0
  5. data/app/commands/decidim/meetings/admin/close_meeting.rb +53 -0
  6. data/app/commands/decidim/meetings/admin/create_meeting.rb +15 -3
  7. data/app/commands/decidim/meetings/admin/update_meeting.rb +15 -3
  8. data/app/controllers/decidim/meetings/admin/application_controller.rb +9 -0
  9. data/app/controllers/decidim/meetings/admin/attachments_controller.rb +29 -0
  10. data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +38 -0
  11. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +0 -12
  12. data/app/controllers/decidim/meetings/meetings_controller.rb +11 -9
  13. data/app/forms/decidim/meetings/admin/close_meeting_form.rb +31 -0
  14. data/app/forms/decidim/meetings/admin/meeting_form.rb +0 -2
  15. data/app/helpers/decidim/meetings/admin/application_helper.rb +12 -0
  16. data/app/helpers/decidim/meetings/application_helper.rb +1 -0
  17. data/app/helpers/decidim/meetings/map_helper.rb +46 -0
  18. data/app/models/decidim/meetings/meeting.rb +11 -15
  19. data/app/services/decidim/meetings/meeting_search.rb +0 -1
  20. data/app/services/decidim/meetings/static_map_generator.rb +50 -0
  21. data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +23 -0
  22. data/app/views/decidim/meetings/admin/meeting_closes/edit.html.erb +9 -0
  23. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +2 -6
  24. data/app/views/decidim/meetings/admin/meetings/index.html.erb +14 -0
  25. data/app/views/decidim/meetings/meetings/_datetime.html.erb +8 -0
  26. data/app/views/decidim/meetings/meetings/_filters.html.erb +2 -2
  27. data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +18 -0
  28. data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +22 -0
  29. data/app/views/decidim/meetings/meetings/_meetings.html.erb +3 -10
  30. data/app/views/decidim/meetings/meetings/index.html.erb +42 -0
  31. data/app/views/decidim/meetings/meetings/index.js.erb +6 -0
  32. data/app/views/decidim/meetings/meetings/show.html.erb +33 -7
  33. data/config/i18n-tasks.yml +2 -0
  34. data/config/locales/ca.yml +37 -4
  35. data/config/locales/en.yml +34 -1
  36. data/config/locales/es.yml +36 -3
  37. data/db/migrate/20170110142105_close_a_meeting.rb +9 -0
  38. data/db/migrate/20170123151650_add_latitude_and_longitude_to_meetings.rb +6 -0
  39. data/db/migrate/20170129153716_remove_short_description_from_meetings.rb +5 -0
  40. data/lib/decidim/meetings/admin_engine.rb +31 -1
  41. data/lib/decidim/meetings/feature.rb +20 -6
  42. data/lib/decidim/meetings/list_engine.rb +10 -1
  43. data/lib/decidim/meetings/seeds/Exampledocument.pdf +0 -0
  44. data/lib/decidim/meetings/seeds/city.jpeg +0 -0
  45. data/lib/decidim/meetings/test/factories.rb +23 -0
  46. metadata +125 -6
@@ -10,6 +10,10 @@
10
10
  <th><%= t("models.meeting.fields.title", scope: "decidim.meetings") %></th>
11
11
  <th><%= t("models.meeting.fields.start_time", scope: "decidim.meetings") %></th>
12
12
  <th><%= t("models.meeting.fields.end_time", scope: "decidim.meetings") %></th>
13
+ <th><%= t("models.meeting.fields.closed", scope: "decidim.meetings") %></th>
14
+ <% if Decidim.geocoder.present? %>
15
+ <th><%= t("models.meeting.fields.map", scope: "decidim.meetings") %></th>
16
+ <% end %>
13
17
  <th class="actions"><%= t("actions.title", scope: "decidim.meetings") %></th>
14
18
  </tr>
15
19
  </thead>
@@ -29,8 +33,18 @@
29
33
  <%= l meeting.end_time, format: :long %>
30
34
  <% end%>
31
35
  </td>
36
+ <td>
37
+ <%= humanize_boolean meeting.closed? %>
38
+ </td>
39
+ <% if Decidim.geocoder.present? %>
40
+ <td>
41
+ <%= static_map_link(meeting) %>
42
+ </td>
43
+ <% end %>
32
44
  <td class="actions">
33
45
  <%= link_to t("actions.edit", scope: "decidim.meetings"), edit_meeting_path(meeting) if can? :update, current_feature %>
46
+ <%= link_to t("actions.close", scope: "decidim.meetings"), edit_meeting_meeting_close_path(meeting_id: meeting.id, id: meeting.id) if can? :update, current_feature %>
47
+ <%= link_to t("actions.attachments", scope: "decidim.meetings"), meeting_attachments_path(meeting) if can? :update, current_feature %>
34
48
  <%= link_to t("actions.destroy", scope: "decidim.meetings"), meeting_path(meeting), method: :delete, class: "small alert button", data: { confirm: t("actions.confirm_destroy", scope: "decidim.meetings") } if can? :destroy, current_feature %>
35
49
  </td>
36
50
  </tr>
@@ -0,0 +1,8 @@
1
+ <div class="card__datetime">
2
+ <div class="card__datetime__date">
3
+ <%= l meeting.start_time, format: "%d" %> <span class="card__datetime__month"><%= l meeting.start_time, format: "%B" %></span>
4
+ </div>
5
+ <div class="card__datetime__time">
6
+ <%= meeting.start_time.strftime("%H:%M") %> - <%= meeting.end_time.strftime("%H:%M") %>
7
+ </div>
8
+ </div>
@@ -11,7 +11,7 @@
11
11
  </div>
12
12
  </div>
13
13
  </div>
14
-
14
+
15
15
  <%= form.collection_radio_buttons :order_start_time, [["asc", t('.ascendent')], ["desc", t('.descendent')]], :first, :last, legend_title: t('.date') %>
16
16
 
17
17
  <% if current_organization.scopes.any? %>
@@ -19,6 +19,6 @@
19
19
  <% end %>
20
20
 
21
21
  <% if current_feature.categories.any? %>
22
- <%= form.categories_select :category_id, current_feature.categories, legend_title: t('.category'), disable_parents: false, label: false, include_blank: true %>
22
+ <%= form.categories_select :category_id, current_feature.categories, legend_title: t('.category'), disable_parents: false, label: false, include_blank: true %>
23
23
  <% end %>
24
24
  <% end %>
@@ -0,0 +1,18 @@
1
+ <div class="filters-controls hide-for-mediumlarge">
2
+ <button data-open="filter-box" class="filters-controls__trigger">
3
+ <%= t ".filter" %>
4
+ <%= icon "caret-bottom", class: "icon--small float-right", aria_label: t('.unfold'), role: "img" %>
5
+ </button>
6
+ </div>
7
+
8
+ <div class="reveal" id="filter-box" data-reveal>
9
+ <div class="reveal__header">
10
+ <h3 class="reveal__title"><%= t ".filter_for" %>:</h3>
11
+ <button class="close-button" data-close aria-label="<%= t(".close_modal") %>" type="button">
12
+ <span aria-hidden="true">&times;</span>
13
+ </button>
14
+ </div>
15
+ <div class="filters">
16
+ <%= render partial: "filters" %>
17
+ </div>
18
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="row small-up-1 medium-up-2 card-grid">
2
+ <% resources.each do |meeting| %>
3
+ <div class="column">
4
+ <article class="card card--meeting">
5
+ <div class="card__content">
6
+ <%= link_to decidim_resource_path(meeting), class: "card__link" do %>
7
+ <h5 class="card__title"><%= translated_attribute meeting.title %></h5>
8
+ <% end %>
9
+ <div class="card__datetime">
10
+ <div class="card__datetime__date">
11
+ <%= l meeting.start_time, format: "%d" %> <span class="card__datetime__month"><%= l meeting.start_time, format: "%B" %></span>
12
+ </div>
13
+ <div class="card__datetime__time">
14
+ <%= meeting.start_time.strftime("%H:%M") %> - <%= meeting.end_time.strftime("%H:%M") %>
15
+ </div>
16
+ </div>
17
+ <%== translated_attribute meeting.description %>
18
+ </div>
19
+ </article>
20
+ </div>
21
+ <% end %>
22
+ </div>
@@ -6,21 +6,14 @@
6
6
  <%= link_to meeting, class: "card__link" do %>
7
7
  <h5 class="card__title"><%= translated_attribute meeting.title %></h5>
8
8
  <% end %>
9
- <div class="card__datetime">
10
- <div class="card__datetime__date">
11
- <%= l meeting.start_time, format: "%d" %> <span class="card__datetime__month"><%= l meeting.start_time, format: "%B" %></span>
12
- </div>
13
- <div class="card__datetime__time">
14
- <%= meeting.start_time.strftime("%H:%M") %> - <%= meeting.end_time.strftime("%H:%M") %>
15
- </div>
16
- </div>
17
- <%== translated_attribute meeting.short_description %>
9
+ <%= render partial: "datetime", locals: { meeting: meeting } %>
10
+ <%== translated_attribute meeting.description %>
18
11
  <%= render partial: "tags", locals: { meeting: meeting } %>
19
12
  <div class="address card__extra">
20
13
  <div class="address__icon">
21
14
  <%= icon "meetings", remove_icon_class: true, width: 40, height: 70 %>
22
15
  </div>
23
- <%= render partial: 'address_details', locals: { meeting: meeting } %>
16
+ <%= render partial: "address_details", locals: { meeting: meeting } %>
24
17
  </div>
25
18
  </div>
26
19
  </article>
@@ -1,7 +1,47 @@
1
1
  <% content_for(:title, t(".title")) %>
2
2
 
3
+ <% if Decidim.geocoder.present? %>
4
+ <div class="row column">
5
+ <div class="google-map" id="meetings-map" data-meetings="<%= meetings_data_for_map(geocoded_meetings).to_json %>" data-here-app-id="<%= Decidim.geocoder[:here_app_id] %>" data-here-app-code="<%= Decidim.geocoder[:here_app_code] %>">
6
+ </div>
7
+
8
+ <template id="meeting-popup">
9
+ <div class="map-info__content">
10
+ <h3>${title}</h3>
11
+ <div id="bodyContent">
12
+ <p>{{html description}}</p>
13
+ <div class="map__date-adress">
14
+ <div class="card__datetime">
15
+ <div class="card__datetime__date">
16
+ ${startTimeDay} <span class="card__datetime__month">${startTimeMonth}</span>
17
+ </div>
18
+ <div class="card__datetime__time">${starTime}</div>
19
+ </div>
20
+ <div class="address card__extra">
21
+ <div class="address__icon">{{html icon}}</div>
22
+ <div class="address__details">
23
+ <strong>{{html location}}</strong><br />
24
+ <span>${address}</span><br />
25
+ <span>{{html locationHints}}</span>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <div class="map-info__button">
30
+ <a href="${link}" class="button button--sc">
31
+ <%= t('.view_meeting') %>
32
+ </a>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </template>
37
+ <%= stylesheet_link_tag "decidim/meetings/map" %>
38
+ <%= javascript_include_tag "decidim/meetings/map" %>
39
+ </div>
40
+ <% end %>
41
+
3
42
  <div class="row">
4
43
  <div class="columns mediumlarge-4 large-3">
44
+ <%= render partial: "filters_small_view" %>
5
45
  <div class="card card--secondary show-for-mediumlarge" >
6
46
  <%= render partial: "filters" %>
7
47
  </div>
@@ -10,3 +50,5 @@
10
50
  <%= render partial: "meetings" %>
11
51
  </div>
12
52
  </div>
53
+
54
+ <%= javascript_include_tag("decidim/filters") %>
@@ -1,2 +1,8 @@
1
1
  var $meetings = $('#meetings');
2
+
2
3
  $meetings.html('<%= j(render partial: "meetings") %>');
4
+
5
+ window.DecidimMeetings.currentMap = window.DecidimMeetings.loadMap(
6
+ 'meetings-map',
7
+ JSON.parse('<%= escape_javascript meetings_data_for_map(geocoded_meetings).to_json.html_safe %>')
8
+ );
@@ -15,26 +15,52 @@
15
15
  <%= meeting.start_time.strftime("%H:%M") %> - <%= meeting.end_time.strftime("%H:%M") %>
16
16
  </div>
17
17
  </div>
18
- </div>
18
+ </div>
19
+ <% if meeting.closed? %>
20
+ <div class="card card--secondary extra definition-data">
21
+ <div class="definition-data__item definition-data__item--double">
22
+ <span class="definition-data__title"><%= t(".attendees") %></span>
23
+ <span class="definition-data__number"><%= meeting.attendees_count %></span>
24
+ </div>
25
+ <div class="definition-data__item definition-data__item--double">
26
+ <span class="definition-data__title"><%= t(".contributions") %></span>
27
+ <span class="definition-data__number"><%= meeting.contributions_count %></span>
28
+ </div>
29
+ <div class="definition-data__item">
30
+ <span class="definition-data__title"><%= t(".organizations") %></span>
31
+ <span class="definition-data__text"><%= meeting.attending_organizations %></span>
32
+ </div>
33
+ </div>
34
+ <% end %>
19
35
  </div>
20
36
  <div class="columns mediumlarge-8 mediumlarge-pull-4">
21
37
  <div class="section">
22
- <%== translated_attribute meeting.short_description %>
38
+ <p><%== translated_attribute meeting.description %></p>
23
39
  <div class="card card--secondary">
24
40
  <div class="card__content address">
25
41
  <div class="address__info">
26
42
  <div class="address__icon">
27
43
  <%= icon "meetings", width: 40, height: 70 %>
28
44
  </div>
29
- <%= render partial: 'address_details', locals: { meeting: meeting } %>
45
+ <%= render partial: "address_details", locals: { meeting: meeting } %>
30
46
  </div>
47
+ <% if Decidim.geocoder.present? %>
48
+ <div class="address__map">
49
+ <%= static_map_link(meeting) %>
50
+ </div>
51
+ <% end %>
31
52
  </div>
32
53
  </div>
33
54
  <%= render partial: "tags", locals: { meeting: meeting } %>
34
55
  </div>
35
- <div class="section">
36
- <h3 class="section-heading"><%= t(".meeting_description") %></h3>
37
- <%== translated_attribute meeting.description %>
38
- </div>
56
+ <% if meeting.closed? %>
57
+ <div class="section">
58
+ <h3 class="section-heading"><%= t(".meeting_report") %></h3>
59
+ <%== translated_attribute meeting.closing_report %>
60
+ </div>
61
+ <% end %>
62
+ <%= linked_resources_for meeting, :proposals, "proposals_from_meeting" %>
63
+ <%= linked_resources_for meeting, :results, "meetings_through_proposals" %>
39
64
  </div>
40
65
  </div>
66
+ <%= attachments_for meeting %>
@@ -2,3 +2,5 @@ base_locale: en
2
2
  locales: [en]
3
3
  ignore_unused:
4
4
  - "decidim.features.meetings.name"
5
+ - "activemodel.attributes.close_meeting.*"
6
+ - "decidim.resource_links.*"
@@ -1,20 +1,37 @@
1
1
  ca:
2
+ activemodel:
3
+ attributes:
4
+ close_meeting:
5
+ attendees_count: Nombre d'assistents
6
+ attending_organizations: Llista d'organitzacions que han participat
7
+ closing_report: Informe
8
+ contributions_count: Nombre de contribucions
9
+ proposal_ids: Propostes creades en una trobada
2
10
  decidim:
3
11
  features:
4
12
  meetings:
5
13
  name: Llistat de trobades
6
14
  meetings:
7
15
  actions:
16
+ attachments: Adjunts
17
+ close: Tancar
8
18
  confirm_destroy: Esteu segur de que voleu suprimir aquesta trobada?
9
19
  destroy: Esborra
10
20
  edit: Edita
11
21
  new: Nou/va %{name}
12
22
  title: Accions
13
23
  admin:
24
+ meeting_closes:
25
+ edit:
26
+ close: Tancar
27
+ title: Tancar trobada
14
28
  meetings:
29
+ close:
30
+ invalid: Hi ha hagut un problema en tancar aquesta trobada
31
+ success: Trobada tancada amb èxit
15
32
  create:
16
33
  invalid: Hi ha hagut un problema en crear aquesta trobada
17
- success: Reunió creada amb èxit
34
+ success: Trobada creada amb èxit
18
35
  destroy:
19
36
  success: La trobada s'ha eliminat correctament
20
37
  edit:
@@ -27,7 +44,7 @@ ca:
27
44
  title: Nova trobada
28
45
  update:
29
46
  invalid: Hi ha hagut un problema en actualitzar aquesta trobada
30
- success: Reunió actualitzada correctament
47
+ success: Trobada actualitzada correctament
31
48
  models:
32
49
  meeting:
33
50
  name: Trobada
@@ -39,13 +56,29 @@ ca:
39
56
  descendent: Descendent
40
57
  scopes: Àmbits
41
58
  search: Cerca
59
+ filters_small_view:
60
+ close_modal: Tancar finestra
61
+ filter: Filtra
62
+ filter_for: Filtra per
63
+ unfold: Desplegar
42
64
  index:
43
65
  title: Llistat de trobades
66
+ view_meeting: Veure trobada
44
67
  show:
45
- meeting_description: Descripció de reunions
68
+ attendees: Nombre d'assistents
69
+ contributions: Nombre d'aportacions
70
+ meeting_report: Informe de la trobada
71
+ organizations: Llista d'organitzacions que han atès
46
72
  models:
47
73
  meeting:
48
74
  fields:
75
+ closed: Tancada
49
76
  end_time: Data de finalització
77
+ map: Mapa
50
78
  start_time: Data d'inici
51
- title: Títol
79
+ title: Títol
80
+ resource_links:
81
+ meetings_through_proposals:
82
+ results: 'Resultats relacionats:'
83
+ proposals_from_meeting:
84
+ proposals: Propostes relacionades
@@ -1,18 +1,35 @@
1
1
  ---
2
2
  en:
3
+ activemodel:
4
+ attributes:
5
+ close_meeting:
6
+ attendees_count: Number of attendees
7
+ attending_organizations: List of organizations that attended
8
+ closing_report: Report
9
+ contributions_count: Number of contributions
10
+ proposal_ids: Proposals created in the meeting
3
11
  decidim:
4
12
  features:
5
13
  meetings:
6
14
  name: Meetings
7
15
  meetings:
8
16
  actions:
17
+ attachments: Attachments
18
+ close: Close
9
19
  confirm_destroy: Are you sure you want to delete this meeting?
10
20
  destroy: Delete
11
21
  edit: Edit
12
22
  new: New %{name}
13
23
  title: Actions
14
24
  admin:
25
+ meeting_closes:
26
+ edit:
27
+ close: Close
28
+ title: Close meeting
15
29
  meetings:
30
+ close:
31
+ invalid: There's been a problem closing this meeting
32
+ success: Meeting successfully closed
16
33
  create:
17
34
  invalid: There's been a problem creating this meeting
18
35
  success: Meeting successfully created
@@ -40,13 +57,29 @@ en:
40
57
  descendent: Descendent
41
58
  scopes: Scopes
42
59
  search: Search
60
+ filters_small_view:
61
+ close_modal: Close modal
62
+ filter: Filter
63
+ filter_for: Filter by
64
+ unfold: Unfold
43
65
  index:
44
66
  title: Meetings
67
+ view_meeting: View meeting
45
68
  show:
46
- meeting_description: Meeting description
69
+ attendees: Attendees count
70
+ contributions: Contributions count
71
+ meeting_report: Meeting report
72
+ organizations: Attending organizations
47
73
  models:
48
74
  meeting:
49
75
  fields:
76
+ closed: Closed
50
77
  end_time: End date
78
+ map: Map
51
79
  start_time: Start date
52
80
  title: Title
81
+ resource_links:
82
+ meetings_through_proposals:
83
+ results: 'Related results:'
84
+ proposals_from_meeting:
85
+ proposals: Related proposals
@@ -1,20 +1,37 @@
1
1
  es:
2
+ activemodel:
3
+ attributes:
4
+ close_meeting:
5
+ attendees_count: Número de asistentes
6
+ attending_organizations: Lista de organizaciones que han participado
7
+ closing_report: Informe
8
+ contributions_count: Número de contribuciones
9
+ proposal_ids: Propuestas creadas en el encuentro
2
10
  decidim:
3
11
  features:
4
12
  meetings:
5
13
  name: Lista de encuentros
6
14
  meetings:
7
15
  actions:
16
+ attachments: Archivos adjuntos
17
+ close: Cerrar
8
18
  confirm_destroy: '¿Está seguro de que quiere eliminar este encuentro?'
9
19
  destroy: Borrar
10
20
  edit: Editar
11
21
  new: Nuevo/a %{name}
12
22
  title: Acciones
13
23
  admin:
24
+ meeting_closes:
25
+ edit:
26
+ close: Cerrar
27
+ title: Cerrar encuentro
14
28
  meetings:
29
+ close:
30
+ invalid: Ha habido un problema al cerrar este encuentro
31
+ success: Encuentro cerrado con éxito
15
32
  create:
16
33
  invalid: Ha habido un problema al crear este encuentro
17
- success: Reunión creada con éxito
34
+ success: Encuentro creado con éxito
18
35
  destroy:
19
36
  success: El encuentro se ha eliminado correctamente
20
37
  edit:
@@ -39,13 +56,29 @@ es:
39
56
  descendent: Descendiente
40
57
  scopes: Ámbitos
41
58
  search: Buscar
59
+ filters_small_view:
60
+ close_modal: Cerrar ventana
61
+ filter: Filtrar
62
+ filter_for: Filtrar por
63
+ unfold: Desplegar
42
64
  index:
43
65
  title: Lista de encuentros
66
+ view_meeting: Ver encuentro
44
67
  show:
45
- meeting_description: Descripción del encuentro
68
+ attendees: Número de asistentes
69
+ contributions: Número de contribuciones
70
+ meeting_report: Informe del encuentro
71
+ organizations: Organizaciones que han asistido
46
72
  models:
47
73
  meeting:
48
74
  fields:
75
+ closed: Cerrado
49
76
  end_time: Fecha de finalización
77
+ map: Mapa
50
78
  start_time: Fecha de inicio
51
- title: Título
79
+ title: Título
80
+ resource_links:
81
+ meetings_through_proposals:
82
+ results: 'Resultados relacionados:'
83
+ proposals_from_meeting:
84
+ proposals: Propuestas relacionadas
@@ -0,0 +1,9 @@
1
+ class CloseAMeeting < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :decidim_meetings_meetings, :closing_report, :jsonb
4
+ add_column :decidim_meetings_meetings, :attendees_count, :integer
5
+ add_column :decidim_meetings_meetings, :contributions_count, :integer
6
+ add_column :decidim_meetings_meetings, :attending_organizations, :text
7
+ add_column :decidim_meetings_meetings, :closed_at, :time, index: true
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ class AddLatitudeAndLongitudeToMeetings < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :decidim_meetings_meetings, :latitude, :float
4
+ add_column :decidim_meetings_meetings, :longitude, :float
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveShortDescriptionFromMeetings < ActiveRecord::Migration[5.0]
2
+ def change
3
+ remove_column :decidim_meetings_meetings, :short_description
4
+ end
5
+ end
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+ require "geocoder"
3
+
2
4
  module Decidim
3
5
  module Meetings
4
6
  # This is the engine that runs on the public interface of `decidim-meetings`.
@@ -10,13 +12,41 @@ module Decidim
10
12
  paths["db/migrate"] = nil
11
13
 
12
14
  routes do
13
- resources :meetings
15
+ resources :meetings do
16
+ resources :meeting_closes, only: [:edit, :update]
17
+ resources :attachments
18
+ end
14
19
  root to: "meetings#index"
15
20
  end
16
21
 
17
22
  def load_seed
18
23
  nil
19
24
  end
25
+
26
+ initializer "decidim_meetings.geocoder" do |_app|
27
+ if Decidim.geocoder.present?
28
+ Geocoder.configure(
29
+ # geocoding service (see below for supported options):
30
+ lookup: :here,
31
+
32
+ # IP address geocoding service (see below for supported options):
33
+ # :ip_lookup => :maxmind,
34
+
35
+ # to use an API key:
36
+ api_key: [Decidim.geocoder&.fetch(:here_app_id), Decidim.geocoder&.fetch(:here_app_code)]
37
+
38
+ # geocoding service request timeout, in seconds (default 3):
39
+ # :timeout => 5,
40
+
41
+ # set default units to kilometers:
42
+ # :units => :km,
43
+
44
+ # caching (see below for details):
45
+ # :cache => Redis.new,
46
+ # :cache_prefix => "..."
47
+ )
48
+ end
49
+ end
20
50
  end
21
51
  end
22
52
  end
@@ -11,6 +11,11 @@ Decidim.register_feature(:meetings) do |feature|
11
11
  raise StandardError, "Can't remove this feature" if Decidim::Meetings::Meeting.where(feature: instance).any?
12
12
  end
13
13
 
14
+ feature.register_resource do |resource|
15
+ resource.model_class_name = "Decidim::Meetings::Meeting"
16
+ resource.template = "decidim/meetings/meetings/linked_meetings"
17
+ end
18
+
14
19
  feature.seeds do
15
20
  Decidim::ParticipatoryProcess.all.each do |process|
16
21
  next unless process.steps.any?
@@ -30,17 +35,26 @@ Decidim.register_feature(:meetings) do |feature|
30
35
  description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
31
36
  Decidim::Faker::Localized.paragraph(3)
32
37
  end,
33
- short_description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
34
- Decidim::Faker::Localized.paragraph(3)
35
- end,
36
38
  location: Decidim::Faker::Localized.sentence,
37
39
  location_hints: Decidim::Faker::Localized.sentence,
38
40
  start_time: 3.weeks.from_now,
39
41
  end_time: 3.weeks.from_now + 4.hours,
40
- address: "#{Faker::Address.street_address} #{Faker::Address.zip} #{Faker::Address.city}"
42
+ address: "#{Faker::Address.street_address} #{Faker::Address.zip} #{Faker::Address.city}",
43
+ latitude: Faker::Address.latitude,
44
+ longitude: Faker::Address.longitude
45
+ )
46
+ Decidim::Attachment.create!(
47
+ title: Decidim::Faker::Localized.sentence(2),
48
+ description: Decidim::Faker::Localized.sentence(5),
49
+ file: File.new(File.join(File.dirname(__FILE__), "seeds", "city.jpeg")),
50
+ attached_to: meeting
51
+ )
52
+ Decidim::Attachment.create!(
53
+ title: Decidim::Faker::Localized.sentence(2),
54
+ description: Decidim::Faker::Localized.sentence(5),
55
+ file: File.new(File.join(File.dirname(__FILE__), "seeds", "Exampledocument.pdf")),
56
+ attached_to: meeting
41
57
  )
42
-
43
- Decidim::Comments::Seed.comments_for(meeting)
44
58
  end
45
59
  end
46
60
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "searchlight"
3
3
  require "kaminari"
4
+ require "jquery-tmpl-rails"
4
5
 
5
6
  module Decidim
6
7
  module Meetings
@@ -11,9 +12,17 @@ module Decidim
11
12
  isolate_namespace Decidim::Meetings
12
13
 
13
14
  routes do
14
- resources :meetings, only: [:index, :show]
15
+ resources :meetings, only: [:index, :show] do
16
+ member do
17
+ get :static_map
18
+ end
19
+ end
15
20
  root to: "meetings#index"
16
21
  end
22
+
23
+ initializer "decidim_meetings.assets" do |app|
24
+ app.config.assets.precompile += %w(decidim_meetings_manifest.js)
25
+ end
17
26
  end
18
27
  end
19
28
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ FactoryGirl.define do
3
+ factory :meeting, class: Decidim::Meetings::Meeting do
4
+ title { Decidim::Faker::Localized.sentence(3) }
5
+ description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(4) } }
6
+ location { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(4) } }
7
+ location_hints { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(4) } }
8
+ address { Faker::Lorem.sentence(3) }
9
+ latitude { Faker::Address.latitude }
10
+ longitude { Faker::Address.longitude }
11
+ start_time { 1.day.from_now }
12
+ end_time { start_time.advance(hours: 2) }
13
+ feature { build(:feature, manifest_name: "meetings") }
14
+
15
+ trait :closed do
16
+ closing_report { Decidim::Faker::Localized.sentence(3) }
17
+ attendees_count { rand(50) }
18
+ contributions_count { rand(50) }
19
+ attending_organizations { Array.new(3) { Faker::GameOfThrones.house }.join(", ") }
20
+ closed_at { Time.current }
21
+ end
22
+ end
23
+ end