decidim-decidim_awesome 0.6.5 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -8
  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 -1
  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 +14 -0
  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/hashtags.js.es6 +48 -0
  17. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +107 -0
  18. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +15 -0
  19. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +170 -178
  20. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +56 -0
  21. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +7 -6
  22. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +18 -5
  23. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +57 -0
  24. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +172 -0
  25. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +34 -9
  26. data/app/assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 +24 -0
  27. data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +211 -0
  28. data/app/assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 +106 -0
  29. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +7 -0
  30. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +3 -0
  31. data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +21 -0
  32. data/app/assets/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +15 -0
  33. data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +27 -0
  34. data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +12 -0
  35. data/app/assets/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +66 -0
  36. data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +35 -0
  37. data/app/assets/stylesheets/decidim/decidim_awesome/{admin.scss → awesome_admin.scss} +19 -4
  38. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +22 -0
  39. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
  40. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +95 -1
  41. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
  42. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +16 -1
  43. data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +28 -0
  44. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +11 -3
  45. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +74 -0
  46. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +54 -0
  47. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +61 -0
  48. data/app/cells/decidim/decidim_awesome/content_blocks/map_form_cell.rb +19 -0
  49. data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +32 -0
  50. data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +45 -0
  51. data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +38 -0
  52. data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +4 -0
  53. data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +40 -0
  54. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +40 -0
  55. data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +1 -1
  56. data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +58 -0
  57. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -1
  58. data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +39 -0
  59. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
  60. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +33 -20
  61. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
  62. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +2 -2
  63. data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +38 -0
  64. data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +38 -0
  65. data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +38 -0
  66. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
  67. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +50 -0
  68. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +3 -1
  69. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +11 -7
  70. data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +48 -0
  71. data/app/helpers/decidim/decidim_awesome/map_helper.rb +66 -53
  72. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +78 -0
  73. data/app/middleware/decidim/decidim_awesome/current_config.rb +182 -0
  74. data/app/models/decidim/decidim_awesome/awesome_config.rb +15 -0
  75. data/app/models/decidim/decidim_awesome/user_override.rb +25 -0
  76. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +2 -0
  77. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +0 -5
  78. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +2 -2
  79. data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -0
  80. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +2 -2
  81. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +21 -0
  82. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +0 -3
  83. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +25 -0
  84. data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +0 -2
  85. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +4 -6
  86. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
  87. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +4 -0
  88. data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +6 -0
  89. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -32
  90. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +101 -0
  91. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +83 -0
  92. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -0
  93. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +25 -11
  94. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +8 -1
  95. data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
  96. data/app/views/v0.23/decidim/proposals/collaborative_drafts/_show.html.erb +134 -0
  97. data/app/views/v0.23/layouts/decidim/_head.html.erb +2 -2
  98. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +2 -2
  99. data/app/views/v0.24/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
  100. data/app/views/{v0.22 → v0.24}/layouts/decidim/_head.html.erb +4 -2
  101. data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +3 -2
  102. data/config/locales/ca.yml +75 -3
  103. data/config/locales/cs.yml +75 -3
  104. data/config/locales/en.yml +104 -11
  105. data/config/locales/es.yml +74 -2
  106. data/config/locales/eu.yml +76 -4
  107. data/config/locales/fr.yml +214 -142
  108. data/config/locales/it.yml +284 -0
  109. data/config/locales/ja.yml +284 -0
  110. data/config/locales/nl.yml +208 -136
  111. data/config/locales/sv.yml +109 -37
  112. data/db/migrate/20210628150825_change_awesome_config_var_type.rb +12 -0
  113. data/lib/decidim/decidim_awesome/admin_engine.rb +16 -4
  114. data/lib/decidim/decidim_awesome/awesome_helpers.rb +17 -10
  115. data/lib/decidim/decidim_awesome/checksums.yml +19 -9
  116. data/lib/decidim/decidim_awesome/config.rb +54 -9
  117. data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +27 -21
  118. data/lib/decidim/decidim_awesome/custom_fields.rb +94 -0
  119. data/lib/decidim/decidim_awesome/engine.rb +64 -8
  120. data/lib/decidim/decidim_awesome/iframe_component/component.rb +1 -1
  121. data/lib/decidim/decidim_awesome/map_component/component.rb +8 -2
  122. data/lib/decidim/decidim_awesome/menu_hacker.rb +17 -15
  123. data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
  124. data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor.rb +116 -0
  125. data/lib/decidim/decidim_awesome/test/shared_examples/current_config_examples.rb +143 -0
  126. data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +4 -0
  127. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +428 -0
  128. data/lib/decidim/decidim_awesome/version.rb +2 -2
  129. data/lib/decidim/decidim_awesome.rb +41 -8
  130. data/vendor/assets/javascripts/codemirror.js +9801 -0
  131. data/vendor/assets/javascripts/delta.min.js +405 -0
  132. data/vendor/assets/javascripts/delta.min.js.map +1 -0
  133. data/vendor/assets/javascripts/europa.min.js +4 -0
  134. data/vendor/assets/javascripts/form-builder.min.js +19 -0
  135. data/vendor/assets/javascripts/form-render.min.js +19 -0
  136. data/vendor/assets/javascripts/inscrybmde.min.js +1 -1
  137. data/vendor/assets/javascripts/jquery-ui.min.js +13 -0
  138. data/vendor/assets/javascripts/jquery.truncate.js +105 -0
  139. data/vendor/assets/javascripts/keymap/sublime.js +720 -0
  140. data/vendor/assets/javascripts/mode/css/css.js +864 -0
  141. data/vendor/assets/javascripts/select2.js +6147 -0
  142. data/vendor/assets/langs/en-US.lang +110 -0
  143. data/vendor/assets/stylesheets/codemirror.css +350 -0
  144. data/vendor/assets/stylesheets/inscrybmde.min.scss +194 -0
  145. data/vendor/assets/stylesheets/jquery-ui.min.css +7 -0
  146. data/vendor/assets/stylesheets/select2-foundation-theme.css +249 -0
  147. data/vendor/assets/stylesheets/select2.css +515 -0
  148. metadata +101 -34
  149. data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
  150. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -2
  151. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -225
  152. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -82
  153. data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +0 -12
  154. data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +0 -8
  155. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +0 -27
  156. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +0 -64
  157. data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
  158. data/lib/decidim/decidim_awesome/content_renderers.rb +0 -9
  159. data/vendor/assets/stylesheets/inscrybmde.min.css +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2be39606cbd0f92bc8232bbd4a1c8b04a27aed18e9a0732668af6f37126d66f4
4
- data.tar.gz: 5034f9d65042871ec4be47c313e90c46390e40751003666ea8a93166df087d31
3
+ metadata.gz: 8913b46e29378088cc9b9eed9b69b0321e404f52900b725cea8e213bea47502e
4
+ data.tar.gz: 5a79234c4b57bd7ea62589f833fef5ffff0468d4fec7ef907cbaabeb96df4dc0
5
5
  SHA512:
6
- metadata.gz: b2219e00f0a35206d772032e1f259e5283e2085a39bf5f45e47af09a784ece3776c0824ed7dc6d191cdcbf036b34a647fb5c9c172e13f86ef21394f54275fc9a
7
- data.tar.gz: e2abb579c41c61b11377c986f692cba8b944671e1876616bf771309b8e62900a05b57582f72f1f458ef17309b55d8030c15727993ad99092c40ac4c4e31fd94a
6
+ metadata.gz: cde9b7f7cfa19d19a9a9157c152e34a7ac849fd75b8cb2a23ae487836e561ff43bb961fa83d38e495069a427ec67e35afe05f1131ba1cbdf3509d25161f2b16f
7
+ data.tar.gz: 20fa96490ce61a2679c13864e8b580f607b482a00176c684e1fd9f8014666f004a76299134c7096f57f9ff1e6aaaa2b4dca72df460fd1ad2180f5f129cea6291
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Decidim::DecidimAwesome
2
2
 
3
- [![Build](https://github.com/Platoniq/decidim-module-decidim_awesome/workflows/Build/badge.svg)](https://github.com/Platoniq/decidim-module-decidim_awesome/actions)
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)
4
5
  [![Maintainability](https://api.codeclimate.com/v1/badges/2dada53525dd5a944089/maintainability)](https://codeclimate.com/github/Platoniq/decidim-module-decidim_awesome/maintainability)
5
6
  [![Test Coverage](https://codecov.io/gh/Platoniq/decidim-module-decidim_awesome/branch/master/graph/badge.svg?token=TFBMCLLZJG)](undefined)
6
7
 
@@ -9,7 +10,7 @@ Usability and UX tweaks for Decidim.
9
10
  This plugin allows the administrators to expand the possibilities of Decidim beyond some existing limitations.
10
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.
11
12
 
12
- **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.**
13
14
 
14
15
  ## Why this plugin?
15
16
 
@@ -24,6 +25,8 @@ Because Decidim is awesome and so is this!
24
25
 
25
26
  Read the [CHANGELOG](CHANGELOG.md) for Decidim compatibility.
26
27
 
28
+ > **TL;DR people**: Jump to the [installation part](#installation)
29
+
27
30
  DecidimAwesome is a module that hacks Decidim in order to provide more features or improve some aspects of it.
28
31
 
29
32
  It generates and admin module that allows to choose what hacks to apply.
@@ -121,21 +124,37 @@ Feel free to hide, modify or add items in the Decidim's main menu. You can also
121
124
  ![Menu hacks screenshot](examples/menu-3.png)
122
125
  ![Menu hacks screenshot](examples/menu-4.png)
123
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
+
124
146
  #### To be continued...
125
147
 
126
- 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
127
149
 
128
- 1. Improve the conversation in comments by allowing images
129
- 1. Allow to create non-private surveys where the responding user is known by admins
130
- 1. Manipulate menus (reorder, change texts, add new items)
131
- 1. Propose something! or even better send a PR!
150
+ Also feel free to propose something! or even better send a PR!
132
151
 
133
152
  ## Installation
134
153
 
135
154
  Add this line to your application's Gemfile:
136
155
 
137
156
  ```ruby
138
- gem "decidim-decidim_awesome", "~> 0.6.5"
157
+ gem "decidim-decidim_awesome", "~> 0.7.2"
139
158
  ```
140
159
 
141
160
  And then execute:
@@ -152,6 +171,9 @@ Depending on your Decidim version, choose the corresponding Awesome version to e
152
171
  |---|---|
153
172
  | 0.5.x | 0.21.x, 0.22.x |
154
173
  | 0.6.x | 0.22.x, 0.23.x |
174
+ | 0.7.x | 0.23.x, 0.24.x |
175
+
176
+ > *Heads up!* version 0.7.1 requires database migrations! Don't forget the migrations step when updating.
155
177
 
156
178
  ## Configuration
157
179
 
@@ -160,6 +182,8 @@ admins do not even see it.
160
182
 
161
183
  In order to personalize default values, create an initializer such as:
162
184
 
185
+ > **NOTE**: this is not necessary unless you want to **disable** some features. All features are enabled by default.
186
+
163
187
  ```ruby
164
188
  # config/initializers/awesome_defaults.rb
165
189
 
@@ -173,6 +197,12 @@ Decidim::DecidimAwesome.configure do |config|
173
197
 
174
198
  # De-activated, admins don't even see it as an option
175
199
  config.use_markdown_editor = :disabled
200
+
201
+ # Disable scoped admins
202
+ config.scoped_admins = :disabled
203
+
204
+ # any other config var from lib/decidim/decidim_awesome.rb
205
+ ...
176
206
  end
177
207
  ```
178
208
 
@@ -1,3 +1,3 @@
1
1
  /*
2
- *= link decidim/decidim_awesome/admin.css
3
- */
2
+ *= link decidim/decidim_awesome/awesome_admin.css
3
+ */
@@ -1,2 +1,2 @@
1
- // = link decidim/decidim_awesome/admin.js
1
+ // = link decidim/decidim_awesome/awesome_admin.js
2
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/application.js
2
- // = link decidim/decidim_awesome/awesome_map/legacy_map.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
+ });
@@ -0,0 +1,14 @@
1
+ // = require codemirror
2
+ // = require mode/css/css
3
+ // = require keymap/sublime
4
+ // = require_self
5
+
6
+ $(() => {
7
+ $(".awesome-edit-config .scoped_styles_container textarea").each((_idx, el) => {
8
+ CodeMirror.fromTextArea(el, {
9
+ lineNumbers: true,
10
+ mode: "css",
11
+ keymap: "sublime"
12
+ });
13
+ })
14
+ });
@@ -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
@@ -0,0 +1,48 @@
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);
@@ -0,0 +1,107 @@
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);
@@ -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
+ });