decidim-challenges 0.5.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 (231) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +49 -0
  4. data/Rakefile +9 -0
  5. data/app/cells/decidim/challenges/challenge_cell.rb +21 -0
  6. data/app/cells/decidim/challenges/challenge_g/show.erb +47 -0
  7. data/app/cells/decidim/challenges/challenge_g_cell.rb +69 -0
  8. data/app/cells/decidim/problems/problem_cell.rb +21 -0
  9. data/app/cells/decidim/problems/problem_g/show.erb +35 -0
  10. data/app/cells/decidim/problems/problem_g_cell.rb +61 -0
  11. data/app/cells/decidim/solutions/solution_cell.rb +21 -0
  12. data/app/cells/decidim/solutions/solution_g/show.erb +30 -0
  13. data/app/cells/decidim/solutions/solution_g_cell.rb +84 -0
  14. data/app/commands/decidim/challenges/admin/create_challenge.rb +67 -0
  15. data/app/commands/decidim/challenges/admin/destroy_challenge.rb +49 -0
  16. data/app/commands/decidim/challenges/admin/export_challenge_surveys.rb +45 -0
  17. data/app/commands/decidim/challenges/admin/publish_challenge.rb +40 -0
  18. data/app/commands/decidim/challenges/admin/unpublish_challenge.rb +40 -0
  19. data/app/commands/decidim/challenges/admin/update_challenge.rb +72 -0
  20. data/app/commands/decidim/challenges/admin/update_surveys.rb +43 -0
  21. data/app/commands/decidim/challenges/survey_challenge.rb +67 -0
  22. data/app/commands/decidim/command_utils.rb +20 -0
  23. data/app/commands/decidim/problems/admin/create_problem.rb +66 -0
  24. data/app/commands/decidim/problems/admin/destroy_problem.rb +49 -0
  25. data/app/commands/decidim/problems/admin/publish_problem.rb +40 -0
  26. data/app/commands/decidim/problems/admin/unpublish_problem.rb +40 -0
  27. data/app/commands/decidim/problems/admin/update_problem.rb +69 -0
  28. data/app/commands/decidim/solutions/admin/create_solution.rb +65 -0
  29. data/app/commands/decidim/solutions/admin/destroy_solution.rb +43 -0
  30. data/app/commands/decidim/solutions/admin/publish_solution.rb +40 -0
  31. data/app/commands/decidim/solutions/admin/unpublish_solution.rb +40 -0
  32. data/app/commands/decidim/solutions/admin/update_solution.rb +67 -0
  33. data/app/commands/decidim/solutions/create_solution.rb +67 -0
  34. data/app/controllers/concerns/decidim/challenges/admin/filterable.rb +27 -0
  35. data/app/controllers/concerns/decidim/challenges/orderable_challenges.rb +37 -0
  36. data/app/controllers/concerns/decidim/problems/admin/filterable.rb +27 -0
  37. data/app/controllers/concerns/decidim/problems/orderable_problems.rb +37 -0
  38. data/app/controllers/concerns/decidim/solutions/admin/filterable.rb +27 -0
  39. data/app/controllers/concerns/decidim/solutions/orderable_solutions.rb +37 -0
  40. data/app/controllers/concerns/decidim/with_default_filters.rb +23 -0
  41. data/app/controllers/concerns/decidim/with_sdgs.rb +19 -0
  42. data/app/controllers/decidim/challenges/admin/application_controller.rb +15 -0
  43. data/app/controllers/decidim/challenges/admin/challenge_publications_controller.rb +53 -0
  44. data/app/controllers/decidim/challenges/admin/challenges_controller.rb +108 -0
  45. data/app/controllers/decidim/challenges/admin/survey_form_controller.rb +43 -0
  46. data/app/controllers/decidim/challenges/admin/surveys_controller.rb +104 -0
  47. data/app/controllers/decidim/challenges/application_controller.rb +13 -0
  48. data/app/controllers/decidim/challenges/challenges_controller.rb +70 -0
  49. data/app/controllers/decidim/challenges/surveys_controller.rb +61 -0
  50. data/app/controllers/decidim/problems/admin/application_controller.rb +15 -0
  51. data/app/controllers/decidim/problems/admin/problem_publications_controller.rb +53 -0
  52. data/app/controllers/decidim/problems/admin/problems_controller.rb +102 -0
  53. data/app/controllers/decidim/problems/application_controller.rb +13 -0
  54. data/app/controllers/decidim/problems/problems_controller.rb +62 -0
  55. data/app/controllers/decidim/sdgs/admin/application_controller.rb +15 -0
  56. data/app/controllers/decidim/sdgs/admin/sdgs_controller.rb +18 -0
  57. data/app/controllers/decidim/sdgs/application_controller.rb +13 -0
  58. data/app/controllers/decidim/sdgs/sdgs_controller.rb +24 -0
  59. data/app/controllers/decidim/solutions/admin/application_controller.rb +15 -0
  60. data/app/controllers/decidim/solutions/admin/solution_publications_controller.rb +53 -0
  61. data/app/controllers/decidim/solutions/admin/solutions_controller.rb +106 -0
  62. data/app/controllers/decidim/solutions/application_controller.rb +13 -0
  63. data/app/controllers/decidim/solutions/solutions_controller.rb +115 -0
  64. data/app/forms/decidim/challenges/admin/challenge_surveys_form.rb +35 -0
  65. data/app/forms/decidim/challenges/admin/challenges_form.rb +78 -0
  66. data/app/forms/decidim/problems/admin/problems_form.rb +90 -0
  67. data/app/forms/decidim/solutions/admin/solutions_form.rb +71 -0
  68. data/app/forms/decidim/solutions/solutions_form.rb +50 -0
  69. data/app/helpers/decidim/challenges/application_helper.rb +25 -0
  70. data/app/helpers/decidim/challenges/challenge_cells_helper.rb +57 -0
  71. data/app/helpers/decidim/challenges/challenges_helper.rb +39 -0
  72. data/app/helpers/decidim/problems/application_helper.rb +10 -0
  73. data/app/helpers/decidim/problems/problem_cells_helper.rb +23 -0
  74. data/app/helpers/decidim/problems/problems_helper.rb +24 -0
  75. data/app/helpers/decidim/sdgs/sdgs_helper.rb +28 -0
  76. data/app/helpers/decidim/show_filters_helper.rb +13 -0
  77. data/app/helpers/decidim/solutions/application_helper.rb +27 -0
  78. data/app/helpers/decidim/solutions/solution_cells_helper.rb +56 -0
  79. data/app/helpers/decidim/solutions/solutions_helper.rb +21 -0
  80. data/app/models/decidim/application_record.rb +8 -0
  81. data/app/models/decidim/challenges/challenge.rb +82 -0
  82. data/app/models/decidim/challenges/survey.rb +19 -0
  83. data/app/models/decidim/problems/problem.rb +118 -0
  84. data/app/models/decidim/sdgs/sdg.rb +47 -0
  85. data/app/models/decidim/solutions/application_record.rb +10 -0
  86. data/app/models/decidim/solutions/solution.rb +69 -0
  87. data/app/packs/entrypoints/decidim_challenges.js +4 -0
  88. data/app/packs/entrypoints/decidim_challenges.scss +1 -0
  89. data/app/packs/entrypoints/decidim_problems.js +1 -0
  90. data/app/packs/entrypoints/decidim_problems.scss +1 -0
  91. data/app/packs/entrypoints/decidim_sdgs.js +6 -0
  92. data/app/packs/entrypoints/decidim_sdgs.scss +3 -0
  93. data/app/packs/entrypoints/decidim_shared.js +1 -0
  94. data/app/packs/entrypoints/decidim_shared.scss +1 -0
  95. data/app/packs/entrypoints/decidim_solutions.js +4 -0
  96. data/app/packs/entrypoints/decidim_solutions.scss +1 -0
  97. data/app/packs/fonts/Oswald-Medium.ttf +0 -0
  98. data/app/packs/images/decidim/challenges/decidim_challenges_icon.svg +1 -0
  99. data/app/packs/images/decidim/sdgs/ods-01.svg +11 -0
  100. data/app/packs/images/decidim/sdgs/ods-02.svg +11 -0
  101. data/app/packs/images/decidim/sdgs/ods-03.svg +11 -0
  102. data/app/packs/images/decidim/sdgs/ods-04.svg +12 -0
  103. data/app/packs/images/decidim/sdgs/ods-05.svg +12 -0
  104. data/app/packs/images/decidim/sdgs/ods-06.svg +20 -0
  105. data/app/packs/images/decidim/sdgs/ods-07.svg +18 -0
  106. data/app/packs/images/decidim/sdgs/ods-08.svg +13 -0
  107. data/app/packs/images/decidim/sdgs/ods-09.svg +25 -0
  108. data/app/packs/images/decidim/sdgs/ods-10.svg +13 -0
  109. data/app/packs/images/decidim/sdgs/ods-11.svg +41 -0
  110. data/app/packs/images/decidim/sdgs/ods-12.svg +11 -0
  111. data/app/packs/images/decidim/sdgs/ods-13.svg +57 -0
  112. data/app/packs/images/decidim/sdgs/ods-14.svg +14 -0
  113. data/app/packs/images/decidim/sdgs/ods-15.svg +11 -0
  114. data/app/packs/images/decidim/sdgs/ods-16.svg +14 -0
  115. data/app/packs/images/decidim/sdgs/ods-17.svg +39 -0
  116. data/app/packs/images/decidim/sdgs/sdg-wheel.png +0 -0
  117. data/app/packs/images/decidim/sdgs/un_emblem_square.png +0 -0
  118. data/app/packs/src/decidim/challenges/add_challenge.js +3 -0
  119. data/app/packs/src/decidim/challenges/admin/challenges_form.js +3 -0
  120. data/app/packs/src/decidim/sdgs/filter.js +75 -0
  121. data/app/packs/stylesheets/decidim/challenges/challenges.scss +3 -0
  122. data/app/packs/stylesheets/decidim/problems/problems.scss +3 -0
  123. data/app/packs/stylesheets/decidim/sdgs/ods.scss +185 -0
  124. data/app/packs/stylesheets/decidim/sdgs/sdgs_filter/button.scss +27 -0
  125. data/app/packs/stylesheets/decidim/sdgs/sdgs_filter/modal.scss +60 -0
  126. data/app/packs/stylesheets/decidim/shared/_cards.scss +52 -0
  127. data/app/packs/stylesheets/decidim/shared/base.scss +9 -0
  128. data/app/packs/stylesheets/decidim/solutions/solutions.scss +3 -0
  129. data/app/permissions/decidim/challenges/admin/permissions.rb +88 -0
  130. data/app/permissions/decidim/challenges/permissions.rb +27 -0
  131. data/app/permissions/decidim/problems/admin/permissions.rb +52 -0
  132. data/app/permissions/decidim/problems/permissions.rb +16 -0
  133. data/app/permissions/decidim/solutions/admin/permissions.rb +58 -0
  134. data/app/permissions/decidim/solutions/permissions.rb +17 -0
  135. data/app/presenters/decidim/challenges/challenge_presenter.rb +134 -0
  136. data/app/presenters/decidim/problems/problem_presenter.rb +108 -0
  137. data/app/presenters/decidim/solutions/solution_presenter.rb +198 -0
  138. data/app/serializers/decidim/challenges/data_serializer.rb +46 -0
  139. data/app/serializers/decidim/challenges/survey_serializer.rb +37 -0
  140. data/app/types/decidim/challenges/challenge_type.rb +28 -0
  141. data/app/types/decidim/challenges/challenges_type.rb +32 -0
  142. data/app/types/decidim/problems/problem_type.rb +29 -0
  143. data/app/types/decidim/problems/problems_type.rb +32 -0
  144. data/app/types/decidim/solutions/solution_type.rb +25 -0
  145. data/app/types/decidim/solutions/solutions_type.rb +32 -0
  146. data/app/views/decidim/challenges/admin/challenges/_form.html.erb +78 -0
  147. data/app/views/decidim/challenges/admin/challenges/edit.html.erb +24 -0
  148. data/app/views/decidim/challenges/admin/challenges/index.html.erb +88 -0
  149. data/app/views/decidim/challenges/admin/challenges/new.html.erb +18 -0
  150. data/app/views/decidim/challenges/admin/surveys/_form.html.erb +9 -0
  151. data/app/views/decidim/challenges/admin/surveys/edit.html.erb +39 -0
  152. data/app/views/decidim/challenges/admin/surveys/index.html.erb +49 -0
  153. data/app/views/decidim/challenges/admin/surveys/show.html.erb +43 -0
  154. data/app/views/decidim/challenges/challenges/_challenge.html.erb +1 -0
  155. data/app/views/decidim/challenges/challenges/_challenges.html.erb +11 -0
  156. data/app/views/decidim/challenges/challenges/_related_problems.html.erb +14 -0
  157. data/app/views/decidim/challenges/challenges/_sidebar_data.html.erb +60 -0
  158. data/app/views/decidim/challenges/challenges/index.html.erb +29 -0
  159. data/app/views/decidim/challenges/challenges/index.js.erb +5 -0
  160. data/app/views/decidim/challenges/challenges/show.html.erb +41 -0
  161. data/app/views/decidim/problems/admin/problems/_form.html.erb +79 -0
  162. data/app/views/decidim/problems/admin/problems/edit.html.erb +24 -0
  163. data/app/views/decidim/problems/admin/problems/index.html.erb +93 -0
  164. data/app/views/decidim/problems/admin/problems/new.html.erb +18 -0
  165. data/app/views/decidim/problems/problems/_problem.html.erb +1 -0
  166. data/app/views/decidim/problems/problems/_problems.html.erb +11 -0
  167. data/app/views/decidim/problems/problems/_sidebar_data.html.erb +70 -0
  168. data/app/views/decidim/problems/problems/index.html.erb +28 -0
  169. data/app/views/decidim/problems/problems/index.js.erb +5 -0
  170. data/app/views/decidim/problems/problems/show.html.erb +38 -0
  171. data/app/views/decidim/sdgs/sdgs/_objectives.html.erb +320 -0
  172. data/app/views/decidim/sdgs/sdgs/_ods.html.erb +132 -0
  173. data/app/views/decidim/sdgs/sdgs/index.html.erb +64 -0
  174. data/app/views/decidim/sdgs/sdgs_filter/_filter_selector.html.erb +7 -0
  175. data/app/views/decidim/sdgs/sdgs_filter/_modal.html.erb +35 -0
  176. data/app/views/decidim/shared/_related_solutions.html.erb +14 -0
  177. data/app/views/decidim/solutions/admin/solutions/_documents.html.erb +13 -0
  178. data/app/views/decidim/solutions/admin/solutions/_form.html.erb +70 -0
  179. data/app/views/decidim/solutions/admin/solutions/_photos.html.erb +13 -0
  180. data/app/views/decidim/solutions/admin/solutions/edit.html.erb +24 -0
  181. data/app/views/decidim/solutions/admin/solutions/index.html.erb +97 -0
  182. data/app/views/decidim/solutions/admin/solutions/new.html.erb +18 -0
  183. data/app/views/decidim/solutions/admin/solutions/show.html.erb +114 -0
  184. data/app/views/decidim/solutions/solutions/_form.html.erb +22 -0
  185. data/app/views/decidim/solutions/solutions/_sidebar_data.html.erb +114 -0
  186. data/app/views/decidim/solutions/solutions/_solution.html.erb +1 -0
  187. data/app/views/decidim/solutions/solutions/_solutions.html.erb +13 -0
  188. data/app/views/decidim/solutions/solutions/index.html.erb +37 -0
  189. data/app/views/decidim/solutions/solutions/index.js.erb +5 -0
  190. data/app/views/decidim/solutions/solutions/new.html.erb +20 -0
  191. data/app/views/decidim/solutions/solutions/show.html.erb +72 -0
  192. data/config/assets.rb +27 -0
  193. data/config/i18n-tasks.yml +10 -0
  194. data/config/locales/ca.yml +1244 -0
  195. data/config/locales/cs.yml +668 -0
  196. data/config/locales/en.yml +1245 -0
  197. data/config/locales/es.yml +1250 -0
  198. data/config/locales/oc.yml +1229 -0
  199. data/db/migrate/20201014125000_create_decidim_challenges_challenges.rb +23 -0
  200. data/db/migrate/20201103155100_create_decidim_problems_problems.rb +25 -0
  201. data/db/migrate/20201116111200_create_decidim_solutions_solutions.rb +21 -0
  202. data/db/migrate/20210413083244_create_decidim_challenges_surveys.rb +14 -0
  203. data/db/migrate/20210413083507_add_survey_attributes_to_challenges.rb +7 -0
  204. data/db/migrate/20210413083604_add_questionnaire_to_existing_challenges.rb +15 -0
  205. data/db/migrate/20210413112229_add_challenge_reference_to_solutions.rb +7 -0
  206. data/db/migrate/20210427091033_remove_require_null_in_problems_for_solutions.rb +7 -0
  207. data/db/migrate/20220407110503_add_card_image_to_challenges.rb +7 -0
  208. data/db/migrate/20240919094714_add_public_fields_to_solutions.rb +10 -0
  209. data/lib/decidim/challenges/admin.rb +10 -0
  210. data/lib/decidim/challenges/admin_engine.rb +37 -0
  211. data/lib/decidim/challenges/component.rb +65 -0
  212. data/lib/decidim/challenges/engine.rb +39 -0
  213. data/lib/decidim/challenges/test/factories.rb +59 -0
  214. data/lib/decidim/challenges/version.rb +14 -0
  215. data/lib/decidim/challenges.rb +13 -0
  216. data/lib/decidim/problems/admin.rb +10 -0
  217. data/lib/decidim/problems/admin_engine.rb +25 -0
  218. data/lib/decidim/problems/component.rb +51 -0
  219. data/lib/decidim/problems/engine.rb +31 -0
  220. data/lib/decidim/problems/test/factories.rb +39 -0
  221. data/lib/decidim/sdgs/admin.rb +10 -0
  222. data/lib/decidim/sdgs/admin_engine.rb +28 -0
  223. data/lib/decidim/sdgs/component.rb +44 -0
  224. data/lib/decidim/sdgs/engine.rb +23 -0
  225. data/lib/decidim/sdgs/test/factories.rb +13 -0
  226. data/lib/decidim/solutions/admin.rb +10 -0
  227. data/lib/decidim/solutions/admin_engine.rb +25 -0
  228. data/lib/decidim/solutions/component.rb +52 -0
  229. data/lib/decidim/solutions/engine.rb +31 -0
  230. data/lib/decidim/solutions/test/factories.rb +28 -0
  231. metadata +316 -0
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Solutions
5
+ module Admin
6
+ # A command that sets a solution as unpublished.
7
+ class UnpublishSolution < Decidim::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # solution - A Solution that will be published
11
+ # current_user - the user performing the action
12
+ def initialize(solution, current_user)
13
+ super()
14
+ @solution = solution
15
+ @current_user = current_user
16
+ end
17
+
18
+ # Executes the command. Broadcasts these events:
19
+ #
20
+ # - :ok when everything is valid.
21
+ # - :invalid if the data wasn't valid and we couldn't proceed.
22
+ #
23
+ # Returns nothing.
24
+ def call
25
+ return broadcast(:invalid) if solution.nil? || !solution.published?
26
+
27
+ Decidim.traceability.perform_action!("unpublish", solution, current_user) do
28
+ solution.unpublish!
29
+ end
30
+
31
+ broadcast(:ok)
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :solution, :current_user
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Solutions
5
+ module Admin
6
+ # A command with all the business logic when a user updates a Solution.
7
+ class UpdateSolution < Decidim::Command
8
+ include Decidim::Challenges
9
+ include Decidim::CommandUtils
10
+
11
+ # Public: Initializes the command.
12
+ #
13
+ # form - A form object with the params.
14
+ # solution - the solution to update.
15
+ def initialize(form, solution)
16
+ super()
17
+ @form = form
18
+ @solution = solution
19
+ end
20
+
21
+ # Executes the command. Broadcasts these events:
22
+ #
23
+ # - :ok when everything is valid, together with the problem.
24
+ # - :invalid if the form wasn't valid and we couldn't proceed.
25
+ #
26
+ # Returns nothing.
27
+ def call
28
+ return broadcast(:invalid) if form.invalid?
29
+
30
+ transaction do
31
+ update_solution
32
+ end
33
+
34
+ broadcast(:ok, solution)
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :form, :solution
40
+
41
+ def update_solution
42
+ Decidim.traceability.update!(
43
+ solution,
44
+ form.current_user,
45
+ attributes:
46
+ )
47
+ end
48
+
49
+ def attributes
50
+ {
51
+ title: parsed_attribute(:title),
52
+ description: parsed_attribute(:description),
53
+ component: form.current_component,
54
+ decidim_problems_problem_id: form.decidim_problems_problem_id,
55
+ decidim_challenges_challenge_id: challenge_id,
56
+ tags: form.tags,
57
+ objectives: parsed_attribute(:objectives),
58
+ indicators: parsed_attribute(:indicators),
59
+ beneficiaries: parsed_attribute(:beneficiaries),
60
+ requirements: parsed_attribute(:requirements),
61
+ financing_type: parsed_attribute(:financing_type),
62
+ }
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Solutions
5
+ # A command with all the business logic when a user creates a new solution.
6
+ class CreateSolution < Decidim::Command
7
+ include ::Decidim::MultipleAttachmentsMethods
8
+ include Decidim::Challenges
9
+ include Decidim::CommandUtils
10
+
11
+ # Public: Initializes the command.
12
+ #
13
+ # form - A form object with the params.
14
+ def initialize(form)
15
+ super()
16
+ @form = form
17
+ end
18
+
19
+ # Executes the command. Broadcasts these events:
20
+ #
21
+ # - :ok when everything is valid, together with the solution.
22
+ # - :invalid if the form wasn't valid and we couldn't proceed.
23
+ #
24
+ # Returns nothing.
25
+ def call
26
+ return broadcast(:invalid) if form.invalid?
27
+
28
+ transaction do
29
+ create_solution!
30
+
31
+ if process_attachments?
32
+ build_attachments
33
+ create_attachments
34
+ end
35
+ end
36
+
37
+ broadcast(:ok, solution)
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :form, :solution, :attachment
43
+
44
+ def create_solution!
45
+ params = {
46
+ title: parsed_attribute(:title),
47
+ description: parsed_attribute(:description),
48
+ component: form.current_component,
49
+ decidim_challenges_challenge_id: challenge_id,
50
+ project_status: parsed_attribute(:project_status),
51
+ project_url: parsed_attribute(:project_url),
52
+ coordinating_entity: parsed_attribute(:coordinating_entity),
53
+ author_id: form.author_id,
54
+ }
55
+
56
+ @solution = Decidim.traceability.create!(
57
+ Decidim::Solutions::Solution,
58
+ form.current_user,
59
+ params,
60
+ visibility: "all"
61
+ )
62
+
63
+ @attached_to = @solution
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Challenges
7
+ module Admin
8
+ module Filterable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Admin::Filterable
13
+
14
+ private
15
+
16
+ def base_query
17
+ collection
18
+ end
19
+
20
+ def extra_filters
21
+ []
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Challenges
7
+ # Common logic to sorting resources
8
+ module OrderableChallenges
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Orderable
13
+
14
+ private
15
+
16
+ def available_orders
17
+ @available_orders ||= %w(random recent)
18
+ end
19
+
20
+ def default_order
21
+ "random"
22
+ end
23
+
24
+ def reorder(challenges)
25
+ case order
26
+ when "recent"
27
+ challenges.order("created_at DESC")
28
+ when "random"
29
+ challenges.order_randomly(random_seed)
30
+ else
31
+ challenges
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Problems
7
+ module Admin
8
+ module Filterable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Admin::Filterable
13
+
14
+ private
15
+
16
+ def base_query
17
+ collection
18
+ end
19
+
20
+ def extra_filters
21
+ []
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Problems
7
+ # Common logic to sorting resources
8
+ module OrderableProblems
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Orderable
13
+
14
+ private
15
+
16
+ def available_orders
17
+ @available_orders ||= %w(random recent)
18
+ end
19
+
20
+ def default_order
21
+ "random"
22
+ end
23
+
24
+ def reorder(problems)
25
+ case order
26
+ when "recent"
27
+ problems.order("created_at DESC")
28
+ when "random"
29
+ problems.order_randomly(random_seed)
30
+ else
31
+ problems
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Solutions
7
+ module Admin
8
+ module Filterable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Admin::Filterable
13
+
14
+ private
15
+
16
+ def base_query
17
+ collection
18
+ end
19
+
20
+ def extra_filters
21
+ []
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Solutions
7
+ # Common logic to sorting resources
8
+ module OrderableSolutions
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Orderable
13
+
14
+ private
15
+
16
+ def available_orders
17
+ @available_orders ||= %w(random recent)
18
+ end
19
+
20
+ def default_order
21
+ "random"
22
+ end
23
+
24
+ def reorder(solutions)
25
+ case order
26
+ when "recent"
27
+ solutions.order("created_at DESC")
28
+ when "random"
29
+ solutions.order_randomly(random_seed)
30
+ else
31
+ solutions
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module WithDefaultFilters
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ private
11
+
12
+ def default_filter_scope_params
13
+ return "all" unless current_component.participatory_space.scopes.any?
14
+
15
+ if current_component.participatory_space.scope
16
+ ["all", current_component.participatory_space.scope.id] + current_component.participatory_space.scope.children.map { |scope| scope.id.to_s }
17
+ else
18
+ %w(all global) + current_component.participatory_space.scopes.map { |scope| scope.id.to_s }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module WithSdgs
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ private
11
+
12
+ def has_sdgs?
13
+ sdgs_component = current_component.participatory_space.components.where(manifest_name: "sdgs").where.not(published_at: nil)
14
+
15
+ sdgs_component.present?
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ module Admin
6
+ # This controller is the abstract class from which all other controllers of
7
+ # this engine inherit.
8
+ #
9
+ # Note that it inherits from `Decidim::Admin::Components::BaseController`, which
10
+ # override its layout and provide all kinds of useful methods.
11
+ class ApplicationController < Decidim::Admin::Components::BaseController
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ module Admin
6
+ # Controller that allows managing challenge publications.
7
+ #
8
+ class ChallengePublicationsController < Decidim::Challenges::Admin::ApplicationController
9
+ def create
10
+ enforce_permission_to(:publish, :challenge, challenge:)
11
+
12
+ Decidim::Challenges::Admin::PublishChallenge.call(challenge, current_user) do
13
+ on(:ok) do
14
+ flash[:notice] = I18n.t("challenge_publications.create.success", scope: "decidim.challenges.admin")
15
+ end
16
+
17
+ on(:invalid) do
18
+ flash.now[:alert] = I18n.t("challenge_publications.create.error", scope: "decidim.challenges.admin")
19
+ end
20
+
21
+ redirect_back(fallback_location: challenges_path)
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ enforce_permission_to(:publish, :challenge, challenge:)
27
+
28
+ Decidim::Challenges::Admin::UnpublishChallenge.call(challenge, current_user) do
29
+ on(:ok) do
30
+ flash[:notice] = I18n.t("challenge_publications.destroy.success", scope: "decidim.challenges.admin")
31
+ end
32
+
33
+ on(:invalid) do
34
+ flash.now[:alert] = I18n.t("challenge_publications.destroy.error", scope: "decidim.challenges.admin")
35
+ end
36
+
37
+ redirect_back(fallback_location: challenges_path)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def collection
44
+ @collection ||= Challenge.where(component: current_component)
45
+ end
46
+
47
+ def challenge
48
+ @challenge ||= collection.find(params[:challenge_id])
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ module Admin
6
+ # Controller that allows managing admin challenges.
7
+ #
8
+ class ChallengesController < Decidim::Challenges::Admin::ApplicationController
9
+ include Decidim::ApplicationHelper
10
+
11
+ helper Challenges::ApplicationHelper
12
+ helper Decidim::Sdgs::SdgsHelper
13
+ helper Decidim::PaginateHelper
14
+
15
+ helper_method :challenges, :challenge, :form_presenter
16
+
17
+ def index
18
+ enforce_permission_to :read, :challenges
19
+ @challenges = challenges
20
+ end
21
+
22
+ def new
23
+ enforce_permission_to :create, :challenge
24
+ @form = form(Decidim::Challenges::Admin::ChallengesForm).instance
25
+ end
26
+
27
+ def edit
28
+ enforce_permission_to(:edit, :challenge, challenge:)
29
+ @form = form(Decidim::Challenges::Admin::ChallengesForm).from_model(challenge)
30
+ end
31
+
32
+ def create
33
+ enforce_permission_to :create, :challenge
34
+ @form = form(Decidim::Challenges::Admin::ChallengesForm).from_params(params)
35
+
36
+ Decidim::Challenges::Admin::CreateChallenge.call(@form) do
37
+ on(:ok) do
38
+ flash[:notice] = I18n.t("challenges.create.success", scope: "decidim.challenges.admin")
39
+ # maybe used together?
40
+ # Rails.application.routes.mounted_helpers
41
+ # ResourceLocatorPresenter.new(resource).edit
42
+ redirect_to challenges_path(assembly_slug: -1, component_id: -1)
43
+ end
44
+
45
+ on(:invalid) do
46
+ flash.now[:alert] = I18n.t("challenges.create.error", scope: "decidim.challenges.admin")
47
+ render action: "new"
48
+ end
49
+ end
50
+ end
51
+
52
+ def update
53
+ enforce_permission_to(:edit, :challenge, challenge:)
54
+ @form = form(Decidim::Challenges::Admin::ChallengesForm).from_params(params)
55
+
56
+ Decidim::Challenges::Admin::UpdateChallenge.call(@form, challenge) do
57
+ on(:ok) do |_challenge|
58
+ flash[:notice] = t("challenges.update.success", scope: "decidim.challenges.admin")
59
+ redirect_to challenges_path(assembly_slug: -1, component_id: -1)
60
+ end
61
+
62
+ on(:invalid) do
63
+ flash.now[:alert] = t("challenges.update.error", scope: "decidim.challenges.admin")
64
+ render :edit
65
+ end
66
+ end
67
+ end
68
+
69
+ def destroy
70
+ enforce_permission_to(:destroy, :challenge, challenge:)
71
+
72
+ Decidim::Challenges::Admin::DestroyChallenge.call(challenge, current_user) do
73
+ on(:ok) do
74
+ flash[:notice] = I18n.t("challenges.destroy.success", scope: "decidim.challenges.admin")
75
+ redirect_to challenges_path(assembly_slug: -1, component_id: -1)
76
+ end
77
+
78
+ on(:has_problems) do
79
+ redirect_to challenges_path, flash: { error: t("challenges.destroy.has_problems", scope: "decidim.challenges.admin") }
80
+ end
81
+
82
+ on(:invalid) do
83
+ redirect_to challenges_path, flash: { error: t("challenges.destroy.error", scope: "decidim.challenges.admin") }
84
+ end
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def collection
91
+ @collection ||= Challenge.where(component: current_component)
92
+ end
93
+
94
+ def challenges
95
+ @challenges ||= collection.page(params[:page]).per(10)
96
+ end
97
+
98
+ def challenge
99
+ @challenge ||= collection.find(params[:id])
100
+ end
101
+
102
+ def form_presenter
103
+ @form_presenter ||= present(@form, presenter_class: Decidim::Challenges::ChallengePresenter)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ module Admin
6
+ # This controller allows an admin to manage the form to be filled when an user answer a survey
7
+ class SurveyFormController < Admin::ApplicationController
8
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaireAnswers
9
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaire
10
+
11
+ def questionnaire_for
12
+ challenge
13
+ end
14
+
15
+ def public_url
16
+ Decidim::EngineRouter.main_proxy(current_component).answer_challenge_survey_path(challenge)
17
+ end
18
+
19
+ def questionnaire_participants_url
20
+ index_answers_challenge_surveys_path(challenge_id: challenge.id)
21
+ end
22
+
23
+ def answer_options_url(params)
24
+ answer_options_challenge_survey_path(**params)
25
+ end
26
+
27
+ def update_url
28
+ challenge_surveys_form_path(challenge_id: challenge.id)
29
+ end
30
+
31
+ def after_update_url
32
+ edit_challenge_surveys_path(challenge_id: challenge.id)
33
+ end
34
+
35
+ private
36
+
37
+ def challenge
38
+ @challenge ||= Challenge.where(component: current_component).find(params[:challenge_id])
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end