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,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ module Admin
6
+ # This controller allows an admin to manage surveys from a challenge
7
+ class SurveysController < Admin::ApplicationController
8
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaireAnswers
9
+ include Decidim::Forms::Admin::Concerns::HasQuestionnaire
10
+
11
+ def index
12
+ enforce_permission_to :index, :questionnaire_answers
13
+
14
+ @query = paginate(collection)
15
+ @participants = participants(@query)
16
+ @total = participants_query.count_participants
17
+ end
18
+
19
+ def show
20
+ enforce_permission_to :show, :questionnaire_answers
21
+
22
+ @participant = participant(participants_query.participant(params[:session_token]))
23
+ end
24
+
25
+ def edit
26
+ enforce_permission_to(:edit, :challenge, challenge:)
27
+
28
+ @form = ChallengeSurveysForm.from_model(challenge)
29
+ end
30
+
31
+ def update
32
+ enforce_permission_to(:edit, :challenge, challenge:)
33
+
34
+ @form = ChallengeSurveysForm.from_params(params).with_context(current_organization: challenge.organization, challenge:)
35
+
36
+ UpdateSurveys.call(@form, challenge) do
37
+ on(:ok) do
38
+ flash[:notice] = I18n.t("surveys.update.success", scope: "decidim.challenges.admin")
39
+ redirect_to challenges_path
40
+ end
41
+
42
+ on(:invalid) do
43
+ flash.now[:alert] = I18n.t("surveys.update.invalid", scope: "decidim.challenges.admin")
44
+ render action: "edit"
45
+ end
46
+ end
47
+ end
48
+
49
+ def export
50
+ enforce_permission_to(:export_surveys, :challenge, challenge:)
51
+
52
+ ExportChallengeSurveys.call(challenge, params[:format], current_user) do
53
+ on(:ok) do |export_data|
54
+ send_data export_data.read, type: "text/#{export_data.extension}", filename: export_data.filename("registrations")
55
+ end
56
+ end
57
+ end
58
+
59
+ def export_response
60
+ enforce_permission_to :export_answers, :questionnaire
61
+
62
+ session_token = params[:session_token]
63
+ answers = Decidim::Forms::QuestionnaireUserAnswers.for(questionnaire)
64
+ title = t("export_response.title", scope: i18n_scope, token: session_token)
65
+ Decidim::Forms::ExportQuestionnaireAnswersJob.perform_later(current_user, title, answers.select { |a| a.first.session_token == session_token })
66
+
67
+ flash[:notice] = t("decidim.admin.exports.notice")
68
+
69
+ redirect_back(fallback_location: questionnaire_participant_answers_url(session_token))
70
+ end
71
+
72
+ def questionnaire_participants_url
73
+ index_answers_challenge_surveys_path
74
+ end
75
+
76
+ def questionnaire_participant_answers_url(session_token)
77
+ show_answers_challenge_surveys_url(session_token:)
78
+ end
79
+
80
+ def questionnaire_export_response_url(session_token)
81
+ export_response_challenge_surveys_url(session_token:, format: "pdf")
82
+ end
83
+
84
+ def questionnaire_for
85
+ challenge
86
+ end
87
+
88
+ def public_url
89
+ Decidim::EngineRouter.main_proxy(current_component).answer_challenge_survey_path(challenge.id)
90
+ end
91
+
92
+ private
93
+
94
+ def challenge
95
+ @challenge ||= Challenge.where(component: current_component).find(params[:challenge_id])
96
+ end
97
+
98
+ def participants_query
99
+ Decidim::Forms::QuestionnaireParticipants.new(questionnaire)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ #
8
+ # Note that it inherits from `Decidim::Components::BaseController`, which
9
+ # override its layout and provide all kinds of useful methods.
10
+ class ApplicationController < Decidim::Components::BaseController
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ # Controller that allows browsing challenges.
6
+ #
7
+ class ChallengesController < Decidim::Challenges::ApplicationController
8
+ include Decidim::ApplicationHelper
9
+ include FilterResource
10
+ include Paginable
11
+ include OrderableChallenges
12
+ include WithSdgs
13
+ include WithDefaultFilters
14
+
15
+ helper Decidim::CheckBoxesTreeHelper
16
+ helper Decidim::Sdgs::SdgsHelper
17
+ helper Decidim::ShowFiltersHelper
18
+ helper Decidim::Challenges::ChallengesHelper
19
+ helper Decidim::PaginateHelper
20
+
21
+ helper_method :challenges, :has_sdgs?, :new_solution_path, :solutions_component, :default_filter_scope_params
22
+
23
+ def index
24
+ @challenges = search.result
25
+ @challenges = reorder(@challenges)
26
+ @challenges = paginate(@challenges)
27
+ end
28
+
29
+ def show
30
+ @challenge = Challenge.find(params[:id])
31
+ @challenge_scope = challenge_scope
32
+ @sdg = @challenge.sdg_code if @challenge.sdg_code.present?
33
+ @sdg_index = (1 + Decidim::Sdgs::Sdg.index_from_code(@challenge.sdg_code.to_sym)).to_s.rjust(2, "0") if @sdg
34
+ end
35
+
36
+ private
37
+
38
+ def challenge_scope
39
+ @challenge_scope ||= current_organization.scopes.find_by(id: @challenge.decidim_scope_id)
40
+ end
41
+
42
+ def challenges
43
+ @challenges ||= reorder(paginate(search.result))
44
+ end
45
+
46
+ def search_collection
47
+ ::Decidim::Challenges::Challenge.where(component: current_component).published
48
+ end
49
+
50
+ def default_filter_params
51
+ {
52
+ search_text_cont: "",
53
+ with_any_state: %w(proposal execution finished),
54
+ with_any_scope: default_filter_scope_params,
55
+ with_any_sdgs_codes: [],
56
+ related_to: "",
57
+ }
58
+ end
59
+
60
+ def new_solution_path
61
+ component = solutions_component
62
+ Decidim::EngineRouter.main_proxy(component).new_solution_path
63
+ end
64
+
65
+ def solutions_component
66
+ current_participatory_space.components.find_by(manifest_name: "solutions")
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Challenges
5
+ # Exposes the registration resource so users can answers surveys.
6
+ class SurveysController < Decidim::Challenges::ApplicationController
7
+ include Decidim::Forms::Concerns::HasQuestionnaire
8
+
9
+ def answer
10
+ enforce_permission_to(:answer, :challenge, challenge:)
11
+
12
+ @form = form(Decidim::Forms::QuestionnaireForm).from_params(params, session_token:)
13
+
14
+ SurveyChallenge.call(challenge, current_user, @form) do
15
+ on(:ok) do
16
+ flash[:notice] = I18n.t("surveys.create.success", scope: "decidim.challenges")
17
+ redirect_to after_answer_path
18
+ end
19
+
20
+ on(:invalid) do
21
+ flash.now[:alert] = I18n.t("surveys.create.invalid", scope: "decidim.challenges")
22
+ render template: "decidim/forms/questionnaires/show"
23
+ end
24
+
25
+ on(:invalid_form) do
26
+ flash.now[:alert] = I18n.t("answer.invalid", scope: i18n_flashes_scope)
27
+ render template: "decidim/forms/questionnaires/show"
28
+ end
29
+ end
30
+ end
31
+
32
+ def allow_answers?
33
+ challenge.survey_enabled?
34
+ end
35
+
36
+ def after_answer_path
37
+ challenge_path(challenge)
38
+ end
39
+
40
+ # You can implement this method in your controller to change the URL
41
+ # where the questionnaire will be submitted.
42
+ def update_url
43
+ answer_challenge_survey_path(challenge_id: challenge.id)
44
+ end
45
+
46
+ def questionnaire_for
47
+ challenge
48
+ end
49
+
50
+ private
51
+
52
+ def challenge
53
+ @challenge ||= Challenge.where(component: current_component).find(params[:challenge_id])
54
+ end
55
+
56
+ def redirect_after_path
57
+ redirect_to challenge_path(challenge)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Problems
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 Problems
5
+ module Admin
6
+ # Controller that allows managing problems publications.
7
+ #
8
+ class ProblemPublicationsController < Decidim::Problems::Admin::ApplicationController
9
+ def create
10
+ enforce_permission_to(:publish, :problem, problem:)
11
+
12
+ Decidim::Problems::Admin::PublishProblem.call(problem, current_user) do
13
+ on(:ok) do
14
+ flash[:notice] = I18n.t("problem_publications.create.success", scope: "decidim.problems.admin")
15
+ end
16
+
17
+ on(:invalid) do
18
+ flash.now[:alert] = I18n.t("problem_publications.create.error", scope: "decidim.problems.admin")
19
+ end
20
+
21
+ redirect_back(fallback_location: problems_path)
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ enforce_permission_to(:publish, :problem, problem:)
27
+
28
+ Decidim::Problems::Admin::UnpublishProblem.call(problem, current_user) do
29
+ on(:ok) do
30
+ flash[:notice] = I18n.t("problem_publications.destroy.success", scope: "decidim.problems.admin")
31
+ end
32
+
33
+ on(:invalid) do
34
+ flash.now[:alert] = I18n.t("problem_publications.destroy.error", scope: "decidim.problems.admin")
35
+ end
36
+
37
+ redirect_back(fallback_location: problems_path)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def collection
44
+ @collection ||= Problem.where(component: current_component)
45
+ end
46
+
47
+ def problem
48
+ @problem ||= collection.find(params[:problem_id])
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Problems
5
+ module Admin
6
+ # Controller that allows managing admin problems.
7
+ #
8
+ class ProblemsController < Decidim::Problems::Admin::ApplicationController
9
+ helper Challenges::ApplicationHelper
10
+ helper Decidim::PaginateHelper
11
+
12
+ helper_method :problems, :problem, :form_presenter
13
+
14
+ def index
15
+ enforce_permission_to :read, :problems
16
+ @problems = problems
17
+ end
18
+
19
+ def new
20
+ enforce_permission_to :create, :problem
21
+ @form = form(Decidim::Problems::Admin::ProblemsForm).instance
22
+ end
23
+
24
+ def edit
25
+ enforce_permission_to(:edit, :problem, problem:)
26
+ @form = form(Decidim::Problems::Admin::ProblemsForm).from_model(problem)
27
+ end
28
+
29
+ def create
30
+ enforce_permission_to :create, :problem
31
+ @form = form(Decidim::Problems::Admin::ProblemsForm).from_params(params)
32
+
33
+ Decidim::Problems::Admin::CreateProblem.call(@form) do
34
+ on(:ok) do
35
+ flash[:notice] = I18n.t("problems.create.success", scope: "decidim.problems.admin")
36
+ redirect_to problems_path(assembly_slug: -1, component_id: -1)
37
+ end
38
+
39
+ on(:invalid) do
40
+ flash.now[:alert] = I18n.t("problems.create.error", scope: "decidim.problems.admin")
41
+ render action: "new"
42
+ end
43
+ end
44
+ end
45
+
46
+ def update
47
+ enforce_permission_to(:edit, :problem, problem:)
48
+ @form = form(Decidim::Problems::Admin::ProblemsForm).from_params(params)
49
+
50
+ Decidim::Problems::Admin::UpdateProblem.call(@form, problem) do
51
+ on(:ok) do |_problem|
52
+ flash[:notice] = t("problems.update.success", scope: "decidim.problems.admin")
53
+ redirect_to problems_path(assembly_slug: -1, component_id: -1)
54
+ end
55
+
56
+ on(:invalid) do
57
+ flash.now[:alert] = t("problems.update.error", scope: "decidim.problems.admin")
58
+ render :edit
59
+ end
60
+ end
61
+ end
62
+
63
+ def destroy
64
+ enforce_permission_to(:destroy, :problem, problem:)
65
+
66
+ Decidim::Problems::Admin::DestroyProblem.call(problem, current_user) do
67
+ on(:ok) do
68
+ flash[:notice] = I18n.t("problems.destroy.success", scope: "decidim.problems.admin")
69
+ redirect_to problems_path(assembly_slug: -1, component_id: -1)
70
+ end
71
+
72
+ on(:has_solutions) do
73
+ redirect_to problems_path, flash: { error: t("problems.destroy.has_solutions", scope: "decidim.problems.admin") }
74
+ end
75
+
76
+ on(:invalid) do
77
+ redirect_to problems_path, flash: { error: t("problems.destroy.error", scope: "decidim.problems.admin") }
78
+ end
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def collection
85
+ @collection ||= Problem.where(component: current_component)
86
+ end
87
+
88
+ def problems
89
+ @problems ||= collection.page(params[:page]).per(10)
90
+ end
91
+
92
+ def problem
93
+ @problem ||= collection.find(params[:id])
94
+ end
95
+
96
+ def form_presenter
97
+ @form_presenter ||= present(@form, presenter_class: Decidim::Problems::ProblemPresenter)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Problems
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ #
8
+ # Note that it inherits from `Decidim::Components::BaseController`, which
9
+ # override its layout and provide all kinds of useful methods.
10
+ class ApplicationController < Decidim::Components::BaseController
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Problems
5
+ # Controller that allows browsing problems.
6
+ #
7
+ class ProblemsController < Decidim::Problems::ApplicationController
8
+ include Decidim::ApplicationHelper
9
+ include FilterResource
10
+ include Paginable
11
+ include OrderableProblems
12
+ include WithSdgs
13
+ include WithDefaultFilters
14
+
15
+ helper Decidim::CheckBoxesTreeHelper
16
+ helper Decidim::Sdgs::SdgsHelper
17
+ helper Decidim::ShowFiltersHelper
18
+ helper ProblemsHelper
19
+ helper Decidim::Challenges::ApplicationHelper
20
+ helper Decidim::PaginateHelper
21
+
22
+ helper_method :problems, :has_sdgs?, :default_filter_scope_params
23
+
24
+ def index
25
+ @problems = search.result
26
+ @problems = reorder(@problems)
27
+ @problems = paginate(@problems)
28
+ end
29
+
30
+ def show
31
+ @problem = Decidim::Problems::Problem.find(params[:id])
32
+ @challenge_scope = challenge_scope
33
+ end
34
+
35
+ private
36
+
37
+ def challenge_scope
38
+ @challenge_scope ||= current_organization.scopes.find_by(id: @problem.challenge.decidim_scope_id)
39
+ end
40
+
41
+ def default_filter_params
42
+ {
43
+ search_text_cont: "",
44
+ with_any_state: %w(proposal execution finished),
45
+ with_any_sectorial_scope: default_filter_scope_params,
46
+ with_any_technological_scope: default_filter_scope_params,
47
+ with_any_territorial_scope: default_filter_scope_params,
48
+ with_any_sdgs_codes: [],
49
+ related_to: "",
50
+ }
51
+ end
52
+
53
+ def problems
54
+ @problems ||= order(paginate(search.result))
55
+ end
56
+
57
+ def search_collection
58
+ ::Decidim::Problems::Problem.where(component: current_component).published
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Sdgs
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,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Sdgs
5
+ module Admin
6
+ # Controller that allows managing admin Sdgs.
7
+ #
8
+ class SdgsController < Decidim::Sdgs::Admin::ApplicationController
9
+ include Decidim::ApplicationHelper
10
+
11
+ def index
12
+ flash[:alert] = t(".cant_manage")
13
+ redirect_to decidim_admin_participatory_processes.components_path(current_participatory_space)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Sdgs
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ #
8
+ # Note that it inherits from `Decidim::Components::BaseController`, which
9
+ # override its layout and provide all kinds of useful methods.
10
+ class ApplicationController < Decidim::Components::BaseController
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Sdgs
5
+ # Exposes the SustainableDevelopmentGoal resource so users can view and create them.
6
+ class SdgsController < Decidim::Sdgs::ApplicationController
7
+ helper_method :sdgs, :sdg
8
+
9
+ def index; end
10
+
11
+ def show; end
12
+
13
+ private
14
+
15
+ def sdg
16
+ @sdg ||= sdgs.find(params[:id])
17
+ end
18
+
19
+ def sdgs
20
+ @sdgs ||= Sdg.where(component: current_component)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Solutions
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 Solutions
5
+ module Admin
6
+ # Controller that allows managing solutions publications.
7
+ #
8
+ class SolutionPublicationsController < Decidim::Solutions::Admin::ApplicationController
9
+ def create
10
+ enforce_permission_to(:publish, :solution, solution:)
11
+
12
+ Decidim::Solutions::Admin::PublishSolution.call(solution, current_user) do
13
+ on(:ok) do
14
+ flash[:notice] = I18n.t("solution_publications.create.success", scope: "decidim.solutions.admin")
15
+ end
16
+
17
+ on(:invalid) do
18
+ flash.now[:alert] = I18n.t("solution_publications.create.error", scope: "decidim.solutions.admin")
19
+ end
20
+
21
+ redirect_back(fallback_location: solutions_path)
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ enforce_permission_to(:publish, :solution, solution:)
27
+
28
+ Decidim::Solutions::Admin::UnpublishSolution.call(solution, current_user) do
29
+ on(:ok) do
30
+ flash[:notice] = I18n.t("solution_publications.destroy.success", scope: "decidim.solutions.admin")
31
+ end
32
+
33
+ on(:invalid) do
34
+ flash.now[:alert] = I18n.t("solution_publications.destroy.error", scope: "decidim.solutions.admin")
35
+ end
36
+
37
+ redirect_back(fallback_location: solutions_path)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def collection
44
+ @collection ||= Solution.where(component: current_component)
45
+ end
46
+
47
+ def solution
48
+ @solution ||= collection.find(params[:solution_id])
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end