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.
- checksums.yaml +4 -4
- data/README.md +32 -9
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +2 -2
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -2
- 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 +2 -3
- 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/layers.js.es6 +3 -2
- 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 +52 -56
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +2 -2
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +1 -1
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +33 -24
- data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +14 -2
- data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +18 -4
- 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 +5 -1
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +0 -1
- 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 +15 -4
- 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} +12 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +22 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +0 -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/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 +1 -0
- data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +39 -0
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +31 -18
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +4 -0
- 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/forms/decidim/decidim_awesome/admin/config_form.rb +39 -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 +67 -16
- 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/views/decidim/decidim_awesome/admin/checks/index.html.erb +1 -1
- 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 -7
- 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 +0 -2
- 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 +4 -0
- 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 +1 -1
- data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +1 -1
- data/app/views/v0.24/decidim/proposals/collaborative_drafts/_show.html.erb +128 -0
- data/app/views/v0.24/layouts/decidim/_head.html.erb +2 -2
- data/app/views/v0.24/layouts/decidim/admin/_header.html.erb +2 -2
- data/config/locales/ca.yml +62 -3
- data/config/locales/cs.yml +62 -3
- data/config/locales/en.yml +90 -11
- data/config/locales/es.yml +61 -2
- data/config/locales/eu.yml +63 -4
- data/config/locales/fr.yml +62 -3
- data/config/locales/it.yml +284 -0
- data/config/locales/ja.yml +284 -0
- data/config/locales/nl.yml +62 -3
- data/config/locales/sv.yml +62 -3
- 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 +17 -4
- data/lib/decidim/decidim_awesome/config.rb +53 -6
- 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 +62 -6
- 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 +1 -1
- data/lib/decidim/decidim_awesome.rb +41 -8
- 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/select2.js +6147 -0
- data/vendor/assets/langs/en-US.lang +110 -0
- data/vendor/assets/stylesheets/inscrybmde.min.scss +14 -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 +68 -27
- data/app/assets/images/decidim/decidim_awesome/loading.gif +0 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin.js +0 -3
- 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 -58
- data/lib/decidim/decidim_awesome/content_renderers/markdown_renderer.rb +0 -18
- 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:
|
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,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
|
4
|
-
[![[CI] Test 0.23](https://github.com/Platoniq/decidim-module-decidim_awesome/actions/workflows/test
|
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
|
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
|
-
|
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
|
-
|
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.
|
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/
|
3
|
-
*/
|
2
|
+
*= link decidim/decidim_awesome/awesome_admin.css
|
3
|
+
*/
|
@@ -1,3 +1,4 @@
|
|
1
|
-
// = link decidim/decidim_awesome/
|
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,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 .
|
8
|
-
|
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
|
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
|
@@ -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
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
-
}
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
79
|
-
|
84
|
+
if(options().menu.meetings && component.type == "meetings") {
|
85
|
+
addMeetingsControls(map, component);
|
80
86
|
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
191
|
-
|
192
|
-
|
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
|
-
|
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
|
}
|