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,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddParagraphValuationAssignments < ActiveRecord::Migration[5.2]
4
+ def change
5
+ create_table :decidim_enhanced_textwork_valuation_assignments do |t|
6
+ t.references :decidim_paragraph, null: false, index: { name: "decidim_enhanced_textwork_valuation_assignment_paragraph" }
7
+ t.references :valuator_role, polymorphic: true, null: false, index: { name: "decidim_enhanced_textwork_valuation_assignment_valuator_role" }
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddCostsToParagraphs < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_enhanced_textwork_paragraphs, :cost, :decimal
6
+ add_column :decidim_enhanced_textwork_paragraphs, :cost_report, :jsonb
7
+ add_column :decidim_enhanced_textwork_paragraphs, :execution_period, :jsonb
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SyncParagraphsStateWithAmendmentsState < ActiveRecord::Migration[5.2]
4
+ def up
5
+ execute <<-SQL.squish
6
+ UPDATE decidim_enhanced_textwork_paragraphs AS paragraphs
7
+ SET state = amendments.state
8
+ FROM decidim_amendments AS amendments
9
+ WHERE
10
+ paragraphs.state IS NULL AND
11
+ amendments.decidim_emendation_type = 'Decidim::EnhancedTextwork::Paragraph' AND
12
+ amendments.decidim_emendation_id = paragraphs.id AND
13
+ amendments.state IS NOT NULL
14
+ SQL
15
+ end
16
+
17
+ def down
18
+ execute <<-SQL.squish
19
+ UPDATE decidim_enhanced_textwork_paragraphs AS paragraphs
20
+ SET state = NULL
21
+ FROM decidim_amendments AS amendments
22
+ WHERE
23
+ amendments.decidim_emendation_type = 'Decidim::EnhancedTextwork::Paragraph' AND
24
+ amendments.decidim_emendation_id = paragraphs.id AND
25
+ amendments.state IS NOT NULL
26
+ SQL
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddStatePublishedAtToParagraphs < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_enhanced_textwork_paragraphs, :state_published_at, :datetime
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PublishExistingParagraphsState < ActiveRecord::Migration[5.2]
4
+ def up
5
+ execute <<-SQL.squish
6
+ UPDATE decidim_enhanced_textwork_paragraphs SET state_published_at = COALESCE(answered_at, published_at) WHERE state IS NOT NULL
7
+ SQL
8
+ end
9
+
10
+ def down
11
+ execute <<-SQL.squish
12
+ UPDATE decidim_enhanced_textwork_paragraphs SET state_published_at = NULL
13
+ SQL
14
+ end
15
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MoveParagraphsFieldsToI18n < ActiveRecord::Migration[5.2]
4
+ def up
5
+ add_column :decidim_enhanced_textwork_paragraphs, :new_title, :jsonb
6
+ add_column :decidim_enhanced_textwork_paragraphs, :new_body, :jsonb
7
+
8
+ reset_column_information
9
+
10
+ PaperTrail.request(enabled: false) do
11
+ Decidim::EnhancedTextwork::Paragraph.find_each do |paragraph|
12
+ author = paragraph.coauthorships.first.author
13
+
14
+ locale = if author
15
+ author.try(:locale).presence || author.try(:default_locale).presence || author.try(:organization).try(:default_locale).presence
16
+ elsif paragraph.component && paragraph.component.participatory_space
17
+ paragraph.component.participatory_space.organization.default_locale
18
+ else
19
+ I18n.default_locale.to_s
20
+ end
21
+
22
+ paragraph.new_title = {
23
+ locale => paragraph.title
24
+ }
25
+ paragraph.new_body = {
26
+ locale => paragraph.body
27
+ }
28
+
29
+ paragraph.save(validate: false)
30
+ end
31
+ end
32
+
33
+ remove_indexs
34
+
35
+ remove_column :decidim_enhanced_textwork_paragraphs, :title
36
+ rename_column :decidim_enhanced_textwork_paragraphs, :new_title, :title
37
+ remove_column :decidim_enhanced_textwork_paragraphs, :body
38
+ rename_column :decidim_enhanced_textwork_paragraphs, :new_body, :body
39
+
40
+ create_indexs
41
+
42
+ reset_column_information
43
+ end
44
+
45
+ def down
46
+ add_column :decidim_enhanced_textwork_paragraphs, :new_title, :string
47
+ add_column :decidim_enhanced_textwork_paragraphs, :new_body, :string
48
+
49
+ reset_column_information
50
+
51
+ Decidim::EnhancedTextwork::Paragraph.find_each do |paragraph|
52
+ paragraph.new_title = paragraph.title.values.first
53
+ paragraph.new_body = paragraph.body.values.first
54
+
55
+ paragraph.save!
56
+ end
57
+
58
+ remove_indexs
59
+
60
+ remove_column :decidim_enhanced_textwork_paragraphs, :title
61
+ rename_column :decidim_enhanced_textwork_paragraphs, :new_title, :title
62
+ remove_column :decidim_enhanced_textwork_paragraphs, :body
63
+ rename_column :decidim_enhanced_textwork_paragraphs, :new_body, :body
64
+
65
+ create_indexs
66
+
67
+ reset_column_information
68
+ end
69
+
70
+ def reset_column_information
71
+ Decidim::User.reset_column_information
72
+ Decidim::Coauthorship.reset_column_information
73
+ Decidim::EnhancedTextwork::Paragraph.reset_column_information
74
+ Decidim::Organization.reset_column_information
75
+ end
76
+
77
+ def remove_indexs
78
+ remove_index :decidim_enhanced_textwork_paragraphs, name: "decidim_enhanced_textwork_paragraph_title_search"
79
+ remove_index :decidim_enhanced_textwork_paragraphs, name: "decidim_enhanced_textwork_paragraph_body_search"
80
+ end
81
+
82
+ def create_indexs
83
+ execute "CREATE INDEX decidim_enhanced_textwork_paragraph_title_search ON decidim_enhanced_textwork_paragraphs(md5(title::text))"
84
+ execute "CREATE INDEX decidim_enhanced_textwork_paragraph_body_search ON decidim_enhanced_textwork_paragraphs(md5(body::text))"
85
+ end
86
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MoveParagraphEndorsedEventNotificationsToResourceEndorsedEvent < ActiveRecord::Migration[5.2]
4
+ def up
5
+ Decidim::Notification.where(event_name: "decidim.events.enhanced_textwork.paragraph_endorsed", event_class: "Decidim::EnhancedTextwork::ParagraphEndorsedEvent").find_each do |notification|
6
+ notification.update(event_name: "decidim.events.resource_endorsed", event_class: "Decidim::ResourceEndorsedEvent")
7
+ end
8
+ end
9
+
10
+ def down
11
+ Decidim::Notification.where(
12
+ event_name: "decidim.events.resource_endorsed",
13
+ event_class: "Decidim::ResourceEndorsedEvent",
14
+ decidim_resource_type: "Decidim::EnhancedTextwork::Paragraph"
15
+ )
16
+ .find_each do |notification|
17
+ notification.update(event_name: "decidim.events.enhanced_textwork.paragraph_endorsed", event_class: "Decidim::EnhancedTextwork::ParagraphEndorsedEvent")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddCommentableCounterCacheToParagraphs < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_enhanced_textwork_paragraphs, :comments_count, :integer, null: false, default: 0, index: true
6
+ add_column :decidim_enhanced_textwork_collaborative_drafts, :comments_count, :integer, null: false, default: 0, index: true
7
+ Decidim::EnhancedTextwork::Paragraph.reset_column_information
8
+ Decidim::EnhancedTextwork::Paragraph.find_each(&:update_comments_count)
9
+ Decidim::EnhancedTextwork::CollaborativeDraft.reset_column_information
10
+ Decidim::EnhancedTextwork::CollaborativeDraft.find_each(&:update_comments_count)
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FixParagraphsData < ActiveRecord::Migration[5.2]
4
+ def up
5
+ reset_column_information
6
+
7
+ PaperTrail.request(enabled: false) do
8
+ Decidim::EnhancedTextwork::Paragraph.find_each do |paragraph|
9
+ next if paragraph.title.is_a?(Hash) && paragraph.body.is_a?(Hash)
10
+
11
+ author = paragraph.coauthorships.first.author
12
+
13
+ locale = author.try(:locale).presence || author.try(:default_locale).presence || author.try(:organization).try(:default_locale).presence
14
+
15
+ # rubocop:disable Rails/SkipsModelValidations
16
+ values = {}
17
+ values[:title] = { locale => paragraph.title } unless paragraph.title.is_a?(Hash)
18
+ values[:body] = { locale => paragraph.body } unless paragraph.body.is_a?(Hash)
19
+
20
+ paragraph.update_columns(values)
21
+ # rubocop:enable Rails/SkipsModelValidations
22
+ end
23
+ end
24
+
25
+ reset_column_information
26
+ end
27
+
28
+ def down; end
29
+
30
+ def reset_column_information
31
+ Decidim::User.reset_column_information
32
+ Decidim::Coauthorship.reset_column_information
33
+ Decidim::EnhancedTextwork::Paragraph.reset_column_information
34
+ Decidim::Organization.reset_column_information
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FixAnsweredParagraphsAfterCopy < ActiveRecord::Migration[5.2]
4
+ def change
5
+ paragraphs_after_copy = Decidim::ResourceLink.where(from_type: "Decidim::EnhancedTextwork::Paragraph").pluck(:from_id)
6
+
7
+ result = Decidim::EnhancedTextwork::Paragraph.where.not(state_published_at: nil).where(state: nil, id: paragraphs_after_copy)
8
+
9
+ result.find_each do |paragraph|
10
+ paragraph.state_published_at = nil
11
+ paragraph.save!
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddFollowableCounterCacheToParagraphs < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_enhanced_textwork_paragraphs, :follows_count, :integer, null: false, default: 0, index: true
6
+
7
+ reversible do |dir|
8
+ dir.up do
9
+ Decidim::EnhancedTextwork::Paragraph.reset_column_information
10
+ Decidim::EnhancedTextwork::Paragraph.find_each do |record|
11
+ record.class.reset_counters(record.id, :follows)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddEnhancedTextworkFollowableCounterCacheToCollaborativeDrafts < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_enhanced_textwork_collaborative_drafts, :follows_count, :integer, null: false, default: 0, index: true
6
+
7
+ reversible do |dir|
8
+ dir.up do
9
+ Decidim::EnhancedTextwork::CollaborativeDraft.reset_column_information
10
+ Decidim::EnhancedTextwork::CollaborativeDraft.find_each do |record|
11
+ record.class.reset_counters(record.id, :follows)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FixCountersForCopiedParagraphs < ActiveRecord::Migration[5.2]
4
+ def up
5
+ copies_ids = Decidim::ResourceLink
6
+ .where(
7
+ name: "copied_from_component",
8
+ from_type: "Decidim::EnhancedTextwork::Paragraph",
9
+ to_type: "Decidim::EnhancedTextwork::Paragraph"
10
+ ).pluck(:to_id)
11
+
12
+ Decidim::EnhancedTextwork::Paragraph.where(id: copies_ids).find_each do |record|
13
+ record.class.reset_counters(record.id, :follows)
14
+ record.update_comments_count
15
+ end
16
+ end
17
+
18
+ def down; end
19
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ class ParagraphInputFilter < Decidim::Core::BaseInputFilter
6
+ include Decidim::Core::HasPublishableInputFilter
7
+
8
+ graphql_name "ParagraphFilter"
9
+ description "A type used for filtering paragraphs inside a participatory space.
10
+
11
+ A typical query would look like:
12
+
13
+ ```
14
+ {
15
+ participatoryProcesses {
16
+ components {
17
+ ...on Paragraphs {
18
+ paragraphs(filter:{ publishedBefore: \"2020-01-01\" }) {
19
+ id
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
25
+ ```
26
+ "
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ class ParagraphInputSort < Decidim::Core::BaseInputSort
6
+ include Decidim::Core::HasPublishableInputSort
7
+ include Decidim::Core::HasEndorsableInputSort
8
+
9
+ graphql_name "ParagraphSort"
10
+ description "A type used for sorting paragraphs"
11
+
12
+ argument :id, GraphQL::Types::String, "Sort by ID, valid values are ASC or DESC", required: false
13
+ argument :vote_count,
14
+ type: GraphQL::Types::String,
15
+ description: "Sort by number of votes, valid values are ASC or DESC. Will be ignored if votes are hidden",
16
+ required: false,
17
+ as: :paragraph_votes_count
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ class ParagraphType < Decidim::Api::Types::BaseObject
6
+ description "A paragraph"
7
+
8
+ implements Decidim::Comments::CommentableInterface
9
+ implements Decidim::Core::CoauthorableInterface
10
+ implements Decidim::Core::CategorizableInterface
11
+ implements Decidim::Core::ScopableInterface
12
+ implements Decidim::Core::AttachableInterface
13
+ implements Decidim::Core::FingerprintInterface
14
+ implements Decidim::Core::AmendableInterface
15
+ implements Decidim::Core::AmendableEntityInterface
16
+ implements Decidim::Core::TraceableInterface
17
+ implements Decidim::Core::EndorsableInterface
18
+ implements Decidim::Core::TimestampsInterface
19
+
20
+ field :id, GraphQL::Types::ID, null: false
21
+ field :title, Decidim::Core::TranslatedFieldType, "The title for this title", null: true
22
+ field :body, Decidim::Core::TranslatedFieldType, "The description for this body", null: true
23
+ field :address, GraphQL::Types::String, "The physical address (location) of this paragraph", null: true
24
+ field :coordinates, Decidim::Core::CoordinatesType, "Physical coordinates for this paragraph", null: true
25
+
26
+ def coordinates
27
+ [object.latitude, object.longitude]
28
+ end
29
+ field :reference, GraphQL::Types::String, "This paragraph's unique reference", null: true
30
+ field :state, GraphQL::Types::String, "The answer status in which paragraph is in", null: true
31
+ field :answer, Decidim::Core::TranslatedFieldType, "The answer feedback for the status for this paragraph", null: true
32
+
33
+ field :answered_at, Decidim::Core::DateTimeType, description: "The date and time this paragraph was answered", null: true
34
+
35
+ field :published_at, Decidim::Core::DateTimeType, description: "The date and time this paragraph was published", null: true
36
+
37
+ field :participatory_text_level, GraphQL::Types::String, description: "If it is a participatory text, the level indicates the type of paragraph", null: true
38
+ field :position, GraphQL::Types::Int, "Position of this paragraph in the participatory text", null: true
39
+
40
+ field :official, GraphQL::Types::Boolean, "Whether this paragraph is official or not", method: :official?, null: true
41
+ field :created_in_meeting, GraphQL::Types::Boolean, "Whether this paragraph comes from a meeting or not", method: :official_meeting?, null: true
42
+ field :meeting, Decidim::Meetings::MeetingType, description: "If the paragraph comes from a meeting, the related meeting", null: true
43
+
44
+ def meeting
45
+ object.authors.first if object.official_meeting?
46
+ end
47
+
48
+ field :vote_count, GraphQL::Types::Int, description: "The total amount of votes the paragraph has received", null: true
49
+
50
+ def vote_count
51
+ current_component = object.component
52
+ object.paragraph_votes_count unless current_component.current_settings.votes_hidden?
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ class ParagraphListHelper < Decidim::Core::ComponentListBase
6
+ # only querying published posts
7
+ def query_scope
8
+ super.published
9
+ end
10
+ end
11
+
12
+ class ParagraphFinderHelper < Decidim::Core::ComponentFinderBase
13
+ # only querying published posts
14
+ def query_scope
15
+ super.published
16
+ end
17
+ end
18
+
19
+ class ParagraphsType < Decidim::Api::Types::BaseObject
20
+ implements Decidim::Core::ComponentInterface
21
+
22
+ graphql_name "Paragraphs"
23
+ description "A paragraphs component of a participatory space."
24
+
25
+ field :paragraphs, type: Decidim::EnhancedTextwork::ParagraphType.connection_type, description: "List all paragraphs", connection: true, null: true do
26
+ argument :order, Decidim::EnhancedTextwork::ParagraphInputSort, "Provides several methods to order the results", required: false
27
+ argument :filter, Decidim::EnhancedTextwork::ParagraphInputFilter, "Provides several methods to filter the results", required: false
28
+ end
29
+
30
+ field :paragraph, type: Decidim::EnhancedTextwork::ParagraphType, description: "Finds one paragraph", null: true do
31
+ argument :id, GraphQL::Types::ID, "The ID of the paragraph", required: true
32
+ end
33
+
34
+ def paragraphs(filter: {}, order: {})
35
+ Decidim::EnhancedTextwork::ParagraphListHelper.new(model_class: Paragraph).call(object, { filter: filter, order: order }, context)
36
+ end
37
+
38
+ def paragraph(id:)
39
+ Decidim::EnhancedTextwork::ParagraphFinderHelper.new(model_class: Paragraph).call(object, { id: id }, context)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ContentParsers
5
+ # A parser that searches mentions of Paragraphs in content.
6
+ #
7
+ # This parser accepts two ways for linking Paragraphs.
8
+ # - Using a standard url starting with http or https.
9
+ # - With a word starting with `~` and digits afterwards will be considered a possible mentioned paragraph.
10
+ # For example `~1234`, but no `~ 1234`.
11
+ #
12
+ # Also fills a `Metadata#linked_paragraphs` attribute.
13
+ #
14
+ # @see BaseParser Examples of how to use a content parser
15
+ class ParagraphParser < BaseParser
16
+ # Class used as a container for metadata
17
+ #
18
+ # @!attribute linked_paragraphs
19
+ # @return [Array] an array of Decidim::EnhancedTextwork::Paragraph mentioned in content
20
+ Metadata = Struct.new(:linked_paragraphs)
21
+
22
+ # Matches a URL
23
+ URL_REGEX_SCHEME = '(?:http(s)?:\/\/)'
24
+ URL_REGEX_CONTENT = '[\w.-]+[\w\-\._~:\/?#\[\]@!\$&\'\(\)\*\+,;=.]+'
25
+ URL_REGEX_END_CHAR = '[\d]'
26
+ URL_REGEX = %r{#{URL_REGEX_SCHEME}#{URL_REGEX_CONTENT}/paragraphs/#{URL_REGEX_END_CHAR}+}i.freeze
27
+ # Matches a mentioned Paragraph ID (~(d)+ expression)
28
+ ID_REGEX = /~(\d+)/.freeze
29
+
30
+ def initialize(content, context)
31
+ super
32
+ @metadata = Metadata.new([])
33
+ end
34
+
35
+ # Replaces found mentions matching an existing
36
+ # Paragraph with a global id for that Paragraph. Other mentions found that doesn't
37
+ # match an existing Paragraph are returned as they are.
38
+ #
39
+ # @return [String] the content with the valid mentions replaced by a global id.
40
+ def rewrite
41
+ rewrited_content = parse_for_urls(content)
42
+ parse_for_ids(rewrited_content)
43
+ end
44
+
45
+ # (see BaseParser#metadata)
46
+ attr_reader :metadata
47
+
48
+ private
49
+
50
+ def parse_for_urls(content)
51
+ content.gsub(URL_REGEX) do |match|
52
+ paragraph = paragraph_from_url_match(match)
53
+ if paragraph
54
+ @metadata.linked_paragraphs << paragraph.id
55
+ paragraph.to_global_id
56
+ else
57
+ match
58
+ end
59
+ end
60
+ end
61
+
62
+ def parse_for_ids(content)
63
+ content.gsub(ID_REGEX) do |match|
64
+ paragraph = paragraph_from_id_match(Regexp.last_match(1))
65
+ if paragraph
66
+ @metadata.linked_paragraphs << paragraph.id
67
+ paragraph.to_global_id
68
+ else
69
+ match
70
+ end
71
+ end
72
+ end
73
+
74
+ def paragraph_from_url_match(match)
75
+ uri = URI.parse(match)
76
+ return if uri.path.blank?
77
+
78
+ paragraph_id = uri.path.split("/").last
79
+ find_paragraph_by_id(paragraph_id)
80
+ rescue URI::InvalidURIError
81
+ Rails.logger.error("#{e.message}=>#{e.backtrace}")
82
+ nil
83
+ end
84
+
85
+ def paragraph_from_id_match(match)
86
+ paragraph_id = match
87
+ find_paragraph_by_id(paragraph_id)
88
+ end
89
+
90
+ def find_paragraph_by_id(id)
91
+ if id.present?
92
+ spaces = Decidim.participatory_space_manifests.flat_map do |manifest|
93
+ manifest.participatory_spaces.call(context[:current_organization]).public_spaces
94
+ end
95
+ components = Component.where(participatory_space: spaces).published
96
+ Decidim::EnhancedTextwork::Paragraph.where(component: components).find_by(id: id)
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ContentRenderers
5
+ # A renderer that searches Global IDs representing paragraphs in content
6
+ # and replaces it with a link to their show page.
7
+ #
8
+ # e.g. gid://<APP_NAME>/Decidim::EnhancedTextwork::Paragraph/1
9
+ #
10
+ # @see BaseRenderer Examples of how to use a content renderer
11
+ class ParagraphRenderer < BaseRenderer
12
+ # Matches a global id representing a Decidim::User
13
+ GLOBAL_ID_REGEX = %r{gid://([\w-]*/Decidim::EnhancedTextwork::Paragraph/(\d+))}i.freeze
14
+
15
+ # Replaces found Global IDs matching an existing paragraph with
16
+ # a link to its show page. The Global IDs representing an
17
+ # invalid Decidim::EnhancedTextwork::Paragraph are replaced with '???' string.
18
+ #
19
+ # @return [String] the content ready to display (contains HTML)
20
+ def render(_options = nil)
21
+ return content unless content.respond_to?(:gsub)
22
+
23
+ content.gsub(GLOBAL_ID_REGEX) do |paragraph_gid|
24
+ paragraph = GlobalID::Locator.locate(paragraph_gid)
25
+ Decidim::EnhancedTextwork::ParagraphPresenter.new(paragraph).display_mention
26
+ rescue ActiveRecord::RecordNotFound
27
+ paragraph_id = paragraph_gid.split("/").last
28
+ "~#{paragraph_id}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ # This module contains all the domain logic associated to Decidim's Paragraph
6
+ # component admin panel.
7
+ module Admin
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ # This is the engine that runs on the public interface of `decidim-paragraphs`.
6
+ class AdminEngine < ::Rails::Engine
7
+ isolate_namespace Decidim::EnhancedTextwork::Admin
8
+
9
+ paths["db/migrate"] = nil
10
+ paths["lib/tasks"] = nil
11
+
12
+ routes do
13
+ resources :paragraphs, only: [:show, :index, :new, :create, :edit, :update] do
14
+ resources :valuation_assignments, only: [:destroy]
15
+ collection do
16
+ post :update_category
17
+ post :publish_answers
18
+ post :update_scope
19
+ resource :paragraphs_import, only: [:new, :create]
20
+ resource :paragraphs_merge, only: [:create]
21
+ resource :paragraphs_split, only: [:create]
22
+ resource :valuation_assignment, only: [:create, :destroy]
23
+ end
24
+ member do
25
+ delete :destroy_draft
26
+ end
27
+ resources :paragraph_answers, only: [:edit, :update]
28
+ resources :paragraph_notes, only: [:create]
29
+ end
30
+
31
+ resources :participatory_texts, only: [:index] do
32
+ collection do
33
+ get :new_editor
34
+ get :new_import
35
+ post :import
36
+ patch :import
37
+ post :import_from_editor
38
+ patch :import_from_editor
39
+ post :update
40
+ post :discard
41
+ end
42
+ end
43
+
44
+ root to: "paragraphs#index"
45
+ end
46
+
47
+ def load_seed
48
+ nil
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module EnhancedTextwork
5
+ autoload :ParagraphInputFilter, "decidim/api/paragraph_input_filter"
6
+ autoload :ParagraphInputSort, "decidim/api/paragraph_input_sort"
7
+ autoload :ParagraphType, "decidim/api/paragraph_type"
8
+ autoload :ParagraphsType, "decidim/api/paragraphs_type"
9
+ end
10
+ end