Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
242 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,8 +2,9 @@ language: python | |
|
||
python: | ||
- "2.7" | ||
|
||
sudo: false | ||
group: edge | ||
cache: pip | ||
|
||
addons: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg | ||
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html | ||
:alt: License: AGPL-3 | ||
|
||
=================== | ||
Drop target support | ||
=================== | ||
|
||
This module was written to extend the functionality of the web client to support dropping local files into the web client. | ||
|
||
By default, this will create an attachment when a file is being dropped on a form, other modules can add more features. | ||
|
||
Further, this module is meant as a base module supporting other actions after some file is dropped so that we don't get incompatible drag&drop modules within the OCA. | ||
|
||
Usage | ||
===== | ||
|
||
To use this module, you need to: | ||
|
||
#. drag a file from your local computer onto an Odoo form view | ||
#. it should become an attachment of the currently opened record | ||
|
||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas | ||
:alt: Try me on Runbot | ||
:target: https://runbot.odoo-community.org/runbot/162/10.0 | ||
|
||
Known issues / Roadmap | ||
====================== | ||
|
||
* dropping on list or kanban views would be nice too | ||
* handle multiple files | ||
* add an upload progress meter for huge files | ||
|
||
Bug Tracker | ||
=========== | ||
|
||
Bugs are tracked on `GitHub Issues | ||
<https://github.com/OCA/web/issues>`_. In case of trouble, please | ||
check there if your issue has already been reported. If you spotted it first, | ||
help us smashing it by providing a detailed and welcomed feedback. | ||
|
||
Credits | ||
======= | ||
|
||
Images | ||
------ | ||
|
||
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. | ||
|
||
Libraries | ||
--------- | ||
|
||
* `base64js <https://raw.githubusercontent.com/beatgammit/base64-js>`_. | ||
|
||
Contributors | ||
------------ | ||
|
||
* Holger Brunn <hbrunn@therp.nl> | ||
|
||
Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list <mailto:community@mail.odoo.com>`_ or the `appropriate specialized mailinglist <https://odoo-community.org/groups>`_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues. | ||
|
||
Maintainer | ||
---------- | ||
|
||
.. image:: https://odoo-community.org/logo.png | ||
:alt: Odoo Community Association | ||
:target: https://odoo-community.org | ||
|
||
This module is maintained by the OCA. | ||
|
||
OCA, or the Odoo Community Association, is a nonprofit organization whose | ||
mission is to support the collaborative development of Odoo features and | ||
promote its widespread use. | ||
|
||
To contribute to this module, please visit https://odoo-community.org. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2018 Therp BV <https://therp.nl> | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2018 Therp BV <https://therp.nl> | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). | ||
{ | ||
"name": "Drop target support", | ||
"version": "10.0.1.0.0", | ||
"author": "Therp BV,Odoo Community Association (OCA)", | ||
"license": "AGPL-3", | ||
"category": "Usability", | ||
"summary": "Allows to drag files into Odoo", | ||
"depends": [ | ||
'web', | ||
], | ||
"data": [ | ||
'views/templates.xml', | ||
], | ||
} |
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
//-*- coding: utf-8 -*- | ||
//Copyright 2018 Therp BV <https://therp.nl> | ||
//License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). | ||
|
||
odoo.define('web_drop_target', function(require) | ||
{ | ||
var Model = require('web.Model'), | ||
FormView = require('web.FormView'); | ||
|
||
// this is the main contribution of this addon: A mixin you can use | ||
// to make some widget a drop target. Read on how to use this yourself | ||
var DropTargetMixin = { | ||
// add the mime types you want to support here, leave empty for | ||
// all types. For more control, override _get_drop_item in your class | ||
_drop_allowed_types: [], | ||
|
||
// a class being applied when the user drags something we can handle | ||
_drag_over_class: 'o_drag_over', | ||
|
||
start: function() { | ||
var result = this._super.apply(this, arguments); | ||
this.$el.on('drop.widget_events', this.proxy('_on_drop')); | ||
this.$el.on('dragenter.widget_events', this.proxy('_on_dragenter')); | ||
this.$el.on('dragover.widget_events', this.proxy('_on_dragenter')); | ||
this.$el.on('dragleave.widget_events', this.proxy('_on_dragleave')); | ||
return result; | ||
}, | ||
|
||
_on_drop: function(e) { | ||
var drop_item = this._get_drop_item(e); | ||
if(!drop_item) { | ||
return; | ||
} | ||
jQuery(e.delegateTarget).removeClass(this._drag_over_class); | ||
var reader = new FileReader(); | ||
reader.onloadend = this.proxy( | ||
_.partial(this._handle_file_drop, drop_item.getAsFile()) | ||
); | ||
reader.readAsArrayBuffer(drop_item.getAsFile()); | ||
e.preventDefault(); | ||
}, | ||
|
||
_on_dragenter: function(e) { | ||
if(this._get_drop_item(e)) { | ||
e.preventDefault(); | ||
jQuery(e.delegateTarget).addClass(this._drag_over_class); | ||
return false; | ||
}; | ||
}, | ||
|
||
_on_dragleave: function(e) { | ||
jQuery(e.delegateTarget).removeClass(this._drag_over_class); | ||
}, | ||
|
||
_get_drop_item: function(e) { | ||
var self = this, | ||
dataTransfer = e.originalEvent.dataTransfer, | ||
drop_item = null; | ||
_.each(dataTransfer.items, function(item) { | ||
if( | ||
_.contains(self._drop_allowed_types, item.type) || | ||
_.isEmpty(self._drop_allowed_types) | ||
) { | ||
drop_item = item; | ||
} | ||
}); | ||
return drop_item; | ||
}, | ||
|
||
_handle_file_drop: function(drop_file, e) { | ||
// do something here, for example call the helper function below | ||
// e is the on_load_end handler for the FileReader above, | ||
// so e.target.result contains an ArrayBuffer of the data | ||
}, | ||
|
||
_handle_file_drop_attach: function( | ||
drop_file, e, res_model, res_id, extra_data | ||
) { | ||
// helper to upload an attachment and update the sidebar | ||
var self = this; | ||
return new Model('ir.attachment').call( | ||
'create', | ||
[ | ||
_.extend({ | ||
name: drop_file.name, | ||
datas: base64js.fromByteArray( | ||
new Uint8Array(e.target.result) | ||
), | ||
datas_fname: drop_file.name, | ||
res_model: res_model, | ||
res_id: res_id, | ||
}, extra_data || {}) | ||
], | ||
) | ||
.then(function() { | ||
// try to find a sidebar and update it if we found one | ||
var p = self; | ||
while(p && !p.sidebar) { | ||
p = p.getParent ? p.getParent() : null; | ||
} | ||
if(p) { | ||
var sidebar = p.sidebar; | ||
sidebar.do_attachement_update( | ||
sidebar.dataset, sidebar.model_id | ||
); | ||
} | ||
}); | ||
}, | ||
}; | ||
|
||
// and here we apply the mixin to form views, allowing any files and | ||
// adding them as attachment | ||
FormView.include(_.extend(DropTargetMixin, { | ||
_get_drop_file: function() { | ||
// disable drag&drop when we're on an unsaved record | ||
if(!this.datarecord.id) { | ||
return null; | ||
} else { | ||
return this._super.apply(this, arguments); | ||
} | ||
}, | ||
_handle_file_drop: function(drop_file, e) { | ||
return this._handle_file_drop_attach( | ||
drop_file, e, this.dataset.model, this.datarecord.id, | ||
); | ||
}, | ||
})); | ||
|
||
return { | ||
'DropTargetMixin': DropTargetMixin, | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<openerp> | ||
<data> | ||
<template id="assets_backend" name="web_drop_target assets" inherit_id="web.assets_backend"> | ||
<xpath expr="." position="inside"> | ||
<script type="text/javascript" src="/web_drop_target/static/lib/base64js.min.js"></script> | ||
<script type="text/javascript" src="/web_drop_target/static/src/js/web_drop_target.js"></script> | ||
<link rel="stylesheet" href="/web_drop_target/static/src/css/web_drop_target.css"/> | ||
</xpath> | ||
</template> | ||
</data> | ||
</openerp> |