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
@@ -1,48 +0,0 @@
1
- ((exports) => {
2
- const hashtags = [];
3
-
4
- const collectHashtags = (text) => {
5
- let tags = [];
6
- if(text) {
7
- const gids = text.match(/gid:\/\/[^\s<]+/g)
8
- if(gids) {
9
- tags = gids.filter(gid => gid.indexOf("/Decidim::Hashtag/") != -1).map(gid => {
10
- const parts = gid.split("/");
11
- const fromSelector = parts[5].charAt(0) == '_';
12
- const tag = fromSelector ? parts[5].substr(1) : parts[5];
13
- const name = '#' + tag;
14
- const html = `<a href="/search?term=${name}">${name}</a>`;
15
- const hashtag = {
16
- color: getComputedStyle(document.documentElement).getPropertyValue('--secondary'),
17
- gid: gid,
18
- id: parseInt(parts[4], 10),
19
- fromSelector: fromSelector,
20
- tag: tag,
21
- name: name,
22
- html: html
23
- }
24
- hashtags.push(hashtag)
25
- return hashtag;
26
- });
27
- }
28
- }
29
- return tags;
30
- };
31
-
32
- const removeHashtags = (text) => {
33
- return text.replace(/gid:\/\/[^\s<]+/g, "");
34
- };
35
-
36
- const appendHtmlHashtags = (text, tags) => {
37
- tags.forEach(tag => {
38
- text += ` ${tag.html}`;
39
- });
40
- return text;
41
- };
42
-
43
- exports.AwesomeMap = exports.AwesomeMap || {};
44
- exports.AwesomeMap.hashtags = hashtags;
45
- exports.AwesomeMap.collectHashtags = collectHashtags;
46
- exports.AwesomeMap.appendHtmlHashtags = appendHtmlHashtags;
47
- exports.AwesomeMap.removeHashtags = removeHashtags;
48
- })(window);
@@ -1,107 +0,0 @@
1
- // = require leaflet.featuregroup.subgroup
2
- // = require decidim/decidim_awesome/awesome_map/utilities
3
- // = require decidim/decidim_awesome/awesome_map/categories
4
- // = require decidim/decidim_awesome/awesome_map/hashtags
5
-
6
- ((exports) => {
7
- const { collapsedMenu, options, categories } = exports.AwesomeMap;
8
- const layers = {};
9
- const cluster = L.markerClusterGroup();
10
-
11
- const control = L.control.layers(null, null, {
12
- position: 'topleft',
13
- sortLayers: false,
14
- collapsed: collapsedMenu(),
15
- // hideSingleBase: true
16
- });
17
-
18
- const addProposalsControls = (map, component) => {
19
- // add control layer for proposals
20
- layers.proposals = {
21
- label: `<span class="awesome_map-component" id="awesome_map-component_${component.id}" title="0">${component.name || window.DecidimAwesome.texts.proposals}</span>`,
22
- group: L.featureGroup.subGroup(cluster)
23
- };
24
- control.addOverlay(layers.proposals.group, layers.proposals.label);
25
- layers.proposals.group.addTo(map);
26
-
27
- // add control layer for amendments if any
28
- if(options().menu.amendments && component.amendments) {
29
- layers.amendments = {
30
- label: `<span class="awesome_map-component" id="awesome_map-amendments_${component.id}" title="0">${window.DecidimAwesome.texts.amendments}</span>`,
31
- group: L.featureGroup.subGroup(cluster)
32
- }
33
- control.addOverlay(layers.amendments.group, layers.amendments.label);
34
- layers.amendments.group.addTo(map);
35
- }
36
- };
37
-
38
- const addMeetingsControls = (map, component) => {
39
- // add control layer for meetings
40
- layers.meetings = {
41
- label: `<span class="awesome_map-component" id="awesome_map-component_${component.id}" title="0">${component.name || window.DecidimAwesome.texts.meetings}</span>`,
42
- group: L.featureGroup.subGroup(cluster)
43
- };
44
- control.addOverlay(layers.meetings.group, layers.meetings.label);
45
- // console.log("map",map,"cluster", cluster, "layers", layers, "component", component)
46
- layers.meetings.group.addTo(map);
47
- };
48
-
49
- const addSearchControls = () => {
50
- $(control.getContainer()).contents("form").after(`<div id="awesome_map-categories-control" class="active"><b class="awesome_map-title-control">${window.DecidimAwesome.texts.categories}</b><div class="categories-container"></div></div>
51
- <div id="awesome_map-hashtags-control"><b class="awesome_map-title-control">${window.DecidimAwesome.texts.hashtags}</b><div class="hashtags-container"></div><a href="#" class="awesome_map-toggle_all_tags">${window.DecidimAwesome.texts.select_deselect_all}</a></div>`);
52
- };
53
-
54
- const addCategoriesControls = (map) => {
55
- if(categories && categories.length) {
56
- categories.forEach((category) => {
57
- // add control layer for this category
58
- const label = `<i class="awesome_map-category-${category.id}"></i> ${category.name}`;
59
- layers[category.id] = {
60
- label: label,
61
- group: L.featureGroup.subGroup(cluster)
62
- };
63
- layers[category.id].group.addTo(map);
64
- // In the next iteration to be sure layers are rendered
65
- setTimeout(() => {
66
- $('#awesome_map-categories-control .categories-container').append(`<label data-layer="${category.id}" class="awesome_map-category-${category.id}${category.parent?" subcategory":""}"><input type="checkbox" class="awesome_map-categories-selector" checked><span>${label}</span></label>`);
67
- });
68
- });
69
- }
70
- };
71
-
72
- // Hashtags are collected directly from proposals (this is different than categories)
73
- const addHashtagsControls = (map, hashtags, marker) => {
74
- // show hashtag layer
75
- if(hashtags && hashtags.length) {
76
- $('#awesome_map-hashtags-control').show();
77
- hashtags.forEach(hashtag => {
78
- // Add layer if not exists, otherwise just add the marker to the group
79
- if(!layers[hashtag.tag]) {
80
- layers[hashtag.tag] = {
81
- label: hashtag.name,
82
- group: L.featureGroup.subGroup(cluster)
83
- };
84
- layers[hashtag.tag].group.addTo(map);
85
- $('#awesome_map-hashtags-control .hashtags-container').append(`<label data-layer="${hashtag.tag}" class="awesome_map-hashtag-${hashtag.tag}"><input type="checkbox" class="awesome_map-hashtags-selector" checked><span>${hashtag.name}</span></label>`);
86
- // Call a trigger, might be in service for customizations
87
- exports.AwesomeMap.hashtagAdded(hashtag, $('#awesome_map-hashtags-control .hashtags-container'));
88
- }
89
- marker.addTo(layers[hashtag.tag].group);
90
-
91
- const $label = $(`label.awesome_map-hashtag-${hashtag.tag}`);
92
- // update number of items
93
- $label.attr("title", (parseInt($label.attr("title") || 0) + 1) + " " + window.DecidimAwesome.texts.items);
94
- });
95
- }
96
- };
97
-
98
- exports.AwesomeMap.layers = layers;
99
- exports.AwesomeMap.control = control;
100
- exports.AwesomeMap.cluster = cluster;
101
- exports.AwesomeMap.addProposalsControls = addProposalsControls;
102
- exports.AwesomeMap.addMeetingsControls = addMeetingsControls;
103
- exports.AwesomeMap.addSearchControls = addSearchControls;
104
- exports.AwesomeMap.addCategoriesControls = addCategoriesControls;
105
- exports.AwesomeMap.addHashtagsControls = addHashtagsControls;
106
- exports.AwesomeMap.hashtagAdded = $.noop;
107
- })(window);
@@ -1,15 +0,0 @@
1
- $(function () {
2
- // Tries to load the map because we cannot be sure if leaflet and decicim maps is loaded yet (other views can initialize snippets or not)
3
- const waitForMap = ($map) => {
4
- const map = $map.data("map");
5
- if(window.AwesomeMap && window.AwesomeMap.loadMapElements && map) {
6
- window.AwesomeMap.loadMapElements(map);
7
- } else {
8
- setTimeout(() => {
9
- waitForMap($map);
10
- }, 100);
11
- }
12
- };
13
-
14
- waitForMap($("#awesome-map .google-map"));
15
- });
@@ -1,207 +0,0 @@
1
- // = require decidim/decidim_awesome/awesome_map/layers
2
- // = require decidim/decidim_awesome/awesome_map/utilities
3
- // = require decidim/decidim_awesome/awesome_map/markers
4
- // = require decidim/decidim_awesome/awesome_map/categories
5
- // = require decidim/decidim_awesome/awesome_map/proposals
6
- // = require decidim/decidim_awesome/awesome_map/meetings
7
- // = require_self
8
-
9
- ((exports) => {
10
- const {
11
- layers,
12
- hideControls,
13
- cluster,
14
- control,
15
- addProposalsControls,
16
- addMeetingsControls,
17
- addSearchControls,
18
- addCategoriesControls,
19
- addHashtagsControls,
20
- fetchProposals,
21
- fetchMeetings,
22
- options,
23
- show,
24
- components,
25
- amendments,
26
- allMarkers,
27
- drawMarker,
28
- getCategory
29
- } = exports.AwesomeMap;
30
- const $ = exports.$; // eslint-disable-line
31
-
32
- exports.AwesomeMap.allMarkersLoaded = $.noop;
33
-
34
- const autoResizeMap = (map) => {
35
- // Setup center/zoom options if specified, otherwise fitbounds
36
- if(options().center) {
37
- map.setView(options().center, options().zoom);
38
- } else if(cluster.getBounds().isValid()) {
39
- map.fitBounds(cluster.getBounds(), { padding: [50, 50] });
40
- }
41
- };
42
-
43
- exports.AwesomeMap.loadMapElements = (map) => {
44
- autoResizeMap(map);
45
- // legends
46
- control.addTo(map);
47
- cluster.addTo(map);
48
- if(hideControls()) {
49
- $(control.getContainer()).hide()
50
- }
51
-
52
- // Load markers
53
- components().forEach((component) => {
54
- if(component.type == "proposals") {
55
- addProposalsControls(map, component);
56
-
57
- fetchProposals(component, '', (element, marker) => {
58
- // console.log(element.state, show[element.state || 'notAnswered'], show, element);
59
- if(show()[element.state || 'notAnswered']) {
60
- drawMarker(element, marker, component).addTo(layers.proposals.group);
61
- // Add hashtags menu items here, only hashtags with proposals associated will be present
62
- if(options().menu.hashtags) {
63
- addHashtagsControls(map, element.hashtags, marker);
64
- }
65
- }
66
- }, () => { // final call
67
- // Setup center/zoom options if specified, otherwise fitbounds
68
- autoResizeMap(map);
69
-
70
- allMarkers.forEach((item) => {
71
- // add marker to amendments layers if it's an amendment
72
- if(amendments.find((a) => a == item.element.id)) {
73
- item.marker.removeFrom(layers.proposals.group);
74
- if(options().menu.amendments) {
75
- item.marker.addTo(layers.amendments.group);
76
- }
77
- }
78
- });
79
- // Call a trigger, might be useful for customizations
80
- exports.AwesomeMap.allMarkersLoaded();
81
- });
82
- }
83
-
84
- if(options().menu.meetings && component.type == "meetings") {
85
- addMeetingsControls(map, component);
86
-
87
- fetchMeetings(component, '', (element, marker) => {
88
- drawMarker(element, marker, component).addTo(layers.meetings.group);
89
- }, () => autoResizeMap(map) );
90
- }
91
- });
92
-
93
- /*
94
- * We add all categories and hide those that have no proposals
95
- * This is done this way to ensure all parent categories are displayed
96
- * even if the have not proposals associated
97
- */
98
- addSearchControls(map);
99
- addCategoriesControls(map);
100
-
101
- // category events
102
- $("#awesome-map").on("change", ".awesome_map-categories-selector", (e) => {
103
- e.preventDefault();
104
- e.stopPropagation();
105
- const id = $(e.target).closest("label").data("layer");
106
- const cat = getCategory(id);
107
- // console.log("changed, layer", id, "cat", cat, "checked", e.target.checked, e);
108
- if(cat) {
109
- const layer = layers[cat.id];
110
- if(e.target.checked) {
111
- // show group of markers
112
- map.addLayer(layer.group);
113
-
114
- // if it's a children, put the parent to indeterminate
115
- indeterminateInput(cat.parent);
116
- } else {
117
- // hide group of markers
118
- map.removeLayer(layer.group);
119
- // if it's a children, put the parent to indeterminate
120
- cat.children().forEach((c) => {
121
- let $el = $(`.awesome_map-category-${c.id}`);
122
- if($el.parent().prev().prop("checked")) {
123
- $el.click();
124
- }
125
- });
126
- }
127
- // sync tags
128
- updateHashtagLayers();
129
- }
130
- });
131
-
132
- const indeterminateInput = (id) => {
133
- $('[class^="awesome_map-category-"]').parent().prev().prop("indeterminate", false);
134
- if(id) {
135
- let $input = $(`.awesome_map-category-${id}`).parent().prev();
136
- if(!$input.prop("checked")) {
137
- $input.prop("indeterminate", true);
138
- }
139
- }
140
- };
141
-
142
- const updateHashtagLayers = () => {
143
- // hide all
144
- $(".awesome_map-hashtags-selector").each((_idx, el) => {
145
- const layer = layers[$(el).closest("label").data("layer")];
146
- if(layer) {
147
- map.removeLayer(layer.group);
148
- }
149
- });
150
- // show selected only
151
- $(".awesome_map-hashtags-selector:checked").each((_idx, el) => {
152
- const layer = layers[$(el).closest("label").data("layer")];
153
- if(layer) {
154
- map.addLayer(layer.group);
155
- }
156
- });
157
- // hide non-selected categories
158
- $(".awesome_map-categories-selector:not(:checked)").each((_idx, el) => {
159
- const layer = layers[$(el).closest("label").data("layer")];
160
- if(layer) {
161
- map.addLayer(layer.group);
162
- map.removeLayer(layer.group);
163
- }
164
- });
165
- };
166
-
167
- // hashtag events
168
- $("#awesome-map").on("change", ".awesome_map-hashtags-selector", (e) => {
169
- e.preventDefault();
170
- e.stopPropagation();
171
- const tag = $(e.target).closest("label").data("layer");
172
- // console.log("changed, layer", tag, "checked", e.target.checked, e);
173
- if(tag) {
174
- updateHashtagLayers();
175
- }
176
- });
177
-
178
- // select/deselect all tags
179
- $("#awesome-map").on("click", ".awesome_map-toggle_all_tags", (e) => {
180
- e.preventDefault();
181
- e.stopPropagation();
182
- $("#awesome-map .awesome_map-hashtags-selector").prop("checked", $("#awesome-map .awesome_map-hashtags-selector:checked").length < $("#awesome-map .awesome_map-hashtags-selector").length);
183
- updateHashtagLayers();
184
- });
185
-
186
- // sub-layer hashtag title toggle
187
- $("#awesome-map").on("click", ".awesome_map-title-control", (e) => {
188
- e.preventDefault();
189
- e.stopPropagation();
190
- $("#awesome_map-hashtags-control").toggleClass("active");
191
- });
192
- };
193
-
194
- // order hashtags alphabetically
195
- exports.AwesomeMap.hashtagAdded = (_hashtag, $div) => {
196
- let $last = $div.contents("label:last");
197
- if($last.prev("label").length) {
198
- // move the label to order it alphabetically
199
- $div.contents("label").each((_idx, el) => {
200
- if($(el).text().localeCompare($last.text()) > 0) {
201
- $(el).before($last);
202
- return false;
203
- }
204
- });
205
- }
206
- };
207
- })(window);
@@ -1,56 +0,0 @@
1
- // = require jsrender.min
2
- // = require decidim/decidim_awesome/awesome_map/layers
3
- // = require decidim/decidim_awesome/awesome_map/categories
4
-
5
- ((exports) => {
6
- const { getCategory, layers } = exports.AwesomeMap;
7
-
8
- const popupMeetingTemplateId = "marker-meeting-popup";
9
- const popupProposalTemplateId = "marker-proposal-popup";
10
- const allMarkers = [];
11
-
12
- const drawMarker = (element, marker, component) => {
13
- let tmpl = component.type === "proposals" ? popupProposalTemplateId : popupMeetingTemplateId,
14
- node = document.createElement("div");
15
-
16
- $($.templates(`#${tmpl}`).render(element)).appendTo(node);
17
-
18
- marker.bindPopup(node, {
19
- maxwidth: 640,
20
- minWidth: 500,
21
- keepInView: true,
22
- className: "map-info"
23
- }).openPopup();
24
-
25
- allMarkers.push({
26
- marker: marker,
27
- component: component,
28
- element: element
29
- });
30
-
31
- // Add to category layer
32
- let cat = getCategory(element.category);
33
- if(layers[cat.id]) {
34
- $('#awesome_map-categories-control').show();
35
- marker.addTo(layers[cat.id].group);
36
- // show category if hidden
37
- const $label = $(`label.awesome_map-category-${cat.id}`);
38
- const $parent = $(`label.awesome_map-category-${cat.parent}`);
39
- $label.show();
40
- // update number of items
41
- $label.attr("title", (parseInt($label.attr("title") || 0) + 1) + " " + window.DecidimAwesome.texts.items);
42
- // show parent if apply
43
- $parent.show();
44
- $parent.attr("title", (parseInt($parent.attr("title") || 0) + 1) + " " + window.DecidimAwesome.texts.items);
45
- }
46
-
47
- // update component stats
48
- const $component = $(`#awesome_map-component_${component.id}`);
49
- $component.attr("title", parseInt($component.attr("title") || 0) + 1);
50
-
51
- return marker;
52
- };
53
-
54
- exports.AwesomeMap.allMarkers = allMarkers;
55
- exports.AwesomeMap.drawMarker = drawMarker;
56
- })(window);
@@ -1,132 +0,0 @@
1
- // = require decidim/decidim_awesome/awesome_map/api_fetcher
2
- // = require decidim/decidim_awesome/awesome_map/categories
3
- // = require decidim/decidim_awesome/awesome_map/utilities
4
-
5
- ((exports) => {
6
- const { getCategory, truncate } = exports.AwesomeMap;
7
- const query = `query ($id: ID!, $after: String!) {
8
- component(id: $id) {
9
- id
10
- __typename
11
- ... on Meetings {
12
- meetings(first: 50, after: $after) {
13
- pageInfo {
14
- hasNextPage
15
- endCursor
16
- }
17
- edges {
18
- node {
19
- id
20
- title {
21
- translations {
22
- text
23
- locale
24
- }
25
- }
26
- description {
27
- translations {
28
- text
29
- locale
30
- }
31
- }
32
- startTime
33
- location {
34
- translations {
35
- text
36
- locale
37
- }
38
- }
39
- address
40
- locationHints {
41
- translations {
42
- text
43
- locale
44
- }
45
- }
46
- coordinates {
47
- latitude
48
- longitude
49
- }
50
- category {
51
- id
52
- }
53
- }
54
- }
55
- }
56
- }
57
- }
58
- }`;
59
-
60
- // Shows a human figure instead of a dot
61
- const MeetingIcon = L.DivIcon.SVGIcon.extend({
62
- options: {
63
- fillColor: "#ef604d",
64
- opacity: 0
65
- },
66
- _createPathDescription: function() {
67
- return "M 15.991543,4 C 7.3956015,4 2.9250351,10.5 3.000951,16.999999 3.1063486,26.460968 12.747693,30.000004 15.991543,43 19.242091,30.000004 29,26.255134 29,16.999999 29,10.5 23.951131,4 15.996007,4 m -0.153508,2.6000001 a 2.1720294,2.1076698 0 0 1 2.330514,2.1124998 2.177008,2.1125006 0 0 1 -4.354016,0 2.1720294,2.1076698 0 0 1 2.023502,-2.1124998 m -2.651707,4.8056679 h 5.610202 l 3.935584,7.569899 -1.926038,0.934266 -2.009546,-3.859265 v 14.557403 h -2.484243 v -9.126003 h -0.642162 v 9.126003 H 13.190347 V 16.050568 l -2.009545,3.859265 -1.926036,-0.934266 3.935581,-7.569899";
68
- },
69
- _createCircle: function() {
70
- return ""
71
- },
72
- // Improved version of the _createSVG, essentially the same as in later
73
- // versions of Leaflet. It adds the `px` values after the width and height
74
- // CSS making the focus borders work correctly across all browsers.
75
- _createSVG: function() {
76
- const path = this._createPath();
77
- const circle = this._createCircle();
78
- const text = this._createText();
79
- const className = `${this.options.className}-svg`;
80
-
81
- const style = `width:${this.options.iconSize.x}px; height:${this.options.iconSize.y}px;`;
82
-
83
- const svg = `<svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="${className}" style="${style}">${path}${circle}${text}</svg>`;
84
-
85
- return svg;
86
- }
87
- });
88
-
89
- const createMarker = (element, callback) => {
90
- const marker = L.marker([element.coordinates.latitude, element.coordinates.longitude], {
91
- icon: new MeetingIcon({
92
- fillColor: getCategory(element.category).color
93
- })
94
- });
95
-
96
- element.title.translation = ApiFetcher.findTranslation(element.title.translations);
97
- element.description.translation = truncate(ApiFetcher.findTranslation(element.description.translations)).replace(/\n/g, "<br>");
98
- element.location.translation = ApiFetcher.findTranslation(element.location.translations);
99
- element.locationHints.translation = ApiFetcher.findTranslation(element.locationHints.translations);
100
- callback(element, marker);
101
- };
102
-
103
- const fetchMeetings = (component, after, callback, finalCall = () => {}) => {
104
-
105
- const variables = {
106
- "id": component.id,
107
- "after": after
108
- };
109
- const api = new ApiFetcher(query, variables);
110
- api.fetchAll((result) => {
111
- if(result) {
112
- result.component.meetings.edges.forEach((element) => {
113
- if(!element.node) return;
114
-
115
- if(element.node.coordinates && element.node.coordinates.latitude && element.node.coordinates.longitude) {
116
- element.node.link = component.url + '/meetings/' + element.node.id;
117
- createMarker(element.node, callback);
118
- }
119
- });
120
-
121
- if (result.component.meetings.pageInfo.hasNextPage) {
122
- fetchMeetings(component, result.component.meetings.pageInfo.endCursor, callback, finalCall);
123
- } else {
124
- finalCall();
125
- }
126
- }
127
- });
128
- };
129
-
130
- exports.AwesomeMap = exports.AwesomeMap || {};
131
- exports.AwesomeMap.fetchMeetings = fetchMeetings;
132
- })(window);
@@ -1,107 +0,0 @@
1
- // = require decidim/decidim_awesome/awesome_map/api_fetcher
2
- // = require decidim/decidim_awesome/awesome_map/categories
3
- // = require decidim/decidim_awesome/awesome_map/hashtags
4
- // = require decidim/decidim_awesome/awesome_map/utilities
5
-
6
- ((exports) => {
7
- const { getCategory, truncate, collectHashtags, removeHashtags, appendHtmlHashtags } = exports.AwesomeMap;
8
- const query = `query ($id: ID!, $after: String!) {
9
- component(id: $id) {
10
- id
11
- __typename
12
- ... on Proposals {
13
- proposals(first: 50, after: $after){
14
- pageInfo {
15
- hasNextPage
16
- endCursor
17
- }
18
- edges {
19
- node {
20
- id
21
- state
22
- title {
23
- translations {
24
- text
25
- locale
26
- }
27
- }
28
- body {
29
- translations {
30
- text
31
- locale
32
- }
33
- }
34
- address
35
- coordinates {
36
- latitude
37
- longitude
38
- }
39
- amendments {
40
- emendation {
41
- id
42
- }
43
- }
44
- category {
45
- id
46
- }
47
- }
48
- }
49
- }
50
- }
51
- }
52
- }`;
53
-
54
- let amendments = [];
55
- const ProposalIcon = L.DivIcon.SVGIcon.DecidimIcon;
56
-
57
- const createMarker = (element, callback) => {
58
- const marker = L.marker([element.coordinates.latitude, element.coordinates.longitude], {
59
- icon: new ProposalIcon({
60
- fillColor: getCategory(element.category).color
61
- })
62
- });
63
-
64
- element.title.translation = ApiFetcher.findTranslation(element.title.translations);
65
- const body = ApiFetcher.findTranslation(element.body.translations);
66
- element.hashtags = collectHashtags(body);
67
- element.body.translation = appendHtmlHashtags(truncate(removeHashtags(body)).replace(/\n/g, "<br>"), element.hashtags);
68
-
69
- callback(element, marker);
70
- };
71
-
72
- const fetchProposals = (component, after, callback, finalCall = () => {}) => {
73
- const variables = {
74
- "id": component.id,
75
- "after": after
76
- };
77
- const api = new ApiFetcher(query, variables);
78
- api.fetchAll((result) => {
79
- if(result) {
80
- result.component.proposals.edges.forEach((element) => {
81
- if(!element.node) return;
82
-
83
- if(element.node.coordinates && element.node.coordinates.latitude && element.node.coordinates.longitude) {
84
- element.node.link = component.url + '/proposals/' + element.node.id;
85
- createMarker(element.node, callback);
86
- }
87
-
88
- // Check if it has amendments, add it to a list
89
- if(element.node.amendments && element.node.amendments.length) {
90
- element.node.amendments.forEach((amendment) => {
91
- amendments.push(amendment.emendation.id);
92
- });
93
- }
94
- });
95
- if (result.component.proposals.pageInfo.hasNextPage) {
96
- fetchProposals(component, result.component.proposals.pageInfo.endCursor, callback, finalCall);
97
- } else {
98
- finalCall();
99
- }
100
- }
101
- });
102
- };
103
-
104
- exports.AwesomeMap = exports.AwesomeMap || {};
105
- exports.AwesomeMap.fetchProposals = fetchProposals;
106
- exports.AwesomeMap.amendments = amendments;
107
- })(window);