decidim-members 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +27 -0
  3. data/Rakefile +3 -0
  4. data/app/assets/config/decidim_members_manifest.js +2 -0
  5. data/app/assets/javascripts/decidim/members/application.js +1 -0
  6. data/app/assets/stylesheets/decidim/members/application.css +15 -0
  7. data/app/commands/decidim/members/system/update_organization_module.rb +47 -0
  8. data/app/controllers/decidim/members/application_controller.rb +9 -0
  9. data/app/controllers/decidim/members/members_controller.rb +37 -0
  10. data/app/controllers/decidim/members/system/members_controller.rb +42 -0
  11. data/app/forms/decidim/members/system/organization_module_form.rb +17 -0
  12. data/app/helpers/decidim/members/application_helper.rb +8 -0
  13. data/app/models/decidim/members/application_record.rb +9 -0
  14. data/app/models/decidim/members/user.rb +16 -0
  15. data/app/permissions/decidim/members/admin/permissions.rb +20 -0
  16. data/app/permissions/decidim/members/permissions.rb +19 -0
  17. data/app/presenters/decidim/members/member_collection_presenter.rb +56 -0
  18. data/app/queries/decidim/members/filtered_members.rb +20 -0
  19. data/app/queries/decidim/members/organization_members.rb +16 -0
  20. data/app/views/decidim/members/members/_user.html.erb +12 -0
  21. data/app/views/decidim/members/members/index.html.erb +31 -0
  22. data/app/views/decidim/members/system/members/_form.html.erb +13 -0
  23. data/app/views/decidim/members/system/members/edit.html.erb +7 -0
  24. data/app/views/decidim/members/system/members/index.html.erb +38 -0
  25. data/app/views/layouts/decidim/_head_extra.html.erb +12 -0
  26. data/app/views/layouts/decidim/system/_login_items.html.erb +8 -0
  27. data/app/views/layouts/decidim/system/_sidebar.html.erb +11 -0
  28. data/config/locales/en.yml +42 -0
  29. data/config/locales/es.yml +42 -0
  30. data/config/locales/fr.yml +42 -0
  31. data/config/routes.rb +4 -0
  32. data/db/migrate/20171003112400_create_search_config.rb +8 -0
  33. data/db/migrate/20180406122449_add_checkboxes_to_enable_module_members_and_placeholder.rb +8 -0
  34. data/lib/decidim/members.rb +12 -0
  35. data/lib/decidim/members/admin.rb +8 -0
  36. data/lib/decidim/members/admin_engine.rb +14 -0
  37. data/lib/decidim/members/engine.rb +48 -0
  38. data/lib/decidim/members/system/engine.rb +37 -0
  39. data/lib/decidim/members/version.rb +7 -0
  40. metadata +173 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6cfe0e036f0abaa17fb244daa43edea6f5b02ec765784ab656ccbeaed95cee11
4
+ data.tar.gz: dd578fd54f49a7274ccfdff373dccf12b005acd824f289fb67389de076bd3dc1
5
+ SHA512:
6
+ metadata.gz: 27245bc10fe3e4a23ceb045b2489454d990702e1e1ef3df591cdb864ee4e92ef7feec2e99a9504f7bf6647b31d7e0a60c3cf19f4f0856ea4dcd7fa644e8ddec8
7
+ data.tar.gz: 273c88cd99351d0c55510b56c11b5c2a9cc7ce7a8706257cd940935d37836326fb6803d9b39909e89bcee67effd8189e5b7532914a24f028047ebd1177b1cb45
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # Decidim::Members
2
+
3
+ The Members list and search plugin for Decidim adds an index page to search
4
+ the members registered on the platform.
5
+
6
+ ## Usage
7
+
8
+ Adding this plugin to your Decidim based Rails app will add a new main menu
9
+ entry _Members_ which shows a searchable list of all members.
10
+
11
+ ## Installation
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'decidim-members'
16
+ ```
17
+
18
+ And then execute:
19
+ ```bash
20
+ $ bundle
21
+ ```
22
+ ## Contributing
23
+
24
+ Fork it and create a pull request.
25
+
26
+ ## License
27
+ Same as Decidim, AGPL v3.
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'decidim/dev/common_rake'
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/decidim/members .js
2
+ //= link_directory ../stylesheets/decidim/members .css
@@ -0,0 +1 @@
1
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ module System
6
+ class UpdateOrganizationModule < Rectify::Command
7
+ def initialize(id, form)
8
+ @organization_id = id
9
+ @form = form
10
+ end
11
+
12
+ # Executes the command. Broadcasts these events:
13
+ #
14
+ # - :ok when everything is valid.
15
+ # - :invalid if the form wasn't valid and we couldn't proceed.
16
+ #
17
+ # Returns nothing.
18
+ def call
19
+ return broadcast(:invalid) if form.invalid?
20
+
21
+ transaction do
22
+ save_organization
23
+ end
24
+
25
+ broadcast(:ok)
26
+ rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
27
+ broadcast(:invalid)
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :form, :organization_id
33
+
34
+ def organization
35
+ @organization ||= Organization.find(organization_id)
36
+ end
37
+
38
+ def save_organization
39
+ organization.enable_module_members = form.enable_module_members
40
+ organization.enable_placeholder_members = form.enable_placeholder_members
41
+
42
+ organization.save!
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class ApplicationController < ActionController::Base
6
+ # protect_from_forgery with: :exception
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class MembersController < Decidim::ApplicationController
6
+ # protect_from_forgery with: :exception
7
+ include NeedsPermission
8
+
9
+ def index
10
+ if current_user.present? && current_organization.enable_module_members?
11
+ enforce_permission_to :read, Decidim::Members::User
12
+
13
+ @members = MemberCollectionPresenter.new(
14
+ organization: current_organization,
15
+ page: params[:page].to_i,
16
+ query: params[:q]
17
+ ).attach_controller self
18
+ else
19
+ raise ActionController::RoutingError, 'Not Found'
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def permission_class_chain
26
+ [
27
+ Decidim::Members::Permissions,
28
+ Decidim::Permissions
29
+ ]
30
+ end
31
+
32
+ def permission_scope
33
+ :public
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ module System
6
+ # Controller that allows managing the appearance of the organization.
7
+ class MembersController < Decidim::System::ApplicationController
8
+ helper_method :organization
9
+
10
+ def index
11
+ @organizations = Decidim::Organization.all
12
+ end
13
+
14
+ def edit
15
+ @form = form(OrganizationModuleForm).from_model(organization)
16
+ end
17
+
18
+ def update
19
+ @form = form(OrganizationModuleForm).from_params(params)
20
+
21
+ UpdateOrganizationModule.call(organization.id, @form) do
22
+ on(:ok) do
23
+ flash[:notice] = I18n.t('members.update.success', scope: 'decidim.members.system')
24
+ redirect_to organization_members_path
25
+ end
26
+
27
+ on(:invalid) do
28
+ flash.now[:alert] = I18n.t('members.update.error', scope: 'decidim.members.system')
29
+ render :edit
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def organization
37
+ @organization ||= Decidim::Organization.find(params[:id])
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ module System
6
+ # A form object used to update the current organization appearance
7
+ # from the admin dashboard.
8
+ #
9
+ class OrganizationModuleForm < Form
10
+ mimic :organization
11
+
12
+ attribute :enable_module_members, Boolean
13
+ attribute :enable_placeholder_members, Boolean
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ module ApplicationHelper
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class ApplicationRecord < ActiveRecord::Base
6
+ self.abstract_class = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class User < Decidim::User
6
+ include PgSearch
7
+
8
+ pg_search_scope :search_by_name_like, against: %i[name nickname],
9
+ using: { trigram: { threshold: 0.1 } }
10
+
11
+ def self.public_spaces
12
+ not_deleted.no_active_invitation
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ module Admin
6
+ class Permissions < Decidim::DefaultPermissions
7
+ def permissions
8
+ return permission_action unless user
9
+
10
+ if permission_action.scope == :admin
11
+ disallow!
12
+ return permission_action
13
+ end
14
+
15
+ return permission_action unless user
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class Permissions < Decidim::DefaultPermissions
6
+ def permissions
7
+ return permission_action unless user
8
+ return Decidim::Members::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
9
+
10
+ if permission_action.scope == :public
11
+ allow!
12
+ return permission_action
13
+ end
14
+
15
+ return permission_action unless user
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class MemberCollectionPresenter < Rectify::Presenter
6
+ attribute :organization, Decidim::Organization
7
+ attribute :page, Integer
8
+ attribute :query, String
9
+
10
+ def count
11
+ unsorted_org_members.count
12
+ end
13
+
14
+ def render_pagination
15
+ paginate collection, theme: 'decidim'
16
+ end
17
+
18
+ def render_current_page
19
+ render collection: decorated_members, partial: 'user'
20
+ end
21
+
22
+ private
23
+
24
+ def collection
25
+ @collection ||= org_members.page(page).per(12)
26
+ end
27
+
28
+ def decorated_members
29
+ collection.map do |m|
30
+ ::Decidim::UserPresenter.new(m.becomes(Decidim::User))
31
+ end
32
+ end
33
+
34
+ def unsorted_org_members
35
+ @org_members ||= begin
36
+ scope = OrganizationMembers.new(organization).query
37
+ scope = FilteredMembers.for(query, scope) if query.present?
38
+ scope
39
+ end
40
+ end
41
+
42
+ def org_members
43
+ if query.present?
44
+ session[:members_ordering] = nil
45
+ unsorted_org_members.order(name: :asc)
46
+ else
47
+ unsorted_org_members.reorder Hash[[session_ordering]]
48
+ end
49
+ end
50
+
51
+ def session_ordering
52
+ session[:members_ordering] ||= [%i[id name email], %i[asc desc]].map(&:sample)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class FilteredMembers < Rectify::Query
6
+ def self.for(query_string, scope)
7
+ new(query_string, scope).query
8
+ end
9
+
10
+ def initialize(query_string, scope)
11
+ @query_string = query_string
12
+ @scope = scope
13
+ end
14
+
15
+ def query
16
+ @scope.where("name LIKE ?", "%#{@query_string}%")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ class OrganizationMembers < Rectify::Query
6
+ def initialize(organization)
7
+ @organization = organization
8
+ end
9
+
10
+ def query
11
+ user_ids = Decidim::Verifications::Authorizations.new(organization: @organization, granted: true).pluck(:decidim_user_id).uniq
12
+ Decidim::User.where(id: user_ids).not_deleted.no_active_invitation.order(name: :asc)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ <div class="column">
2
+ <article class="card card--process">
3
+ <%= link_to user.profile_path, class: "card__link" do %>
4
+ <div class="card__image-top" style="background-image:url(<%= user.avatar.url %>)"></div>
5
+ <% end %>
6
+ <div class="card__content">
7
+ <%= link_to user.profile_path, class: "card__link" do %>
8
+ <h4 class="card__title"><%= user.name %></h4>
9
+ <% end %>
10
+ </div>
11
+ </article>
12
+ </div>
@@ -0,0 +1,31 @@
1
+ <% provide :meta_title, t("members.index.title", scope: "decidim") %>
2
+
3
+ <main class="wrapper">
4
+ <section id="members-grid" class="section row collapse">
5
+ <div class="row collapse order-by">
6
+ <% if @members.query.present? %>
7
+ <h2 class="order-by__text section-heading"><%= t "members.index.members_found", scope: "decidim", count: @members.count %></h2>
8
+ <span style="margin-left: 1em;">(<%= link_to t("members.index.show_all", scope: "decidim"), decidim_members.members_path %>)</span>
9
+ <% else %>
10
+ <h2 class="order-by__text section-heading"><%= t "members.index.members", scope: "decidim", count: @members.count %></h2>
11
+ <% end %>
12
+ </div>
13
+
14
+ <div class="row" style="margin-bottom: 3em;">
15
+ <%= form_tag({}, id: 'member-search', method: :get) do %>
16
+ <div class="input-group" style='width: 50%; margin: auto;'>
17
+ <%= text_field_tag :q, @members.query, placeholder: t('members.index.search', scope: 'decidim'), class: 'input-group-field' %>
18
+ <div class="input-group-button">
19
+ <button type="submit" class="button button--muted">
20
+ <%= icon "magnifying-glass", aria_label: t('members.index.search', scope: 'decidim') %>
21
+ </button>
22
+ </div>
23
+ </div>
24
+ <% end %>
25
+ </div>
26
+ <div class="row small-up-1 medium-up-4 large-up-4 card-grid">
27
+ <%= @members.render_current_page %>
28
+ </div>
29
+ </section>
30
+ <%= @members.render_pagination %>
31
+ </main>
@@ -0,0 +1,13 @@
1
+ <div class="card">
2
+ <div class="card-divider">
3
+ <h2 class="card-title"><%= t ".module_members_organization" %></h2>
4
+ </div>
5
+ <div class="card-section">
6
+ <div class="row column">
7
+ <%= form.check_box :enable_module_members %>
8
+ </div>
9
+ <div class="row column">
10
+ <%= form.check_box :enable_placeholder_members %>
11
+ </div>
12
+ </div>
13
+ </div>
@@ -0,0 +1,7 @@
1
+ <%#raise%>
2
+ <%= decidim_form_for(@form, html: { class: "form edit_organization_module" }, url: organization_member_path(@organization), method: :put) do |f| %>
3
+ <%= render partial: "form", object: f %>
4
+ <div class="button--double form-general-submit">
5
+ <%= f.submit t(".update") %>
6
+ </div>
7
+ <% end %>
@@ -0,0 +1,38 @@
1
+ <% provide :title do %>
2
+ <h2><%= t ".title" %></h2>
3
+ <% end %>
4
+
5
+ <table class="stack">
6
+ <thead>
7
+ <tr>
8
+ <th><%= t("models.organization.fields.name", scope: "decidim.system") %></th>
9
+ <th><%= t("models.organization.fields.created_at", scope: "decidim.system") %></th>
10
+ <th><%= t("models.organization.fields.enable_module_members", scope: "decidim.system") %></th>
11
+ <th><%= t("models.organization.fields.enable_placeholder_members", scope: "decidim.system") %></th>
12
+ <th class="actions"><%= t("actions.title", scope: "decidim.system") %></th>
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ <% @organizations.each do |organization| %>
17
+ <tr>
18
+ <td>
19
+ <%= link_to organization.name, decidim_system.organization_path(organization) %><br />
20
+ <%= organization.host %>
21
+ </td>
22
+ <td>
23
+ <%= l organization.created_at, format: :short %>
24
+ </td>
25
+ <td>
26
+ <%= organization.enable_module_members %>
27
+ </td>
28
+ <td>
29
+ <%= organization.enable_placeholder_members %>
30
+ </td>
31
+
32
+ <td class="actions">
33
+ <%= link_to t("actions.edit", scope: "decidim.system"), decidim_members_system.edit_organization_member_path(organization) %>
34
+ </td>
35
+ </tr>
36
+ <% end %>
37
+ </tbody>
38
+ </table>
@@ -0,0 +1,12 @@
1
+ <% if current_organization.enable_placeholder_members? %>
2
+ <%= javascript_tag do %>
3
+ $(document).ready(function(){
4
+ $('.register-form').find("#user_name").each(function(ev){
5
+ if(!$(this).val()) {
6
+ $(this).attr("placeholder", "<%= t('decidim.members.user_form.name').html_safe %>");
7
+ }
8
+ $(this).siblings(".help-text").html("<%= t('decidim.members.user_form.username_help').html_safe %>");
9
+ });
10
+ });
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <div class="session-box">
2
+ <div class="admin-email">
3
+ <%= current_admin.email %>
4
+ </div>
5
+ <div class="sign-out">
6
+ <%= link_to("Logout", decidim_system.destroy_admin_session_path, :method => :delete) %>
7
+ </div>
8
+ </div>
@@ -0,0 +1,11 @@
1
+ <div class="title">
2
+ <h1>
3
+ <%= link_to decidim_system.root_path do %>
4
+ <%= title %>
5
+ <% end %>
6
+ </h1>
7
+ </div>
8
+
9
+ <%= main_menu.render %>
10
+
11
+ <%= render partial: "layouts/decidim/system/login_items" %>
@@ -0,0 +1,42 @@
1
+ ---
2
+ en:
3
+ decidim:
4
+ members:
5
+ user_form:
6
+ name: Your name & Organization
7
+ username_help: Public name and Organization that appears on your posts.
8
+ index:
9
+ title: Members
10
+ members:
11
+ one: One member
12
+ other: "%{count} members"
13
+ members_found:
14
+ one: One member found
15
+ other: "%{count} members found"
16
+ search: Search
17
+ show_all: Show all
18
+ system:
19
+ members:
20
+ edit:
21
+ update: Update
22
+ form:
23
+ module_members_organization: Module Members Organization
24
+ index:
25
+ title: Members
26
+ update:
27
+ error: There was an error when updating this organization module.
28
+ success: Organization module members updated successfully.
29
+ menu:
30
+ members: Members
31
+ pages:
32
+ home:
33
+ statistics:
34
+ members_count: Members
35
+ system:
36
+ menu:
37
+ members: Members
38
+ models:
39
+ organization:
40
+ fields:
41
+ enable_module_members: Enable module members
42
+ enable_placeholder_members: Enable placeholder members
@@ -0,0 +1,42 @@
1
+ ---
2
+ es:
3
+ decidim:
4
+ members:
5
+ user_form:
6
+ name: Tu nombre y Organización
7
+ username_help: Nombre público y Organización que aparece en sus publicaciones.
8
+ index:
9
+ title: Miembros
10
+ members:
11
+ one: Un miembro
12
+ other: "%{count} miembros"
13
+ members_found:
14
+ one: Un miembro encontrado
15
+ other: "%{count} miembros encontrados"
16
+ search: Buscar
17
+ show_all: Mostrar todos
18
+ system:
19
+ members:
20
+ edit:
21
+ update: Actualizar
22
+ form:
23
+ module_members_organization: Módulo miembros organización
24
+ index:
25
+ title: Miembros
26
+ update:
27
+ error: Ha habido un error al actualizar este módulo.
28
+ success: Módulo miembros de la organización acutalizado correctamente.
29
+ menu:
30
+ members: Miembros
31
+ pages:
32
+ home:
33
+ statistics:
34
+ members_count: Miembros
35
+ system:
36
+ menu:
37
+ members: Miembros
38
+ models:
39
+ organization:
40
+ fields:
41
+ enable_module_members: Habilitar módulo miembros
42
+ enable_placeholder_members: Habilitat placeholder módulo miembros
@@ -0,0 +1,42 @@
1
+ ---
2
+ fr:
3
+ decidim:
4
+ members:
5
+ user_form:
6
+ name: Votre nom et Organisation
7
+ username_help: Nom public et Organisation qui apparaît sur vos publications.
8
+ index:
9
+ title: Membres
10
+ members:
11
+ one: Un membre
12
+ other: "%{count} membres"
13
+ members_found:
14
+ one: Un membre trouvé
15
+ other: "%{count} membres trouvés"
16
+ search: Rechercher
17
+ show_all: Montre tout
18
+ system:
19
+ members:
20
+ edit:
21
+ update: Mettre à jour
22
+ form:
23
+ module_members_organization: Module Membres Organisation
24
+ index:
25
+ title: Membres
26
+ update:
27
+ error: Une erreur s'est produite lors de la mise à jour de ce module d'organisation.
28
+ success: Membres du module d'organisation mis à jour avec succès.
29
+ menu:
30
+ members: Membres
31
+ pages:
32
+ home:
33
+ statistics:
34
+ members_count: Membres
35
+ system:
36
+ menu:
37
+ members: Membres
38
+ models:
39
+ organization:
40
+ fields:
41
+ enable_module_members: Activer les membres du module
42
+ enable_placeholder_members: Activer les membres réservés
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ Decidim::Members::System::Engine.routes.draw do
4
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateSearchConfig < ActiveRecord::Migration[5.1]
4
+ def change
5
+ enable_extension :unaccent
6
+ enable_extension :pg_trgm
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddCheckboxesToEnableModuleMembersAndPlaceholder < ActiveRecord::Migration[5.1]
4
+ def change
5
+ add_column :decidim_organizations, :enable_module_members, :boolean, default: false
6
+ add_column :decidim_organizations, :enable_placeholder_members, :boolean, default: false
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'decidim/members/admin'
4
+ require 'decidim/members/engine'
5
+ require 'decidim/members/system/engine'
6
+ require 'decidim/members/admin_engine'
7
+
8
+ module Decidim
9
+ module Members
10
+ # Your code goes here...
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ module Admin
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+ require 'decidim/core'
5
+
6
+ module Decidim
7
+ module Members
8
+ # Decidim's Members Rails Admin Engine.
9
+ # There is nothing to administer, it's 'only provided since Decidim
10
+ # requires it.
11
+ class AdminEngine < ::Rails::Engine
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+
5
+ require 'decidim/core'
6
+ require 'sanitize'
7
+ require 'pg_search'
8
+
9
+ module Decidim
10
+ module Members
11
+ # Decidim's Members Rails Engine.
12
+ class Engine < ::Rails::Engine
13
+ isolate_namespace Decidim::Members
14
+ engine_name 'decidim_members'
15
+
16
+ initializer 'decidim_members.mount_routes' do |_app|
17
+ Decidim::Core::Engine.routes do
18
+ mount Decidim::Members::Engine => '/members'
19
+ end
20
+ end
21
+
22
+ routes do
23
+ root to: 'members#index', as: :members
24
+ end
25
+
26
+ initializer 'decidim.stats' do
27
+ Decidim.stats.register :members_count, priority: StatsRegistry::HIGH_PRIORITY do |organization, _start_at, _end_at|
28
+ if organization.enable_module_members?
29
+ user_ids = Decidim::Verifications::Authorizations.new(organization: organization, granted: true).pluck(:decidim_user_id).uniq
30
+ Decidim::Members::User.where(id: user_ids).public_spaces.count
31
+ else
32
+ 0
33
+ end
34
+ end
35
+ end
36
+
37
+ initializer 'decidim_members.menu' do
38
+ Decidim.menu :menu do |menu|
39
+ menu.item I18n.t('menu.members', scope: 'decidim'),
40
+ decidim_members.members_path,
41
+ position: 2.5,
42
+ active: :inclusive,
43
+ if: current_user.present? && current_organization.enable_module_members?
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+ require 'active_support/all'
5
+ require 'decidim/core'
6
+ require 'decidim/system'
7
+
8
+ module Decidim
9
+ module Members
10
+ module System
11
+ # Decidim's core Rails Engine.
12
+ class Engine < ::Rails::Engine
13
+ isolate_namespace Decidim::Members::System
14
+ engine_name 'decidim_members_system'
15
+
16
+ initializer 'decidim_members_system.mount_routes' do |_app|
17
+ Decidim::Core::Engine.routes do
18
+ mount Decidim::Members::System::Engine => '/system'
19
+ end
20
+ end
21
+
22
+ routes do
23
+ resources :organization_members, only: %i[index edit update], controller: 'members'
24
+ end
25
+
26
+ initializer 'decidim_members_system.menu' do
27
+ Decidim.menu :system_menu do |menu|
28
+ menu.item I18n.t('menu.members', scope: 'decidim.system'),
29
+ decidim_members_system.organization_members_path,
30
+ position: 4,
31
+ active: :inclusive
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Members
5
+ VERSION = '0.1.13'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: decidim-members
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.13
5
+ platform: ruby
6
+ authors:
7
+ - Isaac Massot
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-02-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: decidim-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.15.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.15'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.15.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: pg_search
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 2.1.4
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 2.1.4
47
+ - !ruby/object:Gem::Dependency
48
+ name: rails
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5.2'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.2'
61
+ - !ruby/object:Gem::Dependency
62
+ name: sanitize
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.5'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '4.5'
75
+ - !ruby/object:Gem::Dependency
76
+ name: decidim-admin
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.15.0
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.15.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: decidim-dev
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.15.0
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.15.0
103
+ description: This gem is a member list and search plugin for decidim, you can active
104
+ the gem via system dashboard
105
+ email:
106
+ - isaac.mg@coditramuntana.com
107
+ executables: []
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - README.md
112
+ - Rakefile
113
+ - app/assets/config/decidim_members_manifest.js
114
+ - app/assets/javascripts/decidim/members/application.js
115
+ - app/assets/stylesheets/decidim/members/application.css
116
+ - app/commands/decidim/members/system/update_organization_module.rb
117
+ - app/controllers/decidim/members/application_controller.rb
118
+ - app/controllers/decidim/members/members_controller.rb
119
+ - app/controllers/decidim/members/system/members_controller.rb
120
+ - app/forms/decidim/members/system/organization_module_form.rb
121
+ - app/helpers/decidim/members/application_helper.rb
122
+ - app/models/decidim/members/application_record.rb
123
+ - app/models/decidim/members/user.rb
124
+ - app/permissions/decidim/members/admin/permissions.rb
125
+ - app/permissions/decidim/members/permissions.rb
126
+ - app/presenters/decidim/members/member_collection_presenter.rb
127
+ - app/queries/decidim/members/filtered_members.rb
128
+ - app/queries/decidim/members/organization_members.rb
129
+ - app/views/decidim/members/members/_user.html.erb
130
+ - app/views/decidim/members/members/index.html.erb
131
+ - app/views/decidim/members/system/members/_form.html.erb
132
+ - app/views/decidim/members/system/members/edit.html.erb
133
+ - app/views/decidim/members/system/members/index.html.erb
134
+ - app/views/layouts/decidim/_head_extra.html.erb
135
+ - app/views/layouts/decidim/system/_login_items.html.erb
136
+ - app/views/layouts/decidim/system/_sidebar.html.erb
137
+ - config/locales/en.yml
138
+ - config/locales/es.yml
139
+ - config/locales/fr.yml
140
+ - config/routes.rb
141
+ - db/migrate/20171003112400_create_search_config.rb
142
+ - db/migrate/20180406122449_add_checkboxes_to_enable_module_members_and_placeholder.rb
143
+ - lib/decidim/members.rb
144
+ - lib/decidim/members/admin.rb
145
+ - lib/decidim/members/admin_engine.rb
146
+ - lib/decidim/members/engine.rb
147
+ - lib/decidim/members/system/engine.rb
148
+ - lib/decidim/members/version.rb
149
+ homepage: https://www.coditramuntana.com/
150
+ licenses:
151
+ - AGPL-3.0
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.7.6
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: Member list and search plugin for decidim
173
+ test_files: []