decidim-meetings 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +23 -0
  3. data/Rakefile +2 -0
  4. data/app/commands/decidim/meetings/admin/create_meeting.rb +40 -0
  5. data/app/commands/decidim/meetings/admin/update_meeting.rb +44 -0
  6. data/app/controllers/decidim/meetings/admin/application_controller.rb +14 -0
  7. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +69 -0
  8. data/app/controllers/decidim/meetings/application_controller.rb +13 -0
  9. data/app/controllers/decidim/meetings/meetings_controller.rb +24 -0
  10. data/app/forms/decidim/meetings/admin/meeting_form.rb +30 -0
  11. data/app/models/decidim/meetings/application_record.rb +9 -0
  12. data/app/models/decidim/meetings/meeting.rb +12 -0
  13. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +32 -0
  14. data/app/views/decidim/meetings/admin/meetings/edit.html.erb +9 -0
  15. data/app/views/decidim/meetings/admin/meetings/index.html.erb +39 -0
  16. data/app/views/decidim/meetings/admin/meetings/new.html.erb +9 -0
  17. data/app/views/decidim/meetings/meetings/_address_details.html.erb +5 -0
  18. data/app/views/decidim/meetings/meetings/index.html.erb +30 -0
  19. data/app/views/decidim/meetings/meetings/show.html.erb +39 -0
  20. data/config/i18n-tasks.yml +4 -0
  21. data/config/locales/ca.yml +44 -0
  22. data/config/locales/en.yml +45 -0
  23. data/config/locales/es.yml +44 -0
  24. data/db/migrate/20161130121354_create_meetings.rb +18 -0
  25. data/lib/decidim/meetings.rb +11 -0
  26. data/lib/decidim/meetings/admin.rb +9 -0
  27. data/lib/decidim/meetings/admin_engine.rb +22 -0
  28. data/lib/decidim/meetings/feature.rb +42 -0
  29. data/lib/decidim/meetings/list_engine.rb +16 -0
  30. 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,2 @@
1
+ # frozen_string_literal: true
2
+ require "decidim/common_rake"
@@ -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,9 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Meetings
4
+ # Abstract class from which all models in this engine inherit.
5
+ class ApplicationRecord < ActiveRecord::Base
6
+ self.abstract_class = true
7
+ end
8
+ end
9
+ 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,9 @@
1
+ <h3><%= t ".title" %></h3>
2
+
3
+ <%= form_for(@form) do |f| %>
4
+ <%= render partial: 'form', object: f %>
5
+
6
+ <div class="actions">
7
+ <%= f.submit t(".update") %>
8
+ </div>
9
+ <% end %>
@@ -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,9 @@
1
+ <h3><%= t ".title" %></h3>
2
+
3
+ <%= form_for(@form) do |f| %>
4
+ <%= render partial: 'form', object: f %>
5
+
6
+ <div class="actions">
7
+ <%= f.submit t(".create") %>
8
+ </div>
9
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <div class="address__details">
2
+ <strong><%== translated_attribute meeting.location %></strong><br />
3
+ <span><%= meeting.address %></span><br />
4
+ <span><%== translated_attribute meeting.location_hints %></span>
5
+ </div>
@@ -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,4 @@
1
+ base_locale: en
2
+ locales: [en]
3
+ ignore_unused:
4
+ - "decidim.features.meetings.name"
@@ -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,9 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Meetings
4
+ # This module contains all the domain logic associated to Decidim's Meetings
5
+ # component admin panel.
6
+ module Admin
7
+ end
8
+ end
9
+ 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: []