decidim-feeds 1.0.0
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.
- checksums.yaml +7 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +39 -0
- data/Rakefile +9 -0
- data/app/cells/decidim/feeds/content_blocks/feeds_settings_form/show.erb +3 -0
- data/app/cells/decidim/feeds/content_blocks/feeds_settings_form_cell.rb +23 -0
- data/app/cells/decidim/feeds/feed_cell.rb +24 -0
- data/app/cells/decidim/feeds/feed_dropdown_metadata_cell.rb +19 -0
- data/app/cells/decidim/feeds/feed_g_cell.rb +33 -0
- data/app/cells/decidim/feeds/feed_metadata_g_cell.rb +25 -0
- data/app/cells/decidim/feeds/feed_s_cell.rb +13 -0
- data/app/commands/decidim/feeds/admin/create_feed.rb +90 -0
- data/app/commands/decidim/feeds/admin/update_feed.rb +85 -0
- data/app/commands/decidim/feeds/create_feed.rb +90 -0
- data/app/commands/decidim/feeds/update_feed.rb +73 -0
- data/app/constraints/decidim/feeds/current_component.rb +28 -0
- data/app/constraints/decidim/feeds/current_feed.rb +43 -0
- data/app/controllers/concerns/decidim/feeds/feed_breadcrumb.rb +36 -0
- data/app/controllers/decidim/feeds/admin/application_controller.rb +26 -0
- data/app/controllers/decidim/feeds/admin/components_controller.rb +14 -0
- data/app/controllers/decidim/feeds/admin/concerns/feed_admin.rb +51 -0
- data/app/controllers/decidim/feeds/admin/feeds_controller.rb +92 -0
- data/app/controllers/decidim/feeds/application_controller.rb +37 -0
- data/app/controllers/decidim/feeds/feeds_controller.rb +137 -0
- data/app/forms/decidim/feeds/admin/feed_form.rb +102 -0
- data/app/forms/decidim/feeds/feed_form.rb +70 -0
- data/app/helpers/decidim/feeds/admin/feeds_admin_menu_helper.rb +10 -0
- data/app/helpers/decidim/feeds/application_helper.rb +16 -0
- data/app/helpers/decidim/feeds/feeds_helper.rb +38 -0
- data/app/models/decidim/feeds/application_record.rb +10 -0
- data/app/models/decidim/feeds/feed.rb +113 -0
- data/app/packs/entrypoints/decidim_feeds.js +5 -0
- data/app/packs/entrypoints/decidim_feeds.scss +1 -0
- data/app/packs/images/decidim/feeds/decidim_feeds.svg +1 -0
- data/app/packs/images/decidim/feeds/icon.svg +1 -0
- data/app/packs/src/decidim/feeds/feeds.js +0 -0
- data/app/packs/stylesheets/decidim/feeds/_variables.scss +10 -0
- data/app/packs/stylesheets/decidim/feeds/feeds.scss +3 -0
- data/app/permissions/decidim/feeds/permissions.rb +53 -0
- data/app/presenters/decidim/feeds/admin_log/feed_presenter.rb +46 -0
- data/app/queries/decidim/feeds/admin/admin_users.rb +60 -0
- data/app/queries/decidim/feeds/organization_feeds.rb +16 -0
- data/app/views/decidim/feeds/admin/feeds/_form.html.erb +66 -0
- data/app/views/decidim/feeds/admin/feeds/edit.html.erb +20 -0
- data/app/views/decidim/feeds/admin/feeds/index.html.erb +65 -0
- data/app/views/decidim/feeds/admin/feeds/new.html.erb +20 -0
- data/app/views/decidim/feeds/feeds/_form.html.erb +18 -0
- data/app/views/decidim/feeds/feeds/edit.html.erb +10 -0
- data/app/views/decidim/feeds/feeds/index.html.erb +5 -0
- data/app/views/decidim/feeds/feeds/new.html.erb +20 -0
- data/app/views/decidim/feeds/feeds/show.html.erb +33 -0
- data/app/views/layouts/decidim/admin/_manage_feeds.html.erb +11 -0
- data/app/views/layouts/decidim/admin/feed.html.erb +17 -0
- data/app/views/layouts/decidim/admin/feeds.html.erb +17 -0
- data/app/views/layouts/decidim/feed.html.erb +18 -0
- data/config/assets.rb +9 -0
- data/config/i18n-tasks.yml +10 -0
- data/config/locales/bs.yml +75 -0
- data/config/locales/de.yml +77 -0
- data/config/locales/en.yml +75 -0
- data/config/locales/hr.yml +75 -0
- data/config/locales/it.yml +75 -0
- data/config/locales/sr.yml +75 -0
- data/config/locales/tr.yml +75 -0
- data/lib/decidim/api/feed_type.rb +30 -0
- data/lib/decidim/feeds/admin.rb +10 -0
- data/lib/decidim/feeds/admin_engine.rb +81 -0
- data/lib/decidim/feeds/api.rb +9 -0
- data/lib/decidim/feeds/content_blocks/content_blocks_homepage.rb +19 -0
- data/lib/decidim/feeds/engine.rb +83 -0
- data/lib/decidim/feeds/menu.rb +106 -0
- data/lib/decidim/feeds/participatory_space.rb +52 -0
- data/lib/decidim/feeds/seeds.rb +47 -0
- data/lib/decidim/feeds/test/factories.rb +17 -0
- data/lib/decidim/feeds/version.rb +9 -0
- data/lib/decidim/feeds.rb +13 -0
- metadata +142 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module Feeds
|
7
|
+
module Admin
|
8
|
+
module Concerns
|
9
|
+
# This concern is meant to be included in all controllers that are scoped
|
10
|
+
# into a feed's admin panel. It will override the layout so it shows
|
11
|
+
# the sidebar, preload the feed, etc.
|
12
|
+
module FeedAdmin
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
|
15
|
+
RegistersPermissions
|
16
|
+
.register_permissions(::Decidim::Feeds::Admin::Concerns::FeedAdmin,
|
17
|
+
Decidim::Feeds::Permissions,
|
18
|
+
Decidim::Admin::Permissions)
|
19
|
+
|
20
|
+
included do
|
21
|
+
include Decidim::Admin::ParticipatorySpaceAdminContext
|
22
|
+
helper_method :current_feed
|
23
|
+
add_breadcrumb_item_from_menu :admin_feed_menu
|
24
|
+
|
25
|
+
participatory_space_admin_layout
|
26
|
+
|
27
|
+
def current_feed
|
28
|
+
@current_feed ||= organization_feeds.find_by!(
|
29
|
+
slug: params[:feed_slug] || params[:slug]
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
alias_method :current_participatory_space, :current_feed
|
34
|
+
|
35
|
+
def organization_feeds
|
36
|
+
@organization_feeds ||= OrganizationFeeds.new(current_organization).query
|
37
|
+
end
|
38
|
+
|
39
|
+
def permissions_context
|
40
|
+
super.merge(current_participatory_space:)
|
41
|
+
end
|
42
|
+
|
43
|
+
def permission_class_chain
|
44
|
+
PermissionsRegistry.chain_for(FeedAdmin)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
module Admin
|
6
|
+
# Controller that allows managing feeds.
|
7
|
+
#
|
8
|
+
class FeedsController < Decidim::Feeds::Admin::ApplicationController
|
9
|
+
include Decidim::Admin::ParticipatorySpaceAdminBreadcrumb
|
10
|
+
helper_method :current_feed, :current_participatory_space
|
11
|
+
layout "decidim/admin/feeds"
|
12
|
+
|
13
|
+
def index
|
14
|
+
enforce_permission_to :read, :feed_list
|
15
|
+
@feeds = collection
|
16
|
+
end
|
17
|
+
|
18
|
+
def new
|
19
|
+
enforce_permission_to :create, :feed
|
20
|
+
@form = form(FeedForm).instance
|
21
|
+
end
|
22
|
+
|
23
|
+
def create
|
24
|
+
enforce_permission_to :create, :feed
|
25
|
+
|
26
|
+
params[:created_by] = current_user
|
27
|
+
@form = form(FeedForm).from_params(params)
|
28
|
+
|
29
|
+
CreateFeed.call(@form) do
|
30
|
+
on(:ok) do |feed|
|
31
|
+
flash[:notice] = I18n.t("feeds.create.success", scope: "decidim.admin")
|
32
|
+
redirect_to feeds_path
|
33
|
+
end
|
34
|
+
|
35
|
+
on(:invalid) do
|
36
|
+
flash.now[:alert] = I18n.t("feeds.create.error", scope: "decidim.admin")
|
37
|
+
render :new
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def edit
|
43
|
+
enforce_permission_to :update, :feed, feed: current_feed
|
44
|
+
@form = form(FeedForm).from_model(current_feed)
|
45
|
+
render layout: "decidim/admin/feed"
|
46
|
+
end
|
47
|
+
|
48
|
+
def update
|
49
|
+
enforce_permission_to :update, :feed, feed: current_feed
|
50
|
+
@form = form(FeedForm).from_params(
|
51
|
+
feed_params,
|
52
|
+
feed_id: current_feed.id
|
53
|
+
)
|
54
|
+
|
55
|
+
UpdateFeed.call(current_feed, @form) do
|
56
|
+
on(:ok) do |feed|
|
57
|
+
flash[:notice] = I18n.t("feeds.update.success", scope: "decidim.admin")
|
58
|
+
redirect_to edit_feed_path(feed)
|
59
|
+
end
|
60
|
+
|
61
|
+
on(:invalid) do
|
62
|
+
flash.now[:alert] = I18n.t("feeds.update.error", scope: "decidim.admin")
|
63
|
+
render :edit, layout: "decidim/admin/feed"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def copy
|
69
|
+
enforce_permission_to :create, :feed
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def collection
|
75
|
+
@collection ||= OrganizationFeeds.new(current_user.organization).query
|
76
|
+
end
|
77
|
+
|
78
|
+
def current_feed
|
79
|
+
@current_feed ||= collection.where(slug: params[:slug]).or(
|
80
|
+
collection.where(id: params[:slug])
|
81
|
+
).first
|
82
|
+
end
|
83
|
+
|
84
|
+
alias current_participatory_space current_feed
|
85
|
+
|
86
|
+
def feed_params
|
87
|
+
{ id: params[:slug] }.merge(params[:feed].to_unsafe_h)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
# The main admin application controller for feeds
|
6
|
+
class ApplicationController < Decidim::ApplicationController
|
7
|
+
helper Decidim::ApplicationHelper
|
8
|
+
helper Decidim::Feeds::FeedsHelper
|
9
|
+
include NeedsPermission
|
10
|
+
|
11
|
+
register_permissions(Decidim::Feeds::ApplicationController,
|
12
|
+
::Decidim::Feeds::Permissions,
|
13
|
+
::Decidim::Admin::Permissions,
|
14
|
+
::Decidim::Permissions)
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def user_has_no_permission_path
|
19
|
+
decidim.new_user_session_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def permissions_context
|
23
|
+
super.merge(
|
24
|
+
current_participatory_space: try(:current_participatory_space)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def permission_class_chain
|
29
|
+
::Decidim.permissions_registry.chain_for(::Decidim::Feeds::ApplicationController)
|
30
|
+
end
|
31
|
+
|
32
|
+
def permission_scope
|
33
|
+
:public
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
# A controller that holds the logic to show Feeds in a public layout.
|
6
|
+
class FeedsController < Decidim::Feeds::ApplicationController
|
7
|
+
include ParticipatorySpaceContext
|
8
|
+
include FeedBreadcrumb
|
9
|
+
include FormFactory
|
10
|
+
|
11
|
+
participatory_space_layout only: :show
|
12
|
+
|
13
|
+
include FilterResource
|
14
|
+
include Paginable
|
15
|
+
include HasParticipatorySpaceContentBlocks
|
16
|
+
|
17
|
+
# helper_method :collection, :stats
|
18
|
+
|
19
|
+
def index
|
20
|
+
enforce_permission_to :list, :feed
|
21
|
+
|
22
|
+
@feeds = published_feeds.query
|
23
|
+
end
|
24
|
+
|
25
|
+
def show
|
26
|
+
enforce_permission_to :read, :feed, feed: current_participatory_space
|
27
|
+
|
28
|
+
@posts_component = current_feed.components.find_by(manifest_name: "posts")
|
29
|
+
|
30
|
+
if @posts_component.nil?
|
31
|
+
flash[:alert] = I18n.t("feeds.show.posts_component_not_found", scope: "decidim.feeds")
|
32
|
+
redirect_to feeds_path
|
33
|
+
end
|
34
|
+
|
35
|
+
# redirect_to decidim_feed_posts_path(current_participatory_space, posts_component) if posts_component
|
36
|
+
end
|
37
|
+
|
38
|
+
def new
|
39
|
+
enforce_permission_to :create, :feed
|
40
|
+
|
41
|
+
@form = form(FeedForm).instance
|
42
|
+
end
|
43
|
+
|
44
|
+
def create
|
45
|
+
enforce_permission_to :create, :feed
|
46
|
+
|
47
|
+
@form = form(FeedForm).from_params(params)
|
48
|
+
|
49
|
+
CreateFeed.call(@form) do
|
50
|
+
on(:ok) do |feed|
|
51
|
+
flash[:notice] = I18n.t("feeds.create.success", scope: "decidim.feeds")
|
52
|
+
redirect_to feeds_path
|
53
|
+
end
|
54
|
+
|
55
|
+
on(:invalid) do
|
56
|
+
flash.now[:alert] = I18n.t("feeds.create.error", scope: "decidim.feeds")
|
57
|
+
render :new
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def edit
|
63
|
+
enforce_permission_to :update, :feed, feed: current_feed
|
64
|
+
|
65
|
+
@form = form(FeedForm).from_model(current_feed)
|
66
|
+
end
|
67
|
+
|
68
|
+
def update
|
69
|
+
enforce_permission_to :update, :feed, feed: current_feed
|
70
|
+
|
71
|
+
@form = form(FeedForm).from_params(
|
72
|
+
feed_params,
|
73
|
+
feed_id: current_feed.id
|
74
|
+
)
|
75
|
+
|
76
|
+
UpdateFeed.call(current_feed, @form) do
|
77
|
+
on(:ok) do |feed|
|
78
|
+
flash[:notice] = I18n.t("feeds.update.success", scope: "decidim.feeds")
|
79
|
+
redirect_to feed
|
80
|
+
end
|
81
|
+
|
82
|
+
on(:invalid) do
|
83
|
+
flash.now[:alert] = I18n.t("feeds.update.error", scope: "decidim.feeds")
|
84
|
+
render :edit
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def collection
|
92
|
+
@collection ||= OrganizationFeeds.new(current_user.organization).query
|
93
|
+
end
|
94
|
+
|
95
|
+
def current_feed
|
96
|
+
@current_feed ||= collection.where(slug: params[:slug]).or(
|
97
|
+
collection.where(id: params[:slug])
|
98
|
+
).first
|
99
|
+
end
|
100
|
+
|
101
|
+
def search_collection
|
102
|
+
Feed.where(organization: current_organization)
|
103
|
+
end
|
104
|
+
|
105
|
+
def default_filter_params
|
106
|
+
{
|
107
|
+
with_any_scope: nil,
|
108
|
+
with_any_area: nil,
|
109
|
+
with_any_type: nil
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def current_participatory_space
|
114
|
+
return unless params[:slug]
|
115
|
+
|
116
|
+
@current_participatory_space ||= OrganizationFeeds.new(current_organization).query.where(slug: params[:slug]).or(
|
117
|
+
OrganizationFeeds.new(current_organization).query.where(id: params[:slug])
|
118
|
+
).first!
|
119
|
+
end
|
120
|
+
|
121
|
+
def published_feeds
|
122
|
+
@published_feeds ||= OrganizationFeeds.new(current_organization)
|
123
|
+
end
|
124
|
+
|
125
|
+
# def collection
|
126
|
+
# @collection ||= paginate(Kaminari.paginate_array(parent_feeds))
|
127
|
+
# end
|
128
|
+
|
129
|
+
def feed_params
|
130
|
+
# only allow title to be updated
|
131
|
+
title_params = current_organization.available_locales.map { |locale| "title_#{locale}" }
|
132
|
+
permitted_params = params.require(:feed).permit(title_params)
|
133
|
+
{ id: params[:slug] }.merge(permitted_params)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
module Admin
|
6
|
+
# A form object used to create feeds from the admin
|
7
|
+
# dashboard.
|
8
|
+
#
|
9
|
+
class FeedForm < Form
|
10
|
+
include TranslatableAttributes
|
11
|
+
include AttachmentAttributes
|
12
|
+
|
13
|
+
mimic :feed
|
14
|
+
|
15
|
+
translatable_attribute :title, String
|
16
|
+
|
17
|
+
attribute :created_by, String
|
18
|
+
attribute :slug, String
|
19
|
+
attribute :attachment, AttachmentForm
|
20
|
+
# attribute :participatory_processes_ids, Array[Integer]
|
21
|
+
# attribute :included_at, Decidim::Attributes::LocalizedDate
|
22
|
+
|
23
|
+
# attribute :banner_image
|
24
|
+
# attribute :hero_image
|
25
|
+
# attribute :remove_banner_image, Boolean, default: false
|
26
|
+
# attribute :remove_hero_image, Boolean, default: false
|
27
|
+
|
28
|
+
attachments_attribute :documents
|
29
|
+
|
30
|
+
validates :slug, presence: true, format: { with: Decidim::Feeds::Feed.slug_format }
|
31
|
+
|
32
|
+
validate :slug_uniqueness
|
33
|
+
# validate :same_type_organization, if: ->(form) { form.decidim_feeds_type_id }
|
34
|
+
|
35
|
+
validates :title, translatable_presence: true
|
36
|
+
|
37
|
+
# validates :banner_image, passthru: { to: Decidim::Feed }
|
38
|
+
# validates :hero_image, passthru: { to: Decidim::Feed }
|
39
|
+
|
40
|
+
# validates :weight, presence: true
|
41
|
+
|
42
|
+
alias organization current_organization
|
43
|
+
|
44
|
+
def map_model(model)
|
45
|
+
self.title = model.title # translated_attribute(model.title)
|
46
|
+
self.slug = model.slug
|
47
|
+
self.documents = model.attachments
|
48
|
+
end
|
49
|
+
|
50
|
+
# def created_by_for_select
|
51
|
+
# CREATED_BY.map do |creator|
|
52
|
+
# [
|
53
|
+
# I18n.t("created_by.#{creator}", scope: "decidim.feeds"),
|
54
|
+
# creator
|
55
|
+
# ]
|
56
|
+
# end
|
57
|
+
# end
|
58
|
+
|
59
|
+
# def processes_for_select
|
60
|
+
# @processes_for_select ||= organization_participatory_processes
|
61
|
+
# &.map { |pp| [translated_attribute(pp.title), pp.id] }
|
62
|
+
# &.sort_by { |arr| arr[0] }
|
63
|
+
# end
|
64
|
+
|
65
|
+
def has_attachments?
|
66
|
+
feed.has_attachments? && errors[:documents].empty? && documents.present?
|
67
|
+
end
|
68
|
+
|
69
|
+
def has_error_in_attachments?
|
70
|
+
errors[:documents].present?
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
# def organization_participatory_processes
|
76
|
+
# Decidim.find_participatory_space_manifest(:participatory_processes)
|
77
|
+
# .participatory_spaces.call(current_organization)
|
78
|
+
# end
|
79
|
+
|
80
|
+
def organization_feeds
|
81
|
+
OrganizationFeeds.new(current_organization).query
|
82
|
+
end
|
83
|
+
|
84
|
+
def slug_uniqueness
|
85
|
+
return unless organization_feeds
|
86
|
+
.where(slug:)
|
87
|
+
.where.not(id: context[:feed_id])
|
88
|
+
.any?
|
89
|
+
|
90
|
+
errors.add(:slug, :taken)
|
91
|
+
end
|
92
|
+
|
93
|
+
# def same_type_organization
|
94
|
+
# return unless feed_type
|
95
|
+
# return if feed_type.organization == current_organization
|
96
|
+
|
97
|
+
# errors.add(:feed_type, :invalid)
|
98
|
+
# end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
# A form object used to create feeds from the admin
|
6
|
+
# dashboard.
|
7
|
+
#
|
8
|
+
class FeedForm < Form
|
9
|
+
include TranslatableAttributes
|
10
|
+
|
11
|
+
mimic :feed
|
12
|
+
|
13
|
+
translatable_attribute :title, String
|
14
|
+
|
15
|
+
attribute :created_by, String
|
16
|
+
|
17
|
+
# attribute :participatory_processes_ids, Array[Integer]
|
18
|
+
# attribute :included_at, Decidim::Attributes::LocalizedDate
|
19
|
+
|
20
|
+
# attribute :banner_image
|
21
|
+
# attribute :hero_image
|
22
|
+
# attribute :remove_banner_image, Boolean, default: false
|
23
|
+
# attribute :remove_hero_image, Boolean, default: false
|
24
|
+
|
25
|
+
# validate :same_type_organization, if: ->(form) { form.decidim_feeds_type_id }
|
26
|
+
|
27
|
+
validates :title, translatable_presence: true
|
28
|
+
|
29
|
+
# validates :banner_image, passthru: { to: Decidim::Feed }
|
30
|
+
# validates :hero_image, passthru: { to: Decidim::Feed }
|
31
|
+
|
32
|
+
# validates :weight, presence: true
|
33
|
+
|
34
|
+
alias organization current_organization
|
35
|
+
|
36
|
+
# def created_by_for_select
|
37
|
+
# CREATED_BY.map do |creator|
|
38
|
+
# [
|
39
|
+
# I18n.t("created_by.#{creator}", scope: "decidim.feeds"),
|
40
|
+
# creator
|
41
|
+
# ]
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
|
45
|
+
# def processes_for_select
|
46
|
+
# @processes_for_select ||= organization_participatory_processes
|
47
|
+
# &.map { |pp| [translated_attribute(pp.title), pp.id] }
|
48
|
+
# &.sort_by { |arr| arr[0] }
|
49
|
+
# end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# def organization_participatory_processes
|
54
|
+
# Decidim.find_participatory_space_manifest(:participatory_processes)
|
55
|
+
# .participatory_spaces.call(current_organization)
|
56
|
+
# end
|
57
|
+
|
58
|
+
def organization_feeds
|
59
|
+
OrganizationFeeds.new(current_organization).query
|
60
|
+
end
|
61
|
+
|
62
|
+
# def same_type_organization
|
63
|
+
# return unless feed_type
|
64
|
+
# return if feed_type.organization == current_organization
|
65
|
+
|
66
|
+
# errors.add(:feed_type, :invalid)
|
67
|
+
# end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
# Custom helpers, scoped to the feeds engine.
|
6
|
+
#
|
7
|
+
module ApplicationHelper
|
8
|
+
include PaginateHelper
|
9
|
+
include SanitizeHelper
|
10
|
+
# include Decidim::Feeds::PostsHelper
|
11
|
+
include ::Decidim::EndorsableHelper
|
12
|
+
include ::Decidim::FollowableHelper
|
13
|
+
include Decidim::Comments::CommentsHelper
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
# Helpers related to the Feeds layout.
|
6
|
+
module FeedsHelper
|
7
|
+
include Decidim::ResourceHelper
|
8
|
+
# include Decidim::AttachmentsHelper
|
9
|
+
include Decidim::IconHelper
|
10
|
+
include Decidim::SanitizeHelper
|
11
|
+
include Decidim::ResourceReferenceHelper
|
12
|
+
# include Decidim::FiltersHelper
|
13
|
+
# include FilterFeedsHelper
|
14
|
+
|
15
|
+
# Items to display in the navigation of an feed
|
16
|
+
def feed_nav_items(participatory_space)
|
17
|
+
components = participatory_space.components.published.or(Decidim::Component.where(id: try(:current_component)))
|
18
|
+
|
19
|
+
[
|
20
|
+
*(if participatory_space.members.not_ceased.any?
|
21
|
+
[{
|
22
|
+
name: t("feed_member_menu_item", scope: "layouts.decidim.feed_navigation"),
|
23
|
+
url: decidim_feeds.feed_feed_members_path(participatory_space),
|
24
|
+
active: is_active_link?(decidim_feeds.feed_feed_members_path(participatory_space), :inclusive)
|
25
|
+
}]
|
26
|
+
end
|
27
|
+
)
|
28
|
+
] + components.map do |component|
|
29
|
+
{
|
30
|
+
name: decidim_escape_translated(component.name),
|
31
|
+
url: main_component_path(component),
|
32
|
+
active: is_active_link?(main_component_path(component), :inclusive)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Feeds
|
5
|
+
class Feed < ApplicationRecord
|
6
|
+
include Decidim::Participable
|
7
|
+
include Decidim::ParticipatorySpaceResourceable
|
8
|
+
include Decidim::TranslatableResource
|
9
|
+
include Decidim::Loggable
|
10
|
+
include Decidim::Traceable
|
11
|
+
include Decidim::Searchable
|
12
|
+
include Decidim::HasAttachments
|
13
|
+
# include Decidim::HasAttachmentCollections
|
14
|
+
# include Decidim::Publicable
|
15
|
+
# include Decidim::ScopableParticipatorySpace
|
16
|
+
# include Decidim::Followable
|
17
|
+
# include Decidim::HasReference
|
18
|
+
# include Decidim::HasPrivateUsers
|
19
|
+
# include Decidim::HasUploadValidations
|
20
|
+
# include Decidim::FilterableResource
|
21
|
+
|
22
|
+
translatable_fields :title
|
23
|
+
|
24
|
+
belongs_to :organization,
|
25
|
+
foreign_key: "decidim_organization_id",
|
26
|
+
class_name: "Decidim::Organization"
|
27
|
+
|
28
|
+
has_many :components, as: :participatory_space, dependent: :destroy
|
29
|
+
has_many :categories,
|
30
|
+
foreign_key: "decidim_participatory_space_id",
|
31
|
+
foreign_type: "decidim_participatory_space_type",
|
32
|
+
dependent: :destroy,
|
33
|
+
as: :participatory_space
|
34
|
+
|
35
|
+
# has_one_attached :hero_image
|
36
|
+
# validates_upload :hero_image, uploader: Decidim::HeroImageUploader
|
37
|
+
|
38
|
+
# has_one_attached :banner_image
|
39
|
+
# validates_upload :banner_image, uploader: Decidim::BannerImageUploader
|
40
|
+
|
41
|
+
validates :slug, uniqueness: { scope: :organization }
|
42
|
+
validates :slug, presence: true, format: { with: Decidim::Feeds::Feed.slug_format }
|
43
|
+
|
44
|
+
searchable_fields({
|
45
|
+
# scope_id: :decidim_scope_id,
|
46
|
+
participatory_space: :itself,
|
47
|
+
A: :title,
|
48
|
+
# B: :subtitle,
|
49
|
+
# C: :short_description,
|
50
|
+
# D: :description,
|
51
|
+
datetime: :created_at
|
52
|
+
},
|
53
|
+
index_on_create: true,
|
54
|
+
index_on_update: true
|
55
|
+
)
|
56
|
+
|
57
|
+
# Overwriting existing method Decidim::HasPrivateUsers.public_spaces
|
58
|
+
# def self.public_spaces
|
59
|
+
# where(private_space: false).or(where(private_space: true).where(is_transparent: true)).published
|
60
|
+
# end
|
61
|
+
|
62
|
+
def self.log_presenter_class_for(_log)
|
63
|
+
Decidim::Feeds::AdminLog::FeedPresenter
|
64
|
+
end
|
65
|
+
|
66
|
+
# This is required by participable, but Feed is not publicable
|
67
|
+
def self.published
|
68
|
+
all
|
69
|
+
end
|
70
|
+
|
71
|
+
# def hashtag
|
72
|
+
# attributes["hashtag"].to_s.delete("#")
|
73
|
+
# end
|
74
|
+
|
75
|
+
def to_param
|
76
|
+
slug
|
77
|
+
end
|
78
|
+
|
79
|
+
def translated_title
|
80
|
+
Decidim::FeedPresenter.new(self).translated_title
|
81
|
+
end
|
82
|
+
|
83
|
+
def scopes_enabled?
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
87
|
+
def scope
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def followers
|
92
|
+
Decidim::User.none
|
93
|
+
end
|
94
|
+
|
95
|
+
def private_space?
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
99
|
+
def has_subscopes?
|
100
|
+
false
|
101
|
+
end
|
102
|
+
|
103
|
+
def published?
|
104
|
+
true
|
105
|
+
end
|
106
|
+
|
107
|
+
# private
|
108
|
+
|
109
|
+
# Allow ransacker to search for a key in a hstore column (`title`.`en`)
|
110
|
+
# ransacker_i18n :title # requires filterable
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
@import 'stylesheets/decidim/feeds/feeds';
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35"><path d="M17.5 35A17.5 17.5 0 1 1 35 17.5 17.52 17.52 0 0 1 17.5 35zm0-33.06A15.56 15.56 0 1 0 33.06 17.5 15.57 15.57 0 0 0 17.5 1.94zm9.5 13.7H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zm0 3.68H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zM22.26 23H8a1 1 0 0 1 0-1.94h14.26a1 1 0 0 1 0 1.94z"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35"><path d="M17.5 35A17.5 17.5 0 1 1 35 17.5 17.52 17.52 0 0 1 17.5 35zm0-33.06A15.56 15.56 0 1 0 33.06 17.5 15.57 15.57 0 0 0 17.5 1.94zm9.5 13.7H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zm0 3.68H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zM22.26 23H8a1 1 0 0 1 0-1.94h14.26a1 1 0 0 1 0 1.94z"/></svg>
|