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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -7
  3. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +1 -0
  4. data/app/assets/config/decidim_decidim_awesome_manifest.js +1 -1
  5. data/app/assets/javascripts/decidim/decidim_awesome/admin.js +1 -0
  6. data/app/assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 +15 -0
  7. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +48 -0
  8. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +106 -0
  9. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +166 -170
  10. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +56 -0
  11. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +6 -5
  12. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +17 -4
  13. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +48 -0
  14. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +160 -0
  15. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +16 -5
  16. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +3 -0
  17. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +4 -0
  18. data/app/assets/stylesheets/decidim/decidim_awesome/admin.scss +10 -3
  19. data/app/assets/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +16 -0
  20. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +9 -0
  21. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +95 -0
  22. data/app/assets/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +1 -1
  23. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +39 -0
  24. data/app/awesome_overrides/presenters/decidim/proposals/proposal_presenter_override.rb +3 -9
  25. data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +51 -0
  26. data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +47 -0
  27. data/app/commands/decidim/decidim_awesome/admin/update_config.rb +5 -2
  28. data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +47 -0
  29. data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +4 -3
  30. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +1 -1
  31. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +12 -3
  32. data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +13 -0
  33. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +116 -0
  34. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +1 -4
  35. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +21 -2
  36. data/app/forms/decidim/decidim_awesome/admin/constraint_form.rb +0 -2
  37. data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +0 -2
  38. data/app/forms/decidim/decidim_awesome/admin/menu_form.rb +39 -0
  39. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +5 -1
  40. data/app/helpers/decidim/decidim_awesome/map_helper.rb +12 -50
  41. data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +19 -0
  42. data/app/permissions/decidim/decidim_awesome/permissions.rb +2 -0
  43. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +0 -5
  44. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +1 -1
  45. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +1 -1
  46. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +1 -2
  47. data/app/views/decidim/decidim_awesome/admin/menu_hacks/_form.html.erb +7 -0
  48. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +13 -0
  49. data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +44 -0
  50. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +13 -0
  51. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +4 -31
  52. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +5 -0
  53. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +4 -1
  54. data/app/views/v0.23/layouts/decidim/_head.html.erb +1 -1
  55. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +1 -1
  56. data/app/views/{v0.22 → v0.24}/layouts/decidim/_head.html.erb +2 -0
  57. data/app/views/{v0.22 → v0.24}/layouts/decidim/admin/_header.html.erb +1 -0
  58. data/config/locales/ca.yml +70 -2
  59. data/config/locales/cs.yml +71 -3
  60. data/config/locales/en.yml +61 -4
  61. data/config/locales/es.yml +70 -2
  62. data/config/locales/eu.yml +225 -0
  63. data/config/locales/fr.yml +172 -104
  64. data/config/locales/nl.yml +225 -0
  65. data/config/locales/sv.yml +93 -25
  66. data/lib/decidim/decidim_awesome.rb +15 -0
  67. data/lib/decidim/decidim_awesome/admin_engine.rb +1 -0
  68. data/lib/decidim/decidim_awesome/awesome_helpers.rb +1 -1
  69. data/lib/decidim/decidim_awesome/checksums.yml +7 -4
  70. data/lib/decidim/decidim_awesome/config.rb +1 -3
  71. data/lib/decidim/decidim_awesome/engine.rb +3 -3
  72. data/lib/decidim/decidim_awesome/iframe_component/component.rb +1 -1
  73. data/lib/decidim/decidim_awesome/map_component/component.rb +8 -2
  74. data/lib/decidim/decidim_awesome/menu_hacker.rb +90 -0
  75. data/lib/decidim/decidim_awesome/system_checker.rb +1 -1
  76. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +4 -2
  77. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +71 -0
  78. data/lib/decidim/decidim_awesome/version.rb +2 -2
  79. data/vendor/assets/javascripts/codemirror.js +9801 -0
  80. data/vendor/assets/javascripts/jquery.truncate.js +105 -0
  81. data/vendor/assets/javascripts/keymap/sublime.js +720 -0
  82. data/vendor/assets/javascripts/mode/css/css.js +864 -0
  83. data/vendor/assets/stylesheets/codemirror.css +350 -0
  84. data/vendor/assets/stylesheets/inscrybmde.min.scss +180 -0
  85. metadata +61 -20
  86. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_map.js.es6 +0 -225
  87. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/legacy_proposals.js.es6 +0 -82
  88. 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
- element.body.translation = ApiFetcher.findTranslation(element.body.translations).replace(/\n/g, "<br>");
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
- toolbar: quillToolbar
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);
@@ -0,0 +1,3 @@
1
+ // = require decidim/decidim_awesome/admin/constraints
2
+ // = require decidim/decidim_awesome/admin/codemirror
3
+ // = require decidim/decidim_awesome/editors/legacy_quill_editor
@@ -0,0 +1,4 @@
1
+ // = require decidim/decidim_awesome/proposals/images
2
+ // = require decidim/decidim_awesome/editors/legacy_quill_editor
3
+ // = require decidim/decidim_awesome/editors/markdown_view
4
+ // = require decidim/decidim_awesome/forms/autosave
@@ -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
- &-form:last-child {
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
+ }