decidim-decidim_awesome 0.7.0 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -9
  3. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +2 -2
  4. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -2
  5. data/app/assets/config/decidim_decidim_awesome_manifest.css +2 -2
  6. data/app/assets/config/decidim_decidim_awesome_manifest.js +3 -2
  7. data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +2 -0
  8. data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +4 -0
  9. data/app/assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 +77 -0
  10. data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +2 -3
  11. data/app/assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 +80 -0
  12. data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +80 -0
  13. data/app/assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 +24 -0
  14. data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +7 -0
  15. data/app/assets/javascripts/decidim/decidim_awesome/{application.js → awesome_application.js} +1 -2
  16. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +3 -2
  17. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +15 -0
  18. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +52 -56
  19. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +2 -2
  20. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +1 -1
  21. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +33 -24
  22. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +14 -2
  23. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +18 -4
  24. data/app/assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 +24 -0
  25. data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +211 -0
  26. data/app/assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 +106 -0
  27. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +5 -1
  28. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +0 -1
  29. data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +21 -0
  30. data/app/assets/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +15 -0
  31. data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +15 -4
  32. data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +12 -0
  33. data/app/assets/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +66 -0
  34. data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +35 -0
  35. data/app/assets/stylesheets/decidim/decidim_awesome/{admin.scss → awesome_admin.scss} +12 -0
  36. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +22 -0
  37. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +0 -1
  38. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +16 -1
  39. data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +28 -0
  40. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +74 -0
  41. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +54 -0
  42. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +61 -0
  43. data/app/cells/decidim/decidim_awesome/content_blocks/map_form_cell.rb +19 -0
  44. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +32 -0
  45. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +45 -0
  46. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +38 -0
  47. data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +4 -0
  48. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +40 -0
  49. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +40 -0
  50. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +1 -1
  51. data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +58 -0
  52. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +1 -0
  53. data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +39 -0
  54. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +31 -18
  55. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
  56. data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +38 -0
  57. data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +38 -0
  58. data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +38 -0
  59. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +39 -0
  60. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +3 -1
  61. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +11 -7
  62. data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +48 -0
  63. data/app/helpers/decidim/decidim_awesome/map_helper.rb +67 -16
  64. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +78 -0
  65. data/app/middleware/decidim/decidim_awesome/current_config.rb +182 -0
  66. data/app/models/decidim/decidim_awesome/awesome_config.rb +15 -0
  67. data/app/models/decidim/decidim_awesome/user_override.rb +25 -0
  68. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +2 -0
  69. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +1 -1
  70. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -0
  71. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +2 -2
  72. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +21 -0
  73. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +0 -3
  74. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +25 -0
  75. data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +0 -2
  76. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +4 -7
  77. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +4 -0
  78. data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +6 -0
  79. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +0 -2
  80. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +101 -0
  81. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +83 -0
  82. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -0
  83. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +25 -11
  84. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +4 -0
  85. data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
  86. data/app/views/v0.23/decidim/proposals/collaborative_drafts/_show.html.erb +134 -0
  87. data/app/views/v0.23/layouts/decidim/_head.html.erb +1 -1
  88. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +1 -1
  89. data/app/views/v0.24/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
  90. data/app/views/v0.24/layouts/decidim/_head.html.erb +2 -2
  91. data/app/views/v0.24/layouts/decidim/admin/_header.html.erb +2 -2
  92. data/config/locales/ca.yml +62 -3
  93. data/config/locales/cs.yml +62 -3
  94. data/config/locales/en.yml +90 -11
  95. data/config/locales/es.yml +61 -2
  96. data/config/locales/eu.yml +63 -4
  97. data/config/locales/fr.yml +62 -3
  98. data/config/locales/it.yml +284 -0
  99. data/config/locales/ja.yml +284 -0
  100. data/config/locales/nl.yml +62 -3
  101. data/config/locales/sv.yml +62 -3
  102. data/db/migrate/20210628150825_change_awesome_config_var_type.rb +12 -0
  103. data/lib/decidim/decidim_awesome/admin_engine.rb +16 -4
  104. data/lib/decidim/decidim_awesome/awesome_helpers.rb +17 -10
  105. data/lib/decidim/decidim_awesome/checksums.yml +17 -4
  106. data/lib/decidim/decidim_awesome/config.rb +53 -6
  107. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +27 -21
  108. data/lib/decidim/decidim_awesome/custom_fields.rb +94 -0
  109. data/lib/decidim/decidim_awesome/engine.rb +62 -6
  110. data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor.rb +116 -0
  111. data/lib/decidim/decidim_awesome/test/shared_examples/current_config_examples.rb +143 -0
  112. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +4 -0
  113. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +428 -0
  114. data/lib/decidim/decidim_awesome/version.rb +1 -1
  115. data/lib/decidim/decidim_awesome.rb +41 -8
  116. data/vendor/assets/javascripts/delta.min.js +405 -0
  117. data/vendor/assets/javascripts/delta.min.js.map +1 -0
  118. data/vendor/assets/javascripts/europa.min.js +4 -0
  119. data/vendor/assets/javascripts/form-builder.min.js +19 -0
  120. data/vendor/assets/javascripts/form-render.min.js +19 -0
  121. data/vendor/assets/javascripts/inscrybmde.min.js +1 -1
  122. data/vendor/assets/javascripts/jquery-ui.min.js +13 -0
  123. data/vendor/assets/javascripts/select2.js +6147 -0
  124. data/vendor/assets/langs/en-US.lang +110 -0
  125. data/vendor/assets/stylesheets/inscrybmde.min.scss +14 -0
  126. data/vendor/assets/stylesheets/jquery-ui.min.css +7 -0
  127. data/vendor/assets/stylesheets/select2-foundation-theme.css +249 -0
  128. data/vendor/assets/stylesheets/select2.css +515 -0
  129. metadata +68 -27
  130. data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
  131. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -3
  132. data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +0 -12
  133. data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +0 -8
  134. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +0 -27
  135. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +0 -58
  136. data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
  137. data/lib/decidim/decidim_awesome/content_renderers.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 431402f5979263fb5886d2285f64cb81bea75efd183e461d87cc3fff5a5f31fd
4
- data.tar.gz: 8b842985079085bd7ed837287e051572a6bbe51de233f8b1ccb5b0df63d35316
3
+ metadata.gz: 8913b46e29378088cc9b9eed9b69b0321e404f52900b725cea8e213bea47502e
4
+ data.tar.gz: 5a79234c4b57bd7ea62589f833fef5ffff0468d4fec7ef907cbaabeb96df4dc0
5
5
  SHA512:
6
- metadata.gz: 99427312051b0d7f486ba7070cd8eaab79f370cdc8c200e7b0f38de3f90236399fa6c44d86204d2e90d97cda0f15ab62b42a778bbfa8114126df4e70b86b9605
7
- data.tar.gz: 31cab4d0be0fc9d3add07cf9e33976cf6708ed96771d55c57415b9d0fcd060f09a8f1b2275fbeca284c7e9e168494849c40bc02bd1db6fedc0b03bbf2eb78100
6
+ metadata.gz: cde9b7f7cfa19d19a9a9157c152e34a7ac849fd75b8cb2a23ae487836e561ff43bb961fa83d38e495069a427ec67e35afe05f1131ba1cbdf3509d25161f2b16f
7
+ data.tar.gz: 20fa96490ce61a2679c13864e8b580f607b482a00176c684e1fd9f8014666f004a76299134c7096f57f9ff1e6aaaa2b4dca72df460fd1ad2180f5f129cea6291
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Decidim::DecidimAwesome
2
2
 
3
- [![[CI] Test 0.24](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test%20-24.yml/badge.svg)](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test%20-24.yml)
4
- [![[CI] Test 0.23](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test%20-23.yml/badge.svg)](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test%20-23.yml)
3
+ [![[CI] Test 0.24](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test-24.yml/badge.svg)](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test-24.yml)
4
+ [![[CI] Test 0.23](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test-23.yml/badge.svg)](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test-23.yml)
5
5
  [![Maintainability](https://api.codeclimate.com/v1/badges/2dada53525dd5a944089/maintainability)](https://codeclimate.com/github/Platoniq/decidim-module-decidim_awesome/maintainability)
6
6
  [![Test Coverage](https://codecov.io/gh/Platoniq/decidim-module-decidim_awesome/branch/master/graph/badge.svg?token=TFBMCLLZJG)](undefined)
7
7
 
@@ -10,7 +10,7 @@ Usability and UX tweaks for Decidim.
10
10
  This plugin allows the administrators to expand the possibilities of Decidim beyond some existing limitations.
11
11
  All tweaks are provided in a optional fashion with granular permissions that let the administrator to choose exactly where to apply those mods. Some tweaks can be applied to any assembly, other in an specific participatory process or even in type of component only.
12
12
 
13
- **This in beta status, we do not accept any responsibility for breaking anything. Feedback is appreciated though.**
13
+ **DISCLAIMER: This module is heavily tested and widely used, howevever we do not accept any responsibility for breaking anything. Feedback is appreciated though.**
14
14
 
15
15
  ## Why this plugin?
16
16
 
@@ -25,6 +25,8 @@ Because Decidim is awesome and so is this!
25
25
 
26
26
  Read the [CHANGELOG](CHANGELOG.md) for Decidim compatibility.
27
27
 
28
+ > **TL;DR people**: Jump to the [installation part](#installation)
29
+
28
30
  DecidimAwesome is a module that hacks Decidim in order to provide more features or improve some aspects of it.
29
31
 
30
32
  It generates and admin module that allows to choose what hacks to apply.
@@ -122,21 +124,37 @@ Feel free to hide, modify or add items in the Decidim's main menu. You can also
122
124
  ![Menu hacks screenshot](examples/menu-3.png)
123
125
  ![Menu hacks screenshot](examples/menu-4.png)
124
126
 
127
+ #### 12. Assign admins to specific scopes and prevent them modify anything else
128
+
129
+ Convert any user on the platform (that is not currently an admin) to a limited subset of participatory spaces or event compoponents. Just add users to a box and scope them to some constraints. These users will se the "Edit" button in everywhere they have permissions. Any access to unallowed zones will redirect the user to the admin index page.
130
+
131
+ ![Scoped admins authorized](examples/scoped_admins_authorized.png)
132
+ ![Scoped admins unauthorized](examples/scoped_admins_unauthorized.png)
133
+ ![Scoped admins configuration](examples/scoped_admins_config.png)
134
+
135
+ #### 13. Custom fields for proposals
136
+
137
+ Now admins can substitute the body of a proposal with a set of form fields.
138
+ Edition is make with a Drag & Drop interface in the admin and can (and should) be scoped to apply only to certain proposal components.
139
+
140
+ Technically, the content is stored in the database as an XML document compatible with normal HTML (it uses the DL/DT/DD elements).
141
+
142
+ ![Custom fields screenshot](examples/custom-fields-1.png)
143
+ ![Custom fields screenshot](examples/custom-fields-2.png)
144
+ ![Custom fields screenshot](examples/custom-fields-1.gif)
145
+
125
146
  #### To be continued...
126
147
 
127
- Some things in the road-map:
148
+ We're not done! Please check the [issues](/Platoniq/decidim-module-decidim_awesome/issues) (and participate) to see what's on our mind
128
149
 
129
- 1. Improve the conversation in comments by allowing images
130
- 1. Allow to create non-private surveys where the responding user is known by admins
131
- 1. Manipulate menus (reorder, change texts, add new items)
132
- 1. Propose something! or even better send a PR!
150
+ Also feel free to propose something! or even better send a PR!
133
151
 
134
152
  ## Installation
135
153
 
136
154
  Add this line to your application's Gemfile:
137
155
 
138
156
  ```ruby
139
- gem "decidim-decidim_awesome", "~> 0.7.0"
157
+ gem "decidim-decidim_awesome", "~> 0.7.2"
140
158
  ```
141
159
 
142
160
  And then execute:
@@ -155,6 +173,8 @@ Depending on your Decidim version, choose the corresponding Awesome version to e
155
173
  | 0.6.x | 0.22.x, 0.23.x |
156
174
  | 0.7.x | 0.23.x, 0.24.x |
157
175
 
176
+ > *Heads up!* version 0.7.1 requires database migrations! Don't forget the migrations step when updating.
177
+
158
178
  ## Configuration
159
179
 
160
180
  Each tweak can be enabled or disabled by default. It also can be deactivated so
@@ -178,6 +198,9 @@ Decidim::DecidimAwesome.configure do |config|
178
198
  # De-activated, admins don't even see it as an option
179
199
  config.use_markdown_editor = :disabled
180
200
 
201
+ # Disable scoped admins
202
+ config.scoped_admins = :disabled
203
+
181
204
  # any other config var from lib/decidim/decidim_awesome.rb
182
205
  ...
183
206
  end
@@ -1,3 +1,3 @@
1
1
  /*
2
- *= link decidim/decidim_awesome/admin.css
3
- */
2
+ *= link decidim/decidim_awesome/awesome_admin.css
3
+ */
@@ -1,3 +1,2 @@
1
- // = link decidim/decidim_awesome/admin.js
2
- // = link decidim/decidim_awesome/legacy_admin.js
1
+ // = link decidim/decidim_awesome/awesome_admin.js
3
2
  // = link decidim/decidim_awesome/admin/form_exit_warn.js
@@ -1,5 +1,5 @@
1
1
  /*
2
- *= link decidim/decidim_awesome/application.css
2
+ *= link decidim/decidim_awesome/awesome_application.css
3
3
  *= link decidim/decidim_awesome/awesome_map/map.css
4
4
  *= link decidim/decidim_awesome/awesome_iframe/iframe.css
5
- */
5
+ */
@@ -1,3 +1,4 @@
1
- // = link decidim/decidim_awesome/legacy_application.js
2
- // = link decidim/decidim_awesome/application.js
1
+ // = link decidim/decidim_awesome/awesome_application.js
3
2
  // = link decidim/decidim_awesome/awesome_map/map.js
3
+ // = link decidim/decidim_awesome/awesome_map/load_map.js
4
+ // = link decidim/decidim_awesome/proposals/custom_fields.js
@@ -0,0 +1,2 @@
1
+ // = link decidim/decidim_awesome/legacy_admin.js
2
+ // = link decidim/decidim_awesome/admin/form_exit_warn.js
@@ -0,0 +1,4 @@
1
+ // = link decidim/decidim_awesome/legacy_application.js
2
+ // = link decidim/decidim_awesome/awesome_map/map.js
3
+ // = link decidim/decidim_awesome/awesome_map/load_map.js
4
+ // = link decidim/decidim_awesome/proposals/custom_fields.js
@@ -0,0 +1,77 @@
1
+ // = require_self
2
+
3
+ let formBuilderList = formBuilderList || [];
4
+ let DecidimAwesome = DecidimAwesome || {};
5
+ $(() => {
6
+ $("body").on("click", "a.awesome-auto-edit", (e) => {
7
+ e.preventDefault();
8
+ const $link = $(e.currentTarget);
9
+ const scope = $link.data("scope");
10
+ const $target = $(`span.awesome-auto-edit[data-scope="${scope}"]`);
11
+ const $constraints = $(`.constraints-editor[data-key="${scope}"]`);
12
+ if($target.length == 0) return;
13
+
14
+ const key = $target.data('key');
15
+ const attribute = $target.data('var');
16
+ const $hidden = $(`[name="config[${attribute}][${key}]"]`);
17
+ const $multiple = $(`[name="config[${attribute}][${key}][]"]`);
18
+ const $container = $(`.${attribute}_container[data-key="${key}"]`);
19
+ const $delete = $('.delete-box', $container);
20
+
21
+ const rebuildLabel = (text, scope) => {
22
+ $target.text(text);
23
+ $target.attr("data-key", text);
24
+ $target.data("key", text);
25
+ if(scope) {
26
+ $target.attr("data-scope", scope);
27
+ $target.data("scope", scope);
28
+ $link.attr("data-scope", scope);
29
+ $link.data("scope", scope);
30
+ }
31
+ $link.show();
32
+ };
33
+
34
+ const rebuildHmtl = (result) => {
35
+ rebuildLabel(result.key, result.scope);
36
+ $constraints.replaceWith(result.html);
37
+ // update hidden input if exists
38
+ $hidden.attr("name", `config[${attribute}][${result.key}]`);
39
+ $multiple.attr("name", `config[${attribute}][${result.key}][]`);
40
+ $container.data("key", result.key);
41
+ $container.attr("data-key", result.key);
42
+ $delete.attr("href", $delete.attr("href").replace(`key=${key}`, `key=${result.key}`))
43
+ formBuilderList.forEach((builder) => {
44
+ if(builder.key == key) {
45
+ builder.key = result.key;
46
+ }
47
+ });
48
+ };
49
+
50
+ $target.html(`<input class="awesome-auto-edit" data-scope="${scope}" type="text" value="${key}">`);
51
+ const $input = $(`input.awesome-auto-edit[data-scope="${scope}"]`);
52
+ $link.hide();
53
+ $input.select();
54
+ $input.on("keypress", (e) => {
55
+ // if(e.code == "Space") {
56
+ // e.preventDefault();
57
+ // }
58
+ if(e.code == "Enter") {
59
+ e.preventDefault();
60
+ $.post(DecidimAwesome.rename_scope_label_path,
61
+ { key: key,
62
+ scope: scope,
63
+ attribute: attribute,
64
+ text: $input.val()
65
+ },
66
+ (result) => rebuildHmtl(result),
67
+ "json").fail((err) => {
68
+ console.error("Error saving key", key, "ERR:", err);
69
+ rebuildLabel(key);
70
+ })
71
+ }
72
+ });
73
+ $input.on("blur", () => {
74
+ rebuildLabel(key);
75
+ });
76
+ });
77
+ });
@@ -4,9 +4,8 @@
4
4
  // = require_self
5
5
 
6
6
  $(() => {
7
- $(".awesome-edit-config .scoped-style textarea").each((_idx, el) => {
8
- console.log(el)
9
- var editor = CodeMirror.fromTextArea(el, {
7
+ $(".awesome-edit-config .scoped_styles_container textarea").each((_idx, el) => {
8
+ CodeMirror.fromTextArea(el, {
10
9
  lineNumbers: true,
11
10
  mode: "css",
12
11
  keymap: "sublime"
@@ -0,0 +1,80 @@
1
+ // = require jquery-ui.min
2
+ // = require decidim/decidim_awesome/editors/quill_editor
3
+ // = require decidim/decidim_awesome/forms/rich_text_plugin
4
+ // = require form-builder.min
5
+ // = require_self
6
+
7
+ let formBuilderList = [];
8
+
9
+ $(() => {
10
+ $(".awesome-edit-config .proposal_custom_fields_editor").each((_idx, el) => {
11
+ const key = $(el).closest(".proposal_custom_fields_container").data("key");
12
+ // DOCS: https://formbuilder.online/docs
13
+ formBuilderList.push({
14
+ el: el,
15
+ key: key,
16
+ config: {
17
+ i18n: {
18
+ locale: 'en-US',
19
+ location: 'https://cdn.jsdelivr.net/npm/formbuilder-languages@1.1.0/'
20
+ },
21
+ formData: $(`input[name="config[proposal_custom_fields][${key}]"]`).val(),
22
+ disableFields: ['button', 'file'],
23
+ disabledActionButtons: ['save', 'data', 'clear'],
24
+ disabledAttrs: [
25
+ 'access',
26
+ 'inline',
27
+ 'className'
28
+ ],
29
+ controlOrder: [
30
+ "text",
31
+ "textarea",
32
+ "number",
33
+ "date",
34
+ "checkbox-group",
35
+ "radio-group",
36
+ "select",
37
+ "autocomplete",
38
+ "header",
39
+ "paragraph"
40
+ ],
41
+ disabledSubtypes: {
42
+ text: ['color'], // TODO: fix hashtag generator with this
43
+ // disable wysiwyg editors as they present problems
44
+ // TODO: create custom type to integrate decidim Quill Editor
45
+ textarea: ['tinymce', 'quill']
46
+ },
47
+ },
48
+ instance: null
49
+ });
50
+ });
51
+
52
+ $(document).on("formBuilder.create", (_event, i, list) => {
53
+ if(!list[i]) return;
54
+
55
+ $(list[i].el).formBuilder(list[i].config).promise.then(function(res){
56
+ list[i].instance = res;
57
+ // Attach to DOM
58
+ list[i].el.FormBuilder = res;
59
+ // remove spinner
60
+ $(list[i].el).find(".loading-spinner").remove();
61
+ // for external use
62
+ $(document).trigger("formBuilder.created", [list[i]]);
63
+ if(i < list.length) {
64
+ $(document).trigger("formBuilder.create", [i + 1, list]);
65
+ }
66
+ });
67
+ });
68
+
69
+ if(formBuilderList.length) {
70
+ $(document).trigger("formBuilder.create", [0, formBuilderList]);
71
+ }
72
+
73
+ $("form.awesome-edit-config").on("submit", () => {
74
+ // e.preventDefault();
75
+ formBuilderList.forEach((builder) =>{
76
+ $(`input[name="config[proposal_custom_fields][${builder.key}]"]`).val(builder.instance.actions.getData("json"));
77
+ });
78
+ });
79
+ });
80
+
@@ -0,0 +1,80 @@
1
+ // = require jquery-ui.min
2
+ // = require decidim/decidim_awesome/editors/legacy_quill_editor
3
+ // = require decidim/decidim_awesome/forms/rich_text_plugin
4
+ // = require form-builder.min
5
+ // = require_self
6
+
7
+ let formBuilderList = [];
8
+
9
+ $(() => {
10
+ $(".awesome-edit-config .proposal_custom_fields_editor").each((_idx, el) => {
11
+ const key = $(el).closest(".proposal_custom_fields_container").data("key");
12
+ // DOCS: https://formbuilder.online/docs
13
+ formBuilderList.push({
14
+ el: el,
15
+ key: key,
16
+ config: {
17
+ i18n: {
18
+ locale: 'en-US',
19
+ location: 'https://cdn.jsdelivr.net/npm/formbuilder-languages@1.1.0/'
20
+ },
21
+ formData: $(`input[name="config[proposal_custom_fields][${key}]"]`).val(),
22
+ disableFields: ['button', 'file'],
23
+ disabledActionButtons: ['save', 'data', 'clear'],
24
+ disabledAttrs: [
25
+ 'access',
26
+ 'inline',
27
+ 'className'
28
+ ],
29
+ controlOrder: [
30
+ "text",
31
+ "textarea",
32
+ "number",
33
+ "date",
34
+ "checkbox-group",
35
+ "radio-group",
36
+ "select",
37
+ "autocomplete",
38
+ "header",
39
+ "paragraph"
40
+ ],
41
+ disabledSubtypes: {
42
+ text: ['color'], // TODO: fix hashtag generator with this
43
+ // disable wysiwyg editors as they present problems
44
+ // TODO: create custom type to integrate decidim Quill Editor
45
+ textarea: ['tinymce', 'quill']
46
+ },
47
+ },
48
+ instance: null
49
+ });
50
+ });
51
+
52
+ $(document).on("formBuilder.create", (_event, i, list) => {
53
+ if(!list[i]) return;
54
+
55
+ $(list[i].el).formBuilder(list[i].config).promise.then(function(res){
56
+ list[i].instance = res;
57
+ // Attach to DOM
58
+ list[i].el.FormBuilder = res;
59
+ // remove spinner
60
+ $(list[i].el).find(".loading-spinner").remove();
61
+ // for external use
62
+ $(document).trigger("formBuilder.created", [list[i]]);
63
+ if(i < list.length) {
64
+ $(document).trigger("formBuilder.create", [i + 1, list]);
65
+ }
66
+ });
67
+ });
68
+
69
+ if(formBuilderList.length) {
70
+ $(document).trigger("formBuilder.create", [0, formBuilderList]);
71
+ }
72
+
73
+ $("form.awesome-edit-config").on("submit", () => {
74
+ // e.preventDefault();
75
+ formBuilderList.forEach((builder) =>{
76
+ $(`input[name="config[proposal_custom_fields][${builder.key}]"]`).val(builder.instance.actions.getData("json"));
77
+ });
78
+ });
79
+ });
80
+
@@ -0,0 +1,24 @@
1
+ // = require select2
2
+ // = require_self
3
+
4
+ $(() => {
5
+ $('select.multiusers-select').each(function() {
6
+ const url = $(this).attr("data-url");
7
+ $(this).select2({
8
+ ajax: {
9
+ url: url,
10
+ delay: 100,
11
+ dataType: "json",
12
+ processResults: (data) => {
13
+ return {
14
+ results: data
15
+ }
16
+ }
17
+ },
18
+ escapeMarkup: (markup) => markup,
19
+ templateSelection: (item) => `${item.text}`,
20
+ minimumInputLength: 1,
21
+ theme: "foundation"
22
+ });
23
+ });
24
+ });
@@ -0,0 +1,7 @@
1
+ // = require decidim/decidim_awesome/admin/constraints
2
+ // = require decidim/decidim_awesome/editors/quill_editor
3
+ // = require decidim/decidim_awesome/admin/form_builder
4
+ // = require decidim/decidim_awesome/editors/tabs_focus
5
+ // = require decidim/decidim_awesome/admin/codemirror
6
+ // = require decidim/decidim_awesome/admin/user_picker.js
7
+ // = require decidim/decidim_awesome/admin/auto_edit.js
@@ -1,4 +1,3 @@
1
1
  // = require decidim/decidim_awesome/proposals/images
2
2
  // = require decidim/decidim_awesome/editors/quill_editor
3
- // = require decidim/decidim_awesome/editors/markdown_view
4
- // = require decidim/decidim_awesome/forms/autosave
3
+ // = require decidim/decidim_awesome/forms/autosave
@@ -11,7 +11,7 @@
11
11
  const control = L.control.layers(null, null, {
12
12
  position: 'topleft',
13
13
  sortLayers: false,
14
- collapsed: collapsedMenu,
14
+ collapsed: collapsedMenu(),
15
15
  // hideSingleBase: true
16
16
  });
17
17
 
@@ -25,7 +25,7 @@
25
25
  layers.proposals.group.addTo(map);
26
26
 
27
27
  // add control layer for amendments if any
28
- if(options.menu.amendments && component.amendments) {
28
+ if(options().menu.amendments && component.amendments) {
29
29
  layers.amendments = {
30
30
  label: `<span class="awesome_map-component" id="awesome_map-amendments_${component.id}" title="0">${window.DecidimAwesome.texts.amendments}</span>`,
31
31
  group: L.featureGroup.subGroup(cluster)
@@ -42,6 +42,7 @@
42
42
  group: L.featureGroup.subGroup(cluster)
43
43
  };
44
44
  control.addOverlay(layers.meetings.group, layers.meetings.label);
45
+ // console.log("map",map,"cluster", cluster, "layers", layers, "component", component)
45
46
  layers.meetings.group.addTo(map);
46
47
  };
47
48
 
@@ -0,0 +1,15 @@
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
+ });
@@ -9,6 +9,7 @@
9
9
  ((exports) => {
10
10
  const {
11
11
  layers,
12
+ hideControls,
12
13
  cluster,
13
14
  control,
14
15
  addProposalsControls,
@@ -26,63 +27,68 @@
26
27
  drawMarker,
27
28
  getCategory
28
29
  } = exports.AwesomeMap;
30
+ const $ = exports.$; // eslint-disable-line
29
31
 
30
32
  exports.AwesomeMap.allMarkersLoaded = $.noop;
31
33
 
32
34
  const autoResizeMap = (map) => {
33
35
  // Setup center/zoom options if specified, otherwise fitbounds
34
- if(options.center) {
35
- map.setView(options.center, options.zoom);
36
- } else {
36
+ if(options().center) {
37
+ map.setView(options().center, options().zoom);
38
+ } else if(cluster.getBounds().isValid()) {
37
39
  map.fitBounds(cluster.getBounds(), { padding: [50, 50] });
38
40
  }
39
41
  };
40
42
 
41
- const loadElements = (map) => {
43
+ exports.AwesomeMap.loadMapElements = (map) => {
44
+ autoResizeMap(map);
42
45
  // legends
43
46
  control.addTo(map);
44
47
  cluster.addTo(map);
48
+ if(hideControls()) {
49
+ $(control.getContainer()).hide()
50
+ }
45
51
 
46
52
  // Load markers
47
- components.forEach((component) => {
53
+ components().forEach((component) => {
48
54
  if(component.type == "proposals") {
49
55
  addProposalsControls(map, component);
50
56
 
51
57
  fetchProposals(component, '', (element, marker) => {
52
- // console.log(element.state, show[element.state || 'notAnswered'], show, element);
53
- if(show[element.state || 'notAnswered']) {
54
- drawMarker(element, marker, component).addTo(layers.proposals.group);
55
- // Add hashtags menu items here, only hashtags with proposals associated will be present
56
- if(options.menu.hashtags) {
57
- addHashtagsControls(map, element.hashtags, marker);
58
- }
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);
59
64
  }
60
- }, () => { // final call
61
- // Setup center/zoom options if specified, otherwise fitbounds
62
- autoResizeMap(map);
63
-
64
- allMarkers.forEach((item) => {
65
- // add marker to amendments layers if it's an amendment
66
- if(amendments.find((a) => a == item.element.id)) {
67
- item.marker.removeFrom(layers.proposals.group);
68
- if(options.menu.amendments) {
69
- item.marker.addTo(layers.amendments.group);
70
- }
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);
71
76
  }
72
- });
73
- // Call a trigger, might be useful for customizations
74
- exports.AwesomeMap.allMarkersLoaded();
77
+ }
75
78
  });
76
- }
79
+ // Call a trigger, might be useful for customizations
80
+ exports.AwesomeMap.allMarkersLoaded();
81
+ });
82
+ }
77
83
 
78
- if(options.menu.meetings && component.type == "meetings") {
79
- addMeetingsControls(map, component);
84
+ if(options().menu.meetings && component.type == "meetings") {
85
+ addMeetingsControls(map, component);
80
86
 
81
- fetchMeetings(component, '', (element, marker) => {
82
- drawMarker(element, marker, component).addTo(layers.meetings.group);
83
- }, () => autoResizeMap(map) );
84
- }
85
- });
87
+ fetchMeetings(component, '', (element, marker) => {
88
+ drawMarker(element, marker, component).addTo(layers.meetings.group);
89
+ }, () => autoResizeMap(map) );
90
+ }
91
+ });
86
92
 
87
93
  /*
88
94
  * We add all categories and hide those that have no proposals
@@ -151,7 +157,6 @@
151
157
  // hide non-selected categories
152
158
  $(".awesome_map-categories-selector:not(:checked)").each((_idx, el) => {
153
159
  const layer = layers[$(el).closest("label").data("layer")];
154
- console.log(el, layer, map)
155
160
  if(layer) {
156
161
  map.addLayer(layer.group);
157
162
  map.removeLayer(layer.group);
@@ -186,26 +191,17 @@
186
191
  });
187
192
  };
188
193
 
189
-
190
- $("#map").on("ready.decidim", (_e, map) => {
191
- if(options.center) {
192
- map.setView(options.center, options.zoom);
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
+ });
193
205
  }
194
- loadElements(map);
195
-
196
- // order hashtags alphabetically
197
- exports.AwesomeMap.hashtagAdded = (_hashtag, $div) => {
198
- let $last = $div.contents("label:last");
199
- if($last.prev("label").length) {
200
- // move the label to order it alphabetically
201
- $div.contents("label").each((_idx, el) => {
202
- if($(el).text().localeCompare($last.text()) > 0) {
203
- $(el).before($last);
204
- return false;
205
- }
206
- });
207
- }
208
- };
209
- });
210
-
206
+ };
211
207
  })(window);
@@ -57,10 +57,10 @@
57
57
  }
58
58
  }`;
59
59
 
60
+ // Shows a human figure instead of a dot
60
61
  const MeetingIcon = L.DivIcon.SVGIcon.extend({
61
62
  options: {
62
63
  fillColor: "#ef604d",
63
- iconSize: { x: 300, y: 150 },
64
64
  opacity: 0
65
65
  },
66
66
  _createPathDescription: function() {
@@ -112,7 +112,7 @@
112
112
  result.component.meetings.edges.forEach((element) => {
113
113
  if(!element.node) return;
114
114
 
115
- if(element.node.coordinates) {
115
+ if(element.node.coordinates && element.node.coordinates.latitude && element.node.coordinates.longitude) {
116
116
  element.node.link = component.url + '/meetings/' + element.node.id;
117
117
  createMarker(element.node, callback);
118
118
  }