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.
- checksums.yaml +4 -4
- data/README.md +38 -8
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +2 -2
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -1
- data/app/assets/config/decidim_decidim_awesome_manifest.css +2 -2
- data/app/assets/config/decidim_decidim_awesome_manifest.js +3 -2
- data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +2 -0
- data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +4 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 +77 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +14 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 +80 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +80 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 +24 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +7 -0
- data/app/assets/javascripts/decidim/decidim_awesome/{application.js → awesome_application.js} +1 -2
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +48 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +107 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +15 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +170 -178
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +56 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +7 -6
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +18 -5
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +57 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +172 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +34 -9
- data/app/assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 +24 -0
- data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +211 -0
- data/app/assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 +106 -0
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +7 -0
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +3 -0
- data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +21 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +15 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +27 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/constraints.scss +12 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +66 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +35 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/{admin.scss → awesome_admin.scss} +19 -4
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +22 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +95 -1
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +16 -1
- data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +28 -0
- data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +11 -3
- data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +74 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +54 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +61 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map_form_cell.rb +19 -0
- data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +32 -0
- data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +45 -0
- data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +38 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +4 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +40 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +40 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +58 -0
- data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -1
- data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +39 -0
- data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +33 -20
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
- data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +2 -2
- data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +38 -0
- data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +38 -0
- data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +38 -0
- data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +50 -0
- data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +3 -1
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +11 -7
- data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +48 -0
- data/app/helpers/decidim/decidim_awesome/map_helper.rb +66 -53
- data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +78 -0
- data/app/middleware/decidim/decidim_awesome/current_config.rb +182 -0
- data/app/models/decidim/decidim_awesome/awesome_config.rb +15 -0
- data/app/models/decidim/decidim_awesome/user_override.rb +25 -0
- data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +2 -0
- data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +0 -5
- data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -0
- data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +2 -2
- data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +21 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +0 -3
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +25 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +0 -2
- data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +4 -6
- data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
- data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +4 -0
- data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +6 -0
- data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -32
- data/app/views/decidim/proposals/admin/proposals/_form.html.erb +101 -0
- data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +83 -0
- data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -0
- data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +25 -11
- data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +8 -1
- data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
- data/app/views/v0.23/decidim/proposals/collaborative_drafts/_show.html.erb +134 -0
- data/app/views/v0.23/layouts/decidim/_head.html.erb +2 -2
- data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +2 -2
- data/app/views/v0.24/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
- data/app/views/{v0.22 → v0.24}/layouts/decidim/_head.html.erb +4 -2
- data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +3 -2
- data/config/locales/ca.yml +75 -3
- data/config/locales/cs.yml +75 -3
- data/config/locales/en.yml +104 -11
- data/config/locales/es.yml +74 -2
- data/config/locales/eu.yml +76 -4
- data/config/locales/fr.yml +214 -142
- data/config/locales/it.yml +284 -0
- data/config/locales/ja.yml +284 -0
- data/config/locales/nl.yml +208 -136
- data/config/locales/sv.yml +109 -37
- data/db/migrate/20210628150825_change_awesome_config_var_type.rb +12 -0
- data/lib/decidim/decidim_awesome/admin_engine.rb +16 -4
- data/lib/decidim/decidim_awesome/awesome_helpers.rb +17 -10
- data/lib/decidim/decidim_awesome/checksums.yml +19 -9
- data/lib/decidim/decidim_awesome/config.rb +54 -9
- data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +27 -21
- data/lib/decidim/decidim_awesome/custom_fields.rb +94 -0
- data/lib/decidim/decidim_awesome/engine.rb +64 -8
- data/lib/decidim/decidim_awesome/iframe_component/component.rb +1 -1
- data/lib/decidim/decidim_awesome/map_component/component.rb +8 -2
- data/lib/decidim/decidim_awesome/menu_hacker.rb +17 -15
- data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
- data/lib/decidim/decidim_awesome/test/shared_examples/box_label_editor.rb +116 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/current_config_examples.rb +143 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +4 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +428 -0
- data/lib/decidim/decidim_awesome/version.rb +2 -2
- data/lib/decidim/decidim_awesome.rb +41 -8
- data/vendor/assets/javascripts/codemirror.js +9801 -0
- data/vendor/assets/javascripts/delta.min.js +405 -0
- data/vendor/assets/javascripts/delta.min.js.map +1 -0
- data/vendor/assets/javascripts/europa.min.js +4 -0
- data/vendor/assets/javascripts/form-builder.min.js +19 -0
- data/vendor/assets/javascripts/form-render.min.js +19 -0
- data/vendor/assets/javascripts/inscrybmde.min.js +1 -1
- data/vendor/assets/javascripts/jquery-ui.min.js +13 -0
- data/vendor/assets/javascripts/jquery.truncate.js +105 -0
- data/vendor/assets/javascripts/keymap/sublime.js +720 -0
- data/vendor/assets/javascripts/mode/css/css.js +864 -0
- data/vendor/assets/javascripts/select2.js +6147 -0
- data/vendor/assets/langs/en-US.lang +110 -0
- data/vendor/assets/stylesheets/codemirror.css +350 -0
- data/vendor/assets/stylesheets/inscrybmde.min.scss +194 -0
- data/vendor/assets/stylesheets/jquery-ui.min.css +7 -0
- data/vendor/assets/stylesheets/select2-foundation-theme.css +249 -0
- data/vendor/assets/stylesheets/select2.css +515 -0
- metadata +101 -34
- data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -2
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -225
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -82
- data/app/assets/javascripts/decidim/decidim_awesome/editors/markdown_view.js.es6 +0 -12
- data/app/assets/stylesheets/decidim/decidim_awesome/application.scss +0 -8
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_view.scss +0 -27
- data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +0 -64
- data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
- data/lib/decidim/decidim_awesome/content_renderers.rb +0 -9
- data/vendor/assets/stylesheets/inscrybmde.min.css +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8913b46e29378088cc9b9eed9b69b0321e404f52900b725cea8e213bea47502e
|
4
|
+
data.tar.gz: 5a79234c4b57bd7ea62589f833fef5ffff0468d4fec7ef907cbaabeb96df4dc0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cde9b7f7cfa19d19a9a9157c152e34a7ac849fd75b8cb2a23ae487836e561ff43bb961fa83d38e495069a427ec67e35afe05f1131ba1cbdf3509d25161f2b16f
|
7
|
+
data.tar.gz: 20fa96490ce61a2679c13864e8b580f607b482a00176c684e1fd9f8014666f004a76299134c7096f57f9ff1e6aaaa2b4dca72df460fd1ad2180f5f129cea6291
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Decidim::DecidimAwesome
|
2
2
|
|
3
|
-
[![
|
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
|
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
|
-
|
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
|
-
|
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.
|
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/
|
3
|
-
*/
|
2
|
+
*= link decidim/decidim_awesome/awesome_admin.css
|
3
|
+
*/
|
@@ -1,2 +1,2 @@
|
|
1
|
-
// = link decidim/decidim_awesome/
|
1
|
+
// = link decidim/decidim_awesome/awesome_admin.js
|
2
2
|
// = link decidim/decidim_awesome/admin/form_exit_warn.js
|
@@ -1,3 +1,4 @@
|
|
1
|
-
// = link decidim/decidim_awesome/
|
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,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
|
data/app/assets/javascripts/decidim/decidim_awesome/{application.js → awesome_application.js}
RENAMED
@@ -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/
|
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
|
+
});
|