decidim-decidim_awesome 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -35
  3. data/Rakefile +11 -12
  4. data/app/cells/decidim/decidim_awesome/content_blocks/map/error.erb +11 -0
  5. data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +1 -61
  6. data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +11 -0
  7. data/app/cells/decidim/decidim_awesome/content_blocks/map_form/show.erb +8 -4
  8. data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +51 -0
  9. data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +47 -0
  10. data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +49 -0
  11. data/app/commands/decidim/decidim_awesome/create_editor_image.rb +12 -5
  12. data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +58 -0
  13. data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +15 -22
  14. data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +9 -1
  15. data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +91 -0
  16. data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +5 -8
  17. data/app/controllers/decidim/decidim_awesome/blank_component_controller.rb +19 -0
  18. data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +2 -3
  19. data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +1 -1
  20. data/app/controllers/decidim/decidim_awesome/map_component/map_controller.rb +2 -6
  21. data/app/forms/decidim/decidim_awesome/admin/config_form.rb +2 -0
  22. data/app/forms/decidim/decidim_awesome/admin/custom_redirect_form.rb +45 -0
  23. data/app/forms/decidim/decidim_awesome/editor_image_form.rb +3 -2
  24. data/app/forms/decidim/decidim_awesome/proposals/proposal_wizard_create_step_form_override.rb +38 -0
  25. data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +22 -9
  26. data/app/helpers/decidim/decidim_awesome/admin/system_checker_helpers.rb +36 -0
  27. data/app/helpers/decidim/decidim_awesome/map_helper.rb +18 -12
  28. data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +2 -2
  29. data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +106 -0
  30. data/app/models/decidim/decidim_awesome/editor_image.rb +4 -9
  31. data/app/packs/entrypoints/decidim_admin_decidim_awesome.js +5 -0
  32. data/app/packs/entrypoints/decidim_admin_decidim_awesome.scss +1 -0
  33. data/app/packs/entrypoints/decidim_admin_decidim_awesome_custom_fields.js +2 -0
  34. data/app/packs/entrypoints/decidim_decidim_awesome.js +9 -0
  35. data/app/packs/entrypoints/decidim_decidim_awesome.scss +1 -0
  36. data/app/packs/entrypoints/decidim_decidim_awesome_admin_form_exit_warn.js +1 -0
  37. data/app/packs/entrypoints/decidim_decidim_awesome_custom_fields.js +1 -0
  38. data/app/packs/entrypoints/decidim_decidim_awesome_iframe.scss +1 -0
  39. data/app/packs/entrypoints/decidim_decidim_awesome_map.js +5 -0
  40. data/app/packs/entrypoints/decidim_decidim_awesome_map.scss +1 -0
  41. data/app/{assets → packs}/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
  42. data/app/{assets/javascripts/decidim/decidim_awesome/admin/auto_edit.js.es6 → packs/src/decidim/decidim_awesome/admin/auto_edit.js} +39 -34
  43. data/app/packs/src/decidim/decidim_awesome/admin/check_redirections.js +48 -0
  44. data/app/{assets/javascripts/decidim/decidim_awesome/admin/codemirror.js.es6 → packs/src/decidim/decidim_awesome/admin/codemirror.js} +4 -4
  45. data/app/packs/src/decidim/decidim_awesome/admin/constraints.js +55 -0
  46. data/app/{assets/javascripts/decidim/decidim_awesome/admin/form_builder.js.es6 → packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js} +23 -26
  47. data/app/{assets/javascripts/decidim/decidim_awesome/admin/form_exit_warn.js.es6 → packs/src/decidim/decidim_awesome/admin/form_exit_warn.js} +0 -2
  48. data/app/{assets/javascripts/decidim/decidim_awesome/admin/user_picker.js.es6 → packs/src/decidim/decidim_awesome/admin/user_picker.js} +3 -3
  49. data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +23 -0
  50. data/app/packs/src/decidim/decidim_awesome/awesome_application.js +17 -0
  51. data/app/{assets/javascripts/decidim/decidim_awesome/awesome_map/api_fetcher.js.es6 → packs/src/decidim/decidim_awesome/awesome_map/api/api_fetcher.js} +1 -15
  52. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/fetcher.js +131 -0
  53. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/meetings_fetcher.js +59 -0
  54. data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +52 -0
  55. data/app/packs/src/decidim/decidim_awesome/awesome_map/awesome_map.js +130 -0
  56. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +112 -0
  57. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/meetings_controller.js +31 -0
  58. data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +88 -0
  59. data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +221 -0
  60. data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +51 -0
  61. data/app/packs/src/decidim/decidim_awesome/editors/editor.js +190 -0
  62. data/app/{assets/javascripts/decidim/decidim_awesome/editors/tabs_focus.js.es6 → packs/src/decidim/decidim_awesome/editors/tabs_focus.js} +4 -6
  63. data/app/{assets/javascripts/decidim/decidim_awesome/forms/autosave.js.es6 → packs/src/decidim/decidim_awesome/forms/autosave.js} +20 -17
  64. data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +207 -0
  65. data/app/{assets/javascripts/decidim/decidim_awesome/forms/rich_text_plugin.js.es6 → packs/src/decidim/decidim_awesome/forms/rich_text_plugin.js} +21 -20
  66. data/app/packs/src/decidim/decidim_awesome/proposals/custom_fields.js +22 -0
  67. data/app/packs/src/decidim/decidim_awesome/proposals/images.js +25 -0
  68. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-resize.min.js +0 -0
  69. data/{vendor/assets/javascripts → app/packs/src/vendor}/image-upload.min.js +0 -0
  70. data/{vendor/assets/javascripts → app/packs/src/vendor}/jquery.truncate.js +0 -0
  71. data/app/packs/src/vendor/leaflet.featuregroup.subgroup.js +184 -0
  72. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +2 -1
  73. data/app/packs/stylesheets/decidim/decidim_awesome/admin/check_redirections.scss +28 -0
  74. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +8 -6
  75. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/constraints.scss +13 -13
  76. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +37 -10
  77. data/app/packs/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +41 -0
  78. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin.scss +71 -0
  79. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_application.scss +19 -0
  80. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +3 -3
  81. data/app/packs/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +176 -0
  82. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +6 -4
  83. data/app/packs/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +58 -0
  84. data/app/{assets → packs}/stylesheets/decidim/decidim_awesome/forms/autosave.scss +2 -2
  85. data/app/packs/stylesheets/vendor/select2-foundation-theme.scss +348 -0
  86. data/app/presenters/decidim/decidim_awesome/menu_item_presenter_override.rb +25 -0
  87. data/app/presenters/decidim/decidim_awesome/menu_presenter_override.rb +23 -0
  88. data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +26 -0
  89. data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +4 -16
  90. data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +28 -22
  91. data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +1 -1
  92. data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +1 -1
  93. data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +1 -0
  94. data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +1 -1
  95. data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +7 -6
  96. data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +1 -1
  97. data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +3 -3
  98. data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +1 -1
  99. data/app/views/decidim/decidim_awesome/admin/custom_redirects/_form.html.erb +6 -0
  100. data/app/views/decidim/decidim_awesome/admin/custom_redirects/edit.html.erb +13 -0
  101. data/app/views/decidim/decidim_awesome/admin/custom_redirects/index.html.erb +37 -0
  102. data/app/views/decidim/decidim_awesome/admin/custom_redirects/new.html.erb +13 -0
  103. data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +1 -1
  104. data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +1 -1
  105. data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +5 -3
  106. data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +1 -1
  107. data/app/views/decidim/decidim_awesome/map_component/map/_api_ready.html.erb +3 -0
  108. data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +68 -0
  109. data/app/views/decidim/decidim_awesome/map_component/map/{error.erb → error.html.erb} +2 -0
  110. data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +3 -67
  111. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  112. data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +13 -9
  113. data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +0 -2
  114. data/app/views/{v0.24 → v0.25}/decidim/proposals/collaborative_drafts/_show.html.erb +0 -0
  115. data/app/views/{v0.23 → v0.25}/layouts/decidim/_head.html.erb +12 -10
  116. data/app/views/v0.25/layouts/decidim/admin/_header.html.erb +11 -0
  117. data/app/views/{v0.23 → v0.26}/decidim/proposals/collaborative_drafts/_show.html.erb +1 -7
  118. data/app/views/{v0.24 → v0.26}/layouts/decidim/_head.html.erb +16 -10
  119. data/app/views/v0.26/layouts/decidim/admin/_header.html.erb +11 -0
  120. data/config/assets.rb +46 -0
  121. data/config/i18n-tasks.yml +6 -0
  122. data/config/locales/ca.yml +75 -13
  123. data/config/locales/cs.yml +63 -1
  124. data/config/locales/en.yml +67 -1
  125. data/config/locales/es.yml +63 -1
  126. data/config/locales/eu.yml +0 -232
  127. data/config/locales/fr.yml +115 -53
  128. data/config/locales/it.yml +63 -1
  129. data/config/locales/ja.yml +64 -3
  130. data/config/locales/nl.yml +5 -46
  131. data/config/locales/pt-BR.yml +346 -0
  132. data/config/locales/pt-PT.yml +7 -0
  133. data/config/locales/pt.yml +7 -0
  134. data/config/locales/sv.yml +67 -182
  135. data/lib/decidim/decidim_awesome/admin_engine.rb +10 -15
  136. data/lib/decidim/decidim_awesome/awesome.rb +214 -0
  137. data/lib/decidim/decidim_awesome/awesome_helpers.rb +0 -7
  138. data/lib/decidim/decidim_awesome/checksums.yml +13 -16
  139. data/lib/decidim/decidim_awesome/config.rb +1 -0
  140. data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +39 -0
  141. data/lib/decidim/decidim_awesome/engine.rb +27 -55
  142. data/lib/decidim/decidim_awesome/iframe_component/admin_engine.rb +23 -0
  143. data/lib/decidim/decidim_awesome/iframe_component/component.rb +5 -5
  144. data/lib/decidim/decidim_awesome/map_component/admin_engine.rb +23 -0
  145. data/lib/decidim/decidim_awesome/map_component/component.rb +5 -4
  146. data/lib/decidim/decidim_awesome/map_component/engine.rb +34 -0
  147. data/lib/decidim/decidim_awesome/menu_hacker.rb +1 -0
  148. data/lib/decidim/decidim_awesome/test/factories.rb +2 -2
  149. data/lib/decidim/decidim_awesome/test/initializer.rb +25 -0
  150. data/lib/decidim/decidim_awesome/test/layouts/decidim/_head.html.erb +30 -2
  151. data/lib/decidim/decidim_awesome/test/layouts/decidim/admin/_header.html.erb +7 -2
  152. data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +18 -0
  153. data/lib/decidim/decidim_awesome/test/shared_examples/controller_examples.rb +13 -0
  154. data/lib/decidim/decidim_awesome/test/shared_examples/custom_redirects_contexts.rb +47 -0
  155. data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +0 -17
  156. data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +9 -17
  157. data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +202 -0
  158. data/lib/decidim/decidim_awesome/version.rb +2 -2
  159. data/lib/decidim/decidim_awesome.rb +4 -152
  160. data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +37 -0
  161. data/lib/tasks/decidim_awesome_webpacker_tasks.rake +62 -0
  162. metadata +111 -113
  163. data/app/assets/config/decidim_admin_decidim_awesome_manifest.css +0 -3
  164. data/app/assets/config/decidim_admin_decidim_awesome_manifest.js +0 -2
  165. data/app/assets/config/decidim_decidim_awesome_manifest.css +0 -5
  166. data/app/assets/config/decidim_decidim_awesome_manifest.js +0 -4
  167. data/app/assets/config/legacy_decidim_admin_decidim_awesome_manifest.js +0 -2
  168. data/app/assets/config/legacy_decidim_decidim_awesome_manifest.js +0 -4
  169. data/app/assets/javascripts/decidim/decidim_awesome/admin/constraints.js.es6 +0 -54
  170. data/app/assets/javascripts/decidim/decidim_awesome/admin/legacy_form_builder.js.es6 +0 -80
  171. data/app/assets/javascripts/decidim/decidim_awesome/awesome_admin.js +0 -7
  172. data/app/assets/javascripts/decidim/decidim_awesome/awesome_application.js +0 -3
  173. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/categories.js.es6 +0 -25
  174. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/hashtags.js.es6 +0 -48
  175. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/layers.js.es6 +0 -107
  176. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/load_map.js.es6 +0 -15
  177. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/map.js.es6 +0 -207
  178. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/markers.js.es6 +0 -56
  179. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/meetings.js.es6 +0 -132
  180. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/proposals.js.es6 +0 -107
  181. data/app/assets/javascripts/decidim/decidim_awesome/awesome_map/utilities.js.es6 +0 -57
  182. data/app/assets/javascripts/decidim/decidim_awesome/editors/legacy_quill_editor.js.es6 +0 -172
  183. data/app/assets/javascripts/decidim/decidim_awesome/editors/quill_editor.js.es6 +0 -185
  184. data/app/assets/javascripts/decidim/decidim_awesome/forms/custom_fields_builder.js.es6 +0 -211
  185. data/app/assets/javascripts/decidim/decidim_awesome/legacy_admin.js +0 -7
  186. data/app/assets/javascripts/decidim/decidim_awesome/legacy_application.js +0 -3
  187. data/app/assets/javascripts/decidim/decidim_awesome/proposals/custom_fields.js.es6 +0 -21
  188. data/app/assets/javascripts/decidim/decidim_awesome/proposals/images.js.es6 +0 -25
  189. data/app/assets/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +0 -35
  190. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_admin.scss +0 -64
  191. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_application.scss +0 -22
  192. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/leaflet.scss.erb +0 -18
  193. data/app/assets/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +0 -160
  194. data/app/assets/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +0 -22
  195. data/app/awesome_overrides/forms/decidim/proposals/proposal_wizard_create_step_form_override.rb +0 -28
  196. data/app/awesome_overrides/presenters/decidim/menu_presenter_override.rb +0 -39
  197. data/app/controllers/concerns/decidim/decidim_awesome/admin_not_found_redirect.rb +0 -39
  198. data/app/controllers/decidim/decidim_awesome/iframe_component/application_controller.rb +0 -15
  199. data/app/controllers/decidim/decidim_awesome/map_component/application_controller.rb +0 -15
  200. data/app/views/v0.23/layouts/decidim/admin/_header.html.erb +0 -12
  201. data/app/views/v0.24/layouts/decidim/admin/_header.html.erb +0 -12
  202. data/lib/decidim/decidim_awesome/test/themes/css.lvh.me.css +0 -3
  203. data/lib/decidim/decidim_awesome/test/themes/erb.lvh.me.scss.erb +0 -2
  204. data/lib/decidim/decidim_awesome/test/themes/scss.lvh.me.scss +0 -1
  205. data/lib/decidim/decidim_awesome/test/themes/test-theme/body.scss +0 -4
  206. data/vendor/assets/images/layers-2x.png +0 -0
  207. data/vendor/assets/images/layers.png +0 -0
  208. data/vendor/assets/images/marker-icon.png +0 -0
  209. data/vendor/assets/javascripts/codemirror-4.inline-attachment.js +0 -89
  210. data/vendor/assets/javascripts/codemirror.js +0 -9801
  211. data/vendor/assets/javascripts/delta.min.js +0 -405
  212. data/vendor/assets/javascripts/delta.min.js.map +0 -1
  213. data/vendor/assets/javascripts/europa.min.js +0 -4
  214. data/vendor/assets/javascripts/form-builder.min.js +0 -19
  215. data/vendor/assets/javascripts/form-render.min.js +0 -19
  216. data/vendor/assets/javascripts/form-storage.js +0 -824
  217. data/vendor/assets/javascripts/highlight.min.js +0 -44
  218. data/vendor/assets/javascripts/inline-attachment.js +0 -399
  219. data/vendor/assets/javascripts/inscrybmde.min.js +0 -7
  220. data/vendor/assets/javascripts/jquery-ui.min.js +0 -13
  221. data/vendor/assets/javascripts/jquery.inline-attachment.js +0 -66
  222. data/vendor/assets/javascripts/jsrender.min.js +0 -4
  223. data/vendor/assets/javascripts/keymap/sublime.js +0 -720
  224. data/vendor/assets/javascripts/leaflet.featuregroup.subgroup.js +0 -6
  225. data/vendor/assets/javascripts/mode/css/css.js +0 -864
  226. data/vendor/assets/javascripts/select2.js +0 -6147
  227. data/vendor/assets/langs/en-US.lang +0 -110
  228. data/vendor/assets/stylesheets/codemirror.css +0 -350
  229. data/vendor/assets/stylesheets/default.min.css +0 -1
  230. data/vendor/assets/stylesheets/foundation.min.css +0 -1
  231. data/vendor/assets/stylesheets/github.min.css +0 -2
  232. data/vendor/assets/stylesheets/inscrybmde.min.scss +0 -194
  233. data/vendor/assets/stylesheets/jquery-ui.min.css +0 -7
  234. data/vendor/assets/stylesheets/select2-foundation-theme.css +0 -249
  235. data/vendor/assets/stylesheets/select2.css +0 -515
@@ -1,399 +0,0 @@
1
- /*jslint newcap: true */
2
- /*global XMLHttpRequest: false, FormData: false */
3
- /*
4
- * Inline Text Attachment
5
- *
6
- * Author: Roy van Kaathoven
7
- * Contact: ik@royvankaathoven.nl
8
- */
9
- (function(document, window) {
10
- 'use strict';
11
-
12
- var inlineAttachment = function(options, instance) {
13
- this.settings = inlineAttachment.util.merge(options, inlineAttachment.defaults);
14
- this.editor = instance;
15
- this.filenameTag = '{filename}';
16
- this.lastValue = null;
17
- };
18
-
19
- /**
20
- * Will holds the available editors
21
- *
22
- * @type {Object}
23
- */
24
- inlineAttachment.editors = {};
25
-
26
- /**
27
- * Utility functions
28
- */
29
- inlineAttachment.util = {
30
-
31
- /**
32
- * Simple function to merge the given objects
33
- *
34
- * @param {Object[]} object Multiple object parameters
35
- * @returns {Object}
36
- */
37
- merge: function() {
38
- var result = {};
39
- for (var i = arguments.length - 1; i >= 0; i--) {
40
- var obj = arguments[i];
41
- for (var k in obj) {
42
- if (obj.hasOwnProperty(k)) {
43
- result[k] = obj[k];
44
- }
45
- }
46
- }
47
- return result;
48
- },
49
-
50
- /**
51
- * Append a line of text at the bottom, ensuring there aren't unnecessary newlines
52
- *
53
- * @param {String} appended Current content
54
- * @param {String} previous Value which should be appended after the current content
55
- */
56
- appendInItsOwnLine: function(previous, appended) {
57
- return (previous + "\n\n[[D]]" + appended)
58
- .replace(/(\n{2,})\[\[D\]\]/, "\n\n")
59
- .replace(/^(\n*)/, "");
60
- },
61
-
62
- /**
63
- * Inserts the given value at the current cursor position of the textarea element
64
- *
65
- * @param {HtmlElement} el
66
- * @param {String} value Text which will be inserted at the cursor position
67
- */
68
- insertTextAtCursor: function(el, text) {
69
- var scrollPos = el.scrollTop,
70
- strPos = 0,
71
- browser = false,
72
- range;
73
-
74
- if ((el.selectionStart || el.selectionStart === '0')) {
75
- browser = "ff";
76
- } else if (document.selection) {
77
- browser = "ie";
78
- }
79
-
80
- if (browser === "ie") {
81
- el.focus();
82
- range = document.selection.createRange();
83
- range.moveStart('character', -el.value.length);
84
- strPos = range.text.length;
85
- } else if (browser === "ff") {
86
- strPos = el.selectionStart;
87
- }
88
-
89
- var front = (el.value).substring(0, strPos);
90
- var back = (el.value).substring(strPos, el.value.length);
91
- el.value = front + text + back;
92
- strPos = strPos + text.length;
93
- if (browser === "ie") {
94
- el.focus();
95
- range = document.selection.createRange();
96
- range.moveStart('character', -el.value.length);
97
- range.moveStart('character', strPos);
98
- range.moveEnd('character', 0);
99
- range.select();
100
- } else if (browser === "ff") {
101
- el.selectionStart = strPos;
102
- el.selectionEnd = strPos;
103
- el.focus();
104
- }
105
- el.scrollTop = scrollPos;
106
- }
107
- };
108
-
109
- /**
110
- * Default configuration options
111
- *
112
- * @type {Object}
113
- */
114
- inlineAttachment.defaults = {
115
- /**
116
- * URL where the file will be send
117
- */
118
- uploadUrl: 'upload_attachment.php',
119
-
120
- /**
121
- * Which method will be used to send the file to the upload URL
122
- */
123
- uploadMethod: 'POST',
124
-
125
- /**
126
- * Name in which the file will be placed
127
- */
128
- uploadFieldName: 'file',
129
-
130
- /**
131
- * Extension which will be used when a file extension could not
132
- * be detected
133
- */
134
- defaultExtension: 'png',
135
-
136
- /**
137
- * JSON field which refers to the uploaded file URL
138
- */
139
- jsonFieldName: 'filename',
140
-
141
- /**
142
- * Allowed MIME types
143
- */
144
- allowedTypes: [
145
- 'image/jpeg',
146
- 'image/png',
147
- 'image/jpg',
148
- 'image/gif'
149
- ],
150
-
151
- /**
152
- * Text which will be inserted when dropping or pasting a file.
153
- * Acts as a placeholder which will be replaced when the file is done with uploading
154
- */
155
- progressText: '![Uploading file...]()',
156
-
157
- /**
158
- * When a file has successfully been uploaded the progressText
159
- * will be replaced by the urlText, the {filename} tag will be replaced
160
- * by the filename that has been returned by the server
161
- */
162
- urlText: "![file]({filename})",
163
-
164
- /**
165
- * Text which will be used when uploading has failed
166
- */
167
- errorText: "Error uploading file",
168
-
169
- /**
170
- * Extra parameters which will be send when uploading a file
171
- */
172
- extraParams: {},
173
-
174
- /**
175
- * Extra headers which will be send when uploading a file
176
- */
177
- extraHeaders: {},
178
-
179
- /**
180
- * Before the file is send
181
- */
182
- beforeFileUpload: function() {
183
- return true;
184
- },
185
-
186
- /**
187
- * Triggers when a file is dropped or pasted
188
- */
189
- onFileReceived: function() {},
190
-
191
- /**
192
- * Custom upload handler
193
- *
194
- * @return {Boolean} when false is returned it will prevent default upload behavior
195
- */
196
- onFileUploadResponse: function() {
197
- return true;
198
- },
199
-
200
- /**
201
- * Custom error handler. Runs after removing the placeholder text and before the alert().
202
- * Return false from this function to prevent the alert dialog.
203
- *
204
- * @return {Boolean} when false is returned it will prevent default error behavior
205
- */
206
- onFileUploadError: function() {
207
- return true;
208
- },
209
-
210
- /**
211
- * When a file has succesfully been uploaded
212
- */
213
- onFileUploaded: function() {}
214
- };
215
-
216
- /**
217
- * Uploads the blob
218
- *
219
- * @param {Blob} file blob data received from event.dataTransfer object
220
- * @return {XMLHttpRequest} request object which sends the file
221
- */
222
- inlineAttachment.prototype.uploadFile = function(file) {
223
- var me = this,
224
- formData = new FormData(),
225
- xhr = new XMLHttpRequest(),
226
- settings = this.settings,
227
- extension = settings.defaultExtension || settings.defualtExtension;
228
-
229
- if (typeof settings.setupFormData === 'function') {
230
- settings.setupFormData(formData, file);
231
- }
232
-
233
- // Attach the file. If coming from clipboard, add a default filename (only works in Chrome for now)
234
- // http://stackoverflow.com/questions/6664967/how-to-give-a-blob-uploaded-as-formdata-a-file-name
235
- if (file.name) {
236
- var fileNameMatches = file.name.match(/\.(.+)$/);
237
- if (fileNameMatches) {
238
- extension = fileNameMatches[1];
239
- }
240
- }
241
-
242
- var remoteFilename = "image-" + Date.now() + "." + extension;
243
- if (typeof settings.remoteFilename === 'function') {
244
- remoteFilename = settings.remoteFilename(file);
245
- }
246
-
247
- formData.append(settings.uploadFieldName, file, remoteFilename);
248
-
249
- // Append the extra parameters to the formdata
250
- if (typeof settings.extraParams === "object") {
251
- for (var key in settings.extraParams) {
252
- if (settings.extraParams.hasOwnProperty(key)) {
253
- formData.append(key, settings.extraParams[key]);
254
- }
255
- }
256
- }
257
-
258
- xhr.open('POST', settings.uploadUrl);
259
-
260
- // Add any available extra headers
261
- if (typeof settings.extraHeaders === "object") {
262
- for (var header in settings.extraHeaders) {
263
- if (settings.extraHeaders.hasOwnProperty(header)) {
264
- xhr.setRequestHeader(header, settings.extraHeaders[header]);
265
- }
266
- }
267
- }
268
-
269
- xhr.onload = function() {
270
- // If HTTP status is OK or Created
271
- if (xhr.status === 200 || xhr.status === 201) {
272
- me.onFileUploadResponse(xhr);
273
- } else {
274
- me.onFileUploadError(xhr);
275
- }
276
- };
277
- if (settings.beforeFileUpload(xhr) !== false) {
278
- xhr.send(formData);
279
- }
280
- return xhr;
281
- };
282
-
283
- /**
284
- * Returns if the given file is allowed to handle
285
- *
286
- * @param {File} clipboard data file
287
- */
288
- inlineAttachment.prototype.isFileAllowed = function(file) {
289
- if (file.kind === 'string') { return false; }
290
- if (this.settings.allowedTypes.indexOf('*') === 0){
291
- return true;
292
- } else {
293
- return this.settings.allowedTypes.indexOf(file.type) >= 0;
294
- }
295
- };
296
-
297
- /**
298
- * Handles upload response
299
- *
300
- * @param {XMLHttpRequest} xhr
301
- * @return {Void}
302
- */
303
- inlineAttachment.prototype.onFileUploadResponse = function(xhr) {
304
- if (this.settings.onFileUploadResponse.call(this, xhr) !== false) {
305
- var result = JSON.parse(xhr.responseText),
306
- filename = result[this.settings.jsonFieldName];
307
-
308
- if (result && filename) {
309
- var newValue;
310
- if (typeof this.settings.urlText === 'function') {
311
- newValue = this.settings.urlText.call(this, filename, result);
312
- } else {
313
- newValue = this.settings.urlText.replace(this.filenameTag, filename);
314
- }
315
- var text = this.editor.getValue().replace(this.lastValue, newValue);
316
- this.editor.setValue(text);
317
- this.settings.onFileUploaded.call(this, filename);
318
- }
319
- }
320
- };
321
-
322
-
323
- /**
324
- * Called when a file has failed to upload
325
- *
326
- * @param {XMLHttpRequest} xhr
327
- * @return {Void}
328
- */
329
- inlineAttachment.prototype.onFileUploadError = function(xhr) {
330
- if (this.settings.onFileUploadError.call(this, xhr) !== false) {
331
- var text = this.editor.getValue().replace(this.lastValue, this.settings.errorText);
332
- this.editor.setValue(text);
333
- }
334
- };
335
-
336
- /**
337
- * Called when a file has been inserted, either by drop or paste
338
- *
339
- * @param {File} file
340
- * @return {Void}
341
- */
342
- inlineAttachment.prototype.onFileInserted = function(file) {
343
- if (this.settings.onFileReceived.call(this, file) !== false) {
344
- this.lastValue = this.settings.progressText;
345
- this.editor.insertValue(this.lastValue);
346
- }
347
- };
348
-
349
-
350
- /**
351
- * Called when a paste event occured
352
- * @param {Event} e
353
- * @return {Boolean} if the event was handled
354
- */
355
- inlineAttachment.prototype.onPaste = function(e) {
356
- var result = false,
357
- clipboardData = e.clipboardData,
358
- items;
359
-
360
- if (typeof clipboardData === "object") {
361
- items = clipboardData.items || clipboardData.files || [];
362
-
363
- for (var i = 0; i < items.length; i++) {
364
- var item = items[i];
365
- if (this.isFileAllowed(item)) {
366
- result = true;
367
- this.onFileInserted(item.getAsFile());
368
- this.uploadFile(item.getAsFile());
369
- }
370
- }
371
- }
372
-
373
- if (result) { e.preventDefault(); }
374
-
375
- return result;
376
- };
377
-
378
- /**
379
- * Called when a drop event occures
380
- * @param {Event} e
381
- * @return {Boolean} if the event was handled
382
- */
383
- inlineAttachment.prototype.onDrop = function(e) {
384
- var result = false;
385
- for (var i = 0; i < e.dataTransfer.files.length; i++) {
386
- var file = e.dataTransfer.files[i];
387
- if (this.isFileAllowed(file)) {
388
- result = true;
389
- this.onFileInserted(file);
390
- this.uploadFile(file);
391
- }
392
- }
393
-
394
- return result;
395
- };
396
-
397
- window.inlineAttachment = inlineAttachment;
398
-
399
- })(document, window);