decidim-decidim_awesome 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -7
- data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -0
- data/app/assets/config/decidim_decidim_awesome_manifest.js +1 -1
- data/app/assets/javascripts/decidim/decidim_awesome/admin.js +1 -0
- data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +15 -0
- 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 +106 -0
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +166 -170
- 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 +6 -5
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +17 -4
- data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +48 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +160 -0
- data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +16 -5
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +3 -0
- data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +4 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/admin.scss +10 -3
- data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +16 -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 -0
- data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
- data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +39 -0
- data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +3 -9
- data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +51 -0
- data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +47 -0
- data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -2
- data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +47 -0
- data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +4 -3
- data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +12 -3
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +13 -0
- data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +116 -0
- data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +21 -2
- data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +0 -2
- data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +0 -2
- data/app/forms/decidim/decidim_awesome/admin/menu_form.rb +39 -0
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +5 -1
- data/app/helpers/decidim/decidim_awesome/map_helper.rb +12 -50
- data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +19 -0
- data/app/permissions/decidim/decidim_awesome/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 +1 -1
- data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +1 -1
- data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/_form.html.erb +7 -0
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +13 -0
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +44 -0
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +13 -0
- data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +4 -31
- data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +5 -0
- data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +4 -1
- 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.22 → v0.24}/layouts/decidim/_head.html.erb +2 -0
- data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +1 -0
- data/config/locales/ca.yml +70 -2
- data/config/locales/cs.yml +71 -3
- data/config/locales/en.yml +61 -4
- data/config/locales/es.yml +70 -2
- data/config/locales/eu.yml +225 -0
- data/config/locales/fr.yml +172 -104
- data/config/locales/nl.yml +225 -0
- data/config/locales/sv.yml +93 -25
- data/lib/decidim/decidim_awesome.rb +15 -0
- data/lib/decidim/decidim_awesome/admin_engine.rb +1 -0
- data/lib/decidim/decidim_awesome/awesome_helpers.rb +1 -1
- data/lib/decidim/decidim_awesome/checksums.yml +7 -4
- data/lib/decidim/decidim_awesome/config.rb +1 -3
- data/lib/decidim/decidim_awesome/engine.rb +3 -3
- 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 +90 -0
- data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
- data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +4 -2
- data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +71 -0
- data/lib/decidim/decidim_awesome/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +9801 -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/stylesheets/codemirror.css +350 -0
- data/vendor/assets/stylesheets/inscrybmde.min.scss +180 -0
- metadata +61 -20
- 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/vendor/assets/stylesheets/inscrybmde.min.css +0 -8
@@ -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
|
@@ -59,7 +60,7 @@
|
|
59
60
|
const MeetingIcon = L.DivIcon.SVGIcon.extend({
|
60
61
|
options: {
|
61
62
|
fillColor: "#ef604d",
|
62
|
-
iconSize: {x: 300, y:150},
|
63
|
+
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,7 +111,7 @@
|
|
110
111
|
if(result) {
|
111
112
|
result.component.meetings.edges.forEach((element) => {
|
112
113
|
if(!element.node) return;
|
113
|
-
|
114
|
+
|
114
115
|
if(element.node.coordinates) {
|
115
116
|
element.node.link = component.url + '/meetings/' + element.node.id;
|
116
117
|
createMarker(element.node, callback);
|
@@ -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
|
-
|
82
|
+
|
78
83
|
if(element.node.coordinates) {
|
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,48 @@
|
|
1
|
+
//= require jquery.truncate
|
2
|
+
|
3
|
+
((exports) => {
|
4
|
+
const sanitizeCenter = (string) => {
|
5
|
+
const parts = string.split(",")
|
6
|
+
if (parts.length >= 2) {
|
7
|
+
const lat = parseFloat(parts[0]);
|
8
|
+
const lng = parseFloat(parts[1]);
|
9
|
+
if(lat && lng) {
|
10
|
+
return [lat, lng];
|
11
|
+
}
|
12
|
+
}
|
13
|
+
return null
|
14
|
+
};
|
15
|
+
|
16
|
+
const options = {
|
17
|
+
length: $("#awesome-map").data("truncate") || 255,
|
18
|
+
center: sanitizeCenter($("#awesome-map").data("map-center")),
|
19
|
+
zoom: $("#awesome-map").data("map-zoom"),
|
20
|
+
menu: {
|
21
|
+
amendments: $("#awesome-map").data("menu-amendments"),
|
22
|
+
meetings: $("#awesome-map").data("menu-meetings"),
|
23
|
+
hashtags: $("#awesome-map").data("menu-hashtags")
|
24
|
+
}
|
25
|
+
};
|
26
|
+
|
27
|
+
const truncate = (string) => {
|
28
|
+
return $.truncate(string, options);
|
29
|
+
};
|
30
|
+
|
31
|
+
const show = {
|
32
|
+
withdrawn: $("#awesome-map").data("show-withdrawn"),
|
33
|
+
accepted: $("#awesome-map").data("show-accepted"),
|
34
|
+
evaluating: $("#awesome-map").data("show-evaluating"),
|
35
|
+
notAnswered: $("#awesome-map").data("show-not-answered"),
|
36
|
+
rejected: $("#awesome-map").data("show-rejected")
|
37
|
+
};
|
38
|
+
|
39
|
+
const collapsedMenu = $("#awesome-map").data("collapsed");
|
40
|
+
const components = $("#awesome-map").data("components");
|
41
|
+
|
42
|
+
exports.AwesomeMap = exports.AwesomeMap || {};
|
43
|
+
exports.AwesomeMap.truncate = truncate;
|
44
|
+
exports.AwesomeMap.options = options;
|
45
|
+
exports.AwesomeMap.show = show;
|
46
|
+
exports.AwesomeMap.collapsedMenu = collapsedMenu;
|
47
|
+
exports.AwesomeMap.components = components;
|
48
|
+
})(window);
|
@@ -0,0 +1,160 @@
|
|
1
|
+
// = require image-upload.min
|
2
|
+
// = require image-resize.min
|
3
|
+
// = require inscrybmde.min.js
|
4
|
+
// = require inline-attachment.js
|
5
|
+
// = require codemirror-4.inline-attachment.js
|
6
|
+
// = require jquery.inline-attachment.js
|
7
|
+
// = require_self
|
8
|
+
|
9
|
+
((exports) => {
|
10
|
+
exports.DecidimAwesome = exports.DecidimAwesome || {};
|
11
|
+
|
12
|
+
// Redefines Quill editor with images
|
13
|
+
if(exports.DecidimAwesome.allow_images_in_full_editor || exports.DecidimAwesome.allow_images_in_small_editor || exports.DecidimAwesome.use_markdown_editor) {
|
14
|
+
|
15
|
+
const quillFormats = ["bold", "italic", "link", "underline", "header", "list", "video", "image", "alt"];
|
16
|
+
|
17
|
+
const createQuillEditor = (container) => {
|
18
|
+
const toolbar = $(container).data("toolbar");
|
19
|
+
const disabled = $(container).data("disabled");
|
20
|
+
|
21
|
+
let quillToolbar = [
|
22
|
+
["bold", "italic", "underline"],
|
23
|
+
[{ list: "ordered" }, { list: "bullet" }],
|
24
|
+
["link", "clean"]
|
25
|
+
];
|
26
|
+
|
27
|
+
let addImage = false;
|
28
|
+
|
29
|
+
if (toolbar === "full") {
|
30
|
+
quillToolbar = [
|
31
|
+
[{ header: [1, 2, 3, 4, 5, 6, false] }],
|
32
|
+
...quillToolbar
|
33
|
+
];
|
34
|
+
if(exports.DecidimAwesome.allow_images_in_full_editor) {
|
35
|
+
quillToolbar.push(["video", "image"]);
|
36
|
+
addImage = true;
|
37
|
+
} else {
|
38
|
+
quillToolbar.push(["video"]);
|
39
|
+
}
|
40
|
+
} else if (toolbar === "basic") {
|
41
|
+
if(exports.DecidimAwesome.allow_images_in_small_editor) {
|
42
|
+
quillToolbar.push(["video", "image"]);
|
43
|
+
addImage = true;
|
44
|
+
} else {
|
45
|
+
quillToolbar.push(["video"]);
|
46
|
+
}
|
47
|
+
} else if(exports.DecidimAwesome.allow_images_in_small_editor) {
|
48
|
+
quillToolbar.push(["image"]);
|
49
|
+
addImage = true;
|
50
|
+
}
|
51
|
+
|
52
|
+
let modules = {
|
53
|
+
toolbar: quillToolbar
|
54
|
+
};
|
55
|
+
const $input = $(container).siblings('input[type="hidden"]');
|
56
|
+
container.innerHTML = $input.val() || "";
|
57
|
+
const token = $( 'meta[name="csrf-token"]' ).attr( 'content' );
|
58
|
+
|
59
|
+
if(addImage) {
|
60
|
+
modules.imageResize = {
|
61
|
+
modules: ["Resize", "DisplaySize"]
|
62
|
+
}
|
63
|
+
modules.imageUpload = {
|
64
|
+
url: exports.DecidimAwesome.editor_uploader_path, // server url. If the url is empty then the base64 returns
|
65
|
+
method: 'POST', // change query method, default 'POST'
|
66
|
+
name: 'image', // custom form name
|
67
|
+
withCredentials: false, // withCredentials
|
68
|
+
headers: { 'X-CSRF-Token': token }, // add custom headers, example { token: 'your-token'}
|
69
|
+
// personalize successful callback and call next function to insert new url to the editor
|
70
|
+
callbackOK: (serverResponse, next) => {
|
71
|
+
$(quill.getModule("toolbar").container).last().removeClass('editor-loading')
|
72
|
+
next(serverResponse.url);
|
73
|
+
},
|
74
|
+
// personalize failed callback
|
75
|
+
callbackKO: serverError => {
|
76
|
+
$(quill.getModule("toolbar").container).last().removeClass('editor-loading')
|
77
|
+
alert(serverError.message);
|
78
|
+
},
|
79
|
+
checkBeforeSend: (file, next) => {
|
80
|
+
$(quill.getModule("toolbar").container).last().addClass('editor-loading')
|
81
|
+
next(file); // go back to component and send to the server
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
const quill = new Quill(container, {
|
87
|
+
modules: modules,
|
88
|
+
formats: quillFormats,
|
89
|
+
theme: "snow"
|
90
|
+
});
|
91
|
+
|
92
|
+
if (disabled) {
|
93
|
+
quill.disable();
|
94
|
+
}
|
95
|
+
|
96
|
+
quill.on("text-change", () => {
|
97
|
+
const text = quill.getText();
|
98
|
+
|
99
|
+
// Triggers CustomEvent with the cursor position
|
100
|
+
// It is required in input_mentions.js
|
101
|
+
let event = new CustomEvent("quill-position", {
|
102
|
+
detail: quill.getSelection()
|
103
|
+
});
|
104
|
+
container.dispatchEvent(event);
|
105
|
+
|
106
|
+
if (text === "\n") {
|
107
|
+
$input.val("");
|
108
|
+
} else {
|
109
|
+
$input.val(quill.root.innerHTML);
|
110
|
+
}
|
111
|
+
});
|
112
|
+
|
113
|
+
if(addImage) {
|
114
|
+
const t = window.DecidimAwesome.texts["drag_and_drop_image"];
|
115
|
+
$(container).after(`<p class="help-text" style="margin-top:-1.5rem;">${t}</p>`);
|
116
|
+
}
|
117
|
+
};
|
118
|
+
|
119
|
+
const createMarkdownEditor = (container) => {
|
120
|
+
$(container).hide();
|
121
|
+
const t = window.DecidimAwesome.texts["drag_and_drop_image"];
|
122
|
+
const token = $( 'meta[name="csrf-token"]' ).attr( 'content' );
|
123
|
+
const $input = $(container).siblings('input[type="hidden"]');
|
124
|
+
const inscrybmde = new InscrybMDE({
|
125
|
+
element: $input[0],
|
126
|
+
spellChecker: false,
|
127
|
+
renderingConfig: {
|
128
|
+
codeSyntaxHighlighting: true
|
129
|
+
}
|
130
|
+
});
|
131
|
+
|
132
|
+
// Allow image upload
|
133
|
+
if(window.DecidimAwesome.allow_images_in_markdown_editor) {
|
134
|
+
$(inscrybmde.gui.statusbar).prepend(`<span class="help-text" style="float:left;margin:0;text-align:left;">${t}</span>`);
|
135
|
+
inlineAttachment.editors.codemirror4.attach(inscrybmde.codemirror, {
|
136
|
+
uploadUrl: window.DecidimAwesome.editor_uploader_path,
|
137
|
+
uploadFieldName: "image",
|
138
|
+
jsonFieldName: "url",
|
139
|
+
extraHeaders: { "X-CSRF-Token": token }
|
140
|
+
});
|
141
|
+
}
|
142
|
+
};
|
143
|
+
|
144
|
+
const quillEditor = () => {
|
145
|
+
$(".editor-container").each((idx, container) => {
|
146
|
+
if(exports.DecidimAwesome.use_markdown_editor) {
|
147
|
+
createMarkdownEditor(container);
|
148
|
+
} else {
|
149
|
+
createQuillEditor(container);
|
150
|
+
}
|
151
|
+
});
|
152
|
+
};
|
153
|
+
|
154
|
+
exports.Decidim = exports.Decidim || {};
|
155
|
+
exports.Decidim.quillEditor = quillEditor;
|
156
|
+
exports.Decidim.createQuillEditor = createQuillEditor;
|
157
|
+
exports.Decidim.createMarkdownEditor = createMarkdownEditor;
|
158
|
+
|
159
|
+
}
|
160
|
+
})(window);
|
@@ -12,14 +12,14 @@
|
|
12
12
|
// Redefines Quill editor with images
|
13
13
|
if(exports.DecidimAwesome.allow_images_in_full_editor || exports.DecidimAwesome.allow_images_in_small_editor || exports.DecidimAwesome.use_markdown_editor) {
|
14
14
|
|
15
|
-
const quillFormats = ["bold", "italic", "link", "underline", "header", "list", "video", "image", "alt"];
|
15
|
+
const quillFormats = ["bold", "italic", "link", "underline", "header", "list", "video", "image", "alt", "break"];
|
16
16
|
|
17
17
|
const createQuillEditor = (container) => {
|
18
18
|
const toolbar = $(container).data("toolbar");
|
19
19
|
const disabled = $(container).data("disabled");
|
20
20
|
|
21
21
|
let quillToolbar = [
|
22
|
-
["bold", "italic", "underline"],
|
22
|
+
["bold", "italic", "underline", "linebreak"],
|
23
23
|
[{ list: "ordered" }, { list: "bullet" }],
|
24
24
|
["link", "clean"]
|
25
25
|
];
|
@@ -50,7 +50,13 @@
|
|
50
50
|
}
|
51
51
|
|
52
52
|
let modules = {
|
53
|
-
|
53
|
+
linebreak: {},
|
54
|
+
toolbar: {
|
55
|
+
container: quillToolbar,
|
56
|
+
handlers: {
|
57
|
+
"linebreak": exports.Decidim.Editor.lineBreakButtonHandler
|
58
|
+
}
|
59
|
+
}
|
54
60
|
};
|
55
61
|
const $input = $(container).siblings('input[type="hidden"]');
|
56
62
|
container.innerHTML = $input.val() || "";
|
@@ -109,11 +115,16 @@
|
|
109
115
|
$input.val(quill.root.innerHTML);
|
110
116
|
}
|
111
117
|
});
|
112
|
-
|
118
|
+
|
113
119
|
if(addImage) {
|
114
120
|
const t = window.DecidimAwesome.texts["drag_and_drop_image"];
|
115
121
|
$(container).after(`<p class="help-text" style="margin-top:-1.5rem;">${t}</p>`);
|
116
122
|
}
|
123
|
+
|
124
|
+
// After editor is ready, linebreak_module deletes two extraneous new lines
|
125
|
+
quill.emitter.emit("editor-ready");
|
126
|
+
|
127
|
+
return quill;
|
117
128
|
};
|
118
129
|
|
119
130
|
const createMarkdownEditor = (container) => {
|
@@ -157,4 +168,4 @@
|
|
157
168
|
exports.Decidim.createMarkdownEditor = createMarkdownEditor;
|
158
169
|
|
159
170
|
}
|
160
|
-
})(window);
|
171
|
+
})(window);
|
@@ -1,4 +1,5 @@
|
|
1
1
|
//= require github.min
|
2
|
+
//= require codemirror
|
2
3
|
//= require inscrybmde.min
|
3
4
|
//= require_self
|
4
5
|
|
@@ -6,6 +7,7 @@
|
|
6
7
|
@import "decidim/utils/settings";
|
7
8
|
@import "decidim/utils/mixins";
|
8
9
|
@import "./admin/constraints";
|
10
|
+
@import "./admin/codemirror";
|
9
11
|
@import "./editors/quill_editor";
|
10
12
|
@import "./editors/markdown_editor";
|
11
13
|
|
@@ -17,7 +19,7 @@
|
|
17
19
|
font-size: .8em;
|
18
20
|
}
|
19
21
|
|
20
|
-
.decidim_awesome
|
22
|
+
.decidim_awesome{
|
21
23
|
&.modal{
|
22
24
|
.spinner{
|
23
25
|
@include spinner(25px, #aaa, var(--secondary), 800ms);
|
@@ -33,13 +35,18 @@
|
|
33
35
|
}
|
34
36
|
}
|
35
37
|
|
36
|
-
&-form
|
38
|
+
&-form{
|
37
39
|
margin-bottom: 2em;
|
38
40
|
border-bottom: 1px solid #999;
|
39
41
|
padding-bottom: 1.5em;
|
40
42
|
}
|
41
|
-
|
43
|
+
|
44
|
+
&-form:last-child{
|
42
45
|
border-bottom: none;
|
43
46
|
padding-bottom: 0;
|
44
47
|
}
|
45
48
|
}
|
49
|
+
|
50
|
+
tbody tr.menu_hack-addition{
|
51
|
+
background: rgb(255, 248, 222);
|
52
|
+
}
|