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.
- checksums.yaml +4 -4
- data/app/assets/config/decidim_meetings_manifest.js +2 -0
- data/app/assets/javascripts/decidim/meetings/map.js.es6.erb +92 -0
- data/app/assets/stylesheets/decidim/meetings/map.css +1 -0
- data/app/commands/decidim/meetings/admin/close_meeting.rb +53 -0
- data/app/commands/decidim/meetings/admin/create_meeting.rb +15 -3
- data/app/commands/decidim/meetings/admin/update_meeting.rb +15 -3
- data/app/controllers/decidim/meetings/admin/application_controller.rb +9 -0
- data/app/controllers/decidim/meetings/admin/attachments_controller.rb +29 -0
- data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +38 -0
- data/app/controllers/decidim/meetings/admin/meetings_controller.rb +0 -12
- data/app/controllers/decidim/meetings/meetings_controller.rb +11 -9
- data/app/forms/decidim/meetings/admin/close_meeting_form.rb +31 -0
- data/app/forms/decidim/meetings/admin/meeting_form.rb +0 -2
- data/app/helpers/decidim/meetings/admin/application_helper.rb +12 -0
- data/app/helpers/decidim/meetings/application_helper.rb +1 -0
- data/app/helpers/decidim/meetings/map_helper.rb +46 -0
- data/app/models/decidim/meetings/meeting.rb +11 -15
- data/app/services/decidim/meetings/meeting_search.rb +0 -1
- data/app/services/decidim/meetings/static_map_generator.rb +50 -0
- data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +23 -0
- data/app/views/decidim/meetings/admin/meeting_closes/edit.html.erb +9 -0
- data/app/views/decidim/meetings/admin/meetings/_form.html.erb +2 -6
- data/app/views/decidim/meetings/admin/meetings/index.html.erb +14 -0
- data/app/views/decidim/meetings/meetings/_datetime.html.erb +8 -0
- data/app/views/decidim/meetings/meetings/_filters.html.erb +2 -2
- data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +18 -0
- data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +22 -0
- data/app/views/decidim/meetings/meetings/_meetings.html.erb +3 -10
- data/app/views/decidim/meetings/meetings/index.html.erb +42 -0
- data/app/views/decidim/meetings/meetings/index.js.erb +6 -0
- data/app/views/decidim/meetings/meetings/show.html.erb +33 -7
- data/config/i18n-tasks.yml +2 -0
- data/config/locales/ca.yml +37 -4
- data/config/locales/en.yml +34 -1
- data/config/locales/es.yml +36 -3
- data/db/migrate/20170110142105_close_a_meeting.rb +9 -0
- data/db/migrate/20170123151650_add_latitude_and_longitude_to_meetings.rb +6 -0
- data/db/migrate/20170129153716_remove_short_description_from_meetings.rb +5 -0
- data/lib/decidim/meetings/admin_engine.rb +31 -1
- data/lib/decidim/meetings/feature.rb +20 -6
- data/lib/decidim/meetings/list_engine.rb +10 -1
- data/lib/decidim/meetings/seeds/Exampledocument.pdf +0 -0
- data/lib/decidim/meetings/seeds/city.jpeg +0 -0
- data/lib/decidim/meetings/test/factories.rb +23 -0
- 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">×</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
|
-
|
10
|
-
|
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:
|
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
|
-
|
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
|
-
|
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:
|
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
|
-
|
36
|
-
<
|
37
|
-
|
38
|
-
|
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 %>
|
data/config/i18n-tasks.yml
CHANGED
data/config/locales/ca.yml
CHANGED
@@ -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:
|
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:
|
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
|
-
|
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
|
data/config/locales/en.yml
CHANGED
@@ -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
|
-
|
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
|
data/config/locales/es.yml
CHANGED
@@ -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:
|
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
|
-
|
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
|
@@ -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
|
Binary file
|
Binary file
|
@@ -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
|