decidim-enhanced_textwork 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 (441) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +64 -0
  3. data/Rakefile +3 -0
  4. data/app/cells/decidim/enhanced_textwork/amendment/show.erb +14 -0
  5. data/app/cells/decidim/enhanced_textwork/amendment_cell.rb +39 -0
  6. data/app/cells/decidim/enhanced_textwork/collaborative_draft_cell.rb +49 -0
  7. data/app/cells/decidim/enhanced_textwork/collaborative_draft_link_to_paragraph/show.erb +13 -0
  8. data/app/cells/decidim/enhanced_textwork/collaborative_draft_link_to_paragraph_cell.rb +57 -0
  9. data/app/cells/decidim/enhanced_textwork/collaborative_draft_m/footer.erb +6 -0
  10. data/app/cells/decidim/enhanced_textwork/collaborative_draft_m/tags.erb +1 -0
  11. data/app/cells/decidim/enhanced_textwork/collaborative_draft_m_cell.rb +44 -0
  12. data/app/cells/decidim/enhanced_textwork/collaborative_drafts/reported_content/show.erb +3 -0
  13. data/app/cells/decidim/enhanced_textwork/collaborative_drafts/reported_content_cell.rb +15 -0
  14. data/app/cells/decidim/enhanced_textwork/comments/show.erb +33 -0
  15. data/app/cells/decidim/enhanced_textwork/comments_cell.rb +8 -0
  16. data/app/cells/decidim/enhanced_textwork/content_blocks/highlighted_paragraphs/elements.erb +5 -0
  17. data/app/cells/decidim/enhanced_textwork/content_blocks/highlighted_paragraphs/heading.erb +1 -0
  18. data/app/cells/decidim/enhanced_textwork/content_blocks/highlighted_paragraphs_cell.rb +19 -0
  19. data/app/cells/decidim/enhanced_textwork/cost_report/show.erb +35 -0
  20. data/app/cells/decidim/enhanced_textwork/cost_report_cell.rb +42 -0
  21. data/app/cells/decidim/enhanced_textwork/highlighted_paragraphs/show.erb +3 -0
  22. data/app/cells/decidim/enhanced_textwork/highlighted_paragraphs_cell.rb +25 -0
  23. data/app/cells/decidim/enhanced_textwork/highlighted_paragraphs_for_component/show.erb +19 -0
  24. data/app/cells/decidim/enhanced_textwork/highlighted_paragraphs_for_component_cell.rb +41 -0
  25. data/app/cells/decidim/enhanced_textwork/irreversible_action_modal/show.erb +27 -0
  26. data/app/cells/decidim/enhanced_textwork/irreversible_action_modal_cell.rb +80 -0
  27. data/app/cells/decidim/enhanced_textwork/paragraph_activity_cell.rb +35 -0
  28. data/app/cells/decidim/enhanced_textwork/paragraph_cell.rb +53 -0
  29. data/app/cells/decidim/enhanced_textwork/paragraph_link_to_collaborative_draft_cell.rb +26 -0
  30. data/app/cells/decidim/enhanced_textwork/paragraph_link_to_rejected_emendation/show.erb +9 -0
  31. data/app/cells/decidim/enhanced_textwork/paragraph_link_to_rejected_emendation_cell.rb +34 -0
  32. data/app/cells/decidim/enhanced_textwork/paragraph_linked_resources/show.erb +9 -0
  33. data/app/cells/decidim/enhanced_textwork/paragraph_linked_resources_cell.rb +14 -0
  34. data/app/cells/decidim/enhanced_textwork/paragraph_m/footer.erb +26 -0
  35. data/app/cells/decidim/enhanced_textwork/paragraph_m/tags.erb +1 -0
  36. data/app/cells/decidim/enhanced_textwork/paragraph_m_cell.rb +152 -0
  37. data/app/cells/decidim/enhanced_textwork/paragraph_tags/show.erb +33 -0
  38. data/app/cells/decidim/enhanced_textwork/paragraph_tags_cell.rb +35 -0
  39. data/app/cells/decidim/enhanced_textwork/paragraphs_picker/paragraphs.erb +12 -0
  40. data/app/cells/decidim/enhanced_textwork/paragraphs_picker/show.erb +14 -0
  41. data/app/cells/decidim/enhanced_textwork/paragraphs_picker_cell.rb +72 -0
  42. data/app/cells/decidim/enhanced_textwork/participatory_text_paragraph/buttons.erb +33 -0
  43. data/app/cells/decidim/enhanced_textwork/participatory_text_paragraph/show.erb +38 -0
  44. data/app/cells/decidim/enhanced_textwork/participatory_text_paragraph_cell.rb +104 -0
  45. data/app/cells/decidim/enhanced_textwork/reported_content/show.erb +4 -0
  46. data/app/cells/decidim/enhanced_textwork/reported_content_cell.rb +13 -0
  47. data/app/commands/decidim/enhanced_textwork/accept_access_to_collaborative_draft.rb +70 -0
  48. data/app/commands/decidim/enhanced_textwork/admin/answer_paragraph.rb +74 -0
  49. data/app/commands/decidim/enhanced_textwork/admin/assign_paragraphs_to_valuator.rb +61 -0
  50. data/app/commands/decidim/enhanced_textwork/admin/create_paragraph.rb +97 -0
  51. data/app/commands/decidim/enhanced_textwork/admin/create_paragraph_note.rb +67 -0
  52. data/app/commands/decidim/enhanced_textwork/admin/destroy_paragraph.rb +32 -0
  53. data/app/commands/decidim/enhanced_textwork/admin/discard_participatory_text.rb +40 -0
  54. data/app/commands/decidim/enhanced_textwork/admin/import_from_editor_participatory_text.rb +53 -0
  55. data/app/commands/decidim/enhanced_textwork/admin/import_paragraphs.rb +101 -0
  56. data/app/commands/decidim/enhanced_textwork/admin/import_participatory_text.rb +55 -0
  57. data/app/commands/decidim/enhanced_textwork/admin/merge_paragraphs.rb +69 -0
  58. data/app/commands/decidim/enhanced_textwork/admin/notify_paragraph_answer.rb +85 -0
  59. data/app/commands/decidim/enhanced_textwork/admin/publish_answers.rb +67 -0
  60. data/app/commands/decidim/enhanced_textwork/admin/publish_participatory_text.rb +81 -0
  61. data/app/commands/decidim/enhanced_textwork/admin/split_paragraphs.rb +67 -0
  62. data/app/commands/decidim/enhanced_textwork/admin/unassign_paragraphs_from_valuator.rb +62 -0
  63. data/app/commands/decidim/enhanced_textwork/admin/update_paragraph.rb +86 -0
  64. data/app/commands/decidim/enhanced_textwork/admin/update_paragraph_category.rb +68 -0
  65. data/app/commands/decidim/enhanced_textwork/admin/update_paragraph_scope.rb +75 -0
  66. data/app/commands/decidim/enhanced_textwork/admin/update_participatory_text.rb +68 -0
  67. data/app/commands/decidim/enhanced_textwork/create_collaborative_draft.rb +81 -0
  68. data/app/commands/decidim/enhanced_textwork/create_paragraph.rb +106 -0
  69. data/app/commands/decidim/enhanced_textwork/destroy_paragraph.rb +33 -0
  70. data/app/commands/decidim/enhanced_textwork/gallery_methods.rb +18 -0
  71. data/app/commands/decidim/enhanced_textwork/hashtags_methods.rb +36 -0
  72. data/app/commands/decidim/enhanced_textwork/publish_collaborative_draft.rb +93 -0
  73. data/app/commands/decidim/enhanced_textwork/publish_paragraph.rb +105 -0
  74. data/app/commands/decidim/enhanced_textwork/reject_access_to_collaborative_draft.rb +62 -0
  75. data/app/commands/decidim/enhanced_textwork/request_access_to_collaborative_draft.rb +49 -0
  76. data/app/commands/decidim/enhanced_textwork/unvote_paragraph.rb +65 -0
  77. data/app/commands/decidim/enhanced_textwork/update_collaborative_draft.rb +63 -0
  78. data/app/commands/decidim/enhanced_textwork/update_paragraph.rb +135 -0
  79. data/app/commands/decidim/enhanced_textwork/vote_paragraph.rb +77 -0
  80. data/app/commands/decidim/enhanced_textwork/withdraw_collaborative_draft.rb +65 -0
  81. data/app/commands/decidim/enhanced_textwork/withdraw_paragraph.rb +50 -0
  82. data/app/controllers/concerns/decidim/enhanced_textwork/admin/filterable.rb +82 -0
  83. data/app/controllers/concerns/decidim/enhanced_textwork/admin/picker.rb +21 -0
  84. data/app/controllers/concerns/decidim/enhanced_textwork/collaborative_orderable.rb +42 -0
  85. data/app/controllers/concerns/decidim/enhanced_textwork/orderable.rb +78 -0
  86. data/app/controllers/decidim/enhanced_textwork/admin/application_controller.rb +16 -0
  87. data/app/controllers/decidim/enhanced_textwork/admin/paragraph_answers_controller.rb +50 -0
  88. data/app/controllers/decidim/enhanced_textwork/admin/paragraph_notes_controller.rb +39 -0
  89. data/app/controllers/decidim/enhanced_textwork/admin/paragraphs_controller.rb +237 -0
  90. data/app/controllers/decidim/enhanced_textwork/admin/paragraphs_imports_controller.rb +33 -0
  91. data/app/controllers/decidim/enhanced_textwork/admin/paragraphs_merges_controller.rb +30 -0
  92. data/app/controllers/decidim/enhanced_textwork/admin/paragraphs_splits_controller.rb +30 -0
  93. data/app/controllers/decidim/enhanced_textwork/admin/participatory_texts_controller.rb +128 -0
  94. data/app/controllers/decidim/enhanced_textwork/admin/valuation_assignments_controller.rb +58 -0
  95. data/app/controllers/decidim/enhanced_textwork/application_controller.rb +31 -0
  96. data/app/controllers/decidim/enhanced_textwork/collaborative_draft_collaborator_requests_controller.rb +53 -0
  97. data/app/controllers/decidim/enhanced_textwork/collaborative_drafts_controller.rb +161 -0
  98. data/app/controllers/decidim/enhanced_textwork/paragraph_votes_controller.rb +65 -0
  99. data/app/controllers/decidim/enhanced_textwork/paragraphs_controller.rb +316 -0
  100. data/app/controllers/decidim/enhanced_textwork/versions_controller.rb +21 -0
  101. data/app/controllers/decidim/enhanced_textwork/widgets_controller.rb +19 -0
  102. data/app/events/decidim/enhanced_textwork/accepted_paragraph_event.rb +17 -0
  103. data/app/events/decidim/enhanced_textwork/admin/paragraph_note_created_event.rb +27 -0
  104. data/app/events/decidim/enhanced_textwork/admin/update_paragraph_category_event.rb +11 -0
  105. data/app/events/decidim/enhanced_textwork/admin/update_paragraph_scope_event.rb +11 -0
  106. data/app/events/decidim/enhanced_textwork/collaborative_draft_access_accepted_event.rb +8 -0
  107. data/app/events/decidim/enhanced_textwork/collaborative_draft_access_rejected_event.rb +8 -0
  108. data/app/events/decidim/enhanced_textwork/collaborative_draft_access_request_event.rb +27 -0
  109. data/app/events/decidim/enhanced_textwork/collaborative_draft_access_requested_event.rb +8 -0
  110. data/app/events/decidim/enhanced_textwork/collaborative_draft_access_requester_accepted_event.rb +8 -0
  111. data/app/events/decidim/enhanced_textwork/collaborative_draft_access_requester_rejected_event.rb +8 -0
  112. data/app/events/decidim/enhanced_textwork/collaborative_draft_withdrawn_event.rb +29 -0
  113. data/app/events/decidim/enhanced_textwork/creation_enabled_event.rb +8 -0
  114. data/app/events/decidim/enhanced_textwork/endorsing_enabled_event.rb +8 -0
  115. data/app/events/decidim/enhanced_textwork/evaluating_paragraph_event.rb +11 -0
  116. data/app/events/decidim/enhanced_textwork/paragraph_endorsed_event.rb +33 -0
  117. data/app/events/decidim/enhanced_textwork/paragraph_mentioned_event.rb +21 -0
  118. data/app/events/decidim/enhanced_textwork/publish_paragraph_event.rb +25 -0
  119. data/app/events/decidim/enhanced_textwork/rejected_paragraph_event.rb +17 -0
  120. data/app/events/decidim/enhanced_textwork/voting_enabled_event.rb +8 -0
  121. data/app/forms/decidim/enhanced_textwork/accept_access_to_collaborative_draft_form.rb +10 -0
  122. data/app/forms/decidim/enhanced_textwork/access_to_collaborative_draft_form.rb +33 -0
  123. data/app/forms/decidim/enhanced_textwork/admin/import_editor_participatory_text_form.rb +35 -0
  124. data/app/forms/decidim/enhanced_textwork/admin/import_participatory_text_form.rb +68 -0
  125. data/app/forms/decidim/enhanced_textwork/admin/paragraph_answer_form.rb +44 -0
  126. data/app/forms/decidim/enhanced_textwork/admin/paragraph_base_form.rb +137 -0
  127. data/app/forms/decidim/enhanced_textwork/admin/paragraph_form.rb +32 -0
  128. data/app/forms/decidim/enhanced_textwork/admin/paragraph_note_form.rb +16 -0
  129. data/app/forms/decidim/enhanced_textwork/admin/paragraphs_fork_form.rb +63 -0
  130. data/app/forms/decidim/enhanced_textwork/admin/paragraphs_import_form.rb +67 -0
  131. data/app/forms/decidim/enhanced_textwork/admin/paragraphs_merge_form.rb +13 -0
  132. data/app/forms/decidim/enhanced_textwork/admin/paragraphs_split_form.rb +12 -0
  133. data/app/forms/decidim/enhanced_textwork/admin/participatory_text_paragraph_form.rb +20 -0
  134. data/app/forms/decidim/enhanced_textwork/admin/preview_participatory_text_form.rb +21 -0
  135. data/app/forms/decidim/enhanced_textwork/admin/valuation_assignment_form.rb +37 -0
  136. data/app/forms/decidim/enhanced_textwork/collaborative_draft_form.rb +20 -0
  137. data/app/forms/decidim/enhanced_textwork/paragraph_form.rb +126 -0
  138. data/app/forms/decidim/enhanced_textwork/paragraph_wizard_create_step_form.rb +41 -0
  139. data/app/forms/decidim/enhanced_textwork/reject_access_to_collaborative_draft_form.rb +9 -0
  140. data/app/forms/decidim/enhanced_textwork/request_access_to_collaborative_draft_form.rb +20 -0
  141. data/app/helpers/decidim/enhanced_textwork/admin/filterable_helper.rb +17 -0
  142. data/app/helpers/decidim/enhanced_textwork/admin/paragraph_bulk_actions_helper.rb +35 -0
  143. data/app/helpers/decidim/enhanced_textwork/admin/paragraph_rankings_helper.rb +63 -0
  144. data/app/helpers/decidim/enhanced_textwork/admin/paragraphs_helper.rb +144 -0
  145. data/app/helpers/decidim/enhanced_textwork/admin/paragraphs_picker_helper.rb +30 -0
  146. data/app/helpers/decidim/enhanced_textwork/application_helper.rb +191 -0
  147. data/app/helpers/decidim/enhanced_textwork/collaborative_draft_cells_helper.rb +48 -0
  148. data/app/helpers/decidim/enhanced_textwork/collaborative_draft_helper.rb +29 -0
  149. data/app/helpers/decidim/enhanced_textwork/control_version_helper.rb +12 -0
  150. data/app/helpers/decidim/enhanced_textwork/map_helper.rb +48 -0
  151. data/app/helpers/decidim/enhanced_textwork/paragraph_cells_helper.rb +75 -0
  152. data/app/helpers/decidim/enhanced_textwork/paragraph_votes_helper.rb +103 -0
  153. data/app/helpers/decidim/enhanced_textwork/paragraph_wizard_helper.rb +140 -0
  154. data/app/helpers/decidim/enhanced_textwork/paragraphs_helper.rb +63 -0
  155. data/app/helpers/decidim/enhanced_textwork/participatory_texts_helper.rb +49 -0
  156. data/app/jobs/decidim/enhanced_textwork/notify_paragraphs_mentioned_job.rb +27 -0
  157. data/app/jobs/decidim/enhanced_textwork/settings_change_job.rb +50 -0
  158. data/app/models/decidim/enhanced_textwork/application_record.rb +10 -0
  159. data/app/models/decidim/enhanced_textwork/collaborative_draft.rb +73 -0
  160. data/app/models/decidim/enhanced_textwork/collaborative_draft_collaborator_request.rb +13 -0
  161. data/app/models/decidim/enhanced_textwork/paragraph.rb +411 -0
  162. data/app/models/decidim/enhanced_textwork/paragraph_note.rb +20 -0
  163. data/app/models/decidim/enhanced_textwork/paragraph_vote.rb +50 -0
  164. data/app/models/decidim/enhanced_textwork/participatory_text.rb +16 -0
  165. data/app/models/decidim/enhanced_textwork/valuation_assignment.rb +24 -0
  166. data/app/packs/documents/decidim/enhanced_textwork/participatory_texts/participatory_text.md +52 -0
  167. data/app/packs/documents/decidim/enhanced_textwork/participatory_texts/participatory_text.odt +0 -0
  168. data/app/packs/entrypoints/decidim_enhanced_textwork.js +17 -0
  169. data/app/packs/entrypoints/decidim_enhanced_textwork_admin.js +3 -0
  170. data/app/packs/images/decidim/enhanced_textwork/decidim_paragraphs.svg +1 -0
  171. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_accepted_paragraphs.svg +1 -0
  172. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_paragraph_votes.svg +1 -0
  173. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_paragraphs.svg +1 -0
  174. data/app/packs/src/decidim/enhanced_textwork/add_paragraph.js +49 -0
  175. data/app/packs/src/decidim/enhanced_textwork/admin/paragraphs.js +143 -0
  176. data/app/packs/src/decidim/enhanced_textwork/admin/paragraphs_form.js +29 -0
  177. data/app/packs/src/decidim/enhanced_textwork/admin/paragraphs_picker.js +35 -0
  178. data/app/packs/src/decidim/enhanced_textwork/toggle_element.js +21 -0
  179. data/app/packs/src/decidim/enhanced_textwork/utils.js +11 -0
  180. data/app/packs/stylesheets/decidim/enhanced_textwork/_paragraphs.scss +208 -0
  181. data/app/packs/stylesheets/decidim/enhanced_textwork/paragraphs/_preview.scss +3 -0
  182. data/app/permissions/decidim/enhanced_textwork/admin/permissions.rb +147 -0
  183. data/app/permissions/decidim/enhanced_textwork/permissions.rb +163 -0
  184. data/app/presenters/decidim/enhanced_textwork/admin_log/paragraph_note_presenter.rb +39 -0
  185. data/app/presenters/decidim/enhanced_textwork/admin_log/paragraph_presenter.rb +51 -0
  186. data/app/presenters/decidim/enhanced_textwork/admin_log/valuation_assignment_presenter.rb +51 -0
  187. data/app/presenters/decidim/enhanced_textwork/admin_log/value_types/paragraph_state_presenter.rb +17 -0
  188. data/app/presenters/decidim/enhanced_textwork/admin_log/value_types/paragraph_title_body_presenter.rb +23 -0
  189. data/app/presenters/decidim/enhanced_textwork/admin_log/value_types/valuator_role_user_presenter.rb +19 -0
  190. data/app/presenters/decidim/enhanced_textwork/collaborative_draft_presenter.rb +25 -0
  191. data/app/presenters/decidim/enhanced_textwork/log/resource_presenter.rb +22 -0
  192. data/app/presenters/decidim/enhanced_textwork/log/valuation_assignment_presenter.rb +22 -0
  193. data/app/presenters/decidim/enhanced_textwork/official_author_presenter.rb +14 -0
  194. data/app/presenters/decidim/enhanced_textwork/paragraph_presenter.rb +146 -0
  195. data/app/queries/decidim/enhanced_textwork/filtered_paragraphs.rb +37 -0
  196. data/app/queries/decidim/enhanced_textwork/metrics/accepted_paragraphs_metric_manage.rb +32 -0
  197. data/app/queries/decidim/enhanced_textwork/metrics/endorsements_metric_manage.rb +58 -0
  198. data/app/queries/decidim/enhanced_textwork/metrics/paragraph_followers_metric_measure.rb +58 -0
  199. data/app/queries/decidim/enhanced_textwork/metrics/paragraph_participants_metric_measure.rb +74 -0
  200. data/app/queries/decidim/enhanced_textwork/metrics/paragraphs_metric_manage.rb +48 -0
  201. data/app/queries/decidim/enhanced_textwork/metrics/votes_metric_manage.rb +52 -0
  202. data/app/queries/decidim/enhanced_textwork/similar_paragraphs.rb +67 -0
  203. data/app/services/decidim/enhanced_textwork/collaborative_draft_search.rb +59 -0
  204. data/app/services/decidim/enhanced_textwork/diff_renderer.rb +74 -0
  205. data/app/services/decidim/enhanced_textwork/paragraph_builder.rb +132 -0
  206. data/app/services/decidim/enhanced_textwork/paragraph_search.rb +85 -0
  207. data/app/validators/paragraph_length_validator.rb +40 -0
  208. data/app/views/decidim/enhanced_textwork/admin/paragraph_answers/_form.html.erb +35 -0
  209. data/app/views/decidim/enhanced_textwork/admin/paragraph_notes/_form.html.erb +8 -0
  210. data/app/views/decidim/enhanced_textwork/admin/paragraph_notes/_paragraph_notes.html.erb +45 -0
  211. data/app/views/decidim/enhanced_textwork/admin/paragraphs/_bulk-actions.html.erb +33 -0
  212. data/app/views/decidim/enhanced_textwork/admin/paragraphs/_form.html.erb +101 -0
  213. data/app/views/decidim/enhanced_textwork/admin/paragraphs/_js-callout.html.erb +6 -0
  214. data/app/views/decidim/enhanced_textwork/admin/paragraphs/_paragraph-tr.html.erb +76 -0
  215. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_assign_to_valuator.html.erb +15 -0
  216. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_dropdown.html.erb +56 -0
  217. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_merge.html.erb +15 -0
  218. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_publish_answers.html.erb +14 -0
  219. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_recategorize.html.erb +15 -0
  220. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_scope-change.html.erb +25 -0
  221. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_split.html.erb +15 -0
  222. data/app/views/decidim/enhanced_textwork/admin/paragraphs/bulk_actions/_unassign_from_valuator.html.erb +15 -0
  223. data/app/views/decidim/enhanced_textwork/admin/paragraphs/edit.html.erb +7 -0
  224. data/app/views/decidim/enhanced_textwork/admin/paragraphs/index.html.erb +84 -0
  225. data/app/views/decidim/enhanced_textwork/admin/paragraphs/new.html.erb +7 -0
  226. data/app/views/decidim/enhanced_textwork/admin/paragraphs/publish_answers.js.erb +12 -0
  227. data/app/views/decidim/enhanced_textwork/admin/paragraphs/show.html.erb +186 -0
  228. data/app/views/decidim/enhanced_textwork/admin/paragraphs/update_category.js.erb +26 -0
  229. data/app/views/decidim/enhanced_textwork/admin/paragraphs/update_scope.js.erb +27 -0
  230. data/app/views/decidim/enhanced_textwork/admin/paragraphs_imports/new.html.erb +37 -0
  231. data/app/views/decidim/enhanced_textwork/admin/participatory_texts/_article-preview.html.erb +16 -0
  232. data/app/views/decidim/enhanced_textwork/admin/participatory_texts/_bulk-actions.html.erb +3 -0
  233. data/app/views/decidim/enhanced_textwork/admin/participatory_texts/index.html.erb +55 -0
  234. data/app/views/decidim/enhanced_textwork/admin/participatory_texts/new_editor.html.erb +39 -0
  235. data/app/views/decidim/enhanced_textwork/admin/participatory_texts/new_import.html.erb +39 -0
  236. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_accept_request_access_form.html.erb +8 -0
  237. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_collaborative_drafts.html.erb +16 -0
  238. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_collaborator_requests.html.erb +20 -0
  239. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_count.html.erb +1 -0
  240. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_edit_form_fields.html.erb +83 -0
  241. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_filters.html.erb +32 -0
  242. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_filters_small_view.html.erb +18 -0
  243. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_new_collaborative_draft_button.html.erb +11 -0
  244. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_reject_request_access_form.html.erb +10 -0
  245. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_request_access_form.html.erb +7 -0
  246. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_wizard_aside.html.erb +13 -0
  247. data/app/views/decidim/enhanced_textwork/collaborative_drafts/_wizard_header.html.erb +14 -0
  248. data/app/views/decidim/enhanced_textwork/collaborative_drafts/edit.html.erb +31 -0
  249. data/app/views/decidim/enhanced_textwork/collaborative_drafts/index.html.erb +23 -0
  250. data/app/views/decidim/enhanced_textwork/collaborative_drafts/index.js.erb +10 -0
  251. data/app/views/decidim/enhanced_textwork/collaborative_drafts/new.html.erb +24 -0
  252. data/app/views/decidim/enhanced_textwork/collaborative_drafts/show.html.erb +128 -0
  253. data/app/views/decidim/enhanced_textwork/paragraph_votes/update_buttons_and_counters.js.erb +41 -0
  254. data/app/views/decidim/enhanced_textwork/paragraphs/_count.html.erb +1 -0
  255. data/app/views/decidim/enhanced_textwork/paragraphs/_dynamic_map_instructions.html.erb +4 -0
  256. data/app/views/decidim/enhanced_textwork/paragraphs/_edit_form_fields.html.erb +115 -0
  257. data/app/views/decidim/enhanced_textwork/paragraphs/_endorsements_card_row.html.erb +0 -0
  258. data/app/views/decidim/enhanced_textwork/paragraphs/_filters.html.erb +48 -0
  259. data/app/views/decidim/enhanced_textwork/paragraphs/_filters_small_view.html.erb +18 -0
  260. data/app/views/decidim/enhanced_textwork/paragraphs/_linked_paragraphs.html.erb +34 -0
  261. data/app/views/decidim/enhanced_textwork/paragraphs/_paragraph.html.erb +1 -0
  262. data/app/views/decidim/enhanced_textwork/paragraphs/_paragraph_badge.html.erb +3 -0
  263. data/app/views/decidim/enhanced_textwork/paragraphs/_paragraph_similar.html.erb +22 -0
  264. data/app/views/decidim/enhanced_textwork/paragraphs/_paragraphs.html.erb +46 -0
  265. data/app/views/decidim/enhanced_textwork/paragraphs/_remaining_votes_count.html.erb +3 -0
  266. data/app/views/decidim/enhanced_textwork/paragraphs/_vote_button.html.erb +61 -0
  267. data/app/views/decidim/enhanced_textwork/paragraphs/_votes_count.html.erb +18 -0
  268. data/app/views/decidim/enhanced_textwork/paragraphs/_voting_rules.html.erb +50 -0
  269. data/app/views/decidim/enhanced_textwork/paragraphs/_wizard_aside.html.erb +20 -0
  270. data/app/views/decidim/enhanced_textwork/paragraphs/_wizard_header.html.erb +42 -0
  271. data/app/views/decidim/enhanced_textwork/paragraphs/compare.html.erb +23 -0
  272. data/app/views/decidim/enhanced_textwork/paragraphs/complete.html.erb +24 -0
  273. data/app/views/decidim/enhanced_textwork/paragraphs/edit.html.erb +31 -0
  274. data/app/views/decidim/enhanced_textwork/paragraphs/edit_draft.html.erb +26 -0
  275. data/app/views/decidim/enhanced_textwork/paragraphs/index.html.erb +56 -0
  276. data/app/views/decidim/enhanced_textwork/paragraphs/index.js.erb +10 -0
  277. data/app/views/decidim/enhanced_textwork/paragraphs/new.html.erb +38 -0
  278. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/_index.html.erb +20 -0
  279. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/_overview.html.erb +35 -0
  280. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/_paragraph_vote_button.html.erb +53 -0
  281. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/_paragraph_vote_button_chevron.html.erb +72 -0
  282. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/_paragraph_votes_count.html.erb +41 -0
  283. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/_view_index.html.erb +10 -0
  284. data/app/views/decidim/enhanced_textwork/paragraphs/participatory_texts/participatory_text.html.erb +29 -0
  285. data/app/views/decidim/enhanced_textwork/paragraphs/preview.html.erb +41 -0
  286. data/app/views/decidim/enhanced_textwork/paragraphs/show.html.erb +143 -0
  287. data/app/views/decidim/enhanced_textwork/versions/index.html.erb +16 -0
  288. data/app/views/decidim/enhanced_textwork/versions/show.html.erb +18 -0
  289. data/config/assets.rb +10 -0
  290. data/config/locales/de.yml +927 -0
  291. data/config/locales/en.yml +967 -0
  292. data/config/locales/todo/am-ET.yml +1 -0
  293. data/config/locales/todo/ar-SA.yml +801 -0
  294. data/config/locales/todo/ar.yml +791 -0
  295. data/config/locales/todo/bg-BG.yml +237 -0
  296. data/config/locales/todo/bg.yml +238 -0
  297. data/config/locales/todo/ca.yml +908 -0
  298. data/config/locales/todo/cs-CZ.yml +787 -0
  299. data/config/locales/todo/cs.yml +969 -0
  300. data/config/locales/todo/da-DK.yml +1 -0
  301. data/config/locales/todo/da.yml +1 -0
  302. data/config/locales/todo/el-GR.yml +1 -0
  303. data/config/locales/todo/el.yml +848 -0
  304. data/config/locales/todo/eo-UY.yml +1 -0
  305. data/config/locales/todo/eo.yml +1 -0
  306. data/config/locales/todo/es-MX.yml +908 -0
  307. data/config/locales/todo/es-PY.yml +908 -0
  308. data/config/locales/todo/es.yml +908 -0
  309. data/config/locales/todo/et-EE.yml +1 -0
  310. data/config/locales/todo/et.yml +1 -0
  311. data/config/locales/todo/eu.yml +717 -0
  312. data/config/locales/todo/fi-pl.yml +763 -0
  313. data/config/locales/todo/fi-plain.yml +920 -0
  314. data/config/locales/todo/fi.yml +920 -0
  315. data/config/locales/todo/fr-CA.yml +936 -0
  316. data/config/locales/todo/fr-LU.yml +903 -0
  317. data/config/locales/todo/fr.yml +936 -0
  318. data/config/locales/todo/ga-IE.yml +275 -0
  319. data/config/locales/todo/gl.yml +808 -0
  320. data/config/locales/todo/hr-HR.yml +1 -0
  321. data/config/locales/todo/hr.yml +1 -0
  322. data/config/locales/todo/hu.yml +847 -0
  323. data/config/locales/todo/id-ID.yml +704 -0
  324. data/config/locales/todo/is-IS.yml +269 -0
  325. data/config/locales/todo/is.yml +274 -0
  326. data/config/locales/todo/it.yml +908 -0
  327. data/config/locales/todo/ja.yml +922 -0
  328. data/config/locales/todo/ko-KR.yml +1 -0
  329. data/config/locales/todo/ko.yml +1 -0
  330. data/config/locales/todo/lb-LU.yml +1 -0
  331. data/config/locales/todo/lb.yml +40 -0
  332. data/config/locales/todo/lt-LT.yml +1 -0
  333. data/config/locales/todo/lt.yml +1 -0
  334. data/config/locales/todo/lv.yml +838 -0
  335. data/config/locales/todo/mt-MT.yml +1 -0
  336. data/config/locales/todo/mt.yml +1 -0
  337. data/config/locales/todo/nl.yml +882 -0
  338. data/config/locales/todo/no.yml +770 -0
  339. data/config/locales/todo/om-ET.yml +1 -0
  340. data/config/locales/todo/pl.yml +927 -0
  341. data/config/locales/todo/pt-BR.yml +908 -0
  342. data/config/locales/todo/pt.yml +945 -0
  343. data/config/locales/todo/ro-RO.yml +886 -0
  344. data/config/locales/todo/ru.yml +379 -0
  345. data/config/locales/todo/si-LK.yml +1 -0
  346. data/config/locales/todo/sk-SK.yml +896 -0
  347. data/config/locales/todo/sk.yml +851 -0
  348. data/config/locales/todo/sl.yml +26 -0
  349. data/config/locales/todo/so-SO.yml +1 -0
  350. data/config/locales/todo/sr-CS.yml +125 -0
  351. data/config/locales/todo/sv.yml +908 -0
  352. data/config/locales/todo/sw-KE.yml +1 -0
  353. data/config/locales/todo/ti-ER.yml +1 -0
  354. data/config/locales/todo/tr-TR.yml +890 -0
  355. data/config/locales/todo/uk.yml +379 -0
  356. data/config/locales/todo/vi-VN.yml +1 -0
  357. data/config/locales/todo/vi.yml +1 -0
  358. data/config/locales/todo/zh-CN.yml +857 -0
  359. data/config/locales/todo/zh-TW.yml +1 -0
  360. data/db/migrate/20161212110850_create_decidim_paragraphs.rb +16 -0
  361. data/db/migrate/20170112115253_create_paragraph_votes.rb +14 -0
  362. data/db/migrate/20170113114245_add_enhanced_textwork_text_search_indexes.rb +8 -0
  363. data/db/migrate/20170118120151_add_counter_cache_votes_to_paragraphs.rb +7 -0
  364. data/db/migrate/20170120151202_add_user_group_id_to_paragraphs.rb +7 -0
  365. data/db/migrate/20170131092413_add_answers_to_paragraphs.rb +9 -0
  366. data/db/migrate/20170205082832_add_index_to_decidim_enhanced_textwork_paragraphs_paragraph_votes_count.rb +9 -0
  367. data/db/migrate/20170215113152_create_paragraph_reports.rb +16 -0
  368. data/db/migrate/20170215131720_add_report_count_to_paragraphs.rb +7 -0
  369. data/db/migrate/20170215132030_add_reference_to_paragraphs.rb +13 -0
  370. data/db/migrate/20170220152416_add_hidden_at_to_paragraphs.rb +7 -0
  371. data/db/migrate/20170228105156_add_geolocalization_fields_to_paragraphs.rb +9 -0
  372. data/db/migrate/20170307085300_migrate_paragraph_reports_data_to_reports.rb +24 -0
  373. data/db/migrate/20170410073742_remove_not_null_reference_paragraphs.rb +7 -0
  374. data/db/migrate/20170612101809_migrate_paragraphs_category.rb +15 -0
  375. data/db/migrate/20171201115434_create_paragraph_endorsements.rb +16 -0
  376. data/db/migrate/20171201122623_add_counter_cache_endorsements_to_paragraphs.rb +8 -0
  377. data/db/migrate/20171212102250_enable_pg_trgm_extension_for_paragraphs.rb +18 -0
  378. data/db/migrate/20171220084719_add_published_at_to_paragraphs.rb +14 -0
  379. data/db/migrate/20180111110204_create_decidim_paragraph_notes.rb +15 -0
  380. data/db/migrate/20180115155220_add_index_created_at_paragraph_notes.rb +7 -0
  381. data/db/migrate/20180305133811_rename_features_to_components_at_paragraphs.rb +11 -0
  382. data/db/migrate/20180326091532_create_decidim_enhanced_textwork_collaborative_drafts.rb +29 -0
  383. data/db/migrate/20180413135249_fix_nil_threshold_per_paragraph.rb +18 -0
  384. data/db/migrate/20180529101323_add_counter_cache_coauthorships_to_paragraphs.rb +8 -0
  385. data/db/migrate/20180529110230_move_enhanced_textwork_authorships_to_coauthorships.rb +28 -0
  386. data/db/migrate/20180529110830_remove_authorships_from_paragraphs.rb +8 -0
  387. data/db/migrate/20180613151121_create_enhanced_textwork_collaborative_draft_collaborator_requests.rb +12 -0
  388. data/db/migrate/20180711074134_add_enhanced_textwork_counter_cache_coauthorships_to_collaborative_drafts.rb +7 -0
  389. data/db/migrate/20180711075004_remove_index_counter_cache_coauthorships_to_paragraphs.rb +7 -0
  390. data/db/migrate/20180927111721_create_enhanced_textwork_participatory_texts.rb +13 -0
  391. data/db/migrate/20180930125321_add_participatory_text_level_to_paragraphs.rb +7 -0
  392. data/db/migrate/20180930125321_add_position_to_paragraphs.rb +7 -0
  393. data/db/migrate/20181003074440_fix_user_groups_ids_in_paragraphs_endorsements.rb +20 -0
  394. data/db/migrate/20181010114622_add_enhanced_textwork_temporary_votes.rb +9 -0
  395. data/db/migrate/20181016132225_add_enhanced_textwork_organization_as_author.rb +13 -0
  396. data/db/migrate/20181017084221_make_author_polymorhpic_for_paragraph_endorsements.rb +31 -0
  397. data/db/migrate/20181026073215_add_enhanced_textwork_created_in_meeting.rb +7 -0
  398. data/db/migrate/20190215113158_use_enhanced_textwork_md5_indexes.rb +17 -0
  399. data/db/migrate/20191206154128_add_endorsements_counter_cache_to_paragraphs.rb +7 -0
  400. data/db/migrate/20200120215928_move_paragraph_endorsements_to_core_endorsements.rb +54 -0
  401. data/db/migrate/20200120230130_drop_paragraph_endorsements.rb +8 -0
  402. data/db/migrate/20200203111239_add_paragraph_valuation_assignments.rb +12 -0
  403. data/db/migrate/20200210135152_add_costs_to_paragraphs.rb +9 -0
  404. data/db/migrate/20200212120110_sync_paragraphs_state_with_amendments_state.rb +28 -0
  405. data/db/migrate/20200227175922_add_state_published_at_to_paragraphs.rb +7 -0
  406. data/db/migrate/20200306123652_publish_existing_paragraphs_state.rb +15 -0
  407. data/db/migrate/20200708091228_move_paragraphs_fields_to_i18n.rb +86 -0
  408. data/db/migrate/20200730131631_move_paragraph_endorsed_event_notifications_to_resource_endorsed_event.rb +20 -0
  409. data/db/migrate/20200827154156_add_commentable_counter_cache_to_paragraphs.rb +12 -0
  410. data/db/migrate/20201002085508_fix_paragraphs_data.rb +36 -0
  411. data/db/migrate/20210127115628_fix_answered_paragraphs_after_copy.rb +14 -0
  412. data/db/migrate/20210310102839_add_followable_counter_cache_to_paragraphs.rb +16 -0
  413. data/db/migrate/20210310120812_add_enhanced_textwork_followable_counter_cache_to_collaborative_drafts.rb +16 -0
  414. data/db/migrate/20210318082934_fix_counters_for_copied_paragraphs.rb +19 -0
  415. data/lib/decidim/api/paragraph_input_filter.rb +29 -0
  416. data/lib/decidim/api/paragraph_input_sort.rb +20 -0
  417. data/lib/decidim/api/paragraph_type.rb +56 -0
  418. data/lib/decidim/api/paragraphs_type.rb +43 -0
  419. data/lib/decidim/content_parsers/paragraph_parser.rb +101 -0
  420. data/lib/decidim/content_renderers/paragraph_renderer.rb +33 -0
  421. data/lib/decidim/enhanced_textwork/admin.rb +10 -0
  422. data/lib/decidim/enhanced_textwork/admin_engine.rb +52 -0
  423. data/lib/decidim/enhanced_textwork/api.rb +10 -0
  424. data/lib/decidim/enhanced_textwork/commentable_collaborative_draft.rb +38 -0
  425. data/lib/decidim/enhanced_textwork/commentable_paragraph.rb +36 -0
  426. data/lib/decidim/enhanced_textwork/component.rb +448 -0
  427. data/lib/decidim/enhanced_textwork/doc_to_markdown.rb +50 -0
  428. data/lib/decidim/enhanced_textwork/engine.rb +204 -0
  429. data/lib/decidim/enhanced_textwork/html_to_markdown.rb +22 -0
  430. data/lib/decidim/enhanced_textwork/markdown_to_paragraphs.rb +153 -0
  431. data/lib/decidim/enhanced_textwork/odt_to_markdown.rb +46 -0
  432. data/lib/decidim/enhanced_textwork/paragraph_creator.rb +98 -0
  433. data/lib/decidim/enhanced_textwork/paragraph_serializer.rb +95 -0
  434. data/lib/decidim/enhanced_textwork/participatory_text_section.rb +21 -0
  435. data/lib/decidim/enhanced_textwork/test/capybara_paragraphs_picker.rb +59 -0
  436. data/lib/decidim/enhanced_textwork/test/factories.rb +492 -0
  437. data/lib/decidim/enhanced_textwork/valuatable.rb +21 -0
  438. data/lib/decidim/enhanced_textwork/version.rb +14 -0
  439. data/lib/decidim/enhanced_textwork.rb +58 -0
  440. data/lib/decidim/exporters/word.rb +309 -0
  441. metadata +704 -0
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ module Admin
6
+ class ValuationAssignmentsController < Admin::ApplicationController
7
+ def create
8
+ enforce_permission_to :assign_to_valuator, :paragraphs
9
+
10
+ @form = form(Admin::ValuationAssignmentForm).from_params(params)
11
+
12
+ Admin::AssignParagraphsToValuator.call(@form) do
13
+ on(:ok) do |_paragraph|
14
+ flash[:notice] = I18n.t("valuation_assignments.create.success", scope: "decidim.enhanced_textwork.admin")
15
+ redirect_to EngineRouter.admin_proxy(current_component).root_path
16
+ end
17
+
18
+ on(:invalid) do
19
+ flash.now[:alert] = I18n.t("valuation_assignments.create.invalid", scope: "decidim.enhanced_textwork.admin")
20
+ redirect_to EngineRouter.admin_proxy(current_component).root_path
21
+ end
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ @form = form(Admin::ValuationAssignmentForm).from_params(destroy_params)
27
+
28
+ enforce_permission_to :unassign_from_valuator, :paragraphs, valuator: @form.valuator_user
29
+
30
+ Admin::UnassignParagraphsFromValuator.call(@form) do
31
+ on(:ok) do |_paragraph|
32
+ flash.keep[:notice] = I18n.t("valuation_assignments.delete.success", scope: "decidim.enhanced_textwork.admin")
33
+ redirect_back fallback_location: EngineRouter.admin_proxy(current_component).root_path
34
+ end
35
+
36
+ on(:invalid) do
37
+ flash.keep[:alert] = I18n.t("valuation_assignments.delete.invalid", scope: "decidim.enhanced_textwork.admin")
38
+ redirect_back fallback_location: EngineRouter.admin_proxy(current_component).root_path
39
+ end
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def destroy_params
46
+ {
47
+ id: params.dig(:valuator_role, :id) || params[:id],
48
+ paragraph_ids: params[:paragraph_ids] || [params[:paragraph_id]]
49
+ }
50
+ end
51
+
52
+ def skip_manage_component_permission
53
+ true
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
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
+ helper Decidim::Messaging::ConversationHelper
12
+ helper_method :paragraph_limit_reached?
13
+
14
+ def paragraph_limit
15
+ return nil if component_settings.paragraph_limit.zero?
16
+
17
+ component_settings.paragraph_limit
18
+ end
19
+
20
+ def paragraph_limit_reached?
21
+ return false unless paragraph_limit
22
+
23
+ paragraphs.where(author: current_user).count >= paragraph_limit
24
+ end
25
+
26
+ def paragraphs
27
+ Paragraph.where(component: current_component)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ # Exposes Collaborative Draft Request actions for collaboration between
6
+ # participants on a resource.
7
+ class CollaborativeDraftCollaboratorRequestsController < Decidim::EnhancedTextwork::CollaborativeDraftsController
8
+ before_action :retrieve_collaborative_draft, only: [:request_access, :request_accept, :request_reject]
9
+
10
+ def request_access
11
+ @request_access_form = form(RequestAccessToCollaborativeDraftForm).from_params(params)
12
+ RequestAccessToCollaborativeDraft.call(@request_access_form, current_user) do
13
+ on(:ok) do |_collaborative_draft|
14
+ flash[:notice] = t("access_requested.success", scope: "decidim.enhanced_textwork.collaborative_drafts.requests")
15
+ end
16
+
17
+ on(:invalid) do
18
+ flash[:alert] = t("access_requested.error", scope: "decidim.enhanced_textwork.collaborative_drafts.requests")
19
+ end
20
+ end
21
+ redirect_to Decidim::ResourceLocatorPresenter.new(@collaborative_draft).path
22
+ end
23
+
24
+ def request_accept
25
+ @accept_request_form = form(AcceptAccessToCollaborativeDraftForm).from_params(params)
26
+ AcceptAccessToCollaborativeDraft.call(@accept_request_form, current_user) do
27
+ on(:ok) do |requester_user|
28
+ flash[:notice] = t("accepted_request.success", scope: "decidim.enhanced_textwork.collaborative_drafts.requests", user: requester_user.nickname)
29
+ end
30
+
31
+ on(:invalid) do
32
+ flash[:alert] = t("accepted_request.error", scope: "decidim.enhanced_textwork.collaborative_drafts.requests")
33
+ end
34
+ end
35
+ redirect_to Decidim::ResourceLocatorPresenter.new(@collaborative_draft).path
36
+ end
37
+
38
+ def request_reject
39
+ @reject_request_form = form(RejectAccessToCollaborativeDraftForm).from_params(params)
40
+ RejectAccessToCollaborativeDraft.call(@reject_request_form, current_user) do
41
+ on(:ok) do |requester_user|
42
+ flash[:notice] = t("rejected_request.success", scope: "decidim.enhanced_textwork.collaborative_drafts.requests", user: requester_user.nickname)
43
+ end
44
+
45
+ on(:invalid) do
46
+ flash.now[:alert] = t("rejected_request.error", scope: "decidim.enhanced_textwork.collaborative_drafts.requests")
47
+ end
48
+ end
49
+ redirect_to Decidim::ResourceLocatorPresenter.new(@collaborative_draft).path
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ # Exposes Collaborative Drafts resource so users can view and create them.
6
+ class CollaborativeDraftsController < Decidim::EnhancedTextwork::ApplicationController
7
+ helper Decidim::WidgetUrlsHelper
8
+ helper ParagraphWizardHelper
9
+ helper TooltipHelper
10
+ helper UserGroupHelper
11
+
12
+ include Decidim::ApplicationHelper
13
+ include FormFactory
14
+ include Flaggable
15
+ include FilterResource
16
+ include CollaborativeOrderable
17
+ include Paginable
18
+
19
+ helper_method :form_presenter
20
+
21
+ helper_method :geocoded_collaborative_draft, :collaborative_draft
22
+ before_action :collaborative_drafts_enabled?
23
+ before_action :authenticate_user!, only: [:new, :create]
24
+ before_action :retrieve_collaborative_draft, only: [:show, :edit, :update, :withdraw, :publish]
25
+
26
+ def index
27
+ @collaborative_drafts = search
28
+ .results
29
+ .not_hidden
30
+ .includes(:category)
31
+ .includes(:scope)
32
+
33
+ @collaborative_drafts = paginate(@collaborative_drafts)
34
+ @collaborative_drafts = reorder(@collaborative_drafts)
35
+ end
36
+
37
+ def show
38
+ raise ActionController::RoutingError, "Not Found" unless retrieve_collaborative_draft
39
+
40
+ @request_access_form = form(RequestAccessToCollaborativeDraftForm).from_params({})
41
+ @accept_request_form = form(AcceptAccessToCollaborativeDraftForm).from_params({})
42
+ @reject_request_form = form(RejectAccessToCollaborativeDraftForm).from_params({})
43
+ end
44
+
45
+ def new
46
+ enforce_permission_to :create, :collaborative_draft
47
+
48
+ @form = form(CollaborativeDraftForm).from_params(
49
+ attachment: form(AttachmentForm).from_params({})
50
+ )
51
+ end
52
+
53
+ def create
54
+ enforce_permission_to :create, :collaborative_draft
55
+ @form = form(CollaborativeDraftForm).from_params(params)
56
+
57
+ CreateCollaborativeDraft.call(@form, current_user) do
58
+ on(:ok) do |collaborative_draft|
59
+ flash[:notice] = I18n.t("paragraphs.collaborative_drafts.create.success", scope: "decidim")
60
+
61
+ redirect_to Decidim::ResourceLocatorPresenter.new(collaborative_draft).path
62
+ end
63
+
64
+ on(:invalid) do
65
+ flash.now[:alert] = I18n.t("paragraphs.collaborative_drafts.create.error", scope: "decidim")
66
+ render :complete
67
+ end
68
+ end
69
+ end
70
+
71
+ def edit
72
+ enforce_permission_to :edit, :collaborative_draft, collaborative_draft: @collaborative_draft
73
+
74
+ @form = form(CollaborativeDraftForm).from_model(@collaborative_draft)
75
+ @form.attachment = form(AttachmentForm).from_model(@collaborative_draft.attachments.first)
76
+ end
77
+
78
+ def update
79
+ enforce_permission_to :edit, :collaborative_draft, collaborative_draft: @collaborative_draft
80
+
81
+ @form = form(CollaborativeDraftForm).from_params(params)
82
+ UpdateCollaborativeDraft.call(@form, current_user, @collaborative_draft) do
83
+ on(:ok) do |collaborative_draft|
84
+ flash[:notice] = I18n.t("paragraphs.collaborative_drafts.update.success", scope: "decidim")
85
+ redirect_to Decidim::ResourceLocatorPresenter.new(collaborative_draft).path
86
+ end
87
+
88
+ on(:invalid) do
89
+ flash.now[:alert] = I18n.t("paragraphs.collaborative_drafts.update.error", scope: "decidim")
90
+ render :edit
91
+ end
92
+ end
93
+ end
94
+
95
+ def withdraw
96
+ WithdrawCollaborativeDraft.call(@collaborative_draft, current_user) do
97
+ on(:ok) do
98
+ flash[:notice] = t("withdraw.success", scope: "decidim.enhanced_textwork.collaborative_drafts.collaborative_draft")
99
+ end
100
+
101
+ on(:invalid) do
102
+ flash.now[:alert] = t("withdraw.error", scope: "decidim.enhanced_textwork.collaborative_drafts.collaborative_draft")
103
+ end
104
+ end
105
+ redirect_to Decidim::ResourceLocatorPresenter.new(@collaborative_draft).path
106
+ end
107
+
108
+ def publish
109
+ PublishCollaborativeDraft.call(@collaborative_draft, current_user) do
110
+ on(:ok) do |paragraph|
111
+ flash[:notice] = I18n.t("publish.success", scope: "decidim.enhanced_textwork.collaborative_drafts.collaborative_draft")
112
+ redirect_to Decidim::ResourceLocatorPresenter.new(paragraph).path
113
+ end
114
+
115
+ on(:invalid) do
116
+ flash.now[:alert] = t("publish.error", scope: "decidim.enhanced_textwork.collaborative_drafts.collaborative_draft")
117
+ redirect_to Decidim::ResourceLocatorPresenter.new(@collaborative_draft).path
118
+ end
119
+ end
120
+ end
121
+
122
+ private
123
+
124
+ def form_presenter
125
+ @form_presenter ||= present(@form, presenter_class: Decidim::EnhancedTextwork::CollaborativeDraftPresenter)
126
+ end
127
+
128
+ def collaborative_drafts_enabled?
129
+ raise ActionController::RoutingError, "Not Found" unless component_settings.collaborative_drafts_enabled?
130
+ end
131
+
132
+ def retrieve_collaborative_draft
133
+ @collaborative_draft = CollaborativeDraft.not_hidden.where(component: current_component).find_by(id: params[:id])
134
+ end
135
+
136
+ def geocoded_collaborative_draft
137
+ @geocoded_collaborative_draft ||= search.results.not_hidden.select(&:geocoded_and_valid?)
138
+ end
139
+
140
+ def search_klass
141
+ CollaborativeDraftSearch
142
+ end
143
+
144
+ def default_filter_params
145
+ {
146
+ search_text: "",
147
+ category_id: default_filter_category_params,
148
+ state: %w(open),
149
+ scope_id: default_filter_scope_params,
150
+ related_to: ""
151
+ }
152
+ end
153
+
154
+ def default_filter_category_params
155
+ return unless current_component.participatory_space.categories.any?
156
+
157
+ ["without"] + current_component.participatory_space.categories.map { |category| category.id.to_s }
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ # Exposes the paragraph vote resource so users can vote paragraphs.
6
+ class ParagraphVotesController < Decidim::EnhancedTextwork::ApplicationController
7
+ include ParagraphVotesHelper
8
+ include Rectify::ControllerHelpers
9
+
10
+ helper_method :paragraph
11
+
12
+ before_action :authenticate_user!
13
+
14
+ def create
15
+ enforce_permission_to :vote, :paragraph, paragraph: paragraph
16
+ @from_paragraphs_list = params[:from_paragraphs_list] == "true"
17
+ @chevron_button = params[:chevron_button] == "true"
18
+
19
+ VoteParagraph.call(paragraph, current_user) do
20
+ on(:ok) do
21
+ paragraph.reload
22
+
23
+ paragraphs = ParagraphVote.where(
24
+ author: current_user,
25
+ paragraph: Paragraph.where(component: current_component)
26
+ ).map(&:paragraph)
27
+
28
+ expose(paragraphs: paragraphs)
29
+ render :update_buttons_and_counters
30
+ end
31
+
32
+ on(:invalid) do
33
+ render json: { error: I18n.t("paragraph_votes.create.error", scope: "decidim.enhanced_textwork") }, status: :unprocessable_entity
34
+ end
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ enforce_permission_to :unvote, :paragraph, paragraph: paragraph
40
+ @from_paragraphs_list = params[:from_paragraphs_list] == "true"
41
+ @chevron_button = params[:chevron_button] == "true"
42
+
43
+ UnvoteParagraph.call(paragraph, current_user) do
44
+ on(:ok) do
45
+ paragraph.reload
46
+
47
+ paragraphs = ParagraphVote.where(
48
+ author: current_user,
49
+ paragraph: Paragraph.where(component: current_component)
50
+ ).map(&:paragraph)
51
+
52
+ expose(paragraphs: paragraphs + [paragraph])
53
+ render :update_buttons_and_counters
54
+ end
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def paragraph
61
+ @paragraph ||= Paragraph.where(component: current_component).find(params[:paragraph_id])
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,316 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ # Exposes the paragraph resource so users can view and create them.
6
+ class ParagraphsController < Decidim::EnhancedTextwork::ApplicationController
7
+ helper Decidim::WidgetUrlsHelper
8
+ helper ParagraphWizardHelper
9
+ helper ParticipatoryTextsHelper
10
+ helper UserGroupHelper
11
+ include Decidim::ApplicationHelper
12
+ include Flaggable
13
+ include Withdrawable
14
+ include FormFactory
15
+ include FilterResource
16
+ include Decidim::EnhancedTextwork::Orderable
17
+ include Paginable
18
+
19
+ helper_method :paragraph_presenter, :form_presenter
20
+
21
+ before_action :authenticate_user!, only: [:new, :create, :complete]
22
+ before_action :ensure_is_draft, only: [:compare, :complete, :preview, :publish, :edit_draft, :update_draft, :destroy_draft]
23
+ before_action :set_paragraph, only: [:show, :edit, :update, :withdraw, :overview]
24
+ before_action :edit_form, only: [:edit_draft, :edit]
25
+
26
+ before_action :set_participatory_text
27
+
28
+ def index
29
+ if component_settings.participatory_texts_enabled?
30
+ @paragraphs = Decidim::EnhancedTextwork::Paragraph
31
+ .where(component: current_component)
32
+ .published
33
+ .not_hidden
34
+ .only_amendables
35
+ .includes(:category, :scope)
36
+ .order(position: :asc)
37
+ render "decidim/enhanced_textwork/paragraphs/participatory_texts/participatory_text"
38
+ else
39
+ @base_query = search
40
+ .results
41
+ .published
42
+ .not_hidden
43
+
44
+ @paragraphs = @base_query.includes(:component, :coauthorships)
45
+ @all_geocoded_paragraphs = @base_query.geocoded
46
+
47
+ @voted_paragraphs = if current_user
48
+ ParagraphVote.where(
49
+ author: current_user,
50
+ paragraph: @paragraphs.pluck(:id)
51
+ ).pluck(:decidim_paragraph_id)
52
+ else
53
+ []
54
+ end
55
+ @paragraphs = paginate(@paragraphs)
56
+ @paragraphs = reorder(@paragraphs)
57
+ end
58
+ end
59
+
60
+ def show
61
+ raise ActionController::RoutingError, "Not Found" if @paragraph.blank? || !can_show_paragraph?
62
+ end
63
+
64
+ def overview
65
+ @paragraphs = Decidim::EnhancedTextwork::Paragraph
66
+ .where(component: current_component)
67
+ .published
68
+ .not_hidden
69
+ .only_amendables
70
+ .includes(:category, :scope)
71
+ .order(position: :asc)
72
+
73
+ @amendments = @paragraph.amendments.order(created_at: :desc)
74
+
75
+ paragraph = @paragraphs.find(params[:id])
76
+
77
+ raise ActionController::RoutingError, "Not Found" if paragraph.blank? || !can_show_paragraph?
78
+
79
+ render "decidim/enhanced_textwork/paragraphs/participatory_texts/participatory_text", locals: { active_paragraph: paragraph }
80
+ end
81
+
82
+ def new
83
+ enforce_permission_to :create, :paragraph
84
+ @step = :step_1
85
+ if paragraph_draft.present?
86
+ redirect_to edit_draft_paragraph_path(paragraph_draft, component_id: paragraph_draft.component.id, question_slug: paragraph_draft.component.participatory_space.slug)
87
+ else
88
+ @form = form(ParagraphWizardCreateStepForm).from_params(body: translated_paragraph_body_template)
89
+ end
90
+ end
91
+
92
+ def create
93
+ enforce_permission_to :create, :paragraph
94
+ @step = :step_1
95
+ @form = form(ParagraphWizardCreateStepForm).from_params(paragraph_creation_params)
96
+
97
+ CreateParagraph.call(@form, current_user) do
98
+ on(:ok) do |paragraph|
99
+ flash[:notice] = I18n.t("paragraphs.create.success", scope: "decidim")
100
+
101
+ redirect_to "#{Decidim::ResourceLocatorPresenter.new(paragraph).path}/compare"
102
+ end
103
+
104
+ on(:invalid) do
105
+ flash.now[:alert] = I18n.t("paragraphs.create.error", scope: "decidim")
106
+ render :new
107
+ end
108
+ end
109
+ end
110
+
111
+ def compare
112
+ @step = :step_2
113
+ @similar_paragraphs ||= Decidim::EnhancedTextwork::SimilarParagraphs
114
+ .for(current_component, @paragraph)
115
+ .all
116
+
117
+ if @similar_paragraphs.blank?
118
+ flash[:notice] = I18n.t("paragraphs.paragraphs.compare.no_similars_found", scope: "decidim")
119
+ redirect_to "#{Decidim::ResourceLocatorPresenter.new(@paragraph).path}/complete"
120
+ end
121
+ end
122
+
123
+ def complete
124
+ enforce_permission_to :create, :paragraph
125
+ @step = :step_3
126
+
127
+ @form = form_paragraph_model
128
+
129
+ @form.attachment = form_attachment_new
130
+ end
131
+
132
+ def preview
133
+ @step = :step_4
134
+ @form = form(ParagraphForm).from_model(@paragraph)
135
+ end
136
+
137
+ def publish
138
+ @step = :step_4
139
+ PublishParagraph.call(@paragraph, current_user) do
140
+ on(:ok) do
141
+ flash[:notice] = I18n.t("paragraphs.publish.success", scope: "decidim")
142
+ redirect_to paragraph_path(@paragraph)
143
+ end
144
+
145
+ on(:invalid) do
146
+ flash.now[:alert] = I18n.t("paragraphs.publish.error", scope: "decidim")
147
+ render :edit_draft
148
+ end
149
+ end
150
+ end
151
+
152
+ def edit_draft
153
+ @step = :step_3
154
+ enforce_permission_to :edit, :paragraph, paragraph: @paragraph
155
+ end
156
+
157
+ def update_draft
158
+ @step = :step_1
159
+ enforce_permission_to :edit, :paragraph, paragraph: @paragraph
160
+
161
+ @form = form_paragraph_params
162
+ UpdateParagraph.call(@form, current_user, @paragraph) do
163
+ on(:ok) do |paragraph|
164
+ flash[:notice] = I18n.t("paragraphs.update_draft.success", scope: "decidim")
165
+ redirect_to "#{Decidim::ResourceLocatorPresenter.new(paragraph).path}/preview"
166
+ end
167
+
168
+ on(:invalid) do
169
+ flash.now[:alert] = I18n.t("paragraphs.update_draft.error", scope: "decidim")
170
+ render :edit_draft
171
+ end
172
+ end
173
+ end
174
+
175
+ def destroy_draft
176
+ enforce_permission_to :edit, :paragraph, paragraph: @paragraph
177
+
178
+ DestroyParagraph.call(@paragraph, current_user) do
179
+ on(:ok) do
180
+ flash[:notice] = I18n.t("paragraphs.destroy_draft.success", scope: "decidim")
181
+ redirect_to new_paragraph_path
182
+ end
183
+
184
+ on(:invalid) do
185
+ flash.now[:alert] = I18n.t("paragraphs.destroy_draft.error", scope: "decidim")
186
+ render :edit_draft
187
+ end
188
+ end
189
+ end
190
+
191
+ def edit
192
+ enforce_permission_to :edit, :paragraph, paragraph: @paragraph
193
+ end
194
+
195
+ def update
196
+ enforce_permission_to :edit, :paragraph, paragraph: @paragraph
197
+
198
+ @form = form_paragraph_params
199
+ UpdateParagraph.call(@form, current_user, @paragraph) do
200
+ on(:ok) do |paragraph|
201
+ flash[:notice] = I18n.t("paragraphs.update.success", scope: "decidim")
202
+ redirect_to Decidim::ResourceLocatorPresenter.new(paragraph).path
203
+ end
204
+
205
+ on(:invalid) do
206
+ flash.now[:alert] = I18n.t("paragraphs.update.error", scope: "decidim")
207
+ render :edit
208
+ end
209
+ end
210
+ end
211
+
212
+ def withdraw
213
+ enforce_permission_to :withdraw, :paragraph, paragraph: @paragraph
214
+
215
+ WithdrawParagraph.call(@paragraph, current_user) do
216
+ on(:ok) do
217
+ flash[:notice] = I18n.t("paragraphs.update.success", scope: "decidim")
218
+ redirect_to Decidim::ResourceLocatorPresenter.new(@paragraph).path
219
+ end
220
+ on(:has_supports) do
221
+ flash[:alert] = I18n.t("paragraphs.withdraw.errors.has_supports", scope: "decidim")
222
+ redirect_to Decidim::ResourceLocatorPresenter.new(@paragraph).path
223
+ end
224
+ end
225
+ end
226
+
227
+ private
228
+
229
+ def search_klass
230
+ ParagraphSearch
231
+ end
232
+
233
+ def default_filter_params
234
+ {
235
+ search_text: "",
236
+ origin: default_filter_origin_params,
237
+ activity: "all",
238
+ category_id: default_filter_category_params,
239
+ state: %w(accepted evaluating state_not_published),
240
+ scope_id: default_filter_scope_params,
241
+ related_to: "",
242
+ type: "all"
243
+ }
244
+ end
245
+
246
+ def default_filter_origin_params
247
+ filter_origin_params = %w(citizens meeting)
248
+ filter_origin_params << "official" if component_settings.official_paragraphs_enabled
249
+ filter_origin_params << "user_group" if current_organization.user_groups_enabled?
250
+ filter_origin_params
251
+ end
252
+
253
+ def paragraph_draft
254
+ Paragraph.from_all_author_identities(current_user).not_hidden.only_amendables
255
+ .where(component: current_component).find_by(published_at: nil)
256
+ end
257
+
258
+ def ensure_is_draft
259
+ @paragraph = Paragraph.not_hidden.where(component: current_component).find(params[:id])
260
+ redirect_to Decidim::ResourceLocatorPresenter.new(@paragraph).path unless @paragraph.draft?
261
+ end
262
+
263
+ def set_paragraph
264
+ @paragraph = Paragraph.published.not_hidden.where(component: current_component).find_by(id: params[:id])
265
+ end
266
+
267
+ # Returns true if the paragraph is NOT an emendation or the user IS an admin.
268
+ # Returns false if the paragraph is not found or the paragraph IS an emendation
269
+ # and is NOT visible to the user based on the component's amendments settings.
270
+ def can_show_paragraph?
271
+ return true if @paragraph&.amendable? || current_user&.admin?
272
+
273
+ Paragraph.only_visible_emendations_for(current_user, current_component).published.include?(@paragraph)
274
+ end
275
+
276
+ def paragraph_presenter
277
+ @paragraph_presenter ||= present(@paragraph)
278
+ end
279
+
280
+ def form_paragraph_params
281
+ form(ParagraphForm).from_params(params)
282
+ end
283
+
284
+ def form_paragraph_model
285
+ form(ParagraphForm).from_model(@paragraph)
286
+ end
287
+
288
+ def form_presenter
289
+ @form_presenter ||= present(@form, presenter_class: Decidim::EnhancedTextwork::ParagraphPresenter)
290
+ end
291
+
292
+ def form_attachment_new
293
+ form(AttachmentForm).from_model(Attachment.new)
294
+ end
295
+
296
+ def edit_form
297
+ form_attachment_model = form(AttachmentForm).from_model(@paragraph.attachments.first)
298
+ @form = form_paragraph_model
299
+ @form.attachment = form_attachment_model
300
+ @form
301
+ end
302
+
303
+ def set_participatory_text
304
+ @participatory_text = Decidim::EnhancedTextwork::ParticipatoryText.find_by(component: current_component)
305
+ end
306
+
307
+ def translated_paragraph_body_template
308
+ translated_attribute component_settings.new_paragraph_body_template
309
+ end
310
+
311
+ def paragraph_creation_params
312
+ params[:paragraph].merge(body_template: translated_paragraph_body_template)
313
+ end
314
+ end
315
+ end
316
+ end