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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +39 -0
  4. data/Rakefile +9 -0
  5. data/app/cells/decidim/feeds/content_blocks/feeds_settings_form/show.erb +3 -0
  6. data/app/cells/decidim/feeds/content_blocks/feeds_settings_form_cell.rb +23 -0
  7. data/app/cells/decidim/feeds/feed_cell.rb +24 -0
  8. data/app/cells/decidim/feeds/feed_dropdown_metadata_cell.rb +19 -0
  9. data/app/cells/decidim/feeds/feed_g_cell.rb +33 -0
  10. data/app/cells/decidim/feeds/feed_metadata_g_cell.rb +25 -0
  11. data/app/cells/decidim/feeds/feed_s_cell.rb +13 -0
  12. data/app/commands/decidim/feeds/admin/create_feed.rb +90 -0
  13. data/app/commands/decidim/feeds/admin/update_feed.rb +85 -0
  14. data/app/commands/decidim/feeds/create_feed.rb +90 -0
  15. data/app/commands/decidim/feeds/update_feed.rb +73 -0
  16. data/app/constraints/decidim/feeds/current_component.rb +28 -0
  17. data/app/constraints/decidim/feeds/current_feed.rb +43 -0
  18. data/app/controllers/concerns/decidim/feeds/feed_breadcrumb.rb +36 -0
  19. data/app/controllers/decidim/feeds/admin/application_controller.rb +26 -0
  20. data/app/controllers/decidim/feeds/admin/components_controller.rb +14 -0
  21. data/app/controllers/decidim/feeds/admin/concerns/feed_admin.rb +51 -0
  22. data/app/controllers/decidim/feeds/admin/feeds_controller.rb +92 -0
  23. data/app/controllers/decidim/feeds/application_controller.rb +37 -0
  24. data/app/controllers/decidim/feeds/feeds_controller.rb +137 -0
  25. data/app/forms/decidim/feeds/admin/feed_form.rb +102 -0
  26. data/app/forms/decidim/feeds/feed_form.rb +70 -0
  27. data/app/helpers/decidim/feeds/admin/feeds_admin_menu_helper.rb +10 -0
  28. data/app/helpers/decidim/feeds/application_helper.rb +16 -0
  29. data/app/helpers/decidim/feeds/feeds_helper.rb +38 -0
  30. data/app/models/decidim/feeds/application_record.rb +10 -0
  31. data/app/models/decidim/feeds/feed.rb +113 -0
  32. data/app/packs/entrypoints/decidim_feeds.js +5 -0
  33. data/app/packs/entrypoints/decidim_feeds.scss +1 -0
  34. data/app/packs/images/decidim/feeds/decidim_feeds.svg +1 -0
  35. data/app/packs/images/decidim/feeds/icon.svg +1 -0
  36. data/app/packs/src/decidim/feeds/feeds.js +0 -0
  37. data/app/packs/stylesheets/decidim/feeds/_variables.scss +10 -0
  38. data/app/packs/stylesheets/decidim/feeds/feeds.scss +3 -0
  39. data/app/permissions/decidim/feeds/permissions.rb +53 -0
  40. data/app/presenters/decidim/feeds/admin_log/feed_presenter.rb +46 -0
  41. data/app/queries/decidim/feeds/admin/admin_users.rb +60 -0
  42. data/app/queries/decidim/feeds/organization_feeds.rb +16 -0
  43. data/app/views/decidim/feeds/admin/feeds/_form.html.erb +66 -0
  44. data/app/views/decidim/feeds/admin/feeds/edit.html.erb +20 -0
  45. data/app/views/decidim/feeds/admin/feeds/index.html.erb +65 -0
  46. data/app/views/decidim/feeds/admin/feeds/new.html.erb +20 -0
  47. data/app/views/decidim/feeds/feeds/_form.html.erb +18 -0
  48. data/app/views/decidim/feeds/feeds/edit.html.erb +10 -0
  49. data/app/views/decidim/feeds/feeds/index.html.erb +5 -0
  50. data/app/views/decidim/feeds/feeds/new.html.erb +20 -0
  51. data/app/views/decidim/feeds/feeds/show.html.erb +33 -0
  52. data/app/views/layouts/decidim/admin/_manage_feeds.html.erb +11 -0
  53. data/app/views/layouts/decidim/admin/feed.html.erb +17 -0
  54. data/app/views/layouts/decidim/admin/feeds.html.erb +17 -0
  55. data/app/views/layouts/decidim/feed.html.erb +18 -0
  56. data/config/assets.rb +9 -0
  57. data/config/i18n-tasks.yml +10 -0
  58. data/config/locales/bs.yml +75 -0
  59. data/config/locales/de.yml +77 -0
  60. data/config/locales/en.yml +75 -0
  61. data/config/locales/hr.yml +75 -0
  62. data/config/locales/it.yml +75 -0
  63. data/config/locales/sr.yml +75 -0
  64. data/config/locales/tr.yml +75 -0
  65. data/lib/decidim/api/feed_type.rb +30 -0
  66. data/lib/decidim/feeds/admin.rb +10 -0
  67. data/lib/decidim/feeds/admin_engine.rb +81 -0
  68. data/lib/decidim/feeds/api.rb +9 -0
  69. data/lib/decidim/feeds/content_blocks/content_blocks_homepage.rb +19 -0
  70. data/lib/decidim/feeds/engine.rb +83 -0
  71. data/lib/decidim/feeds/menu.rb +106 -0
  72. data/lib/decidim/feeds/participatory_space.rb +52 -0
  73. data/lib/decidim/feeds/seeds.rb +47 -0
  74. data/lib/decidim/feeds/test/factories.rb +17 -0
  75. data/lib/decidim/feeds/version.rb +9 -0
  76. data/lib/decidim/feeds.rb +13 -0
  77. metadata +142 -0
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Decidim::Feeds participatory space (under development)
2
+
3
+ This Feeds module adds a simple Feeds Participatory Space to hold a feed component.
4
+
5
+ **The module is currently in development and not yet ready.**
6
+
7
+ ## Usage
8
+
9
+ Feeds will be available as a Participatory Space.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem "decidim-feeds", git: "https://github.com/DecidimAustria/decidim-module-feeds.git", branch: "main"
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ ```bash
22
+ bundle
23
+ bundle exec rails decidim_feeds:install:migrations
24
+ bundle exec rails db:migrate
25
+ ```
26
+
27
+ ## Contributing
28
+
29
+ Contributions are welcome !
30
+
31
+ We expect the contributions to follow the [Decidim's contribution guide](https://github.com/decidim/decidim/blob/develop/CONTRIBUTING.adoc).
32
+
33
+ ## Security
34
+
35
+ Security is very important to us. If you have any issue regarding security, please disclose the information responsibly by sending an email to __security [at] mitgestalten [dot] jetzt__ and not by creating a Github issue.
36
+
37
+ ## License
38
+
39
+ This engine is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/dev/common_rake"
4
+
5
+ desc "Generates a dummy app for testing"
6
+ task test_app: "decidim:generate_external_test_app"
7
+
8
+ desc "Generates a development app."
9
+ task development_app: "decidim:generate_external_development_app"
@@ -0,0 +1,3 @@
1
+ <% form.fields_for :settings, form.object.settings do |settings_fields| %>
2
+ <%= settings_fields.select :component_id, available_feeds_options, prompt: "", label: t(".component") %>
3
+ <% end %>
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ module ContentBlocks
6
+ class FeedsSettingsFormCell < Decidim::ViewModel
7
+ # Found in HighlightedElementsForComponentSettingsFormCell
8
+ #include Decidim::ContentBlocks::HasRelatedComponents
9
+ alias form model
10
+
11
+ def available_feeds_options
12
+ available_feeds.map do |component|
13
+ [translated_attribute(component.name), component.id]
14
+ end
15
+ end
16
+
17
+ def available_feeds
18
+ @available_feeds ||= Decidim::Component.where(manifest_name: "posts").where(participatory_space_id: current_organization.participatory_spaces.pluck(:id))
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # This cell renders the process card for an instance of a Feed
6
+ # the default size is the Medium Card (:m)
7
+ class FeedCell < Decidim::ViewModel
8
+ def show
9
+ cell card_size, model, options
10
+ end
11
+
12
+ private
13
+
14
+ def card_size
15
+ case @options[:size]
16
+ when :s
17
+ "decidim/feeds/feed_s"
18
+ else
19
+ "decidim/feeds/feed_g"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ class FeedDropdownMetadataCell < Decidim::ParticipatorySpaceDropdownMetadataCell
6
+ # include FeedsHelper
7
+ include Decidim::ComponentPathHelper
8
+ include ActiveLinkTo
9
+
10
+ def decidim_feeds
11
+ Decidim::Feeds::Engine.routes.url_helpers
12
+ end
13
+
14
+ private
15
+
16
+ def nav_items_method = :feed_nav_items
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # This cell renders the Grid (:g) feed card
6
+ # for a given instance of a feed
7
+ class FeedGCell < Decidim::CardGCell
8
+ private
9
+
10
+ def resource_path
11
+ Decidim::Feeds::Engine.routes.url_helpers.feed_path(model)
12
+ end
13
+
14
+ def has_image?
15
+ # image.present?
16
+ false
17
+ end
18
+
19
+ def image
20
+ # @image ||= model.attachments.find(&:image?)
21
+ nil
22
+ end
23
+
24
+ def resource_image_path
25
+ image.url if has_image?
26
+ end
27
+
28
+ def metadata_cell
29
+ "decidim/feeds/feed_metadata_g"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # This cell renders the feed metadata for g card
6
+ class FeedMetadataGCell < Decidim::CardMetadataCell
7
+ include Cell::ViewModel::Partial
8
+
9
+ alias current_feed resource
10
+ alias feed resource
11
+
12
+ def initialize(*)
13
+ super
14
+
15
+ @items.prepend(*feed_items)
16
+ end
17
+
18
+ private
19
+
20
+ def feed_items
21
+ []
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module Decidim
2
+ module Feeds
3
+ # This cell renders the Search (:s) feed card
4
+ # for a given instance of a feed
5
+ class FeedSCell < Decidim::CardSCell
6
+ private
7
+
8
+ def metadata_cell
9
+ "decidim/feeds/feed_metadata_g"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ module Admin
6
+ # A command with all the business logic when creating a new participatory
7
+ # feed in the system.
8
+ class CreateFeed < Decidim::Command
9
+ include ::Decidim::MultipleAttachmentsMethods
10
+
11
+ # Public: Initializes the command.
12
+ #
13
+ # form - A form object with the params.
14
+ def initialize(form)
15
+ @form = form
16
+ end
17
+
18
+ # Executes the command. Broadcasts these events:
19
+ #
20
+ # - :ok when everything is valid.
21
+ # - :invalid if the form was not valid and we could not proceed.
22
+ #
23
+ # Returns nothing.
24
+ def call
25
+ return broadcast(:invalid) if form.invalid?
26
+
27
+ if process_attachments?
28
+ build_attachments
29
+ return broadcast(:invalid) if attachments_invalid?
30
+ end
31
+
32
+ if feed.persisted?
33
+ # link_participatory_processes(feed)
34
+ # Decidim::ContentBlocksCreator.new(feed).create_default!
35
+
36
+ broadcast(:ok, feed)
37
+ else
38
+ # form.errors.add(:hero_image, feed.errors[:hero_image]) if feed.errors.include? :hero_image
39
+ # form.errors.add(:banner_image, feed.errors[:banner_image]) if feed.errors.include? :banner_image
40
+ broadcast(:invalid)
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :form
47
+
48
+ def feed
49
+ @feed ||= Decidim.traceability.create(
50
+ Feed,
51
+ form.current_user,
52
+ organization: form.current_organization,
53
+ title: form.title,
54
+ slug: form.slug,
55
+ created_by: form.created_by
56
+ )
57
+ @attached_to = @feed
58
+ @feed
59
+ end
60
+
61
+ # def add_admins_as_followers(feed)
62
+ # feed.organization.admins.each do |admin|
63
+ # form = Decidim::FollowForm
64
+ # .from_params(followable_gid: feed.to_signed_global_id.to_s)
65
+ # .with_context(
66
+ # current_organization: feed.organization,
67
+ # current_user: admin
68
+ # )
69
+
70
+ # Decidim::CreateFollow.new(form, admin).call
71
+ # end
72
+ # end
73
+
74
+ # def participatory_processes(feed)
75
+ # @participatory_processes ||= feed.participatory_space_sibling_scope(:participatory_processes).where(id: @form.participatory_processes_ids)
76
+ # end
77
+
78
+ # def link_participatory_processes(feed)
79
+ # feed.link_participatory_space_resources(participatory_processes(feed), "included_participatory_processes")
80
+ # end
81
+
82
+ def first_attachment_weight
83
+ return 1 if feed.documents.count.zero?
84
+
85
+ feed.documents.count
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ module Admin
6
+ # A command with all the business logic when creating a new participatory
7
+ # feed in the system.
8
+ class UpdateFeed < Decidim::Command
9
+ include ::Decidim::MultipleAttachmentsMethods
10
+
11
+ # Public: Initializes the command.
12
+ #
13
+ # feed - the Feed to update
14
+ # form - A form object with the params.
15
+ def initialize(feed, form)
16
+ @feed = feed
17
+ @form = form
18
+ @attached_to = feed
19
+ end
20
+
21
+ # Executes the command. Broadcasts these events:
22
+ #
23
+ # - :ok when everything is valid.
24
+ # - :invalid if the form was not valid and we could not proceed.
25
+ #
26
+ # Returns nothing.
27
+ def call
28
+ return broadcast(:invalid) if form.invalid?
29
+
30
+ if process_attachments?
31
+ build_attachments
32
+ return broadcast(:invalid) if attachments_invalid?
33
+ end
34
+
35
+ update_feed
36
+ # link_participatory_processes(@feed)
37
+ document_cleanup!(include_all_attachments: true)
38
+ create_attachments if process_attachments?
39
+
40
+ if @feed.valid?
41
+ broadcast(:ok, @feed)
42
+ else
43
+ # form.errors.add(:hero_image, @feed.errors[:hero_image]) if @feed.errors.include? :hero_image
44
+ # form.errors.add(:banner_image, @feed.errors[:banner_image]) if @feed.errors.include? :banner_image
45
+ broadcast(:invalid)
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ attr_reader :form, :feed
52
+
53
+ def update_feed
54
+ @feed.assign_attributes(attributes)
55
+ save_feed if @feed.valid?
56
+ end
57
+
58
+ def save_feed
59
+ transaction do
60
+ @feed.save!
61
+ Decidim.traceability.perform_action!(:update, @feed, form.current_user) do
62
+ @feed
63
+ end
64
+ end
65
+ end
66
+
67
+ def attributes
68
+ {
69
+ title: form.title,
70
+ slug: form.slug,
71
+ created_by: form.created_by
72
+ }
73
+ end
74
+
75
+ # def participatory_processes(feed)
76
+ # @participatory_processes ||= feed.participatory_space_sibling_scope(:participatory_processes).where(id: @form.participatory_processes_ids)
77
+ # end
78
+
79
+ # def link_participatory_processes(feed)
80
+ # feed.link_participatory_space_resources(participatory_processes(feed), "included_participatory_processes")
81
+ # end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # A command with all the business logic when creating a new participatory
6
+ # feed in the system.
7
+ class CreateFeed < Decidim::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # form - A form object with the params.
11
+ def initialize(form)
12
+ @form = form
13
+ @author = author
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid.
19
+ # - :invalid if the form was not valid and we could not proceed.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ return broadcast(:invalid) if form.invalid?
24
+
25
+ if feed.persisted?
26
+ # link_participatory_processes(feed)
27
+ # Decidim::ContentBlocksCreator.new(feed).create_default!
28
+ if create_posts_component
29
+ broadcast(:ok, feed)
30
+ else
31
+ broadcast(:invalid)
32
+ end
33
+
34
+ else
35
+ # form.errors.add(:hero_image, feed.errors[:hero_image]) if feed.errors.include? :hero_image
36
+ # form.errors.add(:banner_image, feed.errors[:banner_image]) if feed.errors.include? :banner_image
37
+ broadcast(:invalid)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ attr_reader :form, :author
44
+
45
+ def feed
46
+ @feed ||= Decidim.traceability.create(
47
+ Feed,
48
+ form.current_user,
49
+ organization: form.current_organization,
50
+ title: { I18n.locale => form.title },
51
+ slug: form.title.parameterize,
52
+ created_by: form.current_user
53
+ )
54
+ end
55
+
56
+ def create_posts_component
57
+ Decidim.traceability.create!(
58
+ Component,
59
+ form.current_user,
60
+ manifest_name: "posts",
61
+ name: { I18n.locale => "Posts" },
62
+ participatory_space: feed,
63
+ weight: 0,
64
+ settings: {}
65
+ )
66
+ end
67
+
68
+ # def add_admins_as_followers(feed)
69
+ # feed.organization.admins.each do |admin|
70
+ # form = Decidim::FollowForm
71
+ # .from_params(followable_gid: feed.to_signed_global_id.to_s)
72
+ # .with_context(
73
+ # current_organization: feed.organization,
74
+ # current_user: admin
75
+ # )
76
+
77
+ # Decidim::CreateFollow.new(form, admin).call
78
+ # end
79
+ # end
80
+
81
+ # def participatory_processes(feed)
82
+ # @participatory_processes ||= feed.participatory_space_sibling_scope(:participatory_processes).where(id: @form.participatory_processes_ids)
83
+ # end
84
+
85
+ # def link_participatory_processes(feed)
86
+ # feed.link_participatory_space_resources(participatory_processes(feed), "included_participatory_processes")
87
+ # end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # A command with all the business logic when creating a new participatory
6
+ # feed in the system.
7
+ class UpdateFeed < Decidim::Command
8
+ include ::Decidim::AttachmentAttributesMethods
9
+
10
+ # Public: Initializes the command.
11
+ #
12
+ # feed - the Feed to update
13
+ # form - A form object with the params.
14
+ def initialize(feed, form)
15
+ @feed = feed
16
+ @form = form
17
+ end
18
+
19
+ # Executes the command. Broadcasts these events:
20
+ #
21
+ # - :ok when everything is valid.
22
+ # - :invalid if the form was not valid and we could not proceed.
23
+ #
24
+ # Returns nothing.
25
+ def call
26
+ return broadcast(:invalid) if form.invalid?
27
+
28
+ update_feed
29
+ # link_participatory_processes(@feed)
30
+
31
+ if @feed.valid?
32
+ broadcast(:ok, @feed)
33
+ else
34
+ # form.errors.add(:hero_image, @feed.errors[:hero_image]) if @feed.errors.include? :hero_image
35
+ # form.errors.add(:banner_image, @feed.errors[:banner_image]) if @feed.errors.include? :banner_image
36
+ broadcast(:invalid)
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :form, :feed
43
+
44
+ def update_feed
45
+ @feed.assign_attributes(attributes)
46
+ save_feed if @feed.valid?
47
+ end
48
+
49
+ def save_feed
50
+ transaction do
51
+ @feed.save!
52
+ Decidim.traceability.perform_action!(:update, @feed, form.current_user) do
53
+ @feed
54
+ end
55
+ end
56
+ end
57
+
58
+ def attributes
59
+ {
60
+ title: form.title
61
+ }
62
+ end
63
+
64
+ # def participatory_processes(feed)
65
+ # @participatory_processes ||= feed.participatory_space_sibling_scope(:participatory_processes).where(id: @form.participatory_processes_ids)
66
+ # end
67
+
68
+ # def link_participatory_processes(feed)
69
+ # feed.link_participatory_space_resources(participatory_processes(feed), "included_participatory_processes")
70
+ # end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # This class infers the current component on a feed context
6
+ # request parameters and injects it into the environment.
7
+ class CurrentComponent
8
+ # Public: Initializes the class.
9
+ #
10
+ # manifest - The manifest of the component to check against.
11
+ def initialize(manifest)
12
+ @manifest = manifest
13
+ end
14
+
15
+ # Public: Matches the request against a component and injects it into the
16
+ # environment.
17
+ #
18
+ # request - The request that holds the current component relevant information.
19
+ #
20
+ # Returns a true if the request matches a feed and a
21
+ # component belonging to that feed, false otherwise
22
+ def matches?(request)
23
+ CurrentFeed.new.matches?(request) &&
24
+ Decidim::CurrentComponent.new(@manifest).matches?(request)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # This class infers the current feed we are scoped to by
6
+ # looking at the request parameters and the organization in the request
7
+ # environment, and injects it into the environment.
8
+ class CurrentFeed
9
+ # Public: Matches the request against a feed and injects it
10
+ # into the environment.
11
+ #
12
+ # request - The request that holds the feeds relevant
13
+ # information.
14
+ #
15
+ # Returns a true if the request matched, false otherwise
16
+ def matches?(request)
17
+ env = request.env
18
+
19
+ @organization = env["decidim.current_organization"]
20
+ return false unless @organization
21
+
22
+ current_feed(env, request.params) ? true : false
23
+ end
24
+
25
+ private
26
+
27
+ def current_feed(env, params)
28
+ env["decidim.current_participatory_space"] ||=
29
+ detect_current_feed(params)
30
+ end
31
+
32
+ def detect_current_feed(params)
33
+ organization_feeds.where(slug: params["feed_slug"]).or(
34
+ organization_feeds.where(id: params["feed_slug"])
35
+ ).first!
36
+ end
37
+
38
+ def organization_feeds
39
+ @organization_feeds ||= OrganizationFeeds.new(@organization).query
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ # Concern to provide a specific breadcrumb item to controllers using it
6
+ module FeedBreadcrumb
7
+ extend ActiveSupport::Concern
8
+
9
+ private
10
+
11
+ def current_participatory_space_breadcrumb_item
12
+ return {} if current_participatory_space.blank?
13
+
14
+ dropdown_cell = current_participatory_space_manifest.breadcrumb_cell
15
+
16
+ items = current_participatory_space.ancestors.map do |participatory_space|
17
+ {
18
+ label: participatory_space.title,
19
+ url: Decidim::ResourceLocatorPresenter.new(participatory_space).path,
20
+ active: false,
21
+ dropdown_cell:,
22
+ resource: participatory_space
23
+ }
24
+ end
25
+
26
+ items << {
27
+ label: current_participatory_space.title,
28
+ url: Decidim::ResourceLocatorPresenter.new(current_participatory_space).path,
29
+ active: true,
30
+ dropdown_cell:,
31
+ resource: current_participatory_space
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ module Admin
6
+ # The main admin application controller for feeds
7
+ class ApplicationController < Decidim::Admin::ApplicationController
8
+ register_permissions(::Decidim::Feeds::Admin::ApplicationController,
9
+ Decidim::Feeds::Permissions,
10
+ Decidim::Admin::Permissions)
11
+
12
+ private
13
+
14
+ def permissions_context
15
+ super.merge(
16
+ current_participatory_space: try(:current_participatory_space)
17
+ )
18
+ end
19
+
20
+ def permission_class_chain
21
+ ::Decidim.permissions_registry.chain_for(::Decidim::Feeds::Admin::ApplicationController)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Feeds
5
+ module Admin
6
+ # Controller that allows managing the Feed Components in the
7
+ # admin panel.
8
+ #
9
+ class ComponentsController < Decidim::Admin::ComponentsController
10
+ include Concerns::FeedAdmin
11
+ end
12
+ end
13
+ end
14
+ end