You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
4.4 KiB

  1. /* Copyright 2017 Onestein
  2. * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
  3. odoo.define('web_chatter_paste', function (require) {
  4. "use strict";
  5. var core = require('web.core'),
  6. composer = require('mail.composer');
  7. composer.BasicComposer.include({
  8. start: function() {
  9. var self = this;
  10. var res = this._super.apply(this, arguments);
  11. this.$('.o_composer_text_field').bind('drop', function(e) {
  12. e.stopPropagation();
  13. e.preventDefault();
  14. var files = e.originalEvent.dataTransfer.files;
  15. var i = 0;
  16. var next = function() {
  17. $(window).off(self.fileupload_id, next);
  18. i++;
  19. upload();
  20. }
  21. var upload = function() {
  22. if (files.length <= i) return;
  23. var reader = new FileReader();
  24. reader.onload = function() {
  25. $(window).on(self.fileupload_id, next);
  26. self.add_as_attachment(reader.result, files[i].name);
  27. }
  28. reader.readAsDataURL(files[i]);
  29. }
  30. upload();
  31. });
  32. this.$('.o_composer_text_field').bind('paste', function(e) {
  33. if (!e.originalEvent.clipboardData.items) return;
  34. var items = e.originalEvent.clipboardData.items;
  35. for (var i = 0; i < items.length; i++) {
  36. var item = items[i];
  37. if (item.type != 'image/png') continue;
  38. var reader = new FileReader();
  39. reader.onload = function() {
  40. self.add_as_attachment(reader.result, _.uniqueId('pasted_file') + '.png');
  41. }
  42. reader.readAsDataURL(item.getAsFile());
  43. }
  44. });
  45. return res;
  46. },
  47. add_as_attachment: function(data, filename, cb) {
  48. //Fetch mimetype and base64
  49. var mimetype = data.substring(5, data.indexOf(';'));
  50. var base64_data = data.substr(data.indexOf(',') + 1, data.length);
  51. //Change and submit form
  52. this.prepare_form();
  53. this.$('form.o_form_binary_form input.filename').val(filename);
  54. this.$('form.o_form_binary_form input.content').val(base64_data);
  55. this.$('form.o_form_binary_form input.mimetype').val(mimetype);
  56. this.$('form.o_form_binary_form').submit();
  57. this.reverse_form();
  58. var attachments = this.get('attachment_ids');
  59. this.$attachment_button.prop('disabled', true);
  60. attachments.push({
  61. 'id': 0,
  62. 'name': _.uniqueId('attachment_name'),
  63. 'filename': filename,
  64. 'url': filename,
  65. 'upload': true,
  66. 'mimetype': '',
  67. });
  68. },
  69. prepare_form: function() {
  70. //Change action
  71. this.$('form.o_form_binary_form').attr('action', '/web_chatter_paste/upload_attachment');
  72. //Remove ufile
  73. this.$('form.o_form_binary_form input.o_form_input_file').remove();
  74. //Add hidden input content
  75. var $content = $('<input type="hidden" name="content" class="content" />');
  76. this.$('form.o_form_binary_form').append($content);
  77. //Add hidden input filename
  78. var $filename = $('<input type="hidden" name="filename" class="filename" />');
  79. this.$('form.o_form_binary_form').append($filename);
  80. //Add hidden input filename
  81. var $mimetype = $('<input type="hidden" name="mimetype" class="mimetype" />');
  82. this.$('form.o_form_binary_form').append($mimetype);
  83. },
  84. reverse_form: function() {
  85. //Change action
  86. this.$('form.o_form_binary_form').attr('action', '/web/binary/upload_attachment');
  87. //Remove new input
  88. this.$('form.o_form_binary_form input.content').remove();
  89. this.$('form.o_form_binary_form input.filename').remove();
  90. this.$('form.o_form_binary_form input.mimetype').remove();
  91. //Restore old input
  92. var $ufile = $('<input class="o_form_input_file" name="ufile" type="file" />');
  93. this.$('form.o_form_binary_form').append($ufile);
  94. }
  95. });
  96. });