Add drag & drop support on attachment button

issue7722
review60371002
This commit is contained in:
Cédric Krier
2018-10-25 21:03:06 +02:00
parent 281b8798e0
commit 18115d9a71
4 changed files with 118 additions and 12 deletions
+2
View File
@@ -1,3 +1,5 @@
* Add drag & drop support on attachment button
Version 5.0.0 - 2018-10-01
* Bug fixes (see mercurial logs for details)
* Prevent similar tab
+13 -12
View File
@@ -3448,22 +3448,23 @@
};
Sao.common.get_input_data = function(input, callback, char_) {
function read(file) {
var reader = new FileReader();
reader.onload = function() {
var value = new Uint8Array(reader.result);
if (char_) {
value = String.fromCharCode.apply(null, value);
}
callback(value, file.name);
};
reader.readAsArrayBuffer(file);
}
for (var i = 0; i < input[0].files.length; i++) {
read(input[0].files[i]);
Sao.common.get_file_data(input[0].files[i], callback, char_);
}
};
Sao.common.get_file_data = function(file, callback, char_) {
var reader = new FileReader();
reader.onload = function() {
var value = new Uint8Array(reader.result);
if (char_) {
value = String.fromCharCode.apply(null, value);
}
callback(value, file.name);
};
reader.readAsArrayBuffer(file);
};
Sao.common.ellipsize = function(string, length) {
if (string.length <= length) {
return string;
+78
View File
@@ -631,6 +631,9 @@
}.bind(this));
}.bind(this));
}.bind(this));
this.buttons.attach
.on('dragover', false)
.on('drop', this.attach_drop.bind(this));
return toolbar;
},
compare: function(attributes) {
@@ -1023,6 +1026,81 @@
})));
});
},
attach_drop: function(evt) {
evt.preventDefault();
evt.stopPropagation();
evt = evt.originalEvent;
var record = this.screen.current_record;
if (!record || record.id < 0) {
return;
}
var i, file;
var files = [],
uris = [],
texts = [];
if (evt.dataTransfer.items) {
console.log(evt.dataTransfer.items);
for (i = 0; i < evt.dataTransfer.items.length; i++) {
var item = evt.dataTransfer.items[i];
if (item.kind == 'string') {
var list;
if (item.type == 'text/uri-list') {
list = uris;
} else if (item.type == 'text/plain') {
list = texts;
} else {
continue;
}
var prm = jQuery.Deferred();
evt.dataTransfer.items[i].getAsString(prm.resolve);
list.push(prm);
break;
} else {
file = evt.dataTransfer.items[i].getAsFile();
if (file) {
files.push(file);
}
}
}
} else {
for (i = 0; i < evt.dataTransfer.files.length; i++) {
file = evt.dataTransfer.files[i];
if (file) {
files.push(file);
}
}
}
var window_ = new Sao.Window.Attachment(record, function() {
this.update_attachment_count(true);
}.bind(this));
files.forEach(function(file) {
Sao.common.get_file_data(file, function(data, filename) {
window_.add_data(data, filename);
});
});
jQuery.when.apply(jQuery, uris).then(function() {
function empty(value) {
return Boolean(value);
}
for (var i = 0; i < arguments.length; i++) {
arguments[i].split('\r\n')
.filter(empty)
.forEach(window_.add_uri, window_);
}
});
jQuery.when.apply(jQuery, texts).then(function() {
for (var i = 0; i < arguments.length; i++) {
window_.add_text(arguments[i]);
}
});
if (evt.dataTransfer.items) {
evt.dataTransfer.items.clear();
} else {
evt.dataTransfer.clearData();
}
},
update_attachment_count: function(reload) {
var record = this.screen.current_record;
if (record) {
+25
View File
@@ -452,6 +452,31 @@
});
});
},
add_uri: function(uri) {
var screen = this.screen;
this.switch_prm.then(function() {
screen.set_current_record(null);
screen.switch_view('form').then(function() {
screen.new_().then(function(record) {
record.field_set_client('link', uri);
record.field_set_client('type', 'link');
screen.display();
});
});
});
},
add_text: function(text) {
var screen = this.screen;
this.switch_prm.then(function() {
screen.set_current_record(null);
screen.switch_view('form').then(function() {
screen.new_().then(function(record) {
record.field_set_client('description', text);
screen.display();
});
});
});
},
});
Sao.Window.Attachment.get_attachments = function(record) {
var prm;