decidim-decidim_awesome 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -35
  3. data/Rakefile +11 -12
  4. data/app/cells/decidim/decidim_awesome/content_blocks/map/error.erb +11 -0
  5. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +1 -61
  6. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +11 -0
  7. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +8 -4
  8. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +51 -0
  9. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +47 -0
  10. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +49 -0
  11. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +12 -5
  12. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +58 -0
  13. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +15 -22
  14. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +9 -1
  15. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +91 -0
  16. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +5 -8
  17. data/app/controllers/decidim/decidim_awesome/blank_component_controller.rb +19 -0
  18. data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +2 -3
  19. data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +1 -1
  20. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +2 -6
  21. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +2 -0
  22. data/app/forms/decidim/decidim_awesome/admin/custom_redirect_form.rb +45 -0
  23. data/app/forms/decidim/decidim_awesome/editor_image_form.rb +3 -2
  24. data/app/forms/decidim/decidim_awesome/proposals/proposal_wizard_create_step_form_override.rb +38 -0
  25. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +22 -9
  26. data/app/helpers/decidim/decidim_awesome/admin/system_checker_helpers.rb +36 -0
  27. data/app/helpers/decidim/decidim_awesome/map_helper.rb +18 -12
  28. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +2 -2
  29. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +106 -0
  30. data/app/models/decidim/decidim_awesome/editor_image.rb +4 -9
  31. data/app/packs/entrypoints/decidim_admin_decidim_awesome.js +5 -0
  32. data/app/packs/entrypoints/decidim_admin_decidim_awesome.scss +1 -0
  33. data/app/packs/entrypoints/decidim_admin_decidim_awesome_custom_fields.js +2 -0
  34. data/app/packs/entrypoints/decidim_decidim_awesome.js +9 -0
  35. data/app/packs/entrypoints/decidim_decidim_awesome.scss +1 -0
  36. data/app/packs/entrypoints/decidim_decidim_awesome_admin_form_exit_warn.js +1 -0
  37. data/app/packs/entrypoints/decidim_decidim_awesome_custom_fields.js +1 -0
  38. data/app/packs/entrypoints/decidim_decidim_awesome_iframe.scss +1 -0
  39. data/app/packs/entrypoints/decidim_decidim_awesome_map.js +5 -0
  40. data/app/packs/entrypoints/decidim_decidim_awesome_map.scss +1 -0
  41. data/app/{assets → packs}/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
  42. data/app/{assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 → packs/src/decidim/decidim_awesome/admin/auto_edit.js} +39 -34
  43. data/app/packs/src/decidim/decidim_awesome/admin/check_redirections.js +48 -0
  44. data/app/{assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 → packs/src/decidim/decidim_awesome/admin/codemirror.js} +4 -4
  45. data/app/packs/src/decidim/decidim_awesome/admin/constraints.js +55 -0
  46. data/app/{assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 → packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js} +23 -26
  47. data/app/{assets/javascripts/decidim/decidim_awesome/admin/form_exit_warn.js.es6 → packs/src/decidim/decidim_awesome/admin/form_exit_warn.js} +0 -2
  48. data/app/{assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 → packs/src/decidim/decidim_awesome/admin/user_picker.js} +3 -3
  49. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +23 -0
  50. data/app/packs/src/decidim/decidim_awesome/awesome_application.js +17 -0
  51. data/app/{assets/javascripts/decidim/decidim_awesome/awesome_map/api_fetcher.js.es6 → packs/src/decidim/decidim_awesome/awesome_map/api/api_fetcher.js} +1 -15
  52. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/fetcher.js +131 -0
  53. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/meetings_fetcher.js +59 -0
  54. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +52 -0
  55. data/app/packs/src/decidim/decidim_awesome/awesome_map/awesome_map.js +130 -0
  56. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +112 -0
  57. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/meetings_controller.js +31 -0
  58. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +88 -0
  59. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +221 -0
  60. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +51 -0
  61. data/app/packs/src/decidim/decidim_awesome/editors/editor.js +190 -0
  62. data/app/{assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 → packs/src/decidim/decidim_awesome/editors/tabs_focus.js} +4 -6
  63. data/app/{assets/javascripts/decidim/decidim_awesome/forms/autosave.js.es6 → packs/src/decidim/decidim_awesome/forms/autosave.js} +20 -17
  64. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +207 -0
  65. data/app/{assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 → packs/src/decidim/decidim_awesome/forms/rich_text_plugin.js} +21 -20
  66. data/app/packs/src/decidim/decidim_awesome/proposals/custom_fields.js +22 -0
  67. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +25 -0
  68. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-resize.min.js +0 -0
  69. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-upload.min.js +0 -0
  70. data/{vendor/assets/javascripts → app/packs/src/vendor}/jquery.truncate.js +0 -0
  71. data/app/packs/src/vendor/leaflet.featuregroup.subgroup.js +184 -0
  72. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +2 -1
  73. data/app/packs/stylesheets/decidim/decidim_awesome/admin/check_redirections.scss +28 -0
  74. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +8 -6
  75. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/constraints.scss +13 -13
  76. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +37 -10
  77. data/app/packs/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +41 -0
  78. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin.scss +71 -0
  79. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_application.scss +19 -0
  80. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +3 -3
  81. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +176 -0
  82. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +6 -4
  83. data/app/packs/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +58 -0
  84. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -2
  85. data/app/packs/stylesheets/vendor/select2-foundation-theme.scss +348 -0
  86. data/app/presenters/decidim/decidim_awesome/menu_item_presenter_override.rb +25 -0
  87. data/app/presenters/decidim/decidim_awesome/menu_presenter_override.rb +23 -0
  88. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +26 -0
  89. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +4 -16
  90. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +28 -22
  91. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +1 -1
  92. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +1 -1
  93. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -0
  94. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +1 -1
  95. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +7 -6
  96. data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +1 -1
  97. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +3 -3
  98. data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +1 -1
  99. data/app/views/decidim/decidim_awesome/admin/custom_redirects/_form.html.erb +6 -0
  100. data/app/views/decidim/decidim_awesome/admin/custom_redirects/edit.html.erb +13 -0
  101. data/app/views/decidim/decidim_awesome/admin/custom_redirects/index.html.erb +37 -0
  102. data/app/views/decidim/decidim_awesome/admin/custom_redirects/new.html.erb +13 -0
  103. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +1 -1
  104. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +1 -1
  105. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +5 -3
  106. data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +1 -1
  107. data/app/views/decidim/decidim_awesome/map_component/map/_api_ready.html.erb +3 -0
  108. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +68 -0
  109. data/app/views/decidim/decidim_awesome/map_component/map/{error.erb → error.html.erb} +2 -0
  110. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -67
  111. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  112. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +13 -9
  113. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +0 -2
  114. data/app/views/{v0.24 → v0.25}/decidim/proposals/collaborative_drafts/_show.html.erb +0 -0
  115. data/app/views/{v0.23 → v0.25}/layouts/decidim/_head.html.erb +12 -10
  116. data/app/views/v0.25/layouts/decidim/admin/_header.html.erb +11 -0
  117. data/app/views/{v0.23 → v0.26}/decidim/proposals/collaborative_drafts/_show.html.erb +1 -7
  118. data/app/views/{v0.24 → v0.26}/layouts/decidim/_head.html.erb +16 -10
  119. data/app/views/v0.26/layouts/decidim/admin/_header.html.erb +11 -0
  120. data/config/assets.rb +46 -0
  121. data/config/i18n-tasks.yml +6 -0
  122. data/config/locales/ca.yml +75 -13
  123. data/config/locales/cs.yml +63 -1
  124. data/config/locales/en.yml +67 -1
  125. data/config/locales/es.yml +63 -1
  126. data/config/locales/eu.yml +0 -232
  127. data/config/locales/fr.yml +115 -53
  128. data/config/locales/it.yml +63 -1
  129. data/config/locales/ja.yml +64 -3
  130. data/config/locales/nl.yml +5 -46
  131. data/config/locales/pt-BR.yml +346 -0
  132. data/config/locales/pt-PT.yml +7 -0
  133. data/config/locales/pt.yml +7 -0
  134. data/config/locales/sv.yml +67 -182
  135. data/lib/decidim/decidim_awesome/admin_engine.rb +10 -15
  136. data/lib/decidim/decidim_awesome/awesome.rb +214 -0
  137. data/lib/decidim/decidim_awesome/awesome_helpers.rb +0 -7
  138. data/lib/decidim/decidim_awesome/checksums.yml +13 -16
  139. data/lib/decidim/decidim_awesome/config.rb +1 -0
  140. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +39 -0
  141. data/lib/decidim/decidim_awesome/engine.rb +27 -55
  142. data/lib/decidim/decidim_awesome/iframe_component/admin_engine.rb +23 -0
  143. data/lib/decidim/decidim_awesome/iframe_component/component.rb +5 -5
  144. data/lib/decidim/decidim_awesome/map_component/admin_engine.rb +23 -0
  145. data/lib/decidim/decidim_awesome/map_component/component.rb +5 -4
  146. data/lib/decidim/decidim_awesome/map_component/engine.rb +34 -0
  147. data/lib/decidim/decidim_awesome/menu_hacker.rb +1 -0
  148. data/lib/decidim/decidim_awesome/test/factories.rb +2 -2
  149. data/lib/decidim/decidim_awesome/test/initializer.rb +25 -0
  150. data/lib/decidim/decidim_awesome/test/layouts/decidim/_head.html.erb +30 -2
  151. data/lib/decidim/decidim_awesome/test/layouts/decidim/admin/_header.html.erb +7 -2
  152. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +18 -0
  153. data/lib/decidim/decidim_awesome/test/shared_examples/controller_examples.rb +13 -0
  154. data/lib/decidim/decidim_awesome/test/shared_examples/custom_redirects_contexts.rb +47 -0
  155. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +0 -17
  156. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +9 -17
  157. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +202 -0
  158. data/lib/decidim/decidim_awesome/version.rb +2 -2
  159. data/lib/decidim/decidim_awesome.rb +4 -152
  160. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +37 -0
  161. data/lib/tasks/decidim_awesome_webpacker_tasks.rake +62 -0
  162. metadata +111 -113
  163. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +0 -3
  164. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +0 -2
  165. data/app/assets/config/decidim_decidim_awesome_manifest.css +0 -5
  166. data/app/assets/config/decidim_decidim_awesome_manifest.js +0 -4
  167. data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +0 -2
  168. data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +0 -4
  169. data/app/assets/javascripts/decidim/decidim_awesome/admin/constraints.js.es6 +0 -54
  170. data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +0 -80
  171. data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +0 -7
  172. data/app/assets/javascripts/decidim/decidim_awesome/awesome_application.js +0 -3
  173. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/categories.js.es6 +0 -25
  174. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +0 -48
  175. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +0 -107
  176. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +0 -15
  177. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +0 -207
  178. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +0 -56
  179. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +0 -132
  180. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +0 -107
  181. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +0 -57
  182. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +0 -172
  183. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +0 -185
  184. data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +0 -211
  185. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +0 -7
  186. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +0 -3
  187. data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +0 -21
  188. data/app/assets/javascripts/decidim/decidim_awesome/proposals/images.js.es6 +0 -25
  189. data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +0 -35
  190. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_admin.scss +0 -64
  191. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +0 -22
  192. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +0 -18
  193. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +0 -160
  194. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +0 -22
  195. data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +0 -28
  196. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +0 -39
  197. data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +0 -39
  198. data/app/controllers/decidim/decidim_awesome/iframe_component/application_controller.rb +0 -15
  199. data/app/controllers/decidim/decidim_awesome/map_component/application_controller.rb +0 -15
  200. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +0 -12
  201. data/app/views/v0.24/layouts/decidim/admin/_header.html.erb +0 -12
  202. data/lib/decidim/decidim_awesome/test/themes/css.lvh.me.css +0 -3
  203. data/lib/decidim/decidim_awesome/test/themes/erb.lvh.me.scss.erb +0 -2
  204. data/lib/decidim/decidim_awesome/test/themes/scss.lvh.me.scss +0 -1
  205. data/lib/decidim/decidim_awesome/test/themes/test-theme/body.scss +0 -4
  206. data/vendor/assets/images/layers-2x.png +0 -0
  207. data/vendor/assets/images/layers.png +0 -0
  208. data/vendor/assets/images/marker-icon.png +0 -0
  209. data/vendor/assets/javascripts/codemirror-4.inline-attachment.js +0 -89
  210. data/vendor/assets/javascripts/codemirror.js +0 -9801
  211. data/vendor/assets/javascripts/delta.min.js +0 -405
  212. data/vendor/assets/javascripts/delta.min.js.map +0 -1
  213. data/vendor/assets/javascripts/europa.min.js +0 -4
  214. data/vendor/assets/javascripts/form-builder.min.js +0 -19
  215. data/vendor/assets/javascripts/form-render.min.js +0 -19
  216. data/vendor/assets/javascripts/form-storage.js +0 -824
  217. data/vendor/assets/javascripts/highlight.min.js +0 -44
  218. data/vendor/assets/javascripts/inline-attachment.js +0 -399
  219. data/vendor/assets/javascripts/inscrybmde.min.js +0 -7
  220. data/vendor/assets/javascripts/jquery-ui.min.js +0 -13
  221. data/vendor/assets/javascripts/jquery.inline-attachment.js +0 -66
  222. data/vendor/assets/javascripts/jsrender.min.js +0 -4
  223. data/vendor/assets/javascripts/keymap/sublime.js +0 -720
  224. data/vendor/assets/javascripts/leaflet.featuregroup.subgroup.js +0 -6
  225. data/vendor/assets/javascripts/mode/css/css.js +0 -864
  226. data/vendor/assets/javascripts/select2.js +0 -6147
  227. data/vendor/assets/langs/en-US.lang +0 -110
  228. data/vendor/assets/stylesheets/codemirror.css +0 -350
  229. data/vendor/assets/stylesheets/default.min.css +0 -1
  230. data/vendor/assets/stylesheets/foundation.min.css +0 -1
  231. data/vendor/assets/stylesheets/github.min.css +0 -2
  232. data/vendor/assets/stylesheets/inscrybmde.min.scss +0 -194
  233. data/vendor/assets/stylesheets/jquery-ui.min.css +0 -7
  234. data/vendor/assets/stylesheets/select2-foundation-theme.css +0 -249
  235. data/vendor/assets/stylesheets/select2.css +0 -515
@@ -0,0 +1,207 @@
1
+ require("formBuilder/dist/form-render.min.js")
2
+ import "src/decidim/decidim_awesome/forms/rich_text_plugin"
3
+
4
+ export default class CustomFieldsRenderer { // eslint-disable-line no-unused-vars
5
+ constructor(container_selector) {
6
+ this.container_selector = container_selector || ".proposal_custom_field:last";
7
+ this.lang = this.getLang($("html").attr("lang"));
8
+ }
9
+
10
+ getLang(lang) {
11
+ const langs = {
12
+ // ar: 'ar-SA', // Not in decidim yet
13
+ "ar": "ar-TN",
14
+ "ca": "ca-ES",
15
+ "cs": "cs-CZ",
16
+ "da": "da-DK",
17
+ "de": "de-DE",
18
+ "el": "el-GR",
19
+ "en": "en-US",
20
+ "es": "es-ES",
21
+ "fa": "fa-IR",
22
+ "fi": "fi-FI",
23
+ "fr": "fr-FR",
24
+ "he": "he-IL",
25
+ "hu": "hu-HU",
26
+ "it": "it-IT",
27
+ "ja": "ja-JP",
28
+ "my": "my-MM",
29
+ "nb": "nb-NO",
30
+ "nl": "nl-NL",
31
+ "pl": "pl-PL",
32
+ "pt": "pt-BR",
33
+ "qz": "qz-MM",
34
+ "ro": "ro-RO",
35
+ "ru": "ru-RU",
36
+ "sl": "sl-SI",
37
+ "th": "th-TH",
38
+ "tr": "tr-TR",
39
+ "uk": "uk-UA",
40
+ "vi": "vi-VN",
41
+ "zh-TW": "zh-TW",
42
+ "zh": "zh-CN"
43
+ };
44
+ if (langs[lang]) {
45
+ return langs[lang];
46
+ }
47
+ if (langs[lang.substr(0, 2)]) {
48
+ return langs[lang.substr(0, 2)];
49
+ }
50
+ return "en-US";
51
+ }
52
+
53
+ /*
54
+ * Creates an XML document with a subset of html-compatible dl/dd/dt elements
55
+ * to store the custom fields answers
56
+ */
57
+ dataToXML(data) {
58
+ const $dl = $("<dl/>");
59
+ let $dd, $div, $dt, key, l, label, text, val;
60
+ $dl.attr("class", "decidim_awesome-custom_fields");
61
+ $dl.attr("data-generator", "decidim_awesome");
62
+ $dl.attr("data-version", window.DecidimAwesome.version);
63
+ for (key in data) {
64
+ // console.log("get the data!", key, data[key]);
65
+ // Richtext plugin does not saves userdata, so we get it from the hidden input
66
+ if (data[key].type == "textarea" && data[key].subtype == "richtext") {
67
+ data[key].userData = [$(`#${data[key].name}-input`).val()];
68
+ }
69
+ if (data[key].userData && data[key].userData.length) {
70
+ $dt = $("<dt/>");
71
+ $dt.text(data[key].label);
72
+ $dt.attr("name", data[key].name);
73
+ $dd = $("<dd/>");
74
+ // console.log("data for", key, data[key].name, data[key])
75
+ for (val in data[key].userData) {
76
+ $div = $("<div/>");
77
+ label = data[key].userData[val];
78
+ text = null;
79
+ if (data[key].values) {
80
+ l = data[key].values.find((v) => v.value == label);
81
+ if (l) {
82
+ text = label;
83
+ label = l.label;
84
+ }
85
+ } else if (data[key].type == "date" && label) {
86
+ l = new Date(label).toLocaleDateString();
87
+ if (l) {
88
+ text = label;
89
+ label = l;
90
+ }
91
+ }
92
+ // console.log("userData", text, "label", label, 'key', key, 'data', data)
93
+ if (data[key].type == "textarea" && data[key].subtype == "richtext") {
94
+ $div.html(label);
95
+ } else {
96
+ $div.text(label);
97
+ }
98
+ if (text) {
99
+ $div.attr("alt", text);
100
+ }
101
+ $dd.append($div);
102
+ }
103
+ $dd.attr("id", data[key].name);
104
+ $dd.attr("name", data[key].type);
105
+ $dl.append($dt);
106
+ $dl.append($dd);
107
+ }
108
+ }
109
+ return `<xml>${$dl[0].outerHTML}</xml>`;
110
+ }
111
+
112
+ fixBuggyFields() {
113
+ if (!this.$container) {
114
+ return false;
115
+ }
116
+
117
+ /**
118
+ * Hack to fix required checkboxes being reset
119
+ * Issue: https://github.com/Platoniq/decidim-module-decidim_awesome/issues/82
120
+ */
121
+ this.$container.find(".formbuilder-checkbox-group").each((_key, group) => {
122
+ const inputs = $(".formbuilder-checkbox input", group);
123
+ const data = this.spec.find((a) => a.type == "checkbox-group");
124
+ let values = data.userData;
125
+ if (!inputs.length || !data || !values) {
126
+ return;
127
+ }
128
+
129
+ inputs.each((_idx, input) => {
130
+ let index = values.indexOf(input.value);
131
+ if (index >= 0) {
132
+ values.splice(index, 1)
133
+ // setting checked=true do not makes the browser aware that the form is valid if the field is required
134
+ if (!input.checked)
135
+ {$(input).click();}
136
+ } else if (input.checked)
137
+ {$(input).click();}
138
+ });
139
+
140
+ // Fill "other" option
141
+ const other_option = $(".other-option", inputs.parent())[0];
142
+ const other_val = $(".other-val", inputs.parent())[0];
143
+ const other_text = values.join(" ");
144
+
145
+ if (other_option) {
146
+ if (other_text) {
147
+ other_option.checked = true;
148
+ other_option.value = other_text;
149
+ other_val.value = other_text;
150
+ } else {
151
+ other_option.checked = false;
152
+ other_option.value = "";
153
+ other_val.value = "";
154
+ }
155
+ }
156
+ });
157
+
158
+ /**
159
+ * Hack to fix required radio buttons "other" value
160
+ * Issue: https://github.com/Platoniq/decidim-module-decidim_awesome/issues/133
161
+ */
162
+ this.$container.find(".formbuilder-radio input.other-val").on("input", (input) => {
163
+ const $input = $(input.currentTarget);
164
+ const $group = $input.closest(".formbuilder-radio-group");
165
+ $group.find("input").each((_key, radio) => {
166
+ const name = $(radio).attr("name");
167
+ if (name && name.endsWith("[]")) {
168
+ $(radio).attr("name", name.slice(0, -2));
169
+ }
170
+ });
171
+ });
172
+ }
173
+
174
+ // Saves xml to the hidden input
175
+ storeData() {
176
+ if (!this.$container) {
177
+ return false;
178
+ }
179
+ const $form = this.$container.closest("form");
180
+ const $body = $form.find(`input[name="${this.$element.data("name")}"]`);
181
+ if ($body.length && this.instance) {
182
+ this.spec = this.instance.userData;
183
+ $body.val(this.dataToXML(this.spec));
184
+ this.$element.data("spec", this.spec);
185
+ }
186
+ // console.log("storeData spec", this.spec, "$body", $body,"$form",$form,"this",this);
187
+ }
188
+
189
+ init($element) {
190
+ this.$element = $element;
191
+ this.spec = $element.data("spec");
192
+ if (!this.$container) {
193
+ this.$container = $(this.container_selector);
194
+ }
195
+ // console.log("init", $element, "this", this)
196
+ // always use the last field (in case of multilang tabs we only render one form due a limitation of the library to handle several instances)
197
+ this.instance = this.$container.formRender({
198
+ i18n: {
199
+ locale: this.lang,
200
+ location: "https://cdn.jsdelivr.net/npm/formbuilder-languages@1.1.0/"
201
+ },
202
+ formData: this.spec,
203
+ render: true
204
+ });
205
+ this.fixBuggyFields();
206
+ }
207
+ }
@@ -1,19 +1,18 @@
1
1
  /**
2
- *
3
- * NOTE: For some reason, this seems to throw an error while transpiling
4
- * For this reason a rich_text_plugin.js is provided using the online transpiler https://babeljs.io/repl
5
- * Hopefully, this situation will change when webpacker is updated in the v0.25 of Decidim
6
- *
7
2
  * Decidim rich text editor control plugin
8
3
  * Renders standard Decidim WYSIWYG editor
9
4
  *
10
5
  * Registers Decidim Richtext as a subtype for the textarea control
11
6
  */
7
+ import {createQuillEditor} from "src/decidim/decidim_awesome/editors/editor"
12
8
 
13
9
  // configure the class for runtime loading
14
- if (!window.fbControls) window.fbControls = []
10
+ if (!window.fbControls) {
11
+ window.fbControls = []
12
+ }
15
13
  window.fbControls.push(function(controlClass, allControlClasses) {
16
14
  const controlTextarea = allControlClasses.textarea
15
+
17
16
  /**
18
17
  * DecidimRichtext control class
19
18
  *
@@ -22,16 +21,17 @@ window.fbControls.push(function(controlClass, allControlClasses) {
22
21
  * from the hidden input name same as the field with the suffix '-input'
23
22
  */
24
23
  class controlRichtext extends controlTextarea {
24
+
25
25
  /**
26
26
  * Class configuration - return the icons & label related to this control
27
27
  * @returndefinition object
28
28
  */
29
29
  static get definition() {
30
30
  return {
31
- icon: '📝',
31
+ icon: "📝",
32
32
  i18n: {
33
- default: 'Rich Text Editor'
34
- },
33
+ default: "Rich Text Editor"
34
+ }
35
35
  }
36
36
  }
37
37
 
@@ -50,26 +50,27 @@ window.fbControls.push(function(controlClass, allControlClasses) {
50
50
  const { value, userData, ...attrs } = this.config;
51
51
 
52
52
  // hidden input for storing the current HTML value of the div
53
- this.inputId = this.id + '-input'
54
- this.input = this.markup('input', null, {
53
+ this.inputId = `${this.id}-input`;
54
+ // console.log("build plugin: this",this)
55
+ this.input = this.markup("input", null, {
55
56
  name: name,
56
57
  id: this.inputId,
57
- type: 'hidden',
58
- value: (userData && userData[0]) || value
58
+ type: "hidden",
59
+ value: (userData && userData[0]) || value || ""
59
60
  });
60
61
 
61
62
  const css = this.markup(
62
- 'style',
63
+ "style",
63
64
  `
64
- #${attrs.id} { height: auto; padding-left: 0; padding-right: 0; }
65
+ #${attrs.id} { height: auto; min-height: 6rem; padding-left: 0; padding-right: 0; }
65
66
  #${attrs.id} div.ql-container { height: ${attrs.rows || 1}rem; }
66
67
  #${attrs.id} p.help-text { margin-top: .5rem; }
67
68
  `,
68
- { type: 'text/css' }
69
+ { type: "text/css" }
69
70
  );
70
71
  // console.log("build value", value, "userData", userData, "attrs", attrs, attrs.id);
71
- this.wrapper = this.markup('div', null, attrs);
72
- return this.markup('div', [css, this.input, this.wrapper], attrs);
72
+ this.wrapper = this.markup("div", null, attrs);
73
+ return this.markup("div", [css, this.input, this.wrapper], attrs);
73
74
  }
74
75
 
75
76
  /**
@@ -86,7 +87,7 @@ window.fbControls.push(function(controlClass, allControlClasses) {
86
87
  window.fbEditors.quill[this.id] = {};
87
88
  const editor = window.fbEditors.quill[this.id];
88
89
  // createQuillEditor does all the job to update the hidden input wrapper
89
- editor.instance = window.Decidim.createQuillEditor(this.wrapper);
90
+ editor.instance = createQuillEditor(this.wrapper);
90
91
  // editor.data = new Delta();
91
92
  // if (value) {
92
93
  // editor.instance.setContents(window.JSON.parse(this.parsedHtml(value)));
@@ -102,5 +103,5 @@ window.fbControls.push(function(controlClass, allControlClasses) {
102
103
  }
103
104
 
104
105
  // register Decidim richtext as a richtext control
105
- controlTextarea.register('richtext', controlRichtext, 'textarea');
106
+ controlTextarea.register("richtext", controlRichtext, "textarea");
106
107
  })
@@ -0,0 +1,22 @@
1
+ import CustomFieldsRenderer from "src/decidim/decidim_awesome/forms/custom_fields_renderer"
2
+
3
+ window.DecidimAwesome.CustomFieldsRenderer = window.DecidimAwesome.CustomFieldsRenderer || new CustomFieldsRenderer();
4
+
5
+ $(() => {
6
+ // use admin multilang specs if exists
7
+ let $el = $("proposal_custom_field:first", ".tabs-title.is-active");
8
+ $el = $el.length
9
+ ? $el
10
+ : $(".proposal_custom_field:first");
11
+ window.DecidimAwesome.CustomFieldsRenderer.init($el);
12
+
13
+ window.DecidimAwesome.CustomFieldsRenderer.$container.closest("form").on("submit", (e) => {
14
+ if (e.target.checkValidity()) {
15
+ // save current editor
16
+ window.DecidimAwesome.CustomFieldsRenderer.storeData();
17
+ } else {
18
+ e.preventDefault();
19
+ e.target.reportValidity();
20
+ }
21
+ });
22
+ });
@@ -0,0 +1,25 @@
1
+ $(() => {
2
+ window.DecidimAwesome = window.DecidimAwesome || {};
3
+
4
+ const token = $('meta[name="csrf-token"]').attr("content");
5
+ const $textarea = $("textarea#proposal_body");
6
+ const t = window.DecidimAwesome.texts.drag_and_drop_image;
7
+
8
+ if (!$textarea.length) {
9
+ return;
10
+ }
11
+
12
+ if (window.DecidimAwesome.allow_images_in_proposals) {
13
+ // Add the capability to upload images only (they will be presented as links)
14
+
15
+ $textarea.after(`<p class="help-text">${t}</p>`);
16
+ $textarea.inlineattachment({
17
+ uploadUrl: window.DecidimAwesome.editor_uploader_path,
18
+ uploadFieldName: "image",
19
+ jsonFieldName: "url",
20
+ progressText: "[Uploading file...]",
21
+ urlText: "{filename}",
22
+ extraHeaders: { "X-CSRF-Token": token }
23
+ });
24
+ }
25
+ });
@@ -0,0 +1,184 @@
1
+ L.FeatureGroup.SubGroup = L.FeatureGroup.extend({
2
+
3
+ /**
4
+ * Instantiates a SubGroup.
5
+ * @param parentGroup (L.LayerGroup) (optional)
6
+ * @param layersArray (L.Layer[]) (optional)
7
+ */
8
+ initialize: function (parentGroup, layersArray) {
9
+ L.FeatureGroup.prototype.initialize.call(this, layersArray);
10
+
11
+ this.setParentGroup(parentGroup);
12
+ },
13
+
14
+ /**
15
+ * Changes the parent group into which child markers are added to /
16
+ * removed from.
17
+ * @param parentGroup (L.LayerGroup)
18
+ * @returns {SubGroup} this
19
+ */
20
+ setParentGroup: function (parentGroup) {
21
+ var pgInstanceOfLG = parentGroup instanceof L.LayerGroup;
22
+
23
+ this._parentGroup = parentGroup;
24
+
25
+ // onAdd
26
+ this.onAdd =
27
+ pgInstanceOfLG ?
28
+ (
29
+ typeof parentGroup.addLayers === "function" ?
30
+ this._onAddToGroupBatch :
31
+ this._onAddToGroup
32
+ ) :
33
+ this._onAddToMap;
34
+
35
+ // onRemove
36
+ this.onRemove =
37
+ pgInstanceOfLG ?
38
+ (
39
+ typeof parentGroup.removeLayers === "function" ?
40
+ this._onRemoveFromGroupBatch :
41
+ this._onRemoveFromGroup
42
+ ) :
43
+ this._onRemoveFromMap;
44
+
45
+ // addLayer
46
+ this.addLayer = pgInstanceOfLG ?
47
+ this._addLayerToGroup :
48
+ this._addLayerToMap;
49
+
50
+ // removeLayer
51
+ this.removeLayer = pgInstanceOfLG ?
52
+ this._removeLayerFromGroup :
53
+ this._removeLayerFromMap;
54
+
55
+ return this;
56
+ },
57
+
58
+ /**
59
+ * Removes the current sub-group from map before changing the parent
60
+ * group. Re-adds the sub-group to map if it was before changing.
61
+ * @param parentGroup (L.LayerGroup)
62
+ * @returns {SubGroup} this
63
+ */
64
+ setParentGroupSafe: function (parentGroup) {
65
+ var map = this._map;
66
+
67
+ if (map) {
68
+ map.removeLayer(this);
69
+ }
70
+
71
+ this.setParentGroup(parentGroup);
72
+
73
+ if (map) {
74
+ map.addLayer(this);
75
+ }
76
+
77
+ return this;
78
+ },
79
+
80
+ /**
81
+ * Returns the current parent group.
82
+ * @returns {*}
83
+ */
84
+ getParentGroup: function () {
85
+ return this._parentGroup;
86
+ },
87
+
88
+
89
+ // For parent groups with batch methods (addLayers and removeLayers)
90
+ // like MarkerCluster.
91
+ _onAddToGroupBatch: function (map) {
92
+ var layersArray = this.getLayers();
93
+
94
+ this._map = map;
95
+ this._parentGroup.addLayers(layersArray);
96
+ },
97
+
98
+ _onRemoveFromGroupBatch: function () {
99
+ var layersArray = this.getLayers();
100
+
101
+ this._parentGroup.removeLayers(layersArray);
102
+ this._map = null;
103
+ },
104
+
105
+
106
+ // For other parent layer groups.
107
+ _onAddToGroup: function (map) {
108
+ var parentGroup = this._parentGroup;
109
+
110
+ this._map = map;
111
+ this.eachLayer(parentGroup.addLayer, parentGroup);
112
+ },
113
+
114
+ _onRemoveFromGroup: function () {
115
+ var parentGroup = this._parentGroup;
116
+
117
+ this.eachLayer(parentGroup.removeLayer, parentGroup);
118
+ this._map = null;
119
+ },
120
+
121
+
122
+ // Defaults to standard FeatureGroup behaviour when parent group is not
123
+ // specified or is not a type of LayerGroup.
124
+ _onAddToMap: L.FeatureGroup.prototype.onAdd,
125
+ _onRemoveFromMap: L.FeatureGroup.prototype.onRemove,
126
+
127
+
128
+ _addLayerToGroup: function (layer) {
129
+ if (this.hasLayer(layer)) {
130
+ return this;
131
+ }
132
+
133
+ layer.addEventParent(this);
134
+
135
+ var id = this.getLayerId(layer);
136
+ console.log("adtogroup id",id,"layer",layer,"this",this)
137
+ this._layers[id] = layer;
138
+
139
+ if (this._map) {
140
+ // Add to parent group instead of directly to map.
141
+ this._parentGroup.addLayer(layer);
142
+ }
143
+
144
+ return this.fire("layeradd", {layer: layer});
145
+ },
146
+
147
+ _removeLayerFromGroup: function (layer) {
148
+ // If unknown layer, skip.
149
+ if (!this.hasLayer(layer)) {
150
+ return this;
151
+ }
152
+
153
+ // Retrieve the layer id.
154
+ var id = layer in this._layers ? layer : this.getLayerId(layer);
155
+
156
+ // Retrieve the layer from this._layer.
157
+ layer = this._layers[id];
158
+
159
+ // Unregister from events parent.
160
+ layer.removeEventParent(this);
161
+
162
+ if (this._map && layer) {
163
+ // Remove from parent group instead of directly from map.
164
+ this._parentGroup.removeLayer(layer);
165
+ }
166
+
167
+ delete this._layers[id];
168
+
169
+ return this.fire("layerremove", {layer: layer});
170
+ },
171
+
172
+ // Defaults to standard FeatureGroup behaviour when parent group is not
173
+ // specified or is not a type of LayerGroup.
174
+ _addLayerToMap: L.FeatureGroup.prototype.addLayer,
175
+ _removeLayerFromMap: L.FeatureGroup.prototype.removeLayer
176
+
177
+ });
178
+
179
+
180
+
181
+ // Supply with a factory for consistency with Leaflet.
182
+ L.featureGroup.subGroup = function (parentGroup, options) {
183
+ return new L.FeatureGroup.SubGroup(parentGroup, options);
184
+ };
@@ -6,10 +6,11 @@ input.awesome-auto-edit {
6
6
  line-height: 0;
7
7
  height: auto;
8
8
  }
9
+
9
10
  span.awesome-auto-edit {
10
11
  padding: 0 4px;
11
12
  background-color: #f0f0f0;
12
13
  border-radius: 5px;
13
14
  margin: 0;
14
15
  font-weight: 600;
15
- }
16
+ }
@@ -0,0 +1,28 @@
1
+ .custom-redirections-table {
2
+ th,
3
+ td {
4
+ text-align: left !important;
5
+ }
6
+
7
+ td.redirect-status {
8
+ font-family: monospace;
9
+
10
+ &.success {
11
+ &::before {
12
+ content: "OK! ";
13
+ }
14
+ }
15
+
16
+ &.alert {
17
+ &::before {
18
+ content: "ERR ";
19
+ }
20
+ }
21
+
22
+ &.muted {
23
+ &::before {
24
+ content: "N/A ";
25
+ }
26
+ }
27
+ }
28
+ }
@@ -1,11 +1,13 @@
1
- .awesome-edit-config{
1
+ @import "codemirror/lib/codemirror.css";
2
+
3
+ .awesome-edit-config {
2
4
  .scoped_styles_container,
3
- .proposal_custom_fields_container{
4
- .form-error{
5
+ .proposal_custom_fields_container {
6
+ .form-error {
5
7
  margin: 0;
6
8
  }
7
9
 
8
- >.CodeMirror{
10
+ >.CodeMirror {
9
11
  border-top-left-radius: 5px;
10
12
  border-top-right-radius: 5px;
11
13
  border-top: .5em solid #e0e0e0;
@@ -17,8 +19,8 @@
17
19
  resize: vertical;
18
20
  overflow: vertical !important;
19
21
 
20
- >.CodeMirror-scroll{
21
- >.CodeMirror-gutters{
22
+ >.CodeMirror-scroll {
23
+ >.CodeMirror-gutters {
22
24
  background: #e0e0e0;
23
25
  }
24
26
  }
@@ -1,47 +1,47 @@
1
- .constraints-editor{
1
+ .constraints-editor {
2
2
  background: #f6f6f6;
3
3
  padding: 1rem;
4
4
  margin: -.5rem 0 2rem;
5
5
  border-radius: 5px;
6
6
 
7
- .constraints-list{
7
+ .constraints-list {
8
8
  padding: 0;
9
9
  // margin:0 0 1em 0 ;
10
- li{
10
+ li {
11
11
  margin: 0 1em 0 0;
12
12
  padding: 0;
13
13
  }
14
14
 
15
- .label{
16
- &.participatory_space_manifest{
15
+ .label {
16
+ &.participatory_space_manifest {
17
17
  background-color: #f7b230;
18
18
  }
19
19
 
20
- &.participatory_space_slug{
20
+ &.participatory_space_slug {
21
21
  background-color: #19b380;
22
22
  }
23
23
 
24
- &.component_manifest{
24
+ &.component_manifest {
25
25
  background-color: #b31919;
26
26
  }
27
27
 
28
- &.component_id{
28
+ &.component_id {
29
29
  background-color: #ee449c;
30
30
  }
31
31
 
32
- &.constraint{
33
- &-none{
32
+ &.constraint {
33
+ &-none {
34
34
  background-color: #ff3000;
35
35
  }
36
36
  }
37
37
  }
38
38
 
39
- a{
39
+ a {
40
40
  margin-left: 1rem;
41
41
  }
42
42
 
43
- &.inactive{
44
- .label:not(.constraint-none){
43
+ &.inactive {
44
+ .label:not(.constraint-none) {
45
45
  filter: saturate(10%);
46
46
  }
47
47
  }