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
@@ -1,215 +1,207 @@
|
|
1
|
-
// = require
|
2
|
-
// = require
|
1
|
+
// = require decidim/decidim_awesome/awesome_map/layers
|
2
|
+
// = require decidim/decidim_awesome/awesome_map/utilities
|
3
|
+
// = require decidim/decidim_awesome/awesome_map/markers
|
3
4
|
// = require decidim/decidim_awesome/awesome_map/categories
|
4
5
|
// = require decidim/decidim_awesome/awesome_map/proposals
|
5
6
|
// = require decidim/decidim_awesome/awesome_map/meetings
|
6
7
|
// = require_self
|
7
8
|
|
8
9
|
((exports) => {
|
9
|
-
const {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
$($.templates(`#${tmpl}`).render(element)).appendTo(node);
|
41
|
-
|
42
|
-
marker.bindPopup(node, {
|
43
|
-
maxwidth: 640,
|
44
|
-
minWidth: 500,
|
45
|
-
keepInView: true,
|
46
|
-
className: "map-info"
|
47
|
-
}).openPopup();
|
48
|
-
|
49
|
-
allMarkers.push({
|
50
|
-
marker: marker,
|
51
|
-
component: component,
|
52
|
-
element: element
|
53
|
-
});
|
54
|
-
|
55
|
-
// Check if it has amendments, add it to a list
|
56
|
-
if(element.amendments && element.amendments.length) {
|
57
|
-
element.amendments.forEach((amendment) => {
|
58
|
-
amendments.push(amendment.emendation.id);
|
59
|
-
});
|
60
|
-
}
|
61
|
-
// Add to category layer
|
62
|
-
let cat = getCategory(element.category);
|
63
|
-
if(layers[cat.id]) {
|
64
|
-
marker.addTo(layers[cat.id].group);
|
65
|
-
// show category if hidden
|
66
|
-
const $label = $(`.awesome_map-category_${cat.id}`).closest("label");
|
67
|
-
const $parent = $(`.awesome_map-category_${cat.parent}`).closest("label");
|
68
|
-
$label.show();
|
69
|
-
// update number of items
|
70
|
-
$label.attr("title", parseInt($label.attr("title") || 0) + 1);
|
71
|
-
// show parent if apply
|
72
|
-
$parent.show();
|
73
|
-
$parent.attr("title", parseInt($parent.attr("title") || 0) + 1);
|
74
|
-
// update component stats
|
75
|
-
const $component = $(`#awesome_map-component-${component.id}`);
|
76
|
-
$component.attr("title", parseInt($component.attr("title") || 0) + 1);
|
10
|
+
const {
|
11
|
+
layers,
|
12
|
+
hideControls,
|
13
|
+
cluster,
|
14
|
+
control,
|
15
|
+
addProposalsControls,
|
16
|
+
addMeetingsControls,
|
17
|
+
addSearchControls,
|
18
|
+
addCategoriesControls,
|
19
|
+
addHashtagsControls,
|
20
|
+
fetchProposals,
|
21
|
+
fetchMeetings,
|
22
|
+
options,
|
23
|
+
show,
|
24
|
+
components,
|
25
|
+
amendments,
|
26
|
+
allMarkers,
|
27
|
+
drawMarker,
|
28
|
+
getCategory
|
29
|
+
} = exports.AwesomeMap;
|
30
|
+
const $ = exports.$; // eslint-disable-line
|
31
|
+
|
32
|
+
exports.AwesomeMap.allMarkersLoaded = $.noop;
|
33
|
+
|
34
|
+
const autoResizeMap = (map) => {
|
35
|
+
// Setup center/zoom options if specified, otherwise fitbounds
|
36
|
+
if(options().center) {
|
37
|
+
map.setView(options().center, options().zoom);
|
38
|
+
} else if(cluster.getBounds().isValid()) {
|
39
|
+
map.fitBounds(cluster.getBounds(), { padding: [50, 50] });
|
77
40
|
}
|
78
|
-
|
79
|
-
return marker;
|
80
41
|
};
|
81
42
|
|
82
|
-
|
43
|
+
exports.AwesomeMap.loadMapElements = (map) => {
|
44
|
+
autoResizeMap(map);
|
83
45
|
// legends
|
84
46
|
control.addTo(map);
|
85
47
|
cluster.addTo(map);
|
48
|
+
if(hideControls()) {
|
49
|
+
$(control.getContainer()).hide()
|
50
|
+
}
|
86
51
|
|
87
52
|
// Load markers
|
88
|
-
components.forEach((component) => {
|
53
|
+
components().forEach((component) => {
|
89
54
|
if(component.type == "proposals") {
|
90
|
-
|
91
|
-
layers.proposals = {
|
92
|
-
label: `<span id="awesome_map-component-${component.id}" title="0">${component.name || window.DecidimAwesome.texts.proposals}</span>`,
|
93
|
-
group: L.featureGroup.subGroup(cluster)
|
94
|
-
};
|
95
|
-
control.addOverlay(layers.proposals.group, layers.proposals.label);
|
96
|
-
layers.proposals.group.addTo(map);
|
97
|
-
|
98
|
-
// add control layer for amendments if any
|
99
|
-
if(component.amendments) {
|
100
|
-
layers.amendments = {
|
101
|
-
label: `<span id="awesome_map-component-${component.d}" title="0">${window.DecidimAwesome.texts.amendments}</span>`,
|
102
|
-
group: L.featureGroup.subGroup(cluster)
|
103
|
-
}
|
104
|
-
control.addOverlay(layers.amendments.group, layers.amendments.label);
|
105
|
-
layers.amendments.group.addTo(map);
|
106
|
-
}
|
55
|
+
addProposalsControls(map, component);
|
107
56
|
|
108
57
|
fetchProposals(component, '', (element, marker) => {
|
109
|
-
|
110
|
-
|
111
|
-
|
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);
|
112
64
|
}
|
113
|
-
}
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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) {
|
120
75
|
item.marker.addTo(layers.amendments.group);
|
121
76
|
}
|
122
|
-
}
|
77
|
+
}
|
123
78
|
});
|
79
|
+
// Call a trigger, might be useful for customizations
|
80
|
+
exports.AwesomeMap.allMarkersLoaded();
|
81
|
+
});
|
124
82
|
}
|
125
|
-
|
126
|
-
if(component.type == "meetings") {
|
127
|
-
|
128
|
-
|
129
|
-
label: `<span id="awesome_map-component-${component.id}" title="0">${component.name || window.DecidimAwesome.texts.meetings}</span>`,
|
130
|
-
group: L.featureGroup.subGroup(cluster)
|
131
|
-
};
|
132
|
-
control.addOverlay(layers.meetings.group, layers.meetings.label);
|
133
|
-
layers.meetings.group.addTo(map);
|
134
|
-
|
83
|
+
|
84
|
+
if(options().menu.meetings && component.type == "meetings") {
|
85
|
+
addMeetingsControls(map, component);
|
86
|
+
|
135
87
|
fetchMeetings(component, '', (element, marker) => {
|
136
|
-
|
137
|
-
|
138
|
-
map.fitBounds(cluster.getBounds(), { padding: [50, 50] });
|
139
|
-
});
|
88
|
+
drawMarker(element, marker, component).addTo(layers.meetings.group);
|
89
|
+
}, () => autoResizeMap(map) );
|
140
90
|
}
|
141
91
|
});
|
142
92
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
93
|
+
/*
|
94
|
+
* We add all categories and hide those that have no proposals
|
95
|
+
* This is done this way to ensure all parent categories are displayed
|
96
|
+
* even if the have not proposals associated
|
97
|
+
*/
|
98
|
+
addSearchControls(map);
|
99
|
+
addCategoriesControls(map);
|
100
|
+
|
101
|
+
// category events
|
102
|
+
$("#awesome-map").on("change", ".awesome_map-categories-selector", (e) => {
|
103
|
+
e.preventDefault();
|
104
|
+
e.stopPropagation();
|
105
|
+
const id = $(e.target).closest("label").data("layer");
|
106
|
+
const cat = getCategory(id);
|
107
|
+
// console.log("changed, layer", id, "cat", cat, "checked", e.target.checked, e);
|
108
|
+
if(cat) {
|
109
|
+
const layer = layers[cat.id];
|
110
|
+
if(e.target.checked) {
|
111
|
+
// show group of markers
|
112
|
+
map.addLayer(layer.group);
|
113
|
+
|
114
|
+
// if it's a children, put the parent to indeterminate
|
115
|
+
indeterminateInput(cat.parent);
|
116
|
+
} else {
|
117
|
+
// hide group of markers
|
118
|
+
map.removeLayer(layer.group);
|
119
|
+
// if it's a children, put the parent to indeterminate
|
120
|
+
cat.children().forEach((c) => {
|
121
|
+
let $el = $(`.awesome_map-category-${c.id}`);
|
122
|
+
if($el.parent().prev().prop("checked")) {
|
123
|
+
$el.click();
|
124
|
+
}
|
125
|
+
});
|
126
|
+
}
|
127
|
+
// sync tags
|
128
|
+
updateHashtagLayers();
|
152
129
|
}
|
130
|
+
});
|
153
131
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
132
|
+
const indeterminateInput = (id) => {
|
133
|
+
$('[class^="awesome_map-category-"]').parent().prev().prop("indeterminate", false);
|
134
|
+
if(id) {
|
135
|
+
let $input = $(`.awesome_map-category-${id}`).parent().prev();
|
136
|
+
if(!$input.prop("checked")) {
|
137
|
+
$input.prop("indeterminate", true);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
};
|
141
|
+
|
142
|
+
const updateHashtagLayers = () => {
|
143
|
+
// hide all
|
144
|
+
$(".awesome_map-hashtags-selector").each((_idx, el) => {
|
145
|
+
const layer = layers[$(el).closest("label").data("layer")];
|
146
|
+
if(layer) {
|
147
|
+
map.removeLayer(layer.group);
|
148
|
+
}
|
166
149
|
});
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
const cat = getCategory(id[1]);
|
173
|
-
if(!cat || !cat.name) return;
|
174
|
-
|
175
|
-
return cat;
|
176
|
-
};
|
177
|
-
|
178
|
-
const indeterminateInput = (id) => {
|
179
|
-
$('[class^="awesome_map-category_"]').parent().prev().prop("indeterminate", false);
|
180
|
-
if(id) {
|
181
|
-
let $input = $(`.awesome_map-category_${id}`).parent().prev();
|
182
|
-
if(!$input.prop("checked")) {
|
183
|
-
$input.prop("indeterminate", true);
|
184
|
-
}
|
150
|
+
// show selected only
|
151
|
+
$(".awesome_map-hashtags-selector:checked").each((_idx, el) => {
|
152
|
+
const layer = layers[$(el).closest("label").data("layer")];
|
153
|
+
if(layer) {
|
154
|
+
map.addLayer(layer.group);
|
185
155
|
}
|
186
|
-
};
|
187
|
-
|
188
|
-
map.on('overlayadd', (e) => {
|
189
|
-
const cat = getCatFromClass(e.name);
|
190
|
-
if(!cat) return;
|
191
|
-
// if it's a children, put the parent to indeterminate
|
192
|
-
indeterminateInput(cat.parent);
|
193
156
|
});
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
if($el.parent().prev().prop("checked")) {
|
202
|
-
$el.click();
|
203
|
-
}
|
204
|
-
});
|
157
|
+
// hide non-selected categories
|
158
|
+
$(".awesome_map-categories-selector:not(:checked)").each((_idx, el) => {
|
159
|
+
const layer = layers[$(el).closest("label").data("layer")];
|
160
|
+
if(layer) {
|
161
|
+
map.addLayer(layer.group);
|
162
|
+
map.removeLayer(layer.group);
|
163
|
+
}
|
205
164
|
});
|
165
|
+
};
|
166
|
+
|
167
|
+
// hashtag events
|
168
|
+
$("#awesome-map").on("change", ".awesome_map-hashtags-selector", (e) => {
|
169
|
+
e.preventDefault();
|
170
|
+
e.stopPropagation();
|
171
|
+
const tag = $(e.target).closest("label").data("layer");
|
172
|
+
// console.log("changed, layer", tag, "checked", e.target.checked, e);
|
173
|
+
if(tag) {
|
174
|
+
updateHashtagLayers();
|
175
|
+
}
|
176
|
+
});
|
206
177
|
|
207
|
-
|
178
|
+
// select/deselect all tags
|
179
|
+
$("#awesome-map").on("click", ".awesome_map-toggle_all_tags", (e) => {
|
180
|
+
e.preventDefault();
|
181
|
+
e.stopPropagation();
|
182
|
+
$("#awesome-map .awesome_map-hashtags-selector").prop("checked", $("#awesome-map .awesome_map-hashtags-selector:checked").length < $("#awesome-map .awesome_map-hashtags-selector").length);
|
183
|
+
updateHashtagLayers();
|
184
|
+
});
|
208
185
|
|
186
|
+
// sub-layer hashtag title toggle
|
187
|
+
$("#awesome-map").on("click", ".awesome_map-title-control", (e) => {
|
188
|
+
e.preventDefault();
|
189
|
+
e.stopPropagation();
|
190
|
+
$("#awesome_map-hashtags-control").toggleClass("active");
|
191
|
+
});
|
209
192
|
};
|
210
193
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
194
|
+
// order hashtags alphabetically
|
195
|
+
exports.AwesomeMap.hashtagAdded = (_hashtag, $div) => {
|
196
|
+
let $last = $div.contents("label:last");
|
197
|
+
if($last.prev("label").length) {
|
198
|
+
// move the label to order it alphabetically
|
199
|
+
$div.contents("label").each((_idx, el) => {
|
200
|
+
if($(el).text().localeCompare($last.text()) > 0) {
|
201
|
+
$(el).before($last);
|
202
|
+
return false;
|
203
|
+
}
|
204
|
+
});
|
205
|
+
}
|
206
|
+
};
|
215
207
|
})(window);
|
@@ -0,0 +1,56 @@
|
|
1
|
+
// = require jsrender.min
|
2
|
+
// = require decidim/decidim_awesome/awesome_map/layers
|
3
|
+
// = require decidim/decidim_awesome/awesome_map/categories
|
4
|
+
|
5
|
+
((exports) => {
|
6
|
+
const { getCategory, layers } = exports.AwesomeMap;
|
7
|
+
|
8
|
+
const popupMeetingTemplateId = "marker-meeting-popup";
|
9
|
+
const popupProposalTemplateId = "marker-proposal-popup";
|
10
|
+
const allMarkers = [];
|
11
|
+
|
12
|
+
const drawMarker = (element, marker, component) => {
|
13
|
+
let tmpl = component.type === "proposals" ? popupProposalTemplateId : popupMeetingTemplateId,
|
14
|
+
node = document.createElement("div");
|
15
|
+
|
16
|
+
$($.templates(`#${tmpl}`).render(element)).appendTo(node);
|
17
|
+
|
18
|
+
marker.bindPopup(node, {
|
19
|
+
maxwidth: 640,
|
20
|
+
minWidth: 500,
|
21
|
+
keepInView: true,
|
22
|
+
className: "map-info"
|
23
|
+
}).openPopup();
|
24
|
+
|
25
|
+
allMarkers.push({
|
26
|
+
marker: marker,
|
27
|
+
component: component,
|
28
|
+
element: element
|
29
|
+
});
|
30
|
+
|
31
|
+
// Add to category layer
|
32
|
+
let cat = getCategory(element.category);
|
33
|
+
if(layers[cat.id]) {
|
34
|
+
$('#awesome_map-categories-control').show();
|
35
|
+
marker.addTo(layers[cat.id].group);
|
36
|
+
// show category if hidden
|
37
|
+
const $label = $(`label.awesome_map-category-${cat.id}`);
|
38
|
+
const $parent = $(`label.awesome_map-category-${cat.parent}`);
|
39
|
+
$label.show();
|
40
|
+
// update number of items
|
41
|
+
$label.attr("title", (parseInt($label.attr("title") || 0) + 1) + " " + window.DecidimAwesome.texts.items);
|
42
|
+
// show parent if apply
|
43
|
+
$parent.show();
|
44
|
+
$parent.attr("title", (parseInt($parent.attr("title") || 0) + 1) + " " + window.DecidimAwesome.texts.items);
|
45
|
+
}
|
46
|
+
|
47
|
+
// update component stats
|
48
|
+
const $component = $(`#awesome_map-component_${component.id}`);
|
49
|
+
$component.attr("title", parseInt($component.attr("title") || 0) + 1);
|
50
|
+
|
51
|
+
return marker;
|
52
|
+
};
|
53
|
+
|
54
|
+
exports.AwesomeMap.allMarkers = allMarkers;
|
55
|
+
exports.AwesomeMap.drawMarker = drawMarker;
|
56
|
+
})(window);
|
@@ -1,8 +1,9 @@
|
|
1
1
|
// = require decidim/decidim_awesome/awesome_map/api_fetcher
|
2
2
|
// = require decidim/decidim_awesome/awesome_map/categories
|
3
|
+
// = require decidim/decidim_awesome/awesome_map/utilities
|
3
4
|
|
4
5
|
((exports) => {
|
5
|
-
const { getCategory } = exports.AwesomeMap;
|
6
|
+
const { getCategory, truncate } = exports.AwesomeMap;
|
6
7
|
const query = `query ($id: ID!, $after: String!) {
|
7
8
|
component(id: $id) {
|
8
9
|
id
|
@@ -56,10 +57,10 @@
|
|
56
57
|
}
|
57
58
|
}`;
|
58
59
|
|
60
|
+
// Shows a human figure instead of a dot
|
59
61
|
const MeetingIcon = L.DivIcon.SVGIcon.extend({
|
60
62
|
options: {
|
61
63
|
fillColor: "#ef604d",
|
62
|
-
iconSize: {x: 300, y:150},
|
63
64
|
opacity: 0
|
64
65
|
},
|
65
66
|
_createPathDescription: function() {
|
@@ -93,14 +94,14 @@
|
|
93
94
|
});
|
94
95
|
|
95
96
|
element.title.translation = ApiFetcher.findTranslation(element.title.translations);
|
96
|
-
element.description.translation = ApiFetcher.findTranslation(element.description.translations).replace(/\n/g, "<br>")
|
97
|
+
element.description.translation = truncate(ApiFetcher.findTranslation(element.description.translations)).replace(/\n/g, "<br>");
|
97
98
|
element.location.translation = ApiFetcher.findTranslation(element.location.translations);
|
98
99
|
element.locationHints.translation = ApiFetcher.findTranslation(element.locationHints.translations);
|
99
100
|
callback(element, marker);
|
100
101
|
};
|
101
102
|
|
102
103
|
const fetchMeetings = (component, after, callback, finalCall = () => {}) => {
|
103
|
-
|
104
|
+
|
104
105
|
const variables = {
|
105
106
|
"id": component.id,
|
106
107
|
"after": after
|
@@ -110,8 +111,8 @@
|
|
110
111
|
if(result) {
|
111
112
|
result.component.meetings.edges.forEach((element) => {
|
112
113
|
if(!element.node) return;
|
113
|
-
|
114
|
-
if(element.node.coordinates) {
|
114
|
+
|
115
|
+
if(element.node.coordinates && element.node.coordinates.latitude && element.node.coordinates.longitude) {
|
115
116
|
element.node.link = component.url + '/meetings/' + element.node.id;
|
116
117
|
createMarker(element.node, callback);
|
117
118
|
}
|
@@ -1,8 +1,10 @@
|
|
1
1
|
// = require decidim/decidim_awesome/awesome_map/api_fetcher
|
2
2
|
// = require decidim/decidim_awesome/awesome_map/categories
|
3
|
+
// = require decidim/decidim_awesome/awesome_map/hashtags
|
4
|
+
// = require decidim/decidim_awesome/awesome_map/utilities
|
3
5
|
|
4
6
|
((exports) => {
|
5
|
-
const { getCategory } = exports.AwesomeMap;
|
7
|
+
const { getCategory, truncate, collectHashtags, removeHashtags, appendHtmlHashtags } = exports.AwesomeMap;
|
6
8
|
const query = `query ($id: ID!, $after: String!) {
|
7
9
|
component(id: $id) {
|
8
10
|
id
|
@@ -14,7 +16,7 @@
|
|
14
16
|
endCursor
|
15
17
|
}
|
16
18
|
edges {
|
17
|
-
node {
|
19
|
+
node {
|
18
20
|
id
|
19
21
|
state
|
20
22
|
title {
|
@@ -49,6 +51,7 @@
|
|
49
51
|
}
|
50
52
|
}`;
|
51
53
|
|
54
|
+
let amendments = [];
|
52
55
|
const ProposalIcon = L.DivIcon.SVGIcon.DecidimIcon;
|
53
56
|
|
54
57
|
const createMarker = (element, callback) => {
|
@@ -59,7 +62,9 @@
|
|
59
62
|
});
|
60
63
|
|
61
64
|
element.title.translation = ApiFetcher.findTranslation(element.title.translations);
|
62
|
-
|
65
|
+
const body = ApiFetcher.findTranslation(element.body.translations);
|
66
|
+
element.hashtags = collectHashtags(body);
|
67
|
+
element.body.translation = appendHtmlHashtags(truncate(removeHashtags(body)).replace(/\n/g, "<br>"), element.hashtags);
|
63
68
|
|
64
69
|
callback(element, marker);
|
65
70
|
};
|
@@ -74,11 +79,18 @@
|
|
74
79
|
if(result) {
|
75
80
|
result.component.proposals.edges.forEach((element) => {
|
76
81
|
if(!element.node) return;
|
77
|
-
|
78
|
-
if(element.node.coordinates) {
|
82
|
+
|
83
|
+
if(element.node.coordinates && element.node.coordinates.latitude && element.node.coordinates.longitude) {
|
79
84
|
element.node.link = component.url + '/proposals/' + element.node.id;
|
80
85
|
createMarker(element.node, callback);
|
81
86
|
}
|
87
|
+
|
88
|
+
// Check if it has amendments, add it to a list
|
89
|
+
if(element.node.amendments && element.node.amendments.length) {
|
90
|
+
element.node.amendments.forEach((amendment) => {
|
91
|
+
amendments.push(amendment.emendation.id);
|
92
|
+
});
|
93
|
+
}
|
82
94
|
});
|
83
95
|
if (result.component.proposals.pageInfo.hasNextPage) {
|
84
96
|
fetchProposals(component, result.component.proposals.pageInfo.endCursor, callback, finalCall);
|
@@ -91,4 +103,5 @@
|
|
91
103
|
|
92
104
|
exports.AwesomeMap = exports.AwesomeMap || {};
|
93
105
|
exports.AwesomeMap.fetchProposals = fetchProposals;
|
106
|
+
exports.AwesomeMap.amendments = amendments;
|
94
107
|
})(window);
|
@@ -0,0 +1,57 @@
|
|
1
|
+
//= require jquery.truncate
|
2
|
+
|
3
|
+
((exports) => {
|
4
|
+
const $ = exports.$; // eslint-disable-line
|
5
|
+
|
6
|
+
const sanitizeCenter = (string) => {
|
7
|
+
if(string) {
|
8
|
+
const parts = string.split(",")
|
9
|
+
if (parts.length >= 2) {
|
10
|
+
const lat = parseFloat(parts[0]);
|
11
|
+
const lng = parseFloat(parts[1]);
|
12
|
+
if(lat && lng) {
|
13
|
+
return [lat, lng];
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
return null
|
18
|
+
};
|
19
|
+
const options = () => {
|
20
|
+
return {
|
21
|
+
length: $("#awesome-map").data("truncate") || 255,
|
22
|
+
center: sanitizeCenter($("#awesome-map").data("map-center")),
|
23
|
+
zoom: $("#awesome-map").data("map-zoom"),
|
24
|
+
menu: {
|
25
|
+
amendments: $("#awesome-map").data("menu-amendments"),
|
26
|
+
meetings: $("#awesome-map").data("menu-meetings"),
|
27
|
+
hashtags: $("#awesome-map").data("menu-hashtags")
|
28
|
+
}
|
29
|
+
}
|
30
|
+
};
|
31
|
+
|
32
|
+
const truncate = (string) => {
|
33
|
+
return $.truncate(string, options());
|
34
|
+
};
|
35
|
+
|
36
|
+
const show = () => {
|
37
|
+
return {
|
38
|
+
withdrawn: $("#awesome-map").data("show-withdrawn"),
|
39
|
+
accepted: $("#awesome-map").data("show-accepted"),
|
40
|
+
evaluating: $("#awesome-map").data("show-evaluating"),
|
41
|
+
notAnswered: $("#awesome-map").data("show-not-answered"),
|
42
|
+
rejected: $("#awesome-map").data("show-rejected")
|
43
|
+
}
|
44
|
+
};
|
45
|
+
|
46
|
+
const hideControls = () => $("#awesome-map").data("hide-controls");
|
47
|
+
const collapsedMenu = () => $("#awesome-map").data("collapsed");
|
48
|
+
const components = () => $("#awesome-map").data("components");
|
49
|
+
|
50
|
+
exports.AwesomeMap = exports.AwesomeMap || {};
|
51
|
+
exports.AwesomeMap.truncate = truncate;
|
52
|
+
exports.AwesomeMap.options = options;
|
53
|
+
exports.AwesomeMap.show = show;
|
54
|
+
exports.AwesomeMap.collapsedMenu = collapsedMenu;
|
55
|
+
exports.AwesomeMap.hideControls = hideControls;
|
56
|
+
exports.AwesomeMap.components = components;
|
57
|
+
})(window);
|