decidim-meetings 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +23 -0
- data/Rakefile +2 -0
- data/app/commands/decidim/meetings/admin/create_meeting.rb +40 -0
- data/app/commands/decidim/meetings/admin/update_meeting.rb +44 -0
- data/app/controllers/decidim/meetings/admin/application_controller.rb +14 -0
- data/app/controllers/decidim/meetings/admin/meetings_controller.rb +69 -0
- data/app/controllers/decidim/meetings/application_controller.rb +13 -0
- data/app/controllers/decidim/meetings/meetings_controller.rb +24 -0
- data/app/forms/decidim/meetings/admin/meeting_form.rb +30 -0
- data/app/models/decidim/meetings/application_record.rb +9 -0
- data/app/models/decidim/meetings/meeting.rb +12 -0
- data/app/views/decidim/meetings/admin/meetings/_form.html.erb +32 -0
- data/app/views/decidim/meetings/admin/meetings/edit.html.erb +9 -0
- data/app/views/decidim/meetings/admin/meetings/index.html.erb +39 -0
- data/app/views/decidim/meetings/admin/meetings/new.html.erb +9 -0
- data/app/views/decidim/meetings/meetings/_address_details.html.erb +5 -0
- data/app/views/decidim/meetings/meetings/index.html.erb +30 -0
- data/app/views/decidim/meetings/meetings/show.html.erb +39 -0
- data/config/i18n-tasks.yml +4 -0
- data/config/locales/ca.yml +44 -0
- data/config/locales/en.yml +45 -0
- data/config/locales/es.yml +44 -0
- data/db/migrate/20161130121354_create_meetings.rb +18 -0
- data/lib/decidim/meetings.rb +11 -0
- data/lib/decidim/meetings/admin.rb +9 -0
- data/lib/decidim/meetings/admin_engine.rb +22 -0
- data/lib/decidim/meetings/feature.rb +42 -0
- data/lib/decidim/meetings/list_engine.rb +16 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d1998702c63adcee35cf6ba712d2f8ea986f05bd
|
4
|
+
data.tar.gz: bd7b21aa2f323b62e7b195c42eae8238d3e28e15
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 48441620d5786ab9855fecc90165b6cd87a0b8fbf1ddf7d0b90391f4fa8de14bbbad538bc015990e6c56c05d2149748887b23012cd55cdf2ca864d5552738626
|
7
|
+
data.tar.gz: 289779e9f898af0c999b83ff61ae254b481d721cd3682c3f243f3734fb64beada153d64480bd4b116ce8d696de04ca7879f4602aceea72801a5780cc5d8c5b0c
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Decidim::Meetings
|
2
|
+
The Meeetings module adds meeting to any participatory process. It adds a CRUD engine to the admin and public view scoped inside the participatory process.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
Meetings will be available as a Feature for a Participatory Process.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'decidim-meetings'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
## Contributing
|
20
|
+
See [Decidim](https://github.com/AjuntamentdeBarcelona/decidim).
|
21
|
+
|
22
|
+
## License
|
23
|
+
See [Decidim](https://github.com/AjuntamentdeBarcelona/decidim).
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
module Admin
|
5
|
+
# This command is executed when the user creates a Meeting from the admin
|
6
|
+
# panel.
|
7
|
+
class CreateMeeting < Rectify::Command
|
8
|
+
def initialize(form)
|
9
|
+
@form = form
|
10
|
+
end
|
11
|
+
|
12
|
+
# Creates the meeting if valid.
|
13
|
+
#
|
14
|
+
# Broadcasts :ok if successful, :invalid otherwise.
|
15
|
+
def call
|
16
|
+
return broadcast(:invalid) if @form.invalid?
|
17
|
+
|
18
|
+
create_meeting
|
19
|
+
broadcast(:ok)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def create_meeting
|
25
|
+
Meeting.create!(
|
26
|
+
title: @form.title,
|
27
|
+
short_description: @form.short_description,
|
28
|
+
description: @form.description,
|
29
|
+
end_time: @form.end_time,
|
30
|
+
start_time: @form.start_time,
|
31
|
+
address: @form.address,
|
32
|
+
location: @form.location,
|
33
|
+
location_hints: @form.location_hints,
|
34
|
+
feature: @form.current_feature
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
module Admin
|
5
|
+
# This command is executed when the user changes a Meeting from the admin
|
6
|
+
# panel.
|
7
|
+
class UpdateMeeting < Rectify::Command
|
8
|
+
# Initializes a UpdateMeeting Command.
|
9
|
+
#
|
10
|
+
# form - The form from which to get the data.
|
11
|
+
# meeting - The current instance of the page to be updated.
|
12
|
+
def initialize(form, meeting)
|
13
|
+
@form = form
|
14
|
+
@meeting = meeting
|
15
|
+
end
|
16
|
+
|
17
|
+
# Updates the meeting if valid.
|
18
|
+
#
|
19
|
+
# Broadcasts :ok if successful, :invalid otherwise.
|
20
|
+
def call
|
21
|
+
return broadcast(:invalid) if @form.invalid?
|
22
|
+
|
23
|
+
update_meeting
|
24
|
+
broadcast(:ok)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def update_meeting
|
30
|
+
@meeting.update_attributes!(
|
31
|
+
title: @form.title,
|
32
|
+
short_description: @form.short_description,
|
33
|
+
description: @form.description,
|
34
|
+
end_time: @form.end_time,
|
35
|
+
start_time: @form.start_time,
|
36
|
+
address: @form.address,
|
37
|
+
location: @form.location,
|
38
|
+
location_hints: @form.location_hints
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
module Admin
|
5
|
+
# This controller is the abstract class from which all other controllers of
|
6
|
+
# this engine inherit.
|
7
|
+
#
|
8
|
+
# Note that it inherits from `Decidim::Features::BaseController`, which
|
9
|
+
# override its layout and provide all kinds of useful methods.
|
10
|
+
class ApplicationController < Decidim::Admin::Features::BaseController
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
module Admin
|
5
|
+
# This controller allows an admin to manage meetings from a Participatory Process
|
6
|
+
class MeetingsController < Admin::ApplicationController
|
7
|
+
helper_method :meetings
|
8
|
+
|
9
|
+
def new
|
10
|
+
@form = form(MeetingForm).instance
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
@form = form(MeetingForm).from_params(params, current_feature: current_feature)
|
15
|
+
|
16
|
+
CreateMeeting.call(@form) do
|
17
|
+
on(:ok) do
|
18
|
+
flash[:notice] = I18n.t("meetings.create.success", scope: "decidim.meetings.admin")
|
19
|
+
redirect_to meetings_path
|
20
|
+
end
|
21
|
+
|
22
|
+
on(:invalid) do
|
23
|
+
flash.now[:alert] = I18n.t("meetings.create.invalid", scope: "decidim.meetings.admin")
|
24
|
+
render action: "new"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def edit
|
30
|
+
@form = form(MeetingForm).from_model(meeting)
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
@form = form(MeetingForm).from_params(params, current_feature: current_feature)
|
35
|
+
|
36
|
+
UpdateMeeting.call(@form, meeting) do
|
37
|
+
on(:ok) do
|
38
|
+
flash[:notice] = I18n.t("meetings.update.success", scope: "decidim.meetings.admin")
|
39
|
+
redirect_to meetings_path
|
40
|
+
end
|
41
|
+
|
42
|
+
on(:invalid) do
|
43
|
+
flash.now[:alert] = I18n.t("meetings.update.invalid", scope: "decidim.meetings.admin")
|
44
|
+
render action: "edit"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def destroy
|
50
|
+
meeting.destroy!
|
51
|
+
|
52
|
+
flash[:notice] = I18n.t("meetings.destroy.success", scope: "decidim.meetings.admin")
|
53
|
+
|
54
|
+
redirect_to meetings_path
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def meetings
|
60
|
+
@meetings ||= Meeting.where(feature: current_feature)
|
61
|
+
end
|
62
|
+
|
63
|
+
def meeting
|
64
|
+
@meeting ||= meetings.find(params[:id])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Meetings
|
5
|
+
# This controller is the abstract class from which all other controllers of
|
6
|
+
# this engine inherit.
|
7
|
+
#
|
8
|
+
# Note that it inherits from `Decidim::Components::BaseController`, which
|
9
|
+
# override its layout and provide all kinds of useful methods.
|
10
|
+
class ApplicationController < Decidim::Features::BaseController
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Meetings
|
5
|
+
# This controller is the abstract class from which all other controllers of
|
6
|
+
# this engine inherit.
|
7
|
+
#
|
8
|
+
# Note that it inherits from `Decidim::Features::BaseController`, which
|
9
|
+
# override its layout and provide all kinds of useful methods.
|
10
|
+
class MeetingsController < Decidim::Meetings::ApplicationController
|
11
|
+
helper_method :meetings, :meeting
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def meetings
|
16
|
+
@meetings ||= Meeting.where(decidim_feature_id: current_feature.id).order(start_time: :asc)
|
17
|
+
end
|
18
|
+
|
19
|
+
def meeting
|
20
|
+
@meeting ||= meetings.find(params[:id])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
module Admin
|
5
|
+
# This class holds a Form to create/update meetings from Decidim's admin panel.
|
6
|
+
class MeetingForm < Decidim::Form
|
7
|
+
include TranslatableAttributes
|
8
|
+
|
9
|
+
translatable_attribute :title, String
|
10
|
+
translatable_attribute :short_description, String
|
11
|
+
translatable_attribute :description, String
|
12
|
+
translatable_attribute :location, String
|
13
|
+
translatable_attribute :location_hints, String
|
14
|
+
attribute :address, String
|
15
|
+
attribute :start_time, DateTime
|
16
|
+
attribute :end_time, DateTime
|
17
|
+
|
18
|
+
validates :title, translatable_presence: true
|
19
|
+
validates :short_description, translatable_presence: true
|
20
|
+
validates :description, translatable_presence: true
|
21
|
+
validates :location, translatable_presence: true
|
22
|
+
validates :address, presence: true
|
23
|
+
validates :start_time, presence: true, date: { before: :end_time }
|
24
|
+
validates :end_time, presence: true, date: { after: :start_time }
|
25
|
+
|
26
|
+
validates :current_feature, presence: true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
# The data store for a Meeting in the Decidim::Meetings component. It stores a
|
5
|
+
# title, description and any other useful information to render a custom meeting.
|
6
|
+
class Meeting < Meetings::ApplicationRecord
|
7
|
+
belongs_to :feature, foreign_key: "decidim_feature_id", class_name: Decidim::Feature
|
8
|
+
|
9
|
+
validates :title, presence: true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<div class="field" >
|
2
|
+
<%= form.translated :text_field, :title, autofocus: true %>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<div class="field" >
|
6
|
+
<%= form.translated :editor, :short_description %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="field" >
|
10
|
+
<%= form.translated :editor, :description %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="field" >
|
14
|
+
<%= form.translated :editor, :location %>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<div class="field" >
|
18
|
+
<%= form.translated :editor, :location_hints %>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="field" >
|
22
|
+
<%= form.text_field :address %>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div class="field" >
|
26
|
+
<%= form.datetime_field :start_time %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="field" >
|
30
|
+
<%= form.datetime_field :end_time %>
|
31
|
+
</div>
|
32
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<h2><%= t(".title") %></h2>
|
2
|
+
|
3
|
+
<div class="actions title">
|
4
|
+
<%= link_to t("actions.new", scope: "decidim.meetings", name: t("models.meeting.name", scope: "decidim.meetings.admin")), new_meeting_path, class: 'new' if can? :manage, current_feature %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<table class="stack">
|
8
|
+
<thead>
|
9
|
+
<tr>
|
10
|
+
<th><%= t("models.meeting.fields.title", scope: "decidim.meetings") %></th>
|
11
|
+
<th><%= t("models.meeting.fields.start_time", scope: "decidim.meetings") %></th>
|
12
|
+
<th><%= t("models.meeting.fields.end_time", scope: "decidim.meetings") %></th>
|
13
|
+
<th class="actions"><%= t("actions.title", scope: "decidim.meetings") %></th>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody>
|
17
|
+
<% meetings.each do |meeting| %>
|
18
|
+
<tr data-id="<%= meeting.id %>">
|
19
|
+
<td>
|
20
|
+
<%= link_to translated_attribute(meeting.title), decidim_meetings.meeting_path(id: meeting, feature_id: current_feature, participatory_process_id: current_participatory_process), target: :blank %><br />
|
21
|
+
</td>
|
22
|
+
<td>
|
23
|
+
<% if meeting.start_time %>
|
24
|
+
<%= l meeting.start_time, format: :long %>
|
25
|
+
<% end%>
|
26
|
+
</td>
|
27
|
+
<td>
|
28
|
+
<% if meeting.end_time %>
|
29
|
+
<%= l meeting.end_time, format: :long %>
|
30
|
+
<% end%>
|
31
|
+
</td>
|
32
|
+
<td class="actions">
|
33
|
+
<%= link_to t("actions.edit", scope: "decidim.meetings"), edit_meeting_path(meeting) if can? :update, current_feature %>
|
34
|
+
<%= 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
|
+
</td>
|
36
|
+
</tr>
|
37
|
+
<% end %>
|
38
|
+
</tbody>
|
39
|
+
</table>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<% content_for(:title, t(".title")) %>
|
2
|
+
|
3
|
+
<div class="row small-up-1 medium-up-2 large-up-3 card-grid">
|
4
|
+
<% meetings.each do |meeting| %>
|
5
|
+
<div class="column">
|
6
|
+
<article class="card card--meeting">
|
7
|
+
<div class="card__content">
|
8
|
+
<%= link_to meeting, class: "card__link" do %>
|
9
|
+
<h5 class="card__title"><%= translated_attribute meeting.title %></h5>
|
10
|
+
<% end %>
|
11
|
+
<div class="card__datetime">
|
12
|
+
<div class="card__datetime__date">
|
13
|
+
<%= l meeting.start_time, format: "%d" %> <span class="card__datetime__month"><%= l meeting.start_time, format: "%B" %></span>
|
14
|
+
</div>
|
15
|
+
<div class="card__datetime__time">
|
16
|
+
<%= meeting.start_time.strftime("%H:%M") %> - <%= meeting.end_time.strftime("%H:%M") %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<%== translated_attribute meeting.description %>
|
20
|
+
<div class="address card__extra">
|
21
|
+
<div class="address__icon">
|
22
|
+
<%= icon "meetings", removeIconClass: true, width: 40, height: 70 %>
|
23
|
+
</div>
|
24
|
+
<%= render partial: 'address_details', locals: { meeting: meeting } %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</article>
|
28
|
+
</div>
|
29
|
+
<% end %>
|
30
|
+
</div>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<% content_for(:title, translated_attribute(meeting.title)) %>
|
2
|
+
|
3
|
+
<div class="row column view-header">
|
4
|
+
<h2 class="heading2"><%= translated_attribute meeting.title %></h2>
|
5
|
+
</div>
|
6
|
+
<div class="row">
|
7
|
+
<div class="columns section view-side mediumlarge-4 mediumlarge-push-8
|
8
|
+
large-3 large-push-9">
|
9
|
+
<div class="card extra">
|
10
|
+
<div class="card__content">
|
11
|
+
<div class="extra__date">
|
12
|
+
<%= l meeting.start_time, format: "%d" %> <span class="extra__month"><%= l meeting.start_time, format: "%B" %></span>
|
13
|
+
</div>
|
14
|
+
<div class="extra__time">
|
15
|
+
<%= meeting.start_time.strftime("%H:%M") %> - <%= meeting.end_time.strftime("%H:%M") %>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
<div class="columns mediumlarge-8 mediumlarge-pull-4">
|
21
|
+
<div class="section">
|
22
|
+
<%== translated_attribute meeting.short_description %>
|
23
|
+
<div class="card card--secondary">
|
24
|
+
<div class="card__content address">
|
25
|
+
<div class="address__info">
|
26
|
+
<div class="address__icon">
|
27
|
+
<%= icon "meetings", width: 40, height: 70 %>
|
28
|
+
</div>
|
29
|
+
<%= render partial: 'address_details', locals: { meeting: meeting } %>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<div class="section">
|
35
|
+
<h3 class="section-heading"><%= t(".meeting_description") %></h3>
|
36
|
+
<%== translated_attribute meeting.description %>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
ca:
|
2
|
+
decidim:
|
3
|
+
features:
|
4
|
+
meetings:
|
5
|
+
name: Llistat de trobades
|
6
|
+
meetings:
|
7
|
+
actions:
|
8
|
+
confirm_destroy: Esteu segur de que voleu suprimir aquesta trobada?
|
9
|
+
destroy: Esborra
|
10
|
+
edit: Edita
|
11
|
+
new: Nou/va %{name}
|
12
|
+
title: Accions
|
13
|
+
admin:
|
14
|
+
meetings:
|
15
|
+
create:
|
16
|
+
invalid: Hi ha hagut un problema en crear aquesta trobada
|
17
|
+
success: Reunió creada amb èxit
|
18
|
+
destroy:
|
19
|
+
success: La trobada s'ha eliminat correctament
|
20
|
+
edit:
|
21
|
+
title: Edita trobada
|
22
|
+
update: Actualitzar trobada
|
23
|
+
index:
|
24
|
+
title: Llistat de trobades
|
25
|
+
new:
|
26
|
+
create: Crear trobada
|
27
|
+
title: Nova trobada
|
28
|
+
update:
|
29
|
+
invalid: Hi ha hagut un problema en actualitzar aquesta trobada
|
30
|
+
success: Reunió actualitzada correctament
|
31
|
+
models:
|
32
|
+
meeting:
|
33
|
+
name: Trobada
|
34
|
+
meetings:
|
35
|
+
index:
|
36
|
+
title: Llistat de trobades
|
37
|
+
show:
|
38
|
+
meeting_description: Descripció de reunions
|
39
|
+
models:
|
40
|
+
meeting:
|
41
|
+
fields:
|
42
|
+
end_time: Data de finalització
|
43
|
+
start_time: Data d'inici
|
44
|
+
title: Títol
|
@@ -0,0 +1,45 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
decidim:
|
4
|
+
features:
|
5
|
+
meetings:
|
6
|
+
name: Meetings
|
7
|
+
meetings:
|
8
|
+
actions:
|
9
|
+
confirm_destroy: Are you sure you want to delete this meeting?
|
10
|
+
destroy: Delete
|
11
|
+
edit: Edit
|
12
|
+
new: New %{name}
|
13
|
+
title: Actions
|
14
|
+
admin:
|
15
|
+
meetings:
|
16
|
+
create:
|
17
|
+
invalid: There's been a problem creating this meeting
|
18
|
+
success: Meeting successfully created
|
19
|
+
destroy:
|
20
|
+
success: Meeting successfully deleted
|
21
|
+
edit:
|
22
|
+
title: Edit meeting
|
23
|
+
update: Update meeting
|
24
|
+
index:
|
25
|
+
title: Meetings
|
26
|
+
new:
|
27
|
+
create: Create meeting
|
28
|
+
title: New meeting
|
29
|
+
update:
|
30
|
+
invalid: There's been a problem updating this meeting
|
31
|
+
success: Meeting successfully updated
|
32
|
+
models:
|
33
|
+
meeting:
|
34
|
+
name: Meeting
|
35
|
+
meetings:
|
36
|
+
index:
|
37
|
+
title: Meetings
|
38
|
+
show:
|
39
|
+
meeting_description: Meeting description
|
40
|
+
models:
|
41
|
+
meeting:
|
42
|
+
fields:
|
43
|
+
end_time: End date
|
44
|
+
start_time: Start date
|
45
|
+
title: Title
|
@@ -0,0 +1,44 @@
|
|
1
|
+
es:
|
2
|
+
decidim:
|
3
|
+
features:
|
4
|
+
meetings:
|
5
|
+
name: Lista de encuentros
|
6
|
+
meetings:
|
7
|
+
actions:
|
8
|
+
confirm_destroy: '¿Está seguro de que quiere eliminar este encuentro?'
|
9
|
+
destroy: Borrar
|
10
|
+
edit: Editar
|
11
|
+
new: Nuevo/a %{name}
|
12
|
+
title: Acciones
|
13
|
+
admin:
|
14
|
+
meetings:
|
15
|
+
create:
|
16
|
+
invalid: Ha habido un problema al crear este encuentro
|
17
|
+
success: Reunión creada con éxito
|
18
|
+
destroy:
|
19
|
+
success: El encuentro se ha eliminado correctamente
|
20
|
+
edit:
|
21
|
+
title: Editar encuentro
|
22
|
+
update: Actualizar encuentro
|
23
|
+
index:
|
24
|
+
title: Lista de encuentros
|
25
|
+
new:
|
26
|
+
create: Crear encuentro
|
27
|
+
title: Nuevo encuentro
|
28
|
+
update:
|
29
|
+
invalid: Ha habido un problema al actualizar este encuentro
|
30
|
+
success: Encuentro actualizado correctamente
|
31
|
+
models:
|
32
|
+
meeting:
|
33
|
+
name: Encuentro
|
34
|
+
meetings:
|
35
|
+
index:
|
36
|
+
title: Lista de encuentros
|
37
|
+
show:
|
38
|
+
meeting_description: Descripción del encuentro
|
39
|
+
models:
|
40
|
+
meeting:
|
41
|
+
fields:
|
42
|
+
end_time: Fecha de finalización
|
43
|
+
start_time: Fecha de inicio
|
44
|
+
title: Título
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateMeetings < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :decidim_meetings_meetings do |t|
|
4
|
+
t.jsonb :title
|
5
|
+
t.jsonb :description
|
6
|
+
t.jsonb :short_description
|
7
|
+
t.datetime :start_time
|
8
|
+
t.datetime :end_time
|
9
|
+
t.text :address
|
10
|
+
t.jsonb :location
|
11
|
+
t.jsonb :location_hints
|
12
|
+
t.references :decidim_feature, index: true
|
13
|
+
t.references :decidim_author, index: true
|
14
|
+
|
15
|
+
t.timestamps
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "decidim/meetings/admin"
|
3
|
+
require "decidim/meetings/list_engine"
|
4
|
+
require "decidim/meetings/admin_engine"
|
5
|
+
require "decidim/meetings/feature"
|
6
|
+
|
7
|
+
module Decidim
|
8
|
+
# Base module for this engine.
|
9
|
+
module Meetings
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
# This is the engine that runs on the public interface of `decidim-meetings`.
|
5
|
+
# It mostly handles rendering the created meeting associated to a participatory
|
6
|
+
# process.
|
7
|
+
class AdminEngine < ::Rails::Engine
|
8
|
+
isolate_namespace Decidim::Meetings::Admin
|
9
|
+
|
10
|
+
paths["db/migrate"] = nil
|
11
|
+
|
12
|
+
routes do
|
13
|
+
resources :meetings
|
14
|
+
root to: "meetings#index"
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_seed
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency "decidim/features/namer"
|
4
|
+
|
5
|
+
Decidim.register_feature(:meetings) do |feature|
|
6
|
+
feature.engine = Decidim::Meetings::ListEngine
|
7
|
+
feature.admin_engine = Decidim::Meetings::AdminEngine
|
8
|
+
|
9
|
+
feature.on(:destroy) do |instance|
|
10
|
+
raise StandardError, "Can't remove this feature" if Decidim::Meetings::Meeting.where(feature: instance).any?
|
11
|
+
end
|
12
|
+
|
13
|
+
feature.seeds do
|
14
|
+
Decidim::ParticipatoryProcess.all.each do |process|
|
15
|
+
next unless process.steps.any?
|
16
|
+
|
17
|
+
feature = Decidim::Feature.create!(
|
18
|
+
name: Decidim::Features::Namer.new(process.organization.available_locales, :meetings).i18n_name,
|
19
|
+
manifest_name: :meetings,
|
20
|
+
participatory_process: process
|
21
|
+
)
|
22
|
+
|
23
|
+
3.times do
|
24
|
+
Decidim::Meetings::Meeting.create!(
|
25
|
+
feature: feature,
|
26
|
+
title: Decidim::Faker::Localized.sentence(2),
|
27
|
+
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
28
|
+
Decidim::Faker::Localized.paragraph(3)
|
29
|
+
end,
|
30
|
+
short_description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
31
|
+
Decidim::Faker::Localized.paragraph(3)
|
32
|
+
end,
|
33
|
+
location: Decidim::Faker::Localized.sentence,
|
34
|
+
location_hints: Decidim::Faker::Localized.sentence,
|
35
|
+
start_time: 3.weeks.from_now,
|
36
|
+
end_time: 3.weeks.from_now + 4.hours,
|
37
|
+
address: "#{Faker::Address.street_address} #{Faker::Address.zip} #{Faker::Address.city}"
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
module Meetings
|
4
|
+
# This is the engine that runs on the public interface of `decidim-meetings`.
|
5
|
+
# It mostly handles rendering the created meeting associated to a participatory
|
6
|
+
# process.
|
7
|
+
class ListEngine < ::Rails::Engine
|
8
|
+
isolate_namespace Decidim::Meetings
|
9
|
+
|
10
|
+
routes do
|
11
|
+
resources :meetings, only: [:index, :show]
|
12
|
+
root to: "meetings#index"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: decidim-meetings
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Josep Jaume Rey Peroy
|
8
|
+
- Marc Riera Casals
|
9
|
+
- Oriol Gual Oliva
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: decidim-core
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - '='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 0.0.1
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: rectify
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0.8'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0.8'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: date_validator
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.9'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0.9'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: decidim-dev
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.0.1
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - '='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.0.1
|
71
|
+
description: ''
|
72
|
+
email:
|
73
|
+
- josepjaume@gmail.com
|
74
|
+
- mrc2407@gmail.com
|
75
|
+
- oriolgual@gmail.com
|
76
|
+
executables: []
|
77
|
+
extensions: []
|
78
|
+
extra_rdoc_files: []
|
79
|
+
files:
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- app/commands/decidim/meetings/admin/create_meeting.rb
|
83
|
+
- app/commands/decidim/meetings/admin/update_meeting.rb
|
84
|
+
- app/controllers/decidim/meetings/admin/application_controller.rb
|
85
|
+
- app/controllers/decidim/meetings/admin/meetings_controller.rb
|
86
|
+
- app/controllers/decidim/meetings/application_controller.rb
|
87
|
+
- app/controllers/decidim/meetings/meetings_controller.rb
|
88
|
+
- app/forms/decidim/meetings/admin/meeting_form.rb
|
89
|
+
- app/models/decidim/meetings/application_record.rb
|
90
|
+
- app/models/decidim/meetings/meeting.rb
|
91
|
+
- app/views/decidim/meetings/admin/meetings/_form.html.erb
|
92
|
+
- app/views/decidim/meetings/admin/meetings/edit.html.erb
|
93
|
+
- app/views/decidim/meetings/admin/meetings/index.html.erb
|
94
|
+
- app/views/decidim/meetings/admin/meetings/new.html.erb
|
95
|
+
- app/views/decidim/meetings/meetings/_address_details.html.erb
|
96
|
+
- app/views/decidim/meetings/meetings/index.html.erb
|
97
|
+
- app/views/decidim/meetings/meetings/show.html.erb
|
98
|
+
- config/i18n-tasks.yml
|
99
|
+
- config/locales/ca.yml
|
100
|
+
- config/locales/en.yml
|
101
|
+
- config/locales/es.yml
|
102
|
+
- db/migrate/20161130121354_create_meetings.rb
|
103
|
+
- lib/decidim/meetings.rb
|
104
|
+
- lib/decidim/meetings/admin.rb
|
105
|
+
- lib/decidim/meetings/admin_engine.rb
|
106
|
+
- lib/decidim/meetings/feature.rb
|
107
|
+
- lib/decidim/meetings/list_engine.rb
|
108
|
+
homepage: https://github.com/AjuntamentdeBarcelona/decidim
|
109
|
+
licenses:
|
110
|
+
- AGPLv3
|
111
|
+
metadata: {}
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 2.3.1
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 2.5.2
|
129
|
+
signing_key:
|
130
|
+
specification_version: 4
|
131
|
+
summary: A meetings component for decidim's participatory processes.
|
132
|
+
test_files: []
|